Annotation of elwix/files/sqlite/dist/sqlite3.c, revision 1.2.2.1
1.2 misho 1: /******************************************************************************
2: ** This file is an amalgamation of many separate C source files from SQLite
1.2.2.1 ! misho 3: ** version 3.7.15.2. By combining all the individual C code files into this
1.2 misho 4: ** single large file, the entire code can be compiled as a single translation
5: ** unit. This allows many compilers to do optimizations that would not be
6: ** possible if the files were compiled separately. Performance improvements
7: ** of 5% or more are commonly seen when SQLite is compiled as a single
8: ** translation unit.
9: **
10: ** This file is all you need to compile SQLite. To use SQLite in other
11: ** programs, you need this file and the "sqlite3.h" header file that defines
12: ** the programming interface to the SQLite library. (If you do not have
13: ** the "sqlite3.h" header file at hand, you will find a copy embedded within
14: ** the text of this file. Search for "Begin file sqlite3.h" to find the start
15: ** of the embedded sqlite3.h header file.) Additional code files may be needed
16: ** if you want a wrapper to interface SQLite with your choice of programming
17: ** language. The code for the "sqlite3" command-line shell is also in a
18: ** separate file. This file contains only code for the core SQLite library.
19: */
20: #define SQLITE_CORE 1
21: #define SQLITE_AMALGAMATION 1
22: #ifndef SQLITE_PRIVATE
23: # define SQLITE_PRIVATE static
24: #endif
25: #ifndef SQLITE_API
26: # define SQLITE_API
27: #endif
28: /************** Begin file sqliteInt.h ***************************************/
29: /*
30: ** 2001 September 15
31: **
32: ** The author disclaims copyright to this source code. In place of
33: ** a legal notice, here is a blessing:
34: **
35: ** May you do good and not evil.
36: ** May you find forgiveness for yourself and forgive others.
37: ** May you share freely, never taking more than you give.
38: **
39: *************************************************************************
40: ** Internal interface definitions for SQLite.
41: **
42: */
43: #ifndef _SQLITEINT_H_
44: #define _SQLITEINT_H_
45:
46: /*
47: ** These #defines should enable >2GB file support on POSIX if the
48: ** underlying operating system supports it. If the OS lacks
49: ** large file support, or if the OS is windows, these should be no-ops.
50: **
51: ** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any
52: ** system #includes. Hence, this block of code must be the very first
53: ** code in all source files.
54: **
55: ** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
56: ** on the compiler command line. This is necessary if you are compiling
57: ** on a recent machine (ex: Red Hat 7.2) but you want your code to work
58: ** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2
59: ** without this option, LFS is enable. But LFS does not exist in the kernel
60: ** in Red Hat 6.0, so the code won't work. Hence, for maximum binary
61: ** portability you should omit LFS.
62: **
63: ** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later.
64: */
65: #ifndef SQLITE_DISABLE_LFS
66: # define _LARGE_FILE 1
67: # ifndef _FILE_OFFSET_BITS
68: # define _FILE_OFFSET_BITS 64
69: # endif
70: # define _LARGEFILE_SOURCE 1
71: #endif
72:
73: /*
74: ** Include the configuration header output by 'configure' if we're using the
75: ** autoconf-based build
76: */
77: #ifdef _HAVE_SQLITE_CONFIG_H
78: #include "config.h"
79: #endif
80:
81: /************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/
82: /************** Begin file sqliteLimit.h *************************************/
83: /*
84: ** 2007 May 7
85: **
86: ** The author disclaims copyright to this source code. In place of
87: ** a legal notice, here is a blessing:
88: **
89: ** May you do good and not evil.
90: ** May you find forgiveness for yourself and forgive others.
91: ** May you share freely, never taking more than you give.
92: **
93: *************************************************************************
94: **
95: ** This file defines various limits of what SQLite can process.
96: */
97:
98: /*
99: ** The maximum length of a TEXT or BLOB in bytes. This also
100: ** limits the size of a row in a table or index.
101: **
102: ** The hard limit is the ability of a 32-bit signed integer
103: ** to count the size: 2^31-1 or 2147483647.
104: */
105: #ifndef SQLITE_MAX_LENGTH
106: # define SQLITE_MAX_LENGTH 1000000000
107: #endif
108:
109: /*
110: ** This is the maximum number of
111: **
112: ** * Columns in a table
113: ** * Columns in an index
114: ** * Columns in a view
115: ** * Terms in the SET clause of an UPDATE statement
116: ** * Terms in the result set of a SELECT statement
117: ** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement.
118: ** * Terms in the VALUES clause of an INSERT statement
119: **
120: ** The hard upper limit here is 32676. Most database people will
121: ** tell you that in a well-normalized database, you usually should
122: ** not have more than a dozen or so columns in any table. And if
123: ** that is the case, there is no point in having more than a few
124: ** dozen values in any of the other situations described above.
125: */
126: #ifndef SQLITE_MAX_COLUMN
127: # define SQLITE_MAX_COLUMN 2000
128: #endif
129:
130: /*
131: ** The maximum length of a single SQL statement in bytes.
132: **
133: ** It used to be the case that setting this value to zero would
134: ** turn the limit off. That is no longer true. It is not possible
135: ** to turn this limit off.
136: */
137: #ifndef SQLITE_MAX_SQL_LENGTH
138: # define SQLITE_MAX_SQL_LENGTH 1000000000
139: #endif
140:
141: /*
142: ** The maximum depth of an expression tree. This is limited to
143: ** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might
144: ** want to place more severe limits on the complexity of an
145: ** expression.
146: **
147: ** A value of 0 used to mean that the limit was not enforced.
148: ** But that is no longer true. The limit is now strictly enforced
149: ** at all times.
150: */
151: #ifndef SQLITE_MAX_EXPR_DEPTH
152: # define SQLITE_MAX_EXPR_DEPTH 1000
153: #endif
154:
155: /*
156: ** The maximum number of terms in a compound SELECT statement.
157: ** The code generator for compound SELECT statements does one
158: ** level of recursion for each term. A stack overflow can result
159: ** if the number of terms is too large. In practice, most SQL
160: ** never has more than 3 or 4 terms. Use a value of 0 to disable
161: ** any limit on the number of terms in a compount SELECT.
162: */
163: #ifndef SQLITE_MAX_COMPOUND_SELECT
164: # define SQLITE_MAX_COMPOUND_SELECT 500
165: #endif
166:
167: /*
168: ** The maximum number of opcodes in a VDBE program.
169: ** Not currently enforced.
170: */
171: #ifndef SQLITE_MAX_VDBE_OP
172: # define SQLITE_MAX_VDBE_OP 25000
173: #endif
174:
175: /*
176: ** The maximum number of arguments to an SQL function.
177: */
178: #ifndef SQLITE_MAX_FUNCTION_ARG
179: # define SQLITE_MAX_FUNCTION_ARG 127
180: #endif
181:
182: /*
183: ** The maximum number of in-memory pages to use for the main database
184: ** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE
185: */
186: #ifndef SQLITE_DEFAULT_CACHE_SIZE
187: # define SQLITE_DEFAULT_CACHE_SIZE 2000
188: #endif
189: #ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE
190: # define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500
191: #endif
192:
193: /*
194: ** The default number of frames to accumulate in the log file before
195: ** checkpointing the database in WAL mode.
196: */
197: #ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT
198: # define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000
199: #endif
200:
201: /*
202: ** The maximum number of attached databases. This must be between 0
203: ** and 62. The upper bound on 62 is because a 64-bit integer bitmap
204: ** is used internally to track attached databases.
205: */
206: #ifndef SQLITE_MAX_ATTACHED
207: # define SQLITE_MAX_ATTACHED 10
208: #endif
209:
210:
211: /*
212: ** The maximum value of a ?nnn wildcard that the parser will accept.
213: */
214: #ifndef SQLITE_MAX_VARIABLE_NUMBER
215: # define SQLITE_MAX_VARIABLE_NUMBER 999
216: #endif
217:
218: /* Maximum page size. The upper bound on this value is 65536. This a limit
219: ** imposed by the use of 16-bit offsets within each page.
220: **
221: ** Earlier versions of SQLite allowed the user to change this value at
222: ** compile time. This is no longer permitted, on the grounds that it creates
223: ** a library that is technically incompatible with an SQLite library
224: ** compiled with a different limit. If a process operating on a database
225: ** with a page-size of 65536 bytes crashes, then an instance of SQLite
226: ** compiled with the default page-size limit will not be able to rollback
227: ** the aborted transaction. This could lead to database corruption.
228: */
229: #ifdef SQLITE_MAX_PAGE_SIZE
230: # undef SQLITE_MAX_PAGE_SIZE
231: #endif
232: #define SQLITE_MAX_PAGE_SIZE 65536
233:
234:
235: /*
236: ** The default size of a database page.
237: */
238: #ifndef SQLITE_DEFAULT_PAGE_SIZE
239: # define SQLITE_DEFAULT_PAGE_SIZE 1024
240: #endif
241: #if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE
242: # undef SQLITE_DEFAULT_PAGE_SIZE
243: # define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE
244: #endif
245:
246: /*
247: ** Ordinarily, if no value is explicitly provided, SQLite creates databases
248: ** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain
249: ** device characteristics (sector-size and atomic write() support),
250: ** SQLite may choose a larger value. This constant is the maximum value
251: ** SQLite will choose on its own.
252: */
253: #ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE
254: # define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192
255: #endif
256: #if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE
257: # undef SQLITE_MAX_DEFAULT_PAGE_SIZE
258: # define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE
259: #endif
260:
261:
262: /*
263: ** Maximum number of pages in one database file.
264: **
265: ** This is really just the default value for the max_page_count pragma.
266: ** This value can be lowered (or raised) at run-time using that the
267: ** max_page_count macro.
268: */
269: #ifndef SQLITE_MAX_PAGE_COUNT
270: # define SQLITE_MAX_PAGE_COUNT 1073741823
271: #endif
272:
273: /*
274: ** Maximum length (in bytes) of the pattern in a LIKE or GLOB
275: ** operator.
276: */
277: #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
278: # define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
279: #endif
280:
281: /*
282: ** Maximum depth of recursion for triggers.
283: **
284: ** A value of 1 means that a trigger program will not be able to itself
285: ** fire any triggers. A value of 0 means that no trigger programs at all
286: ** may be executed.
287: */
288: #ifndef SQLITE_MAX_TRIGGER_DEPTH
289: # define SQLITE_MAX_TRIGGER_DEPTH 1000
290: #endif
291:
292: /************** End of sqliteLimit.h *****************************************/
293: /************** Continuing where we left off in sqliteInt.h ******************/
294:
295: /* Disable nuisance warnings on Borland compilers */
296: #if defined(__BORLANDC__)
297: #pragma warn -rch /* unreachable code */
298: #pragma warn -ccc /* Condition is always true or false */
299: #pragma warn -aus /* Assigned value is never used */
300: #pragma warn -csu /* Comparing signed and unsigned */
301: #pragma warn -spa /* Suspicious pointer arithmetic */
302: #endif
303:
304: /* Needed for various definitions... */
305: #ifndef _GNU_SOURCE
306: # define _GNU_SOURCE
307: #endif
308:
309: /*
310: ** Include standard header files as necessary
311: */
312: #ifdef HAVE_STDINT_H
313: #include <stdint.h>
314: #endif
315: #ifdef HAVE_INTTYPES_H
316: #include <inttypes.h>
317: #endif
318:
319: /*
320: ** The following macros are used to cast pointers to integers and
321: ** integers to pointers. The way you do this varies from one compiler
322: ** to the next, so we have developed the following set of #if statements
323: ** to generate appropriate macros for a wide range of compilers.
324: **
325: ** The correct "ANSI" way to do this is to use the intptr_t type.
326: ** Unfortunately, that typedef is not available on all compilers, or
327: ** if it is available, it requires an #include of specific headers
328: ** that vary from one machine to the next.
329: **
330: ** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on
331: ** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)).
332: ** So we have to define the macros in different ways depending on the
333: ** compiler.
334: */
335: #if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */
336: # define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X))
337: # define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X))
338: #elif !defined(__GNUC__) /* Works for compilers other than LLVM */
339: # define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X])
340: # define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0))
341: #elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */
342: # define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X))
343: # define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X))
344: #else /* Generates a warning - but it always works */
345: # define SQLITE_INT_TO_PTR(X) ((void*)(X))
346: # define SQLITE_PTR_TO_INT(X) ((int)(X))
347: #endif
348:
349: /*
350: ** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2.
351: ** 0 means mutexes are permanently disable and the library is never
352: ** threadsafe. 1 means the library is serialized which is the highest
353: ** level of threadsafety. 2 means the libary is multithreaded - multiple
354: ** threads can use SQLite as long as no two threads try to use the same
355: ** database connection at the same time.
356: **
357: ** Older versions of SQLite used an optional THREADSAFE macro.
358: ** We support that for legacy.
359: */
360: #if !defined(SQLITE_THREADSAFE)
361: #if defined(THREADSAFE)
362: # define SQLITE_THREADSAFE THREADSAFE
363: #else
364: # define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */
365: #endif
366: #endif
367:
368: /*
369: ** Powersafe overwrite is on by default. But can be turned off using
370: ** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option.
371: */
372: #ifndef SQLITE_POWERSAFE_OVERWRITE
373: # define SQLITE_POWERSAFE_OVERWRITE 1
374: #endif
375:
376: /*
377: ** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1.
378: ** It determines whether or not the features related to
379: ** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can
380: ** be overridden at runtime using the sqlite3_config() API.
381: */
382: #if !defined(SQLITE_DEFAULT_MEMSTATUS)
383: # define SQLITE_DEFAULT_MEMSTATUS 1
384: #endif
385:
386: /*
387: ** Exactly one of the following macros must be defined in order to
388: ** specify which memory allocation subsystem to use.
389: **
390: ** SQLITE_SYSTEM_MALLOC // Use normal system malloc()
391: ** SQLITE_WIN32_MALLOC // Use Win32 native heap API
1.2.2.1 ! misho 392: ** SQLITE_ZERO_MALLOC // Use a stub allocator that always fails
1.2 misho 393: ** SQLITE_MEMDEBUG // Debugging version of system malloc()
394: **
395: ** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the
396: ** assert() macro is enabled, each call into the Win32 native heap subsystem
397: ** will cause HeapValidate to be called. If heap validation should fail, an
398: ** assertion will be triggered.
399: **
400: ** (Historical note: There used to be several other options, but we've
401: ** pared it down to just these three.)
402: **
403: ** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as
404: ** the default.
405: */
1.2.2.1 ! misho 406: #if defined(SQLITE_SYSTEM_MALLOC) \
! 407: + defined(SQLITE_WIN32_MALLOC) \
! 408: + defined(SQLITE_ZERO_MALLOC) \
! 409: + defined(SQLITE_MEMDEBUG)>1
! 410: # error "Two or more of the following compile-time configuration options\
! 411: are defined but at most one is allowed:\
! 412: SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG,\
! 413: SQLITE_ZERO_MALLOC"
! 414: #endif
! 415: #if defined(SQLITE_SYSTEM_MALLOC) \
! 416: + defined(SQLITE_WIN32_MALLOC) \
! 417: + defined(SQLITE_ZERO_MALLOC) \
! 418: + defined(SQLITE_MEMDEBUG)==0
1.2 misho 419: # define SQLITE_SYSTEM_MALLOC 1
420: #endif
421:
422: /*
423: ** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the
424: ** sizes of memory allocations below this value where possible.
425: */
426: #if !defined(SQLITE_MALLOC_SOFT_LIMIT)
427: # define SQLITE_MALLOC_SOFT_LIMIT 1024
428: #endif
429:
430: /*
431: ** We need to define _XOPEN_SOURCE as follows in order to enable
432: ** recursive mutexes on most Unix systems. But Mac OS X is different.
433: ** The _XOPEN_SOURCE define causes problems for Mac OS X we are told,
434: ** so it is omitted there. See ticket #2673.
435: **
436: ** Later we learn that _XOPEN_SOURCE is poorly or incorrectly
437: ** implemented on some systems. So we avoid defining it at all
438: ** if it is already defined or if it is unneeded because we are
439: ** not doing a threadsafe build. Ticket #2681.
440: **
441: ** See also ticket #2741.
442: */
443: #if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) && SQLITE_THREADSAFE
444: # define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */
445: #endif
446:
447: /*
448: ** The TCL headers are only needed when compiling the TCL bindings.
449: */
450: #if defined(SQLITE_TCL) || defined(TCLSH)
451: # include <tcl.h>
452: #endif
453:
454: /*
1.2.2.1 ! misho 455: ** NDEBUG and SQLITE_DEBUG are opposites. It should always be true that
! 456: ** defined(NDEBUG)==!defined(SQLITE_DEBUG). If this is not currently true,
! 457: ** make it true by defining or undefining NDEBUG.
! 458: **
! 459: ** Setting NDEBUG makes the code smaller and run faster by disabling the
! 460: ** number assert() statements in the code. So we want the default action
! 461: ** to be for NDEBUG to be set and NDEBUG to be undefined only if SQLITE_DEBUG
! 462: ** is set. Thus NDEBUG becomes an opt-in rather than an opt-out
1.2 misho 463: ** feature.
464: */
465: #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
466: # define NDEBUG 1
467: #endif
1.2.2.1 ! misho 468: #if defined(NDEBUG) && defined(SQLITE_DEBUG)
! 469: # undef NDEBUG
! 470: #endif
1.2 misho 471:
472: /*
473: ** The testcase() macro is used to aid in coverage testing. When
474: ** doing coverage testing, the condition inside the argument to
475: ** testcase() must be evaluated both true and false in order to
476: ** get full branch coverage. The testcase() macro is inserted
477: ** to help ensure adequate test coverage in places where simple
478: ** condition/decision coverage is inadequate. For example, testcase()
479: ** can be used to make sure boundary values are tested. For
480: ** bitmask tests, testcase() can be used to make sure each bit
481: ** is significant and used at least once. On switch statements
482: ** where multiple cases go to the same block of code, testcase()
483: ** can insure that all cases are evaluated.
484: **
485: */
486: #ifdef SQLITE_COVERAGE_TEST
487: SQLITE_PRIVATE void sqlite3Coverage(int);
488: # define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
489: #else
490: # define testcase(X)
491: #endif
492:
493: /*
494: ** The TESTONLY macro is used to enclose variable declarations or
495: ** other bits of code that are needed to support the arguments
496: ** within testcase() and assert() macros.
497: */
498: #if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST)
499: # define TESTONLY(X) X
500: #else
501: # define TESTONLY(X)
502: #endif
503:
504: /*
505: ** Sometimes we need a small amount of code such as a variable initialization
506: ** to setup for a later assert() statement. We do not want this code to
507: ** appear when assert() is disabled. The following macro is therefore
508: ** used to contain that setup code. The "VVA" acronym stands for
509: ** "Verification, Validation, and Accreditation". In other words, the
510: ** code within VVA_ONLY() will only run during verification processes.
511: */
512: #ifndef NDEBUG
513: # define VVA_ONLY(X) X
514: #else
515: # define VVA_ONLY(X)
516: #endif
517:
518: /*
519: ** The ALWAYS and NEVER macros surround boolean expressions which
520: ** are intended to always be true or false, respectively. Such
521: ** expressions could be omitted from the code completely. But they
522: ** are included in a few cases in order to enhance the resilience
523: ** of SQLite to unexpected behavior - to make the code "self-healing"
524: ** or "ductile" rather than being "brittle" and crashing at the first
525: ** hint of unplanned behavior.
526: **
527: ** In other words, ALWAYS and NEVER are added for defensive code.
528: **
529: ** When doing coverage testing ALWAYS and NEVER are hard-coded to
530: ** be true and false so that the unreachable code then specify will
531: ** not be counted as untested code.
532: */
533: #if defined(SQLITE_COVERAGE_TEST)
534: # define ALWAYS(X) (1)
535: # define NEVER(X) (0)
536: #elif !defined(NDEBUG)
537: # define ALWAYS(X) ((X)?1:(assert(0),0))
538: # define NEVER(X) ((X)?(assert(0),1):0)
539: #else
540: # define ALWAYS(X) (X)
541: # define NEVER(X) (X)
542: #endif
543:
544: /*
545: ** Return true (non-zero) if the input is a integer that is too large
546: ** to fit in 32-bits. This macro is used inside of various testcase()
547: ** macros to verify that we have tested SQLite for large-file support.
548: */
549: #define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0)
550:
551: /*
552: ** The macro unlikely() is a hint that surrounds a boolean
553: ** expression that is usually false. Macro likely() surrounds
554: ** a boolean expression that is usually true. GCC is able to
555: ** use these hints to generate better code, sometimes.
556: */
557: #if defined(__GNUC__) && 0
558: # define likely(X) __builtin_expect((X),1)
559: # define unlikely(X) __builtin_expect((X),0)
560: #else
561: # define likely(X) !!(X)
562: # define unlikely(X) !!(X)
563: #endif
564:
565: /************** Include sqlite3.h in the middle of sqliteInt.h ***************/
566: /************** Begin file sqlite3.h *****************************************/
567: /*
568: ** 2001 September 15
569: **
570: ** The author disclaims copyright to this source code. In place of
571: ** a legal notice, here is a blessing:
572: **
573: ** May you do good and not evil.
574: ** May you find forgiveness for yourself and forgive others.
575: ** May you share freely, never taking more than you give.
576: **
577: *************************************************************************
578: ** This header file defines the interface that the SQLite library
579: ** presents to client programs. If a C-function, structure, datatype,
580: ** or constant definition does not appear in this file, then it is
581: ** not a published API of SQLite, is subject to change without
582: ** notice, and should not be referenced by programs that use SQLite.
583: **
584: ** Some of the definitions that are in this file are marked as
585: ** "experimental". Experimental interfaces are normally new
586: ** features recently added to SQLite. We do not anticipate changes
587: ** to experimental interfaces but reserve the right to make minor changes
588: ** if experience from use "in the wild" suggest such changes are prudent.
589: **
590: ** The official C-language API documentation for SQLite is derived
591: ** from comments in this file. This file is the authoritative source
592: ** on how SQLite interfaces are suppose to operate.
593: **
594: ** The name of this file under configuration management is "sqlite.h.in".
595: ** The makefile makes some minor changes to this file (such as inserting
596: ** the version number) and changes its name to "sqlite3.h" as
597: ** part of the build process.
598: */
599: #ifndef _SQLITE3_H_
600: #define _SQLITE3_H_
601: #include <stdarg.h> /* Needed for the definition of va_list */
602:
603: /*
604: ** Make sure we can call this stuff from C++.
605: */
606: #if 0
607: extern "C" {
608: #endif
609:
610:
611: /*
612: ** Add the ability to override 'extern'
613: */
614: #ifndef SQLITE_EXTERN
615: # define SQLITE_EXTERN extern
616: #endif
617:
618: #ifndef SQLITE_API
619: # define SQLITE_API
620: #endif
621:
622:
623: /*
624: ** These no-op macros are used in front of interfaces to mark those
625: ** interfaces as either deprecated or experimental. New applications
626: ** should not use deprecated interfaces - they are support for backwards
627: ** compatibility only. Application writers should be aware that
628: ** experimental interfaces are subject to change in point releases.
629: **
630: ** These macros used to resolve to various kinds of compiler magic that
631: ** would generate warning messages when they were used. But that
632: ** compiler magic ended up generating such a flurry of bug reports
633: ** that we have taken it all out and gone back to using simple
634: ** noop macros.
635: */
636: #define SQLITE_DEPRECATED
637: #define SQLITE_EXPERIMENTAL
638:
639: /*
640: ** Ensure these symbols were not defined by some previous header file.
641: */
642: #ifdef SQLITE_VERSION
643: # undef SQLITE_VERSION
644: #endif
645: #ifdef SQLITE_VERSION_NUMBER
646: # undef SQLITE_VERSION_NUMBER
647: #endif
648:
649: /*
650: ** CAPI3REF: Compile-Time Library Version Numbers
651: **
652: ** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header
653: ** evaluates to a string literal that is the SQLite version in the
654: ** format "X.Y.Z" where X is the major version number (always 3 for
655: ** SQLite3) and Y is the minor version number and Z is the release number.)^
656: ** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer
657: ** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same
658: ** numbers used in [SQLITE_VERSION].)^
659: ** The SQLITE_VERSION_NUMBER for any given release of SQLite will also
660: ** be larger than the release from which it is derived. Either Y will
661: ** be held constant and Z will be incremented or else Y will be incremented
662: ** and Z will be reset to zero.
663: **
664: ** Since version 3.6.18, SQLite source code has been stored in the
665: ** <a href="http://www.fossil-scm.org/">Fossil configuration management
666: ** system</a>. ^The SQLITE_SOURCE_ID macro evaluates to
667: ** a string which identifies a particular check-in of SQLite
668: ** within its configuration management system. ^The SQLITE_SOURCE_ID
669: ** string contains the date and time of the check-in (UTC) and an SHA1
670: ** hash of the entire source tree.
671: **
672: ** See also: [sqlite3_libversion()],
673: ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
674: ** [sqlite_version()] and [sqlite_source_id()].
675: */
1.2.2.1 ! misho 676: #define SQLITE_VERSION "3.7.15.2"
! 677: #define SQLITE_VERSION_NUMBER 3007015
! 678: #define SQLITE_SOURCE_ID "2013-01-09 11:53:05 c0e09560d26f0a6456be9dd3447f5311eb4f238f"
1.2 misho 679:
680: /*
681: ** CAPI3REF: Run-Time Library Version Numbers
682: ** KEYWORDS: sqlite3_version, sqlite3_sourceid
683: **
684: ** These interfaces provide the same information as the [SQLITE_VERSION],
685: ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
686: ** but are associated with the library instead of the header file. ^(Cautious
687: ** programmers might include assert() statements in their application to
688: ** verify that values returned by these interfaces match the macros in
689: ** the header, and thus insure that the application is
690: ** compiled with matching library and header files.
691: **
692: ** <blockquote><pre>
693: ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
694: ** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
695: ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
696: ** </pre></blockquote>)^
697: **
698: ** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION]
699: ** macro. ^The sqlite3_libversion() function returns a pointer to the
700: ** to the sqlite3_version[] string constant. The sqlite3_libversion()
701: ** function is provided for use in DLLs since DLL users usually do not have
702: ** direct access to string constants within the DLL. ^The
703: ** sqlite3_libversion_number() function returns an integer equal to
704: ** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns
705: ** a pointer to a string constant whose value is the same as the
706: ** [SQLITE_SOURCE_ID] C preprocessor macro.
707: **
708: ** See also: [sqlite_version()] and [sqlite_source_id()].
709: */
710: SQLITE_API const char sqlite3_version[] = SQLITE_VERSION;
711: SQLITE_API const char *sqlite3_libversion(void);
712: SQLITE_API const char *sqlite3_sourceid(void);
713: SQLITE_API int sqlite3_libversion_number(void);
714:
715: /*
716: ** CAPI3REF: Run-Time Library Compilation Options Diagnostics
717: **
718: ** ^The sqlite3_compileoption_used() function returns 0 or 1
719: ** indicating whether the specified option was defined at
720: ** compile time. ^The SQLITE_ prefix may be omitted from the
721: ** option name passed to sqlite3_compileoption_used().
722: **
723: ** ^The sqlite3_compileoption_get() function allows iterating
724: ** over the list of options that were defined at compile time by
725: ** returning the N-th compile time option string. ^If N is out of range,
726: ** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_
727: ** prefix is omitted from any strings returned by
728: ** sqlite3_compileoption_get().
729: **
730: ** ^Support for the diagnostic functions sqlite3_compileoption_used()
731: ** and sqlite3_compileoption_get() may be omitted by specifying the
732: ** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time.
733: **
734: ** See also: SQL functions [sqlite_compileoption_used()] and
735: ** [sqlite_compileoption_get()] and the [compile_options pragma].
736: */
737: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
738: SQLITE_API int sqlite3_compileoption_used(const char *zOptName);
739: SQLITE_API const char *sqlite3_compileoption_get(int N);
740: #endif
741:
742: /*
743: ** CAPI3REF: Test To See If The Library Is Threadsafe
744: **
745: ** ^The sqlite3_threadsafe() function returns zero if and only if
746: ** SQLite was compiled with mutexing code omitted due to the
747: ** [SQLITE_THREADSAFE] compile-time option being set to 0.
748: **
749: ** SQLite can be compiled with or without mutexes. When
750: ** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes
751: ** are enabled and SQLite is threadsafe. When the
752: ** [SQLITE_THREADSAFE] macro is 0,
753: ** the mutexes are omitted. Without the mutexes, it is not safe
754: ** to use SQLite concurrently from more than one thread.
755: **
756: ** Enabling mutexes incurs a measurable performance penalty.
757: ** So if speed is of utmost importance, it makes sense to disable
758: ** the mutexes. But for maximum safety, mutexes should be enabled.
759: ** ^The default behavior is for mutexes to be enabled.
760: **
761: ** This interface can be used by an application to make sure that the
762: ** version of SQLite that it is linking against was compiled with
763: ** the desired setting of the [SQLITE_THREADSAFE] macro.
764: **
765: ** This interface only reports on the compile-time mutex setting
766: ** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with
767: ** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but
768: ** can be fully or partially disabled using a call to [sqlite3_config()]
769: ** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD],
770: ** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the
771: ** sqlite3_threadsafe() function shows only the compile-time setting of
772: ** thread safety, not any run-time changes to that setting made by
773: ** sqlite3_config(). In other words, the return value from sqlite3_threadsafe()
774: ** is unchanged by calls to sqlite3_config().)^
775: **
776: ** See the [threading mode] documentation for additional information.
777: */
778: SQLITE_API int sqlite3_threadsafe(void);
779:
780: /*
781: ** CAPI3REF: Database Connection Handle
782: ** KEYWORDS: {database connection} {database connections}
783: **
784: ** Each open SQLite database is represented by a pointer to an instance of
785: ** the opaque structure named "sqlite3". It is useful to think of an sqlite3
786: ** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and
787: ** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()]
1.2.2.1 ! misho 788: ** and [sqlite3_close_v2()] are its destructors. There are many other
! 789: ** interfaces (such as
1.2 misho 790: ** [sqlite3_prepare_v2()], [sqlite3_create_function()], and
791: ** [sqlite3_busy_timeout()] to name but three) that are methods on an
792: ** sqlite3 object.
793: */
794: typedef struct sqlite3 sqlite3;
795:
796: /*
797: ** CAPI3REF: 64-Bit Integer Types
798: ** KEYWORDS: sqlite_int64 sqlite_uint64
799: **
800: ** Because there is no cross-platform way to specify 64-bit integer types
801: ** SQLite includes typedefs for 64-bit signed and unsigned integers.
802: **
803: ** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions.
804: ** The sqlite_int64 and sqlite_uint64 types are supported for backwards
805: ** compatibility only.
806: **
807: ** ^The sqlite3_int64 and sqlite_int64 types can store integer values
808: ** between -9223372036854775808 and +9223372036854775807 inclusive. ^The
809: ** sqlite3_uint64 and sqlite_uint64 types can store integer values
810: ** between 0 and +18446744073709551615 inclusive.
811: */
812: #ifdef SQLITE_INT64_TYPE
813: typedef SQLITE_INT64_TYPE sqlite_int64;
814: typedef unsigned SQLITE_INT64_TYPE sqlite_uint64;
815: #elif defined(_MSC_VER) || defined(__BORLANDC__)
816: typedef __int64 sqlite_int64;
817: typedef unsigned __int64 sqlite_uint64;
818: #else
819: typedef long long int sqlite_int64;
820: typedef unsigned long long int sqlite_uint64;
821: #endif
822: typedef sqlite_int64 sqlite3_int64;
823: typedef sqlite_uint64 sqlite3_uint64;
824:
825: /*
826: ** If compiling for a processor that lacks floating point support,
827: ** substitute integer for floating-point.
828: */
829: #ifdef SQLITE_OMIT_FLOATING_POINT
830: # define double sqlite3_int64
831: #endif
832:
833: /*
834: ** CAPI3REF: Closing A Database Connection
835: **
1.2.2.1 ! misho 836: ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors
! 837: ** for the [sqlite3] object.
! 838: ** ^Calls to sqlite3_close() and sqlite3_close_v2() return SQLITE_OK if
! 839: ** the [sqlite3] object is successfully destroyed and all associated
! 840: ** resources are deallocated.
! 841: **
! 842: ** ^If the database connection is associated with unfinalized prepared
! 843: ** statements or unfinished sqlite3_backup objects then sqlite3_close()
! 844: ** will leave the database connection open and return [SQLITE_BUSY].
! 845: ** ^If sqlite3_close_v2() is called with unfinalized prepared statements
! 846: ** and unfinished sqlite3_backups, then the database connection becomes
! 847: ** an unusable "zombie" which will automatically be deallocated when the
! 848: ** last prepared statement is finalized or the last sqlite3_backup is
! 849: ** finished. The sqlite3_close_v2() interface is intended for use with
! 850: ** host languages that are garbage collected, and where the order in which
! 851: ** destructors are called is arbitrary.
! 852: **
! 853: ** Applications should [sqlite3_finalize | finalize] all [prepared statements],
! 854: ** [sqlite3_blob_close | close] all [BLOB handles], and
! 855: ** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated
! 856: ** with the [sqlite3] object prior to attempting to close the object. ^If
1.2 misho 857: ** sqlite3_close() is called on a [database connection] that still has
1.2.2.1 ! misho 858: ** outstanding [prepared statements], [BLOB handles], and/or
! 859: ** [sqlite3_backup] objects then it returns SQLITE_OK but the deallocation
! 860: ** of resources is deferred until all [prepared statements], [BLOB handles],
! 861: ** and [sqlite3_backup] objects are also destroyed.
1.2 misho 862: **
1.2.2.1 ! misho 863: ** ^If an [sqlite3] object is destroyed while a transaction is open,
1.2 misho 864: ** the transaction is automatically rolled back.
865: **
1.2.2.1 ! misho 866: ** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)]
! 867: ** must be either a NULL
1.2 misho 868: ** pointer or an [sqlite3] object pointer obtained
869: ** from [sqlite3_open()], [sqlite3_open16()], or
870: ** [sqlite3_open_v2()], and not previously closed.
1.2.2.1 ! misho 871: ** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer
! 872: ** argument is a harmless no-op.
1.2 misho 873: */
1.2.2.1 ! misho 874: SQLITE_API int sqlite3_close(sqlite3*);
! 875: SQLITE_API int sqlite3_close_v2(sqlite3*);
1.2 misho 876:
877: /*
878: ** The type for a callback function.
879: ** This is legacy and deprecated. It is included for historical
880: ** compatibility and is not documented.
881: */
882: typedef int (*sqlite3_callback)(void*,int,char**, char**);
883:
884: /*
885: ** CAPI3REF: One-Step Query Execution Interface
886: **
887: ** The sqlite3_exec() interface is a convenience wrapper around
888: ** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()],
889: ** that allows an application to run multiple statements of SQL
890: ** without having to use a lot of C code.
891: **
892: ** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded,
893: ** semicolon-separate SQL statements passed into its 2nd argument,
894: ** in the context of the [database connection] passed in as its 1st
895: ** argument. ^If the callback function of the 3rd argument to
896: ** sqlite3_exec() is not NULL, then it is invoked for each result row
897: ** coming out of the evaluated SQL statements. ^The 4th argument to
898: ** sqlite3_exec() is relayed through to the 1st argument of each
899: ** callback invocation. ^If the callback pointer to sqlite3_exec()
900: ** is NULL, then no callback is ever invoked and result rows are
901: ** ignored.
902: **
903: ** ^If an error occurs while evaluating the SQL statements passed into
904: ** sqlite3_exec(), then execution of the current statement stops and
905: ** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec()
906: ** is not NULL then any error message is written into memory obtained
907: ** from [sqlite3_malloc()] and passed back through the 5th parameter.
908: ** To avoid memory leaks, the application should invoke [sqlite3_free()]
909: ** on error message strings returned through the 5th parameter of
910: ** of sqlite3_exec() after the error message string is no longer needed.
911: ** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors
912: ** occur, then sqlite3_exec() sets the pointer in its 5th parameter to
913: ** NULL before returning.
914: **
915: ** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec()
916: ** routine returns SQLITE_ABORT without invoking the callback again and
917: ** without running any subsequent SQL statements.
918: **
919: ** ^The 2nd argument to the sqlite3_exec() callback function is the
920: ** number of columns in the result. ^The 3rd argument to the sqlite3_exec()
921: ** callback is an array of pointers to strings obtained as if from
922: ** [sqlite3_column_text()], one for each column. ^If an element of a
923: ** result row is NULL then the corresponding string pointer for the
924: ** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the
925: ** sqlite3_exec() callback is an array of pointers to strings where each
926: ** entry represents the name of corresponding result column as obtained
927: ** from [sqlite3_column_name()].
928: **
929: ** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer
930: ** to an empty string, or a pointer that contains only whitespace and/or
931: ** SQL comments, then no SQL statements are evaluated and the database
932: ** is not changed.
933: **
934: ** Restrictions:
935: **
936: ** <ul>
937: ** <li> The application must insure that the 1st parameter to sqlite3_exec()
938: ** is a valid and open [database connection].
939: ** <li> The application must not close [database connection] specified by
940: ** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running.
941: ** <li> The application must not modify the SQL statement text passed into
942: ** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running.
943: ** </ul>
944: */
945: SQLITE_API int sqlite3_exec(
946: sqlite3*, /* An open database */
947: const char *sql, /* SQL to be evaluated */
948: int (*callback)(void*,int,char**,char**), /* Callback function */
949: void *, /* 1st argument to callback */
950: char **errmsg /* Error msg written here */
951: );
952:
953: /*
954: ** CAPI3REF: Result Codes
955: ** KEYWORDS: SQLITE_OK {error code} {error codes}
956: ** KEYWORDS: {result code} {result codes}
957: **
958: ** Many SQLite functions return an integer result code from the set shown
959: ** here in order to indicate success or failure.
960: **
961: ** New error codes may be added in future versions of SQLite.
962: **
963: ** See also: [SQLITE_IOERR_READ | extended result codes],
964: ** [sqlite3_vtab_on_conflict()] [SQLITE_ROLLBACK | result codes].
965: */
966: #define SQLITE_OK 0 /* Successful result */
967: /* beginning-of-error-codes */
968: #define SQLITE_ERROR 1 /* SQL error or missing database */
969: #define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
970: #define SQLITE_PERM 3 /* Access permission denied */
971: #define SQLITE_ABORT 4 /* Callback routine requested an abort */
972: #define SQLITE_BUSY 5 /* The database file is locked */
973: #define SQLITE_LOCKED 6 /* A table in the database is locked */
974: #define SQLITE_NOMEM 7 /* A malloc() failed */
975: #define SQLITE_READONLY 8 /* Attempt to write a readonly database */
976: #define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
977: #define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
978: #define SQLITE_CORRUPT 11 /* The database disk image is malformed */
979: #define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
980: #define SQLITE_FULL 13 /* Insertion failed because database is full */
981: #define SQLITE_CANTOPEN 14 /* Unable to open the database file */
982: #define SQLITE_PROTOCOL 15 /* Database lock protocol error */
983: #define SQLITE_EMPTY 16 /* Database is empty */
984: #define SQLITE_SCHEMA 17 /* The database schema changed */
985: #define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
986: #define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
987: #define SQLITE_MISMATCH 20 /* Data type mismatch */
988: #define SQLITE_MISUSE 21 /* Library used incorrectly */
989: #define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
990: #define SQLITE_AUTH 23 /* Authorization denied */
991: #define SQLITE_FORMAT 24 /* Auxiliary database format error */
992: #define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
993: #define SQLITE_NOTADB 26 /* File opened that is not a database file */
994: #define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
995: #define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
996: /* end-of-error-codes */
997:
998: /*
999: ** CAPI3REF: Extended Result Codes
1000: ** KEYWORDS: {extended error code} {extended error codes}
1001: ** KEYWORDS: {extended result code} {extended result codes}
1002: **
1003: ** In its default configuration, SQLite API routines return one of 26 integer
1004: ** [SQLITE_OK | result codes]. However, experience has shown that many of
1005: ** these result codes are too coarse-grained. They do not provide as
1006: ** much information about problems as programmers might like. In an effort to
1007: ** address this, newer versions of SQLite (version 3.3.8 and later) include
1008: ** support for additional result codes that provide more detailed information
1009: ** about errors. The extended result codes are enabled or disabled
1010: ** on a per database connection basis using the
1011: ** [sqlite3_extended_result_codes()] API.
1012: **
1013: ** Some of the available extended result codes are listed here.
1014: ** One may expect the number of extended result codes will be expand
1015: ** over time. Software that uses extended result codes should expect
1016: ** to see new result codes in future releases of SQLite.
1017: **
1018: ** The SQLITE_OK result code will never be extended. It will always
1019: ** be exactly zero.
1020: */
1021: #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8))
1022: #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8))
1023: #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8))
1024: #define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))
1025: #define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))
1026: #define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8))
1027: #define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8))
1028: #define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8))
1029: #define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8))
1030: #define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8))
1031: #define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8))
1032: #define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8))
1033: #define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8))
1034: #define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8))
1035: #define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
1036: #define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8))
1037: #define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8))
1038: #define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8))
1039: #define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8))
1040: #define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8))
1041: #define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8))
1042: #define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8))
1.2.2.1 ! misho 1043: #define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8))
1.2 misho 1044: #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
1045: #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
1046: #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8))
1.2.2.1 ! misho 1047: #define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
! 1048: #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
1.2 misho 1049: #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
1050: #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
1051: #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
1.2.2.1 ! misho 1052: #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8))
1.2 misho 1053:
1054: /*
1055: ** CAPI3REF: Flags For File Open Operations
1056: **
1057: ** These bit values are intended for use in the
1058: ** 3rd parameter to the [sqlite3_open_v2()] interface and
1059: ** in the 4th parameter to the [sqlite3_vfs.xOpen] method.
1060: */
1061: #define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
1062: #define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
1063: #define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
1064: #define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */
1065: #define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */
1066: #define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */
1067: #define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */
1.2.2.1 ! misho 1068: #define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */
1.2 misho 1069: #define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */
1070: #define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */
1071: #define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */
1072: #define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */
1073: #define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */
1074: #define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */
1075: #define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */
1076: #define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */
1077: #define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */
1078: #define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */
1079: #define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */
1080: #define SQLITE_OPEN_WAL 0x00080000 /* VFS only */
1081:
1082: /* Reserved: 0x00F00000 */
1083:
1084: /*
1085: ** CAPI3REF: Device Characteristics
1086: **
1087: ** The xDeviceCharacteristics method of the [sqlite3_io_methods]
1.2.2.1 ! misho 1088: ** object returns an integer which is a vector of these
1.2 misho 1089: ** bit values expressing I/O characteristics of the mass storage
1090: ** device that holds the file that the [sqlite3_io_methods]
1091: ** refers to.
1092: **
1093: ** The SQLITE_IOCAP_ATOMIC property means that all writes of
1094: ** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values
1095: ** mean that writes of blocks that are nnn bytes in size and
1096: ** are aligned to an address which is an integer multiple of
1097: ** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means
1098: ** that when data is appended to a file, the data is appended
1099: ** first then the size of the file is extended, never the other
1100: ** way around. The SQLITE_IOCAP_SEQUENTIAL property means that
1101: ** information is written to disk in the same order as calls
1102: ** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that
1103: ** after reboot following a crash or power loss, the only bytes in a
1104: ** file that were written at the application level might have changed
1105: ** and that adjacent bytes, even bytes within the same sector are
1106: ** guaranteed to be unchanged.
1107: */
1108: #define SQLITE_IOCAP_ATOMIC 0x00000001
1109: #define SQLITE_IOCAP_ATOMIC512 0x00000002
1110: #define SQLITE_IOCAP_ATOMIC1K 0x00000004
1111: #define SQLITE_IOCAP_ATOMIC2K 0x00000008
1112: #define SQLITE_IOCAP_ATOMIC4K 0x00000010
1113: #define SQLITE_IOCAP_ATOMIC8K 0x00000020
1114: #define SQLITE_IOCAP_ATOMIC16K 0x00000040
1115: #define SQLITE_IOCAP_ATOMIC32K 0x00000080
1116: #define SQLITE_IOCAP_ATOMIC64K 0x00000100
1117: #define SQLITE_IOCAP_SAFE_APPEND 0x00000200
1118: #define SQLITE_IOCAP_SEQUENTIAL 0x00000400
1119: #define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800
1120: #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000
1121:
1122: /*
1123: ** CAPI3REF: File Locking Levels
1124: **
1125: ** SQLite uses one of these integer values as the second
1126: ** argument to calls it makes to the xLock() and xUnlock() methods
1127: ** of an [sqlite3_io_methods] object.
1128: */
1129: #define SQLITE_LOCK_NONE 0
1130: #define SQLITE_LOCK_SHARED 1
1131: #define SQLITE_LOCK_RESERVED 2
1132: #define SQLITE_LOCK_PENDING 3
1133: #define SQLITE_LOCK_EXCLUSIVE 4
1134:
1135: /*
1136: ** CAPI3REF: Synchronization Type Flags
1137: **
1138: ** When SQLite invokes the xSync() method of an
1139: ** [sqlite3_io_methods] object it uses a combination of
1140: ** these integer values as the second argument.
1141: **
1142: ** When the SQLITE_SYNC_DATAONLY flag is used, it means that the
1143: ** sync operation only needs to flush data to mass storage. Inode
1144: ** information need not be flushed. If the lower four bits of the flag
1145: ** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics.
1146: ** If the lower four bits equal SQLITE_SYNC_FULL, that means
1147: ** to use Mac OS X style fullsync instead of fsync().
1148: **
1149: ** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags
1150: ** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL
1151: ** settings. The [synchronous pragma] determines when calls to the
1152: ** xSync VFS method occur and applies uniformly across all platforms.
1153: ** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how
1154: ** energetic or rigorous or forceful the sync operations are and
1155: ** only make a difference on Mac OSX for the default SQLite code.
1156: ** (Third-party VFS implementations might also make the distinction
1157: ** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the
1158: ** operating systems natively supported by SQLite, only Mac OSX
1159: ** cares about the difference.)
1160: */
1161: #define SQLITE_SYNC_NORMAL 0x00002
1162: #define SQLITE_SYNC_FULL 0x00003
1163: #define SQLITE_SYNC_DATAONLY 0x00010
1164:
1165: /*
1166: ** CAPI3REF: OS Interface Open File Handle
1167: **
1168: ** An [sqlite3_file] object represents an open file in the
1169: ** [sqlite3_vfs | OS interface layer]. Individual OS interface
1170: ** implementations will
1171: ** want to subclass this object by appending additional fields
1172: ** for their own use. The pMethods entry is a pointer to an
1173: ** [sqlite3_io_methods] object that defines methods for performing
1174: ** I/O operations on the open file.
1175: */
1176: typedef struct sqlite3_file sqlite3_file;
1177: struct sqlite3_file {
1178: const struct sqlite3_io_methods *pMethods; /* Methods for an open file */
1179: };
1180:
1181: /*
1182: ** CAPI3REF: OS Interface File Virtual Methods Object
1183: **
1184: ** Every file opened by the [sqlite3_vfs.xOpen] method populates an
1185: ** [sqlite3_file] object (or, more commonly, a subclass of the
1186: ** [sqlite3_file] object) with a pointer to an instance of this object.
1187: ** This object defines the methods used to perform various operations
1188: ** against the open file represented by the [sqlite3_file] object.
1189: **
1190: ** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element
1191: ** to a non-NULL pointer, then the sqlite3_io_methods.xClose method
1192: ** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The
1193: ** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen]
1194: ** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element
1195: ** to NULL.
1196: **
1197: ** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or
1198: ** [SQLITE_SYNC_FULL]. The first choice is the normal fsync().
1199: ** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY]
1200: ** flag may be ORed in to indicate that only the data of the file
1201: ** and not its inode needs to be synced.
1202: **
1203: ** The integer values to xLock() and xUnlock() are one of
1204: ** <ul>
1205: ** <li> [SQLITE_LOCK_NONE],
1206: ** <li> [SQLITE_LOCK_SHARED],
1207: ** <li> [SQLITE_LOCK_RESERVED],
1208: ** <li> [SQLITE_LOCK_PENDING], or
1209: ** <li> [SQLITE_LOCK_EXCLUSIVE].
1210: ** </ul>
1211: ** xLock() increases the lock. xUnlock() decreases the lock.
1212: ** The xCheckReservedLock() method checks whether any database connection,
1213: ** either in this process or in some other process, is holding a RESERVED,
1214: ** PENDING, or EXCLUSIVE lock on the file. It returns true
1215: ** if such a lock exists and false otherwise.
1216: **
1217: ** The xFileControl() method is a generic interface that allows custom
1218: ** VFS implementations to directly control an open file using the
1219: ** [sqlite3_file_control()] interface. The second "op" argument is an
1220: ** integer opcode. The third argument is a generic pointer intended to
1221: ** point to a structure that may contain arguments or space in which to
1222: ** write return values. Potential uses for xFileControl() might be
1223: ** functions to enable blocking locks with timeouts, to change the
1224: ** locking strategy (for example to use dot-file locks), to inquire
1225: ** about the status of a lock, or to break stale locks. The SQLite
1226: ** core reserves all opcodes less than 100 for its own use.
1227: ** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available.
1228: ** Applications that define a custom xFileControl method should use opcodes
1229: ** greater than 100 to avoid conflicts. VFS implementations should
1230: ** return [SQLITE_NOTFOUND] for file control opcodes that they do not
1231: ** recognize.
1232: **
1233: ** The xSectorSize() method returns the sector size of the
1234: ** device that underlies the file. The sector size is the
1235: ** minimum write that can be performed without disturbing
1236: ** other bytes in the file. The xDeviceCharacteristics()
1237: ** method returns a bit vector describing behaviors of the
1238: ** underlying device:
1239: **
1240: ** <ul>
1241: ** <li> [SQLITE_IOCAP_ATOMIC]
1242: ** <li> [SQLITE_IOCAP_ATOMIC512]
1243: ** <li> [SQLITE_IOCAP_ATOMIC1K]
1244: ** <li> [SQLITE_IOCAP_ATOMIC2K]
1245: ** <li> [SQLITE_IOCAP_ATOMIC4K]
1246: ** <li> [SQLITE_IOCAP_ATOMIC8K]
1247: ** <li> [SQLITE_IOCAP_ATOMIC16K]
1248: ** <li> [SQLITE_IOCAP_ATOMIC32K]
1249: ** <li> [SQLITE_IOCAP_ATOMIC64K]
1250: ** <li> [SQLITE_IOCAP_SAFE_APPEND]
1251: ** <li> [SQLITE_IOCAP_SEQUENTIAL]
1252: ** </ul>
1253: **
1254: ** The SQLITE_IOCAP_ATOMIC property means that all writes of
1255: ** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values
1256: ** mean that writes of blocks that are nnn bytes in size and
1257: ** are aligned to an address which is an integer multiple of
1258: ** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means
1259: ** that when data is appended to a file, the data is appended
1260: ** first then the size of the file is extended, never the other
1261: ** way around. The SQLITE_IOCAP_SEQUENTIAL property means that
1262: ** information is written to disk in the same order as calls
1263: ** to xWrite().
1264: **
1265: ** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill
1266: ** in the unread portions of the buffer with zeros. A VFS that
1267: ** fails to zero-fill short reads might seem to work. However,
1268: ** failure to zero-fill short reads will eventually lead to
1269: ** database corruption.
1270: */
1271: typedef struct sqlite3_io_methods sqlite3_io_methods;
1272: struct sqlite3_io_methods {
1273: int iVersion;
1274: int (*xClose)(sqlite3_file*);
1275: int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
1276: int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst);
1277: int (*xTruncate)(sqlite3_file*, sqlite3_int64 size);
1278: int (*xSync)(sqlite3_file*, int flags);
1279: int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize);
1280: int (*xLock)(sqlite3_file*, int);
1281: int (*xUnlock)(sqlite3_file*, int);
1282: int (*xCheckReservedLock)(sqlite3_file*, int *pResOut);
1283: int (*xFileControl)(sqlite3_file*, int op, void *pArg);
1284: int (*xSectorSize)(sqlite3_file*);
1285: int (*xDeviceCharacteristics)(sqlite3_file*);
1286: /* Methods above are valid for version 1 */
1287: int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**);
1288: int (*xShmLock)(sqlite3_file*, int offset, int n, int flags);
1289: void (*xShmBarrier)(sqlite3_file*);
1290: int (*xShmUnmap)(sqlite3_file*, int deleteFlag);
1291: /* Methods above are valid for version 2 */
1292: /* Additional methods may be added in future releases */
1293: };
1294:
1295: /*
1296: ** CAPI3REF: Standard File Control Opcodes
1297: **
1298: ** These integer constants are opcodes for the xFileControl method
1299: ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()]
1300: ** interface.
1301: **
1302: ** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This
1303: ** opcode causes the xFileControl method to write the current state of
1304: ** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED],
1305: ** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE])
1306: ** into an integer that the pArg argument points to. This capability
1307: ** is used during testing and only needs to be supported when SQLITE_TEST
1308: ** is defined.
1.2.2.1 ! misho 1309: ** <ul>
! 1310: ** <li>[[SQLITE_FCNTL_SIZE_HINT]]
1.2 misho 1311: ** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS
1312: ** layer a hint of how large the database file will grow to be during the
1313: ** current transaction. This hint is not guaranteed to be accurate but it
1314: ** is often close. The underlying VFS might choose to preallocate database
1315: ** file space based on this hint in order to help writes to the database
1316: ** file run faster.
1317: **
1.2.2.1 ! misho 1318: ** <li>[[SQLITE_FCNTL_CHUNK_SIZE]]
1.2 misho 1319: ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS
1320: ** extends and truncates the database file in chunks of a size specified
1321: ** by the user. The fourth argument to [sqlite3_file_control()] should
1322: ** point to an integer (type int) containing the new chunk-size to use
1323: ** for the nominated database. Allocating database file space in large
1324: ** chunks (say 1MB at a time), may reduce file-system fragmentation and
1325: ** improve performance on some systems.
1326: **
1.2.2.1 ! misho 1327: ** <li>[[SQLITE_FCNTL_FILE_POINTER]]
1.2 misho 1328: ** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer
1329: ** to the [sqlite3_file] object associated with a particular database
1330: ** connection. See the [sqlite3_file_control()] documentation for
1331: ** additional information.
1332: **
1.2.2.1 ! misho 1333: ** <li>[[SQLITE_FCNTL_SYNC_OMITTED]]
1.2 misho 1334: ** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by
1335: ** SQLite and sent to all VFSes in place of a call to the xSync method
1336: ** when the database connection has [PRAGMA synchronous] set to OFF.)^
1337: ** Some specialized VFSes need this signal in order to operate correctly
1338: ** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most
1339: ** VFSes do not need this signal and should silently ignore this opcode.
1340: ** Applications should not call [sqlite3_file_control()] with this
1341: ** opcode as doing so may disrupt the operation of the specialized VFSes
1342: ** that do require it.
1343: **
1.2.2.1 ! misho 1344: ** <li>[[SQLITE_FCNTL_WIN32_AV_RETRY]]
1.2 misho 1345: ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic
1346: ** retry counts and intervals for certain disk I/O operations for the
1347: ** windows [VFS] in order to provide robustness in the presence of
1348: ** anti-virus programs. By default, the windows VFS will retry file read,
1349: ** file write, and file delete operations up to 10 times, with a delay
1350: ** of 25 milliseconds before the first retry and with the delay increasing
1351: ** by an additional 25 milliseconds with each subsequent retry. This
1352: ** opcode allows these two values (10 retries and 25 milliseconds of delay)
1353: ** to be adjusted. The values are changed for all database connections
1354: ** within the same process. The argument is a pointer to an array of two
1355: ** integers where the first integer i the new retry count and the second
1356: ** integer is the delay. If either integer is negative, then the setting
1357: ** is not changed but instead the prior value of that setting is written
1358: ** into the array entry, allowing the current retry settings to be
1359: ** interrogated. The zDbName parameter is ignored.
1360: **
1.2.2.1 ! misho 1361: ** <li>[[SQLITE_FCNTL_PERSIST_WAL]]
1.2 misho 1362: ** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the
1.2.2.1 ! misho 1363: ** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary
1.2 misho 1364: ** write ahead log and shared memory files used for transaction control
1365: ** are automatically deleted when the latest connection to the database
1366: ** closes. Setting persistent WAL mode causes those files to persist after
1367: ** close. Persisting the files is useful when other processes that do not
1368: ** have write permission on the directory containing the database file want
1369: ** to read the database file, as the WAL and shared memory files must exist
1370: ** in order for the database to be readable. The fourth parameter to
1371: ** [sqlite3_file_control()] for this opcode should be a pointer to an integer.
1372: ** That integer is 0 to disable persistent WAL mode or 1 to enable persistent
1373: ** WAL mode. If the integer is -1, then it is overwritten with the current
1374: ** WAL persistence setting.
1375: **
1.2.2.1 ! misho 1376: ** <li>[[SQLITE_FCNTL_POWERSAFE_OVERWRITE]]
1.2 misho 1377: ** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the
1378: ** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting
1379: ** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the
1380: ** xDeviceCharacteristics methods. The fourth parameter to
1381: ** [sqlite3_file_control()] for this opcode should be a pointer to an integer.
1382: ** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage
1383: ** mode. If the integer is -1, then it is overwritten with the current
1384: ** zero-damage mode setting.
1385: **
1.2.2.1 ! misho 1386: ** <li>[[SQLITE_FCNTL_OVERWRITE]]
1.2 misho 1387: ** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening
1388: ** a write transaction to indicate that, unless it is rolled back for some
1389: ** reason, the entire database file will be overwritten by the current
1390: ** transaction. This is used by VACUUM operations.
1391: **
1.2.2.1 ! misho 1392: ** <li>[[SQLITE_FCNTL_VFSNAME]]
1.2 misho 1393: ** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of
1394: ** all [VFSes] in the VFS stack. The names are of all VFS shims and the
1395: ** final bottom-level VFS are written into memory obtained from
1396: ** [sqlite3_malloc()] and the result is stored in the char* variable
1397: ** that the fourth parameter of [sqlite3_file_control()] points to.
1398: ** The caller is responsible for freeing the memory when done. As with
1399: ** all file-control actions, there is no guarantee that this will actually
1400: ** do anything. Callers should initialize the char* variable to a NULL
1401: ** pointer in case this file-control is not implemented. This file-control
1402: ** is intended for diagnostic use only.
1.2.2.1 ! misho 1403: **
! 1404: ** <li>[[SQLITE_FCNTL_PRAGMA]]
! 1405: ** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA]
! 1406: ** file control is sent to the open [sqlite3_file] object corresponding
! 1407: ** to the database file to which the pragma statement refers. ^The argument
! 1408: ** to the [SQLITE_FCNTL_PRAGMA] file control is an array of
! 1409: ** pointers to strings (char**) in which the second element of the array
! 1410: ** is the name of the pragma and the third element is the argument to the
! 1411: ** pragma or NULL if the pragma has no argument. ^The handler for an
! 1412: ** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element
! 1413: ** of the char** argument point to a string obtained from [sqlite3_mprintf()]
! 1414: ** or the equivalent and that string will become the result of the pragma or
! 1415: ** the error message if the pragma fails. ^If the
! 1416: ** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal
! 1417: ** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA]
! 1418: ** file control returns [SQLITE_OK], then the parser assumes that the
! 1419: ** VFS has handled the PRAGMA itself and the parser generates a no-op
! 1420: ** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns
! 1421: ** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means
! 1422: ** that the VFS encountered an error while handling the [PRAGMA] and the
! 1423: ** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA]
! 1424: ** file control occurs at the beginning of pragma statement analysis and so
! 1425: ** it is able to override built-in [PRAGMA] statements.
! 1426: **
! 1427: ** <li>[[SQLITE_FCNTL_BUSYHANDLER]]
! 1428: ** ^This file-control may be invoked by SQLite on the database file handle
! 1429: ** shortly after it is opened in order to provide a custom VFS with access
! 1430: ** to the connections busy-handler callback. The argument is of type (void **)
! 1431: ** - an array of two (void *) values. The first (void *) actually points
! 1432: ** to a function of type (int (*)(void *)). In order to invoke the connections
! 1433: ** busy-handler, this function should be invoked with the second (void *) in
! 1434: ** the array as the only argument. If it returns non-zero, then the operation
! 1435: ** should be retried. If it returns zero, the custom VFS should abandon the
! 1436: ** current operation.
! 1437: **
! 1438: ** <li>[[SQLITE_FCNTL_TEMPFILENAME]]
! 1439: ** ^Application can invoke this file-control to have SQLite generate a
! 1440: ** temporary filename using the same algorithm that is followed to generate
! 1441: ** temporary filenames for TEMP tables and other internal uses. The
! 1442: ** argument should be a char** which will be filled with the filename
! 1443: ** written into memory obtained from [sqlite3_malloc()]. The caller should
! 1444: ** invoke [sqlite3_free()] on the result to avoid a memory leak.
! 1445: **
! 1446: ** </ul>
1.2 misho 1447: */
1448: #define SQLITE_FCNTL_LOCKSTATE 1
1449: #define SQLITE_GET_LOCKPROXYFILE 2
1450: #define SQLITE_SET_LOCKPROXYFILE 3
1451: #define SQLITE_LAST_ERRNO 4
1452: #define SQLITE_FCNTL_SIZE_HINT 5
1453: #define SQLITE_FCNTL_CHUNK_SIZE 6
1454: #define SQLITE_FCNTL_FILE_POINTER 7
1455: #define SQLITE_FCNTL_SYNC_OMITTED 8
1456: #define SQLITE_FCNTL_WIN32_AV_RETRY 9
1457: #define SQLITE_FCNTL_PERSIST_WAL 10
1458: #define SQLITE_FCNTL_OVERWRITE 11
1459: #define SQLITE_FCNTL_VFSNAME 12
1460: #define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13
1.2.2.1 ! misho 1461: #define SQLITE_FCNTL_PRAGMA 14
! 1462: #define SQLITE_FCNTL_BUSYHANDLER 15
! 1463: #define SQLITE_FCNTL_TEMPFILENAME 16
1.2 misho 1464:
1465: /*
1466: ** CAPI3REF: Mutex Handle
1467: **
1468: ** The mutex module within SQLite defines [sqlite3_mutex] to be an
1469: ** abstract type for a mutex object. The SQLite core never looks
1470: ** at the internal representation of an [sqlite3_mutex]. It only
1471: ** deals with pointers to the [sqlite3_mutex] object.
1472: **
1473: ** Mutexes are created using [sqlite3_mutex_alloc()].
1474: */
1475: typedef struct sqlite3_mutex sqlite3_mutex;
1476:
1477: /*
1478: ** CAPI3REF: OS Interface Object
1479: **
1480: ** An instance of the sqlite3_vfs object defines the interface between
1481: ** the SQLite core and the underlying operating system. The "vfs"
1482: ** in the name of the object stands for "virtual file system". See
1483: ** the [VFS | VFS documentation] for further information.
1484: **
1485: ** The value of the iVersion field is initially 1 but may be larger in
1486: ** future versions of SQLite. Additional fields may be appended to this
1487: ** object when the iVersion value is increased. Note that the structure
1488: ** of the sqlite3_vfs object changes in the transaction between
1489: ** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not
1490: ** modified.
1491: **
1492: ** The szOsFile field is the size of the subclassed [sqlite3_file]
1493: ** structure used by this VFS. mxPathname is the maximum length of
1494: ** a pathname in this VFS.
1495: **
1496: ** Registered sqlite3_vfs objects are kept on a linked list formed by
1497: ** the pNext pointer. The [sqlite3_vfs_register()]
1498: ** and [sqlite3_vfs_unregister()] interfaces manage this list
1499: ** in a thread-safe way. The [sqlite3_vfs_find()] interface
1500: ** searches the list. Neither the application code nor the VFS
1501: ** implementation should use the pNext pointer.
1502: **
1503: ** The pNext field is the only field in the sqlite3_vfs
1504: ** structure that SQLite will ever modify. SQLite will only access
1505: ** or modify this field while holding a particular static mutex.
1506: ** The application should never modify anything within the sqlite3_vfs
1507: ** object once the object has been registered.
1508: **
1509: ** The zName field holds the name of the VFS module. The name must
1510: ** be unique across all VFS modules.
1511: **
1512: ** [[sqlite3_vfs.xOpen]]
1513: ** ^SQLite guarantees that the zFilename parameter to xOpen
1514: ** is either a NULL pointer or string obtained
1515: ** from xFullPathname() with an optional suffix added.
1516: ** ^If a suffix is added to the zFilename parameter, it will
1517: ** consist of a single "-" character followed by no more than
1518: ** 11 alphanumeric and/or "-" characters.
1519: ** ^SQLite further guarantees that
1520: ** the string will be valid and unchanged until xClose() is
1521: ** called. Because of the previous sentence,
1522: ** the [sqlite3_file] can safely store a pointer to the
1523: ** filename if it needs to remember the filename for some reason.
1524: ** If the zFilename parameter to xOpen is a NULL pointer then xOpen
1525: ** must invent its own temporary name for the file. ^Whenever the
1526: ** xFilename parameter is NULL it will also be the case that the
1527: ** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE].
1528: **
1529: ** The flags argument to xOpen() includes all bits set in
1530: ** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()]
1531: ** or [sqlite3_open16()] is used, then flags includes at least
1532: ** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE].
1533: ** If xOpen() opens a file read-only then it sets *pOutFlags to
1534: ** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set.
1535: **
1536: ** ^(SQLite will also add one of the following flags to the xOpen()
1537: ** call, depending on the object being opened:
1538: **
1539: ** <ul>
1540: ** <li> [SQLITE_OPEN_MAIN_DB]
1541: ** <li> [SQLITE_OPEN_MAIN_JOURNAL]
1542: ** <li> [SQLITE_OPEN_TEMP_DB]
1543: ** <li> [SQLITE_OPEN_TEMP_JOURNAL]
1544: ** <li> [SQLITE_OPEN_TRANSIENT_DB]
1545: ** <li> [SQLITE_OPEN_SUBJOURNAL]
1546: ** <li> [SQLITE_OPEN_MASTER_JOURNAL]
1547: ** <li> [SQLITE_OPEN_WAL]
1548: ** </ul>)^
1549: **
1550: ** The file I/O implementation can use the object type flags to
1551: ** change the way it deals with files. For example, an application
1552: ** that does not care about crash recovery or rollback might make
1553: ** the open of a journal file a no-op. Writes to this journal would
1554: ** also be no-ops, and any attempt to read the journal would return
1555: ** SQLITE_IOERR. Or the implementation might recognize that a database
1556: ** file will be doing page-aligned sector reads and writes in a random
1557: ** order and set up its I/O subsystem accordingly.
1558: **
1559: ** SQLite might also add one of the following flags to the xOpen method:
1560: **
1561: ** <ul>
1562: ** <li> [SQLITE_OPEN_DELETEONCLOSE]
1563: ** <li> [SQLITE_OPEN_EXCLUSIVE]
1564: ** </ul>
1565: **
1566: ** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be
1567: ** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE]
1568: ** will be set for TEMP databases and their journals, transient
1569: ** databases, and subjournals.
1570: **
1571: ** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction
1572: ** with the [SQLITE_OPEN_CREATE] flag, which are both directly
1573: ** analogous to the O_EXCL and O_CREAT flags of the POSIX open()
1574: ** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the
1575: ** SQLITE_OPEN_CREATE, is used to indicate that file should always
1576: ** be created, and that it is an error if it already exists.
1577: ** It is <i>not</i> used to indicate the file should be opened
1578: ** for exclusive access.
1579: **
1580: ** ^At least szOsFile bytes of memory are allocated by SQLite
1581: ** to hold the [sqlite3_file] structure passed as the third
1582: ** argument to xOpen. The xOpen method does not have to
1583: ** allocate the structure; it should just fill it in. Note that
1584: ** the xOpen method must set the sqlite3_file.pMethods to either
1585: ** a valid [sqlite3_io_methods] object or to NULL. xOpen must do
1586: ** this even if the open fails. SQLite expects that the sqlite3_file.pMethods
1587: ** element will be valid after xOpen returns regardless of the success
1588: ** or failure of the xOpen call.
1589: **
1590: ** [[sqlite3_vfs.xAccess]]
1591: ** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS]
1592: ** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to
1593: ** test whether a file is readable and writable, or [SQLITE_ACCESS_READ]
1594: ** to test whether a file is at least readable. The file can be a
1595: ** directory.
1596: **
1597: ** ^SQLite will always allocate at least mxPathname+1 bytes for the
1598: ** output buffer xFullPathname. The exact size of the output buffer
1599: ** is also passed as a parameter to both methods. If the output buffer
1600: ** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is
1601: ** handled as a fatal error by SQLite, vfs implementations should endeavor
1602: ** to prevent this by setting mxPathname to a sufficiently large value.
1603: **
1604: ** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64()
1605: ** interfaces are not strictly a part of the filesystem, but they are
1606: ** included in the VFS structure for completeness.
1607: ** The xRandomness() function attempts to return nBytes bytes
1608: ** of good-quality randomness into zOut. The return value is
1609: ** the actual number of bytes of randomness obtained.
1610: ** The xSleep() method causes the calling thread to sleep for at
1611: ** least the number of microseconds given. ^The xCurrentTime()
1612: ** method returns a Julian Day Number for the current date and time as
1613: ** a floating point value.
1614: ** ^The xCurrentTimeInt64() method returns, as an integer, the Julian
1615: ** Day Number multiplied by 86400000 (the number of milliseconds in
1616: ** a 24-hour day).
1617: ** ^SQLite will use the xCurrentTimeInt64() method to get the current
1618: ** date and time if that method is available (if iVersion is 2 or
1619: ** greater and the function pointer is not NULL) and will fall back
1620: ** to xCurrentTime() if xCurrentTimeInt64() is unavailable.
1621: **
1622: ** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces
1623: ** are not used by the SQLite core. These optional interfaces are provided
1624: ** by some VFSes to facilitate testing of the VFS code. By overriding
1625: ** system calls with functions under its control, a test program can
1626: ** simulate faults and error conditions that would otherwise be difficult
1627: ** or impossible to induce. The set of system calls that can be overridden
1628: ** varies from one VFS to another, and from one version of the same VFS to the
1629: ** next. Applications that use these interfaces must be prepared for any
1630: ** or all of these interfaces to be NULL or for their behavior to change
1631: ** from one release to the next. Applications must not attempt to access
1632: ** any of these methods if the iVersion of the VFS is less than 3.
1633: */
1634: typedef struct sqlite3_vfs sqlite3_vfs;
1635: typedef void (*sqlite3_syscall_ptr)(void);
1636: struct sqlite3_vfs {
1637: int iVersion; /* Structure version number (currently 3) */
1638: int szOsFile; /* Size of subclassed sqlite3_file */
1639: int mxPathname; /* Maximum file pathname length */
1640: sqlite3_vfs *pNext; /* Next registered VFS */
1641: const char *zName; /* Name of this virtual file system */
1642: void *pAppData; /* Pointer to application-specific data */
1643: int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
1644: int flags, int *pOutFlags);
1645: int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
1646: int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
1647: int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);
1648: void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
1649: void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
1650: void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
1651: void (*xDlClose)(sqlite3_vfs*, void*);
1652: int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
1653: int (*xSleep)(sqlite3_vfs*, int microseconds);
1654: int (*xCurrentTime)(sqlite3_vfs*, double*);
1655: int (*xGetLastError)(sqlite3_vfs*, int, char *);
1656: /*
1657: ** The methods above are in version 1 of the sqlite_vfs object
1658: ** definition. Those that follow are added in version 2 or later
1659: */
1660: int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*);
1661: /*
1662: ** The methods above are in versions 1 and 2 of the sqlite_vfs object.
1663: ** Those below are for version 3 and greater.
1664: */
1665: int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr);
1666: sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName);
1667: const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName);
1668: /*
1669: ** The methods above are in versions 1 through 3 of the sqlite_vfs object.
1670: ** New fields may be appended in figure versions. The iVersion
1671: ** value will increment whenever this happens.
1672: */
1673: };
1674:
1675: /*
1676: ** CAPI3REF: Flags for the xAccess VFS method
1677: **
1678: ** These integer constants can be used as the third parameter to
1679: ** the xAccess method of an [sqlite3_vfs] object. They determine
1680: ** what kind of permissions the xAccess method is looking for.
1681: ** With SQLITE_ACCESS_EXISTS, the xAccess method
1682: ** simply checks whether the file exists.
1683: ** With SQLITE_ACCESS_READWRITE, the xAccess method
1684: ** checks whether the named directory is both readable and writable
1685: ** (in other words, if files can be added, removed, and renamed within
1686: ** the directory).
1687: ** The SQLITE_ACCESS_READWRITE constant is currently used only by the
1688: ** [temp_store_directory pragma], though this could change in a future
1689: ** release of SQLite.
1690: ** With SQLITE_ACCESS_READ, the xAccess method
1691: ** checks whether the file is readable. The SQLITE_ACCESS_READ constant is
1692: ** currently unused, though it might be used in a future release of
1693: ** SQLite.
1694: */
1695: #define SQLITE_ACCESS_EXISTS 0
1696: #define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */
1697: #define SQLITE_ACCESS_READ 2 /* Unused */
1698:
1699: /*
1700: ** CAPI3REF: Flags for the xShmLock VFS method
1701: **
1702: ** These integer constants define the various locking operations
1703: ** allowed by the xShmLock method of [sqlite3_io_methods]. The
1704: ** following are the only legal combinations of flags to the
1705: ** xShmLock method:
1706: **
1707: ** <ul>
1708: ** <li> SQLITE_SHM_LOCK | SQLITE_SHM_SHARED
1709: ** <li> SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE
1710: ** <li> SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED
1711: ** <li> SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE
1712: ** </ul>
1713: **
1714: ** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as
1715: ** was given no the corresponding lock.
1716: **
1717: ** The xShmLock method can transition between unlocked and SHARED or
1718: ** between unlocked and EXCLUSIVE. It cannot transition between SHARED
1719: ** and EXCLUSIVE.
1720: */
1721: #define SQLITE_SHM_UNLOCK 1
1722: #define SQLITE_SHM_LOCK 2
1723: #define SQLITE_SHM_SHARED 4
1724: #define SQLITE_SHM_EXCLUSIVE 8
1725:
1726: /*
1727: ** CAPI3REF: Maximum xShmLock index
1728: **
1729: ** The xShmLock method on [sqlite3_io_methods] may use values
1730: ** between 0 and this upper bound as its "offset" argument.
1731: ** The SQLite core will never attempt to acquire or release a
1732: ** lock outside of this range
1733: */
1734: #define SQLITE_SHM_NLOCK 8
1735:
1736:
1737: /*
1738: ** CAPI3REF: Initialize The SQLite Library
1739: **
1740: ** ^The sqlite3_initialize() routine initializes the
1741: ** SQLite library. ^The sqlite3_shutdown() routine
1742: ** deallocates any resources that were allocated by sqlite3_initialize().
1743: ** These routines are designed to aid in process initialization and
1744: ** shutdown on embedded systems. Workstation applications using
1745: ** SQLite normally do not need to invoke either of these routines.
1746: **
1747: ** A call to sqlite3_initialize() is an "effective" call if it is
1748: ** the first time sqlite3_initialize() is invoked during the lifetime of
1749: ** the process, or if it is the first time sqlite3_initialize() is invoked
1750: ** following a call to sqlite3_shutdown(). ^(Only an effective call
1751: ** of sqlite3_initialize() does any initialization. All other calls
1752: ** are harmless no-ops.)^
1753: **
1754: ** A call to sqlite3_shutdown() is an "effective" call if it is the first
1755: ** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only
1756: ** an effective call to sqlite3_shutdown() does any deinitialization.
1757: ** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^
1758: **
1759: ** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown()
1760: ** is not. The sqlite3_shutdown() interface must only be called from a
1761: ** single thread. All open [database connections] must be closed and all
1762: ** other SQLite resources must be deallocated prior to invoking
1763: ** sqlite3_shutdown().
1764: **
1765: ** Among other things, ^sqlite3_initialize() will invoke
1766: ** sqlite3_os_init(). Similarly, ^sqlite3_shutdown()
1767: ** will invoke sqlite3_os_end().
1768: **
1769: ** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success.
1770: ** ^If for some reason, sqlite3_initialize() is unable to initialize
1771: ** the library (perhaps it is unable to allocate a needed resource such
1772: ** as a mutex) it returns an [error code] other than [SQLITE_OK].
1773: **
1774: ** ^The sqlite3_initialize() routine is called internally by many other
1775: ** SQLite interfaces so that an application usually does not need to
1776: ** invoke sqlite3_initialize() directly. For example, [sqlite3_open()]
1777: ** calls sqlite3_initialize() so the SQLite library will be automatically
1778: ** initialized when [sqlite3_open()] is called if it has not be initialized
1779: ** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT]
1780: ** compile-time option, then the automatic calls to sqlite3_initialize()
1781: ** are omitted and the application must call sqlite3_initialize() directly
1782: ** prior to using any other SQLite interface. For maximum portability,
1783: ** it is recommended that applications always invoke sqlite3_initialize()
1784: ** directly prior to using any other SQLite interface. Future releases
1785: ** of SQLite may require this. In other words, the behavior exhibited
1786: ** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the
1787: ** default behavior in some future release of SQLite.
1788: **
1789: ** The sqlite3_os_init() routine does operating-system specific
1790: ** initialization of the SQLite library. The sqlite3_os_end()
1791: ** routine undoes the effect of sqlite3_os_init(). Typical tasks
1792: ** performed by these routines include allocation or deallocation
1793: ** of static resources, initialization of global variables,
1794: ** setting up a default [sqlite3_vfs] module, or setting up
1795: ** a default configuration using [sqlite3_config()].
1796: **
1797: ** The application should never invoke either sqlite3_os_init()
1798: ** or sqlite3_os_end() directly. The application should only invoke
1799: ** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init()
1800: ** interface is called automatically by sqlite3_initialize() and
1801: ** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate
1802: ** implementations for sqlite3_os_init() and sqlite3_os_end()
1803: ** are built into SQLite when it is compiled for Unix, Windows, or OS/2.
1804: ** When [custom builds | built for other platforms]
1805: ** (using the [SQLITE_OS_OTHER=1] compile-time
1806: ** option) the application must supply a suitable implementation for
1807: ** sqlite3_os_init() and sqlite3_os_end(). An application-supplied
1808: ** implementation of sqlite3_os_init() or sqlite3_os_end()
1809: ** must return [SQLITE_OK] on success and some other [error code] upon
1810: ** failure.
1811: */
1812: SQLITE_API int sqlite3_initialize(void);
1813: SQLITE_API int sqlite3_shutdown(void);
1814: SQLITE_API int sqlite3_os_init(void);
1815: SQLITE_API int sqlite3_os_end(void);
1816:
1817: /*
1818: ** CAPI3REF: Configuring The SQLite Library
1819: **
1820: ** The sqlite3_config() interface is used to make global configuration
1821: ** changes to SQLite in order to tune SQLite to the specific needs of
1822: ** the application. The default configuration is recommended for most
1823: ** applications and so this routine is usually not necessary. It is
1824: ** provided to support rare applications with unusual needs.
1825: **
1826: ** The sqlite3_config() interface is not threadsafe. The application
1827: ** must insure that no other SQLite interfaces are invoked by other
1828: ** threads while sqlite3_config() is running. Furthermore, sqlite3_config()
1829: ** may only be invoked prior to library initialization using
1830: ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
1831: ** ^If sqlite3_config() is called after [sqlite3_initialize()] and before
1832: ** [sqlite3_shutdown()] then it will return SQLITE_MISUSE.
1833: ** Note, however, that ^sqlite3_config() can be called as part of the
1834: ** implementation of an application-defined [sqlite3_os_init()].
1835: **
1836: ** The first argument to sqlite3_config() is an integer
1837: ** [configuration option] that determines
1838: ** what property of SQLite is to be configured. Subsequent arguments
1839: ** vary depending on the [configuration option]
1840: ** in the first argument.
1841: **
1842: ** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK].
1843: ** ^If the option is unknown or SQLite is unable to set the option
1844: ** then this routine returns a non-zero [error code].
1845: */
1846: SQLITE_API int sqlite3_config(int, ...);
1847:
1848: /*
1849: ** CAPI3REF: Configure database connections
1850: **
1851: ** The sqlite3_db_config() interface is used to make configuration
1852: ** changes to a [database connection]. The interface is similar to
1853: ** [sqlite3_config()] except that the changes apply to a single
1854: ** [database connection] (specified in the first argument).
1855: **
1856: ** The second argument to sqlite3_db_config(D,V,...) is the
1857: ** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code
1858: ** that indicates what aspect of the [database connection] is being configured.
1859: ** Subsequent arguments vary depending on the configuration verb.
1860: **
1861: ** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if
1862: ** the call is considered successful.
1863: */
1864: SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...);
1865:
1866: /*
1867: ** CAPI3REF: Memory Allocation Routines
1868: **
1869: ** An instance of this object defines the interface between SQLite
1870: ** and low-level memory allocation routines.
1871: **
1872: ** This object is used in only one place in the SQLite interface.
1873: ** A pointer to an instance of this object is the argument to
1874: ** [sqlite3_config()] when the configuration option is
1875: ** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC].
1876: ** By creating an instance of this object
1877: ** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC])
1878: ** during configuration, an application can specify an alternative
1879: ** memory allocation subsystem for SQLite to use for all of its
1880: ** dynamic memory needs.
1881: **
1882: ** Note that SQLite comes with several [built-in memory allocators]
1883: ** that are perfectly adequate for the overwhelming majority of applications
1884: ** and that this object is only useful to a tiny minority of applications
1885: ** with specialized memory allocation requirements. This object is
1886: ** also used during testing of SQLite in order to specify an alternative
1887: ** memory allocator that simulates memory out-of-memory conditions in
1888: ** order to verify that SQLite recovers gracefully from such
1889: ** conditions.
1890: **
1891: ** The xMalloc, xRealloc, and xFree methods must work like the
1892: ** malloc(), realloc() and free() functions from the standard C library.
1893: ** ^SQLite guarantees that the second argument to
1894: ** xRealloc is always a value returned by a prior call to xRoundup.
1895: **
1896: ** xSize should return the allocated size of a memory allocation
1897: ** previously obtained from xMalloc or xRealloc. The allocated size
1898: ** is always at least as big as the requested size but may be larger.
1899: **
1900: ** The xRoundup method returns what would be the allocated size of
1901: ** a memory allocation given a particular requested size. Most memory
1902: ** allocators round up memory allocations at least to the next multiple
1903: ** of 8. Some allocators round up to a larger multiple or to a power of 2.
1904: ** Every memory allocation request coming in through [sqlite3_malloc()]
1905: ** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0,
1906: ** that causes the corresponding memory allocation to fail.
1907: **
1908: ** The xInit method initializes the memory allocator. (For example,
1909: ** it might allocate any require mutexes or initialize internal data
1910: ** structures. The xShutdown method is invoked (indirectly) by
1911: ** [sqlite3_shutdown()] and should deallocate any resources acquired
1912: ** by xInit. The pAppData pointer is used as the only parameter to
1913: ** xInit and xShutdown.
1914: **
1915: ** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes
1916: ** the xInit method, so the xInit method need not be threadsafe. The
1917: ** xShutdown method is only called from [sqlite3_shutdown()] so it does
1918: ** not need to be threadsafe either. For all other methods, SQLite
1919: ** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the
1920: ** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which
1921: ** it is by default) and so the methods are automatically serialized.
1922: ** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other
1923: ** methods must be threadsafe or else make their own arrangements for
1924: ** serialization.
1925: **
1926: ** SQLite will never invoke xInit() more than once without an intervening
1927: ** call to xShutdown().
1928: */
1929: typedef struct sqlite3_mem_methods sqlite3_mem_methods;
1930: struct sqlite3_mem_methods {
1931: void *(*xMalloc)(int); /* Memory allocation function */
1932: void (*xFree)(void*); /* Free a prior allocation */
1933: void *(*xRealloc)(void*,int); /* Resize an allocation */
1934: int (*xSize)(void*); /* Return the size of an allocation */
1935: int (*xRoundup)(int); /* Round up request size to allocation size */
1936: int (*xInit)(void*); /* Initialize the memory allocator */
1937: void (*xShutdown)(void*); /* Deinitialize the memory allocator */
1938: void *pAppData; /* Argument to xInit() and xShutdown() */
1939: };
1940:
1941: /*
1942: ** CAPI3REF: Configuration Options
1943: ** KEYWORDS: {configuration option}
1944: **
1945: ** These constants are the available integer configuration options that
1946: ** can be passed as the first argument to the [sqlite3_config()] interface.
1947: **
1948: ** New configuration options may be added in future releases of SQLite.
1949: ** Existing configuration options might be discontinued. Applications
1950: ** should check the return code from [sqlite3_config()] to make sure that
1951: ** the call worked. The [sqlite3_config()] interface will return a
1952: ** non-zero [error code] if a discontinued or unsupported configuration option
1953: ** is invoked.
1954: **
1955: ** <dl>
1956: ** [[SQLITE_CONFIG_SINGLETHREAD]] <dt>SQLITE_CONFIG_SINGLETHREAD</dt>
1957: ** <dd>There are no arguments to this option. ^This option sets the
1958: ** [threading mode] to Single-thread. In other words, it disables
1959: ** all mutexing and puts SQLite into a mode where it can only be used
1960: ** by a single thread. ^If SQLite is compiled with
1961: ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then
1962: ** it is not possible to change the [threading mode] from its default
1963: ** value of Single-thread and so [sqlite3_config()] will return
1964: ** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD
1965: ** configuration option.</dd>
1966: **
1967: ** [[SQLITE_CONFIG_MULTITHREAD]] <dt>SQLITE_CONFIG_MULTITHREAD</dt>
1968: ** <dd>There are no arguments to this option. ^This option sets the
1969: ** [threading mode] to Multi-thread. In other words, it disables
1970: ** mutexing on [database connection] and [prepared statement] objects.
1971: ** The application is responsible for serializing access to
1972: ** [database connections] and [prepared statements]. But other mutexes
1973: ** are enabled so that SQLite will be safe to use in a multi-threaded
1974: ** environment as long as no two threads attempt to use the same
1975: ** [database connection] at the same time. ^If SQLite is compiled with
1976: ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then
1977: ** it is not possible to set the Multi-thread [threading mode] and
1978: ** [sqlite3_config()] will return [SQLITE_ERROR] if called with the
1979: ** SQLITE_CONFIG_MULTITHREAD configuration option.</dd>
1980: **
1981: ** [[SQLITE_CONFIG_SERIALIZED]] <dt>SQLITE_CONFIG_SERIALIZED</dt>
1982: ** <dd>There are no arguments to this option. ^This option sets the
1983: ** [threading mode] to Serialized. In other words, this option enables
1984: ** all mutexes including the recursive
1985: ** mutexes on [database connection] and [prepared statement] objects.
1986: ** In this mode (which is the default when SQLite is compiled with
1987: ** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access
1988: ** to [database connections] and [prepared statements] so that the
1989: ** application is free to use the same [database connection] or the
1990: ** same [prepared statement] in different threads at the same time.
1991: ** ^If SQLite is compiled with
1992: ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then
1993: ** it is not possible to set the Serialized [threading mode] and
1994: ** [sqlite3_config()] will return [SQLITE_ERROR] if called with the
1995: ** SQLITE_CONFIG_SERIALIZED configuration option.</dd>
1996: **
1997: ** [[SQLITE_CONFIG_MALLOC]] <dt>SQLITE_CONFIG_MALLOC</dt>
1998: ** <dd> ^(This option takes a single argument which is a pointer to an
1999: ** instance of the [sqlite3_mem_methods] structure. The argument specifies
2000: ** alternative low-level memory allocation routines to be used in place of
2001: ** the memory allocation routines built into SQLite.)^ ^SQLite makes
2002: ** its own private copy of the content of the [sqlite3_mem_methods] structure
2003: ** before the [sqlite3_config()] call returns.</dd>
2004: **
2005: ** [[SQLITE_CONFIG_GETMALLOC]] <dt>SQLITE_CONFIG_GETMALLOC</dt>
2006: ** <dd> ^(This option takes a single argument which is a pointer to an
2007: ** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods]
2008: ** structure is filled with the currently defined memory allocation routines.)^
2009: ** This option can be used to overload the default memory allocation
2010: ** routines with a wrapper that simulations memory allocation failure or
2011: ** tracks memory usage, for example. </dd>
2012: **
2013: ** [[SQLITE_CONFIG_MEMSTATUS]] <dt>SQLITE_CONFIG_MEMSTATUS</dt>
2014: ** <dd> ^This option takes single argument of type int, interpreted as a
2015: ** boolean, which enables or disables the collection of memory allocation
2016: ** statistics. ^(When memory allocation statistics are disabled, the
2017: ** following SQLite interfaces become non-operational:
2018: ** <ul>
2019: ** <li> [sqlite3_memory_used()]
2020: ** <li> [sqlite3_memory_highwater()]
2021: ** <li> [sqlite3_soft_heap_limit64()]
2022: ** <li> [sqlite3_status()]
2023: ** </ul>)^
2024: ** ^Memory allocation statistics are enabled by default unless SQLite is
2025: ** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory
2026: ** allocation statistics are disabled by default.
2027: ** </dd>
2028: **
2029: ** [[SQLITE_CONFIG_SCRATCH]] <dt>SQLITE_CONFIG_SCRATCH</dt>
2030: ** <dd> ^This option specifies a static memory buffer that SQLite can use for
2031: ** scratch memory. There are three arguments: A pointer an 8-byte
2032: ** aligned memory buffer from which the scratch allocations will be
2033: ** drawn, the size of each scratch allocation (sz),
2034: ** and the maximum number of scratch allocations (N). The sz
2035: ** argument must be a multiple of 16.
2036: ** The first argument must be a pointer to an 8-byte aligned buffer
2037: ** of at least sz*N bytes of memory.
2038: ** ^SQLite will use no more than two scratch buffers per thread. So
2039: ** N should be set to twice the expected maximum number of threads.
2040: ** ^SQLite will never require a scratch buffer that is more than 6
2041: ** times the database page size. ^If SQLite needs needs additional
2042: ** scratch memory beyond what is provided by this configuration option, then
2043: ** [sqlite3_malloc()] will be used to obtain the memory needed.</dd>
2044: **
2045: ** [[SQLITE_CONFIG_PAGECACHE]] <dt>SQLITE_CONFIG_PAGECACHE</dt>
2046: ** <dd> ^This option specifies a static memory buffer that SQLite can use for
2047: ** the database page cache with the default page cache implementation.
2048: ** This configuration should not be used if an application-define page
2049: ** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option.
2050: ** There are three arguments to this option: A pointer to 8-byte aligned
2051: ** memory, the size of each page buffer (sz), and the number of pages (N).
2052: ** The sz argument should be the size of the largest database page
2053: ** (a power of two between 512 and 32768) plus a little extra for each
2054: ** page header. ^The page header size is 20 to 40 bytes depending on
2055: ** the host architecture. ^It is harmless, apart from the wasted memory,
2056: ** to make sz a little too large. The first
2057: ** argument should point to an allocation of at least sz*N bytes of memory.
2058: ** ^SQLite will use the memory provided by the first argument to satisfy its
2059: ** memory needs for the first N pages that it adds to cache. ^If additional
2060: ** page cache memory is needed beyond what is provided by this option, then
2061: ** SQLite goes to [sqlite3_malloc()] for the additional storage space.
2062: ** The pointer in the first argument must
2063: ** be aligned to an 8-byte boundary or subsequent behavior of SQLite
2064: ** will be undefined.</dd>
2065: **
2066: ** [[SQLITE_CONFIG_HEAP]] <dt>SQLITE_CONFIG_HEAP</dt>
2067: ** <dd> ^This option specifies a static memory buffer that SQLite will use
2068: ** for all of its dynamic memory allocation needs beyond those provided
2069: ** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE].
2070: ** There are three arguments: An 8-byte aligned pointer to the memory,
2071: ** the number of bytes in the memory buffer, and the minimum allocation size.
2072: ** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts
2073: ** to using its default memory allocator (the system malloc() implementation),
2074: ** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the
2075: ** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or
2076: ** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory
2077: ** allocator is engaged to handle all of SQLites memory allocation needs.
2078: ** The first pointer (the memory pointer) must be aligned to an 8-byte
2079: ** boundary or subsequent behavior of SQLite will be undefined.
2080: ** The minimum allocation size is capped at 2**12. Reasonable values
2081: ** for the minimum allocation size are 2**5 through 2**8.</dd>
2082: **
2083: ** [[SQLITE_CONFIG_MUTEX]] <dt>SQLITE_CONFIG_MUTEX</dt>
2084: ** <dd> ^(This option takes a single argument which is a pointer to an
2085: ** instance of the [sqlite3_mutex_methods] structure. The argument specifies
2086: ** alternative low-level mutex routines to be used in place
2087: ** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the
2088: ** content of the [sqlite3_mutex_methods] structure before the call to
2089: ** [sqlite3_config()] returns. ^If SQLite is compiled with
2090: ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then
2091: ** the entire mutexing subsystem is omitted from the build and hence calls to
2092: ** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will
2093: ** return [SQLITE_ERROR].</dd>
2094: **
2095: ** [[SQLITE_CONFIG_GETMUTEX]] <dt>SQLITE_CONFIG_GETMUTEX</dt>
2096: ** <dd> ^(This option takes a single argument which is a pointer to an
2097: ** instance of the [sqlite3_mutex_methods] structure. The
2098: ** [sqlite3_mutex_methods]
2099: ** structure is filled with the currently defined mutex routines.)^
2100: ** This option can be used to overload the default mutex allocation
2101: ** routines with a wrapper used to track mutex usage for performance
2102: ** profiling or testing, for example. ^If SQLite is compiled with
2103: ** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then
2104: ** the entire mutexing subsystem is omitted from the build and hence calls to
2105: ** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will
2106: ** return [SQLITE_ERROR].</dd>
2107: **
2108: ** [[SQLITE_CONFIG_LOOKASIDE]] <dt>SQLITE_CONFIG_LOOKASIDE</dt>
2109: ** <dd> ^(This option takes two arguments that determine the default
2110: ** memory allocation for the lookaside memory allocator on each
2111: ** [database connection]. The first argument is the
2112: ** size of each lookaside buffer slot and the second is the number of
2113: ** slots allocated to each database connection.)^ ^(This option sets the
2114: ** <i>default</i> lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE]
2115: ** verb to [sqlite3_db_config()] can be used to change the lookaside
2116: ** configuration on individual connections.)^ </dd>
2117: **
2118: ** [[SQLITE_CONFIG_PCACHE2]] <dt>SQLITE_CONFIG_PCACHE2</dt>
2119: ** <dd> ^(This option takes a single argument which is a pointer to
2120: ** an [sqlite3_pcache_methods2] object. This object specifies the interface
2121: ** to a custom page cache implementation.)^ ^SQLite makes a copy of the
2122: ** object and uses it for page cache memory allocations.</dd>
2123: **
2124: ** [[SQLITE_CONFIG_GETPCACHE2]] <dt>SQLITE_CONFIG_GETPCACHE2</dt>
2125: ** <dd> ^(This option takes a single argument which is a pointer to an
2126: ** [sqlite3_pcache_methods2] object. SQLite copies of the current
2127: ** page cache implementation into that object.)^ </dd>
2128: **
2129: ** [[SQLITE_CONFIG_LOG]] <dt>SQLITE_CONFIG_LOG</dt>
2130: ** <dd> ^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a
2131: ** function with a call signature of void(*)(void*,int,const char*),
2132: ** and a pointer to void. ^If the function pointer is not NULL, it is
2133: ** invoked by [sqlite3_log()] to process each logging event. ^If the
2134: ** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op.
2135: ** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is
2136: ** passed through as the first parameter to the application-defined logger
2137: ** function whenever that function is invoked. ^The second parameter to
2138: ** the logger function is a copy of the first parameter to the corresponding
2139: ** [sqlite3_log()] call and is intended to be a [result code] or an
2140: ** [extended result code]. ^The third parameter passed to the logger is
2141: ** log message after formatting via [sqlite3_snprintf()].
2142: ** The SQLite logging interface is not reentrant; the logger function
2143: ** supplied by the application must not invoke any SQLite interface.
2144: ** In a multi-threaded application, the application-defined logger
2145: ** function must be threadsafe. </dd>
2146: **
2147: ** [[SQLITE_CONFIG_URI]] <dt>SQLITE_CONFIG_URI
2148: ** <dd> This option takes a single argument of type int. If non-zero, then
2149: ** URI handling is globally enabled. If the parameter is zero, then URI handling
2150: ** is globally disabled. If URI handling is globally enabled, all filenames
2151: ** passed to [sqlite3_open()], [sqlite3_open_v2()], [sqlite3_open16()] or
2152: ** specified as part of [ATTACH] commands are interpreted as URIs, regardless
2153: ** of whether or not the [SQLITE_OPEN_URI] flag is set when the database
2154: ** connection is opened. If it is globally disabled, filenames are
2155: ** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the
2156: ** database connection is opened. By default, URI handling is globally
2157: ** disabled. The default value may be changed by compiling with the
2158: ** [SQLITE_USE_URI] symbol defined.
2159: **
1.2.2.1 ! misho 2160: ** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]] <dt>SQLITE_CONFIG_COVERING_INDEX_SCAN
! 2161: ** <dd> This option takes a single integer argument which is interpreted as
! 2162: ** a boolean in order to enable or disable the use of covering indices for
! 2163: ** full table scans in the query optimizer. The default setting is determined
! 2164: ** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on"
! 2165: ** if that compile-time option is omitted.
! 2166: ** The ability to disable the use of covering indices for full table scans
! 2167: ** is because some incorrectly coded legacy applications might malfunction
! 2168: ** malfunction when the optimization is enabled. Providing the ability to
! 2169: ** disable the optimization allows the older, buggy application code to work
! 2170: ** without change even with newer versions of SQLite.
! 2171: **
1.2 misho 2172: ** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]]
1.2.2.1 ! misho 2173: ** <dt>SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE
1.2 misho 2174: ** <dd> These options are obsolete and should not be used by new code.
2175: ** They are retained for backwards compatibility but are now no-ops.
2176: ** </dl>
1.2.2.1 ! misho 2177: **
! 2178: ** [[SQLITE_CONFIG_SQLLOG]]
! 2179: ** <dt>SQLITE_CONFIG_SQLLOG
! 2180: ** <dd>This option is only available if sqlite is compiled with the
! 2181: ** SQLITE_ENABLE_SQLLOG pre-processor macro defined. The first argument should
! 2182: ** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int).
! 2183: ** The second should be of type (void*). The callback is invoked by the library
! 2184: ** in three separate circumstances, identified by the value passed as the
! 2185: ** fourth parameter. If the fourth parameter is 0, then the database connection
! 2186: ** passed as the second argument has just been opened. The third argument
! 2187: ** points to a buffer containing the name of the main database file. If the
! 2188: ** fourth parameter is 1, then the SQL statement that the third parameter
! 2189: ** points to has just been executed. Or, if the fourth parameter is 2, then
! 2190: ** the connection being passed as the second parameter is being closed. The
! 2191: ** third parameter is passed NULL In this case.
! 2192: ** </dl>
1.2 misho 2193: */
2194: #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */
2195: #define SQLITE_CONFIG_MULTITHREAD 2 /* nil */
2196: #define SQLITE_CONFIG_SERIALIZED 3 /* nil */
2197: #define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */
2198: #define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */
2199: #define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */
2200: #define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */
2201: #define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */
2202: #define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */
2203: #define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */
2204: #define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */
2205: /* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */
2206: #define SQLITE_CONFIG_LOOKASIDE 13 /* int int */
2207: #define SQLITE_CONFIG_PCACHE 14 /* no-op */
2208: #define SQLITE_CONFIG_GETPCACHE 15 /* no-op */
2209: #define SQLITE_CONFIG_LOG 16 /* xFunc, void* */
2210: #define SQLITE_CONFIG_URI 17 /* int */
2211: #define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */
2212: #define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */
1.2.2.1 ! misho 2213: #define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */
! 2214: #define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */
1.2 misho 2215:
2216: /*
2217: ** CAPI3REF: Database Connection Configuration Options
2218: **
2219: ** These constants are the available integer configuration options that
2220: ** can be passed as the second argument to the [sqlite3_db_config()] interface.
2221: **
2222: ** New configuration options may be added in future releases of SQLite.
2223: ** Existing configuration options might be discontinued. Applications
2224: ** should check the return code from [sqlite3_db_config()] to make sure that
2225: ** the call worked. ^The [sqlite3_db_config()] interface will return a
2226: ** non-zero [error code] if a discontinued or unsupported configuration option
2227: ** is invoked.
2228: **
2229: ** <dl>
2230: ** <dt>SQLITE_DBCONFIG_LOOKASIDE</dt>
2231: ** <dd> ^This option takes three additional arguments that determine the
2232: ** [lookaside memory allocator] configuration for the [database connection].
2233: ** ^The first argument (the third parameter to [sqlite3_db_config()] is a
2234: ** pointer to a memory buffer to use for lookaside memory.
2235: ** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb
2236: ** may be NULL in which case SQLite will allocate the
2237: ** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the
2238: ** size of each lookaside buffer slot. ^The third argument is the number of
2239: ** slots. The size of the buffer in the first argument must be greater than
2240: ** or equal to the product of the second and third arguments. The buffer
2241: ** must be aligned to an 8-byte boundary. ^If the second argument to
2242: ** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally
2243: ** rounded down to the next smaller multiple of 8. ^(The lookaside memory
2244: ** configuration for a database connection can only be changed when that
2245: ** connection is not currently using lookaside memory, or in other words
2246: ** when the "current value" returned by
2247: ** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero.
2248: ** Any attempt to change the lookaside memory configuration when lookaside
2249: ** memory is in use leaves the configuration unchanged and returns
2250: ** [SQLITE_BUSY].)^</dd>
2251: **
2252: ** <dt>SQLITE_DBCONFIG_ENABLE_FKEY</dt>
2253: ** <dd> ^This option is used to enable or disable the enforcement of
2254: ** [foreign key constraints]. There should be two additional arguments.
2255: ** The first argument is an integer which is 0 to disable FK enforcement,
2256: ** positive to enable FK enforcement or negative to leave FK enforcement
2257: ** unchanged. The second parameter is a pointer to an integer into which
2258: ** is written 0 or 1 to indicate whether FK enforcement is off or on
2259: ** following this call. The second parameter may be a NULL pointer, in
2260: ** which case the FK enforcement setting is not reported back. </dd>
2261: **
2262: ** <dt>SQLITE_DBCONFIG_ENABLE_TRIGGER</dt>
2263: ** <dd> ^This option is used to enable or disable [CREATE TRIGGER | triggers].
2264: ** There should be two additional arguments.
2265: ** The first argument is an integer which is 0 to disable triggers,
2266: ** positive to enable triggers or negative to leave the setting unchanged.
2267: ** The second parameter is a pointer to an integer into which
2268: ** is written 0 or 1 to indicate whether triggers are disabled or enabled
2269: ** following this call. The second parameter may be a NULL pointer, in
2270: ** which case the trigger setting is not reported back. </dd>
2271: **
2272: ** </dl>
2273: */
2274: #define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */
2275: #define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */
2276: #define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */
2277:
2278:
2279: /*
2280: ** CAPI3REF: Enable Or Disable Extended Result Codes
2281: **
2282: ** ^The sqlite3_extended_result_codes() routine enables or disables the
2283: ** [extended result codes] feature of SQLite. ^The extended result
2284: ** codes are disabled by default for historical compatibility.
2285: */
2286: SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff);
2287:
2288: /*
2289: ** CAPI3REF: Last Insert Rowid
2290: **
2291: ** ^Each entry in an SQLite table has a unique 64-bit signed
2292: ** integer key called the [ROWID | "rowid"]. ^The rowid is always available
2293: ** as an undeclared column named ROWID, OID, or _ROWID_ as long as those
2294: ** names are not also used by explicitly declared columns. ^If
2295: ** the table has a column of type [INTEGER PRIMARY KEY] then that column
2296: ** is another alias for the rowid.
2297: **
2298: ** ^This routine returns the [rowid] of the most recent
2299: ** successful [INSERT] into the database from the [database connection]
2300: ** in the first argument. ^As of SQLite version 3.7.7, this routines
2301: ** records the last insert rowid of both ordinary tables and [virtual tables].
2302: ** ^If no successful [INSERT]s
2303: ** have ever occurred on that database connection, zero is returned.
2304: **
2305: ** ^(If an [INSERT] occurs within a trigger or within a [virtual table]
2306: ** method, then this routine will return the [rowid] of the inserted
2307: ** row as long as the trigger or virtual table method is running.
2308: ** But once the trigger or virtual table method ends, the value returned
2309: ** by this routine reverts to what it was before the trigger or virtual
2310: ** table method began.)^
2311: **
2312: ** ^An [INSERT] that fails due to a constraint violation is not a
2313: ** successful [INSERT] and does not change the value returned by this
2314: ** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK,
2315: ** and INSERT OR ABORT make no changes to the return value of this
2316: ** routine when their insertion fails. ^(When INSERT OR REPLACE
2317: ** encounters a constraint violation, it does not fail. The
2318: ** INSERT continues to completion after deleting rows that caused
2319: ** the constraint problem so INSERT OR REPLACE will always change
2320: ** the return value of this interface.)^
2321: **
2322: ** ^For the purposes of this routine, an [INSERT] is considered to
2323: ** be successful even if it is subsequently rolled back.
2324: **
2325: ** This function is accessible to SQL statements via the
2326: ** [last_insert_rowid() SQL function].
2327: **
2328: ** If a separate thread performs a new [INSERT] on the same
2329: ** database connection while the [sqlite3_last_insert_rowid()]
2330: ** function is running and thus changes the last insert [rowid],
2331: ** then the value returned by [sqlite3_last_insert_rowid()] is
2332: ** unpredictable and might not equal either the old or the new
2333: ** last insert [rowid].
2334: */
2335: SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);
2336:
2337: /*
2338: ** CAPI3REF: Count The Number Of Rows Modified
2339: **
2340: ** ^This function returns the number of database rows that were changed
2341: ** or inserted or deleted by the most recently completed SQL statement
2342: ** on the [database connection] specified by the first parameter.
2343: ** ^(Only changes that are directly specified by the [INSERT], [UPDATE],
2344: ** or [DELETE] statement are counted. Auxiliary changes caused by
2345: ** triggers or [foreign key actions] are not counted.)^ Use the
2346: ** [sqlite3_total_changes()] function to find the total number of changes
2347: ** including changes caused by triggers and foreign key actions.
2348: **
2349: ** ^Changes to a view that are simulated by an [INSTEAD OF trigger]
2350: ** are not counted. Only real table changes are counted.
2351: **
2352: ** ^(A "row change" is a change to a single row of a single table
2353: ** caused by an INSERT, DELETE, or UPDATE statement. Rows that
2354: ** are changed as side effects of [REPLACE] constraint resolution,
2355: ** rollback, ABORT processing, [DROP TABLE], or by any other
2356: ** mechanisms do not count as direct row changes.)^
2357: **
2358: ** A "trigger context" is a scope of execution that begins and
2359: ** ends with the script of a [CREATE TRIGGER | trigger].
2360: ** Most SQL statements are
2361: ** evaluated outside of any trigger. This is the "top level"
2362: ** trigger context. If a trigger fires from the top level, a
2363: ** new trigger context is entered for the duration of that one
2364: ** trigger. Subtriggers create subcontexts for their duration.
2365: **
2366: ** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does
2367: ** not create a new trigger context.
2368: **
2369: ** ^This function returns the number of direct row changes in the
2370: ** most recent INSERT, UPDATE, or DELETE statement within the same
2371: ** trigger context.
2372: **
2373: ** ^Thus, when called from the top level, this function returns the
2374: ** number of changes in the most recent INSERT, UPDATE, or DELETE
2375: ** that also occurred at the top level. ^(Within the body of a trigger,
2376: ** the sqlite3_changes() interface can be called to find the number of
2377: ** changes in the most recently completed INSERT, UPDATE, or DELETE
2378: ** statement within the body of the same trigger.
2379: ** However, the number returned does not include changes
2380: ** caused by subtriggers since those have their own context.)^
2381: **
2382: ** See also the [sqlite3_total_changes()] interface, the
2383: ** [count_changes pragma], and the [changes() SQL function].
2384: **
2385: ** If a separate thread makes changes on the same database connection
2386: ** while [sqlite3_changes()] is running then the value returned
2387: ** is unpredictable and not meaningful.
2388: */
2389: SQLITE_API int sqlite3_changes(sqlite3*);
2390:
2391: /*
2392: ** CAPI3REF: Total Number Of Rows Modified
2393: **
2394: ** ^This function returns the number of row changes caused by [INSERT],
2395: ** [UPDATE] or [DELETE] statements since the [database connection] was opened.
2396: ** ^(The count returned by sqlite3_total_changes() includes all changes
2397: ** from all [CREATE TRIGGER | trigger] contexts and changes made by
2398: ** [foreign key actions]. However,
2399: ** the count does not include changes used to implement [REPLACE] constraints,
2400: ** do rollbacks or ABORT processing, or [DROP TABLE] processing. The
2401: ** count does not include rows of views that fire an [INSTEAD OF trigger],
2402: ** though if the INSTEAD OF trigger makes changes of its own, those changes
2403: ** are counted.)^
2404: ** ^The sqlite3_total_changes() function counts the changes as soon as
2405: ** the statement that makes them is completed (when the statement handle
2406: ** is passed to [sqlite3_reset()] or [sqlite3_finalize()]).
2407: **
2408: ** See also the [sqlite3_changes()] interface, the
2409: ** [count_changes pragma], and the [total_changes() SQL function].
2410: **
2411: ** If a separate thread makes changes on the same database connection
2412: ** while [sqlite3_total_changes()] is running then the value
2413: ** returned is unpredictable and not meaningful.
2414: */
2415: SQLITE_API int sqlite3_total_changes(sqlite3*);
2416:
2417: /*
2418: ** CAPI3REF: Interrupt A Long-Running Query
2419: **
2420: ** ^This function causes any pending database operation to abort and
2421: ** return at its earliest opportunity. This routine is typically
2422: ** called in response to a user action such as pressing "Cancel"
2423: ** or Ctrl-C where the user wants a long query operation to halt
2424: ** immediately.
2425: **
2426: ** ^It is safe to call this routine from a thread different from the
2427: ** thread that is currently running the database operation. But it
2428: ** is not safe to call this routine with a [database connection] that
2429: ** is closed or might close before sqlite3_interrupt() returns.
2430: **
2431: ** ^If an SQL operation is very nearly finished at the time when
2432: ** sqlite3_interrupt() is called, then it might not have an opportunity
2433: ** to be interrupted and might continue to completion.
2434: **
2435: ** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT].
2436: ** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE
2437: ** that is inside an explicit transaction, then the entire transaction
2438: ** will be rolled back automatically.
2439: **
2440: ** ^The sqlite3_interrupt(D) call is in effect until all currently running
2441: ** SQL statements on [database connection] D complete. ^Any new SQL statements
2442: ** that are started after the sqlite3_interrupt() call and before the
2443: ** running statements reaches zero are interrupted as if they had been
2444: ** running prior to the sqlite3_interrupt() call. ^New SQL statements
2445: ** that are started after the running statement count reaches zero are
2446: ** not effected by the sqlite3_interrupt().
2447: ** ^A call to sqlite3_interrupt(D) that occurs when there are no running
2448: ** SQL statements is a no-op and has no effect on SQL statements
2449: ** that are started after the sqlite3_interrupt() call returns.
2450: **
2451: ** If the database connection closes while [sqlite3_interrupt()]
2452: ** is running then bad things will likely happen.
2453: */
2454: SQLITE_API void sqlite3_interrupt(sqlite3*);
2455:
2456: /*
2457: ** CAPI3REF: Determine If An SQL Statement Is Complete
2458: **
2459: ** These routines are useful during command-line input to determine if the
2460: ** currently entered text seems to form a complete SQL statement or
2461: ** if additional input is needed before sending the text into
2462: ** SQLite for parsing. ^These routines return 1 if the input string
2463: ** appears to be a complete SQL statement. ^A statement is judged to be
2464: ** complete if it ends with a semicolon token and is not a prefix of a
2465: ** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within
2466: ** string literals or quoted identifier names or comments are not
2467: ** independent tokens (they are part of the token in which they are
2468: ** embedded) and thus do not count as a statement terminator. ^Whitespace
2469: ** and comments that follow the final semicolon are ignored.
2470: **
2471: ** ^These routines return 0 if the statement is incomplete. ^If a
2472: ** memory allocation fails, then SQLITE_NOMEM is returned.
2473: **
2474: ** ^These routines do not parse the SQL statements thus
2475: ** will not detect syntactically incorrect SQL.
2476: **
2477: ** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior
2478: ** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked
2479: ** automatically by sqlite3_complete16(). If that initialization fails,
2480: ** then the return value from sqlite3_complete16() will be non-zero
2481: ** regardless of whether or not the input SQL is complete.)^
2482: **
2483: ** The input to [sqlite3_complete()] must be a zero-terminated
2484: ** UTF-8 string.
2485: **
2486: ** The input to [sqlite3_complete16()] must be a zero-terminated
2487: ** UTF-16 string in native byte order.
2488: */
2489: SQLITE_API int sqlite3_complete(const char *sql);
2490: SQLITE_API int sqlite3_complete16(const void *sql);
2491:
2492: /*
2493: ** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors
2494: **
2495: ** ^This routine sets a callback function that might be invoked whenever
2496: ** an attempt is made to open a database table that another thread
2497: ** or process has locked.
2498: **
2499: ** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]
2500: ** is returned immediately upon encountering the lock. ^If the busy callback
2501: ** is not NULL, then the callback might be invoked with two arguments.
2502: **
2503: ** ^The first argument to the busy handler is a copy of the void* pointer which
2504: ** is the third argument to sqlite3_busy_handler(). ^The second argument to
2505: ** the busy handler callback is the number of times that the busy handler has
2506: ** been invoked for this locking event. ^If the
2507: ** busy callback returns 0, then no additional attempts are made to
2508: ** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned.
2509: ** ^If the callback returns non-zero, then another attempt
2510: ** is made to open the database for reading and the cycle repeats.
2511: **
2512: ** The presence of a busy handler does not guarantee that it will be invoked
2513: ** when there is lock contention. ^If SQLite determines that invoking the busy
2514: ** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY]
2515: ** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler.
2516: ** Consider a scenario where one process is holding a read lock that
2517: ** it is trying to promote to a reserved lock and
2518: ** a second process is holding a reserved lock that it is trying
2519: ** to promote to an exclusive lock. The first process cannot proceed
2520: ** because it is blocked by the second and the second process cannot
2521: ** proceed because it is blocked by the first. If both processes
2522: ** invoke the busy handlers, neither will make any progress. Therefore,
2523: ** SQLite returns [SQLITE_BUSY] for the first process, hoping that this
2524: ** will induce the first process to release its read lock and allow
2525: ** the second process to proceed.
2526: **
2527: ** ^The default busy callback is NULL.
2528: **
2529: ** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED]
2530: ** when SQLite is in the middle of a large transaction where all the
2531: ** changes will not fit into the in-memory cache. SQLite will
2532: ** already hold a RESERVED lock on the database file, but it needs
2533: ** to promote this lock to EXCLUSIVE so that it can spill cache
2534: ** pages into the database file without harm to concurrent
2535: ** readers. ^If it is unable to promote the lock, then the in-memory
2536: ** cache will be left in an inconsistent state and so the error
2537: ** code is promoted from the relatively benign [SQLITE_BUSY] to
2538: ** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion
2539: ** forces an automatic rollback of the changes. See the
2540: ** <a href="/cvstrac/wiki?p=CorruptionFollowingBusyError">
2541: ** CorruptionFollowingBusyError</a> wiki page for a discussion of why
2542: ** this is important.
2543: **
2544: ** ^(There can only be a single busy handler defined for each
2545: ** [database connection]. Setting a new busy handler clears any
2546: ** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()]
2547: ** will also set or clear the busy handler.
2548: **
2549: ** The busy callback should not take any actions which modify the
2550: ** database connection that invoked the busy handler. Any such actions
2551: ** result in undefined behavior.
2552: **
2553: ** A busy handler must not close the database connection
2554: ** or [prepared statement] that invoked the busy handler.
2555: */
2556: SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);
2557:
2558: /*
2559: ** CAPI3REF: Set A Busy Timeout
2560: **
2561: ** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps
2562: ** for a specified amount of time when a table is locked. ^The handler
2563: ** will sleep multiple times until at least "ms" milliseconds of sleeping
2564: ** have accumulated. ^After at least "ms" milliseconds of sleeping,
2565: ** the handler returns 0 which causes [sqlite3_step()] to return
2566: ** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED].
2567: **
2568: ** ^Calling this routine with an argument less than or equal to zero
2569: ** turns off all busy handlers.
2570: **
2571: ** ^(There can only be a single busy handler for a particular
2572: ** [database connection] any any given moment. If another busy handler
2573: ** was defined (using [sqlite3_busy_handler()]) prior to calling
2574: ** this routine, that other busy handler is cleared.)^
2575: */
2576: SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms);
2577:
2578: /*
2579: ** CAPI3REF: Convenience Routines For Running Queries
2580: **
2581: ** This is a legacy interface that is preserved for backwards compatibility.
2582: ** Use of this interface is not recommended.
2583: **
2584: ** Definition: A <b>result table</b> is memory data structure created by the
2585: ** [sqlite3_get_table()] interface. A result table records the
2586: ** complete query results from one or more queries.
2587: **
2588: ** The table conceptually has a number of rows and columns. But
2589: ** these numbers are not part of the result table itself. These
2590: ** numbers are obtained separately. Let N be the number of rows
2591: ** and M be the number of columns.
2592: **
2593: ** A result table is an array of pointers to zero-terminated UTF-8 strings.
2594: ** There are (N+1)*M elements in the array. The first M pointers point
2595: ** to zero-terminated strings that contain the names of the columns.
2596: ** The remaining entries all point to query results. NULL values result
2597: ** in NULL pointers. All other values are in their UTF-8 zero-terminated
2598: ** string representation as returned by [sqlite3_column_text()].
2599: **
2600: ** A result table might consist of one or more memory allocations.
2601: ** It is not safe to pass a result table directly to [sqlite3_free()].
2602: ** A result table should be deallocated using [sqlite3_free_table()].
2603: **
2604: ** ^(As an example of the result table format, suppose a query result
2605: ** is as follows:
2606: **
2607: ** <blockquote><pre>
2608: ** Name | Age
2609: ** -----------------------
2610: ** Alice | 43
2611: ** Bob | 28
2612: ** Cindy | 21
2613: ** </pre></blockquote>
2614: **
2615: ** There are two column (M==2) and three rows (N==3). Thus the
2616: ** result table has 8 entries. Suppose the result table is stored
2617: ** in an array names azResult. Then azResult holds this content:
2618: **
2619: ** <blockquote><pre>
2620: ** azResult[0] = "Name";
2621: ** azResult[1] = "Age";
2622: ** azResult[2] = "Alice";
2623: ** azResult[3] = "43";
2624: ** azResult[4] = "Bob";
2625: ** azResult[5] = "28";
2626: ** azResult[6] = "Cindy";
2627: ** azResult[7] = "21";
2628: ** </pre></blockquote>)^
2629: **
2630: ** ^The sqlite3_get_table() function evaluates one or more
2631: ** semicolon-separated SQL statements in the zero-terminated UTF-8
2632: ** string of its 2nd parameter and returns a result table to the
2633: ** pointer given in its 3rd parameter.
2634: **
2635: ** After the application has finished with the result from sqlite3_get_table(),
2636: ** it must pass the result table pointer to sqlite3_free_table() in order to
2637: ** release the memory that was malloced. Because of the way the
2638: ** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling
2639: ** function must not try to call [sqlite3_free()] directly. Only
2640: ** [sqlite3_free_table()] is able to release the memory properly and safely.
2641: **
2642: ** The sqlite3_get_table() interface is implemented as a wrapper around
2643: ** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access
2644: ** to any internal data structures of SQLite. It uses only the public
2645: ** interface defined here. As a consequence, errors that occur in the
2646: ** wrapper layer outside of the internal [sqlite3_exec()] call are not
2647: ** reflected in subsequent calls to [sqlite3_errcode()] or
2648: ** [sqlite3_errmsg()].
2649: */
2650: SQLITE_API int sqlite3_get_table(
2651: sqlite3 *db, /* An open database */
2652: const char *zSql, /* SQL to be evaluated */
2653: char ***pazResult, /* Results of the query */
2654: int *pnRow, /* Number of result rows written here */
2655: int *pnColumn, /* Number of result columns written here */
2656: char **pzErrmsg /* Error msg written here */
2657: );
2658: SQLITE_API void sqlite3_free_table(char **result);
2659:
2660: /*
2661: ** CAPI3REF: Formatted String Printing Functions
2662: **
2663: ** These routines are work-alikes of the "printf()" family of functions
2664: ** from the standard C library.
2665: **
2666: ** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their
2667: ** results into memory obtained from [sqlite3_malloc()].
2668: ** The strings returned by these two routines should be
2669: ** released by [sqlite3_free()]. ^Both routines return a
2670: ** NULL pointer if [sqlite3_malloc()] is unable to allocate enough
2671: ** memory to hold the resulting string.
2672: **
2673: ** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from
2674: ** the standard C library. The result is written into the
2675: ** buffer supplied as the second parameter whose size is given by
2676: ** the first parameter. Note that the order of the
2677: ** first two parameters is reversed from snprintf().)^ This is an
2678: ** historical accident that cannot be fixed without breaking
2679: ** backwards compatibility. ^(Note also that sqlite3_snprintf()
2680: ** returns a pointer to its buffer instead of the number of
2681: ** characters actually written into the buffer.)^ We admit that
2682: ** the number of characters written would be a more useful return
2683: ** value but we cannot change the implementation of sqlite3_snprintf()
2684: ** now without breaking compatibility.
2685: **
2686: ** ^As long as the buffer size is greater than zero, sqlite3_snprintf()
2687: ** guarantees that the buffer is always zero-terminated. ^The first
2688: ** parameter "n" is the total size of the buffer, including space for
2689: ** the zero terminator. So the longest string that can be completely
2690: ** written will be n-1 characters.
2691: **
2692: ** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf().
2693: **
2694: ** These routines all implement some additional formatting
2695: ** options that are useful for constructing SQL statements.
2696: ** All of the usual printf() formatting options apply. In addition, there
2697: ** is are "%q", "%Q", and "%z" options.
2698: **
2699: ** ^(The %q option works like %s in that it substitutes a nul-terminated
2700: ** string from the argument list. But %q also doubles every '\'' character.
2701: ** %q is designed for use inside a string literal.)^ By doubling each '\''
2702: ** character it escapes that character and allows it to be inserted into
2703: ** the string.
2704: **
2705: ** For example, assume the string variable zText contains text as follows:
2706: **
2707: ** <blockquote><pre>
2708: ** char *zText = "It's a happy day!";
2709: ** </pre></blockquote>
2710: **
2711: ** One can use this text in an SQL statement as follows:
2712: **
2713: ** <blockquote><pre>
2714: ** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
2715: ** sqlite3_exec(db, zSQL, 0, 0, 0);
2716: ** sqlite3_free(zSQL);
2717: ** </pre></blockquote>
2718: **
2719: ** Because the %q format string is used, the '\'' character in zText
2720: ** is escaped and the SQL generated is as follows:
2721: **
2722: ** <blockquote><pre>
2723: ** INSERT INTO table1 VALUES('It''s a happy day!')
2724: ** </pre></blockquote>
2725: **
2726: ** This is correct. Had we used %s instead of %q, the generated SQL
2727: ** would have looked like this:
2728: **
2729: ** <blockquote><pre>
2730: ** INSERT INTO table1 VALUES('It's a happy day!');
2731: ** </pre></blockquote>
2732: **
2733: ** This second example is an SQL syntax error. As a general rule you should
2734: ** always use %q instead of %s when inserting text into a string literal.
2735: **
2736: ** ^(The %Q option works like %q except it also adds single quotes around
2737: ** the outside of the total string. Additionally, if the parameter in the
2738: ** argument list is a NULL pointer, %Q substitutes the text "NULL" (without
2739: ** single quotes).)^ So, for example, one could say:
2740: **
2741: ** <blockquote><pre>
2742: ** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
2743: ** sqlite3_exec(db, zSQL, 0, 0, 0);
2744: ** sqlite3_free(zSQL);
2745: ** </pre></blockquote>
2746: **
2747: ** The code above will render a correct SQL statement in the zSQL
2748: ** variable even if the zText variable is a NULL pointer.
2749: **
2750: ** ^(The "%z" formatting option works like "%s" but with the
2751: ** addition that after the string has been read and copied into
2752: ** the result, [sqlite3_free()] is called on the input string.)^
2753: */
2754: SQLITE_API char *sqlite3_mprintf(const char*,...);
2755: SQLITE_API char *sqlite3_vmprintf(const char*, va_list);
2756: SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...);
2757: SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list);
2758:
2759: /*
2760: ** CAPI3REF: Memory Allocation Subsystem
2761: **
2762: ** The SQLite core uses these three routines for all of its own
2763: ** internal memory allocation needs. "Core" in the previous sentence
2764: ** does not include operating-system specific VFS implementation. The
2765: ** Windows VFS uses native malloc() and free() for some operations.
2766: **
2767: ** ^The sqlite3_malloc() routine returns a pointer to a block
2768: ** of memory at least N bytes in length, where N is the parameter.
2769: ** ^If sqlite3_malloc() is unable to obtain sufficient free
2770: ** memory, it returns a NULL pointer. ^If the parameter N to
2771: ** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns
2772: ** a NULL pointer.
2773: **
2774: ** ^Calling sqlite3_free() with a pointer previously returned
2775: ** by sqlite3_malloc() or sqlite3_realloc() releases that memory so
2776: ** that it might be reused. ^The sqlite3_free() routine is
2777: ** a no-op if is called with a NULL pointer. Passing a NULL pointer
2778: ** to sqlite3_free() is harmless. After being freed, memory
2779: ** should neither be read nor written. Even reading previously freed
2780: ** memory might result in a segmentation fault or other severe error.
2781: ** Memory corruption, a segmentation fault, or other severe error
2782: ** might result if sqlite3_free() is called with a non-NULL pointer that
2783: ** was not obtained from sqlite3_malloc() or sqlite3_realloc().
2784: **
2785: ** ^(The sqlite3_realloc() interface attempts to resize a
2786: ** prior memory allocation to be at least N bytes, where N is the
2787: ** second parameter. The memory allocation to be resized is the first
2788: ** parameter.)^ ^ If the first parameter to sqlite3_realloc()
2789: ** is a NULL pointer then its behavior is identical to calling
2790: ** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc().
2791: ** ^If the second parameter to sqlite3_realloc() is zero or
2792: ** negative then the behavior is exactly the same as calling
2793: ** sqlite3_free(P) where P is the first parameter to sqlite3_realloc().
2794: ** ^sqlite3_realloc() returns a pointer to a memory allocation
2795: ** of at least N bytes in size or NULL if sufficient memory is unavailable.
2796: ** ^If M is the size of the prior allocation, then min(N,M) bytes
2797: ** of the prior allocation are copied into the beginning of buffer returned
2798: ** by sqlite3_realloc() and the prior allocation is freed.
2799: ** ^If sqlite3_realloc() returns NULL, then the prior allocation
2800: ** is not freed.
2801: **
2802: ** ^The memory returned by sqlite3_malloc() and sqlite3_realloc()
2803: ** is always aligned to at least an 8 byte boundary, or to a
2804: ** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time
2805: ** option is used.
2806: **
2807: ** In SQLite version 3.5.0 and 3.5.1, it was possible to define
2808: ** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in
2809: ** implementation of these routines to be omitted. That capability
2810: ** is no longer provided. Only built-in memory allocators can be used.
2811: **
1.2.2.1 ! misho 2812: ** Prior to SQLite version 3.7.10, the Windows OS interface layer called
1.2 misho 2813: ** the system malloc() and free() directly when converting
2814: ** filenames between the UTF-8 encoding used by SQLite
2815: ** and whatever filename encoding is used by the particular Windows
1.2.2.1 ! misho 2816: ** installation. Memory allocation errors were detected, but
! 2817: ** they were reported back as [SQLITE_CANTOPEN] or
1.2 misho 2818: ** [SQLITE_IOERR] rather than [SQLITE_NOMEM].
2819: **
2820: ** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()]
2821: ** must be either NULL or else pointers obtained from a prior
2822: ** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have
2823: ** not yet been released.
2824: **
2825: ** The application must not read or write any part of
2826: ** a block of memory after it has been released using
2827: ** [sqlite3_free()] or [sqlite3_realloc()].
2828: */
2829: SQLITE_API void *sqlite3_malloc(int);
2830: SQLITE_API void *sqlite3_realloc(void*, int);
2831: SQLITE_API void sqlite3_free(void*);
2832:
2833: /*
2834: ** CAPI3REF: Memory Allocator Statistics
2835: **
2836: ** SQLite provides these two interfaces for reporting on the status
2837: ** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()]
2838: ** routines, which form the built-in memory allocation subsystem.
2839: **
2840: ** ^The [sqlite3_memory_used()] routine returns the number of bytes
2841: ** of memory currently outstanding (malloced but not freed).
2842: ** ^The [sqlite3_memory_highwater()] routine returns the maximum
2843: ** value of [sqlite3_memory_used()] since the high-water mark
2844: ** was last reset. ^The values returned by [sqlite3_memory_used()] and
2845: ** [sqlite3_memory_highwater()] include any overhead
2846: ** added by SQLite in its implementation of [sqlite3_malloc()],
2847: ** but not overhead added by the any underlying system library
2848: ** routines that [sqlite3_malloc()] may call.
2849: **
2850: ** ^The memory high-water mark is reset to the current value of
2851: ** [sqlite3_memory_used()] if and only if the parameter to
2852: ** [sqlite3_memory_highwater()] is true. ^The value returned
2853: ** by [sqlite3_memory_highwater(1)] is the high-water mark
2854: ** prior to the reset.
2855: */
2856: SQLITE_API sqlite3_int64 sqlite3_memory_used(void);
2857: SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag);
2858:
2859: /*
2860: ** CAPI3REF: Pseudo-Random Number Generator
2861: **
2862: ** SQLite contains a high-quality pseudo-random number generator (PRNG) used to
2863: ** select random [ROWID | ROWIDs] when inserting new records into a table that
2864: ** already uses the largest possible [ROWID]. The PRNG is also used for
2865: ** the build-in random() and randomblob() SQL functions. This interface allows
2866: ** applications to access the same PRNG for other purposes.
2867: **
2868: ** ^A call to this routine stores N bytes of randomness into buffer P.
2869: **
2870: ** ^The first time this routine is invoked (either internally or by
2871: ** the application) the PRNG is seeded using randomness obtained
2872: ** from the xRandomness method of the default [sqlite3_vfs] object.
2873: ** ^On all subsequent invocations, the pseudo-randomness is generated
2874: ** internally and without recourse to the [sqlite3_vfs] xRandomness
2875: ** method.
2876: */
2877: SQLITE_API void sqlite3_randomness(int N, void *P);
2878:
2879: /*
2880: ** CAPI3REF: Compile-Time Authorization Callbacks
2881: **
2882: ** ^This routine registers an authorizer callback with a particular
2883: ** [database connection], supplied in the first argument.
2884: ** ^The authorizer callback is invoked as SQL statements are being compiled
2885: ** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()],
2886: ** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various
2887: ** points during the compilation process, as logic is being created
2888: ** to perform various actions, the authorizer callback is invoked to
2889: ** see if those actions are allowed. ^The authorizer callback should
2890: ** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the
2891: ** specific action but allow the SQL statement to continue to be
2892: ** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be
2893: ** rejected with an error. ^If the authorizer callback returns
2894: ** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY]
2895: ** then the [sqlite3_prepare_v2()] or equivalent call that triggered
2896: ** the authorizer will fail with an error message.
2897: **
2898: ** When the callback returns [SQLITE_OK], that means the operation
2899: ** requested is ok. ^When the callback returns [SQLITE_DENY], the
2900: ** [sqlite3_prepare_v2()] or equivalent call that triggered the
2901: ** authorizer will fail with an error message explaining that
2902: ** access is denied.
2903: **
2904: ** ^The first parameter to the authorizer callback is a copy of the third
2905: ** parameter to the sqlite3_set_authorizer() interface. ^The second parameter
2906: ** to the callback is an integer [SQLITE_COPY | action code] that specifies
2907: ** the particular action to be authorized. ^The third through sixth parameters
2908: ** to the callback are zero-terminated strings that contain additional
2909: ** details about the action to be authorized.
2910: **
2911: ** ^If the action code is [SQLITE_READ]
2912: ** and the callback returns [SQLITE_IGNORE] then the
2913: ** [prepared statement] statement is constructed to substitute
2914: ** a NULL value in place of the table column that would have
2915: ** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE]
2916: ** return can be used to deny an untrusted user access to individual
2917: ** columns of a table.
2918: ** ^If the action code is [SQLITE_DELETE] and the callback returns
2919: ** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the
2920: ** [truncate optimization] is disabled and all rows are deleted individually.
2921: **
2922: ** An authorizer is used when [sqlite3_prepare | preparing]
2923: ** SQL statements from an untrusted source, to ensure that the SQL statements
2924: ** do not try to access data they are not allowed to see, or that they do not
2925: ** try to execute malicious statements that damage the database. For
2926: ** example, an application may allow a user to enter arbitrary
2927: ** SQL queries for evaluation by a database. But the application does
2928: ** not want the user to be able to make arbitrary changes to the
2929: ** database. An authorizer could then be put in place while the
2930: ** user-entered SQL is being [sqlite3_prepare | prepared] that
2931: ** disallows everything except [SELECT] statements.
2932: **
2933: ** Applications that need to process SQL from untrusted sources
2934: ** might also consider lowering resource limits using [sqlite3_limit()]
2935: ** and limiting database size using the [max_page_count] [PRAGMA]
2936: ** in addition to using an authorizer.
2937: **
2938: ** ^(Only a single authorizer can be in place on a database connection
2939: ** at a time. Each call to sqlite3_set_authorizer overrides the
2940: ** previous call.)^ ^Disable the authorizer by installing a NULL callback.
2941: ** The authorizer is disabled by default.
2942: **
2943: ** The authorizer callback must not do anything that will modify
2944: ** the database connection that invoked the authorizer callback.
2945: ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
2946: ** database connections for the meaning of "modify" in this paragraph.
2947: **
2948: ** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the
2949: ** statement might be re-prepared during [sqlite3_step()] due to a
2950: ** schema change. Hence, the application should ensure that the
2951: ** correct authorizer callback remains in place during the [sqlite3_step()].
2952: **
2953: ** ^Note that the authorizer callback is invoked only during
2954: ** [sqlite3_prepare()] or its variants. Authorization is not
2955: ** performed during statement evaluation in [sqlite3_step()], unless
2956: ** as stated in the previous paragraph, sqlite3_step() invokes
2957: ** sqlite3_prepare_v2() to reprepare a statement after a schema change.
2958: */
2959: SQLITE_API int sqlite3_set_authorizer(
2960: sqlite3*,
2961: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
2962: void *pUserData
2963: );
2964:
2965: /*
2966: ** CAPI3REF: Authorizer Return Codes
2967: **
2968: ** The [sqlite3_set_authorizer | authorizer callback function] must
2969: ** return either [SQLITE_OK] or one of these two constants in order
2970: ** to signal SQLite whether or not the action is permitted. See the
2971: ** [sqlite3_set_authorizer | authorizer documentation] for additional
2972: ** information.
2973: **
2974: ** Note that SQLITE_IGNORE is also used as a [SQLITE_ROLLBACK | return code]
2975: ** from the [sqlite3_vtab_on_conflict()] interface.
2976: */
2977: #define SQLITE_DENY 1 /* Abort the SQL statement with an error */
2978: #define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */
2979:
2980: /*
2981: ** CAPI3REF: Authorizer Action Codes
2982: **
2983: ** The [sqlite3_set_authorizer()] interface registers a callback function
2984: ** that is invoked to authorize certain SQL statement actions. The
2985: ** second parameter to the callback is an integer code that specifies
2986: ** what action is being authorized. These are the integer action codes that
2987: ** the authorizer callback may be passed.
2988: **
2989: ** These action code values signify what kind of operation is to be
2990: ** authorized. The 3rd and 4th parameters to the authorization
2991: ** callback function will be parameters or NULL depending on which of these
2992: ** codes is used as the second parameter. ^(The 5th parameter to the
2993: ** authorizer callback is the name of the database ("main", "temp",
2994: ** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback
2995: ** is the name of the inner-most trigger or view that is responsible for
2996: ** the access attempt or NULL if this access attempt is directly from
2997: ** top-level SQL code.
2998: */
2999: /******************************************* 3rd ************ 4th ***********/
3000: #define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */
3001: #define SQLITE_CREATE_TABLE 2 /* Table Name NULL */
3002: #define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */
3003: #define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */
3004: #define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */
3005: #define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */
3006: #define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */
3007: #define SQLITE_CREATE_VIEW 8 /* View Name NULL */
3008: #define SQLITE_DELETE 9 /* Table Name NULL */
3009: #define SQLITE_DROP_INDEX 10 /* Index Name Table Name */
3010: #define SQLITE_DROP_TABLE 11 /* Table Name NULL */
3011: #define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */
3012: #define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */
3013: #define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */
3014: #define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */
3015: #define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */
3016: #define SQLITE_DROP_VIEW 17 /* View Name NULL */
3017: #define SQLITE_INSERT 18 /* Table Name NULL */
3018: #define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */
3019: #define SQLITE_READ 20 /* Table Name Column Name */
3020: #define SQLITE_SELECT 21 /* NULL NULL */
3021: #define SQLITE_TRANSACTION 22 /* Operation NULL */
3022: #define SQLITE_UPDATE 23 /* Table Name Column Name */
3023: #define SQLITE_ATTACH 24 /* Filename NULL */
3024: #define SQLITE_DETACH 25 /* Database Name NULL */
3025: #define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */
3026: #define SQLITE_REINDEX 27 /* Index Name NULL */
3027: #define SQLITE_ANALYZE 28 /* Table Name NULL */
3028: #define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */
3029: #define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */
3030: #define SQLITE_FUNCTION 31 /* NULL Function Name */
3031: #define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */
3032: #define SQLITE_COPY 0 /* No longer used */
3033:
3034: /*
3035: ** CAPI3REF: Tracing And Profiling Functions
3036: **
3037: ** These routines register callback functions that can be used for
3038: ** tracing and profiling the execution of SQL statements.
3039: **
3040: ** ^The callback function registered by sqlite3_trace() is invoked at
3041: ** various times when an SQL statement is being run by [sqlite3_step()].
3042: ** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the
3043: ** SQL statement text as the statement first begins executing.
3044: ** ^(Additional sqlite3_trace() callbacks might occur
3045: ** as each triggered subprogram is entered. The callbacks for triggers
3046: ** contain a UTF-8 SQL comment that identifies the trigger.)^
3047: **
3048: ** ^The callback function registered by sqlite3_profile() is invoked
3049: ** as each SQL statement finishes. ^The profile callback contains
3050: ** the original statement text and an estimate of wall-clock time
3051: ** of how long that statement took to run. ^The profile callback
3052: ** time is in units of nanoseconds, however the current implementation
3053: ** is only capable of millisecond resolution so the six least significant
3054: ** digits in the time are meaningless. Future versions of SQLite
3055: ** might provide greater resolution on the profiler callback. The
3056: ** sqlite3_profile() function is considered experimental and is
3057: ** subject to change in future versions of SQLite.
3058: */
3059: SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*);
3060: SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*,
3061: void(*xProfile)(void*,const char*,sqlite3_uint64), void*);
3062:
3063: /*
3064: ** CAPI3REF: Query Progress Callbacks
3065: **
3066: ** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback
3067: ** function X to be invoked periodically during long running calls to
3068: ** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for
3069: ** database connection D. An example use for this
3070: ** interface is to keep a GUI updated during a large query.
3071: **
3072: ** ^The parameter P is passed through as the only parameter to the
3073: ** callback function X. ^The parameter N is the number of
3074: ** [virtual machine instructions] that are evaluated between successive
3075: ** invocations of the callback X.
3076: **
3077: ** ^Only a single progress handler may be defined at one time per
3078: ** [database connection]; setting a new progress handler cancels the
3079: ** old one. ^Setting parameter X to NULL disables the progress handler.
3080: ** ^The progress handler is also disabled by setting N to a value less
3081: ** than 1.
3082: **
3083: ** ^If the progress callback returns non-zero, the operation is
3084: ** interrupted. This feature can be used to implement a
3085: ** "Cancel" button on a GUI progress dialog box.
3086: **
3087: ** The progress handler callback must not do anything that will modify
3088: ** the database connection that invoked the progress handler.
3089: ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
3090: ** database connections for the meaning of "modify" in this paragraph.
3091: **
3092: */
3093: SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);
3094:
3095: /*
3096: ** CAPI3REF: Opening A New Database Connection
3097: **
3098: ** ^These routines open an SQLite database file as specified by the
3099: ** filename argument. ^The filename argument is interpreted as UTF-8 for
3100: ** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte
3101: ** order for sqlite3_open16(). ^(A [database connection] handle is usually
3102: ** returned in *ppDb, even if an error occurs. The only exception is that
3103: ** if SQLite is unable to allocate memory to hold the [sqlite3] object,
3104: ** a NULL will be written into *ppDb instead of a pointer to the [sqlite3]
3105: ** object.)^ ^(If the database is opened (and/or created) successfully, then
3106: ** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The
3107: ** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain
3108: ** an English language description of the error following a failure of any
3109: ** of the sqlite3_open() routines.
3110: **
3111: ** ^The default encoding for the database will be UTF-8 if
3112: ** sqlite3_open() or sqlite3_open_v2() is called and
3113: ** UTF-16 in the native byte order if sqlite3_open16() is used.
3114: **
3115: ** Whether or not an error occurs when it is opened, resources
3116: ** associated with the [database connection] handle should be released by
3117: ** passing it to [sqlite3_close()] when it is no longer required.
3118: **
3119: ** The sqlite3_open_v2() interface works like sqlite3_open()
3120: ** except that it accepts two additional parameters for additional control
3121: ** over the new database connection. ^(The flags parameter to
3122: ** sqlite3_open_v2() can take one of
3123: ** the following three values, optionally combined with the
3124: ** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE],
3125: ** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^
3126: **
3127: ** <dl>
3128: ** ^(<dt>[SQLITE_OPEN_READONLY]</dt>
3129: ** <dd>The database is opened in read-only mode. If the database does not
3130: ** already exist, an error is returned.</dd>)^
3131: **
3132: ** ^(<dt>[SQLITE_OPEN_READWRITE]</dt>
3133: ** <dd>The database is opened for reading and writing if possible, or reading
3134: ** only if the file is write protected by the operating system. In either
3135: ** case the database must already exist, otherwise an error is returned.</dd>)^
3136: **
3137: ** ^(<dt>[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]</dt>
3138: ** <dd>The database is opened for reading and writing, and is created if
3139: ** it does not already exist. This is the behavior that is always used for
3140: ** sqlite3_open() and sqlite3_open16().</dd>)^
3141: ** </dl>
3142: **
3143: ** If the 3rd parameter to sqlite3_open_v2() is not one of the
3144: ** combinations shown above optionally combined with other
3145: ** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits]
3146: ** then the behavior is undefined.
3147: **
3148: ** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection
3149: ** opens in the multi-thread [threading mode] as long as the single-thread
3150: ** mode has not been set at compile-time or start-time. ^If the
3151: ** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens
3152: ** in the serialized [threading mode] unless single-thread was
3153: ** previously selected at compile-time or start-time.
3154: ** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be
3155: ** eligible to use [shared cache mode], regardless of whether or not shared
3156: ** cache is enabled using [sqlite3_enable_shared_cache()]. ^The
3157: ** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not
3158: ** participate in [shared cache mode] even if it is enabled.
3159: **
3160: ** ^The fourth parameter to sqlite3_open_v2() is the name of the
3161: ** [sqlite3_vfs] object that defines the operating system interface that
3162: ** the new database connection should use. ^If the fourth parameter is
3163: ** a NULL pointer then the default [sqlite3_vfs] object is used.
3164: **
3165: ** ^If the filename is ":memory:", then a private, temporary in-memory database
3166: ** is created for the connection. ^This in-memory database will vanish when
3167: ** the database connection is closed. Future versions of SQLite might
3168: ** make use of additional special filenames that begin with the ":" character.
3169: ** It is recommended that when a database filename actually does begin with
3170: ** a ":" character you should prefix the filename with a pathname such as
3171: ** "./" to avoid ambiguity.
3172: **
3173: ** ^If the filename is an empty string, then a private, temporary
3174: ** on-disk database will be created. ^This private database will be
3175: ** automatically deleted as soon as the database connection is closed.
3176: **
3177: ** [[URI filenames in sqlite3_open()]] <h3>URI Filenames</h3>
3178: **
3179: ** ^If [URI filename] interpretation is enabled, and the filename argument
3180: ** begins with "file:", then the filename is interpreted as a URI. ^URI
3181: ** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is
3182: ** set in the fourth argument to sqlite3_open_v2(), or if it has
3183: ** been enabled globally using the [SQLITE_CONFIG_URI] option with the
3184: ** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option.
3185: ** As of SQLite version 3.7.7, URI filename interpretation is turned off
3186: ** by default, but future releases of SQLite might enable URI filename
3187: ** interpretation by default. See "[URI filenames]" for additional
3188: ** information.
3189: **
3190: ** URI filenames are parsed according to RFC 3986. ^If the URI contains an
3191: ** authority, then it must be either an empty string or the string
3192: ** "localhost". ^If the authority is not an empty string or "localhost", an
3193: ** error is returned to the caller. ^The fragment component of a URI, if
3194: ** present, is ignored.
3195: **
3196: ** ^SQLite uses the path component of the URI as the name of the disk file
3197: ** which contains the database. ^If the path begins with a '/' character,
3198: ** then it is interpreted as an absolute path. ^If the path does not begin
3199: ** with a '/' (meaning that the authority section is omitted from the URI)
3200: ** then the path is interpreted as a relative path.
3201: ** ^On windows, the first component of an absolute path
3202: ** is a drive specification (e.g. "C:").
3203: **
3204: ** [[core URI query parameters]]
3205: ** The query component of a URI may contain parameters that are interpreted
3206: ** either by SQLite itself, or by a [VFS | custom VFS implementation].
3207: ** SQLite interprets the following three query parameters:
3208: **
3209: ** <ul>
3210: ** <li> <b>vfs</b>: ^The "vfs" parameter may be used to specify the name of
3211: ** a VFS object that provides the operating system interface that should
3212: ** be used to access the database file on disk. ^If this option is set to
3213: ** an empty string the default VFS object is used. ^Specifying an unknown
3214: ** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is
3215: ** present, then the VFS specified by the option takes precedence over
3216: ** the value passed as the fourth parameter to sqlite3_open_v2().
3217: **
1.2.2.1 ! misho 3218: ** <li> <b>mode</b>: ^(The mode parameter may be set to either "ro", "rw",
! 3219: ** "rwc", or "memory". Attempting to set it to any other value is
! 3220: ** an error)^.
1.2 misho 3221: ** ^If "ro" is specified, then the database is opened for read-only
3222: ** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the
1.2.2.1 ! misho 3223: ** third argument to sqlite3_open_v2(). ^If the mode option is set to
1.2 misho 3224: ** "rw", then the database is opened for read-write (but not create)
3225: ** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had
3226: ** been set. ^Value "rwc" is equivalent to setting both
1.2.2.1 ! misho 3227: ** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is
! 3228: ** set to "memory" then a pure [in-memory database] that never reads
! 3229: ** or writes from disk is used. ^It is an error to specify a value for
! 3230: ** the mode parameter that is less restrictive than that specified by
! 3231: ** the flags passed in the third parameter to sqlite3_open_v2().
1.2 misho 3232: **
3233: ** <li> <b>cache</b>: ^The cache parameter may be set to either "shared" or
3234: ** "private". ^Setting it to "shared" is equivalent to setting the
3235: ** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to
3236: ** sqlite3_open_v2(). ^Setting the cache parameter to "private" is
3237: ** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit.
3238: ** ^If sqlite3_open_v2() is used and the "cache" parameter is present in
3239: ** a URI filename, its value overrides any behaviour requested by setting
3240: ** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag.
3241: ** </ul>
3242: **
3243: ** ^Specifying an unknown parameter in the query component of a URI is not an
3244: ** error. Future versions of SQLite might understand additional query
3245: ** parameters. See "[query parameters with special meaning to SQLite]" for
3246: ** additional information.
3247: **
3248: ** [[URI filename examples]] <h3>URI filename examples</h3>
3249: **
3250: ** <table border="1" align=center cellpadding=5>
3251: ** <tr><th> URI filenames <th> Results
3252: ** <tr><td> file:data.db <td>
3253: ** Open the file "data.db" in the current directory.
3254: ** <tr><td> file:/home/fred/data.db<br>
3255: ** file:///home/fred/data.db <br>
3256: ** file://localhost/home/fred/data.db <br> <td>
3257: ** Open the database file "/home/fred/data.db".
3258: ** <tr><td> file://darkstar/home/fred/data.db <td>
3259: ** An error. "darkstar" is not a recognized authority.
3260: ** <tr><td style="white-space:nowrap">
3261: ** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db
3262: ** <td> Windows only: Open the file "data.db" on fred's desktop on drive
3263: ** C:. Note that the %20 escaping in this example is not strictly
3264: ** necessary - space characters can be used literally
3265: ** in URI filenames.
3266: ** <tr><td> file:data.db?mode=ro&cache=private <td>
3267: ** Open file "data.db" in the current directory for read-only access.
3268: ** Regardless of whether or not shared-cache mode is enabled by
3269: ** default, use a private cache.
3270: ** <tr><td> file:/home/fred/data.db?vfs=unix-nolock <td>
3271: ** Open file "/home/fred/data.db". Use the special VFS "unix-nolock".
3272: ** <tr><td> file:data.db?mode=readonly <td>
3273: ** An error. "readonly" is not a valid option for the "mode" parameter.
3274: ** </table>
3275: **
3276: ** ^URI hexadecimal escape sequences (%HH) are supported within the path and
3277: ** query components of a URI. A hexadecimal escape sequence consists of a
3278: ** percent sign - "%" - followed by exactly two hexadecimal digits
3279: ** specifying an octet value. ^Before the path or query components of a
3280: ** URI filename are interpreted, they are encoded using UTF-8 and all
3281: ** hexadecimal escape sequences replaced by a single byte containing the
3282: ** corresponding octet. If this process generates an invalid UTF-8 encoding,
3283: ** the results are undefined.
3284: **
3285: ** <b>Note to Windows users:</b> The encoding used for the filename argument
3286: ** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever
3287: ** codepage is currently defined. Filenames containing international
3288: ** characters must be converted to UTF-8 prior to passing them into
3289: ** sqlite3_open() or sqlite3_open_v2().
1.2.2.1 ! misho 3290: **
! 3291: ** <b>Note to Windows Runtime users:</b> The temporary directory must be set
! 3292: ** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various
! 3293: ** features that require the use of temporary files may fail.
! 3294: **
! 3295: ** See also: [sqlite3_temp_directory]
1.2 misho 3296: */
3297: SQLITE_API int sqlite3_open(
3298: const char *filename, /* Database filename (UTF-8) */
3299: sqlite3 **ppDb /* OUT: SQLite db handle */
3300: );
3301: SQLITE_API int sqlite3_open16(
3302: const void *filename, /* Database filename (UTF-16) */
3303: sqlite3 **ppDb /* OUT: SQLite db handle */
3304: );
3305: SQLITE_API int sqlite3_open_v2(
3306: const char *filename, /* Database filename (UTF-8) */
3307: sqlite3 **ppDb, /* OUT: SQLite db handle */
3308: int flags, /* Flags */
3309: const char *zVfs /* Name of VFS module to use */
3310: );
3311:
3312: /*
3313: ** CAPI3REF: Obtain Values For URI Parameters
3314: **
3315: ** These are utility routines, useful to VFS implementations, that check
3316: ** to see if a database file was a URI that contained a specific query
3317: ** parameter, and if so obtains the value of that query parameter.
3318: **
3319: ** If F is the database filename pointer passed into the xOpen() method of
3320: ** a VFS implementation when the flags parameter to xOpen() has one or
3321: ** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and
3322: ** P is the name of the query parameter, then
3323: ** sqlite3_uri_parameter(F,P) returns the value of the P
3324: ** parameter if it exists or a NULL pointer if P does not appear as a
3325: ** query parameter on F. If P is a query parameter of F
3326: ** has no explicit value, then sqlite3_uri_parameter(F,P) returns
3327: ** a pointer to an empty string.
3328: **
3329: ** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean
3330: ** parameter and returns true (1) or false (0) according to the value
1.2.2.1 ! misho 3331: ** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the
! 3332: ** value of query parameter P is one of "yes", "true", or "on" in any
! 3333: ** case or if the value begins with a non-zero number. The
! 3334: ** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of
! 3335: ** query parameter P is one of "no", "false", or "off" in any case or
! 3336: ** if the value begins with a numeric zero. If P is not a query
! 3337: ** parameter on F or if the value of P is does not match any of the
! 3338: ** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0).
1.2 misho 3339: **
3340: ** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a
3341: ** 64-bit signed integer and returns that integer, or D if P does not
3342: ** exist. If the value of P is something other than an integer, then
3343: ** zero is returned.
3344: **
3345: ** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and
3346: ** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and
3347: ** is not a database file pathname pointer that SQLite passed into the xOpen
3348: ** VFS method, then the behavior of this routine is undefined and probably
3349: ** undesirable.
3350: */
3351: SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam);
3352: SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault);
3353: SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64);
3354:
3355:
3356: /*
3357: ** CAPI3REF: Error Codes And Messages
3358: **
3359: ** ^The sqlite3_errcode() interface returns the numeric [result code] or
3360: ** [extended result code] for the most recent failed sqlite3_* API call
3361: ** associated with a [database connection]. If a prior API call failed
3362: ** but the most recent API call succeeded, the return value from
3363: ** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode()
3364: ** interface is the same except that it always returns the
3365: ** [extended result code] even when extended result codes are
3366: ** disabled.
3367: **
3368: ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
3369: ** text that describes the error, as either UTF-8 or UTF-16 respectively.
3370: ** ^(Memory to hold the error message string is managed internally.
3371: ** The application does not need to worry about freeing the result.
3372: ** However, the error string might be overwritten or deallocated by
3373: ** subsequent calls to other SQLite interface functions.)^
3374: **
1.2.2.1 ! misho 3375: ** ^The sqlite3_errstr() interface returns the English-language text
! 3376: ** that describes the [result code], as UTF-8.
! 3377: ** ^(Memory to hold the error message string is managed internally
! 3378: ** and must not be freed by the application)^.
! 3379: **
1.2 misho 3380: ** When the serialized [threading mode] is in use, it might be the
3381: ** case that a second error occurs on a separate thread in between
3382: ** the time of the first error and the call to these interfaces.
3383: ** When that happens, the second error will be reported since these
3384: ** interfaces always report the most recent result. To avoid
3385: ** this, each thread can obtain exclusive use of the [database connection] D
3386: ** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning
3387: ** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after
3388: ** all calls to the interfaces listed here are completed.
3389: **
3390: ** If an interface fails with SQLITE_MISUSE, that means the interface
3391: ** was invoked incorrectly by the application. In that case, the
3392: ** error code and message may or may not be set.
3393: */
3394: SQLITE_API int sqlite3_errcode(sqlite3 *db);
3395: SQLITE_API int sqlite3_extended_errcode(sqlite3 *db);
3396: SQLITE_API const char *sqlite3_errmsg(sqlite3*);
3397: SQLITE_API const void *sqlite3_errmsg16(sqlite3*);
1.2.2.1 ! misho 3398: SQLITE_API const char *sqlite3_errstr(int);
1.2 misho 3399:
3400: /*
3401: ** CAPI3REF: SQL Statement Object
3402: ** KEYWORDS: {prepared statement} {prepared statements}
3403: **
3404: ** An instance of this object represents a single SQL statement.
3405: ** This object is variously known as a "prepared statement" or a
3406: ** "compiled SQL statement" or simply as a "statement".
3407: **
3408: ** The life of a statement object goes something like this:
3409: **
3410: ** <ol>
3411: ** <li> Create the object using [sqlite3_prepare_v2()] or a related
3412: ** function.
3413: ** <li> Bind values to [host parameters] using the sqlite3_bind_*()
3414: ** interfaces.
3415: ** <li> Run the SQL by calling [sqlite3_step()] one or more times.
3416: ** <li> Reset the statement using [sqlite3_reset()] then go back
3417: ** to step 2. Do this zero or more times.
3418: ** <li> Destroy the object using [sqlite3_finalize()].
3419: ** </ol>
3420: **
3421: ** Refer to documentation on individual methods above for additional
3422: ** information.
3423: */
3424: typedef struct sqlite3_stmt sqlite3_stmt;
3425:
3426: /*
3427: ** CAPI3REF: Run-time Limits
3428: **
3429: ** ^(This interface allows the size of various constructs to be limited
3430: ** on a connection by connection basis. The first parameter is the
3431: ** [database connection] whose limit is to be set or queried. The
3432: ** second parameter is one of the [limit categories] that define a
3433: ** class of constructs to be size limited. The third parameter is the
3434: ** new limit for that construct.)^
3435: **
3436: ** ^If the new limit is a negative number, the limit is unchanged.
3437: ** ^(For each limit category SQLITE_LIMIT_<i>NAME</i> there is a
3438: ** [limits | hard upper bound]
3439: ** set at compile-time by a C preprocessor macro called
3440: ** [limits | SQLITE_MAX_<i>NAME</i>].
3441: ** (The "_LIMIT_" in the name is changed to "_MAX_".))^
3442: ** ^Attempts to increase a limit above its hard upper bound are
3443: ** silently truncated to the hard upper bound.
3444: **
3445: ** ^Regardless of whether or not the limit was changed, the
3446: ** [sqlite3_limit()] interface returns the prior value of the limit.
3447: ** ^Hence, to find the current value of a limit without changing it,
3448: ** simply invoke this interface with the third parameter set to -1.
3449: **
3450: ** Run-time limits are intended for use in applications that manage
3451: ** both their own internal database and also databases that are controlled
3452: ** by untrusted external sources. An example application might be a
3453: ** web browser that has its own databases for storing history and
3454: ** separate databases controlled by JavaScript applications downloaded
3455: ** off the Internet. The internal databases can be given the
3456: ** large, default limits. Databases managed by external sources can
3457: ** be given much smaller limits designed to prevent a denial of service
3458: ** attack. Developers might also want to use the [sqlite3_set_authorizer()]
3459: ** interface to further control untrusted SQL. The size of the database
3460: ** created by an untrusted script can be contained using the
3461: ** [max_page_count] [PRAGMA].
3462: **
3463: ** New run-time limit categories may be added in future releases.
3464: */
3465: SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal);
3466:
3467: /*
3468: ** CAPI3REF: Run-Time Limit Categories
3469: ** KEYWORDS: {limit category} {*limit categories}
3470: **
3471: ** These constants define various performance limits
3472: ** that can be lowered at run-time using [sqlite3_limit()].
3473: ** The synopsis of the meanings of the various limits is shown below.
3474: ** Additional information is available at [limits | Limits in SQLite].
3475: **
3476: ** <dl>
3477: ** [[SQLITE_LIMIT_LENGTH]] ^(<dt>SQLITE_LIMIT_LENGTH</dt>
3478: ** <dd>The maximum size of any string or BLOB or table row, in bytes.<dd>)^
3479: **
3480: ** [[SQLITE_LIMIT_SQL_LENGTH]] ^(<dt>SQLITE_LIMIT_SQL_LENGTH</dt>
3481: ** <dd>The maximum length of an SQL statement, in bytes.</dd>)^
3482: **
3483: ** [[SQLITE_LIMIT_COLUMN]] ^(<dt>SQLITE_LIMIT_COLUMN</dt>
3484: ** <dd>The maximum number of columns in a table definition or in the
3485: ** result set of a [SELECT] or the maximum number of columns in an index
3486: ** or in an ORDER BY or GROUP BY clause.</dd>)^
3487: **
3488: ** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(<dt>SQLITE_LIMIT_EXPR_DEPTH</dt>
3489: ** <dd>The maximum depth of the parse tree on any expression.</dd>)^
3490: **
3491: ** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(<dt>SQLITE_LIMIT_COMPOUND_SELECT</dt>
3492: ** <dd>The maximum number of terms in a compound SELECT statement.</dd>)^
3493: **
3494: ** [[SQLITE_LIMIT_VDBE_OP]] ^(<dt>SQLITE_LIMIT_VDBE_OP</dt>
3495: ** <dd>The maximum number of instructions in a virtual machine program
3496: ** used to implement an SQL statement. This limit is not currently
3497: ** enforced, though that might be added in some future release of
3498: ** SQLite.</dd>)^
3499: **
3500: ** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(<dt>SQLITE_LIMIT_FUNCTION_ARG</dt>
3501: ** <dd>The maximum number of arguments on a function.</dd>)^
3502: **
3503: ** [[SQLITE_LIMIT_ATTACHED]] ^(<dt>SQLITE_LIMIT_ATTACHED</dt>
3504: ** <dd>The maximum number of [ATTACH | attached databases].)^</dd>
3505: **
3506: ** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]]
3507: ** ^(<dt>SQLITE_LIMIT_LIKE_PATTERN_LENGTH</dt>
3508: ** <dd>The maximum length of the pattern argument to the [LIKE] or
3509: ** [GLOB] operators.</dd>)^
3510: **
3511: ** [[SQLITE_LIMIT_VARIABLE_NUMBER]]
3512: ** ^(<dt>SQLITE_LIMIT_VARIABLE_NUMBER</dt>
3513: ** <dd>The maximum index number of any [parameter] in an SQL statement.)^
3514: **
3515: ** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(<dt>SQLITE_LIMIT_TRIGGER_DEPTH</dt>
3516: ** <dd>The maximum depth of recursion for triggers.</dd>)^
3517: ** </dl>
3518: */
3519: #define SQLITE_LIMIT_LENGTH 0
3520: #define SQLITE_LIMIT_SQL_LENGTH 1
3521: #define SQLITE_LIMIT_COLUMN 2
3522: #define SQLITE_LIMIT_EXPR_DEPTH 3
3523: #define SQLITE_LIMIT_COMPOUND_SELECT 4
3524: #define SQLITE_LIMIT_VDBE_OP 5
3525: #define SQLITE_LIMIT_FUNCTION_ARG 6
3526: #define SQLITE_LIMIT_ATTACHED 7
3527: #define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8
3528: #define SQLITE_LIMIT_VARIABLE_NUMBER 9
3529: #define SQLITE_LIMIT_TRIGGER_DEPTH 10
3530:
3531: /*
3532: ** CAPI3REF: Compiling An SQL Statement
3533: ** KEYWORDS: {SQL statement compiler}
3534: **
3535: ** To execute an SQL query, it must first be compiled into a byte-code
3536: ** program using one of these routines.
3537: **
3538: ** The first argument, "db", is a [database connection] obtained from a
3539: ** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or
3540: ** [sqlite3_open16()]. The database connection must not have been closed.
3541: **
3542: ** The second argument, "zSql", is the statement to be compiled, encoded
3543: ** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2()
3544: ** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2()
3545: ** use UTF-16.
3546: **
3547: ** ^If the nByte argument is less than zero, then zSql is read up to the
3548: ** first zero terminator. ^If nByte is non-negative, then it is the maximum
3549: ** number of bytes read from zSql. ^When nByte is non-negative, the
3550: ** zSql string ends at either the first '\000' or '\u0000' character or
3551: ** the nByte-th byte, whichever comes first. If the caller knows
3552: ** that the supplied string is nul-terminated, then there is a small
3553: ** performance advantage to be gained by passing an nByte parameter that
3554: ** is equal to the number of bytes in the input string <i>including</i>
3555: ** the nul-terminator bytes as this saves SQLite from having to
3556: ** make a copy of the input string.
3557: **
3558: ** ^If pzTail is not NULL then *pzTail is made to point to the first byte
3559: ** past the end of the first SQL statement in zSql. These routines only
3560: ** compile the first statement in zSql, so *pzTail is left pointing to
3561: ** what remains uncompiled.
3562: **
3563: ** ^*ppStmt is left pointing to a compiled [prepared statement] that can be
3564: ** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set
3565: ** to NULL. ^If the input text contains no SQL (if the input is an empty
3566: ** string or a comment) then *ppStmt is set to NULL.
3567: ** The calling procedure is responsible for deleting the compiled
3568: ** SQL statement using [sqlite3_finalize()] after it has finished with it.
3569: ** ppStmt may not be NULL.
3570: **
3571: ** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK];
3572: ** otherwise an [error code] is returned.
3573: **
3574: ** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are
3575: ** recommended for all new programs. The two older interfaces are retained
3576: ** for backwards compatibility, but their use is discouraged.
3577: ** ^In the "v2" interfaces, the prepared statement
3578: ** that is returned (the [sqlite3_stmt] object) contains a copy of the
3579: ** original SQL text. This causes the [sqlite3_step()] interface to
3580: ** behave differently in three ways:
3581: **
3582: ** <ol>
3583: ** <li>
3584: ** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it
3585: ** always used to do, [sqlite3_step()] will automatically recompile the SQL
3586: ** statement and try to run it again.
3587: ** </li>
3588: **
3589: ** <li>
3590: ** ^When an error occurs, [sqlite3_step()] will return one of the detailed
3591: ** [error codes] or [extended error codes]. ^The legacy behavior was that
3592: ** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code
3593: ** and the application would have to make a second call to [sqlite3_reset()]
3594: ** in order to find the underlying cause of the problem. With the "v2" prepare
3595: ** interfaces, the underlying reason for the error is returned immediately.
3596: ** </li>
3597: **
3598: ** <li>
3599: ** ^If the specific value bound to [parameter | host parameter] in the
3600: ** WHERE clause might influence the choice of query plan for a statement,
3601: ** then the statement will be automatically recompiled, as if there had been
3602: ** a schema change, on the first [sqlite3_step()] call following any change
3603: ** to the [sqlite3_bind_text | bindings] of that [parameter].
3604: ** ^The specific value of WHERE-clause [parameter] might influence the
3605: ** choice of query plan if the parameter is the left-hand side of a [LIKE]
3606: ** or [GLOB] operator or if the parameter is compared to an indexed column
3607: ** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
3608: ** the
3609: ** </li>
3610: ** </ol>
3611: */
3612: SQLITE_API int sqlite3_prepare(
3613: sqlite3 *db, /* Database handle */
3614: const char *zSql, /* SQL statement, UTF-8 encoded */
3615: int nByte, /* Maximum length of zSql in bytes. */
3616: sqlite3_stmt **ppStmt, /* OUT: Statement handle */
3617: const char **pzTail /* OUT: Pointer to unused portion of zSql */
3618: );
3619: SQLITE_API int sqlite3_prepare_v2(
3620: sqlite3 *db, /* Database handle */
3621: const char *zSql, /* SQL statement, UTF-8 encoded */
3622: int nByte, /* Maximum length of zSql in bytes. */
3623: sqlite3_stmt **ppStmt, /* OUT: Statement handle */
3624: const char **pzTail /* OUT: Pointer to unused portion of zSql */
3625: );
3626: SQLITE_API int sqlite3_prepare16(
3627: sqlite3 *db, /* Database handle */
3628: const void *zSql, /* SQL statement, UTF-16 encoded */
3629: int nByte, /* Maximum length of zSql in bytes. */
3630: sqlite3_stmt **ppStmt, /* OUT: Statement handle */
3631: const void **pzTail /* OUT: Pointer to unused portion of zSql */
3632: );
3633: SQLITE_API int sqlite3_prepare16_v2(
3634: sqlite3 *db, /* Database handle */
3635: const void *zSql, /* SQL statement, UTF-16 encoded */
3636: int nByte, /* Maximum length of zSql in bytes. */
3637: sqlite3_stmt **ppStmt, /* OUT: Statement handle */
3638: const void **pzTail /* OUT: Pointer to unused portion of zSql */
3639: );
3640:
3641: /*
3642: ** CAPI3REF: Retrieving Statement SQL
3643: **
3644: ** ^This interface can be used to retrieve a saved copy of the original
3645: ** SQL text used to create a [prepared statement] if that statement was
3646: ** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()].
3647: */
3648: SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt);
3649:
3650: /*
3651: ** CAPI3REF: Determine If An SQL Statement Writes The Database
3652: **
3653: ** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if
3654: ** and only if the [prepared statement] X makes no direct changes to
3655: ** the content of the database file.
3656: **
3657: ** Note that [application-defined SQL functions] or
3658: ** [virtual tables] might change the database indirectly as a side effect.
3659: ** ^(For example, if an application defines a function "eval()" that
3660: ** calls [sqlite3_exec()], then the following SQL statement would
3661: ** change the database file through side-effects:
3662: **
3663: ** <blockquote><pre>
3664: ** SELECT eval('DELETE FROM t1') FROM t2;
3665: ** </pre></blockquote>
3666: **
3667: ** But because the [SELECT] statement does not change the database file
3668: ** directly, sqlite3_stmt_readonly() would still return true.)^
3669: **
3670: ** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK],
3671: ** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true,
3672: ** since the statements themselves do not actually modify the database but
3673: ** rather they control the timing of when other statements modify the
3674: ** database. ^The [ATTACH] and [DETACH] statements also cause
3675: ** sqlite3_stmt_readonly() to return true since, while those statements
3676: ** change the configuration of a database connection, they do not make
3677: ** changes to the content of the database files on disk.
3678: */
3679: SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
3680:
3681: /*
3682: ** CAPI3REF: Determine If A Prepared Statement Has Been Reset
3683: **
3684: ** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the
3685: ** [prepared statement] S has been stepped at least once using
3686: ** [sqlite3_step(S)] but has not run to completion and/or has not
3687: ** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S)
3688: ** interface returns false if S is a NULL pointer. If S is not a
3689: ** NULL pointer and is not a pointer to a valid [prepared statement]
3690: ** object, then the behavior is undefined and probably undesirable.
3691: **
3692: ** This interface can be used in combination [sqlite3_next_stmt()]
3693: ** to locate all prepared statements associated with a database
3694: ** connection that are in need of being reset. This can be used,
3695: ** for example, in diagnostic routines to search for prepared
3696: ** statements that are holding a transaction open.
3697: */
3698: SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*);
3699:
3700: /*
3701: ** CAPI3REF: Dynamically Typed Value Object
3702: ** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value}
3703: **
3704: ** SQLite uses the sqlite3_value object to represent all values
3705: ** that can be stored in a database table. SQLite uses dynamic typing
3706: ** for the values it stores. ^Values stored in sqlite3_value objects
3707: ** can be integers, floating point values, strings, BLOBs, or NULL.
3708: **
3709: ** An sqlite3_value object may be either "protected" or "unprotected".
3710: ** Some interfaces require a protected sqlite3_value. Other interfaces
3711: ** will accept either a protected or an unprotected sqlite3_value.
3712: ** Every interface that accepts sqlite3_value arguments specifies
3713: ** whether or not it requires a protected sqlite3_value.
3714: **
3715: ** The terms "protected" and "unprotected" refer to whether or not
3716: ** a mutex is held. An internal mutex is held for a protected
3717: ** sqlite3_value object but no mutex is held for an unprotected
3718: ** sqlite3_value object. If SQLite is compiled to be single-threaded
3719: ** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0)
3720: ** or if SQLite is run in one of reduced mutex modes
3721: ** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD]
3722: ** then there is no distinction between protected and unprotected
3723: ** sqlite3_value objects and they can be used interchangeably. However,
3724: ** for maximum code portability it is recommended that applications
3725: ** still make the distinction between protected and unprotected
3726: ** sqlite3_value objects even when not strictly required.
3727: **
3728: ** ^The sqlite3_value objects that are passed as parameters into the
3729: ** implementation of [application-defined SQL functions] are protected.
3730: ** ^The sqlite3_value object returned by
3731: ** [sqlite3_column_value()] is unprotected.
3732: ** Unprotected sqlite3_value objects may only be used with
3733: ** [sqlite3_result_value()] and [sqlite3_bind_value()].
3734: ** The [sqlite3_value_blob | sqlite3_value_type()] family of
3735: ** interfaces require protected sqlite3_value objects.
3736: */
3737: typedef struct Mem sqlite3_value;
3738:
3739: /*
3740: ** CAPI3REF: SQL Function Context Object
3741: **
3742: ** The context in which an SQL function executes is stored in an
3743: ** sqlite3_context object. ^A pointer to an sqlite3_context object
3744: ** is always first parameter to [application-defined SQL functions].
3745: ** The application-defined SQL function implementation will pass this
3746: ** pointer through into calls to [sqlite3_result_int | sqlite3_result()],
3747: ** [sqlite3_aggregate_context()], [sqlite3_user_data()],
3748: ** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()],
3749: ** and/or [sqlite3_set_auxdata()].
3750: */
3751: typedef struct sqlite3_context sqlite3_context;
3752:
3753: /*
3754: ** CAPI3REF: Binding Values To Prepared Statements
3755: ** KEYWORDS: {host parameter} {host parameters} {host parameter name}
3756: ** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding}
3757: **
3758: ** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants,
3759: ** literals may be replaced by a [parameter] that matches one of following
3760: ** templates:
3761: **
3762: ** <ul>
3763: ** <li> ?
3764: ** <li> ?NNN
3765: ** <li> :VVV
3766: ** <li> @VVV
3767: ** <li> $VVV
3768: ** </ul>
3769: **
3770: ** In the templates above, NNN represents an integer literal,
3771: ** and VVV represents an alphanumeric identifier.)^ ^The values of these
3772: ** parameters (also called "host parameter names" or "SQL parameters")
3773: ** can be set using the sqlite3_bind_*() routines defined here.
3774: **
3775: ** ^The first argument to the sqlite3_bind_*() routines is always
3776: ** a pointer to the [sqlite3_stmt] object returned from
3777: ** [sqlite3_prepare_v2()] or its variants.
3778: **
3779: ** ^The second argument is the index of the SQL parameter to be set.
3780: ** ^The leftmost SQL parameter has an index of 1. ^When the same named
3781: ** SQL parameter is used more than once, second and subsequent
3782: ** occurrences have the same index as the first occurrence.
3783: ** ^The index for named parameters can be looked up using the
3784: ** [sqlite3_bind_parameter_index()] API if desired. ^The index
3785: ** for "?NNN" parameters is the value of NNN.
3786: ** ^The NNN value must be between 1 and the [sqlite3_limit()]
3787: ** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999).
3788: **
3789: ** ^The third argument is the value to bind to the parameter.
3790: **
3791: ** ^(In those routines that have a fourth argument, its value is the
3792: ** number of bytes in the parameter. To be clear: the value is the
3793: ** number of <u>bytes</u> in the value, not the number of characters.)^
1.2.2.1 ! misho 3794: ** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16()
! 3795: ** is negative, then the length of the string is
1.2 misho 3796: ** the number of bytes up to the first zero terminator.
1.2.2.1 ! misho 3797: ** If the fourth parameter to sqlite3_bind_blob() is negative, then
! 3798: ** the behavior is undefined.
1.2 misho 3799: ** If a non-negative fourth parameter is provided to sqlite3_bind_text()
3800: ** or sqlite3_bind_text16() then that parameter must be the byte offset
3801: ** where the NUL terminator would occur assuming the string were NUL
3802: ** terminated. If any NUL characters occur at byte offsets less than
3803: ** the value of the fourth parameter then the resulting string value will
3804: ** contain embedded NULs. The result of expressions involving strings
3805: ** with embedded NULs is undefined.
3806: **
3807: ** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and
3808: ** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
3809: ** string after SQLite has finished with it. ^The destructor is called
3810: ** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(),
3811: ** sqlite3_bind_text(), or sqlite3_bind_text16() fails.
3812: ** ^If the fifth argument is
3813: ** the special value [SQLITE_STATIC], then SQLite assumes that the
3814: ** information is in static, unmanaged space and does not need to be freed.
3815: ** ^If the fifth argument has the value [SQLITE_TRANSIENT], then
3816: ** SQLite makes its own private copy of the data immediately, before
3817: ** the sqlite3_bind_*() routine returns.
3818: **
3819: ** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that
3820: ** is filled with zeroes. ^A zeroblob uses a fixed amount of memory
3821: ** (just an integer to hold its size) while it is being processed.
3822: ** Zeroblobs are intended to serve as placeholders for BLOBs whose
3823: ** content is later written using
3824: ** [sqlite3_blob_open | incremental BLOB I/O] routines.
3825: ** ^A negative value for the zeroblob results in a zero-length BLOB.
3826: **
3827: ** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer
3828: ** for the [prepared statement] or with a prepared statement for which
3829: ** [sqlite3_step()] has been called more recently than [sqlite3_reset()],
3830: ** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_()
3831: ** routine is passed a [prepared statement] that has been finalized, the
3832: ** result is undefined and probably harmful.
3833: **
3834: ** ^Bindings are not cleared by the [sqlite3_reset()] routine.
3835: ** ^Unbound parameters are interpreted as NULL.
3836: **
3837: ** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an
3838: ** [error code] if anything goes wrong.
3839: ** ^[SQLITE_RANGE] is returned if the parameter
3840: ** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails.
3841: **
3842: ** See also: [sqlite3_bind_parameter_count()],
3843: ** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()].
3844: */
3845: SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
3846: SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
3847: SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
3848: SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
3849: SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
3850: SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
3851: SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
3852: SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
3853: SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
3854:
3855: /*
3856: ** CAPI3REF: Number Of SQL Parameters
3857: **
3858: ** ^This routine can be used to find the number of [SQL parameters]
3859: ** in a [prepared statement]. SQL parameters are tokens of the
3860: ** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as
3861: ** placeholders for values that are [sqlite3_bind_blob | bound]
3862: ** to the parameters at a later time.
3863: **
3864: ** ^(This routine actually returns the index of the largest (rightmost)
3865: ** parameter. For all forms except ?NNN, this will correspond to the
3866: ** number of unique parameters. If parameters of the ?NNN form are used,
3867: ** there may be gaps in the list.)^
3868: **
3869: ** See also: [sqlite3_bind_blob|sqlite3_bind()],
3870: ** [sqlite3_bind_parameter_name()], and
3871: ** [sqlite3_bind_parameter_index()].
3872: */
3873: SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*);
3874:
3875: /*
3876: ** CAPI3REF: Name Of A Host Parameter
3877: **
3878: ** ^The sqlite3_bind_parameter_name(P,N) interface returns
3879: ** the name of the N-th [SQL parameter] in the [prepared statement] P.
3880: ** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA"
3881: ** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA"
3882: ** respectively.
3883: ** In other words, the initial ":" or "$" or "@" or "?"
3884: ** is included as part of the name.)^
3885: ** ^Parameters of the form "?" without a following integer have no name
3886: ** and are referred to as "nameless" or "anonymous parameters".
3887: **
3888: ** ^The first host parameter has an index of 1, not 0.
3889: **
3890: ** ^If the value N is out of range or if the N-th parameter is
3891: ** nameless, then NULL is returned. ^The returned string is
3892: ** always in UTF-8 encoding even if the named parameter was
3893: ** originally specified as UTF-16 in [sqlite3_prepare16()] or
3894: ** [sqlite3_prepare16_v2()].
3895: **
3896: ** See also: [sqlite3_bind_blob|sqlite3_bind()],
3897: ** [sqlite3_bind_parameter_count()], and
3898: ** [sqlite3_bind_parameter_index()].
3899: */
3900: SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int);
3901:
3902: /*
3903: ** CAPI3REF: Index Of A Parameter With A Given Name
3904: **
3905: ** ^Return the index of an SQL parameter given its name. ^The
3906: ** index value returned is suitable for use as the second
3907: ** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero
3908: ** is returned if no matching parameter is found. ^The parameter
3909: ** name must be given in UTF-8 even if the original statement
3910: ** was prepared from UTF-16 text using [sqlite3_prepare16_v2()].
3911: **
3912: ** See also: [sqlite3_bind_blob|sqlite3_bind()],
3913: ** [sqlite3_bind_parameter_count()], and
3914: ** [sqlite3_bind_parameter_index()].
3915: */
3916: SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName);
3917:
3918: /*
3919: ** CAPI3REF: Reset All Bindings On A Prepared Statement
3920: **
3921: ** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset
3922: ** the [sqlite3_bind_blob | bindings] on a [prepared statement].
3923: ** ^Use this routine to reset all host parameters to NULL.
3924: */
3925: SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*);
3926:
3927: /*
3928: ** CAPI3REF: Number Of Columns In A Result Set
3929: **
3930: ** ^Return the number of columns in the result set returned by the
3931: ** [prepared statement]. ^This routine returns 0 if pStmt is an SQL
3932: ** statement that does not return data (for example an [UPDATE]).
3933: **
3934: ** See also: [sqlite3_data_count()]
3935: */
3936: SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt);
3937:
3938: /*
3939: ** CAPI3REF: Column Names In A Result Set
3940: **
3941: ** ^These routines return the name assigned to a particular column
3942: ** in the result set of a [SELECT] statement. ^The sqlite3_column_name()
3943: ** interface returns a pointer to a zero-terminated UTF-8 string
3944: ** and sqlite3_column_name16() returns a pointer to a zero-terminated
3945: ** UTF-16 string. ^The first parameter is the [prepared statement]
3946: ** that implements the [SELECT] statement. ^The second parameter is the
3947: ** column number. ^The leftmost column is number 0.
3948: **
3949: ** ^The returned string pointer is valid until either the [prepared statement]
3950: ** is destroyed by [sqlite3_finalize()] or until the statement is automatically
3951: ** reprepared by the first call to [sqlite3_step()] for a particular run
3952: ** or until the next call to
3953: ** sqlite3_column_name() or sqlite3_column_name16() on the same column.
3954: **
3955: ** ^If sqlite3_malloc() fails during the processing of either routine
3956: ** (for example during a conversion from UTF-8 to UTF-16) then a
3957: ** NULL pointer is returned.
3958: **
3959: ** ^The name of a result column is the value of the "AS" clause for
3960: ** that column, if there is an AS clause. If there is no AS clause
3961: ** then the name of the column is unspecified and may change from
3962: ** one release of SQLite to the next.
3963: */
3964: SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N);
3965: SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N);
3966:
3967: /*
3968: ** CAPI3REF: Source Of Data In A Query Result
3969: **
3970: ** ^These routines provide a means to determine the database, table, and
3971: ** table column that is the origin of a particular result column in
3972: ** [SELECT] statement.
3973: ** ^The name of the database or table or column can be returned as
3974: ** either a UTF-8 or UTF-16 string. ^The _database_ routines return
3975: ** the database name, the _table_ routines return the table name, and
3976: ** the origin_ routines return the column name.
3977: ** ^The returned string is valid until the [prepared statement] is destroyed
3978: ** using [sqlite3_finalize()] or until the statement is automatically
3979: ** reprepared by the first call to [sqlite3_step()] for a particular run
3980: ** or until the same information is requested
3981: ** again in a different encoding.
3982: **
3983: ** ^The names returned are the original un-aliased names of the
3984: ** database, table, and column.
3985: **
3986: ** ^The first argument to these interfaces is a [prepared statement].
3987: ** ^These functions return information about the Nth result column returned by
3988: ** the statement, where N is the second function argument.
3989: ** ^The left-most column is column 0 for these routines.
3990: **
3991: ** ^If the Nth column returned by the statement is an expression or
3992: ** subquery and is not a column value, then all of these functions return
3993: ** NULL. ^These routine might also return NULL if a memory allocation error
3994: ** occurs. ^Otherwise, they return the name of the attached database, table,
3995: ** or column that query result column was extracted from.
3996: **
3997: ** ^As with all other SQLite APIs, those whose names end with "16" return
3998: ** UTF-16 encoded strings and the other functions return UTF-8.
3999: **
4000: ** ^These APIs are only available if the library was compiled with the
4001: ** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol.
4002: **
4003: ** If two or more threads call one or more of these routines against the same
4004: ** prepared statement and column at the same time then the results are
4005: ** undefined.
4006: **
4007: ** If two or more threads call one or more
4008: ** [sqlite3_column_database_name | column metadata interfaces]
4009: ** for the same [prepared statement] and result column
4010: ** at the same time then the results are undefined.
4011: */
4012: SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int);
4013: SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int);
4014: SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int);
4015: SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int);
4016: SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int);
4017: SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int);
4018:
4019: /*
4020: ** CAPI3REF: Declared Datatype Of A Query Result
4021: **
4022: ** ^(The first parameter is a [prepared statement].
4023: ** If this statement is a [SELECT] statement and the Nth column of the
4024: ** returned result set of that [SELECT] is a table column (not an
4025: ** expression or subquery) then the declared type of the table
4026: ** column is returned.)^ ^If the Nth column of the result set is an
4027: ** expression or subquery, then a NULL pointer is returned.
4028: ** ^The returned string is always UTF-8 encoded.
4029: **
4030: ** ^(For example, given the database schema:
4031: **
4032: ** CREATE TABLE t1(c1 VARIANT);
4033: **
4034: ** and the following statement to be compiled:
4035: **
4036: ** SELECT c1 + 1, c1 FROM t1;
4037: **
4038: ** this routine would return the string "VARIANT" for the second result
4039: ** column (i==1), and a NULL pointer for the first result column (i==0).)^
4040: **
4041: ** ^SQLite uses dynamic run-time typing. ^So just because a column
4042: ** is declared to contain a particular type does not mean that the
4043: ** data stored in that column is of the declared type. SQLite is
4044: ** strongly typed, but the typing is dynamic not static. ^Type
4045: ** is associated with individual values, not with the containers
4046: ** used to hold those values.
4047: */
4048: SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int);
4049: SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int);
4050:
4051: /*
4052: ** CAPI3REF: Evaluate An SQL Statement
4053: **
4054: ** After a [prepared statement] has been prepared using either
4055: ** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy
4056: ** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function
4057: ** must be called one or more times to evaluate the statement.
4058: **
4059: ** The details of the behavior of the sqlite3_step() interface depend
4060: ** on whether the statement was prepared using the newer "v2" interface
4061: ** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy
4062: ** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the
4063: ** new "v2" interface is recommended for new applications but the legacy
4064: ** interface will continue to be supported.
4065: **
4066: ** ^In the legacy interface, the return value will be either [SQLITE_BUSY],
4067: ** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE].
4068: ** ^With the "v2" interface, any of the other [result codes] or
4069: ** [extended result codes] might be returned as well.
4070: **
4071: ** ^[SQLITE_BUSY] means that the database engine was unable to acquire the
4072: ** database locks it needs to do its job. ^If the statement is a [COMMIT]
4073: ** or occurs outside of an explicit transaction, then you can retry the
4074: ** statement. If the statement is not a [COMMIT] and occurs within an
4075: ** explicit transaction then you should rollback the transaction before
4076: ** continuing.
4077: **
4078: ** ^[SQLITE_DONE] means that the statement has finished executing
4079: ** successfully. sqlite3_step() should not be called again on this virtual
4080: ** machine without first calling [sqlite3_reset()] to reset the virtual
4081: ** machine back to its initial state.
4082: **
4083: ** ^If the SQL statement being executed returns any data, then [SQLITE_ROW]
4084: ** is returned each time a new row of data is ready for processing by the
4085: ** caller. The values may be accessed using the [column access functions].
4086: ** sqlite3_step() is called again to retrieve the next row of data.
4087: **
4088: ** ^[SQLITE_ERROR] means that a run-time error (such as a constraint
4089: ** violation) has occurred. sqlite3_step() should not be called again on
4090: ** the VM. More information may be found by calling [sqlite3_errmsg()].
4091: ** ^With the legacy interface, a more specific error code (for example,
4092: ** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth)
4093: ** can be obtained by calling [sqlite3_reset()] on the
4094: ** [prepared statement]. ^In the "v2" interface,
4095: ** the more specific error code is returned directly by sqlite3_step().
4096: **
4097: ** [SQLITE_MISUSE] means that the this routine was called inappropriately.
4098: ** Perhaps it was called on a [prepared statement] that has
4099: ** already been [sqlite3_finalize | finalized] or on one that had
4100: ** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could
4101: ** be the case that the same database connection is being used by two or
4102: ** more threads at the same moment in time.
4103: **
4104: ** For all versions of SQLite up to and including 3.6.23.1, a call to
4105: ** [sqlite3_reset()] was required after sqlite3_step() returned anything
4106: ** other than [SQLITE_ROW] before any subsequent invocation of
4107: ** sqlite3_step(). Failure to reset the prepared statement using
4108: ** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from
4109: ** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began
4110: ** calling [sqlite3_reset()] automatically in this circumstance rather
4111: ** than returning [SQLITE_MISUSE]. This is not considered a compatibility
4112: ** break because any application that ever receives an SQLITE_MISUSE error
4113: ** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option
4114: ** can be used to restore the legacy behavior.
4115: **
4116: ** <b>Goofy Interface Alert:</b> In the legacy interface, the sqlite3_step()
4117: ** API always returns a generic error code, [SQLITE_ERROR], following any
4118: ** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call
4119: ** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the
4120: ** specific [error codes] that better describes the error.
4121: ** We admit that this is a goofy design. The problem has been fixed
4122: ** with the "v2" interface. If you prepare all of your SQL statements
4123: ** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead
4124: ** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces,
4125: ** then the more specific [error codes] are returned directly
4126: ** by sqlite3_step(). The use of the "v2" interface is recommended.
4127: */
4128: SQLITE_API int sqlite3_step(sqlite3_stmt*);
4129:
4130: /*
4131: ** CAPI3REF: Number of columns in a result set
4132: **
4133: ** ^The sqlite3_data_count(P) interface returns the number of columns in the
4134: ** current row of the result set of [prepared statement] P.
4135: ** ^If prepared statement P does not have results ready to return
4136: ** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of
4137: ** interfaces) then sqlite3_data_count(P) returns 0.
4138: ** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer.
4139: ** ^The sqlite3_data_count(P) routine returns 0 if the previous call to
4140: ** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P)
4141: ** will return non-zero if previous call to [sqlite3_step](P) returned
4142: ** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum]
4143: ** where it always returns zero since each step of that multi-step
4144: ** pragma returns 0 columns of data.
4145: **
4146: ** See also: [sqlite3_column_count()]
4147: */
4148: SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
4149:
4150: /*
4151: ** CAPI3REF: Fundamental Datatypes
4152: ** KEYWORDS: SQLITE_TEXT
4153: **
4154: ** ^(Every value in SQLite has one of five fundamental datatypes:
4155: **
4156: ** <ul>
4157: ** <li> 64-bit signed integer
4158: ** <li> 64-bit IEEE floating point number
4159: ** <li> string
4160: ** <li> BLOB
4161: ** <li> NULL
4162: ** </ul>)^
4163: **
4164: ** These constants are codes for each of those types.
4165: **
4166: ** Note that the SQLITE_TEXT constant was also used in SQLite version 2
4167: ** for a completely different meaning. Software that links against both
4168: ** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not
4169: ** SQLITE_TEXT.
4170: */
4171: #define SQLITE_INTEGER 1
4172: #define SQLITE_FLOAT 2
4173: #define SQLITE_BLOB 4
4174: #define SQLITE_NULL 5
4175: #ifdef SQLITE_TEXT
4176: # undef SQLITE_TEXT
4177: #else
4178: # define SQLITE_TEXT 3
4179: #endif
4180: #define SQLITE3_TEXT 3
4181:
4182: /*
4183: ** CAPI3REF: Result Values From A Query
4184: ** KEYWORDS: {column access functions}
4185: **
4186: ** These routines form the "result set" interface.
4187: **
4188: ** ^These routines return information about a single column of the current
4189: ** result row of a query. ^In every case the first argument is a pointer
4190: ** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*]
4191: ** that was returned from [sqlite3_prepare_v2()] or one of its variants)
4192: ** and the second argument is the index of the column for which information
4193: ** should be returned. ^The leftmost column of the result set has the index 0.
4194: ** ^The number of columns in the result can be determined using
4195: ** [sqlite3_column_count()].
4196: **
4197: ** If the SQL statement does not currently point to a valid row, or if the
4198: ** column index is out of range, the result is undefined.
4199: ** These routines may only be called when the most recent call to
4200: ** [sqlite3_step()] has returned [SQLITE_ROW] and neither
4201: ** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently.
4202: ** If any of these routines are called after [sqlite3_reset()] or
4203: ** [sqlite3_finalize()] or after [sqlite3_step()] has returned
4204: ** something other than [SQLITE_ROW], the results are undefined.
4205: ** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()]
4206: ** are called from a different thread while any of these routines
4207: ** are pending, then the results are undefined.
4208: **
4209: ** ^The sqlite3_column_type() routine returns the
4210: ** [SQLITE_INTEGER | datatype code] for the initial data type
4211: ** of the result column. ^The returned value is one of [SQLITE_INTEGER],
4212: ** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value
4213: ** returned by sqlite3_column_type() is only meaningful if no type
4214: ** conversions have occurred as described below. After a type conversion,
4215: ** the value returned by sqlite3_column_type() is undefined. Future
4216: ** versions of SQLite may change the behavior of sqlite3_column_type()
4217: ** following a type conversion.
4218: **
4219: ** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes()
4220: ** routine returns the number of bytes in that BLOB or string.
4221: ** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts
4222: ** the string to UTF-8 and then returns the number of bytes.
4223: ** ^If the result is a numeric value then sqlite3_column_bytes() uses
4224: ** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns
4225: ** the number of bytes in that string.
4226: ** ^If the result is NULL, then sqlite3_column_bytes() returns zero.
4227: **
4228: ** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16()
4229: ** routine returns the number of bytes in that BLOB or string.
4230: ** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts
4231: ** the string to UTF-16 and then returns the number of bytes.
4232: ** ^If the result is a numeric value then sqlite3_column_bytes16() uses
4233: ** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns
4234: ** the number of bytes in that string.
4235: ** ^If the result is NULL, then sqlite3_column_bytes16() returns zero.
4236: **
4237: ** ^The values returned by [sqlite3_column_bytes()] and
4238: ** [sqlite3_column_bytes16()] do not include the zero terminators at the end
4239: ** of the string. ^For clarity: the values returned by
4240: ** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of
4241: ** bytes in the string, not the number of characters.
4242: **
4243: ** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(),
4244: ** even empty strings, are always zero-terminated. ^The return
4245: ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
4246: **
4247: ** ^The object returned by [sqlite3_column_value()] is an
4248: ** [unprotected sqlite3_value] object. An unprotected sqlite3_value object
4249: ** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()].
4250: ** If the [unprotected sqlite3_value] object returned by
4251: ** [sqlite3_column_value()] is used in any other way, including calls
4252: ** to routines like [sqlite3_value_int()], [sqlite3_value_text()],
4253: ** or [sqlite3_value_bytes()], then the behavior is undefined.
4254: **
4255: ** These routines attempt to convert the value where appropriate. ^For
4256: ** example, if the internal representation is FLOAT and a text result
4257: ** is requested, [sqlite3_snprintf()] is used internally to perform the
4258: ** conversion automatically. ^(The following table details the conversions
4259: ** that are applied:
4260: **
4261: ** <blockquote>
4262: ** <table border="1">
4263: ** <tr><th> Internal<br>Type <th> Requested<br>Type <th> Conversion
4264: **
4265: ** <tr><td> NULL <td> INTEGER <td> Result is 0
4266: ** <tr><td> NULL <td> FLOAT <td> Result is 0.0
4267: ** <tr><td> NULL <td> TEXT <td> Result is NULL pointer
4268: ** <tr><td> NULL <td> BLOB <td> Result is NULL pointer
4269: ** <tr><td> INTEGER <td> FLOAT <td> Convert from integer to float
4270: ** <tr><td> INTEGER <td> TEXT <td> ASCII rendering of the integer
4271: ** <tr><td> INTEGER <td> BLOB <td> Same as INTEGER->TEXT
4272: ** <tr><td> FLOAT <td> INTEGER <td> Convert from float to integer
4273: ** <tr><td> FLOAT <td> TEXT <td> ASCII rendering of the float
4274: ** <tr><td> FLOAT <td> BLOB <td> Same as FLOAT->TEXT
4275: ** <tr><td> TEXT <td> INTEGER <td> Use atoi()
4276: ** <tr><td> TEXT <td> FLOAT <td> Use atof()
4277: ** <tr><td> TEXT <td> BLOB <td> No change
4278: ** <tr><td> BLOB <td> INTEGER <td> Convert to TEXT then use atoi()
4279: ** <tr><td> BLOB <td> FLOAT <td> Convert to TEXT then use atof()
4280: ** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
4281: ** </table>
4282: ** </blockquote>)^
4283: **
4284: ** The table above makes reference to standard C library functions atoi()
4285: ** and atof(). SQLite does not really use these functions. It has its
4286: ** own equivalent internal routines. The atoi() and atof() names are
4287: ** used in the table for brevity and because they are familiar to most
4288: ** C programmers.
4289: **
4290: ** Note that when type conversions occur, pointers returned by prior
4291: ** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or
4292: ** sqlite3_column_text16() may be invalidated.
4293: ** Type conversions and pointer invalidations might occur
4294: ** in the following cases:
4295: **
4296: ** <ul>
4297: ** <li> The initial content is a BLOB and sqlite3_column_text() or
4298: ** sqlite3_column_text16() is called. A zero-terminator might
4299: ** need to be added to the string.</li>
4300: ** <li> The initial content is UTF-8 text and sqlite3_column_bytes16() or
4301: ** sqlite3_column_text16() is called. The content must be converted
4302: ** to UTF-16.</li>
4303: ** <li> The initial content is UTF-16 text and sqlite3_column_bytes() or
4304: ** sqlite3_column_text() is called. The content must be converted
4305: ** to UTF-8.</li>
4306: ** </ul>
4307: **
4308: ** ^Conversions between UTF-16be and UTF-16le are always done in place and do
4309: ** not invalidate a prior pointer, though of course the content of the buffer
4310: ** that the prior pointer references will have been modified. Other kinds
4311: ** of conversion are done in place when it is possible, but sometimes they
4312: ** are not possible and in those cases prior pointers are invalidated.
4313: **
4314: ** The safest and easiest to remember policy is to invoke these routines
4315: ** in one of the following ways:
4316: **
4317: ** <ul>
4318: ** <li>sqlite3_column_text() followed by sqlite3_column_bytes()</li>
4319: ** <li>sqlite3_column_blob() followed by sqlite3_column_bytes()</li>
4320: ** <li>sqlite3_column_text16() followed by sqlite3_column_bytes16()</li>
4321: ** </ul>
4322: **
4323: ** In other words, you should call sqlite3_column_text(),
4324: ** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result
4325: ** into the desired format, then invoke sqlite3_column_bytes() or
4326: ** sqlite3_column_bytes16() to find the size of the result. Do not mix calls
4327: ** to sqlite3_column_text() or sqlite3_column_blob() with calls to
4328: ** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16()
4329: ** with calls to sqlite3_column_bytes().
4330: **
4331: ** ^The pointers returned are valid until a type conversion occurs as
4332: ** described above, or until [sqlite3_step()] or [sqlite3_reset()] or
4333: ** [sqlite3_finalize()] is called. ^The memory space used to hold strings
4334: ** and BLOBs is freed automatically. Do <b>not</b> pass the pointers returned
4335: ** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into
4336: ** [sqlite3_free()].
4337: **
4338: ** ^(If a memory allocation error occurs during the evaluation of any
4339: ** of these routines, a default value is returned. The default value
4340: ** is either the integer 0, the floating point number 0.0, or a NULL
4341: ** pointer. Subsequent calls to [sqlite3_errcode()] will return
4342: ** [SQLITE_NOMEM].)^
4343: */
4344: SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
4345: SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
4346: SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
4347: SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
4348: SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
4349: SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
4350: SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
4351: SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
4352: SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol);
4353: SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
4354:
4355: /*
4356: ** CAPI3REF: Destroy A Prepared Statement Object
4357: **
4358: ** ^The sqlite3_finalize() function is called to delete a [prepared statement].
4359: ** ^If the most recent evaluation of the statement encountered no errors
4360: ** or if the statement is never been evaluated, then sqlite3_finalize() returns
4361: ** SQLITE_OK. ^If the most recent evaluation of statement S failed, then
4362: ** sqlite3_finalize(S) returns the appropriate [error code] or
4363: ** [extended error code].
4364: **
4365: ** ^The sqlite3_finalize(S) routine can be called at any point during
4366: ** the life cycle of [prepared statement] S:
4367: ** before statement S is ever evaluated, after
4368: ** one or more calls to [sqlite3_reset()], or after any call
4369: ** to [sqlite3_step()] regardless of whether or not the statement has
4370: ** completed execution.
4371: **
4372: ** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op.
4373: **
4374: ** The application must finalize every [prepared statement] in order to avoid
4375: ** resource leaks. It is a grievous error for the application to try to use
4376: ** a prepared statement after it has been finalized. Any use of a prepared
4377: ** statement after it has been finalized can result in undefined and
4378: ** undesirable behavior such as segfaults and heap corruption.
4379: */
4380: SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
4381:
4382: /*
4383: ** CAPI3REF: Reset A Prepared Statement Object
4384: **
4385: ** The sqlite3_reset() function is called to reset a [prepared statement]
4386: ** object back to its initial state, ready to be re-executed.
4387: ** ^Any SQL statement variables that had values bound to them using
4388: ** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values.
4389: ** Use [sqlite3_clear_bindings()] to reset the bindings.
4390: **
4391: ** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S
4392: ** back to the beginning of its program.
4393: **
4394: ** ^If the most recent call to [sqlite3_step(S)] for the
4395: ** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE],
4396: ** or if [sqlite3_step(S)] has never before been called on S,
4397: ** then [sqlite3_reset(S)] returns [SQLITE_OK].
4398: **
4399: ** ^If the most recent call to [sqlite3_step(S)] for the
4400: ** [prepared statement] S indicated an error, then
4401: ** [sqlite3_reset(S)] returns an appropriate [error code].
4402: **
4403: ** ^The [sqlite3_reset(S)] interface does not change the values
4404: ** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S.
4405: */
4406: SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
4407:
4408: /*
4409: ** CAPI3REF: Create Or Redefine SQL Functions
4410: ** KEYWORDS: {function creation routines}
4411: ** KEYWORDS: {application-defined SQL function}
4412: ** KEYWORDS: {application-defined SQL functions}
4413: **
4414: ** ^These functions (collectively known as "function creation routines")
4415: ** are used to add SQL functions or aggregates or to redefine the behavior
4416: ** of existing SQL functions or aggregates. The only differences between
4417: ** these routines are the text encoding expected for
4418: ** the second parameter (the name of the function being created)
4419: ** and the presence or absence of a destructor callback for
4420: ** the application data pointer.
4421: **
4422: ** ^The first parameter is the [database connection] to which the SQL
4423: ** function is to be added. ^If an application uses more than one database
4424: ** connection then application-defined SQL functions must be added
4425: ** to each database connection separately.
4426: **
4427: ** ^The second parameter is the name of the SQL function to be created or
4428: ** redefined. ^The length of the name is limited to 255 bytes in a UTF-8
4429: ** representation, exclusive of the zero-terminator. ^Note that the name
4430: ** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes.
4431: ** ^Any attempt to create a function with a longer name
4432: ** will result in [SQLITE_MISUSE] being returned.
4433: **
4434: ** ^The third parameter (nArg)
4435: ** is the number of arguments that the SQL function or
4436: ** aggregate takes. ^If this parameter is -1, then the SQL function or
4437: ** aggregate may take any number of arguments between 0 and the limit
4438: ** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third
4439: ** parameter is less than -1 or greater than 127 then the behavior is
4440: ** undefined.
4441: **
4442: ** ^The fourth parameter, eTextRep, specifies what
4443: ** [SQLITE_UTF8 | text encoding] this SQL function prefers for
4444: ** its parameters. Every SQL function implementation must be able to work
4445: ** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be
4446: ** more efficient with one encoding than another. ^An application may
4447: ** invoke sqlite3_create_function() or sqlite3_create_function16() multiple
4448: ** times with the same function but with different values of eTextRep.
4449: ** ^When multiple implementations of the same function are available, SQLite
4450: ** will pick the one that involves the least amount of data conversion.
4451: ** If there is only a single implementation which does not care what text
4452: ** encoding is used, then the fourth argument should be [SQLITE_ANY].
4453: **
4454: ** ^(The fifth parameter is an arbitrary pointer. The implementation of the
4455: ** function can gain access to this pointer using [sqlite3_user_data()].)^
4456: **
4457: ** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are
4458: ** pointers to C-language functions that implement the SQL function or
4459: ** aggregate. ^A scalar SQL function requires an implementation of the xFunc
4460: ** callback only; NULL pointers must be passed as the xStep and xFinal
4461: ** parameters. ^An aggregate SQL function requires an implementation of xStep
4462: ** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing
4463: ** SQL function or aggregate, pass NULL pointers for all three function
4464: ** callbacks.
4465: **
4466: ** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL,
4467: ** then it is destructor for the application data pointer.
4468: ** The destructor is invoked when the function is deleted, either by being
4469: ** overloaded or when the database connection closes.)^
4470: ** ^The destructor is also invoked if the call to
4471: ** sqlite3_create_function_v2() fails.
4472: ** ^When the destructor callback of the tenth parameter is invoked, it
4473: ** is passed a single argument which is a copy of the application data
4474: ** pointer which was the fifth parameter to sqlite3_create_function_v2().
4475: **
4476: ** ^It is permitted to register multiple implementations of the same
4477: ** functions with the same name but with either differing numbers of
4478: ** arguments or differing preferred text encodings. ^SQLite will use
4479: ** the implementation that most closely matches the way in which the
4480: ** SQL function is used. ^A function implementation with a non-negative
4481: ** nArg parameter is a better match than a function implementation with
4482: ** a negative nArg. ^A function where the preferred text encoding
4483: ** matches the database encoding is a better
4484: ** match than a function where the encoding is different.
4485: ** ^A function where the encoding difference is between UTF16le and UTF16be
4486: ** is a closer match than a function where the encoding difference is
4487: ** between UTF8 and UTF16.
4488: **
4489: ** ^Built-in functions may be overloaded by new application-defined functions.
4490: **
4491: ** ^An application-defined function is permitted to call other
4492: ** SQLite interfaces. However, such calls must not
4493: ** close the database connection nor finalize or reset the prepared
4494: ** statement in which the function is running.
4495: */
4496: SQLITE_API int sqlite3_create_function(
4497: sqlite3 *db,
4498: const char *zFunctionName,
4499: int nArg,
4500: int eTextRep,
4501: void *pApp,
4502: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
4503: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
4504: void (*xFinal)(sqlite3_context*)
4505: );
4506: SQLITE_API int sqlite3_create_function16(
4507: sqlite3 *db,
4508: const void *zFunctionName,
4509: int nArg,
4510: int eTextRep,
4511: void *pApp,
4512: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
4513: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
4514: void (*xFinal)(sqlite3_context*)
4515: );
4516: SQLITE_API int sqlite3_create_function_v2(
4517: sqlite3 *db,
4518: const char *zFunctionName,
4519: int nArg,
4520: int eTextRep,
4521: void *pApp,
4522: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
4523: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
4524: void (*xFinal)(sqlite3_context*),
4525: void(*xDestroy)(void*)
4526: );
4527:
4528: /*
4529: ** CAPI3REF: Text Encodings
4530: **
4531: ** These constant define integer codes that represent the various
4532: ** text encodings supported by SQLite.
4533: */
4534: #define SQLITE_UTF8 1
4535: #define SQLITE_UTF16LE 2
4536: #define SQLITE_UTF16BE 3
4537: #define SQLITE_UTF16 4 /* Use native byte order */
4538: #define SQLITE_ANY 5 /* sqlite3_create_function only */
4539: #define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */
4540:
4541: /*
4542: ** CAPI3REF: Deprecated Functions
4543: ** DEPRECATED
4544: **
4545: ** These functions are [deprecated]. In order to maintain
4546: ** backwards compatibility with older code, these functions continue
4547: ** to be supported. However, new applications should avoid
4548: ** the use of these functions. To help encourage people to avoid
4549: ** using these functions, we are not going to tell you what they do.
4550: */
4551: #ifndef SQLITE_OMIT_DEPRECATED
4552: SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*);
4553: SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*);
4554: SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*);
4555: SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void);
4556: SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void);
4557: SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64);
4558: #endif
4559:
4560: /*
4561: ** CAPI3REF: Obtaining SQL Function Parameter Values
4562: **
4563: ** The C-language implementation of SQL functions and aggregates uses
4564: ** this set of interface routines to access the parameter values on
4565: ** the function or aggregate.
4566: **
4567: ** The xFunc (for scalar functions) or xStep (for aggregates) parameters
4568: ** to [sqlite3_create_function()] and [sqlite3_create_function16()]
4569: ** define callbacks that implement the SQL functions and aggregates.
4570: ** The 3rd parameter to these callbacks is an array of pointers to
4571: ** [protected sqlite3_value] objects. There is one [sqlite3_value] object for
4572: ** each parameter to the SQL function. These routines are used to
4573: ** extract values from the [sqlite3_value] objects.
4574: **
4575: ** These routines work only with [protected sqlite3_value] objects.
4576: ** Any attempt to use these routines on an [unprotected sqlite3_value]
4577: ** object results in undefined behavior.
4578: **
4579: ** ^These routines work just like the corresponding [column access functions]
4580: ** except that these routines take a single [protected sqlite3_value] object
4581: ** pointer instead of a [sqlite3_stmt*] pointer and an integer column number.
4582: **
4583: ** ^The sqlite3_value_text16() interface extracts a UTF-16 string
4584: ** in the native byte-order of the host machine. ^The
4585: ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces
4586: ** extract UTF-16 strings as big-endian and little-endian respectively.
4587: **
4588: ** ^(The sqlite3_value_numeric_type() interface attempts to apply
4589: ** numeric affinity to the value. This means that an attempt is
4590: ** made to convert the value to an integer or floating point. If
4591: ** such a conversion is possible without loss of information (in other
4592: ** words, if the value is a string that looks like a number)
4593: ** then the conversion is performed. Otherwise no conversion occurs.
4594: ** The [SQLITE_INTEGER | datatype] after conversion is returned.)^
4595: **
4596: ** Please pay particular attention to the fact that the pointer returned
4597: ** from [sqlite3_value_blob()], [sqlite3_value_text()], or
4598: ** [sqlite3_value_text16()] can be invalidated by a subsequent call to
4599: ** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()],
4600: ** or [sqlite3_value_text16()].
4601: **
4602: ** These routines must be called from the same thread as
4603: ** the SQL function that supplied the [sqlite3_value*] parameters.
4604: */
4605: SQLITE_API const void *sqlite3_value_blob(sqlite3_value*);
4606: SQLITE_API int sqlite3_value_bytes(sqlite3_value*);
4607: SQLITE_API int sqlite3_value_bytes16(sqlite3_value*);
4608: SQLITE_API double sqlite3_value_double(sqlite3_value*);
4609: SQLITE_API int sqlite3_value_int(sqlite3_value*);
4610: SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*);
4611: SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*);
4612: SQLITE_API const void *sqlite3_value_text16(sqlite3_value*);
4613: SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*);
4614: SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*);
4615: SQLITE_API int sqlite3_value_type(sqlite3_value*);
4616: SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*);
4617:
4618: /*
4619: ** CAPI3REF: Obtain Aggregate Function Context
4620: **
4621: ** Implementations of aggregate SQL functions use this
4622: ** routine to allocate memory for storing their state.
4623: **
4624: ** ^The first time the sqlite3_aggregate_context(C,N) routine is called
4625: ** for a particular aggregate function, SQLite
4626: ** allocates N of memory, zeroes out that memory, and returns a pointer
4627: ** to the new memory. ^On second and subsequent calls to
4628: ** sqlite3_aggregate_context() for the same aggregate function instance,
4629: ** the same buffer is returned. Sqlite3_aggregate_context() is normally
4630: ** called once for each invocation of the xStep callback and then one
4631: ** last time when the xFinal callback is invoked. ^(When no rows match
4632: ** an aggregate query, the xStep() callback of the aggregate function
4633: ** implementation is never called and xFinal() is called exactly once.
4634: ** In those cases, sqlite3_aggregate_context() might be called for the
4635: ** first time from within xFinal().)^
4636: **
4637: ** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is
4638: ** less than or equal to zero or if a memory allocate error occurs.
4639: **
4640: ** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is
4641: ** determined by the N parameter on first successful call. Changing the
4642: ** value of N in subsequent call to sqlite3_aggregate_context() within
4643: ** the same aggregate function instance will not resize the memory
4644: ** allocation.)^
4645: **
4646: ** ^SQLite automatically frees the memory allocated by
4647: ** sqlite3_aggregate_context() when the aggregate query concludes.
4648: **
4649: ** The first parameter must be a copy of the
4650: ** [sqlite3_context | SQL function context] that is the first parameter
4651: ** to the xStep or xFinal callback routine that implements the aggregate
4652: ** function.
4653: **
4654: ** This routine must be called from the same thread in which
4655: ** the aggregate SQL function is running.
4656: */
4657: SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes);
4658:
4659: /*
4660: ** CAPI3REF: User Data For Functions
4661: **
4662: ** ^The sqlite3_user_data() interface returns a copy of
4663: ** the pointer that was the pUserData parameter (the 5th parameter)
4664: ** of the [sqlite3_create_function()]
4665: ** and [sqlite3_create_function16()] routines that originally
4666: ** registered the application defined function.
4667: **
4668: ** This routine must be called from the same thread in which
4669: ** the application-defined function is running.
4670: */
4671: SQLITE_API void *sqlite3_user_data(sqlite3_context*);
4672:
4673: /*
4674: ** CAPI3REF: Database Connection For Functions
4675: **
4676: ** ^The sqlite3_context_db_handle() interface returns a copy of
4677: ** the pointer to the [database connection] (the 1st parameter)
4678: ** of the [sqlite3_create_function()]
4679: ** and [sqlite3_create_function16()] routines that originally
4680: ** registered the application defined function.
4681: */
4682: SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
4683:
4684: /*
4685: ** CAPI3REF: Function Auxiliary Data
4686: **
4687: ** The following two functions may be used by scalar SQL functions to
4688: ** associate metadata with argument values. If the same value is passed to
4689: ** multiple invocations of the same SQL function during query execution, under
4690: ** some circumstances the associated metadata may be preserved. This may
4691: ** be used, for example, to add a regular-expression matching scalar
4692: ** function. The compiled version of the regular expression is stored as
4693: ** metadata associated with the SQL value passed as the regular expression
4694: ** pattern. The compiled regular expression can be reused on multiple
4695: ** invocations of the same function so that the original pattern string
4696: ** does not need to be recompiled on each invocation.
4697: **
4698: ** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata
4699: ** associated by the sqlite3_set_auxdata() function with the Nth argument
4700: ** value to the application-defined function. ^If no metadata has been ever
4701: ** been set for the Nth argument of the function, or if the corresponding
4702: ** function parameter has changed since the meta-data was set,
4703: ** then sqlite3_get_auxdata() returns a NULL pointer.
4704: **
4705: ** ^The sqlite3_set_auxdata() interface saves the metadata
4706: ** pointed to by its 3rd parameter as the metadata for the N-th
4707: ** argument of the application-defined function. Subsequent
4708: ** calls to sqlite3_get_auxdata() might return this data, if it has
4709: ** not been destroyed.
4710: ** ^If it is not NULL, SQLite will invoke the destructor
4711: ** function given by the 4th parameter to sqlite3_set_auxdata() on
4712: ** the metadata when the corresponding function parameter changes
4713: ** or when the SQL statement completes, whichever comes first.
4714: **
4715: ** SQLite is free to call the destructor and drop metadata on any
4716: ** parameter of any function at any time. ^The only guarantee is that
4717: ** the destructor will be called before the metadata is dropped.
4718: **
4719: ** ^(In practice, metadata is preserved between function calls for
4720: ** expressions that are constant at compile time. This includes literal
4721: ** values and [parameters].)^
4722: **
4723: ** These routines must be called from the same thread in which
4724: ** the SQL function is running.
4725: */
4726: SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N);
4727: SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
4728:
4729:
4730: /*
4731: ** CAPI3REF: Constants Defining Special Destructor Behavior
4732: **
4733: ** These are special values for the destructor that is passed in as the
4734: ** final argument to routines like [sqlite3_result_blob()]. ^If the destructor
4735: ** argument is SQLITE_STATIC, it means that the content pointer is constant
4736: ** and will never change. It does not need to be destroyed. ^The
4737: ** SQLITE_TRANSIENT value means that the content will likely change in
4738: ** the near future and that SQLite should make its own private copy of
4739: ** the content before returning.
4740: **
4741: ** The typedef is necessary to work around problems in certain
4742: ** C++ compilers. See ticket #2191.
4743: */
4744: typedef void (*sqlite3_destructor_type)(void*);
4745: #define SQLITE_STATIC ((sqlite3_destructor_type)0)
4746: #define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1)
4747:
4748: /*
4749: ** CAPI3REF: Setting The Result Of An SQL Function
4750: **
4751: ** These routines are used by the xFunc or xFinal callbacks that
4752: ** implement SQL functions and aggregates. See
4753: ** [sqlite3_create_function()] and [sqlite3_create_function16()]
4754: ** for additional information.
4755: **
4756: ** These functions work very much like the [parameter binding] family of
4757: ** functions used to bind values to host parameters in prepared statements.
4758: ** Refer to the [SQL parameter] documentation for additional information.
4759: **
4760: ** ^The sqlite3_result_blob() interface sets the result from
4761: ** an application-defined function to be the BLOB whose content is pointed
4762: ** to by the second parameter and which is N bytes long where N is the
4763: ** third parameter.
4764: **
4765: ** ^The sqlite3_result_zeroblob() interfaces set the result of
4766: ** the application-defined function to be a BLOB containing all zero
4767: ** bytes and N bytes in size, where N is the value of the 2nd parameter.
4768: **
4769: ** ^The sqlite3_result_double() interface sets the result from
4770: ** an application-defined function to be a floating point value specified
4771: ** by its 2nd argument.
4772: **
4773: ** ^The sqlite3_result_error() and sqlite3_result_error16() functions
4774: ** cause the implemented SQL function to throw an exception.
4775: ** ^SQLite uses the string pointed to by the
4776: ** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16()
4777: ** as the text of an error message. ^SQLite interprets the error
4778: ** message string from sqlite3_result_error() as UTF-8. ^SQLite
4779: ** interprets the string from sqlite3_result_error16() as UTF-16 in native
4780: ** byte order. ^If the third parameter to sqlite3_result_error()
4781: ** or sqlite3_result_error16() is negative then SQLite takes as the error
4782: ** message all text up through the first zero character.
4783: ** ^If the third parameter to sqlite3_result_error() or
4784: ** sqlite3_result_error16() is non-negative then SQLite takes that many
4785: ** bytes (not characters) from the 2nd parameter as the error message.
4786: ** ^The sqlite3_result_error() and sqlite3_result_error16()
4787: ** routines make a private copy of the error message text before
4788: ** they return. Hence, the calling function can deallocate or
4789: ** modify the text after they return without harm.
4790: ** ^The sqlite3_result_error_code() function changes the error code
4791: ** returned by SQLite as a result of an error in a function. ^By default,
4792: ** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error()
4793: ** or sqlite3_result_error16() resets the error code to SQLITE_ERROR.
4794: **
1.2.2.1 ! misho 4795: ** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an
! 4796: ** error indicating that a string or BLOB is too long to represent.
1.2 misho 4797: **
1.2.2.1 ! misho 4798: ** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an
! 4799: ** error indicating that a memory allocation failed.
1.2 misho 4800: **
4801: ** ^The sqlite3_result_int() interface sets the return value
4802: ** of the application-defined function to be the 32-bit signed integer
4803: ** value given in the 2nd argument.
4804: ** ^The sqlite3_result_int64() interface sets the return value
4805: ** of the application-defined function to be the 64-bit signed integer
4806: ** value given in the 2nd argument.
4807: **
4808: ** ^The sqlite3_result_null() interface sets the return value
4809: ** of the application-defined function to be NULL.
4810: **
4811: ** ^The sqlite3_result_text(), sqlite3_result_text16(),
4812: ** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces
4813: ** set the return value of the application-defined function to be
4814: ** a text string which is represented as UTF-8, UTF-16 native byte order,
4815: ** UTF-16 little endian, or UTF-16 big endian, respectively.
4816: ** ^SQLite takes the text result from the application from
4817: ** the 2nd parameter of the sqlite3_result_text* interfaces.
4818: ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4819: ** is negative, then SQLite takes result text from the 2nd parameter
4820: ** through the first zero character.
4821: ** ^If the 3rd parameter to the sqlite3_result_text* interfaces
4822: ** is non-negative, then as many bytes (not characters) of the text
4823: ** pointed to by the 2nd parameter are taken as the application-defined
4824: ** function result. If the 3rd parameter is non-negative, then it
4825: ** must be the byte offset into the string where the NUL terminator would
4826: ** appear if the string where NUL terminated. If any NUL characters occur
4827: ** in the string at a byte offset that is less than the value of the 3rd
4828: ** parameter, then the resulting string will contain embedded NULs and the
4829: ** result of expressions operating on strings with embedded NULs is undefined.
4830: ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4831: ** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that
4832: ** function as the destructor on the text or BLOB result when it has
4833: ** finished using that result.
4834: ** ^If the 4th parameter to the sqlite3_result_text* interfaces or to
4835: ** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite
4836: ** assumes that the text or BLOB result is in constant space and does not
4837: ** copy the content of the parameter nor call a destructor on the content
4838: ** when it has finished using that result.
4839: ** ^If the 4th parameter to the sqlite3_result_text* interfaces
4840: ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT
4841: ** then SQLite makes a copy of the result into space obtained from
4842: ** from [sqlite3_malloc()] before it returns.
4843: **
4844: ** ^The sqlite3_result_value() interface sets the result of
4845: ** the application-defined function to be a copy the
4846: ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The
4847: ** sqlite3_result_value() interface makes a copy of the [sqlite3_value]
4848: ** so that the [sqlite3_value] specified in the parameter may change or
4849: ** be deallocated after sqlite3_result_value() returns without harm.
4850: ** ^A [protected sqlite3_value] object may always be used where an
4851: ** [unprotected sqlite3_value] object is required, so either
4852: ** kind of [sqlite3_value] object can be used with this interface.
4853: **
4854: ** If these routines are called from within the different thread
4855: ** than the one containing the application-defined function that received
4856: ** the [sqlite3_context] pointer, the results are undefined.
4857: */
4858: SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*));
4859: SQLITE_API void sqlite3_result_double(sqlite3_context*, double);
4860: SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int);
4861: SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int);
4862: SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*);
4863: SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*);
4864: SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int);
4865: SQLITE_API void sqlite3_result_int(sqlite3_context*, int);
4866: SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64);
4867: SQLITE_API void sqlite3_result_null(sqlite3_context*);
4868: SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
4869: SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
4870: SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
4871: SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));
4872: SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
4873: SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n);
4874:
4875: /*
4876: ** CAPI3REF: Define New Collating Sequences
4877: **
4878: ** ^These functions add, remove, or modify a [collation] associated
4879: ** with the [database connection] specified as the first argument.
4880: **
4881: ** ^The name of the collation is a UTF-8 string
4882: ** for sqlite3_create_collation() and sqlite3_create_collation_v2()
4883: ** and a UTF-16 string in native byte order for sqlite3_create_collation16().
4884: ** ^Collation names that compare equal according to [sqlite3_strnicmp()] are
4885: ** considered to be the same name.
4886: **
4887: ** ^(The third argument (eTextRep) must be one of the constants:
4888: ** <ul>
4889: ** <li> [SQLITE_UTF8],
4890: ** <li> [SQLITE_UTF16LE],
4891: ** <li> [SQLITE_UTF16BE],
4892: ** <li> [SQLITE_UTF16], or
4893: ** <li> [SQLITE_UTF16_ALIGNED].
4894: ** </ul>)^
4895: ** ^The eTextRep argument determines the encoding of strings passed
4896: ** to the collating function callback, xCallback.
4897: ** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep
4898: ** force strings to be UTF16 with native byte order.
4899: ** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin
4900: ** on an even byte address.
4901: **
4902: ** ^The fourth argument, pArg, is an application data pointer that is passed
4903: ** through as the first argument to the collating function callback.
4904: **
4905: ** ^The fifth argument, xCallback, is a pointer to the collating function.
4906: ** ^Multiple collating functions can be registered using the same name but
4907: ** with different eTextRep parameters and SQLite will use whichever
4908: ** function requires the least amount of data transformation.
4909: ** ^If the xCallback argument is NULL then the collating function is
4910: ** deleted. ^When all collating functions having the same name are deleted,
4911: ** that collation is no longer usable.
4912: **
4913: ** ^The collating function callback is invoked with a copy of the pArg
4914: ** application data pointer and with two strings in the encoding specified
4915: ** by the eTextRep argument. The collating function must return an
4916: ** integer that is negative, zero, or positive
4917: ** if the first string is less than, equal to, or greater than the second,
4918: ** respectively. A collating function must always return the same answer
4919: ** given the same inputs. If two or more collating functions are registered
4920: ** to the same collation name (using different eTextRep values) then all
4921: ** must give an equivalent answer when invoked with equivalent strings.
4922: ** The collating function must obey the following properties for all
4923: ** strings A, B, and C:
4924: **
4925: ** <ol>
4926: ** <li> If A==B then B==A.
4927: ** <li> If A==B and B==C then A==C.
4928: ** <li> If A<B THEN B>A.
4929: ** <li> If A<B and B<C then A<C.
4930: ** </ol>
4931: **
4932: ** If a collating function fails any of the above constraints and that
4933: ** collating function is registered and used, then the behavior of SQLite
4934: ** is undefined.
4935: **
4936: ** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation()
4937: ** with the addition that the xDestroy callback is invoked on pArg when
4938: ** the collating function is deleted.
4939: ** ^Collating functions are deleted when they are overridden by later
4940: ** calls to the collation creation functions or when the
4941: ** [database connection] is closed using [sqlite3_close()].
4942: **
4943: ** ^The xDestroy callback is <u>not</u> called if the
4944: ** sqlite3_create_collation_v2() function fails. Applications that invoke
4945: ** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should
4946: ** check the return code and dispose of the application data pointer
4947: ** themselves rather than expecting SQLite to deal with it for them.
4948: ** This is different from every other SQLite interface. The inconsistency
4949: ** is unfortunate but cannot be changed without breaking backwards
4950: ** compatibility.
4951: **
4952: ** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()].
4953: */
4954: SQLITE_API int sqlite3_create_collation(
4955: sqlite3*,
4956: const char *zName,
4957: int eTextRep,
4958: void *pArg,
4959: int(*xCompare)(void*,int,const void*,int,const void*)
4960: );
4961: SQLITE_API int sqlite3_create_collation_v2(
4962: sqlite3*,
4963: const char *zName,
4964: int eTextRep,
4965: void *pArg,
4966: int(*xCompare)(void*,int,const void*,int,const void*),
4967: void(*xDestroy)(void*)
4968: );
4969: SQLITE_API int sqlite3_create_collation16(
4970: sqlite3*,
4971: const void *zName,
4972: int eTextRep,
4973: void *pArg,
4974: int(*xCompare)(void*,int,const void*,int,const void*)
4975: );
4976:
4977: /*
4978: ** CAPI3REF: Collation Needed Callbacks
4979: **
4980: ** ^To avoid having to register all collation sequences before a database
4981: ** can be used, a single callback function may be registered with the
4982: ** [database connection] to be invoked whenever an undefined collation
4983: ** sequence is required.
4984: **
4985: ** ^If the function is registered using the sqlite3_collation_needed() API,
4986: ** then it is passed the names of undefined collation sequences as strings
4987: ** encoded in UTF-8. ^If sqlite3_collation_needed16() is used,
4988: ** the names are passed as UTF-16 in machine native byte order.
4989: ** ^A call to either function replaces the existing collation-needed callback.
4990: **
4991: ** ^(When the callback is invoked, the first argument passed is a copy
4992: ** of the second argument to sqlite3_collation_needed() or
4993: ** sqlite3_collation_needed16(). The second argument is the database
4994: ** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE],
4995: ** or [SQLITE_UTF16LE], indicating the most desirable form of the collation
4996: ** sequence function required. The fourth parameter is the name of the
4997: ** required collation sequence.)^
4998: **
4999: ** The callback function should register the desired collation using
5000: ** [sqlite3_create_collation()], [sqlite3_create_collation16()], or
5001: ** [sqlite3_create_collation_v2()].
5002: */
5003: SQLITE_API int sqlite3_collation_needed(
5004: sqlite3*,
5005: void*,
5006: void(*)(void*,sqlite3*,int eTextRep,const char*)
5007: );
5008: SQLITE_API int sqlite3_collation_needed16(
5009: sqlite3*,
5010: void*,
5011: void(*)(void*,sqlite3*,int eTextRep,const void*)
5012: );
5013:
5014: #ifdef SQLITE_HAS_CODEC
5015: /*
5016: ** Specify the key for an encrypted database. This routine should be
5017: ** called right after sqlite3_open().
5018: **
5019: ** The code to implement this API is not available in the public release
5020: ** of SQLite.
5021: */
5022: SQLITE_API int sqlite3_key(
5023: sqlite3 *db, /* Database to be rekeyed */
5024: const void *pKey, int nKey /* The key */
5025: );
5026:
5027: /*
5028: ** Change the key on an open database. If the current database is not
5029: ** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the
5030: ** database is decrypted.
5031: **
5032: ** The code to implement this API is not available in the public release
5033: ** of SQLite.
5034: */
5035: SQLITE_API int sqlite3_rekey(
5036: sqlite3 *db, /* Database to be rekeyed */
5037: const void *pKey, int nKey /* The new key */
5038: );
5039:
5040: /*
5041: ** Specify the activation key for a SEE database. Unless
5042: ** activated, none of the SEE routines will work.
5043: */
5044: SQLITE_API void sqlite3_activate_see(
5045: const char *zPassPhrase /* Activation phrase */
5046: );
5047: #endif
5048:
5049: #ifdef SQLITE_ENABLE_CEROD
5050: /*
5051: ** Specify the activation key for a CEROD database. Unless
5052: ** activated, none of the CEROD routines will work.
5053: */
5054: SQLITE_API void sqlite3_activate_cerod(
5055: const char *zPassPhrase /* Activation phrase */
5056: );
5057: #endif
5058:
5059: /*
5060: ** CAPI3REF: Suspend Execution For A Short Time
5061: **
5062: ** The sqlite3_sleep() function causes the current thread to suspend execution
5063: ** for at least a number of milliseconds specified in its parameter.
5064: **
5065: ** If the operating system does not support sleep requests with
5066: ** millisecond time resolution, then the time will be rounded up to
5067: ** the nearest second. The number of milliseconds of sleep actually
5068: ** requested from the operating system is returned.
5069: **
5070: ** ^SQLite implements this interface by calling the xSleep()
5071: ** method of the default [sqlite3_vfs] object. If the xSleep() method
5072: ** of the default VFS is not implemented correctly, or not implemented at
5073: ** all, then the behavior of sqlite3_sleep() may deviate from the description
5074: ** in the previous paragraphs.
5075: */
5076: SQLITE_API int sqlite3_sleep(int);
5077:
5078: /*
5079: ** CAPI3REF: Name Of The Folder Holding Temporary Files
5080: **
5081: ** ^(If this global variable is made to point to a string which is
5082: ** the name of a folder (a.k.a. directory), then all temporary files
5083: ** created by SQLite when using a built-in [sqlite3_vfs | VFS]
5084: ** will be placed in that directory.)^ ^If this variable
5085: ** is a NULL pointer, then SQLite performs a search for an appropriate
5086: ** temporary file directory.
5087: **
5088: ** It is not safe to read or modify this variable in more than one
5089: ** thread at a time. It is not safe to read or modify this variable
5090: ** if a [database connection] is being used at the same time in a separate
5091: ** thread.
5092: ** It is intended that this variable be set once
5093: ** as part of process initialization and before any SQLite interface
5094: ** routines have been called and that this variable remain unchanged
5095: ** thereafter.
5096: **
5097: ** ^The [temp_store_directory pragma] may modify this variable and cause
5098: ** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore,
5099: ** the [temp_store_directory pragma] always assumes that any string
5100: ** that this variable points to is held in memory obtained from
5101: ** [sqlite3_malloc] and the pragma may attempt to free that memory
5102: ** using [sqlite3_free].
5103: ** Hence, if this variable is modified directly, either it should be
5104: ** made NULL or made to point to memory obtained from [sqlite3_malloc]
5105: ** or else the use of the [temp_store_directory pragma] should be avoided.
1.2.2.1 ! misho 5106: **
! 5107: ** <b>Note to Windows Runtime users:</b> The temporary directory must be set
! 5108: ** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various
! 5109: ** features that require the use of temporary files may fail. Here is an
! 5110: ** example of how to do this using C++ with the Windows Runtime:
! 5111: **
! 5112: ** <blockquote><pre>
! 5113: ** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
! 5114: ** TemporaryFolder->Path->Data();
! 5115: ** char zPathBuf[MAX_PATH + 1];
! 5116: ** memset(zPathBuf, 0, sizeof(zPathBuf));
! 5117: ** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
! 5118: ** NULL, NULL);
! 5119: ** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
! 5120: ** </pre></blockquote>
1.2 misho 5121: */
5122: SQLITE_API char *sqlite3_temp_directory;
5123:
5124: /*
1.2.2.1 ! misho 5125: ** CAPI3REF: Name Of The Folder Holding Database Files
! 5126: **
! 5127: ** ^(If this global variable is made to point to a string which is
! 5128: ** the name of a folder (a.k.a. directory), then all database files
! 5129: ** specified with a relative pathname and created or accessed by
! 5130: ** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed
! 5131: ** to be relative to that directory.)^ ^If this variable is a NULL
! 5132: ** pointer, then SQLite assumes that all database files specified
! 5133: ** with a relative pathname are relative to the current directory
! 5134: ** for the process. Only the windows VFS makes use of this global
! 5135: ** variable; it is ignored by the unix VFS.
! 5136: **
! 5137: ** Changing the value of this variable while a database connection is
! 5138: ** open can result in a corrupt database.
! 5139: **
! 5140: ** It is not safe to read or modify this variable in more than one
! 5141: ** thread at a time. It is not safe to read or modify this variable
! 5142: ** if a [database connection] is being used at the same time in a separate
! 5143: ** thread.
! 5144: ** It is intended that this variable be set once
! 5145: ** as part of process initialization and before any SQLite interface
! 5146: ** routines have been called and that this variable remain unchanged
! 5147: ** thereafter.
! 5148: **
! 5149: ** ^The [data_store_directory pragma] may modify this variable and cause
! 5150: ** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore,
! 5151: ** the [data_store_directory pragma] always assumes that any string
! 5152: ** that this variable points to is held in memory obtained from
! 5153: ** [sqlite3_malloc] and the pragma may attempt to free that memory
! 5154: ** using [sqlite3_free].
! 5155: ** Hence, if this variable is modified directly, either it should be
! 5156: ** made NULL or made to point to memory obtained from [sqlite3_malloc]
! 5157: ** or else the use of the [data_store_directory pragma] should be avoided.
! 5158: */
! 5159: SQLITE_API char *sqlite3_data_directory;
! 5160:
! 5161: /*
1.2 misho 5162: ** CAPI3REF: Test For Auto-Commit Mode
5163: ** KEYWORDS: {autocommit mode}
5164: **
5165: ** ^The sqlite3_get_autocommit() interface returns non-zero or
5166: ** zero if the given database connection is or is not in autocommit mode,
5167: ** respectively. ^Autocommit mode is on by default.
5168: ** ^Autocommit mode is disabled by a [BEGIN] statement.
5169: ** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK].
5170: **
5171: ** If certain kinds of errors occur on a statement within a multi-statement
5172: ** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR],
5173: ** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the
5174: ** transaction might be rolled back automatically. The only way to
5175: ** find out whether SQLite automatically rolled back the transaction after
5176: ** an error is to use this function.
5177: **
5178: ** If another thread changes the autocommit status of the database
5179: ** connection while this routine is running, then the return value
5180: ** is undefined.
5181: */
5182: SQLITE_API int sqlite3_get_autocommit(sqlite3*);
5183:
5184: /*
5185: ** CAPI3REF: Find The Database Handle Of A Prepared Statement
5186: **
5187: ** ^The sqlite3_db_handle interface returns the [database connection] handle
5188: ** to which a [prepared statement] belongs. ^The [database connection]
5189: ** returned by sqlite3_db_handle is the same [database connection]
5190: ** that was the first argument
5191: ** to the [sqlite3_prepare_v2()] call (or its variants) that was used to
5192: ** create the statement in the first place.
5193: */
5194: SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*);
5195:
5196: /*
5197: ** CAPI3REF: Return The Filename For A Database Connection
5198: **
5199: ** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename
5200: ** associated with database N of connection D. ^The main database file
5201: ** has the name "main". If there is no attached database N on the database
5202: ** connection D, or if database N is a temporary or in-memory database, then
5203: ** a NULL pointer is returned.
5204: **
5205: ** ^The filename returned by this function is the output of the
5206: ** xFullPathname method of the [VFS]. ^In other words, the filename
5207: ** will be an absolute pathname, even if the filename used
5208: ** to open the database originally was a URI or relative pathname.
5209: */
5210: SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName);
5211:
5212: /*
1.2.2.1 ! misho 5213: ** CAPI3REF: Determine if a database is read-only
! 5214: **
! 5215: ** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N
! 5216: ** of connection D is read-only, 0 if it is read/write, or -1 if N is not
! 5217: ** the name of a database on connection D.
! 5218: */
! 5219: SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName);
! 5220:
! 5221: /*
1.2 misho 5222: ** CAPI3REF: Find the next prepared statement
5223: **
5224: ** ^This interface returns a pointer to the next [prepared statement] after
5225: ** pStmt associated with the [database connection] pDb. ^If pStmt is NULL
5226: ** then this interface returns a pointer to the first prepared statement
5227: ** associated with the database connection pDb. ^If no prepared statement
5228: ** satisfies the conditions of this routine, it returns NULL.
5229: **
5230: ** The [database connection] pointer D in a call to
5231: ** [sqlite3_next_stmt(D,S)] must refer to an open database
5232: ** connection and in particular must not be a NULL pointer.
5233: */
5234: SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt);
5235:
5236: /*
5237: ** CAPI3REF: Commit And Rollback Notification Callbacks
5238: **
5239: ** ^The sqlite3_commit_hook() interface registers a callback
5240: ** function to be invoked whenever a transaction is [COMMIT | committed].
5241: ** ^Any callback set by a previous call to sqlite3_commit_hook()
5242: ** for the same database connection is overridden.
5243: ** ^The sqlite3_rollback_hook() interface registers a callback
5244: ** function to be invoked whenever a transaction is [ROLLBACK | rolled back].
5245: ** ^Any callback set by a previous call to sqlite3_rollback_hook()
5246: ** for the same database connection is overridden.
5247: ** ^The pArg argument is passed through to the callback.
5248: ** ^If the callback on a commit hook function returns non-zero,
5249: ** then the commit is converted into a rollback.
5250: **
5251: ** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions
5252: ** return the P argument from the previous call of the same function
5253: ** on the same [database connection] D, or NULL for
5254: ** the first call for each function on D.
5255: **
5256: ** The commit and rollback hook callbacks are not reentrant.
5257: ** The callback implementation must not do anything that will modify
5258: ** the database connection that invoked the callback. Any actions
5259: ** to modify the database connection must be deferred until after the
5260: ** completion of the [sqlite3_step()] call that triggered the commit
5261: ** or rollback hook in the first place.
5262: ** Note that running any other SQL statements, including SELECT statements,
5263: ** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify
5264: ** the database connections for the meaning of "modify" in this paragraph.
5265: **
5266: ** ^Registering a NULL function disables the callback.
5267: **
5268: ** ^When the commit hook callback routine returns zero, the [COMMIT]
5269: ** operation is allowed to continue normally. ^If the commit hook
5270: ** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK].
5271: ** ^The rollback hook is invoked on a rollback that results from a commit
5272: ** hook returning non-zero, just as it would be with any other rollback.
5273: **
5274: ** ^For the purposes of this API, a transaction is said to have been
5275: ** rolled back if an explicit "ROLLBACK" statement is executed, or
5276: ** an error or constraint causes an implicit rollback to occur.
5277: ** ^The rollback callback is not invoked if a transaction is
5278: ** automatically rolled back because the database connection is closed.
5279: **
5280: ** See also the [sqlite3_update_hook()] interface.
5281: */
5282: SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
5283: SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
5284:
5285: /*
5286: ** CAPI3REF: Data Change Notification Callbacks
5287: **
5288: ** ^The sqlite3_update_hook() interface registers a callback function
5289: ** with the [database connection] identified by the first argument
5290: ** to be invoked whenever a row is updated, inserted or deleted.
5291: ** ^Any callback set by a previous call to this function
5292: ** for the same database connection is overridden.
5293: **
5294: ** ^The second argument is a pointer to the function to invoke when a
5295: ** row is updated, inserted or deleted.
5296: ** ^The first argument to the callback is a copy of the third argument
5297: ** to sqlite3_update_hook().
5298: ** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE],
5299: ** or [SQLITE_UPDATE], depending on the operation that caused the callback
5300: ** to be invoked.
5301: ** ^The third and fourth arguments to the callback contain pointers to the
5302: ** database and table name containing the affected row.
5303: ** ^The final callback parameter is the [rowid] of the row.
5304: ** ^In the case of an update, this is the [rowid] after the update takes place.
5305: **
5306: ** ^(The update hook is not invoked when internal system tables are
5307: ** modified (i.e. sqlite_master and sqlite_sequence).)^
5308: **
5309: ** ^In the current implementation, the update hook
5310: ** is not invoked when duplication rows are deleted because of an
5311: ** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook
5312: ** invoked when rows are deleted using the [truncate optimization].
5313: ** The exceptions defined in this paragraph might change in a future
5314: ** release of SQLite.
5315: **
5316: ** The update hook implementation must not do anything that will modify
5317: ** the database connection that invoked the update hook. Any actions
5318: ** to modify the database connection must be deferred until after the
5319: ** completion of the [sqlite3_step()] call that triggered the update hook.
5320: ** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their
5321: ** database connections for the meaning of "modify" in this paragraph.
5322: **
5323: ** ^The sqlite3_update_hook(D,C,P) function
5324: ** returns the P argument from the previous call
5325: ** on the same [database connection] D, or NULL for
5326: ** the first call on D.
5327: **
5328: ** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()]
5329: ** interfaces.
5330: */
5331: SQLITE_API void *sqlite3_update_hook(
5332: sqlite3*,
5333: void(*)(void *,int ,char const *,char const *,sqlite3_int64),
5334: void*
5335: );
5336:
5337: /*
5338: ** CAPI3REF: Enable Or Disable Shared Pager Cache
5339: **
5340: ** ^(This routine enables or disables the sharing of the database cache
5341: ** and schema data structures between [database connection | connections]
5342: ** to the same database. Sharing is enabled if the argument is true
5343: ** and disabled if the argument is false.)^
5344: **
5345: ** ^Cache sharing is enabled and disabled for an entire process.
5346: ** This is a change as of SQLite version 3.5.0. In prior versions of SQLite,
5347: ** sharing was enabled or disabled for each thread separately.
5348: **
5349: ** ^(The cache sharing mode set by this interface effects all subsequent
5350: ** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()].
5351: ** Existing database connections continue use the sharing mode
5352: ** that was in effect at the time they were opened.)^
5353: **
5354: ** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled
5355: ** successfully. An [error code] is returned otherwise.)^
5356: **
5357: ** ^Shared cache is disabled by default. But this might change in
5358: ** future releases of SQLite. Applications that care about shared
5359: ** cache setting should set it explicitly.
5360: **
1.2.2.1 ! misho 5361: ** This interface is threadsafe on processors where writing a
! 5362: ** 32-bit integer is atomic.
! 5363: **
1.2 misho 5364: ** See Also: [SQLite Shared-Cache Mode]
5365: */
5366: SQLITE_API int sqlite3_enable_shared_cache(int);
5367:
5368: /*
5369: ** CAPI3REF: Attempt To Free Heap Memory
5370: **
5371: ** ^The sqlite3_release_memory() interface attempts to free N bytes
5372: ** of heap memory by deallocating non-essential memory allocations
5373: ** held by the database library. Memory used to cache database
5374: ** pages to improve performance is an example of non-essential memory.
5375: ** ^sqlite3_release_memory() returns the number of bytes actually freed,
5376: ** which might be more or less than the amount requested.
5377: ** ^The sqlite3_release_memory() routine is a no-op returning zero
5378: ** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT].
5379: **
5380: ** See also: [sqlite3_db_release_memory()]
5381: */
5382: SQLITE_API int sqlite3_release_memory(int);
5383:
5384: /*
5385: ** CAPI3REF: Free Memory Used By A Database Connection
5386: **
5387: ** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap
5388: ** memory as possible from database connection D. Unlike the
5389: ** [sqlite3_release_memory()] interface, this interface is effect even
5390: ** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is
5391: ** omitted.
5392: **
5393: ** See also: [sqlite3_release_memory()]
5394: */
5395: SQLITE_API int sqlite3_db_release_memory(sqlite3*);
5396:
5397: /*
5398: ** CAPI3REF: Impose A Limit On Heap Size
5399: **
5400: ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the
5401: ** soft limit on the amount of heap memory that may be allocated by SQLite.
5402: ** ^SQLite strives to keep heap memory utilization below the soft heap
5403: ** limit by reducing the number of pages held in the page cache
5404: ** as heap memory usages approaches the limit.
5405: ** ^The soft heap limit is "soft" because even though SQLite strives to stay
5406: ** below the limit, it will exceed the limit rather than generate
5407: ** an [SQLITE_NOMEM] error. In other words, the soft heap limit
5408: ** is advisory only.
5409: **
5410: ** ^The return value from sqlite3_soft_heap_limit64() is the size of
5411: ** the soft heap limit prior to the call, or negative in the case of an
5412: ** error. ^If the argument N is negative
5413: ** then no change is made to the soft heap limit. Hence, the current
5414: ** size of the soft heap limit can be determined by invoking
5415: ** sqlite3_soft_heap_limit64() with a negative argument.
5416: **
5417: ** ^If the argument N is zero then the soft heap limit is disabled.
5418: **
5419: ** ^(The soft heap limit is not enforced in the current implementation
5420: ** if one or more of following conditions are true:
5421: **
5422: ** <ul>
5423: ** <li> The soft heap limit is set to zero.
5424: ** <li> Memory accounting is disabled using a combination of the
5425: ** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and
5426: ** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option.
5427: ** <li> An alternative page cache implementation is specified using
5428: ** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...).
5429: ** <li> The page cache allocates from its own memory pool supplied
5430: ** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than
5431: ** from the heap.
5432: ** </ul>)^
5433: **
5434: ** Beginning with SQLite version 3.7.3, the soft heap limit is enforced
5435: ** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT]
5436: ** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT],
5437: ** the soft heap limit is enforced on every memory allocation. Without
5438: ** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced
5439: ** when memory is allocated by the page cache. Testing suggests that because
5440: ** the page cache is the predominate memory user in SQLite, most
5441: ** applications will achieve adequate soft heap limit enforcement without
5442: ** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT].
5443: **
5444: ** The circumstances under which SQLite will enforce the soft heap limit may
5445: ** changes in future releases of SQLite.
5446: */
5447: SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N);
5448:
5449: /*
5450: ** CAPI3REF: Deprecated Soft Heap Limit Interface
5451: ** DEPRECATED
5452: **
5453: ** This is a deprecated version of the [sqlite3_soft_heap_limit64()]
5454: ** interface. This routine is provided for historical compatibility
5455: ** only. All new applications should use the
5456: ** [sqlite3_soft_heap_limit64()] interface rather than this one.
5457: */
5458: SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N);
5459:
5460:
5461: /*
5462: ** CAPI3REF: Extract Metadata About A Column Of A Table
5463: **
5464: ** ^This routine returns metadata about a specific column of a specific
5465: ** database table accessible using the [database connection] handle
5466: ** passed as the first function argument.
5467: **
5468: ** ^The column is identified by the second, third and fourth parameters to
5469: ** this function. ^The second parameter is either the name of the database
5470: ** (i.e. "main", "temp", or an attached database) containing the specified
5471: ** table or NULL. ^If it is NULL, then all attached databases are searched
5472: ** for the table using the same algorithm used by the database engine to
5473: ** resolve unqualified table references.
5474: **
5475: ** ^The third and fourth parameters to this function are the table and column
5476: ** name of the desired column, respectively. Neither of these parameters
5477: ** may be NULL.
5478: **
5479: ** ^Metadata is returned by writing to the memory locations passed as the 5th
5480: ** and subsequent parameters to this function. ^Any of these arguments may be
5481: ** NULL, in which case the corresponding element of metadata is omitted.
5482: **
5483: ** ^(<blockquote>
5484: ** <table border="1">
5485: ** <tr><th> Parameter <th> Output<br>Type <th> Description
5486: **
5487: ** <tr><td> 5th <td> const char* <td> Data type
5488: ** <tr><td> 6th <td> const char* <td> Name of default collation sequence
5489: ** <tr><td> 7th <td> int <td> True if column has a NOT NULL constraint
5490: ** <tr><td> 8th <td> int <td> True if column is part of the PRIMARY KEY
5491: ** <tr><td> 9th <td> int <td> True if column is [AUTOINCREMENT]
5492: ** </table>
5493: ** </blockquote>)^
5494: **
5495: ** ^The memory pointed to by the character pointers returned for the
5496: ** declaration type and collation sequence is valid only until the next
5497: ** call to any SQLite API function.
5498: **
5499: ** ^If the specified table is actually a view, an [error code] is returned.
5500: **
5501: ** ^If the specified column is "rowid", "oid" or "_rowid_" and an
5502: ** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output
5503: ** parameters are set for the explicitly declared column. ^(If there is no
5504: ** explicitly declared [INTEGER PRIMARY KEY] column, then the output
5505: ** parameters are set as follows:
5506: **
5507: ** <pre>
5508: ** data type: "INTEGER"
5509: ** collation sequence: "BINARY"
5510: ** not null: 0
5511: ** primary key: 1
5512: ** auto increment: 0
5513: ** </pre>)^
5514: **
5515: ** ^(This function may load one or more schemas from database files. If an
5516: ** error occurs during this process, or if the requested table or column
5517: ** cannot be found, an [error code] is returned and an error message left
5518: ** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^
5519: **
5520: ** ^This API is only available if the library was compiled with the
5521: ** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined.
5522: */
5523: SQLITE_API int sqlite3_table_column_metadata(
5524: sqlite3 *db, /* Connection handle */
5525: const char *zDbName, /* Database name or NULL */
5526: const char *zTableName, /* Table name */
5527: const char *zColumnName, /* Column name */
5528: char const **pzDataType, /* OUTPUT: Declared data type */
5529: char const **pzCollSeq, /* OUTPUT: Collation sequence name */
5530: int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
5531: int *pPrimaryKey, /* OUTPUT: True if column part of PK */
5532: int *pAutoinc /* OUTPUT: True if column is auto-increment */
5533: );
5534:
5535: /*
5536: ** CAPI3REF: Load An Extension
5537: **
5538: ** ^This interface loads an SQLite extension library from the named file.
5539: **
5540: ** ^The sqlite3_load_extension() interface attempts to load an
5541: ** SQLite extension library contained in the file zFile.
5542: **
5543: ** ^The entry point is zProc.
5544: ** ^zProc may be 0, in which case the name of the entry point
5545: ** defaults to "sqlite3_extension_init".
5546: ** ^The sqlite3_load_extension() interface returns
5547: ** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong.
5548: ** ^If an error occurs and pzErrMsg is not 0, then the
5549: ** [sqlite3_load_extension()] interface shall attempt to
5550: ** fill *pzErrMsg with error message text stored in memory
5551: ** obtained from [sqlite3_malloc()]. The calling function
5552: ** should free this memory by calling [sqlite3_free()].
5553: **
5554: ** ^Extension loading must be enabled using
5555: ** [sqlite3_enable_load_extension()] prior to calling this API,
5556: ** otherwise an error will be returned.
5557: **
5558: ** See also the [load_extension() SQL function].
5559: */
5560: SQLITE_API int sqlite3_load_extension(
5561: sqlite3 *db, /* Load the extension into this database connection */
5562: const char *zFile, /* Name of the shared library containing extension */
5563: const char *zProc, /* Entry point. Derived from zFile if 0 */
5564: char **pzErrMsg /* Put error message here if not 0 */
5565: );
5566:
5567: /*
5568: ** CAPI3REF: Enable Or Disable Extension Loading
5569: **
5570: ** ^So as not to open security holes in older applications that are
5571: ** unprepared to deal with extension loading, and as a means of disabling
5572: ** extension loading while evaluating user-entered SQL, the following API
5573: ** is provided to turn the [sqlite3_load_extension()] mechanism on and off.
5574: **
5575: ** ^Extension loading is off by default. See ticket #1863.
5576: ** ^Call the sqlite3_enable_load_extension() routine with onoff==1
5577: ** to turn extension loading on and call it with onoff==0 to turn
5578: ** it back off again.
5579: */
5580: SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff);
5581:
5582: /*
5583: ** CAPI3REF: Automatically Load Statically Linked Extensions
5584: **
5585: ** ^This interface causes the xEntryPoint() function to be invoked for
5586: ** each new [database connection] that is created. The idea here is that
5587: ** xEntryPoint() is the entry point for a statically linked SQLite extension
5588: ** that is to be automatically loaded into all new database connections.
5589: **
5590: ** ^(Even though the function prototype shows that xEntryPoint() takes
5591: ** no arguments and returns void, SQLite invokes xEntryPoint() with three
5592: ** arguments and expects and integer result as if the signature of the
5593: ** entry point where as follows:
5594: **
5595: ** <blockquote><pre>
5596: ** int xEntryPoint(
5597: ** sqlite3 *db,
5598: ** const char **pzErrMsg,
5599: ** const struct sqlite3_api_routines *pThunk
5600: ** );
5601: ** </pre></blockquote>)^
5602: **
5603: ** If the xEntryPoint routine encounters an error, it should make *pzErrMsg
5604: ** point to an appropriate error message (obtained from [sqlite3_mprintf()])
5605: ** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg
5606: ** is NULL before calling the xEntryPoint(). ^SQLite will invoke
5607: ** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any
5608: ** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()],
5609: ** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail.
5610: **
5611: ** ^Calling sqlite3_auto_extension(X) with an entry point X that is already
5612: ** on the list of automatic extensions is a harmless no-op. ^No entry point
5613: ** will be called more than once for each database connection that is opened.
5614: **
5615: ** See also: [sqlite3_reset_auto_extension()].
5616: */
5617: SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void));
5618:
5619: /*
5620: ** CAPI3REF: Reset Automatic Extension Loading
5621: **
5622: ** ^This interface disables all automatic extensions previously
5623: ** registered using [sqlite3_auto_extension()].
5624: */
5625: SQLITE_API void sqlite3_reset_auto_extension(void);
5626:
5627: /*
5628: ** The interface to the virtual-table mechanism is currently considered
5629: ** to be experimental. The interface might change in incompatible ways.
5630: ** If this is a problem for you, do not use the interface at this time.
5631: **
5632: ** When the virtual-table mechanism stabilizes, we will declare the
5633: ** interface fixed, support it indefinitely, and remove this comment.
5634: */
5635:
5636: /*
5637: ** Structures used by the virtual table interface
5638: */
5639: typedef struct sqlite3_vtab sqlite3_vtab;
5640: typedef struct sqlite3_index_info sqlite3_index_info;
5641: typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor;
5642: typedef struct sqlite3_module sqlite3_module;
5643:
5644: /*
5645: ** CAPI3REF: Virtual Table Object
5646: ** KEYWORDS: sqlite3_module {virtual table module}
5647: **
5648: ** This structure, sometimes called a "virtual table module",
5649: ** defines the implementation of a [virtual tables].
5650: ** This structure consists mostly of methods for the module.
5651: **
5652: ** ^A virtual table module is created by filling in a persistent
5653: ** instance of this structure and passing a pointer to that instance
5654: ** to [sqlite3_create_module()] or [sqlite3_create_module_v2()].
5655: ** ^The registration remains valid until it is replaced by a different
5656: ** module or until the [database connection] closes. The content
5657: ** of this structure must not change while it is registered with
5658: ** any database connection.
5659: */
5660: struct sqlite3_module {
5661: int iVersion;
5662: int (*xCreate)(sqlite3*, void *pAux,
5663: int argc, const char *const*argv,
5664: sqlite3_vtab **ppVTab, char**);
5665: int (*xConnect)(sqlite3*, void *pAux,
5666: int argc, const char *const*argv,
5667: sqlite3_vtab **ppVTab, char**);
5668: int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);
5669: int (*xDisconnect)(sqlite3_vtab *pVTab);
5670: int (*xDestroy)(sqlite3_vtab *pVTab);
5671: int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor);
5672: int (*xClose)(sqlite3_vtab_cursor*);
5673: int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr,
5674: int argc, sqlite3_value **argv);
5675: int (*xNext)(sqlite3_vtab_cursor*);
5676: int (*xEof)(sqlite3_vtab_cursor*);
5677: int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int);
5678: int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid);
5679: int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *);
5680: int (*xBegin)(sqlite3_vtab *pVTab);
5681: int (*xSync)(sqlite3_vtab *pVTab);
5682: int (*xCommit)(sqlite3_vtab *pVTab);
5683: int (*xRollback)(sqlite3_vtab *pVTab);
5684: int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName,
5685: void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
5686: void **ppArg);
5687: int (*xRename)(sqlite3_vtab *pVtab, const char *zNew);
5688: /* The methods above are in version 1 of the sqlite_module object. Those
5689: ** below are for version 2 and greater. */
5690: int (*xSavepoint)(sqlite3_vtab *pVTab, int);
5691: int (*xRelease)(sqlite3_vtab *pVTab, int);
5692: int (*xRollbackTo)(sqlite3_vtab *pVTab, int);
5693: };
5694:
5695: /*
5696: ** CAPI3REF: Virtual Table Indexing Information
5697: ** KEYWORDS: sqlite3_index_info
5698: **
5699: ** The sqlite3_index_info structure and its substructures is used as part
5700: ** of the [virtual table] interface to
5701: ** pass information into and receive the reply from the [xBestIndex]
5702: ** method of a [virtual table module]. The fields under **Inputs** are the
5703: ** inputs to xBestIndex and are read-only. xBestIndex inserts its
5704: ** results into the **Outputs** fields.
5705: **
5706: ** ^(The aConstraint[] array records WHERE clause constraints of the form:
5707: **
5708: ** <blockquote>column OP expr</blockquote>
5709: **
5710: ** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is
5711: ** stored in aConstraint[].op using one of the
5712: ** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^
5713: ** ^(The index of the column is stored in
5714: ** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the
5715: ** expr on the right-hand side can be evaluated (and thus the constraint
5716: ** is usable) and false if it cannot.)^
5717: **
5718: ** ^The optimizer automatically inverts terms of the form "expr OP column"
5719: ** and makes other simplifications to the WHERE clause in an attempt to
5720: ** get as many WHERE clause terms into the form shown above as possible.
5721: ** ^The aConstraint[] array only reports WHERE clause terms that are
5722: ** relevant to the particular virtual table being queried.
5723: **
5724: ** ^Information about the ORDER BY clause is stored in aOrderBy[].
5725: ** ^Each term of aOrderBy records a column of the ORDER BY clause.
5726: **
5727: ** The [xBestIndex] method must fill aConstraintUsage[] with information
5728: ** about what parameters to pass to xFilter. ^If argvIndex>0 then
5729: ** the right-hand side of the corresponding aConstraint[] is evaluated
5730: ** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit
5731: ** is true, then the constraint is assumed to be fully handled by the
5732: ** virtual table and is not checked again by SQLite.)^
5733: **
5734: ** ^The idxNum and idxPtr values are recorded and passed into the
5735: ** [xFilter] method.
5736: ** ^[sqlite3_free()] is used to free idxPtr if and only if
5737: ** needToFreeIdxPtr is true.
5738: **
5739: ** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in
5740: ** the correct order to satisfy the ORDER BY clause so that no separate
5741: ** sorting step is required.
5742: **
5743: ** ^The estimatedCost value is an estimate of the cost of doing the
5744: ** particular lookup. A full scan of a table with N entries should have
5745: ** a cost of N. A binary search of a table of N entries should have a
5746: ** cost of approximately log(N).
5747: */
5748: struct sqlite3_index_info {
5749: /* Inputs */
5750: int nConstraint; /* Number of entries in aConstraint */
5751: struct sqlite3_index_constraint {
5752: int iColumn; /* Column on left-hand side of constraint */
5753: unsigned char op; /* Constraint operator */
5754: unsigned char usable; /* True if this constraint is usable */
5755: int iTermOffset; /* Used internally - xBestIndex should ignore */
5756: } *aConstraint; /* Table of WHERE clause constraints */
5757: int nOrderBy; /* Number of terms in the ORDER BY clause */
5758: struct sqlite3_index_orderby {
5759: int iColumn; /* Column number */
5760: unsigned char desc; /* True for DESC. False for ASC. */
5761: } *aOrderBy; /* The ORDER BY clause */
5762: /* Outputs */
5763: struct sqlite3_index_constraint_usage {
5764: int argvIndex; /* if >0, constraint is part of argv to xFilter */
5765: unsigned char omit; /* Do not code a test for this constraint */
5766: } *aConstraintUsage;
5767: int idxNum; /* Number used to identify the index */
5768: char *idxStr; /* String, possibly obtained from sqlite3_malloc */
5769: int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */
5770: int orderByConsumed; /* True if output is already ordered */
5771: double estimatedCost; /* Estimated cost of using this index */
5772: };
5773:
5774: /*
5775: ** CAPI3REF: Virtual Table Constraint Operator Codes
5776: **
5777: ** These macros defined the allowed values for the
5778: ** [sqlite3_index_info].aConstraint[].op field. Each value represents
5779: ** an operator that is part of a constraint term in the wHERE clause of
5780: ** a query that uses a [virtual table].
5781: */
5782: #define SQLITE_INDEX_CONSTRAINT_EQ 2
5783: #define SQLITE_INDEX_CONSTRAINT_GT 4
5784: #define SQLITE_INDEX_CONSTRAINT_LE 8
5785: #define SQLITE_INDEX_CONSTRAINT_LT 16
5786: #define SQLITE_INDEX_CONSTRAINT_GE 32
5787: #define SQLITE_INDEX_CONSTRAINT_MATCH 64
5788:
5789: /*
5790: ** CAPI3REF: Register A Virtual Table Implementation
5791: **
5792: ** ^These routines are used to register a new [virtual table module] name.
5793: ** ^Module names must be registered before
5794: ** creating a new [virtual table] using the module and before using a
5795: ** preexisting [virtual table] for the module.
5796: **
5797: ** ^The module name is registered on the [database connection] specified
5798: ** by the first parameter. ^The name of the module is given by the
5799: ** second parameter. ^The third parameter is a pointer to
5800: ** the implementation of the [virtual table module]. ^The fourth
5801: ** parameter is an arbitrary client data pointer that is passed through
5802: ** into the [xCreate] and [xConnect] methods of the virtual table module
5803: ** when a new virtual table is be being created or reinitialized.
5804: **
5805: ** ^The sqlite3_create_module_v2() interface has a fifth parameter which
5806: ** is a pointer to a destructor for the pClientData. ^SQLite will
5807: ** invoke the destructor function (if it is not NULL) when SQLite
5808: ** no longer needs the pClientData pointer. ^The destructor will also
5809: ** be invoked if the call to sqlite3_create_module_v2() fails.
5810: ** ^The sqlite3_create_module()
5811: ** interface is equivalent to sqlite3_create_module_v2() with a NULL
5812: ** destructor.
5813: */
5814: SQLITE_API int sqlite3_create_module(
5815: sqlite3 *db, /* SQLite connection to register module with */
5816: const char *zName, /* Name of the module */
5817: const sqlite3_module *p, /* Methods for the module */
5818: void *pClientData /* Client data for xCreate/xConnect */
5819: );
5820: SQLITE_API int sqlite3_create_module_v2(
5821: sqlite3 *db, /* SQLite connection to register module with */
5822: const char *zName, /* Name of the module */
5823: const sqlite3_module *p, /* Methods for the module */
5824: void *pClientData, /* Client data for xCreate/xConnect */
5825: void(*xDestroy)(void*) /* Module destructor function */
5826: );
5827:
5828: /*
5829: ** CAPI3REF: Virtual Table Instance Object
5830: ** KEYWORDS: sqlite3_vtab
5831: **
5832: ** Every [virtual table module] implementation uses a subclass
5833: ** of this object to describe a particular instance
5834: ** of the [virtual table]. Each subclass will
5835: ** be tailored to the specific needs of the module implementation.
5836: ** The purpose of this superclass is to define certain fields that are
5837: ** common to all module implementations.
5838: **
5839: ** ^Virtual tables methods can set an error message by assigning a
5840: ** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should
5841: ** take care that any prior string is freed by a call to [sqlite3_free()]
5842: ** prior to assigning a new string to zErrMsg. ^After the error message
5843: ** is delivered up to the client application, the string will be automatically
5844: ** freed by sqlite3_free() and the zErrMsg field will be zeroed.
5845: */
5846: struct sqlite3_vtab {
5847: const sqlite3_module *pModule; /* The module for this virtual table */
5848: int nRef; /* NO LONGER USED */
5849: char *zErrMsg; /* Error message from sqlite3_mprintf() */
5850: /* Virtual table implementations will typically add additional fields */
5851: };
5852:
5853: /*
5854: ** CAPI3REF: Virtual Table Cursor Object
5855: ** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor}
5856: **
5857: ** Every [virtual table module] implementation uses a subclass of the
5858: ** following structure to describe cursors that point into the
5859: ** [virtual table] and are used
5860: ** to loop through the virtual table. Cursors are created using the
5861: ** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed
5862: ** by the [sqlite3_module.xClose | xClose] method. Cursors are used
5863: ** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods
5864: ** of the module. Each module implementation will define
5865: ** the content of a cursor structure to suit its own needs.
5866: **
5867: ** This superclass exists in order to define fields of the cursor that
5868: ** are common to all implementations.
5869: */
5870: struct sqlite3_vtab_cursor {
5871: sqlite3_vtab *pVtab; /* Virtual table of this cursor */
5872: /* Virtual table implementations will typically add additional fields */
5873: };
5874:
5875: /*
5876: ** CAPI3REF: Declare The Schema Of A Virtual Table
5877: **
5878: ** ^The [xCreate] and [xConnect] methods of a
5879: ** [virtual table module] call this interface
5880: ** to declare the format (the names and datatypes of the columns) of
5881: ** the virtual tables they implement.
5882: */
5883: SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL);
5884:
5885: /*
5886: ** CAPI3REF: Overload A Function For A Virtual Table
5887: **
5888: ** ^(Virtual tables can provide alternative implementations of functions
5889: ** using the [xFindFunction] method of the [virtual table module].
5890: ** But global versions of those functions
5891: ** must exist in order to be overloaded.)^
5892: **
5893: ** ^(This API makes sure a global version of a function with a particular
5894: ** name and number of parameters exists. If no such function exists
5895: ** before this API is called, a new function is created.)^ ^The implementation
5896: ** of the new function always causes an exception to be thrown. So
5897: ** the new function is not good for anything by itself. Its only
5898: ** purpose is to be a placeholder function that can be overloaded
5899: ** by a [virtual table].
5900: */
5901: SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg);
5902:
5903: /*
5904: ** The interface to the virtual-table mechanism defined above (back up
5905: ** to a comment remarkably similar to this one) is currently considered
5906: ** to be experimental. The interface might change in incompatible ways.
5907: ** If this is a problem for you, do not use the interface at this time.
5908: **
5909: ** When the virtual-table mechanism stabilizes, we will declare the
5910: ** interface fixed, support it indefinitely, and remove this comment.
5911: */
5912:
5913: /*
5914: ** CAPI3REF: A Handle To An Open BLOB
5915: ** KEYWORDS: {BLOB handle} {BLOB handles}
5916: **
5917: ** An instance of this object represents an open BLOB on which
5918: ** [sqlite3_blob_open | incremental BLOB I/O] can be performed.
5919: ** ^Objects of this type are created by [sqlite3_blob_open()]
5920: ** and destroyed by [sqlite3_blob_close()].
5921: ** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces
5922: ** can be used to read or write small subsections of the BLOB.
5923: ** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes.
5924: */
5925: typedef struct sqlite3_blob sqlite3_blob;
5926:
5927: /*
5928: ** CAPI3REF: Open A BLOB For Incremental I/O
5929: **
5930: ** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located
5931: ** in row iRow, column zColumn, table zTable in database zDb;
5932: ** in other words, the same BLOB that would be selected by:
5933: **
5934: ** <pre>
5935: ** SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
5936: ** </pre>)^
5937: **
5938: ** ^If the flags parameter is non-zero, then the BLOB is opened for read
5939: ** and write access. ^If it is zero, the BLOB is opened for read access.
5940: ** ^It is not possible to open a column that is part of an index or primary
5941: ** key for writing. ^If [foreign key constraints] are enabled, it is
5942: ** not possible to open a column that is part of a [child key] for writing.
5943: **
5944: ** ^Note that the database name is not the filename that contains
5945: ** the database but rather the symbolic name of the database that
5946: ** appears after the AS keyword when the database is connected using [ATTACH].
5947: ** ^For the main database file, the database name is "main".
5948: ** ^For TEMP tables, the database name is "temp".
5949: **
5950: ** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written
5951: ** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set
5952: ** to be a null pointer.)^
5953: ** ^This function sets the [database connection] error code and message
5954: ** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related
5955: ** functions. ^Note that the *ppBlob variable is always initialized in a
5956: ** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob
5957: ** regardless of the success or failure of this routine.
5958: **
5959: ** ^(If the row that a BLOB handle points to is modified by an
5960: ** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects
5961: ** then the BLOB handle is marked as "expired".
5962: ** This is true if any column of the row is changed, even a column
5963: ** other than the one the BLOB handle is open on.)^
5964: ** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for
5965: ** an expired BLOB handle fail with a return code of [SQLITE_ABORT].
5966: ** ^(Changes written into a BLOB prior to the BLOB expiring are not
5967: ** rolled back by the expiration of the BLOB. Such changes will eventually
5968: ** commit if the transaction continues to completion.)^
5969: **
5970: ** ^Use the [sqlite3_blob_bytes()] interface to determine the size of
5971: ** the opened blob. ^The size of a blob may not be changed by this
5972: ** interface. Use the [UPDATE] SQL command to change the size of a
5973: ** blob.
5974: **
5975: ** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces
5976: ** and the built-in [zeroblob] SQL function can be used, if desired,
5977: ** to create an empty, zero-filled blob in which to read or write using
5978: ** this interface.
5979: **
5980: ** To avoid a resource leak, every open [BLOB handle] should eventually
5981: ** be released by a call to [sqlite3_blob_close()].
5982: */
5983: SQLITE_API int sqlite3_blob_open(
5984: sqlite3*,
5985: const char *zDb,
5986: const char *zTable,
5987: const char *zColumn,
5988: sqlite3_int64 iRow,
5989: int flags,
5990: sqlite3_blob **ppBlob
5991: );
5992:
5993: /*
5994: ** CAPI3REF: Move a BLOB Handle to a New Row
5995: **
5996: ** ^This function is used to move an existing blob handle so that it points
5997: ** to a different row of the same database table. ^The new row is identified
5998: ** by the rowid value passed as the second argument. Only the row can be
5999: ** changed. ^The database, table and column on which the blob handle is open
6000: ** remain the same. Moving an existing blob handle to a new row can be
6001: ** faster than closing the existing handle and opening a new one.
6002: **
6003: ** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] -
6004: ** it must exist and there must be either a blob or text value stored in
6005: ** the nominated column.)^ ^If the new row is not present in the table, or if
6006: ** it does not contain a blob or text value, or if another error occurs, an
6007: ** SQLite error code is returned and the blob handle is considered aborted.
6008: ** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or
6009: ** [sqlite3_blob_reopen()] on an aborted blob handle immediately return
6010: ** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle
6011: ** always returns zero.
6012: **
6013: ** ^This function sets the database handle error code and message.
6014: */
6015: SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64);
6016:
6017: /*
6018: ** CAPI3REF: Close A BLOB Handle
6019: **
6020: ** ^Closes an open [BLOB handle].
6021: **
6022: ** ^Closing a BLOB shall cause the current transaction to commit
6023: ** if there are no other BLOBs, no pending prepared statements, and the
6024: ** database connection is in [autocommit mode].
6025: ** ^If any writes were made to the BLOB, they might be held in cache
6026: ** until the close operation if they will fit.
6027: **
6028: ** ^(Closing the BLOB often forces the changes
6029: ** out to disk and so if any I/O errors occur, they will likely occur
6030: ** at the time when the BLOB is closed. Any errors that occur during
6031: ** closing are reported as a non-zero return value.)^
6032: **
6033: ** ^(The BLOB is closed unconditionally. Even if this routine returns
6034: ** an error code, the BLOB is still closed.)^
6035: **
6036: ** ^Calling this routine with a null pointer (such as would be returned
6037: ** by a failed call to [sqlite3_blob_open()]) is a harmless no-op.
6038: */
6039: SQLITE_API int sqlite3_blob_close(sqlite3_blob *);
6040:
6041: /*
6042: ** CAPI3REF: Return The Size Of An Open BLOB
6043: **
6044: ** ^Returns the size in bytes of the BLOB accessible via the
6045: ** successfully opened [BLOB handle] in its only argument. ^The
6046: ** incremental blob I/O routines can only read or overwriting existing
6047: ** blob content; they cannot change the size of a blob.
6048: **
6049: ** This routine only works on a [BLOB handle] which has been created
6050: ** by a prior successful call to [sqlite3_blob_open()] and which has not
6051: ** been closed by [sqlite3_blob_close()]. Passing any other pointer in
6052: ** to this routine results in undefined and probably undesirable behavior.
6053: */
6054: SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *);
6055:
6056: /*
6057: ** CAPI3REF: Read Data From A BLOB Incrementally
6058: **
6059: ** ^(This function is used to read data from an open [BLOB handle] into a
6060: ** caller-supplied buffer. N bytes of data are copied into buffer Z
6061: ** from the open BLOB, starting at offset iOffset.)^
6062: **
6063: ** ^If offset iOffset is less than N bytes from the end of the BLOB,
6064: ** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is
6065: ** less than zero, [SQLITE_ERROR] is returned and no data is read.
6066: ** ^The size of the blob (and hence the maximum value of N+iOffset)
6067: ** can be determined using the [sqlite3_blob_bytes()] interface.
6068: **
6069: ** ^An attempt to read from an expired [BLOB handle] fails with an
6070: ** error code of [SQLITE_ABORT].
6071: **
6072: ** ^(On success, sqlite3_blob_read() returns SQLITE_OK.
6073: ** Otherwise, an [error code] or an [extended error code] is returned.)^
6074: **
6075: ** This routine only works on a [BLOB handle] which has been created
6076: ** by a prior successful call to [sqlite3_blob_open()] and which has not
6077: ** been closed by [sqlite3_blob_close()]. Passing any other pointer in
6078: ** to this routine results in undefined and probably undesirable behavior.
6079: **
6080: ** See also: [sqlite3_blob_write()].
6081: */
6082: SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset);
6083:
6084: /*
6085: ** CAPI3REF: Write Data Into A BLOB Incrementally
6086: **
6087: ** ^This function is used to write data into an open [BLOB handle] from a
6088: ** caller-supplied buffer. ^N bytes of data are copied from the buffer Z
6089: ** into the open BLOB, starting at offset iOffset.
6090: **
6091: ** ^If the [BLOB handle] passed as the first argument was not opened for
6092: ** writing (the flags parameter to [sqlite3_blob_open()] was zero),
6093: ** this function returns [SQLITE_READONLY].
6094: **
6095: ** ^This function may only modify the contents of the BLOB; it is
6096: ** not possible to increase the size of a BLOB using this API.
6097: ** ^If offset iOffset is less than N bytes from the end of the BLOB,
6098: ** [SQLITE_ERROR] is returned and no data is written. ^If N is
6099: ** less than zero [SQLITE_ERROR] is returned and no data is written.
6100: ** The size of the BLOB (and hence the maximum value of N+iOffset)
6101: ** can be determined using the [sqlite3_blob_bytes()] interface.
6102: **
6103: ** ^An attempt to write to an expired [BLOB handle] fails with an
6104: ** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred
6105: ** before the [BLOB handle] expired are not rolled back by the
6106: ** expiration of the handle, though of course those changes might
6107: ** have been overwritten by the statement that expired the BLOB handle
6108: ** or by other independent statements.
6109: **
6110: ** ^(On success, sqlite3_blob_write() returns SQLITE_OK.
6111: ** Otherwise, an [error code] or an [extended error code] is returned.)^
6112: **
6113: ** This routine only works on a [BLOB handle] which has been created
6114: ** by a prior successful call to [sqlite3_blob_open()] and which has not
6115: ** been closed by [sqlite3_blob_close()]. Passing any other pointer in
6116: ** to this routine results in undefined and probably undesirable behavior.
6117: **
6118: ** See also: [sqlite3_blob_read()].
6119: */
6120: SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset);
6121:
6122: /*
6123: ** CAPI3REF: Virtual File System Objects
6124: **
6125: ** A virtual filesystem (VFS) is an [sqlite3_vfs] object
6126: ** that SQLite uses to interact
6127: ** with the underlying operating system. Most SQLite builds come with a
6128: ** single default VFS that is appropriate for the host computer.
6129: ** New VFSes can be registered and existing VFSes can be unregistered.
6130: ** The following interfaces are provided.
6131: **
6132: ** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name.
6133: ** ^Names are case sensitive.
6134: ** ^Names are zero-terminated UTF-8 strings.
6135: ** ^If there is no match, a NULL pointer is returned.
6136: ** ^If zVfsName is NULL then the default VFS is returned.
6137: **
6138: ** ^New VFSes are registered with sqlite3_vfs_register().
6139: ** ^Each new VFS becomes the default VFS if the makeDflt flag is set.
6140: ** ^The same VFS can be registered multiple times without injury.
6141: ** ^To make an existing VFS into the default VFS, register it again
6142: ** with the makeDflt flag set. If two different VFSes with the
6143: ** same name are registered, the behavior is undefined. If a
6144: ** VFS is registered with a name that is NULL or an empty string,
6145: ** then the behavior is undefined.
6146: **
6147: ** ^Unregister a VFS with the sqlite3_vfs_unregister() interface.
6148: ** ^(If the default VFS is unregistered, another VFS is chosen as
6149: ** the default. The choice for the new VFS is arbitrary.)^
6150: */
6151: SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName);
6152: SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt);
6153: SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*);
6154:
6155: /*
6156: ** CAPI3REF: Mutexes
6157: **
6158: ** The SQLite core uses these routines for thread
6159: ** synchronization. Though they are intended for internal
6160: ** use by SQLite, code that links against SQLite is
6161: ** permitted to use any of these routines.
6162: **
6163: ** The SQLite source code contains multiple implementations
6164: ** of these mutex routines. An appropriate implementation
6165: ** is selected automatically at compile-time. ^(The following
6166: ** implementations are available in the SQLite core:
6167: **
6168: ** <ul>
6169: ** <li> SQLITE_MUTEX_PTHREADS
6170: ** <li> SQLITE_MUTEX_W32
6171: ** <li> SQLITE_MUTEX_NOOP
6172: ** </ul>)^
6173: **
6174: ** ^The SQLITE_MUTEX_NOOP implementation is a set of routines
6175: ** that does no real locking and is appropriate for use in
1.2.2.1 ! misho 6176: ** a single-threaded application. ^The SQLITE_MUTEX_PTHREADS and
! 6177: ** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix
! 6178: ** and Windows.
1.2 misho 6179: **
6180: ** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor
6181: ** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex
6182: ** implementation is included with the library. In this case the
6183: ** application must supply a custom mutex implementation using the
6184: ** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function
6185: ** before calling sqlite3_initialize() or any other public sqlite3_
6186: ** function that calls sqlite3_initialize().)^
6187: **
6188: ** ^The sqlite3_mutex_alloc() routine allocates a new
6189: ** mutex and returns a pointer to it. ^If it returns NULL
6190: ** that means that a mutex could not be allocated. ^SQLite
6191: ** will unwind its stack and return an error. ^(The argument
6192: ** to sqlite3_mutex_alloc() is one of these integer constants:
6193: **
6194: ** <ul>
6195: ** <li> SQLITE_MUTEX_FAST
6196: ** <li> SQLITE_MUTEX_RECURSIVE
6197: ** <li> SQLITE_MUTEX_STATIC_MASTER
6198: ** <li> SQLITE_MUTEX_STATIC_MEM
6199: ** <li> SQLITE_MUTEX_STATIC_MEM2
6200: ** <li> SQLITE_MUTEX_STATIC_PRNG
6201: ** <li> SQLITE_MUTEX_STATIC_LRU
6202: ** <li> SQLITE_MUTEX_STATIC_LRU2
6203: ** </ul>)^
6204: **
6205: ** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE)
6206: ** cause sqlite3_mutex_alloc() to create
6207: ** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
6208: ** is used but not necessarily so when SQLITE_MUTEX_FAST is used.
6209: ** The mutex implementation does not need to make a distinction
6210: ** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
6211: ** not want to. ^SQLite will only request a recursive mutex in
6212: ** cases where it really needs one. ^If a faster non-recursive mutex
6213: ** implementation is available on the host platform, the mutex subsystem
6214: ** might return such a mutex in response to SQLITE_MUTEX_FAST.
6215: **
6216: ** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other
6217: ** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return
6218: ** a pointer to a static preexisting mutex. ^Six static mutexes are
6219: ** used by the current version of SQLite. Future versions of SQLite
6220: ** may add additional static mutexes. Static mutexes are for internal
6221: ** use by SQLite only. Applications that use SQLite mutexes should
6222: ** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
6223: ** SQLITE_MUTEX_RECURSIVE.
6224: **
6225: ** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
6226: ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
6227: ** returns a different mutex on every call. ^But for the static
6228: ** mutex types, the same mutex is returned on every call that has
6229: ** the same type number.
6230: **
6231: ** ^The sqlite3_mutex_free() routine deallocates a previously
6232: ** allocated dynamic mutex. ^SQLite is careful to deallocate every
6233: ** dynamic mutex that it allocates. The dynamic mutexes must not be in
6234: ** use when they are deallocated. Attempting to deallocate a static
6235: ** mutex results in undefined behavior. ^SQLite never deallocates
6236: ** a static mutex.
6237: **
6238: ** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
6239: ** to enter a mutex. ^If another thread is already within the mutex,
6240: ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
6241: ** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK]
6242: ** upon successful entry. ^(Mutexes created using
6243: ** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread.
6244: ** In such cases the,
6245: ** mutex must be exited an equal number of times before another thread
6246: ** can enter.)^ ^(If the same thread tries to enter any other
6247: ** kind of mutex more than once, the behavior is undefined.
6248: ** SQLite will never exhibit
6249: ** such behavior in its own use of mutexes.)^
6250: **
6251: ** ^(Some systems (for example, Windows 95) do not support the operation
6252: ** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try()
6253: ** will always return SQLITE_BUSY. The SQLite core only ever uses
6254: ** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^
6255: **
6256: ** ^The sqlite3_mutex_leave() routine exits a mutex that was
6257: ** previously entered by the same thread. ^(The behavior
6258: ** is undefined if the mutex is not currently entered by the
6259: ** calling thread or is not currently allocated. SQLite will
6260: ** never do either.)^
6261: **
6262: ** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
6263: ** sqlite3_mutex_leave() is a NULL pointer, then all three routines
6264: ** behave as no-ops.
6265: **
6266: ** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
6267: */
6268: SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int);
6269: SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*);
6270: SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*);
6271: SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*);
6272: SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*);
6273:
6274: /*
6275: ** CAPI3REF: Mutex Methods Object
6276: **
6277: ** An instance of this structure defines the low-level routines
6278: ** used to allocate and use mutexes.
6279: **
6280: ** Usually, the default mutex implementations provided by SQLite are
6281: ** sufficient, however the user has the option of substituting a custom
6282: ** implementation for specialized deployments or systems for which SQLite
6283: ** does not provide a suitable implementation. In this case, the user
6284: ** creates and populates an instance of this structure to pass
6285: ** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option.
6286: ** Additionally, an instance of this structure can be used as an
6287: ** output variable when querying the system for the current mutex
6288: ** implementation, using the [SQLITE_CONFIG_GETMUTEX] option.
6289: **
6290: ** ^The xMutexInit method defined by this structure is invoked as
6291: ** part of system initialization by the sqlite3_initialize() function.
6292: ** ^The xMutexInit routine is called by SQLite exactly once for each
6293: ** effective call to [sqlite3_initialize()].
6294: **
6295: ** ^The xMutexEnd method defined by this structure is invoked as
6296: ** part of system shutdown by the sqlite3_shutdown() function. The
6297: ** implementation of this method is expected to release all outstanding
6298: ** resources obtained by the mutex methods implementation, especially
6299: ** those obtained by the xMutexInit method. ^The xMutexEnd()
6300: ** interface is invoked exactly once for each call to [sqlite3_shutdown()].
6301: **
6302: ** ^(The remaining seven methods defined by this structure (xMutexAlloc,
6303: ** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and
6304: ** xMutexNotheld) implement the following interfaces (respectively):
6305: **
6306: ** <ul>
6307: ** <li> [sqlite3_mutex_alloc()] </li>
6308: ** <li> [sqlite3_mutex_free()] </li>
6309: ** <li> [sqlite3_mutex_enter()] </li>
6310: ** <li> [sqlite3_mutex_try()] </li>
6311: ** <li> [sqlite3_mutex_leave()] </li>
6312: ** <li> [sqlite3_mutex_held()] </li>
6313: ** <li> [sqlite3_mutex_notheld()] </li>
6314: ** </ul>)^
6315: **
6316: ** The only difference is that the public sqlite3_XXX functions enumerated
6317: ** above silently ignore any invocations that pass a NULL pointer instead
6318: ** of a valid mutex handle. The implementations of the methods defined
6319: ** by this structure are not required to handle this case, the results
6320: ** of passing a NULL pointer instead of a valid mutex handle are undefined
6321: ** (i.e. it is acceptable to provide an implementation that segfaults if
6322: ** it is passed a NULL pointer).
6323: **
6324: ** The xMutexInit() method must be threadsafe. ^It must be harmless to
6325: ** invoke xMutexInit() multiple times within the same process and without
6326: ** intervening calls to xMutexEnd(). Second and subsequent calls to
6327: ** xMutexInit() must be no-ops.
6328: **
6329: ** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()]
6330: ** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory
6331: ** allocation for a static mutex. ^However xMutexAlloc() may use SQLite
6332: ** memory allocation for a fast or recursive mutex.
6333: **
6334: ** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is
6335: ** called, but only if the prior call to xMutexInit returned SQLITE_OK.
6336: ** If xMutexInit fails in any way, it is expected to clean up after itself
6337: ** prior to returning.
6338: */
6339: typedef struct sqlite3_mutex_methods sqlite3_mutex_methods;
6340: struct sqlite3_mutex_methods {
6341: int (*xMutexInit)(void);
6342: int (*xMutexEnd)(void);
6343: sqlite3_mutex *(*xMutexAlloc)(int);
6344: void (*xMutexFree)(sqlite3_mutex *);
6345: void (*xMutexEnter)(sqlite3_mutex *);
6346: int (*xMutexTry)(sqlite3_mutex *);
6347: void (*xMutexLeave)(sqlite3_mutex *);
6348: int (*xMutexHeld)(sqlite3_mutex *);
6349: int (*xMutexNotheld)(sqlite3_mutex *);
6350: };
6351:
6352: /*
6353: ** CAPI3REF: Mutex Verification Routines
6354: **
6355: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines
6356: ** are intended for use inside assert() statements. ^The SQLite core
6357: ** never uses these routines except inside an assert() and applications
6358: ** are advised to follow the lead of the core. ^The SQLite core only
6359: ** provides implementations for these routines when it is compiled
6360: ** with the SQLITE_DEBUG flag. ^External mutex implementations
6361: ** are only required to provide these routines if SQLITE_DEBUG is
6362: ** defined and if NDEBUG is not defined.
6363: **
6364: ** ^These routines should return true if the mutex in their argument
6365: ** is held or not held, respectively, by the calling thread.
6366: **
6367: ** ^The implementation is not required to provide versions of these
6368: ** routines that actually work. If the implementation does not provide working
6369: ** versions of these routines, it should at least provide stubs that always
6370: ** return true so that one does not get spurious assertion failures.
6371: **
6372: ** ^If the argument to sqlite3_mutex_held() is a NULL pointer then
6373: ** the routine should return 1. This seems counter-intuitive since
6374: ** clearly the mutex cannot be held if it does not exist. But
6375: ** the reason the mutex does not exist is because the build is not
6376: ** using mutexes. And we do not want the assert() containing the
6377: ** call to sqlite3_mutex_held() to fail, so a non-zero return is
6378: ** the appropriate thing to do. ^The sqlite3_mutex_notheld()
6379: ** interface should also return 1 when given a NULL pointer.
6380: */
6381: #ifndef NDEBUG
6382: SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*);
6383: SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*);
6384: #endif
6385:
6386: /*
6387: ** CAPI3REF: Mutex Types
6388: **
6389: ** The [sqlite3_mutex_alloc()] interface takes a single argument
6390: ** which is one of these integer constants.
6391: **
6392: ** The set of static mutexes may change from one SQLite release to the
6393: ** next. Applications that override the built-in mutex logic must be
6394: ** prepared to accommodate additional static mutexes.
6395: */
6396: #define SQLITE_MUTEX_FAST 0
6397: #define SQLITE_MUTEX_RECURSIVE 1
6398: #define SQLITE_MUTEX_STATIC_MASTER 2
6399: #define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */
6400: #define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */
6401: #define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */
6402: #define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */
6403: #define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */
6404: #define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */
6405: #define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */
6406:
6407: /*
6408: ** CAPI3REF: Retrieve the mutex for a database connection
6409: **
6410: ** ^This interface returns a pointer the [sqlite3_mutex] object that
6411: ** serializes access to the [database connection] given in the argument
6412: ** when the [threading mode] is Serialized.
6413: ** ^If the [threading mode] is Single-thread or Multi-thread then this
6414: ** routine returns a NULL pointer.
6415: */
6416: SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*);
6417:
6418: /*
6419: ** CAPI3REF: Low-Level Control Of Database Files
6420: **
6421: ** ^The [sqlite3_file_control()] interface makes a direct call to the
6422: ** xFileControl method for the [sqlite3_io_methods] object associated
6423: ** with a particular database identified by the second argument. ^The
6424: ** name of the database is "main" for the main database or "temp" for the
6425: ** TEMP database, or the name that appears after the AS keyword for
6426: ** databases that are added using the [ATTACH] SQL command.
6427: ** ^A NULL pointer can be used in place of "main" to refer to the
6428: ** main database file.
6429: ** ^The third and fourth parameters to this routine
6430: ** are passed directly through to the second and third parameters of
6431: ** the xFileControl method. ^The return value of the xFileControl
6432: ** method becomes the return value of this routine.
6433: **
6434: ** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes
6435: ** a pointer to the underlying [sqlite3_file] object to be written into
6436: ** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER
6437: ** case is a short-circuit path which does not actually invoke the
6438: ** underlying sqlite3_io_methods.xFileControl method.
6439: **
6440: ** ^If the second parameter (zDbName) does not match the name of any
6441: ** open database file, then SQLITE_ERROR is returned. ^This error
6442: ** code is not remembered and will not be recalled by [sqlite3_errcode()]
6443: ** or [sqlite3_errmsg()]. The underlying xFileControl method might
6444: ** also return SQLITE_ERROR. There is no way to distinguish between
6445: ** an incorrect zDbName and an SQLITE_ERROR return from the underlying
6446: ** xFileControl method.
6447: **
6448: ** See also: [SQLITE_FCNTL_LOCKSTATE]
6449: */
6450: SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*);
6451:
6452: /*
6453: ** CAPI3REF: Testing Interface
6454: **
6455: ** ^The sqlite3_test_control() interface is used to read out internal
6456: ** state of SQLite and to inject faults into SQLite for testing
6457: ** purposes. ^The first parameter is an operation code that determines
6458: ** the number, meaning, and operation of all subsequent parameters.
6459: **
6460: ** This interface is not for use by applications. It exists solely
6461: ** for verifying the correct operation of the SQLite library. Depending
6462: ** on how the SQLite library is compiled, this interface might not exist.
6463: **
6464: ** The details of the operation codes, their meanings, the parameters
6465: ** they take, and what they do are all subject to change without notice.
6466: ** Unlike most of the SQLite API, this function is not guaranteed to
6467: ** operate consistently from one release to the next.
6468: */
6469: SQLITE_API int sqlite3_test_control(int op, ...);
6470:
6471: /*
6472: ** CAPI3REF: Testing Interface Operation Codes
6473: **
6474: ** These constants are the valid operation code parameters used
6475: ** as the first argument to [sqlite3_test_control()].
6476: **
6477: ** These parameters and their meanings are subject to change
6478: ** without notice. These values are for testing purposes only.
6479: ** Applications should not use any of these parameters or the
6480: ** [sqlite3_test_control()] interface.
6481: */
6482: #define SQLITE_TESTCTRL_FIRST 5
6483: #define SQLITE_TESTCTRL_PRNG_SAVE 5
6484: #define SQLITE_TESTCTRL_PRNG_RESTORE 6
6485: #define SQLITE_TESTCTRL_PRNG_RESET 7
6486: #define SQLITE_TESTCTRL_BITVEC_TEST 8
6487: #define SQLITE_TESTCTRL_FAULT_INSTALL 9
6488: #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10
6489: #define SQLITE_TESTCTRL_PENDING_BYTE 11
6490: #define SQLITE_TESTCTRL_ASSERT 12
6491: #define SQLITE_TESTCTRL_ALWAYS 13
6492: #define SQLITE_TESTCTRL_RESERVE 14
6493: #define SQLITE_TESTCTRL_OPTIMIZATIONS 15
6494: #define SQLITE_TESTCTRL_ISKEYWORD 16
6495: #define SQLITE_TESTCTRL_SCRATCHMALLOC 17
6496: #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
6497: #define SQLITE_TESTCTRL_EXPLAIN_STMT 19
6498: #define SQLITE_TESTCTRL_LAST 19
6499:
6500: /*
6501: ** CAPI3REF: SQLite Runtime Status
6502: **
6503: ** ^This interface is used to retrieve runtime status information
6504: ** about the performance of SQLite, and optionally to reset various
6505: ** highwater marks. ^The first argument is an integer code for
6506: ** the specific parameter to measure. ^(Recognized integer codes
6507: ** are of the form [status parameters | SQLITE_STATUS_...].)^
6508: ** ^The current value of the parameter is returned into *pCurrent.
6509: ** ^The highest recorded value is returned in *pHighwater. ^If the
6510: ** resetFlag is true, then the highest record value is reset after
6511: ** *pHighwater is written. ^(Some parameters do not record the highest
6512: ** value. For those parameters
6513: ** nothing is written into *pHighwater and the resetFlag is ignored.)^
6514: ** ^(Other parameters record only the highwater mark and not the current
6515: ** value. For these latter parameters nothing is written into *pCurrent.)^
6516: **
6517: ** ^The sqlite3_status() routine returns SQLITE_OK on success and a
6518: ** non-zero [error code] on failure.
6519: **
6520: ** This routine is threadsafe but is not atomic. This routine can be
6521: ** called while other threads are running the same or different SQLite
6522: ** interfaces. However the values returned in *pCurrent and
6523: ** *pHighwater reflect the status of SQLite at different points in time
6524: ** and it is possible that another thread might change the parameter
6525: ** in between the times when *pCurrent and *pHighwater are written.
6526: **
6527: ** See also: [sqlite3_db_status()]
6528: */
6529: SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag);
6530:
6531:
6532: /*
6533: ** CAPI3REF: Status Parameters
6534: ** KEYWORDS: {status parameters}
6535: **
6536: ** These integer constants designate various run-time status parameters
6537: ** that can be returned by [sqlite3_status()].
6538: **
6539: ** <dl>
6540: ** [[SQLITE_STATUS_MEMORY_USED]] ^(<dt>SQLITE_STATUS_MEMORY_USED</dt>
6541: ** <dd>This parameter is the current amount of memory checked out
6542: ** using [sqlite3_malloc()], either directly or indirectly. The
6543: ** figure includes calls made to [sqlite3_malloc()] by the application
6544: ** and internal memory usage by the SQLite library. Scratch memory
6545: ** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache
6546: ** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in
6547: ** this parameter. The amount returned is the sum of the allocation
6548: ** sizes as reported by the xSize method in [sqlite3_mem_methods].</dd>)^
6549: **
6550: ** [[SQLITE_STATUS_MALLOC_SIZE]] ^(<dt>SQLITE_STATUS_MALLOC_SIZE</dt>
6551: ** <dd>This parameter records the largest memory allocation request
6552: ** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their
6553: ** internal equivalents). Only the value returned in the
6554: ** *pHighwater parameter to [sqlite3_status()] is of interest.
6555: ** The value written into the *pCurrent parameter is undefined.</dd>)^
6556: **
6557: ** [[SQLITE_STATUS_MALLOC_COUNT]] ^(<dt>SQLITE_STATUS_MALLOC_COUNT</dt>
6558: ** <dd>This parameter records the number of separate memory allocations
6559: ** currently checked out.</dd>)^
6560: **
6561: ** [[SQLITE_STATUS_PAGECACHE_USED]] ^(<dt>SQLITE_STATUS_PAGECACHE_USED</dt>
6562: ** <dd>This parameter returns the number of pages used out of the
6563: ** [pagecache memory allocator] that was configured using
6564: ** [SQLITE_CONFIG_PAGECACHE]. The
6565: ** value returned is in pages, not in bytes.</dd>)^
6566: **
6567: ** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]]
6568: ** ^(<dt>SQLITE_STATUS_PAGECACHE_OVERFLOW</dt>
6569: ** <dd>This parameter returns the number of bytes of page cache
6570: ** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE]
6571: ** buffer and where forced to overflow to [sqlite3_malloc()]. The
6572: ** returned value includes allocations that overflowed because they
6573: ** where too large (they were larger than the "sz" parameter to
6574: ** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because
6575: ** no space was left in the page cache.</dd>)^
6576: **
6577: ** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(<dt>SQLITE_STATUS_PAGECACHE_SIZE</dt>
6578: ** <dd>This parameter records the largest memory allocation request
6579: ** handed to [pagecache memory allocator]. Only the value returned in the
6580: ** *pHighwater parameter to [sqlite3_status()] is of interest.
6581: ** The value written into the *pCurrent parameter is undefined.</dd>)^
6582: **
6583: ** [[SQLITE_STATUS_SCRATCH_USED]] ^(<dt>SQLITE_STATUS_SCRATCH_USED</dt>
6584: ** <dd>This parameter returns the number of allocations used out of the
6585: ** [scratch memory allocator] configured using
6586: ** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not
6587: ** in bytes. Since a single thread may only have one scratch allocation
6588: ** outstanding at time, this parameter also reports the number of threads
6589: ** using scratch memory at the same time.</dd>)^
6590: **
6591: ** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(<dt>SQLITE_STATUS_SCRATCH_OVERFLOW</dt>
6592: ** <dd>This parameter returns the number of bytes of scratch memory
6593: ** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH]
6594: ** buffer and where forced to overflow to [sqlite3_malloc()]. The values
6595: ** returned include overflows because the requested allocation was too
6596: ** larger (that is, because the requested allocation was larger than the
6597: ** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer
6598: ** slots were available.
6599: ** </dd>)^
6600: **
6601: ** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(<dt>SQLITE_STATUS_SCRATCH_SIZE</dt>
6602: ** <dd>This parameter records the largest memory allocation request
6603: ** handed to [scratch memory allocator]. Only the value returned in the
6604: ** *pHighwater parameter to [sqlite3_status()] is of interest.
6605: ** The value written into the *pCurrent parameter is undefined.</dd>)^
6606: **
6607: ** [[SQLITE_STATUS_PARSER_STACK]] ^(<dt>SQLITE_STATUS_PARSER_STACK</dt>
6608: ** <dd>This parameter records the deepest parser stack. It is only
6609: ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>)^
6610: ** </dl>
6611: **
6612: ** New status parameters may be added from time to time.
6613: */
6614: #define SQLITE_STATUS_MEMORY_USED 0
6615: #define SQLITE_STATUS_PAGECACHE_USED 1
6616: #define SQLITE_STATUS_PAGECACHE_OVERFLOW 2
6617: #define SQLITE_STATUS_SCRATCH_USED 3
6618: #define SQLITE_STATUS_SCRATCH_OVERFLOW 4
6619: #define SQLITE_STATUS_MALLOC_SIZE 5
6620: #define SQLITE_STATUS_PARSER_STACK 6
6621: #define SQLITE_STATUS_PAGECACHE_SIZE 7
6622: #define SQLITE_STATUS_SCRATCH_SIZE 8
6623: #define SQLITE_STATUS_MALLOC_COUNT 9
6624:
6625: /*
6626: ** CAPI3REF: Database Connection Status
6627: **
6628: ** ^This interface is used to retrieve runtime status information
6629: ** about a single [database connection]. ^The first argument is the
6630: ** database connection object to be interrogated. ^The second argument
6631: ** is an integer constant, taken from the set of
6632: ** [SQLITE_DBSTATUS options], that
6633: ** determines the parameter to interrogate. The set of
6634: ** [SQLITE_DBSTATUS options] is likely
6635: ** to grow in future releases of SQLite.
6636: **
6637: ** ^The current value of the requested parameter is written into *pCur
6638: ** and the highest instantaneous value is written into *pHiwtr. ^If
6639: ** the resetFlg is true, then the highest instantaneous value is
6640: ** reset back down to the current value.
6641: **
6642: ** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a
6643: ** non-zero [error code] on failure.
6644: **
6645: ** See also: [sqlite3_status()] and [sqlite3_stmt_status()].
6646: */
6647: SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg);
6648:
6649: /*
6650: ** CAPI3REF: Status Parameters for database connections
6651: ** KEYWORDS: {SQLITE_DBSTATUS options}
6652: **
6653: ** These constants are the available integer "verbs" that can be passed as
6654: ** the second argument to the [sqlite3_db_status()] interface.
6655: **
6656: ** New verbs may be added in future releases of SQLite. Existing verbs
6657: ** might be discontinued. Applications should check the return code from
6658: ** [sqlite3_db_status()] to make sure that the call worked.
6659: ** The [sqlite3_db_status()] interface will return a non-zero error code
6660: ** if a discontinued or unsupported verb is invoked.
6661: **
6662: ** <dl>
6663: ** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_USED</dt>
6664: ** <dd>This parameter returns the number of lookaside memory slots currently
6665: ** checked out.</dd>)^
6666: **
6667: ** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_HIT</dt>
6668: ** <dd>This parameter returns the number malloc attempts that were
6669: ** satisfied using lookaside memory. Only the high-water value is meaningful;
6670: ** the current value is always zero.)^
6671: **
6672: ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]]
6673: ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE</dt>
6674: ** <dd>This parameter returns the number malloc attempts that might have
6675: ** been satisfied using lookaside memory but failed due to the amount of
6676: ** memory requested being larger than the lookaside slot size.
6677: ** Only the high-water value is meaningful;
6678: ** the current value is always zero.)^
6679: **
6680: ** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]]
6681: ** ^(<dt>SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL</dt>
6682: ** <dd>This parameter returns the number malloc attempts that might have
6683: ** been satisfied using lookaside memory but failed due to all lookaside
6684: ** memory already being in use.
6685: ** Only the high-water value is meaningful;
6686: ** the current value is always zero.)^
6687: **
6688: ** [[SQLITE_DBSTATUS_CACHE_USED]] ^(<dt>SQLITE_DBSTATUS_CACHE_USED</dt>
6689: ** <dd>This parameter returns the approximate number of of bytes of heap
6690: ** memory used by all pager caches associated with the database connection.)^
6691: ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0.
6692: **
6693: ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt>
6694: ** <dd>This parameter returns the approximate number of of bytes of heap
6695: ** memory used to store the schema for all databases associated
6696: ** with the connection - main, temp, and any [ATTACH]-ed databases.)^
6697: ** ^The full amount of memory used by the schemas is reported, even if the
6698: ** schema memory is shared with other database connections due to
6699: ** [shared cache mode] being enabled.
6700: ** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0.
6701: **
6702: ** [[SQLITE_DBSTATUS_STMT_USED]] ^(<dt>SQLITE_DBSTATUS_STMT_USED</dt>
6703: ** <dd>This parameter returns the approximate number of of bytes of heap
6704: ** and lookaside memory used by all prepared statements associated with
6705: ** the database connection.)^
6706: ** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0.
6707: ** </dd>
6708: **
6709: ** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(<dt>SQLITE_DBSTATUS_CACHE_HIT</dt>
6710: ** <dd>This parameter returns the number of pager cache hits that have
6711: ** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT
6712: ** is always 0.
6713: ** </dd>
6714: **
6715: ** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(<dt>SQLITE_DBSTATUS_CACHE_MISS</dt>
6716: ** <dd>This parameter returns the number of pager cache misses that have
6717: ** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS
6718: ** is always 0.
6719: ** </dd>
1.2.2.1 ! misho 6720: **
! 6721: ** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(<dt>SQLITE_DBSTATUS_CACHE_WRITE</dt>
! 6722: ** <dd>This parameter returns the number of dirty cache entries that have
! 6723: ** been written to disk. Specifically, the number of pages written to the
! 6724: ** wal file in wal mode databases, or the number of pages written to the
! 6725: ** database file in rollback mode databases. Any pages written as part of
! 6726: ** transaction rollback or database recovery operations are not included.
! 6727: ** If an IO or other error occurs while writing a page to disk, the effect
! 6728: ** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The
! 6729: ** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0.
! 6730: ** </dd>
1.2 misho 6731: ** </dl>
6732: */
6733: #define SQLITE_DBSTATUS_LOOKASIDE_USED 0
6734: #define SQLITE_DBSTATUS_CACHE_USED 1
6735: #define SQLITE_DBSTATUS_SCHEMA_USED 2
6736: #define SQLITE_DBSTATUS_STMT_USED 3
6737: #define SQLITE_DBSTATUS_LOOKASIDE_HIT 4
6738: #define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5
6739: #define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6
6740: #define SQLITE_DBSTATUS_CACHE_HIT 7
6741: #define SQLITE_DBSTATUS_CACHE_MISS 8
1.2.2.1 ! misho 6742: #define SQLITE_DBSTATUS_CACHE_WRITE 9
! 6743: #define SQLITE_DBSTATUS_MAX 9 /* Largest defined DBSTATUS */
1.2 misho 6744:
6745:
6746: /*
6747: ** CAPI3REF: Prepared Statement Status
6748: **
6749: ** ^(Each prepared statement maintains various
6750: ** [SQLITE_STMTSTATUS counters] that measure the number
6751: ** of times it has performed specific operations.)^ These counters can
6752: ** be used to monitor the performance characteristics of the prepared
6753: ** statements. For example, if the number of table steps greatly exceeds
6754: ** the number of table searches or result rows, that would tend to indicate
6755: ** that the prepared statement is using a full table scan rather than
6756: ** an index.
6757: **
6758: ** ^(This interface is used to retrieve and reset counter values from
6759: ** a [prepared statement]. The first argument is the prepared statement
6760: ** object to be interrogated. The second argument
6761: ** is an integer code for a specific [SQLITE_STMTSTATUS counter]
6762: ** to be interrogated.)^
6763: ** ^The current value of the requested counter is returned.
6764: ** ^If the resetFlg is true, then the counter is reset to zero after this
6765: ** interface call returns.
6766: **
6767: ** See also: [sqlite3_status()] and [sqlite3_db_status()].
6768: */
6769: SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg);
6770:
6771: /*
6772: ** CAPI3REF: Status Parameters for prepared statements
6773: ** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters}
6774: **
6775: ** These preprocessor macros define integer codes that name counter
6776: ** values associated with the [sqlite3_stmt_status()] interface.
6777: ** The meanings of the various counters are as follows:
6778: **
6779: ** <dl>
6780: ** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]] <dt>SQLITE_STMTSTATUS_FULLSCAN_STEP</dt>
6781: ** <dd>^This is the number of times that SQLite has stepped forward in
6782: ** a table as part of a full table scan. Large numbers for this counter
6783: ** may indicate opportunities for performance improvement through
6784: ** careful use of indices.</dd>
6785: **
6786: ** [[SQLITE_STMTSTATUS_SORT]] <dt>SQLITE_STMTSTATUS_SORT</dt>
6787: ** <dd>^This is the number of sort operations that have occurred.
6788: ** A non-zero value in this counter may indicate an opportunity to
6789: ** improvement performance through careful use of indices.</dd>
6790: **
6791: ** [[SQLITE_STMTSTATUS_AUTOINDEX]] <dt>SQLITE_STMTSTATUS_AUTOINDEX</dt>
6792: ** <dd>^This is the number of rows inserted into transient indices that
6793: ** were created automatically in order to help joins run faster.
6794: ** A non-zero value in this counter may indicate an opportunity to
6795: ** improvement performance by adding permanent indices that do not
6796: ** need to be reinitialized each time the statement is run.</dd>
6797: ** </dl>
6798: */
6799: #define SQLITE_STMTSTATUS_FULLSCAN_STEP 1
6800: #define SQLITE_STMTSTATUS_SORT 2
6801: #define SQLITE_STMTSTATUS_AUTOINDEX 3
6802:
6803: /*
6804: ** CAPI3REF: Custom Page Cache Object
6805: **
6806: ** The sqlite3_pcache type is opaque. It is implemented by
6807: ** the pluggable module. The SQLite core has no knowledge of
6808: ** its size or internal structure and never deals with the
6809: ** sqlite3_pcache object except by holding and passing pointers
6810: ** to the object.
6811: **
6812: ** See [sqlite3_pcache_methods2] for additional information.
6813: */
6814: typedef struct sqlite3_pcache sqlite3_pcache;
6815:
6816: /*
6817: ** CAPI3REF: Custom Page Cache Object
6818: **
6819: ** The sqlite3_pcache_page object represents a single page in the
6820: ** page cache. The page cache will allocate instances of this
6821: ** object. Various methods of the page cache use pointers to instances
6822: ** of this object as parameters or as their return value.
6823: **
6824: ** See [sqlite3_pcache_methods2] for additional information.
6825: */
6826: typedef struct sqlite3_pcache_page sqlite3_pcache_page;
6827: struct sqlite3_pcache_page {
6828: void *pBuf; /* The content of the page */
6829: void *pExtra; /* Extra information associated with the page */
6830: };
6831:
6832: /*
6833: ** CAPI3REF: Application Defined Page Cache.
6834: ** KEYWORDS: {page cache}
6835: **
6836: ** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can
6837: ** register an alternative page cache implementation by passing in an
6838: ** instance of the sqlite3_pcache_methods2 structure.)^
6839: ** In many applications, most of the heap memory allocated by
6840: ** SQLite is used for the page cache.
6841: ** By implementing a
6842: ** custom page cache using this API, an application can better control
6843: ** the amount of memory consumed by SQLite, the way in which
6844: ** that memory is allocated and released, and the policies used to
6845: ** determine exactly which parts of a database file are cached and for
6846: ** how long.
6847: **
6848: ** The alternative page cache mechanism is an
6849: ** extreme measure that is only needed by the most demanding applications.
6850: ** The built-in page cache is recommended for most uses.
6851: **
6852: ** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an
6853: ** internal buffer by SQLite within the call to [sqlite3_config]. Hence
6854: ** the application may discard the parameter after the call to
6855: ** [sqlite3_config()] returns.)^
6856: **
6857: ** [[the xInit() page cache method]]
6858: ** ^(The xInit() method is called once for each effective
6859: ** call to [sqlite3_initialize()])^
6860: ** (usually only once during the lifetime of the process). ^(The xInit()
6861: ** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^
6862: ** The intent of the xInit() method is to set up global data structures
6863: ** required by the custom page cache implementation.
6864: ** ^(If the xInit() method is NULL, then the
6865: ** built-in default page cache is used instead of the application defined
6866: ** page cache.)^
6867: **
6868: ** [[the xShutdown() page cache method]]
6869: ** ^The xShutdown() method is called by [sqlite3_shutdown()].
6870: ** It can be used to clean up
6871: ** any outstanding resources before process shutdown, if required.
6872: ** ^The xShutdown() method may be NULL.
6873: **
6874: ** ^SQLite automatically serializes calls to the xInit method,
6875: ** so the xInit method need not be threadsafe. ^The
6876: ** xShutdown method is only called from [sqlite3_shutdown()] so it does
6877: ** not need to be threadsafe either. All other methods must be threadsafe
6878: ** in multithreaded applications.
6879: **
6880: ** ^SQLite will never invoke xInit() more than once without an intervening
6881: ** call to xShutdown().
6882: **
6883: ** [[the xCreate() page cache methods]]
6884: ** ^SQLite invokes the xCreate() method to construct a new cache instance.
6885: ** SQLite will typically create one cache instance for each open database file,
6886: ** though this is not guaranteed. ^The
6887: ** first parameter, szPage, is the size in bytes of the pages that must
6888: ** be allocated by the cache. ^szPage will always a power of two. ^The
6889: ** second parameter szExtra is a number of bytes of extra storage
6890: ** associated with each page cache entry. ^The szExtra parameter will
6891: ** a number less than 250. SQLite will use the
6892: ** extra szExtra bytes on each page to store metadata about the underlying
6893: ** database page on disk. The value passed into szExtra depends
6894: ** on the SQLite version, the target platform, and how SQLite was compiled.
6895: ** ^The third argument to xCreate(), bPurgeable, is true if the cache being
6896: ** created will be used to cache database pages of a file stored on disk, or
6897: ** false if it is used for an in-memory database. The cache implementation
6898: ** does not have to do anything special based with the value of bPurgeable;
6899: ** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will
6900: ** never invoke xUnpin() except to deliberately delete a page.
6901: ** ^In other words, calls to xUnpin() on a cache with bPurgeable set to
6902: ** false will always have the "discard" flag set to true.
6903: ** ^Hence, a cache created with bPurgeable false will
6904: ** never contain any unpinned pages.
6905: **
6906: ** [[the xCachesize() page cache method]]
6907: ** ^(The xCachesize() method may be called at any time by SQLite to set the
6908: ** suggested maximum cache-size (number of pages stored by) the cache
6909: ** instance passed as the first argument. This is the value configured using
6910: ** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable
6911: ** parameter, the implementation is not required to do anything with this
6912: ** value; it is advisory only.
6913: **
6914: ** [[the xPagecount() page cache methods]]
6915: ** The xPagecount() method must return the number of pages currently
6916: ** stored in the cache, both pinned and unpinned.
6917: **
6918: ** [[the xFetch() page cache methods]]
6919: ** The xFetch() method locates a page in the cache and returns a pointer to
6920: ** an sqlite3_pcache_page object associated with that page, or a NULL pointer.
6921: ** The pBuf element of the returned sqlite3_pcache_page object will be a
6922: ** pointer to a buffer of szPage bytes used to store the content of a
6923: ** single database page. The pExtra element of sqlite3_pcache_page will be
6924: ** a pointer to the szExtra bytes of extra storage that SQLite has requested
6925: ** for each entry in the page cache.
6926: **
6927: ** The page to be fetched is determined by the key. ^The minimum key value
6928: ** is 1. After it has been retrieved using xFetch, the page is considered
6929: ** to be "pinned".
6930: **
6931: ** If the requested page is already in the page cache, then the page cache
6932: ** implementation must return a pointer to the page buffer with its content
6933: ** intact. If the requested page is not already in the cache, then the
6934: ** cache implementation should use the value of the createFlag
6935: ** parameter to help it determined what action to take:
6936: **
6937: ** <table border=1 width=85% align=center>
6938: ** <tr><th> createFlag <th> Behaviour when page is not already in cache
6939: ** <tr><td> 0 <td> Do not allocate a new page. Return NULL.
6940: ** <tr><td> 1 <td> Allocate a new page if it easy and convenient to do so.
6941: ** Otherwise return NULL.
6942: ** <tr><td> 2 <td> Make every effort to allocate a new page. Only return
6943: ** NULL if allocating a new page is effectively impossible.
6944: ** </table>
6945: **
6946: ** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite
6947: ** will only use a createFlag of 2 after a prior call with a createFlag of 1
6948: ** failed.)^ In between the to xFetch() calls, SQLite may
6949: ** attempt to unpin one or more cache pages by spilling the content of
6950: ** pinned pages to disk and synching the operating system disk cache.
6951: **
6952: ** [[the xUnpin() page cache method]]
6953: ** ^xUnpin() is called by SQLite with a pointer to a currently pinned page
6954: ** as its second argument. If the third parameter, discard, is non-zero,
6955: ** then the page must be evicted from the cache.
6956: ** ^If the discard parameter is
6957: ** zero, then the page may be discarded or retained at the discretion of
6958: ** page cache implementation. ^The page cache implementation
6959: ** may choose to evict unpinned pages at any time.
6960: **
6961: ** The cache must not perform any reference counting. A single
6962: ** call to xUnpin() unpins the page regardless of the number of prior calls
6963: ** to xFetch().
6964: **
6965: ** [[the xRekey() page cache methods]]
6966: ** The xRekey() method is used to change the key value associated with the
6967: ** page passed as the second argument. If the cache
6968: ** previously contains an entry associated with newKey, it must be
6969: ** discarded. ^Any prior cache entry associated with newKey is guaranteed not
6970: ** to be pinned.
6971: **
6972: ** When SQLite calls the xTruncate() method, the cache must discard all
6973: ** existing cache entries with page numbers (keys) greater than or equal
6974: ** to the value of the iLimit parameter passed to xTruncate(). If any
6975: ** of these pages are pinned, they are implicitly unpinned, meaning that
6976: ** they can be safely discarded.
6977: **
6978: ** [[the xDestroy() page cache method]]
6979: ** ^The xDestroy() method is used to delete a cache allocated by xCreate().
6980: ** All resources associated with the specified cache should be freed. ^After
6981: ** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*]
6982: ** handle invalid, and will not use it with any other sqlite3_pcache_methods2
6983: ** functions.
6984: **
6985: ** [[the xShrink() page cache method]]
6986: ** ^SQLite invokes the xShrink() method when it wants the page cache to
6987: ** free up as much of heap memory as possible. The page cache implementation
6988: ** is not obligated to free any memory, but well-behaved implementations should
6989: ** do their best.
6990: */
6991: typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2;
6992: struct sqlite3_pcache_methods2 {
6993: int iVersion;
6994: void *pArg;
6995: int (*xInit)(void*);
6996: void (*xShutdown)(void*);
6997: sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable);
6998: void (*xCachesize)(sqlite3_pcache*, int nCachesize);
6999: int (*xPagecount)(sqlite3_pcache*);
7000: sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag);
7001: void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard);
7002: void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*,
7003: unsigned oldKey, unsigned newKey);
7004: void (*xTruncate)(sqlite3_pcache*, unsigned iLimit);
7005: void (*xDestroy)(sqlite3_pcache*);
7006: void (*xShrink)(sqlite3_pcache*);
7007: };
7008:
7009: /*
7010: ** This is the obsolete pcache_methods object that has now been replaced
7011: ** by sqlite3_pcache_methods2. This object is not used by SQLite. It is
7012: ** retained in the header file for backwards compatibility only.
7013: */
7014: typedef struct sqlite3_pcache_methods sqlite3_pcache_methods;
7015: struct sqlite3_pcache_methods {
7016: void *pArg;
7017: int (*xInit)(void*);
7018: void (*xShutdown)(void*);
7019: sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable);
7020: void (*xCachesize)(sqlite3_pcache*, int nCachesize);
7021: int (*xPagecount)(sqlite3_pcache*);
7022: void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag);
7023: void (*xUnpin)(sqlite3_pcache*, void*, int discard);
7024: void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey);
7025: void (*xTruncate)(sqlite3_pcache*, unsigned iLimit);
7026: void (*xDestroy)(sqlite3_pcache*);
7027: };
7028:
7029:
7030: /*
7031: ** CAPI3REF: Online Backup Object
7032: **
7033: ** The sqlite3_backup object records state information about an ongoing
7034: ** online backup operation. ^The sqlite3_backup object is created by
7035: ** a call to [sqlite3_backup_init()] and is destroyed by a call to
7036: ** [sqlite3_backup_finish()].
7037: **
7038: ** See Also: [Using the SQLite Online Backup API]
7039: */
7040: typedef struct sqlite3_backup sqlite3_backup;
7041:
7042: /*
7043: ** CAPI3REF: Online Backup API.
7044: **
7045: ** The backup API copies the content of one database into another.
7046: ** It is useful either for creating backups of databases or
7047: ** for copying in-memory databases to or from persistent files.
7048: **
7049: ** See Also: [Using the SQLite Online Backup API]
7050: **
7051: ** ^SQLite holds a write transaction open on the destination database file
7052: ** for the duration of the backup operation.
7053: ** ^The source database is read-locked only while it is being read;
7054: ** it is not locked continuously for the entire backup operation.
7055: ** ^Thus, the backup may be performed on a live source database without
7056: ** preventing other database connections from
7057: ** reading or writing to the source database while the backup is underway.
7058: **
7059: ** ^(To perform a backup operation:
7060: ** <ol>
7061: ** <li><b>sqlite3_backup_init()</b> is called once to initialize the
7062: ** backup,
7063: ** <li><b>sqlite3_backup_step()</b> is called one or more times to transfer
7064: ** the data between the two databases, and finally
7065: ** <li><b>sqlite3_backup_finish()</b> is called to release all resources
7066: ** associated with the backup operation.
7067: ** </ol>)^
7068: ** There should be exactly one call to sqlite3_backup_finish() for each
7069: ** successful call to sqlite3_backup_init().
7070: **
7071: ** [[sqlite3_backup_init()]] <b>sqlite3_backup_init()</b>
7072: **
7073: ** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the
7074: ** [database connection] associated with the destination database
7075: ** and the database name, respectively.
7076: ** ^The database name is "main" for the main database, "temp" for the
7077: ** temporary database, or the name specified after the AS keyword in
7078: ** an [ATTACH] statement for an attached database.
7079: ** ^The S and M arguments passed to
7080: ** sqlite3_backup_init(D,N,S,M) identify the [database connection]
7081: ** and database name of the source database, respectively.
7082: ** ^The source and destination [database connections] (parameters S and D)
7083: ** must be different or else sqlite3_backup_init(D,N,S,M) will fail with
7084: ** an error.
7085: **
7086: ** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is
7087: ** returned and an error code and error message are stored in the
7088: ** destination [database connection] D.
7089: ** ^The error code and message for the failed call to sqlite3_backup_init()
7090: ** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or
7091: ** [sqlite3_errmsg16()] functions.
7092: ** ^A successful call to sqlite3_backup_init() returns a pointer to an
7093: ** [sqlite3_backup] object.
7094: ** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and
7095: ** sqlite3_backup_finish() functions to perform the specified backup
7096: ** operation.
7097: **
7098: ** [[sqlite3_backup_step()]] <b>sqlite3_backup_step()</b>
7099: **
7100: ** ^Function sqlite3_backup_step(B,N) will copy up to N pages between
7101: ** the source and destination databases specified by [sqlite3_backup] object B.
7102: ** ^If N is negative, all remaining source pages are copied.
7103: ** ^If sqlite3_backup_step(B,N) successfully copies N pages and there
7104: ** are still more pages to be copied, then the function returns [SQLITE_OK].
7105: ** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages
7106: ** from source to destination, then it returns [SQLITE_DONE].
7107: ** ^If an error occurs while running sqlite3_backup_step(B,N),
7108: ** then an [error code] is returned. ^As well as [SQLITE_OK] and
7109: ** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY],
7110: ** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an
7111: ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code.
7112: **
7113: ** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if
7114: ** <ol>
7115: ** <li> the destination database was opened read-only, or
7116: ** <li> the destination database is using write-ahead-log journaling
7117: ** and the destination and source page sizes differ, or
7118: ** <li> the destination database is an in-memory database and the
7119: ** destination and source page sizes differ.
7120: ** </ol>)^
7121: **
7122: ** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then
7123: ** the [sqlite3_busy_handler | busy-handler function]
7124: ** is invoked (if one is specified). ^If the
7125: ** busy-handler returns non-zero before the lock is available, then
7126: ** [SQLITE_BUSY] is returned to the caller. ^In this case the call to
7127: ** sqlite3_backup_step() can be retried later. ^If the source
7128: ** [database connection]
7129: ** is being used to write to the source database when sqlite3_backup_step()
7130: ** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this
7131: ** case the call to sqlite3_backup_step() can be retried later on. ^(If
7132: ** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or
7133: ** [SQLITE_READONLY] is returned, then
7134: ** there is no point in retrying the call to sqlite3_backup_step(). These
7135: ** errors are considered fatal.)^ The application must accept
7136: ** that the backup operation has failed and pass the backup operation handle
7137: ** to the sqlite3_backup_finish() to release associated resources.
7138: **
7139: ** ^The first call to sqlite3_backup_step() obtains an exclusive lock
7140: ** on the destination file. ^The exclusive lock is not released until either
7141: ** sqlite3_backup_finish() is called or the backup operation is complete
7142: ** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to
7143: ** sqlite3_backup_step() obtains a [shared lock] on the source database that
7144: ** lasts for the duration of the sqlite3_backup_step() call.
7145: ** ^Because the source database is not locked between calls to
7146: ** sqlite3_backup_step(), the source database may be modified mid-way
7147: ** through the backup process. ^If the source database is modified by an
7148: ** external process or via a database connection other than the one being
7149: ** used by the backup operation, then the backup will be automatically
7150: ** restarted by the next call to sqlite3_backup_step(). ^If the source
7151: ** database is modified by the using the same database connection as is used
7152: ** by the backup operation, then the backup database is automatically
7153: ** updated at the same time.
7154: **
7155: ** [[sqlite3_backup_finish()]] <b>sqlite3_backup_finish()</b>
7156: **
7157: ** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the
7158: ** application wishes to abandon the backup operation, the application
7159: ** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish().
7160: ** ^The sqlite3_backup_finish() interfaces releases all
7161: ** resources associated with the [sqlite3_backup] object.
7162: ** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any
7163: ** active write-transaction on the destination database is rolled back.
7164: ** The [sqlite3_backup] object is invalid
7165: ** and may not be used following a call to sqlite3_backup_finish().
7166: **
7167: ** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no
7168: ** sqlite3_backup_step() errors occurred, regardless or whether or not
7169: ** sqlite3_backup_step() completed.
7170: ** ^If an out-of-memory condition or IO error occurred during any prior
7171: ** sqlite3_backup_step() call on the same [sqlite3_backup] object, then
7172: ** sqlite3_backup_finish() returns the corresponding [error code].
7173: **
7174: ** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step()
7175: ** is not a permanent error and does not affect the return value of
7176: ** sqlite3_backup_finish().
7177: **
7178: ** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]]
7179: ** <b>sqlite3_backup_remaining() and sqlite3_backup_pagecount()</b>
7180: **
7181: ** ^Each call to sqlite3_backup_step() sets two values inside
7182: ** the [sqlite3_backup] object: the number of pages still to be backed
7183: ** up and the total number of pages in the source database file.
7184: ** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces
7185: ** retrieve these two values, respectively.
7186: **
7187: ** ^The values returned by these functions are only updated by
7188: ** sqlite3_backup_step(). ^If the source database is modified during a backup
7189: ** operation, then the values are not updated to account for any extra
7190: ** pages that need to be updated or the size of the source database file
7191: ** changing.
7192: **
7193: ** <b>Concurrent Usage of Database Handles</b>
7194: **
7195: ** ^The source [database connection] may be used by the application for other
7196: ** purposes while a backup operation is underway or being initialized.
7197: ** ^If SQLite is compiled and configured to support threadsafe database
7198: ** connections, then the source database connection may be used concurrently
7199: ** from within other threads.
7200: **
7201: ** However, the application must guarantee that the destination
7202: ** [database connection] is not passed to any other API (by any thread) after
7203: ** sqlite3_backup_init() is called and before the corresponding call to
7204: ** sqlite3_backup_finish(). SQLite does not currently check to see
7205: ** if the application incorrectly accesses the destination [database connection]
7206: ** and so no error code is reported, but the operations may malfunction
7207: ** nevertheless. Use of the destination database connection while a
7208: ** backup is in progress might also also cause a mutex deadlock.
7209: **
7210: ** If running in [shared cache mode], the application must
7211: ** guarantee that the shared cache used by the destination database
7212: ** is not accessed while the backup is running. In practice this means
7213: ** that the application must guarantee that the disk file being
7214: ** backed up to is not accessed by any connection within the process,
7215: ** not just the specific connection that was passed to sqlite3_backup_init().
7216: **
7217: ** The [sqlite3_backup] object itself is partially threadsafe. Multiple
7218: ** threads may safely make multiple concurrent calls to sqlite3_backup_step().
7219: ** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount()
7220: ** APIs are not strictly speaking threadsafe. If they are invoked at the
7221: ** same time as another thread is invoking sqlite3_backup_step() it is
7222: ** possible that they return invalid values.
7223: */
7224: SQLITE_API sqlite3_backup *sqlite3_backup_init(
7225: sqlite3 *pDest, /* Destination database handle */
7226: const char *zDestName, /* Destination database name */
7227: sqlite3 *pSource, /* Source database handle */
7228: const char *zSourceName /* Source database name */
7229: );
7230: SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage);
7231: SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p);
7232: SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p);
7233: SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p);
7234:
7235: /*
7236: ** CAPI3REF: Unlock Notification
7237: **
7238: ** ^When running in shared-cache mode, a database operation may fail with
7239: ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or
7240: ** individual tables within the shared-cache cannot be obtained. See
7241: ** [SQLite Shared-Cache Mode] for a description of shared-cache locking.
7242: ** ^This API may be used to register a callback that SQLite will invoke
7243: ** when the connection currently holding the required lock relinquishes it.
7244: ** ^This API is only available if the library was compiled with the
7245: ** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined.
7246: **
7247: ** See Also: [Using the SQLite Unlock Notification Feature].
7248: **
7249: ** ^Shared-cache locks are released when a database connection concludes
7250: ** its current transaction, either by committing it or rolling it back.
7251: **
7252: ** ^When a connection (known as the blocked connection) fails to obtain a
7253: ** shared-cache lock and SQLITE_LOCKED is returned to the caller, the
7254: ** identity of the database connection (the blocking connection) that
7255: ** has locked the required resource is stored internally. ^After an
7256: ** application receives an SQLITE_LOCKED error, it may call the
7257: ** sqlite3_unlock_notify() method with the blocked connection handle as
7258: ** the first argument to register for a callback that will be invoked
7259: ** when the blocking connections current transaction is concluded. ^The
7260: ** callback is invoked from within the [sqlite3_step] or [sqlite3_close]
7261: ** call that concludes the blocking connections transaction.
7262: **
7263: ** ^(If sqlite3_unlock_notify() is called in a multi-threaded application,
7264: ** there is a chance that the blocking connection will have already
7265: ** concluded its transaction by the time sqlite3_unlock_notify() is invoked.
7266: ** If this happens, then the specified callback is invoked immediately,
7267: ** from within the call to sqlite3_unlock_notify().)^
7268: **
7269: ** ^If the blocked connection is attempting to obtain a write-lock on a
7270: ** shared-cache table, and more than one other connection currently holds
7271: ** a read-lock on the same table, then SQLite arbitrarily selects one of
7272: ** the other connections to use as the blocking connection.
7273: **
7274: ** ^(There may be at most one unlock-notify callback registered by a
7275: ** blocked connection. If sqlite3_unlock_notify() is called when the
7276: ** blocked connection already has a registered unlock-notify callback,
7277: ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is
7278: ** called with a NULL pointer as its second argument, then any existing
7279: ** unlock-notify callback is canceled. ^The blocked connections
7280: ** unlock-notify callback may also be canceled by closing the blocked
7281: ** connection using [sqlite3_close()].
7282: **
7283: ** The unlock-notify callback is not reentrant. If an application invokes
7284: ** any sqlite3_xxx API functions from within an unlock-notify callback, a
7285: ** crash or deadlock may be the result.
7286: **
7287: ** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always
7288: ** returns SQLITE_OK.
7289: **
7290: ** <b>Callback Invocation Details</b>
7291: **
7292: ** When an unlock-notify callback is registered, the application provides a
7293: ** single void* pointer that is passed to the callback when it is invoked.
7294: ** However, the signature of the callback function allows SQLite to pass
7295: ** it an array of void* context pointers. The first argument passed to
7296: ** an unlock-notify callback is a pointer to an array of void* pointers,
7297: ** and the second is the number of entries in the array.
7298: **
7299: ** When a blocking connections transaction is concluded, there may be
7300: ** more than one blocked connection that has registered for an unlock-notify
7301: ** callback. ^If two or more such blocked connections have specified the
7302: ** same callback function, then instead of invoking the callback function
7303: ** multiple times, it is invoked once with the set of void* context pointers
7304: ** specified by the blocked connections bundled together into an array.
7305: ** This gives the application an opportunity to prioritize any actions
7306: ** related to the set of unblocked database connections.
7307: **
7308: ** <b>Deadlock Detection</b>
7309: **
7310: ** Assuming that after registering for an unlock-notify callback a
7311: ** database waits for the callback to be issued before taking any further
7312: ** action (a reasonable assumption), then using this API may cause the
7313: ** application to deadlock. For example, if connection X is waiting for
7314: ** connection Y's transaction to be concluded, and similarly connection
7315: ** Y is waiting on connection X's transaction, then neither connection
7316: ** will proceed and the system may remain deadlocked indefinitely.
7317: **
7318: ** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock
7319: ** detection. ^If a given call to sqlite3_unlock_notify() would put the
7320: ** system in a deadlocked state, then SQLITE_LOCKED is returned and no
7321: ** unlock-notify callback is registered. The system is said to be in
7322: ** a deadlocked state if connection A has registered for an unlock-notify
7323: ** callback on the conclusion of connection B's transaction, and connection
7324: ** B has itself registered for an unlock-notify callback when connection
7325: ** A's transaction is concluded. ^Indirect deadlock is also detected, so
7326: ** the system is also considered to be deadlocked if connection B has
7327: ** registered for an unlock-notify callback on the conclusion of connection
7328: ** C's transaction, where connection C is waiting on connection A. ^Any
7329: ** number of levels of indirection are allowed.
7330: **
7331: ** <b>The "DROP TABLE" Exception</b>
7332: **
7333: ** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost
7334: ** always appropriate to call sqlite3_unlock_notify(). There is however,
7335: ** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement,
7336: ** SQLite checks if there are any currently executing SELECT statements
7337: ** that belong to the same connection. If there are, SQLITE_LOCKED is
7338: ** returned. In this case there is no "blocking connection", so invoking
7339: ** sqlite3_unlock_notify() results in the unlock-notify callback being
7340: ** invoked immediately. If the application then re-attempts the "DROP TABLE"
7341: ** or "DROP INDEX" query, an infinite loop might be the result.
7342: **
7343: ** One way around this problem is to check the extended error code returned
7344: ** by an sqlite3_step() call. ^(If there is a blocking connection, then the
7345: ** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in
7346: ** the special "DROP TABLE/INDEX" case, the extended error code is just
7347: ** SQLITE_LOCKED.)^
7348: */
7349: SQLITE_API int sqlite3_unlock_notify(
7350: sqlite3 *pBlocked, /* Waiting connection */
7351: void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */
7352: void *pNotifyArg /* Argument to pass to xNotify */
7353: );
7354:
7355:
7356: /*
7357: ** CAPI3REF: String Comparison
7358: **
1.2.2.1 ! misho 7359: ** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications
! 7360: ** and extensions to compare the contents of two buffers containing UTF-8
! 7361: ** strings in a case-independent fashion, using the same definition of "case
! 7362: ** independence" that SQLite uses internally when comparing identifiers.
1.2 misho 7363: */
1.2.2.1 ! misho 7364: SQLITE_API int sqlite3_stricmp(const char *, const char *);
1.2 misho 7365: SQLITE_API int sqlite3_strnicmp(const char *, const char *, int);
7366:
7367: /*
7368: ** CAPI3REF: Error Logging Interface
7369: **
7370: ** ^The [sqlite3_log()] interface writes a message into the error log
7371: ** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()].
7372: ** ^If logging is enabled, the zFormat string and subsequent arguments are
7373: ** used with [sqlite3_snprintf()] to generate the final output string.
7374: **
7375: ** The sqlite3_log() interface is intended for use by extensions such as
7376: ** virtual tables, collating functions, and SQL functions. While there is
7377: ** nothing to prevent an application from calling sqlite3_log(), doing so
7378: ** is considered bad form.
7379: **
7380: ** The zFormat string must not be NULL.
7381: **
7382: ** To avoid deadlocks and other threading problems, the sqlite3_log() routine
7383: ** will not use dynamically allocated memory. The log message is stored in
7384: ** a fixed-length buffer on the stack. If the log message is longer than
7385: ** a few hundred characters, it will be truncated to the length of the
7386: ** buffer.
7387: */
7388: SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...);
7389:
7390: /*
7391: ** CAPI3REF: Write-Ahead Log Commit Hook
7392: **
7393: ** ^The [sqlite3_wal_hook()] function is used to register a callback that
7394: ** will be invoked each time a database connection commits data to a
7395: ** [write-ahead log] (i.e. whenever a transaction is committed in
7396: ** [journal_mode | journal_mode=WAL mode]).
7397: **
7398: ** ^The callback is invoked by SQLite after the commit has taken place and
7399: ** the associated write-lock on the database released, so the implementation
7400: ** may read, write or [checkpoint] the database as required.
7401: **
7402: ** ^The first parameter passed to the callback function when it is invoked
7403: ** is a copy of the third parameter passed to sqlite3_wal_hook() when
7404: ** registering the callback. ^The second is a copy of the database handle.
7405: ** ^The third parameter is the name of the database that was written to -
7406: ** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter
7407: ** is the number of pages currently in the write-ahead log file,
7408: ** including those that were just committed.
7409: **
7410: ** The callback function should normally return [SQLITE_OK]. ^If an error
7411: ** code is returned, that error will propagate back up through the
7412: ** SQLite code base to cause the statement that provoked the callback
7413: ** to report an error, though the commit will have still occurred. If the
7414: ** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value
7415: ** that does not correspond to any valid SQLite error code, the results
7416: ** are undefined.
7417: **
7418: ** A single database handle may have at most a single write-ahead log callback
7419: ** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any
7420: ** previously registered write-ahead log callback. ^Note that the
7421: ** [sqlite3_wal_autocheckpoint()] interface and the
7422: ** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will
7423: ** those overwrite any prior [sqlite3_wal_hook()] settings.
7424: */
7425: SQLITE_API void *sqlite3_wal_hook(
7426: sqlite3*,
7427: int(*)(void *,sqlite3*,const char*,int),
7428: void*
7429: );
7430:
7431: /*
7432: ** CAPI3REF: Configure an auto-checkpoint
7433: **
7434: ** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around
7435: ** [sqlite3_wal_hook()] that causes any database on [database connection] D
7436: ** to automatically [checkpoint]
7437: ** after committing a transaction if there are N or
7438: ** more frames in the [write-ahead log] file. ^Passing zero or
7439: ** a negative value as the nFrame parameter disables automatic
7440: ** checkpoints entirely.
7441: **
7442: ** ^The callback registered by this function replaces any existing callback
7443: ** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback
7444: ** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism
7445: ** configured by this function.
7446: **
7447: ** ^The [wal_autocheckpoint pragma] can be used to invoke this interface
7448: ** from SQL.
7449: **
7450: ** ^Every new [database connection] defaults to having the auto-checkpoint
7451: ** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT]
7452: ** pages. The use of this interface
7453: ** is only necessary if the default setting is found to be suboptimal
7454: ** for a particular application.
7455: */
7456: SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N);
7457:
7458: /*
7459: ** CAPI3REF: Checkpoint a database
7460: **
7461: ** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X
7462: ** on [database connection] D to be [checkpointed]. ^If X is NULL or an
7463: ** empty string, then a checkpoint is run on all databases of
7464: ** connection D. ^If the database connection D is not in
7465: ** [WAL | write-ahead log mode] then this interface is a harmless no-op.
7466: **
7467: ** ^The [wal_checkpoint pragma] can be used to invoke this interface
7468: ** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the
7469: ** [wal_autocheckpoint pragma] can be used to cause this interface to be
7470: ** run whenever the WAL reaches a certain size threshold.
7471: **
7472: ** See also: [sqlite3_wal_checkpoint_v2()]
7473: */
7474: SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb);
7475:
7476: /*
7477: ** CAPI3REF: Checkpoint a database
7478: **
7479: ** Run a checkpoint operation on WAL database zDb attached to database
7480: ** handle db. The specific operation is determined by the value of the
7481: ** eMode parameter:
7482: **
7483: ** <dl>
7484: ** <dt>SQLITE_CHECKPOINT_PASSIVE<dd>
7485: ** Checkpoint as many frames as possible without waiting for any database
7486: ** readers or writers to finish. Sync the db file if all frames in the log
7487: ** are checkpointed. This mode is the same as calling
7488: ** sqlite3_wal_checkpoint(). The busy-handler callback is never invoked.
7489: **
7490: ** <dt>SQLITE_CHECKPOINT_FULL<dd>
7491: ** This mode blocks (calls the busy-handler callback) until there is no
7492: ** database writer and all readers are reading from the most recent database
7493: ** snapshot. It then checkpoints all frames in the log file and syncs the
7494: ** database file. This call blocks database writers while it is running,
7495: ** but not database readers.
7496: **
7497: ** <dt>SQLITE_CHECKPOINT_RESTART<dd>
7498: ** This mode works the same way as SQLITE_CHECKPOINT_FULL, except after
7499: ** checkpointing the log file it blocks (calls the busy-handler callback)
7500: ** until all readers are reading from the database file only. This ensures
7501: ** that the next client to write to the database file restarts the log file
7502: ** from the beginning. This call blocks database writers while it is running,
7503: ** but not database readers.
7504: ** </dl>
7505: **
7506: ** If pnLog is not NULL, then *pnLog is set to the total number of frames in
7507: ** the log file before returning. If pnCkpt is not NULL, then *pnCkpt is set to
7508: ** the total number of checkpointed frames (including any that were already
7509: ** checkpointed when this function is called). *pnLog and *pnCkpt may be
7510: ** populated even if sqlite3_wal_checkpoint_v2() returns other than SQLITE_OK.
7511: ** If no values are available because of an error, they are both set to -1
7512: ** before returning to communicate this to the caller.
7513: **
7514: ** All calls obtain an exclusive "checkpoint" lock on the database file. If
7515: ** any other process is running a checkpoint operation at the same time, the
7516: ** lock cannot be obtained and SQLITE_BUSY is returned. Even if there is a
7517: ** busy-handler configured, it will not be invoked in this case.
7518: **
7519: ** The SQLITE_CHECKPOINT_FULL and RESTART modes also obtain the exclusive
7520: ** "writer" lock on the database file. If the writer lock cannot be obtained
7521: ** immediately, and a busy-handler is configured, it is invoked and the writer
7522: ** lock retried until either the busy-handler returns 0 or the lock is
7523: ** successfully obtained. The busy-handler is also invoked while waiting for
7524: ** database readers as described above. If the busy-handler returns 0 before
7525: ** the writer lock is obtained or while waiting for database readers, the
7526: ** checkpoint operation proceeds from that point in the same way as
7527: ** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible
7528: ** without blocking any further. SQLITE_BUSY is returned in this case.
7529: **
7530: ** If parameter zDb is NULL or points to a zero length string, then the
7531: ** specified operation is attempted on all WAL databases. In this case the
7532: ** values written to output parameters *pnLog and *pnCkpt are undefined. If
7533: ** an SQLITE_BUSY error is encountered when processing one or more of the
7534: ** attached WAL databases, the operation is still attempted on any remaining
7535: ** attached databases and SQLITE_BUSY is returned to the caller. If any other
7536: ** error occurs while processing an attached database, processing is abandoned
7537: ** and the error code returned to the caller immediately. If no error
7538: ** (SQLITE_BUSY or otherwise) is encountered while processing the attached
7539: ** databases, SQLITE_OK is returned.
7540: **
7541: ** If database zDb is the name of an attached database that is not in WAL
7542: ** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. If
7543: ** zDb is not NULL (or a zero length string) and is not the name of any
7544: ** attached database, SQLITE_ERROR is returned to the caller.
7545: */
7546: SQLITE_API int sqlite3_wal_checkpoint_v2(
7547: sqlite3 *db, /* Database handle */
7548: const char *zDb, /* Name of attached database (or NULL) */
7549: int eMode, /* SQLITE_CHECKPOINT_* value */
7550: int *pnLog, /* OUT: Size of WAL log in frames */
7551: int *pnCkpt /* OUT: Total number of frames checkpointed */
7552: );
7553:
7554: /*
7555: ** CAPI3REF: Checkpoint operation parameters
7556: **
7557: ** These constants can be used as the 3rd parameter to
7558: ** [sqlite3_wal_checkpoint_v2()]. See the [sqlite3_wal_checkpoint_v2()]
7559: ** documentation for additional information about the meaning and use of
7560: ** each of these values.
7561: */
7562: #define SQLITE_CHECKPOINT_PASSIVE 0
7563: #define SQLITE_CHECKPOINT_FULL 1
7564: #define SQLITE_CHECKPOINT_RESTART 2
7565:
7566: /*
7567: ** CAPI3REF: Virtual Table Interface Configuration
7568: **
7569: ** This function may be called by either the [xConnect] or [xCreate] method
7570: ** of a [virtual table] implementation to configure
7571: ** various facets of the virtual table interface.
7572: **
7573: ** If this interface is invoked outside the context of an xConnect or
7574: ** xCreate virtual table method then the behavior is undefined.
7575: **
7576: ** At present, there is only one option that may be configured using
7577: ** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options
7578: ** may be added in the future.
7579: */
7580: SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
7581:
7582: /*
7583: ** CAPI3REF: Virtual Table Configuration Options
7584: **
7585: ** These macros define the various options to the
7586: ** [sqlite3_vtab_config()] interface that [virtual table] implementations
7587: ** can use to customize and optimize their behavior.
7588: **
7589: ** <dl>
7590: ** <dt>SQLITE_VTAB_CONSTRAINT_SUPPORT
7591: ** <dd>Calls of the form
7592: ** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported,
7593: ** where X is an integer. If X is zero, then the [virtual table] whose
7594: ** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not
7595: ** support constraints. In this configuration (which is the default) if
7596: ** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire
7597: ** statement is rolled back as if [ON CONFLICT | OR ABORT] had been
7598: ** specified as part of the users SQL statement, regardless of the actual
7599: ** ON CONFLICT mode specified.
7600: **
7601: ** If X is non-zero, then the virtual table implementation guarantees
7602: ** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before
7603: ** any modifications to internal or persistent data structures have been made.
7604: ** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite
7605: ** is able to roll back a statement or database transaction, and abandon
7606: ** or continue processing the current SQL statement as appropriate.
7607: ** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns
7608: ** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode
7609: ** had been ABORT.
7610: **
7611: ** Virtual table implementations that are required to handle OR REPLACE
7612: ** must do so within the [xUpdate] method. If a call to the
7613: ** [sqlite3_vtab_on_conflict()] function indicates that the current ON
7614: ** CONFLICT policy is REPLACE, the virtual table implementation should
7615: ** silently replace the appropriate rows within the xUpdate callback and
7616: ** return SQLITE_OK. Or, if this is not possible, it may return
7617: ** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT
7618: ** constraint handling.
7619: ** </dl>
7620: */
7621: #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1
7622:
7623: /*
7624: ** CAPI3REF: Determine The Virtual Table Conflict Policy
7625: **
7626: ** This function may only be called from within a call to the [xUpdate] method
7627: ** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The
7628: ** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL],
7629: ** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode
7630: ** of the SQL statement that triggered the call to the [xUpdate] method of the
7631: ** [virtual table].
7632: */
7633: SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *);
7634:
7635: /*
7636: ** CAPI3REF: Conflict resolution modes
7637: **
7638: ** These constants are returned by [sqlite3_vtab_on_conflict()] to
7639: ** inform a [virtual table] implementation what the [ON CONFLICT] mode
7640: ** is for the SQL statement being evaluated.
7641: **
7642: ** Note that the [SQLITE_IGNORE] constant is also used as a potential
7643: ** return value from the [sqlite3_set_authorizer()] callback and that
7644: ** [SQLITE_ABORT] is also a [result code].
7645: */
7646: #define SQLITE_ROLLBACK 1
7647: /* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */
7648: #define SQLITE_FAIL 3
7649: /* #define SQLITE_ABORT 4 // Also an error code */
7650: #define SQLITE_REPLACE 5
7651:
7652:
7653:
7654: /*
7655: ** Undo the hack that converts floating point types to integer for
7656: ** builds on processors without floating point support.
7657: */
7658: #ifdef SQLITE_OMIT_FLOATING_POINT
7659: # undef double
7660: #endif
7661:
7662: #if 0
7663: } /* End of the 'extern "C"' block */
7664: #endif
7665: #endif
7666:
7667: /*
7668: ** 2010 August 30
7669: **
7670: ** The author disclaims copyright to this source code. In place of
7671: ** a legal notice, here is a blessing:
7672: **
7673: ** May you do good and not evil.
7674: ** May you find forgiveness for yourself and forgive others.
7675: ** May you share freely, never taking more than you give.
7676: **
7677: *************************************************************************
7678: */
7679:
7680: #ifndef _SQLITE3RTREE_H_
7681: #define _SQLITE3RTREE_H_
7682:
7683:
7684: #if 0
7685: extern "C" {
7686: #endif
7687:
7688: typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry;
7689:
7690: /*
7691: ** Register a geometry callback named zGeom that can be used as part of an
7692: ** R-Tree geometry query as follows:
7693: **
7694: ** SELECT ... FROM <rtree> WHERE <rtree col> MATCH $zGeom(... params ...)
7695: */
7696: SQLITE_API int sqlite3_rtree_geometry_callback(
7697: sqlite3 *db,
7698: const char *zGeom,
1.2.2.1 ! misho 7699: #ifdef SQLITE_RTREE_INT_ONLY
! 7700: int (*xGeom)(sqlite3_rtree_geometry*, int n, sqlite3_int64 *a, int *pRes),
! 7701: #else
! 7702: int (*xGeom)(sqlite3_rtree_geometry*, int n, double *a, int *pRes),
! 7703: #endif
1.2 misho 7704: void *pContext
7705: );
7706:
7707:
7708: /*
7709: ** A pointer to a structure of the following type is passed as the first
7710: ** argument to callbacks registered using rtree_geometry_callback().
7711: */
7712: struct sqlite3_rtree_geometry {
7713: void *pContext; /* Copy of pContext passed to s_r_g_c() */
7714: int nParam; /* Size of array aParam[] */
7715: double *aParam; /* Parameters passed to SQL geom function */
7716: void *pUser; /* Callback implementation user data */
7717: void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */
7718: };
7719:
7720:
7721: #if 0
7722: } /* end of the 'extern "C"' block */
7723: #endif
7724:
7725: #endif /* ifndef _SQLITE3RTREE_H_ */
7726:
7727:
7728: /************** End of sqlite3.h *********************************************/
7729: /************** Continuing where we left off in sqliteInt.h ******************/
7730: /************** Include hash.h in the middle of sqliteInt.h ******************/
7731: /************** Begin file hash.h ********************************************/
7732: /*
7733: ** 2001 September 22
7734: **
7735: ** The author disclaims copyright to this source code. In place of
7736: ** a legal notice, here is a blessing:
7737: **
7738: ** May you do good and not evil.
7739: ** May you find forgiveness for yourself and forgive others.
7740: ** May you share freely, never taking more than you give.
7741: **
7742: *************************************************************************
7743: ** This is the header file for the generic hash-table implemenation
7744: ** used in SQLite.
7745: */
7746: #ifndef _SQLITE_HASH_H_
7747: #define _SQLITE_HASH_H_
7748:
7749: /* Forward declarations of structures. */
7750: typedef struct Hash Hash;
7751: typedef struct HashElem HashElem;
7752:
7753: /* A complete hash table is an instance of the following structure.
7754: ** The internals of this structure are intended to be opaque -- client
7755: ** code should not attempt to access or modify the fields of this structure
7756: ** directly. Change this structure only by using the routines below.
7757: ** However, some of the "procedures" and "functions" for modifying and
7758: ** accessing this structure are really macros, so we can't really make
7759: ** this structure opaque.
7760: **
7761: ** All elements of the hash table are on a single doubly-linked list.
7762: ** Hash.first points to the head of this list.
7763: **
7764: ** There are Hash.htsize buckets. Each bucket points to a spot in
7765: ** the global doubly-linked list. The contents of the bucket are the
7766: ** element pointed to plus the next _ht.count-1 elements in the list.
7767: **
7768: ** Hash.htsize and Hash.ht may be zero. In that case lookup is done
7769: ** by a linear search of the global list. For small tables, the
7770: ** Hash.ht table is never allocated because if there are few elements
7771: ** in the table, it is faster to do a linear search than to manage
7772: ** the hash table.
7773: */
7774: struct Hash {
7775: unsigned int htsize; /* Number of buckets in the hash table */
7776: unsigned int count; /* Number of entries in this table */
7777: HashElem *first; /* The first element of the array */
7778: struct _ht { /* the hash table */
7779: int count; /* Number of entries with this hash */
7780: HashElem *chain; /* Pointer to first entry with this hash */
7781: } *ht;
7782: };
7783:
7784: /* Each element in the hash table is an instance of the following
7785: ** structure. All elements are stored on a single doubly-linked list.
7786: **
7787: ** Again, this structure is intended to be opaque, but it can't really
7788: ** be opaque because it is used by macros.
7789: */
7790: struct HashElem {
7791: HashElem *next, *prev; /* Next and previous elements in the table */
7792: void *data; /* Data associated with this element */
7793: const char *pKey; int nKey; /* Key associated with this element */
7794: };
7795:
7796: /*
7797: ** Access routines. To delete, insert a NULL pointer.
7798: */
7799: SQLITE_PRIVATE void sqlite3HashInit(Hash*);
7800: SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData);
7801: SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey);
7802: SQLITE_PRIVATE void sqlite3HashClear(Hash*);
7803:
7804: /*
7805: ** Macros for looping over all elements of a hash table. The idiom is
7806: ** like this:
7807: **
7808: ** Hash h;
7809: ** HashElem *p;
7810: ** ...
7811: ** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){
7812: ** SomeStructure *pData = sqliteHashData(p);
7813: ** // do something with pData
7814: ** }
7815: */
7816: #define sqliteHashFirst(H) ((H)->first)
7817: #define sqliteHashNext(E) ((E)->next)
7818: #define sqliteHashData(E) ((E)->data)
7819: /* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */
7820: /* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */
7821:
7822: /*
7823: ** Number of entries in a hash table
7824: */
7825: /* #define sqliteHashCount(H) ((H)->count) // NOT USED */
7826:
7827: #endif /* _SQLITE_HASH_H_ */
7828:
7829: /************** End of hash.h ************************************************/
7830: /************** Continuing where we left off in sqliteInt.h ******************/
7831: /************** Include parse.h in the middle of sqliteInt.h *****************/
7832: /************** Begin file parse.h *******************************************/
7833: #define TK_SEMI 1
7834: #define TK_EXPLAIN 2
7835: #define TK_QUERY 3
7836: #define TK_PLAN 4
7837: #define TK_BEGIN 5
7838: #define TK_TRANSACTION 6
7839: #define TK_DEFERRED 7
7840: #define TK_IMMEDIATE 8
7841: #define TK_EXCLUSIVE 9
7842: #define TK_COMMIT 10
7843: #define TK_END 11
7844: #define TK_ROLLBACK 12
7845: #define TK_SAVEPOINT 13
7846: #define TK_RELEASE 14
7847: #define TK_TO 15
7848: #define TK_TABLE 16
7849: #define TK_CREATE 17
7850: #define TK_IF 18
7851: #define TK_NOT 19
7852: #define TK_EXISTS 20
7853: #define TK_TEMP 21
7854: #define TK_LP 22
7855: #define TK_RP 23
7856: #define TK_AS 24
7857: #define TK_COMMA 25
7858: #define TK_ID 26
7859: #define TK_INDEXED 27
7860: #define TK_ABORT 28
7861: #define TK_ACTION 29
7862: #define TK_AFTER 30
7863: #define TK_ANALYZE 31
7864: #define TK_ASC 32
7865: #define TK_ATTACH 33
7866: #define TK_BEFORE 34
7867: #define TK_BY 35
7868: #define TK_CASCADE 36
7869: #define TK_CAST 37
7870: #define TK_COLUMNKW 38
7871: #define TK_CONFLICT 39
7872: #define TK_DATABASE 40
7873: #define TK_DESC 41
7874: #define TK_DETACH 42
7875: #define TK_EACH 43
7876: #define TK_FAIL 44
7877: #define TK_FOR 45
7878: #define TK_IGNORE 46
7879: #define TK_INITIALLY 47
7880: #define TK_INSTEAD 48
7881: #define TK_LIKE_KW 49
7882: #define TK_MATCH 50
7883: #define TK_NO 51
7884: #define TK_KEY 52
7885: #define TK_OF 53
7886: #define TK_OFFSET 54
7887: #define TK_PRAGMA 55
7888: #define TK_RAISE 56
7889: #define TK_REPLACE 57
7890: #define TK_RESTRICT 58
7891: #define TK_ROW 59
7892: #define TK_TRIGGER 60
7893: #define TK_VACUUM 61
7894: #define TK_VIEW 62
7895: #define TK_VIRTUAL 63
7896: #define TK_REINDEX 64
7897: #define TK_RENAME 65
7898: #define TK_CTIME_KW 66
7899: #define TK_ANY 67
7900: #define TK_OR 68
7901: #define TK_AND 69
7902: #define TK_IS 70
7903: #define TK_BETWEEN 71
7904: #define TK_IN 72
7905: #define TK_ISNULL 73
7906: #define TK_NOTNULL 74
7907: #define TK_NE 75
7908: #define TK_EQ 76
7909: #define TK_GT 77
7910: #define TK_LE 78
7911: #define TK_LT 79
7912: #define TK_GE 80
7913: #define TK_ESCAPE 81
7914: #define TK_BITAND 82
7915: #define TK_BITOR 83
7916: #define TK_LSHIFT 84
7917: #define TK_RSHIFT 85
7918: #define TK_PLUS 86
7919: #define TK_MINUS 87
7920: #define TK_STAR 88
7921: #define TK_SLASH 89
7922: #define TK_REM 90
7923: #define TK_CONCAT 91
7924: #define TK_COLLATE 92
7925: #define TK_BITNOT 93
7926: #define TK_STRING 94
7927: #define TK_JOIN_KW 95
7928: #define TK_CONSTRAINT 96
7929: #define TK_DEFAULT 97
7930: #define TK_NULL 98
7931: #define TK_PRIMARY 99
7932: #define TK_UNIQUE 100
7933: #define TK_CHECK 101
7934: #define TK_REFERENCES 102
7935: #define TK_AUTOINCR 103
7936: #define TK_ON 104
7937: #define TK_INSERT 105
7938: #define TK_DELETE 106
7939: #define TK_UPDATE 107
7940: #define TK_SET 108
7941: #define TK_DEFERRABLE 109
7942: #define TK_FOREIGN 110
7943: #define TK_DROP 111
7944: #define TK_UNION 112
7945: #define TK_ALL 113
7946: #define TK_EXCEPT 114
7947: #define TK_INTERSECT 115
7948: #define TK_SELECT 116
7949: #define TK_DISTINCT 117
7950: #define TK_DOT 118
7951: #define TK_FROM 119
7952: #define TK_JOIN 120
7953: #define TK_USING 121
7954: #define TK_ORDER 122
7955: #define TK_GROUP 123
7956: #define TK_HAVING 124
7957: #define TK_LIMIT 125
7958: #define TK_WHERE 126
7959: #define TK_INTO 127
7960: #define TK_VALUES 128
7961: #define TK_INTEGER 129
7962: #define TK_FLOAT 130
7963: #define TK_BLOB 131
7964: #define TK_REGISTER 132
7965: #define TK_VARIABLE 133
7966: #define TK_CASE 134
7967: #define TK_WHEN 135
7968: #define TK_THEN 136
7969: #define TK_ELSE 137
7970: #define TK_INDEX 138
7971: #define TK_ALTER 139
7972: #define TK_ADD 140
7973: #define TK_TO_TEXT 141
7974: #define TK_TO_BLOB 142
7975: #define TK_TO_NUMERIC 143
7976: #define TK_TO_INT 144
7977: #define TK_TO_REAL 145
7978: #define TK_ISNOT 146
7979: #define TK_END_OF_FILE 147
7980: #define TK_ILLEGAL 148
7981: #define TK_SPACE 149
7982: #define TK_UNCLOSED_STRING 150
7983: #define TK_FUNCTION 151
7984: #define TK_COLUMN 152
7985: #define TK_AGG_FUNCTION 153
7986: #define TK_AGG_COLUMN 154
7987: #define TK_CONST_FUNC 155
7988: #define TK_UMINUS 156
7989: #define TK_UPLUS 157
7990:
7991: /************** End of parse.h ***********************************************/
7992: /************** Continuing where we left off in sqliteInt.h ******************/
7993: #include <stdio.h>
7994: #include <stdlib.h>
7995: #include <string.h>
7996: #include <assert.h>
7997: #include <stddef.h>
7998:
7999: /*
8000: ** If compiling for a processor that lacks floating point support,
8001: ** substitute integer for floating-point
8002: */
8003: #ifdef SQLITE_OMIT_FLOATING_POINT
8004: # define double sqlite_int64
8005: # define float sqlite_int64
8006: # define LONGDOUBLE_TYPE sqlite_int64
8007: # ifndef SQLITE_BIG_DBL
8008: # define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50)
8009: # endif
8010: # define SQLITE_OMIT_DATETIME_FUNCS 1
8011: # define SQLITE_OMIT_TRACE 1
8012: # undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
8013: # undef SQLITE_HAVE_ISNAN
8014: #endif
8015: #ifndef SQLITE_BIG_DBL
8016: # define SQLITE_BIG_DBL (1e99)
8017: #endif
8018:
8019: /*
8020: ** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0
8021: ** afterward. Having this macro allows us to cause the C compiler
8022: ** to omit code used by TEMP tables without messy #ifndef statements.
8023: */
8024: #ifdef SQLITE_OMIT_TEMPDB
8025: #define OMIT_TEMPDB 1
8026: #else
8027: #define OMIT_TEMPDB 0
8028: #endif
8029:
8030: /*
8031: ** The "file format" number is an integer that is incremented whenever
8032: ** the VDBE-level file format changes. The following macros define the
8033: ** the default file format for new databases and the maximum file format
8034: ** that the library can read.
8035: */
8036: #define SQLITE_MAX_FILE_FORMAT 4
8037: #ifndef SQLITE_DEFAULT_FILE_FORMAT
8038: # define SQLITE_DEFAULT_FILE_FORMAT 4
8039: #endif
8040:
8041: /*
8042: ** Determine whether triggers are recursive by default. This can be
8043: ** changed at run-time using a pragma.
8044: */
8045: #ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS
8046: # define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0
8047: #endif
8048:
8049: /*
8050: ** Provide a default value for SQLITE_TEMP_STORE in case it is not specified
8051: ** on the command-line
8052: */
8053: #ifndef SQLITE_TEMP_STORE
8054: # define SQLITE_TEMP_STORE 1
8055: #endif
8056:
8057: /*
8058: ** GCC does not define the offsetof() macro so we'll have to do it
8059: ** ourselves.
8060: */
8061: #ifndef offsetof
8062: #define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
8063: #endif
8064:
8065: /*
8066: ** Check to see if this machine uses EBCDIC. (Yes, believe it or
8067: ** not, there are still machines out there that use EBCDIC.)
8068: */
8069: #if 'A' == '\301'
8070: # define SQLITE_EBCDIC 1
8071: #else
8072: # define SQLITE_ASCII 1
8073: #endif
8074:
8075: /*
8076: ** Integers of known sizes. These typedefs might change for architectures
8077: ** where the sizes very. Preprocessor macros are available so that the
8078: ** types can be conveniently redefined at compile-type. Like this:
8079: **
8080: ** cc '-DUINTPTR_TYPE=long long int' ...
8081: */
8082: #ifndef UINT32_TYPE
8083: # ifdef HAVE_UINT32_T
8084: # define UINT32_TYPE uint32_t
8085: # else
8086: # define UINT32_TYPE unsigned int
8087: # endif
8088: #endif
8089: #ifndef UINT16_TYPE
8090: # ifdef HAVE_UINT16_T
8091: # define UINT16_TYPE uint16_t
8092: # else
8093: # define UINT16_TYPE unsigned short int
8094: # endif
8095: #endif
8096: #ifndef INT16_TYPE
8097: # ifdef HAVE_INT16_T
8098: # define INT16_TYPE int16_t
8099: # else
8100: # define INT16_TYPE short int
8101: # endif
8102: #endif
8103: #ifndef UINT8_TYPE
8104: # ifdef HAVE_UINT8_T
8105: # define UINT8_TYPE uint8_t
8106: # else
8107: # define UINT8_TYPE unsigned char
8108: # endif
8109: #endif
8110: #ifndef INT8_TYPE
8111: # ifdef HAVE_INT8_T
8112: # define INT8_TYPE int8_t
8113: # else
8114: # define INT8_TYPE signed char
8115: # endif
8116: #endif
8117: #ifndef LONGDOUBLE_TYPE
8118: # define LONGDOUBLE_TYPE long double
8119: #endif
8120: typedef sqlite_int64 i64; /* 8-byte signed integer */
8121: typedef sqlite_uint64 u64; /* 8-byte unsigned integer */
8122: typedef UINT32_TYPE u32; /* 4-byte unsigned integer */
8123: typedef UINT16_TYPE u16; /* 2-byte unsigned integer */
8124: typedef INT16_TYPE i16; /* 2-byte signed integer */
8125: typedef UINT8_TYPE u8; /* 1-byte unsigned integer */
8126: typedef INT8_TYPE i8; /* 1-byte signed integer */
8127:
8128: /*
8129: ** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value
8130: ** that can be stored in a u32 without loss of data. The value
8131: ** is 0x00000000ffffffff. But because of quirks of some compilers, we
8132: ** have to specify the value in the less intuitive manner shown:
8133: */
8134: #define SQLITE_MAX_U32 ((((u64)1)<<32)-1)
8135:
8136: /*
8137: ** The datatype used to store estimates of the number of rows in a
8138: ** table or index. This is an unsigned integer type. For 99.9% of
8139: ** the world, a 32-bit integer is sufficient. But a 64-bit integer
8140: ** can be used at compile-time if desired.
8141: */
8142: #ifdef SQLITE_64BIT_STATS
8143: typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */
8144: #else
8145: typedef u32 tRowcnt; /* 32-bit is the default */
8146: #endif
8147:
8148: /*
8149: ** Macros to determine whether the machine is big or little endian,
8150: ** evaluated at runtime.
8151: */
8152: #ifdef SQLITE_AMALGAMATION
8153: SQLITE_PRIVATE const int sqlite3one = 1;
8154: #else
8155: SQLITE_PRIVATE const int sqlite3one;
8156: #endif
8157: #if defined(i386) || defined(__i386__) || defined(_M_IX86)\
8158: || defined(__x86_64) || defined(__x86_64__)
8159: # define SQLITE_BIGENDIAN 0
8160: # define SQLITE_LITTLEENDIAN 1
8161: # define SQLITE_UTF16NATIVE SQLITE_UTF16LE
8162: #else
8163: # define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0)
8164: # define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1)
8165: # define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE)
8166: #endif
8167:
8168: /*
8169: ** Constants for the largest and smallest possible 64-bit signed integers.
8170: ** These macros are designed to work correctly on both 32-bit and 64-bit
8171: ** compilers.
8172: */
8173: #define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32))
8174: #define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64)
8175:
8176: /*
8177: ** Round up a number to the next larger multiple of 8. This is used
8178: ** to force 8-byte alignment on 64-bit architectures.
8179: */
8180: #define ROUND8(x) (((x)+7)&~7)
8181:
8182: /*
8183: ** Round down to the nearest multiple of 8
8184: */
8185: #define ROUNDDOWN8(x) ((x)&~7)
8186:
8187: /*
8188: ** Assert that the pointer X is aligned to an 8-byte boundary. This
8189: ** macro is used only within assert() to verify that the code gets
8190: ** all alignment restrictions correct.
8191: **
8192: ** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the
8193: ** underlying malloc() implemention might return us 4-byte aligned
8194: ** pointers. In that case, only verify 4-byte alignment.
8195: */
8196: #ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
8197: # define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0)
8198: #else
8199: # define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0)
8200: #endif
8201:
8202:
8203: /*
8204: ** An instance of the following structure is used to store the busy-handler
8205: ** callback for a given sqlite handle.
8206: **
8207: ** The sqlite.busyHandler member of the sqlite struct contains the busy
8208: ** callback for the database handle. Each pager opened via the sqlite
8209: ** handle is passed a pointer to sqlite.busyHandler. The busy-handler
8210: ** callback is currently invoked only from within pager.c.
8211: */
8212: typedef struct BusyHandler BusyHandler;
8213: struct BusyHandler {
8214: int (*xFunc)(void *,int); /* The busy callback */
8215: void *pArg; /* First arg to busy callback */
8216: int nBusy; /* Incremented with each busy call */
8217: };
8218:
8219: /*
8220: ** Name of the master database table. The master database table
8221: ** is a special table that holds the names and attributes of all
8222: ** user tables and indices.
8223: */
8224: #define MASTER_NAME "sqlite_master"
8225: #define TEMP_MASTER_NAME "sqlite_temp_master"
8226:
8227: /*
8228: ** The root-page of the master database table.
8229: */
8230: #define MASTER_ROOT 1
8231:
8232: /*
8233: ** The name of the schema table.
8234: */
8235: #define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME)
8236:
8237: /*
8238: ** A convenience macro that returns the number of elements in
8239: ** an array.
8240: */
8241: #define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0])))
8242:
8243: /*
8244: ** The following value as a destructor means to use sqlite3DbFree().
1.2.2.1 ! misho 8245: ** The sqlite3DbFree() routine requires two parameters instead of the
! 8246: ** one parameter that destructors normally want. So we have to introduce
! 8247: ** this magic value that the code knows to handle differently. Any
! 8248: ** pointer will work here as long as it is distinct from SQLITE_STATIC
! 8249: ** and SQLITE_TRANSIENT.
1.2 misho 8250: */
1.2.2.1 ! misho 8251: #define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3MallocSize)
1.2 misho 8252:
8253: /*
8254: ** When SQLITE_OMIT_WSD is defined, it means that the target platform does
8255: ** not support Writable Static Data (WSD) such as global and static variables.
8256: ** All variables must either be on the stack or dynamically allocated from
8257: ** the heap. When WSD is unsupported, the variable declarations scattered
8258: ** throughout the SQLite code must become constants instead. The SQLITE_WSD
8259: ** macro is used for this purpose. And instead of referencing the variable
8260: ** directly, we use its constant as a key to lookup the run-time allocated
8261: ** buffer that holds real variable. The constant is also the initializer
8262: ** for the run-time allocated buffer.
8263: **
8264: ** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL
8265: ** macros become no-ops and have zero performance impact.
8266: */
8267: #ifdef SQLITE_OMIT_WSD
8268: #define SQLITE_WSD const
8269: #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v)))
8270: #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config)
8271: SQLITE_API int sqlite3_wsd_init(int N, int J);
8272: SQLITE_API void *sqlite3_wsd_find(void *K, int L);
8273: #else
8274: #define SQLITE_WSD
8275: #define GLOBAL(t,v) v
8276: #define sqlite3GlobalConfig sqlite3Config
8277: #endif
8278:
8279: /*
8280: ** The following macros are used to suppress compiler warnings and to
8281: ** make it clear to human readers when a function parameter is deliberately
8282: ** left unused within the body of a function. This usually happens when
8283: ** a function is called via a function pointer. For example the
8284: ** implementation of an SQL aggregate step callback may not use the
8285: ** parameter indicating the number of arguments passed to the aggregate,
8286: ** if it knows that this is enforced elsewhere.
8287: **
8288: ** When a function parameter is not used at all within the body of a function,
8289: ** it is generally named "NotUsed" or "NotUsed2" to make things even clearer.
8290: ** However, these macros may also be used to suppress warnings related to
8291: ** parameters that may or may not be used depending on compilation options.
8292: ** For example those parameters only used in assert() statements. In these
8293: ** cases the parameters are named as per the usual conventions.
8294: */
8295: #define UNUSED_PARAMETER(x) (void)(x)
8296: #define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y)
8297:
8298: /*
8299: ** Forward references to structures
8300: */
8301: typedef struct AggInfo AggInfo;
8302: typedef struct AuthContext AuthContext;
8303: typedef struct AutoincInfo AutoincInfo;
8304: typedef struct Bitvec Bitvec;
8305: typedef struct CollSeq CollSeq;
8306: typedef struct Column Column;
8307: typedef struct Db Db;
8308: typedef struct Schema Schema;
8309: typedef struct Expr Expr;
8310: typedef struct ExprList ExprList;
8311: typedef struct ExprSpan ExprSpan;
8312: typedef struct FKey FKey;
8313: typedef struct FuncDestructor FuncDestructor;
8314: typedef struct FuncDef FuncDef;
8315: typedef struct FuncDefHash FuncDefHash;
8316: typedef struct IdList IdList;
8317: typedef struct Index Index;
8318: typedef struct IndexSample IndexSample;
8319: typedef struct KeyClass KeyClass;
8320: typedef struct KeyInfo KeyInfo;
8321: typedef struct Lookaside Lookaside;
8322: typedef struct LookasideSlot LookasideSlot;
8323: typedef struct Module Module;
8324: typedef struct NameContext NameContext;
8325: typedef struct Parse Parse;
8326: typedef struct RowSet RowSet;
8327: typedef struct Savepoint Savepoint;
8328: typedef struct Select Select;
1.2.2.1 ! misho 8329: typedef struct SelectDest SelectDest;
1.2 misho 8330: typedef struct SrcList SrcList;
8331: typedef struct StrAccum StrAccum;
8332: typedef struct Table Table;
8333: typedef struct TableLock TableLock;
8334: typedef struct Token Token;
8335: typedef struct Trigger Trigger;
8336: typedef struct TriggerPrg TriggerPrg;
8337: typedef struct TriggerStep TriggerStep;
8338: typedef struct UnpackedRecord UnpackedRecord;
8339: typedef struct VTable VTable;
8340: typedef struct VtabCtx VtabCtx;
8341: typedef struct Walker Walker;
8342: typedef struct WherePlan WherePlan;
8343: typedef struct WhereInfo WhereInfo;
8344: typedef struct WhereLevel WhereLevel;
8345:
8346: /*
8347: ** Defer sourcing vdbe.h and btree.h until after the "u8" and
8348: ** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque
8349: ** pointer types (i.e. FuncDef) defined above.
8350: */
8351: /************** Include btree.h in the middle of sqliteInt.h *****************/
8352: /************** Begin file btree.h *******************************************/
8353: /*
8354: ** 2001 September 15
8355: **
8356: ** The author disclaims copyright to this source code. In place of
8357: ** a legal notice, here is a blessing:
8358: **
8359: ** May you do good and not evil.
8360: ** May you find forgiveness for yourself and forgive others.
8361: ** May you share freely, never taking more than you give.
8362: **
8363: *************************************************************************
8364: ** This header file defines the interface that the sqlite B-Tree file
8365: ** subsystem. See comments in the source code for a detailed description
8366: ** of what each interface routine does.
8367: */
8368: #ifndef _BTREE_H_
8369: #define _BTREE_H_
8370:
8371: /* TODO: This definition is just included so other modules compile. It
8372: ** needs to be revisited.
8373: */
8374: #define SQLITE_N_BTREE_META 10
8375:
8376: /*
8377: ** If defined as non-zero, auto-vacuum is enabled by default. Otherwise
8378: ** it must be turned on for each database using "PRAGMA auto_vacuum = 1".
8379: */
8380: #ifndef SQLITE_DEFAULT_AUTOVACUUM
8381: #define SQLITE_DEFAULT_AUTOVACUUM 0
8382: #endif
8383:
8384: #define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */
8385: #define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */
8386: #define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */
8387:
8388: /*
8389: ** Forward declarations of structure
8390: */
8391: typedef struct Btree Btree;
8392: typedef struct BtCursor BtCursor;
8393: typedef struct BtShared BtShared;
8394:
8395:
8396: SQLITE_PRIVATE int sqlite3BtreeOpen(
8397: sqlite3_vfs *pVfs, /* VFS to use with this b-tree */
8398: const char *zFilename, /* Name of database file to open */
8399: sqlite3 *db, /* Associated database connection */
8400: Btree **ppBtree, /* Return open Btree* here */
8401: int flags, /* Flags */
8402: int vfsFlags /* Flags passed through to VFS open */
8403: );
8404:
8405: /* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the
8406: ** following values.
8407: **
8408: ** NOTE: These values must match the corresponding PAGER_ values in
8409: ** pager.h.
8410: */
8411: #define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */
1.2.2.1 ! misho 8412: #define BTREE_MEMORY 2 /* This is an in-memory DB */
! 8413: #define BTREE_SINGLE 4 /* The file contains at most 1 b-tree */
! 8414: #define BTREE_UNORDERED 8 /* Use of a hash implementation is OK */
1.2 misho 8415:
8416: SQLITE_PRIVATE int sqlite3BtreeClose(Btree*);
8417: SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int);
8418: SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int,int);
8419: SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*);
8420: SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix);
8421: SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*);
8422: SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int);
8423: SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*);
8424: SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int);
8425: SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*);
1.2.2.1 ! misho 8426: #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG)
! 8427: SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p);
! 8428: #endif
1.2 misho 8429: SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int);
8430: SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *);
8431: SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int);
8432: SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster);
8433: SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int);
8434: SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*);
1.2.2.1 ! misho 8435: SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*,int);
1.2 misho 8436: SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int);
8437: SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags);
8438: SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*);
8439: SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*);
8440: SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*);
8441: SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *));
8442: SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree);
8443: SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock);
8444: SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int);
8445:
8446: SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *);
8447: SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *);
8448: SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *);
8449:
8450: SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *);
8451:
8452: /* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR
8453: ** of the flags shown below.
8454: **
8455: ** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set.
8456: ** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data
8457: ** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With
8458: ** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored
8459: ** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL
8460: ** indices.)
8461: */
8462: #define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */
8463: #define BTREE_BLOBKEY 2 /* Table has keys only - no data */
8464:
8465: SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*);
8466: SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*);
8467: SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int);
8468:
8469: SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue);
8470: SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value);
8471:
1.2.2.1 ! misho 8472: SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p);
! 8473:
1.2 misho 8474: /*
8475: ** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta
8476: ** should be one of the following values. The integer values are assigned
8477: ** to constants so that the offset of the corresponding field in an
8478: ** SQLite database header may be found using the following formula:
8479: **
8480: ** offset = 36 + (idx * 4)
8481: **
8482: ** For example, the free-page-count field is located at byte offset 36 of
8483: ** the database file header. The incr-vacuum-flag field is located at
8484: ** byte offset 64 (== 36+4*7).
8485: */
8486: #define BTREE_FREE_PAGE_COUNT 0
8487: #define BTREE_SCHEMA_VERSION 1
8488: #define BTREE_FILE_FORMAT 2
8489: #define BTREE_DEFAULT_CACHE_SIZE 3
8490: #define BTREE_LARGEST_ROOT_PAGE 4
8491: #define BTREE_TEXT_ENCODING 5
8492: #define BTREE_USER_VERSION 6
8493: #define BTREE_INCR_VACUUM 7
8494:
1.2.2.1 ! misho 8495: /*
! 8496: ** Values that may be OR'd together to form the second argument of an
! 8497: ** sqlite3BtreeCursorHints() call.
! 8498: */
! 8499: #define BTREE_BULKLOAD 0x00000001
! 8500:
1.2 misho 8501: SQLITE_PRIVATE int sqlite3BtreeCursor(
8502: Btree*, /* BTree containing table to open */
8503: int iTable, /* Index of root page */
8504: int wrFlag, /* 1 for writing. 0 for read-only */
8505: struct KeyInfo*, /* First argument to compare function */
8506: BtCursor *pCursor /* Space to write cursor structure */
8507: );
8508: SQLITE_PRIVATE int sqlite3BtreeCursorSize(void);
8509: SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*);
8510:
8511: SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*);
8512: SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
8513: BtCursor*,
8514: UnpackedRecord *pUnKey,
8515: i64 intKey,
8516: int bias,
8517: int *pRes
8518: );
8519: SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*);
8520: SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*);
8521: SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey,
8522: const void *pData, int nData,
8523: int nZero, int bias, int seekResult);
8524: SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes);
8525: SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes);
8526: SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes);
8527: SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*);
8528: SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes);
8529: SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize);
8530: SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*);
8531: SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt);
8532: SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt);
8533: SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize);
8534: SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*);
8535: SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64);
8536: SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*);
8537:
8538: SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*);
8539: SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*);
8540:
8541: SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*);
8542: SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *);
8543: SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *);
8544: SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion);
1.2.2.1 ! misho 8545: SQLITE_PRIVATE void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask);
1.2 misho 8546:
8547: #ifndef NDEBUG
8548: SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*);
8549: #endif
8550:
8551: #ifndef SQLITE_OMIT_BTREECOUNT
8552: SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *);
8553: #endif
8554:
8555: #ifdef SQLITE_TEST
8556: SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int);
8557: SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*);
8558: #endif
8559:
8560: #ifndef SQLITE_OMIT_WAL
8561: SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *);
8562: #endif
8563:
8564: /*
8565: ** If we are not using shared cache, then there is no need to
8566: ** use mutexes to access the BtShared structures. So make the
8567: ** Enter and Leave procedures no-ops.
8568: */
8569: #ifndef SQLITE_OMIT_SHARED_CACHE
8570: SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*);
8571: SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*);
8572: #else
8573: # define sqlite3BtreeEnter(X)
8574: # define sqlite3BtreeEnterAll(X)
8575: #endif
8576:
8577: #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE
8578: SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*);
8579: SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*);
8580: SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*);
8581: SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*);
8582: SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*);
8583: #ifndef NDEBUG
8584: /* These routines are used inside assert() statements only. */
8585: SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*);
8586: SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*);
8587: SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*);
8588: #endif
8589: #else
8590:
8591: # define sqlite3BtreeSharable(X) 0
8592: # define sqlite3BtreeLeave(X)
8593: # define sqlite3BtreeEnterCursor(X)
8594: # define sqlite3BtreeLeaveCursor(X)
8595: # define sqlite3BtreeLeaveAll(X)
8596:
8597: # define sqlite3BtreeHoldsMutex(X) 1
8598: # define sqlite3BtreeHoldsAllMutexes(X) 1
8599: # define sqlite3SchemaMutexHeld(X,Y,Z) 1
8600: #endif
8601:
8602:
8603: #endif /* _BTREE_H_ */
8604:
8605: /************** End of btree.h ***********************************************/
8606: /************** Continuing where we left off in sqliteInt.h ******************/
8607: /************** Include vdbe.h in the middle of sqliteInt.h ******************/
8608: /************** Begin file vdbe.h ********************************************/
8609: /*
8610: ** 2001 September 15
8611: **
8612: ** The author disclaims copyright to this source code. In place of
8613: ** a legal notice, here is a blessing:
8614: **
8615: ** May you do good and not evil.
8616: ** May you find forgiveness for yourself and forgive others.
8617: ** May you share freely, never taking more than you give.
8618: **
8619: *************************************************************************
8620: ** Header file for the Virtual DataBase Engine (VDBE)
8621: **
8622: ** This header defines the interface to the virtual database engine
8623: ** or VDBE. The VDBE implements an abstract machine that runs a
8624: ** simple program to access and modify the underlying database.
8625: */
8626: #ifndef _SQLITE_VDBE_H_
8627: #define _SQLITE_VDBE_H_
8628: /* #include <stdio.h> */
8629:
8630: /*
8631: ** A single VDBE is an opaque structure named "Vdbe". Only routines
8632: ** in the source file sqliteVdbe.c are allowed to see the insides
8633: ** of this structure.
8634: */
8635: typedef struct Vdbe Vdbe;
8636:
8637: /*
8638: ** The names of the following types declared in vdbeInt.h are required
8639: ** for the VdbeOp definition.
8640: */
8641: typedef struct VdbeFunc VdbeFunc;
8642: typedef struct Mem Mem;
8643: typedef struct SubProgram SubProgram;
8644:
8645: /*
8646: ** A single instruction of the virtual machine has an opcode
8647: ** and as many as three operands. The instruction is recorded
8648: ** as an instance of the following structure:
8649: */
8650: struct VdbeOp {
8651: u8 opcode; /* What operation to perform */
8652: signed char p4type; /* One of the P4_xxx constants for p4 */
8653: u8 opflags; /* Mask of the OPFLG_* flags in opcodes.h */
8654: u8 p5; /* Fifth parameter is an unsigned character */
8655: int p1; /* First operand */
8656: int p2; /* Second parameter (often the jump destination) */
8657: int p3; /* The third parameter */
8658: union { /* fourth parameter */
8659: int i; /* Integer value if p4type==P4_INT32 */
8660: void *p; /* Generic pointer */
8661: char *z; /* Pointer to data for string (char array) types */
8662: i64 *pI64; /* Used when p4type is P4_INT64 */
8663: double *pReal; /* Used when p4type is P4_REAL */
8664: FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */
8665: VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */
8666: CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */
8667: Mem *pMem; /* Used when p4type is P4_MEM */
8668: VTable *pVtab; /* Used when p4type is P4_VTAB */
8669: KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */
8670: int *ai; /* Used when p4type is P4_INTARRAY */
8671: SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */
8672: int (*xAdvance)(BtCursor *, int *);
8673: } p4;
8674: #ifdef SQLITE_DEBUG
8675: char *zComment; /* Comment to improve readability */
8676: #endif
8677: #ifdef VDBE_PROFILE
8678: int cnt; /* Number of times this instruction was executed */
8679: u64 cycles; /* Total time spent executing this instruction */
8680: #endif
8681: };
8682: typedef struct VdbeOp VdbeOp;
8683:
8684:
8685: /*
8686: ** A sub-routine used to implement a trigger program.
8687: */
8688: struct SubProgram {
8689: VdbeOp *aOp; /* Array of opcodes for sub-program */
8690: int nOp; /* Elements in aOp[] */
8691: int nMem; /* Number of memory cells required */
8692: int nCsr; /* Number of cursors required */
8693: int nOnce; /* Number of OP_Once instructions */
8694: void *token; /* id that may be used to recursive triggers */
8695: SubProgram *pNext; /* Next sub-program already visited */
8696: };
8697:
8698: /*
8699: ** A smaller version of VdbeOp used for the VdbeAddOpList() function because
8700: ** it takes up less space.
8701: */
8702: struct VdbeOpList {
8703: u8 opcode; /* What operation to perform */
8704: signed char p1; /* First operand */
8705: signed char p2; /* Second parameter (often the jump destination) */
8706: signed char p3; /* Third parameter */
8707: };
8708: typedef struct VdbeOpList VdbeOpList;
8709:
8710: /*
8711: ** Allowed values of VdbeOp.p4type
8712: */
8713: #define P4_NOTUSED 0 /* The P4 parameter is not used */
8714: #define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */
8715: #define P4_STATIC (-2) /* Pointer to a static string */
8716: #define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */
8717: #define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */
8718: #define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */
8719: #define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */
8720: #define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */
8721: #define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */
8722: #define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */
8723: #define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */
8724: #define P4_REAL (-12) /* P4 is a 64-bit floating point value */
8725: #define P4_INT64 (-13) /* P4 is a 64-bit signed integer */
8726: #define P4_INT32 (-14) /* P4 is a 32-bit signed integer */
8727: #define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */
8728: #define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */
8729: #define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */
8730:
8731: /* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure
8732: ** is made. That copy is freed when the Vdbe is finalized. But if the
8733: ** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still
8734: ** gets freed when the Vdbe is finalized so it still should be obtained
8735: ** from a single sqliteMalloc(). But no copy is made and the calling
8736: ** function should *not* try to free the KeyInfo.
8737: */
8738: #define P4_KEYINFO_HANDOFF (-16)
8739: #define P4_KEYINFO_STATIC (-17)
8740:
8741: /*
8742: ** The Vdbe.aColName array contains 5n Mem structures, where n is the
8743: ** number of columns of data returned by the statement.
8744: */
8745: #define COLNAME_NAME 0
8746: #define COLNAME_DECLTYPE 1
8747: #define COLNAME_DATABASE 2
8748: #define COLNAME_TABLE 3
8749: #define COLNAME_COLUMN 4
8750: #ifdef SQLITE_ENABLE_COLUMN_METADATA
8751: # define COLNAME_N 5 /* Number of COLNAME_xxx symbols */
8752: #else
8753: # ifdef SQLITE_OMIT_DECLTYPE
8754: # define COLNAME_N 1 /* Store only the name */
8755: # else
8756: # define COLNAME_N 2 /* Store the name and decltype */
8757: # endif
8758: #endif
8759:
8760: /*
8761: ** The following macro converts a relative address in the p2 field
8762: ** of a VdbeOp structure into a negative number so that
8763: ** sqlite3VdbeAddOpList() knows that the address is relative. Calling
8764: ** the macro again restores the address.
8765: */
8766: #define ADDR(X) (-1-(X))
8767:
8768: /*
8769: ** The makefile scans the vdbe.c source file and creates the "opcodes.h"
8770: ** header file that defines a number for each opcode used by the VDBE.
8771: */
8772: /************** Include opcodes.h in the middle of vdbe.h ********************/
8773: /************** Begin file opcodes.h *****************************************/
8774: /* Automatically generated. Do not edit */
8775: /* See the mkopcodeh.awk script for details */
8776: #define OP_Goto 1
8777: #define OP_Gosub 2
8778: #define OP_Return 3
8779: #define OP_Yield 4
8780: #define OP_HaltIfNull 5
8781: #define OP_Halt 6
8782: #define OP_Integer 7
8783: #define OP_Int64 8
8784: #define OP_Real 130 /* same as TK_FLOAT */
8785: #define OP_String8 94 /* same as TK_STRING */
8786: #define OP_String 9
8787: #define OP_Null 10
8788: #define OP_Blob 11
8789: #define OP_Variable 12
8790: #define OP_Move 13
8791: #define OP_Copy 14
8792: #define OP_SCopy 15
8793: #define OP_ResultRow 16
8794: #define OP_Concat 91 /* same as TK_CONCAT */
8795: #define OP_Add 86 /* same as TK_PLUS */
8796: #define OP_Subtract 87 /* same as TK_MINUS */
8797: #define OP_Multiply 88 /* same as TK_STAR */
8798: #define OP_Divide 89 /* same as TK_SLASH */
8799: #define OP_Remainder 90 /* same as TK_REM */
8800: #define OP_CollSeq 17
8801: #define OP_Function 18
8802: #define OP_BitAnd 82 /* same as TK_BITAND */
8803: #define OP_BitOr 83 /* same as TK_BITOR */
8804: #define OP_ShiftLeft 84 /* same as TK_LSHIFT */
8805: #define OP_ShiftRight 85 /* same as TK_RSHIFT */
8806: #define OP_AddImm 20
8807: #define OP_MustBeInt 21
8808: #define OP_RealAffinity 22
8809: #define OP_ToText 141 /* same as TK_TO_TEXT */
8810: #define OP_ToBlob 142 /* same as TK_TO_BLOB */
8811: #define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/
8812: #define OP_ToInt 144 /* same as TK_TO_INT */
8813: #define OP_ToReal 145 /* same as TK_TO_REAL */
8814: #define OP_Eq 76 /* same as TK_EQ */
8815: #define OP_Ne 75 /* same as TK_NE */
8816: #define OP_Lt 79 /* same as TK_LT */
8817: #define OP_Le 78 /* same as TK_LE */
8818: #define OP_Gt 77 /* same as TK_GT */
8819: #define OP_Ge 80 /* same as TK_GE */
8820: #define OP_Permutation 23
8821: #define OP_Compare 24
8822: #define OP_Jump 25
8823: #define OP_And 69 /* same as TK_AND */
8824: #define OP_Or 68 /* same as TK_OR */
8825: #define OP_Not 19 /* same as TK_NOT */
8826: #define OP_BitNot 93 /* same as TK_BITNOT */
8827: #define OP_Once 26
8828: #define OP_If 27
8829: #define OP_IfNot 28
8830: #define OP_IsNull 73 /* same as TK_ISNULL */
8831: #define OP_NotNull 74 /* same as TK_NOTNULL */
8832: #define OP_Column 29
8833: #define OP_Affinity 30
8834: #define OP_MakeRecord 31
8835: #define OP_Count 32
8836: #define OP_Savepoint 33
8837: #define OP_AutoCommit 34
8838: #define OP_Transaction 35
8839: #define OP_ReadCookie 36
8840: #define OP_SetCookie 37
8841: #define OP_VerifyCookie 38
8842: #define OP_OpenRead 39
8843: #define OP_OpenWrite 40
8844: #define OP_OpenAutoindex 41
8845: #define OP_OpenEphemeral 42
8846: #define OP_SorterOpen 43
8847: #define OP_OpenPseudo 44
8848: #define OP_Close 45
8849: #define OP_SeekLt 46
8850: #define OP_SeekLe 47
8851: #define OP_SeekGe 48
8852: #define OP_SeekGt 49
8853: #define OP_Seek 50
8854: #define OP_NotFound 51
8855: #define OP_Found 52
8856: #define OP_IsUnique 53
8857: #define OP_NotExists 54
8858: #define OP_Sequence 55
8859: #define OP_NewRowid 56
8860: #define OP_Insert 57
8861: #define OP_InsertInt 58
8862: #define OP_Delete 59
8863: #define OP_ResetCount 60
8864: #define OP_SorterCompare 61
8865: #define OP_SorterData 62
8866: #define OP_RowKey 63
8867: #define OP_RowData 64
8868: #define OP_Rowid 65
8869: #define OP_NullRow 66
8870: #define OP_Last 67
8871: #define OP_SorterSort 70
8872: #define OP_Sort 71
8873: #define OP_Rewind 72
8874: #define OP_SorterNext 81
8875: #define OP_Prev 92
8876: #define OP_Next 95
8877: #define OP_SorterInsert 96
8878: #define OP_IdxInsert 97
8879: #define OP_IdxDelete 98
8880: #define OP_IdxRowid 99
8881: #define OP_IdxLT 100
8882: #define OP_IdxGE 101
8883: #define OP_Destroy 102
8884: #define OP_Clear 103
8885: #define OP_CreateIndex 104
8886: #define OP_CreateTable 105
8887: #define OP_ParseSchema 106
8888: #define OP_LoadAnalysis 107
8889: #define OP_DropTable 108
8890: #define OP_DropIndex 109
8891: #define OP_DropTrigger 110
8892: #define OP_IntegrityCk 111
8893: #define OP_RowSetAdd 112
8894: #define OP_RowSetRead 113
8895: #define OP_RowSetTest 114
8896: #define OP_Program 115
8897: #define OP_Param 116
8898: #define OP_FkCounter 117
8899: #define OP_FkIfZero 118
8900: #define OP_MemMax 119
8901: #define OP_IfPos 120
8902: #define OP_IfNeg 121
8903: #define OP_IfZero 122
8904: #define OP_AggStep 123
8905: #define OP_AggFinal 124
8906: #define OP_Checkpoint 125
8907: #define OP_JournalMode 126
8908: #define OP_Vacuum 127
8909: #define OP_IncrVacuum 128
8910: #define OP_Expire 129
8911: #define OP_TableLock 131
8912: #define OP_VBegin 132
8913: #define OP_VCreate 133
8914: #define OP_VDestroy 134
8915: #define OP_VOpen 135
8916: #define OP_VFilter 136
8917: #define OP_VColumn 137
8918: #define OP_VNext 138
8919: #define OP_VRename 139
8920: #define OP_VUpdate 140
8921: #define OP_Pagecount 146
8922: #define OP_MaxPgcnt 147
8923: #define OP_Trace 148
8924: #define OP_Noop 149
8925: #define OP_Explain 150
8926:
8927:
8928: /* Properties such as "out2" or "jump" that are specified in
8929: ** comments following the "case" for each opcode in the vdbe.c
8930: ** are encoded into bitvectors as follows:
8931: */
8932: #define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */
8933: #define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */
8934: #define OPFLG_IN1 0x0004 /* in1: P1 is an input */
8935: #define OPFLG_IN2 0x0008 /* in2: P2 is an input */
8936: #define OPFLG_IN3 0x0010 /* in3: P3 is an input */
8937: #define OPFLG_OUT2 0x0020 /* out2: P2 is an output */
8938: #define OPFLG_OUT3 0x0040 /* out3: P3 is an output */
8939: #define OPFLG_INITIALIZER {\
8940: /* 0 */ 0x00, 0x01, 0x01, 0x04, 0x04, 0x10, 0x00, 0x02,\
1.2.2.1 ! misho 8941: /* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x24,\
1.2 misho 8942: /* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\
8943: /* 24 */ 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00,\
8944: /* 32 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00,\
8945: /* 40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\
8946: /* 48 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x02,\
8947: /* 56 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
8948: /* 64 */ 0x00, 0x02, 0x00, 0x01, 0x4c, 0x4c, 0x01, 0x01,\
8949: /* 72 */ 0x01, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\
8950: /* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\
8951: /* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x01,\
8952: /* 96 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\
8953: /* 104 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
8954: /* 112 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\
8955: /* 120 */ 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00,\
8956: /* 128 */ 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\
8957: /* 136 */ 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x04, 0x04,\
8958: /* 144 */ 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00,}
8959:
8960: /************** End of opcodes.h *********************************************/
8961: /************** Continuing where we left off in vdbe.h ***********************/
8962:
8963: /*
8964: ** Prototypes for the VDBE interface. See comments on the implementation
8965: ** for a description of what each of these routines does.
8966: */
8967: SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*);
8968: SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int);
8969: SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int);
8970: SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
8971: SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
8972: SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
8973: SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int);
8974: SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp);
8975: SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
8976: SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1);
8977: SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2);
8978: SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3);
8979: SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5);
8980: SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr);
8981: SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr);
8982: SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N);
8983: SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int);
8984: SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int);
8985: SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*);
8986: SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*);
8987: SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*);
1.2.2.1 ! misho 8988: SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*);
1.2 misho 8989: SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*);
8990: SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*);
8991: SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int);
8992: SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*);
8993: #ifdef SQLITE_DEBUG
8994: SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int);
8995: SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*);
8996: #endif
8997: SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*);
8998: SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*);
8999: SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*);
9000: SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int);
9001: SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*));
9002: SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*);
9003: SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*);
9004: SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int);
9005: SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*);
9006: SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*);
9007: SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, u8);
9008: SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int);
9009: #ifndef SQLITE_OMIT_TRACE
9010: SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*);
9011: #endif
9012:
9013: SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*);
9014: SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*);
9015: SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **);
9016:
9017: #ifndef SQLITE_OMIT_TRIGGER
9018: SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *);
9019: #endif
9020:
9021:
9022: #ifndef NDEBUG
9023: SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...);
9024: # define VdbeComment(X) sqlite3VdbeComment X
9025: SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...);
9026: # define VdbeNoopComment(X) sqlite3VdbeNoopComment X
9027: #else
9028: # define VdbeComment(X)
9029: # define VdbeNoopComment(X)
9030: #endif
9031:
9032: #endif
9033:
9034: /************** End of vdbe.h ************************************************/
9035: /************** Continuing where we left off in sqliteInt.h ******************/
9036: /************** Include pager.h in the middle of sqliteInt.h *****************/
9037: /************** Begin file pager.h *******************************************/
9038: /*
9039: ** 2001 September 15
9040: **
9041: ** The author disclaims copyright to this source code. In place of
9042: ** a legal notice, here is a blessing:
9043: **
9044: ** May you do good and not evil.
9045: ** May you find forgiveness for yourself and forgive others.
9046: ** May you share freely, never taking more than you give.
9047: **
9048: *************************************************************************
9049: ** This header file defines the interface that the sqlite page cache
9050: ** subsystem. The page cache subsystem reads and writes a file a page
9051: ** at a time and provides a journal for rollback.
9052: */
9053:
9054: #ifndef _PAGER_H_
9055: #define _PAGER_H_
9056:
9057: /*
9058: ** Default maximum size for persistent journal files. A negative
9059: ** value means no limit. This value may be overridden using the
9060: ** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit".
9061: */
9062: #ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT
9063: #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1
9064: #endif
9065:
9066: /*
9067: ** The type used to represent a page number. The first page in a file
9068: ** is called page 1. 0 is used to represent "not a page".
9069: */
9070: typedef u32 Pgno;
9071:
9072: /*
9073: ** Each open file is managed by a separate instance of the "Pager" structure.
9074: */
9075: typedef struct Pager Pager;
9076:
9077: /*
9078: ** Handle type for pages.
9079: */
9080: typedef struct PgHdr DbPage;
9081:
9082: /*
9083: ** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is
9084: ** reserved for working around a windows/posix incompatibility). It is
9085: ** used in the journal to signify that the remainder of the journal file
9086: ** is devoted to storing a master journal name - there are no more pages to
9087: ** roll back. See comments for function writeMasterJournal() in pager.c
9088: ** for details.
9089: */
9090: #define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1))
9091:
9092: /*
9093: ** Allowed values for the flags parameter to sqlite3PagerOpen().
9094: **
9095: ** NOTE: These values must match the corresponding BTREE_ values in btree.h.
9096: */
9097: #define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */
1.2.2.1 ! misho 9098: #define PAGER_MEMORY 0x0002 /* In-memory database */
1.2 misho 9099:
9100: /*
9101: ** Valid values for the second argument to sqlite3PagerLockingMode().
9102: */
9103: #define PAGER_LOCKINGMODE_QUERY -1
9104: #define PAGER_LOCKINGMODE_NORMAL 0
9105: #define PAGER_LOCKINGMODE_EXCLUSIVE 1
9106:
9107: /*
9108: ** Numeric constants that encode the journalmode.
9109: */
9110: #define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */
9111: #define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */
9112: #define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */
9113: #define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */
9114: #define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */
9115: #define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */
9116: #define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */
9117:
9118: /*
9119: ** The remainder of this file contains the declarations of the functions
9120: ** that make up the Pager sub-system API. See source code comments for
9121: ** a detailed description of each routine.
9122: */
9123:
9124: /* Open and close a Pager connection. */
9125: SQLITE_PRIVATE int sqlite3PagerOpen(
9126: sqlite3_vfs*,
9127: Pager **ppPager,
9128: const char*,
9129: int,
9130: int,
9131: int,
9132: void(*)(DbPage*)
9133: );
9134: SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager);
9135: SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*);
9136:
9137: /* Functions used to configure a Pager object. */
9138: SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *);
9139: SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int);
9140: SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int);
9141: SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int);
9142: SQLITE_PRIVATE void sqlite3PagerShrink(Pager*);
9143: SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int);
9144: SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int);
9145: SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int);
9146: SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*);
9147: SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*);
9148: SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64);
9149: SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*);
9150:
9151: /* Functions used to obtain and release page references. */
9152: SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag);
9153: #define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0)
9154: SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno);
9155: SQLITE_PRIVATE void sqlite3PagerRef(DbPage*);
9156: SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*);
9157:
9158: /* Operations on page references. */
9159: SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*);
9160: SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*);
9161: SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int);
9162: SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*);
9163: SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *);
9164: SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *);
9165:
9166: /* Functions used to manage pager transactions and savepoints. */
9167: SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*);
9168: SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int);
9169: SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int);
9170: SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*);
9171: SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager);
9172: SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*);
9173: SQLITE_PRIVATE int sqlite3PagerRollback(Pager*);
9174: SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n);
9175: SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint);
9176: SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager);
9177:
1.2.2.1 ! misho 9178: #ifndef SQLITE_OMIT_WAL
! 9179: SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*);
! 9180: SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager);
! 9181: SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager);
! 9182: SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen);
! 9183: SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager);
! 9184: #endif
! 9185:
! 9186: #ifdef SQLITE_ENABLE_ZIPVFS
! 9187: SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager);
! 9188: #endif
1.2 misho 9189:
9190: /* Functions used to query pager state and configuration. */
9191: SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*);
9192: SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*);
9193: SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*);
1.2.2.1 ! misho 9194: SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*, int);
1.2 misho 9195: SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*);
9196: SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*);
9197: SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*);
9198: SQLITE_PRIVATE int sqlite3PagerNosync(Pager*);
9199: SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*);
9200: SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*);
9201: SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *);
9202: SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *);
1.2.2.1 ! misho 9203: SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *);
1.2 misho 9204:
9205: /* Functions used to truncate the database file. */
9206: SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno);
9207:
9208: #if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL)
9209: SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *);
9210: #endif
9211:
9212: /* Functions to support testing and debugging. */
9213: #if !defined(NDEBUG) || defined(SQLITE_TEST)
9214: SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*);
9215: SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*);
9216: #endif
9217: #ifdef SQLITE_TEST
9218: SQLITE_PRIVATE int *sqlite3PagerStats(Pager*);
9219: SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*);
9220: void disable_simulated_io_errors(void);
9221: void enable_simulated_io_errors(void);
9222: #else
9223: # define disable_simulated_io_errors()
9224: # define enable_simulated_io_errors()
9225: #endif
9226:
9227: #endif /* _PAGER_H_ */
9228:
9229: /************** End of pager.h ***********************************************/
9230: /************** Continuing where we left off in sqliteInt.h ******************/
9231: /************** Include pcache.h in the middle of sqliteInt.h ****************/
9232: /************** Begin file pcache.h ******************************************/
9233: /*
9234: ** 2008 August 05
9235: **
9236: ** The author disclaims copyright to this source code. In place of
9237: ** a legal notice, here is a blessing:
9238: **
9239: ** May you do good and not evil.
9240: ** May you find forgiveness for yourself and forgive others.
9241: ** May you share freely, never taking more than you give.
9242: **
9243: *************************************************************************
9244: ** This header file defines the interface that the sqlite page cache
9245: ** subsystem.
9246: */
9247:
9248: #ifndef _PCACHE_H_
9249:
9250: typedef struct PgHdr PgHdr;
9251: typedef struct PCache PCache;
9252:
9253: /*
9254: ** Every page in the cache is controlled by an instance of the following
9255: ** structure.
9256: */
9257: struct PgHdr {
9258: sqlite3_pcache_page *pPage; /* Pcache object page handle */
9259: void *pData; /* Page data */
9260: void *pExtra; /* Extra content */
9261: PgHdr *pDirty; /* Transient list of dirty pages */
9262: Pager *pPager; /* The pager this page is part of */
1.2.2.1 ! misho 9263: Pgno pgno; /* Page number for this page */
1.2 misho 9264: #ifdef SQLITE_CHECK_PAGES
9265: u32 pageHash; /* Hash of page content */
9266: #endif
9267: u16 flags; /* PGHDR flags defined below */
9268:
9269: /**********************************************************************
9270: ** Elements above are public. All that follows is private to pcache.c
9271: ** and should not be accessed by other modules.
9272: */
9273: i16 nRef; /* Number of users of this page */
9274: PCache *pCache; /* Cache that owns this page */
9275:
9276: PgHdr *pDirtyNext; /* Next element in list of dirty pages */
9277: PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */
9278: };
9279:
9280: /* Bit values for PgHdr.flags */
9281: #define PGHDR_DIRTY 0x002 /* Page has changed */
9282: #define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before
9283: ** writing this page to the database */
9284: #define PGHDR_NEED_READ 0x008 /* Content is unread */
9285: #define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */
9286: #define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */
9287:
9288: /* Initialize and shutdown the page cache subsystem */
9289: SQLITE_PRIVATE int sqlite3PcacheInitialize(void);
9290: SQLITE_PRIVATE void sqlite3PcacheShutdown(void);
9291:
9292: /* Page cache buffer management:
9293: ** These routines implement SQLITE_CONFIG_PAGECACHE.
9294: */
9295: SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n);
9296:
9297: /* Create a new pager cache.
9298: ** Under memory stress, invoke xStress to try to make pages clean.
9299: ** Only clean and unpinned pages can be reclaimed.
9300: */
9301: SQLITE_PRIVATE void sqlite3PcacheOpen(
9302: int szPage, /* Size of every page */
9303: int szExtra, /* Extra space associated with each page */
9304: int bPurgeable, /* True if pages are on backing store */
9305: int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */
9306: void *pStress, /* Argument to xStress */
9307: PCache *pToInit /* Preallocated space for the PCache */
9308: );
9309:
9310: /* Modify the page-size after the cache has been created. */
9311: SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int);
9312:
9313: /* Return the size in bytes of a PCache object. Used to preallocate
9314: ** storage space.
9315: */
9316: SQLITE_PRIVATE int sqlite3PcacheSize(void);
9317:
9318: /* One release per successful fetch. Page is pinned until released.
9319: ** Reference counted.
9320: */
9321: SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**);
9322: SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*);
9323:
9324: SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */
9325: SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */
9326: SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */
9327: SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */
9328:
9329: /* Change a page number. Used by incr-vacuum. */
9330: SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno);
9331:
9332: /* Remove all pages with pgno>x. Reset the cache if x==0 */
9333: SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x);
9334:
9335: /* Get a list of all dirty pages in the cache, sorted by page number */
9336: SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*);
9337:
9338: /* Reset and close the cache object */
9339: SQLITE_PRIVATE void sqlite3PcacheClose(PCache*);
9340:
9341: /* Clear flags from pages of the page cache */
9342: SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *);
9343:
9344: /* Discard the contents of the cache */
9345: SQLITE_PRIVATE void sqlite3PcacheClear(PCache*);
9346:
9347: /* Return the total number of outstanding page references */
9348: SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*);
9349:
9350: /* Increment the reference count of an existing page */
9351: SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*);
9352:
9353: SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*);
9354:
9355: /* Return the total number of pages stored in the cache */
9356: SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*);
9357:
9358: #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
9359: /* Iterate through all dirty pages currently stored in the cache. This
9360: ** interface is only available if SQLITE_CHECK_PAGES is defined when the
9361: ** library is built.
9362: */
9363: SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *));
9364: #endif
9365:
9366: /* Set and get the suggested cache-size for the specified pager-cache.
9367: **
9368: ** If no global maximum is configured, then the system attempts to limit
9369: ** the total number of pages cached by purgeable pager-caches to the sum
9370: ** of the suggested cache-sizes.
9371: */
9372: SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int);
9373: #ifdef SQLITE_TEST
9374: SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *);
9375: #endif
9376:
9377: /* Free up as much memory as possible from the page cache */
9378: SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*);
9379:
9380: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
9381: /* Try to return memory used by the pcache module to the main memory heap */
9382: SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int);
9383: #endif
9384:
9385: #ifdef SQLITE_TEST
9386: SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*);
9387: #endif
9388:
9389: SQLITE_PRIVATE void sqlite3PCacheSetDefault(void);
9390:
9391: #endif /* _PCACHE_H_ */
9392:
9393: /************** End of pcache.h **********************************************/
9394: /************** Continuing where we left off in sqliteInt.h ******************/
9395:
9396: /************** Include os.h in the middle of sqliteInt.h ********************/
9397: /************** Begin file os.h **********************************************/
9398: /*
9399: ** 2001 September 16
9400: **
9401: ** The author disclaims copyright to this source code. In place of
9402: ** a legal notice, here is a blessing:
9403: **
9404: ** May you do good and not evil.
9405: ** May you find forgiveness for yourself and forgive others.
9406: ** May you share freely, never taking more than you give.
9407: **
9408: ******************************************************************************
9409: **
9410: ** This header file (together with is companion C source-code file
9411: ** "os.c") attempt to abstract the underlying operating system so that
9412: ** the SQLite library will work on both POSIX and windows systems.
9413: **
9414: ** This header file is #include-ed by sqliteInt.h and thus ends up
9415: ** being included by every source file.
9416: */
9417: #ifndef _SQLITE_OS_H_
9418: #define _SQLITE_OS_H_
9419:
9420: /*
9421: ** Figure out if we are dealing with Unix, Windows, or some other
9422: ** operating system. After the following block of preprocess macros,
1.2.2.1 ! misho 9423: ** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, and SQLITE_OS_OTHER
1.2 misho 9424: ** will defined to either 1 or 0. One of the four will be 1. The other
9425: ** three will be 0.
9426: */
9427: #if defined(SQLITE_OS_OTHER)
9428: # if SQLITE_OS_OTHER==1
9429: # undef SQLITE_OS_UNIX
9430: # define SQLITE_OS_UNIX 0
9431: # undef SQLITE_OS_WIN
9432: # define SQLITE_OS_WIN 0
9433: # else
9434: # undef SQLITE_OS_OTHER
9435: # endif
9436: #endif
9437: #if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER)
9438: # define SQLITE_OS_OTHER 0
9439: # ifndef SQLITE_OS_WIN
9440: # if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__)
9441: # define SQLITE_OS_WIN 1
9442: # define SQLITE_OS_UNIX 0
9443: # else
9444: # define SQLITE_OS_WIN 0
9445: # define SQLITE_OS_UNIX 1
9446: # endif
9447: # else
9448: # define SQLITE_OS_UNIX 0
9449: # endif
9450: #else
9451: # ifndef SQLITE_OS_WIN
9452: # define SQLITE_OS_WIN 0
9453: # endif
9454: #endif
9455:
9456: #if SQLITE_OS_WIN
9457: # include <windows.h>
9458: #endif
9459:
9460: /*
9461: ** Determine if we are dealing with Windows NT.
1.2.2.1 ! misho 9462: **
! 9463: ** We ought to be able to determine if we are compiling for win98 or winNT
! 9464: ** using the _WIN32_WINNT macro as follows:
! 9465: **
! 9466: ** #if defined(_WIN32_WINNT)
! 9467: ** # define SQLITE_OS_WINNT 1
! 9468: ** #else
! 9469: ** # define SQLITE_OS_WINNT 0
! 9470: ** #endif
! 9471: **
! 9472: ** However, vs2005 does not set _WIN32_WINNT by default, as it ought to,
! 9473: ** so the above test does not work. We'll just assume that everything is
! 9474: ** winNT unless the programmer explicitly says otherwise by setting
! 9475: ** SQLITE_OS_WINNT to 0.
1.2 misho 9476: */
1.2.2.1 ! misho 9477: #if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT)
1.2 misho 9478: # define SQLITE_OS_WINNT 1
9479: #endif
9480:
9481: /*
9482: ** Determine if we are dealing with WindowsCE - which has a much
9483: ** reduced API.
9484: */
9485: #if defined(_WIN32_WCE)
9486: # define SQLITE_OS_WINCE 1
9487: #else
9488: # define SQLITE_OS_WINCE 0
9489: #endif
9490:
1.2.2.1 ! misho 9491: /*
! 9492: ** Determine if we are dealing with WinRT, which provides only a subset of
! 9493: ** the full Win32 API.
! 9494: */
! 9495: #if !defined(SQLITE_OS_WINRT)
! 9496: # define SQLITE_OS_WINRT 0
! 9497: #endif
! 9498:
! 9499: /*
! 9500: ** When compiled for WinCE or WinRT, there is no concept of the current
! 9501: ** directory.
! 9502: */
! 9503: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
! 9504: # define SQLITE_CURDIR 1
! 9505: #endif
! 9506:
1.2 misho 9507: /* If the SET_FULLSYNC macro is not defined above, then make it
9508: ** a no-op
9509: */
9510: #ifndef SET_FULLSYNC
9511: # define SET_FULLSYNC(x,y)
9512: #endif
9513:
9514: /*
9515: ** The default size of a disk sector
9516: */
9517: #ifndef SQLITE_DEFAULT_SECTOR_SIZE
9518: # define SQLITE_DEFAULT_SECTOR_SIZE 4096
9519: #endif
9520:
9521: /*
9522: ** Temporary files are named starting with this prefix followed by 16 random
9523: ** alphanumeric characters, and no file extension. They are stored in the
9524: ** OS's standard temporary file directory, and are deleted prior to exit.
9525: ** If sqlite is being embedded in another program, you may wish to change the
9526: ** prefix to reflect your program's name, so that if your program exits
9527: ** prematurely, old temporary files can be easily identified. This can be done
9528: ** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line.
9529: **
9530: ** 2006-10-31: The default prefix used to be "sqlite_". But then
9531: ** Mcafee started using SQLite in their anti-virus product and it
9532: ** started putting files with the "sqlite" name in the c:/temp folder.
9533: ** This annoyed many windows users. Those users would then do a
9534: ** Google search for "sqlite", find the telephone numbers of the
9535: ** developers and call to wake them up at night and complain.
9536: ** For this reason, the default name prefix is changed to be "sqlite"
9537: ** spelled backwards. So the temp files are still identified, but
9538: ** anybody smart enough to figure out the code is also likely smart
9539: ** enough to know that calling the developer will not help get rid
9540: ** of the file.
9541: */
9542: #ifndef SQLITE_TEMP_FILE_PREFIX
9543: # define SQLITE_TEMP_FILE_PREFIX "etilqs_"
9544: #endif
9545:
9546: /*
9547: ** The following values may be passed as the second argument to
9548: ** sqlite3OsLock(). The various locks exhibit the following semantics:
9549: **
9550: ** SHARED: Any number of processes may hold a SHARED lock simultaneously.
9551: ** RESERVED: A single process may hold a RESERVED lock on a file at
9552: ** any time. Other processes may hold and obtain new SHARED locks.
9553: ** PENDING: A single process may hold a PENDING lock on a file at
9554: ** any one time. Existing SHARED locks may persist, but no new
9555: ** SHARED locks may be obtained by other processes.
9556: ** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks.
9557: **
9558: ** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a
9559: ** process that requests an EXCLUSIVE lock may actually obtain a PENDING
9560: ** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to
9561: ** sqlite3OsLock().
9562: */
9563: #define NO_LOCK 0
9564: #define SHARED_LOCK 1
9565: #define RESERVED_LOCK 2
9566: #define PENDING_LOCK 3
9567: #define EXCLUSIVE_LOCK 4
9568:
9569: /*
9570: ** File Locking Notes: (Mostly about windows but also some info for Unix)
9571: **
9572: ** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because
9573: ** those functions are not available. So we use only LockFile() and
9574: ** UnlockFile().
9575: **
9576: ** LockFile() prevents not just writing but also reading by other processes.
9577: ** A SHARED_LOCK is obtained by locking a single randomly-chosen
9578: ** byte out of a specific range of bytes. The lock byte is obtained at
9579: ** random so two separate readers can probably access the file at the
9580: ** same time, unless they are unlucky and choose the same lock byte.
9581: ** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range.
9582: ** There can only be one writer. A RESERVED_LOCK is obtained by locking
9583: ** a single byte of the file that is designated as the reserved lock byte.
9584: ** A PENDING_LOCK is obtained by locking a designated byte different from
9585: ** the RESERVED_LOCK byte.
9586: **
9587: ** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available,
9588: ** which means we can use reader/writer locks. When reader/writer locks
9589: ** are used, the lock is placed on the same range of bytes that is used
9590: ** for probabilistic locking in Win95/98/ME. Hence, the locking scheme
9591: ** will support two or more Win95 readers or two or more WinNT readers.
9592: ** But a single Win95 reader will lock out all WinNT readers and a single
9593: ** WinNT reader will lock out all other Win95 readers.
9594: **
9595: ** The following #defines specify the range of bytes used for locking.
9596: ** SHARED_SIZE is the number of bytes available in the pool from which
9597: ** a random byte is selected for a shared lock. The pool of bytes for
9598: ** shared locks begins at SHARED_FIRST.
9599: **
9600: ** The same locking strategy and
9601: ** byte ranges are used for Unix. This leaves open the possiblity of having
9602: ** clients on win95, winNT, and unix all talking to the same shared file
9603: ** and all locking correctly. To do so would require that samba (or whatever
9604: ** tool is being used for file sharing) implements locks correctly between
9605: ** windows and unix. I'm guessing that isn't likely to happen, but by
9606: ** using the same locking range we are at least open to the possibility.
9607: **
9608: ** Locking in windows is manditory. For this reason, we cannot store
9609: ** actual data in the bytes used for locking. The pager never allocates
9610: ** the pages involved in locking therefore. SHARED_SIZE is selected so
9611: ** that all locks will fit on a single page even at the minimum page size.
9612: ** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE
9613: ** is set high so that we don't have to allocate an unused page except
9614: ** for very large databases. But one should test the page skipping logic
9615: ** by setting PENDING_BYTE low and running the entire regression suite.
9616: **
9617: ** Changing the value of PENDING_BYTE results in a subtly incompatible
9618: ** file format. Depending on how it is changed, you might not notice
9619: ** the incompatibility right away, even running a full regression test.
9620: ** The default location of PENDING_BYTE is the first byte past the
9621: ** 1GB boundary.
9622: **
9623: */
9624: #ifdef SQLITE_OMIT_WSD
9625: # define PENDING_BYTE (0x40000000)
9626: #else
9627: # define PENDING_BYTE sqlite3PendingByte
9628: #endif
9629: #define RESERVED_BYTE (PENDING_BYTE+1)
9630: #define SHARED_FIRST (PENDING_BYTE+2)
9631: #define SHARED_SIZE 510
9632:
9633: /*
9634: ** Wrapper around OS specific sqlite3_os_init() function.
9635: */
9636: SQLITE_PRIVATE int sqlite3OsInit(void);
9637:
9638: /*
9639: ** Functions for accessing sqlite3_file methods
9640: */
9641: SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*);
9642: SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset);
9643: SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset);
9644: SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size);
9645: SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int);
9646: SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize);
9647: SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int);
9648: SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
9649: SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
9650: SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
9651: SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*);
9652: #define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
9653: SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
9654: SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
9655: SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **);
9656: SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int);
9657: SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id);
9658: SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int);
9659:
9660:
9661: /*
9662: ** Functions for accessing sqlite3_vfs methods
9663: */
9664: SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *);
9665: SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int);
9666: SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut);
9667: SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *);
9668: #ifndef SQLITE_OMIT_LOAD_EXTENSION
9669: SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *);
9670: SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *);
9671: SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
9672: SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *);
9673: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
9674: SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *);
9675: SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int);
9676: SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*);
9677:
9678: /*
9679: ** Convenience functions for opening and closing files using
9680: ** sqlite3_malloc() to obtain space for the file-handle structure.
9681: */
9682: SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*);
9683: SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *);
9684:
9685: #endif /* _SQLITE_OS_H_ */
9686:
9687: /************** End of os.h **************************************************/
9688: /************** Continuing where we left off in sqliteInt.h ******************/
9689: /************** Include mutex.h in the middle of sqliteInt.h *****************/
9690: /************** Begin file mutex.h *******************************************/
9691: /*
9692: ** 2007 August 28
9693: **
9694: ** The author disclaims copyright to this source code. In place of
9695: ** a legal notice, here is a blessing:
9696: **
9697: ** May you do good and not evil.
9698: ** May you find forgiveness for yourself and forgive others.
9699: ** May you share freely, never taking more than you give.
9700: **
9701: *************************************************************************
9702: **
9703: ** This file contains the common header for all mutex implementations.
9704: ** The sqliteInt.h header #includes this file so that it is available
9705: ** to all source files. We break it out in an effort to keep the code
9706: ** better organized.
9707: **
9708: ** NOTE: source files should *not* #include this header file directly.
9709: ** Source files should #include the sqliteInt.h file and let that file
9710: ** include this one indirectly.
9711: */
9712:
9713:
9714: /*
9715: ** Figure out what version of the code to use. The choices are
9716: **
9717: ** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The
9718: ** mutexes implemention cannot be overridden
9719: ** at start-time.
9720: **
9721: ** SQLITE_MUTEX_NOOP For single-threaded applications. No
9722: ** mutual exclusion is provided. But this
9723: ** implementation can be overridden at
9724: ** start-time.
9725: **
9726: ** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix.
9727: **
9728: ** SQLITE_MUTEX_W32 For multi-threaded applications on Win32.
9729: */
9730: #if !SQLITE_THREADSAFE
9731: # define SQLITE_MUTEX_OMIT
9732: #endif
9733: #if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP)
9734: # if SQLITE_OS_UNIX
9735: # define SQLITE_MUTEX_PTHREADS
9736: # elif SQLITE_OS_WIN
9737: # define SQLITE_MUTEX_W32
9738: # else
9739: # define SQLITE_MUTEX_NOOP
9740: # endif
9741: #endif
9742:
9743: #ifdef SQLITE_MUTEX_OMIT
9744: /*
9745: ** If this is a no-op implementation, implement everything as macros.
9746: */
9747: #define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8)
9748: #define sqlite3_mutex_free(X)
9749: #define sqlite3_mutex_enter(X)
9750: #define sqlite3_mutex_try(X) SQLITE_OK
9751: #define sqlite3_mutex_leave(X)
9752: #define sqlite3_mutex_held(X) ((void)(X),1)
9753: #define sqlite3_mutex_notheld(X) ((void)(X),1)
9754: #define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8)
9755: #define sqlite3MutexInit() SQLITE_OK
9756: #define sqlite3MutexEnd()
9757: #define MUTEX_LOGIC(X)
9758: #else
9759: #define MUTEX_LOGIC(X) X
9760: #endif /* defined(SQLITE_MUTEX_OMIT) */
9761:
9762: /************** End of mutex.h ***********************************************/
9763: /************** Continuing where we left off in sqliteInt.h ******************/
9764:
9765:
9766: /*
9767: ** Each database file to be accessed by the system is an instance
9768: ** of the following structure. There are normally two of these structures
9769: ** in the sqlite.aDb[] array. aDb[0] is the main database file and
9770: ** aDb[1] is the database file used to hold temporary tables. Additional
9771: ** databases may be attached.
9772: */
9773: struct Db {
9774: char *zName; /* Name of this database */
9775: Btree *pBt; /* The B*Tree structure for this database file */
9776: u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */
9777: u8 safety_level; /* How aggressive at syncing data to disk */
9778: Schema *pSchema; /* Pointer to database schema (possibly shared) */
9779: };
9780:
9781: /*
9782: ** An instance of the following structure stores a database schema.
9783: **
9784: ** Most Schema objects are associated with a Btree. The exception is
9785: ** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing.
9786: ** In shared cache mode, a single Schema object can be shared by multiple
9787: ** Btrees that refer to the same underlying BtShared object.
9788: **
9789: ** Schema objects are automatically deallocated when the last Btree that
9790: ** references them is destroyed. The TEMP Schema is manually freed by
9791: ** sqlite3_close().
9792: *
9793: ** A thread must be holding a mutex on the corresponding Btree in order
9794: ** to access Schema content. This implies that the thread must also be
9795: ** holding a mutex on the sqlite3 connection pointer that owns the Btree.
9796: ** For a TEMP Schema, only the connection mutex is required.
9797: */
9798: struct Schema {
9799: int schema_cookie; /* Database schema version number for this file */
9800: int iGeneration; /* Generation counter. Incremented with each change */
9801: Hash tblHash; /* All tables indexed by name */
9802: Hash idxHash; /* All (named) indices indexed by name */
9803: Hash trigHash; /* All triggers indexed by name */
9804: Hash fkeyHash; /* All foreign keys by referenced table name */
9805: Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */
9806: u8 file_format; /* Schema format version for this file */
9807: u8 enc; /* Text encoding used by this database */
9808: u16 flags; /* Flags associated with this schema */
9809: int cache_size; /* Number of pages to use in the cache */
9810: };
9811:
9812: /*
9813: ** These macros can be used to test, set, or clear bits in the
9814: ** Db.pSchema->flags field.
9815: */
9816: #define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P))
9817: #define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0)
9818: #define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P)
9819: #define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P)
9820:
9821: /*
9822: ** Allowed values for the DB.pSchema->flags field.
9823: **
9824: ** The DB_SchemaLoaded flag is set after the database schema has been
9825: ** read into internal hash tables.
9826: **
9827: ** DB_UnresetViews means that one or more views have column names that
9828: ** have been filled out. If the schema changes, these column names might
9829: ** changes and so the view will need to be reset.
9830: */
9831: #define DB_SchemaLoaded 0x0001 /* The schema has been loaded */
9832: #define DB_UnresetViews 0x0002 /* Some views have defined column names */
9833: #define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */
9834:
9835: /*
9836: ** The number of different kinds of things that can be limited
9837: ** using the sqlite3_limit() interface.
9838: */
9839: #define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1)
9840:
9841: /*
9842: ** Lookaside malloc is a set of fixed-size buffers that can be used
9843: ** to satisfy small transient memory allocation requests for objects
9844: ** associated with a particular database connection. The use of
9845: ** lookaside malloc provides a significant performance enhancement
9846: ** (approx 10%) by avoiding numerous malloc/free requests while parsing
9847: ** SQL statements.
9848: **
9849: ** The Lookaside structure holds configuration information about the
9850: ** lookaside malloc subsystem. Each available memory allocation in
9851: ** the lookaside subsystem is stored on a linked list of LookasideSlot
9852: ** objects.
9853: **
9854: ** Lookaside allocations are only allowed for objects that are associated
9855: ** with a particular database connection. Hence, schema information cannot
9856: ** be stored in lookaside because in shared cache mode the schema information
9857: ** is shared by multiple database connections. Therefore, while parsing
9858: ** schema information, the Lookaside.bEnabled flag is cleared so that
9859: ** lookaside allocations are not used to construct the schema objects.
9860: */
9861: struct Lookaside {
9862: u16 sz; /* Size of each buffer in bytes */
9863: u8 bEnabled; /* False to disable new lookaside allocations */
9864: u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */
9865: int nOut; /* Number of buffers currently checked out */
9866: int mxOut; /* Highwater mark for nOut */
9867: int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */
9868: LookasideSlot *pFree; /* List of available buffers */
9869: void *pStart; /* First byte of available memory space */
9870: void *pEnd; /* First byte past end of available space */
9871: };
9872: struct LookasideSlot {
9873: LookasideSlot *pNext; /* Next buffer in the list of free buffers */
9874: };
9875:
9876: /*
9877: ** A hash table for function definitions.
9878: **
9879: ** Hash each FuncDef structure into one of the FuncDefHash.a[] slots.
9880: ** Collisions are on the FuncDef.pHash chain.
9881: */
9882: struct FuncDefHash {
9883: FuncDef *a[23]; /* Hash table for functions */
9884: };
9885:
9886: /*
9887: ** Each database connection is an instance of the following structure.
9888: */
9889: struct sqlite3 {
9890: sqlite3_vfs *pVfs; /* OS Interface */
1.2.2.1 ! misho 9891: struct Vdbe *pVdbe; /* List of active virtual machines */
! 9892: CollSeq *pDfltColl; /* The default collating sequence (BINARY) */
! 9893: sqlite3_mutex *mutex; /* Connection mutex */
1.2 misho 9894: Db *aDb; /* All backends */
1.2.2.1 ! misho 9895: int nDb; /* Number of backends currently in use */
1.2 misho 9896: int flags; /* Miscellaneous flags. See below */
1.2.2.1 ! misho 9897: i64 lastRowid; /* ROWID of most recent insert (see above) */
1.2 misho 9898: unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */
9899: int errCode; /* Most recent error code (SQLITE_*) */
9900: int errMask; /* & result codes with this before returning */
1.2.2.1 ! misho 9901: u16 dbOptFlags; /* Flags to enable/disable optimizations */
1.2 misho 9902: u8 autoCommit; /* The auto-commit flag. */
9903: u8 temp_store; /* 1: file 2: memory 0: default */
9904: u8 mallocFailed; /* True if we have seen a malloc failure */
9905: u8 dfltLockMode; /* Default locking-mode for attached dbs */
9906: signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */
9907: u8 suppressErr; /* Do not issue error messages if true */
9908: u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */
1.2.2.1 ! misho 9909: u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */
1.2 misho 9910: int nextPagesize; /* Pagesize after VACUUM if >0 */
9911: u32 magic; /* Magic number for detect library misuse */
9912: int nChange; /* Value returned by sqlite3_changes() */
9913: int nTotalChange; /* Value returned by sqlite3_total_changes() */
9914: int aLimit[SQLITE_N_LIMIT]; /* Limits */
9915: struct sqlite3InitInfo { /* Information used during initialization */
9916: int newTnum; /* Rootpage of table being initialized */
1.2.2.1 ! misho 9917: u8 iDb; /* Which db file is being initialized */
1.2 misho 9918: u8 busy; /* TRUE if currently initializing */
9919: u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */
9920: } init;
9921: int activeVdbeCnt; /* Number of VDBEs currently executing */
9922: int writeVdbeCnt; /* Number of active VDBEs that are writing */
9923: int vdbeExecCnt; /* Number of nested calls to VdbeExec() */
1.2.2.1 ! misho 9924: int nExtension; /* Number of loaded extensions */
! 9925: void **aExtension; /* Array of shared library handles */
1.2 misho 9926: void (*xTrace)(void*,const char*); /* Trace function */
9927: void *pTraceArg; /* Argument to the trace function */
9928: void (*xProfile)(void*,const char*,u64); /* Profiling function */
9929: void *pProfileArg; /* Argument to profile function */
9930: void *pCommitArg; /* Argument to xCommitCallback() */
9931: int (*xCommitCallback)(void*); /* Invoked at every commit. */
9932: void *pRollbackArg; /* Argument to xRollbackCallback() */
9933: void (*xRollbackCallback)(void*); /* Invoked at every commit. */
9934: void *pUpdateArg;
9935: void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64);
9936: #ifndef SQLITE_OMIT_WAL
9937: int (*xWalCallback)(void *, sqlite3 *, const char *, int);
9938: void *pWalArg;
9939: #endif
9940: void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*);
9941: void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*);
9942: void *pCollNeededArg;
9943: sqlite3_value *pErr; /* Most recent error message */
9944: char *zErrMsg; /* Most recent error message (UTF-8 encoded) */
9945: char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */
9946: union {
9947: volatile int isInterrupted; /* True if sqlite3_interrupt has been called */
9948: double notUsed1; /* Spacer */
9949: } u1;
9950: Lookaside lookaside; /* Lookaside malloc configuration */
9951: #ifndef SQLITE_OMIT_AUTHORIZATION
9952: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
9953: /* Access authorization function */
9954: void *pAuthArg; /* 1st argument to the access auth function */
9955: #endif
9956: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
9957: int (*xProgress)(void *); /* The progress callback */
9958: void *pProgressArg; /* Argument to the progress callback */
9959: int nProgressOps; /* Number of opcodes for progress callback */
9960: #endif
9961: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 9962: int nVTrans; /* Allocated size of aVTrans */
1.2 misho 9963: Hash aModule; /* populated by sqlite3_create_module() */
9964: VtabCtx *pVtabCtx; /* Context for active vtab connect/create */
9965: VTable **aVTrans; /* Virtual tables with open transactions */
9966: VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */
9967: #endif
9968: FuncDefHash aFunc; /* Hash table of connection functions */
9969: Hash aCollSeq; /* All collating sequences */
9970: BusyHandler busyHandler; /* Busy callback */
9971: Db aDbStatic[2]; /* Static space for the 2 default backends */
9972: Savepoint *pSavepoint; /* List of active savepoints */
1.2.2.1 ! misho 9973: int busyTimeout; /* Busy handler timeout, in msec */
1.2 misho 9974: int nSavepoint; /* Number of non-transaction savepoints */
9975: int nStatement; /* Number of nested statement-transactions */
9976: i64 nDeferredCons; /* Net deferred constraints this transaction. */
9977: int *pnBytesFreed; /* If not NULL, increment this in DbFree() */
9978:
9979: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
9980: /* The following variables are all protected by the STATIC_MASTER
9981: ** mutex, not by sqlite3.mutex. They are used by code in notify.c.
9982: **
9983: ** When X.pUnlockConnection==Y, that means that X is waiting for Y to
9984: ** unlock so that it can proceed.
9985: **
9986: ** When X.pBlockingConnection==Y, that means that something that X tried
9987: ** tried to do recently failed with an SQLITE_LOCKED error due to locks
9988: ** held by Y.
9989: */
9990: sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */
9991: sqlite3 *pUnlockConnection; /* Connection to watch for unlock */
9992: void *pUnlockArg; /* Argument to xUnlockNotify */
9993: void (*xUnlockNotify)(void **, int); /* Unlock notify callback */
9994: sqlite3 *pNextBlocked; /* Next in list of all blocked connections */
9995: #endif
9996: };
9997:
9998: /*
9999: ** A macro to discover the encoding of a database.
10000: */
10001: #define ENC(db) ((db)->aDb[0].pSchema->enc)
10002:
10003: /*
10004: ** Possible values for the sqlite3.flags.
10005: */
1.2.2.1 ! misho 10006: #define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */
! 10007: #define SQLITE_InternChanges 0x00000002 /* Uncommitted Hash table changes */
! 10008: #define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */
! 10009: #define SQLITE_ShortColNames 0x00000008 /* Show short columns names */
! 10010: #define SQLITE_CountRows 0x00000010 /* Count rows changed by INSERT, */
1.2 misho 10011: /* DELETE, or UPDATE and return */
10012: /* the count using a callback. */
1.2.2.1 ! misho 10013: #define SQLITE_NullCallback 0x00000020 /* Invoke the callback once if the */
1.2 misho 10014: /* result set is empty */
1.2.2.1 ! misho 10015: #define SQLITE_SqlTrace 0x00000040 /* Debug print SQL as it executes */
! 10016: #define SQLITE_VdbeListing 0x00000080 /* Debug listings of VDBE programs */
! 10017: #define SQLITE_WriteSchema 0x00000100 /* OK to update SQLITE_MASTER */
! 10018: /* 0x00000200 Unused */
! 10019: #define SQLITE_IgnoreChecks 0x00000400 /* Do not enforce check constraints */
! 10020: #define SQLITE_ReadUncommitted 0x0000800 /* For shared-cache mode */
! 10021: #define SQLITE_LegacyFileFmt 0x00001000 /* Create new databases in format 1 */
! 10022: #define SQLITE_FullFSync 0x00002000 /* Use full fsync on the backend */
! 10023: #define SQLITE_CkptFullFSync 0x00004000 /* Use full fsync for checkpoint */
! 10024: #define SQLITE_RecoveryMode 0x00008000 /* Ignore schema errors */
! 10025: #define SQLITE_ReverseOrder 0x00010000 /* Reverse unordered SELECTs */
! 10026: #define SQLITE_RecTriggers 0x00020000 /* Enable recursive triggers */
! 10027: #define SQLITE_ForeignKeys 0x00040000 /* Enforce foreign key constraints */
! 10028: #define SQLITE_AutoIndex 0x00080000 /* Enable automatic indexes */
! 10029: #define SQLITE_PreferBuiltin 0x00100000 /* Preference to built-in funcs */
! 10030: #define SQLITE_LoadExtension 0x00200000 /* Enable load_extension */
! 10031: #define SQLITE_EnableTrigger 0x00400000 /* True to enable triggers */
! 10032:
! 10033: /*
! 10034: ** Bits of the sqlite3.dbOptFlags field that are used by the
! 10035: ** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to
! 10036: ** selectively disable various optimizations.
! 10037: */
! 10038: #define SQLITE_QueryFlattener 0x0001 /* Query flattening */
! 10039: #define SQLITE_ColumnCache 0x0002 /* Column cache */
! 10040: #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */
! 10041: #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */
! 10042: #define SQLITE_IdxRealAsInt 0x0010 /* Store REAL as INT in indices */
! 10043: #define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */
! 10044: #define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */
! 10045: #define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */
! 10046: #define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */
! 10047: #define SQLITE_AllOpts 0xffff /* All optimizations */
! 10048:
! 10049: /*
! 10050: ** Macros for testing whether or not optimizations are enabled or disabled.
! 10051: */
! 10052: #ifndef SQLITE_OMIT_BUILTIN_TEST
! 10053: #define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0)
! 10054: #define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0)
! 10055: #else
! 10056: #define OptimizationDisabled(db, mask) 0
! 10057: #define OptimizationEnabled(db, mask) 1
! 10058: #endif
1.2 misho 10059:
10060: /*
10061: ** Possible values for the sqlite.magic field.
10062: ** The numbers are obtained at random and have no special meaning, other
10063: ** than being distinct from one another.
10064: */
10065: #define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */
10066: #define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */
10067: #define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */
10068: #define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */
10069: #define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */
1.2.2.1 ! misho 10070: #define SQLITE_MAGIC_ZOMBIE 0x64cffc7f /* Close with last statement close */
1.2 misho 10071:
10072: /*
10073: ** Each SQL function is defined by an instance of the following
10074: ** structure. A pointer to this structure is stored in the sqlite.aFunc
10075: ** hash table. When multiple functions have the same name, the hash table
10076: ** points to a linked list of these structures.
10077: */
10078: struct FuncDef {
10079: i16 nArg; /* Number of arguments. -1 means unlimited */
10080: u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */
10081: u8 flags; /* Some combination of SQLITE_FUNC_* */
10082: void *pUserData; /* User data parameter */
10083: FuncDef *pNext; /* Next function with same name */
10084: void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */
10085: void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */
10086: void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */
10087: char *zName; /* SQL name of the function. */
10088: FuncDef *pHash; /* Next with a different name but the same hash */
10089: FuncDestructor *pDestructor; /* Reference counted destructor function */
10090: };
10091:
10092: /*
10093: ** This structure encapsulates a user-function destructor callback (as
10094: ** configured using create_function_v2()) and a reference counter. When
10095: ** create_function_v2() is called to create a function with a destructor,
10096: ** a single object of this type is allocated. FuncDestructor.nRef is set to
10097: ** the number of FuncDef objects created (either 1 or 3, depending on whether
10098: ** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor
10099: ** member of each of the new FuncDef objects is set to point to the allocated
10100: ** FuncDestructor.
10101: **
10102: ** Thereafter, when one of the FuncDef objects is deleted, the reference
10103: ** count on this object is decremented. When it reaches 0, the destructor
10104: ** is invoked and the FuncDestructor structure freed.
10105: */
10106: struct FuncDestructor {
10107: int nRef;
10108: void (*xDestroy)(void *);
10109: void *pUserData;
10110: };
10111:
10112: /*
1.2.2.1 ! misho 10113: ** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF
! 10114: ** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. There
! 10115: ** are assert() statements in the code to verify this.
1.2 misho 10116: */
10117: #define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */
10118: #define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */
10119: #define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */
10120: #define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */
1.2.2.1 ! misho 10121: #define SQLITE_FUNC_COUNT 0x10 /* Built-in count(*) aggregate */
! 10122: #define SQLITE_FUNC_COALESCE 0x20 /* Built-in coalesce() or ifnull() function */
! 10123: #define SQLITE_FUNC_LENGTH 0x40 /* Built-in length() function */
! 10124: #define SQLITE_FUNC_TYPEOF 0x80 /* Built-in typeof() function */
1.2 misho 10125:
10126: /*
10127: ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
10128: ** used to create the initializers for the FuncDef structures.
10129: **
10130: ** FUNCTION(zName, nArg, iArg, bNC, xFunc)
10131: ** Used to create a scalar function definition of a function zName
10132: ** implemented by C function xFunc that accepts nArg arguments. The
10133: ** value passed as iArg is cast to a (void*) and made available
10134: ** as the user-data (sqlite3_user_data()) for the function. If
10135: ** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set.
10136: **
10137: ** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal)
10138: ** Used to create an aggregate function definition implemented by
10139: ** the C functions xStep and xFinal. The first four parameters
10140: ** are interpreted in the same way as the first 4 parameters to
10141: ** FUNCTION().
10142: **
10143: ** LIKEFUNC(zName, nArg, pArg, flags)
10144: ** Used to create a scalar function definition of a function zName
10145: ** that accepts nArg arguments and is implemented by a call to C
10146: ** function likeFunc. Argument pArg is cast to a (void *) and made
10147: ** available as the function user-data (sqlite3_user_data()). The
10148: ** FuncDef.flags variable is set to the value passed as the flags
10149: ** parameter.
10150: */
10151: #define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
1.2.2.1 ! misho 10152: {nArg, SQLITE_UTF8, (bNC*SQLITE_FUNC_NEEDCOLL), \
! 10153: SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0}
! 10154: #define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \
! 10155: {nArg, SQLITE_UTF8, (bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags, \
1.2 misho 10156: SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0}
10157: #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
10158: {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \
10159: pArg, 0, xFunc, 0, 0, #zName, 0, 0}
10160: #define LIKEFUNC(zName, nArg, arg, flags) \
10161: {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0}
10162: #define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \
10163: {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \
10164: SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0}
10165:
10166: /*
10167: ** All current savepoints are stored in a linked list starting at
10168: ** sqlite3.pSavepoint. The first element in the list is the most recently
10169: ** opened savepoint. Savepoints are added to the list by the vdbe
10170: ** OP_Savepoint instruction.
10171: */
10172: struct Savepoint {
10173: char *zName; /* Savepoint name (nul-terminated) */
10174: i64 nDeferredCons; /* Number of deferred fk violations */
10175: Savepoint *pNext; /* Parent savepoint (if any) */
10176: };
10177:
10178: /*
10179: ** The following are used as the second parameter to sqlite3Savepoint(),
10180: ** and as the P1 argument to the OP_Savepoint instruction.
10181: */
10182: #define SAVEPOINT_BEGIN 0
10183: #define SAVEPOINT_RELEASE 1
10184: #define SAVEPOINT_ROLLBACK 2
10185:
10186:
10187: /*
10188: ** Each SQLite module (virtual table definition) is defined by an
10189: ** instance of the following structure, stored in the sqlite3.aModule
10190: ** hash table.
10191: */
10192: struct Module {
10193: const sqlite3_module *pModule; /* Callback pointers */
10194: const char *zName; /* Name passed to create_module() */
10195: void *pAux; /* pAux passed to create_module() */
10196: void (*xDestroy)(void *); /* Module destructor function */
10197: };
10198:
10199: /*
10200: ** information about each column of an SQL table is held in an instance
10201: ** of this structure.
10202: */
10203: struct Column {
10204: char *zName; /* Name of this column */
10205: Expr *pDflt; /* Default value of this column */
10206: char *zDflt; /* Original text of the default value */
10207: char *zType; /* Data type for this column */
10208: char *zColl; /* Collating sequence. If NULL, use the default */
1.2.2.1 ! misho 10209: u8 notNull; /* An OE_ code for handling a NOT NULL constraint */
1.2 misho 10210: char affinity; /* One of the SQLITE_AFF_... values */
1.2.2.1 ! misho 10211: u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */
1.2 misho 10212: };
10213:
1.2.2.1 ! misho 10214: /* Allowed values for Column.colFlags:
! 10215: */
! 10216: #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */
! 10217: #define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */
! 10218:
1.2 misho 10219: /*
10220: ** A "Collating Sequence" is defined by an instance of the following
10221: ** structure. Conceptually, a collating sequence consists of a name and
10222: ** a comparison routine that defines the order of that sequence.
10223: **
1.2.2.1 ! misho 10224: ** If CollSeq.xCmp is NULL, it means that the
1.2 misho 10225: ** collating sequence is undefined. Indices built on an undefined
10226: ** collating sequence may not be read or written.
10227: */
10228: struct CollSeq {
10229: char *zName; /* Name of the collating sequence, UTF-8 encoded */
10230: u8 enc; /* Text encoding handled by xCmp() */
10231: void *pUser; /* First argument to xCmp() */
10232: int (*xCmp)(void*,int, const void*, int, const void*);
10233: void (*xDel)(void*); /* Destructor for pUser */
10234: };
10235:
10236: /*
10237: ** A sort order can be either ASC or DESC.
10238: */
10239: #define SQLITE_SO_ASC 0 /* Sort in ascending order */
10240: #define SQLITE_SO_DESC 1 /* Sort in ascending order */
10241:
10242: /*
10243: ** Column affinity types.
10244: **
10245: ** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and
10246: ** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve
10247: ** the speed a little by numbering the values consecutively.
10248: **
10249: ** But rather than start with 0 or 1, we begin with 'a'. That way,
10250: ** when multiple affinity types are concatenated into a string and
10251: ** used as the P4 operand, they will be more readable.
10252: **
10253: ** Note also that the numeric types are grouped together so that testing
10254: ** for a numeric type is a single comparison.
10255: */
10256: #define SQLITE_AFF_TEXT 'a'
10257: #define SQLITE_AFF_NONE 'b'
10258: #define SQLITE_AFF_NUMERIC 'c'
10259: #define SQLITE_AFF_INTEGER 'd'
10260: #define SQLITE_AFF_REAL 'e'
10261:
10262: #define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC)
10263:
10264: /*
10265: ** The SQLITE_AFF_MASK values masks off the significant bits of an
10266: ** affinity value.
10267: */
10268: #define SQLITE_AFF_MASK 0x67
10269:
10270: /*
10271: ** Additional bit values that can be ORed with an affinity without
10272: ** changing the affinity.
10273: */
10274: #define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */
10275: #define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */
10276: #define SQLITE_NULLEQ 0x80 /* NULL=NULL */
10277:
10278: /*
10279: ** An object of this type is created for each virtual table present in
10280: ** the database schema.
10281: **
10282: ** If the database schema is shared, then there is one instance of this
10283: ** structure for each database connection (sqlite3*) that uses the shared
10284: ** schema. This is because each database connection requires its own unique
10285: ** instance of the sqlite3_vtab* handle used to access the virtual table
10286: ** implementation. sqlite3_vtab* handles can not be shared between
10287: ** database connections, even when the rest of the in-memory database
10288: ** schema is shared, as the implementation often stores the database
10289: ** connection handle passed to it via the xConnect() or xCreate() method
10290: ** during initialization internally. This database connection handle may
10291: ** then be used by the virtual table implementation to access real tables
10292: ** within the database. So that they appear as part of the callers
10293: ** transaction, these accesses need to be made via the same database
10294: ** connection as that used to execute SQL operations on the virtual table.
10295: **
10296: ** All VTable objects that correspond to a single table in a shared
10297: ** database schema are initially stored in a linked-list pointed to by
10298: ** the Table.pVTable member variable of the corresponding Table object.
10299: ** When an sqlite3_prepare() operation is required to access the virtual
10300: ** table, it searches the list for the VTable that corresponds to the
10301: ** database connection doing the preparing so as to use the correct
10302: ** sqlite3_vtab* handle in the compiled query.
10303: **
10304: ** When an in-memory Table object is deleted (for example when the
10305: ** schema is being reloaded for some reason), the VTable objects are not
10306: ** deleted and the sqlite3_vtab* handles are not xDisconnect()ed
10307: ** immediately. Instead, they are moved from the Table.pVTable list to
10308: ** another linked list headed by the sqlite3.pDisconnect member of the
10309: ** corresponding sqlite3 structure. They are then deleted/xDisconnected
10310: ** next time a statement is prepared using said sqlite3*. This is done
10311: ** to avoid deadlock issues involving multiple sqlite3.mutex mutexes.
10312: ** Refer to comments above function sqlite3VtabUnlockList() for an
10313: ** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect
10314: ** list without holding the corresponding sqlite3.mutex mutex.
10315: **
10316: ** The memory for objects of this type is always allocated by
10317: ** sqlite3DbMalloc(), using the connection handle stored in VTable.db as
10318: ** the first argument.
10319: */
10320: struct VTable {
10321: sqlite3 *db; /* Database connection associated with this table */
10322: Module *pMod; /* Pointer to module implementation */
10323: sqlite3_vtab *pVtab; /* Pointer to vtab instance */
10324: int nRef; /* Number of pointers to this structure */
10325: u8 bConstraint; /* True if constraints are supported */
10326: int iSavepoint; /* Depth of the SAVEPOINT stack */
10327: VTable *pNext; /* Next in linked list (see above) */
10328: };
10329:
10330: /*
10331: ** Each SQL table is represented in memory by an instance of the
10332: ** following structure.
10333: **
10334: ** Table.zName is the name of the table. The case of the original
10335: ** CREATE TABLE statement is stored, but case is not significant for
10336: ** comparisons.
10337: **
10338: ** Table.nCol is the number of columns in this table. Table.aCol is a
10339: ** pointer to an array of Column structures, one for each column.
10340: **
10341: ** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of
10342: ** the column that is that key. Otherwise Table.iPKey is negative. Note
10343: ** that the datatype of the PRIMARY KEY must be INTEGER for this field to
10344: ** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of
10345: ** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid
10346: ** is generated for each row of the table. TF_HasPrimaryKey is set if
10347: ** the table has any PRIMARY KEY, INTEGER or otherwise.
10348: **
10349: ** Table.tnum is the page number for the root BTree page of the table in the
10350: ** database file. If Table.iDb is the index of the database table backend
10351: ** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that
10352: ** holds temporary tables and indices. If TF_Ephemeral is set
10353: ** then the table is stored in a file that is automatically deleted
10354: ** when the VDBE cursor to the table is closed. In this case Table.tnum
10355: ** refers VDBE cursor number that holds the table open, not to the root
10356: ** page number. Transient tables are used to hold the results of a
10357: ** sub-query that appears instead of a real table name in the FROM clause
10358: ** of a SELECT statement.
10359: */
10360: struct Table {
10361: char *zName; /* Name of the table or view */
10362: Column *aCol; /* Information about each column */
10363: Index *pIndex; /* List of SQL indexes on this table. */
10364: Select *pSelect; /* NULL for tables. Points to definition if a view. */
10365: FKey *pFKey; /* Linked list of all foreign keys in this table */
10366: char *zColAff; /* String defining the affinity of each column */
10367: #ifndef SQLITE_OMIT_CHECK
1.2.2.1 ! misho 10368: ExprList *pCheck; /* All CHECK constraints */
1.2 misho 10369: #endif
1.2.2.1 ! misho 10370: tRowcnt nRowEst; /* Estimated rows in table - from sqlite_stat1 table */
! 10371: int tnum; /* Root BTree node for this table (see note above) */
! 10372: i16 iPKey; /* If not negative, use aCol[iPKey] as the primary key */
! 10373: i16 nCol; /* Number of columns in this table */
! 10374: u16 nRef; /* Number of pointers to this Table */
! 10375: u8 tabFlags; /* Mask of TF_* values */
! 10376: u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */
1.2 misho 10377: #ifndef SQLITE_OMIT_ALTERTABLE
10378: int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */
10379: #endif
10380: #ifndef SQLITE_OMIT_VIRTUALTABLE
10381: int nModuleArg; /* Number of arguments to the module */
10382: char **azModuleArg; /* Text of all module args. [0] is module name */
1.2.2.1 ! misho 10383: VTable *pVTable; /* List of VTable objects. */
1.2 misho 10384: #endif
10385: Trigger *pTrigger; /* List of triggers stored in pSchema */
10386: Schema *pSchema; /* Schema that contains this table */
10387: Table *pNextZombie; /* Next on the Parse.pZombieTab list */
10388: };
10389:
10390: /*
10391: ** Allowed values for Tabe.tabFlags.
10392: */
10393: #define TF_Readonly 0x01 /* Read-only system table */
10394: #define TF_Ephemeral 0x02 /* An ephemeral table */
10395: #define TF_HasPrimaryKey 0x04 /* Table has a primary key */
10396: #define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */
10397: #define TF_Virtual 0x10 /* Is a virtual table */
10398:
10399:
10400: /*
10401: ** Test to see whether or not a table is a virtual table. This is
10402: ** done as a macro so that it will be optimized out when virtual
10403: ** table support is omitted from the build.
10404: */
10405: #ifndef SQLITE_OMIT_VIRTUALTABLE
10406: # define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0)
1.2.2.1 ! misho 10407: # define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0)
1.2 misho 10408: #else
10409: # define IsVirtual(X) 0
10410: # define IsHiddenColumn(X) 0
10411: #endif
10412:
10413: /*
10414: ** Each foreign key constraint is an instance of the following structure.
10415: **
10416: ** A foreign key is associated with two tables. The "from" table is
10417: ** the table that contains the REFERENCES clause that creates the foreign
10418: ** key. The "to" table is the table that is named in the REFERENCES clause.
10419: ** Consider this example:
10420: **
10421: ** CREATE TABLE ex1(
10422: ** a INTEGER PRIMARY KEY,
10423: ** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x)
10424: ** );
10425: **
10426: ** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2".
10427: **
10428: ** Each REFERENCES clause generates an instance of the following structure
10429: ** which is attached to the from-table. The to-table need not exist when
10430: ** the from-table is created. The existence of the to-table is not checked.
10431: */
10432: struct FKey {
10433: Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */
10434: FKey *pNextFrom; /* Next foreign key in pFrom */
10435: char *zTo; /* Name of table that the key points to (aka: Parent) */
10436: FKey *pNextTo; /* Next foreign key on table named zTo */
10437: FKey *pPrevTo; /* Previous foreign key on table named zTo */
10438: int nCol; /* Number of columns in this key */
10439: /* EV: R-30323-21917 */
10440: u8 isDeferred; /* True if constraint checking is deferred till COMMIT */
10441: u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */
10442: Trigger *apTrigger[2]; /* Triggers for aAction[] actions */
10443: struct sColMap { /* Mapping of columns in pFrom to columns in zTo */
10444: int iFrom; /* Index of column in pFrom */
10445: char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */
10446: } aCol[1]; /* One entry for each of nCol column s */
10447: };
10448:
10449: /*
10450: ** SQLite supports many different ways to resolve a constraint
10451: ** error. ROLLBACK processing means that a constraint violation
10452: ** causes the operation in process to fail and for the current transaction
10453: ** to be rolled back. ABORT processing means the operation in process
10454: ** fails and any prior changes from that one operation are backed out,
10455: ** but the transaction is not rolled back. FAIL processing means that
10456: ** the operation in progress stops and returns an error code. But prior
10457: ** changes due to the same operation are not backed out and no rollback
10458: ** occurs. IGNORE means that the particular row that caused the constraint
10459: ** error is not inserted or updated. Processing continues and no error
10460: ** is returned. REPLACE means that preexisting database rows that caused
10461: ** a UNIQUE constraint violation are removed so that the new insert or
10462: ** update can proceed. Processing continues and no error is reported.
10463: **
10464: ** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys.
10465: ** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the
10466: ** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign
10467: ** key is set to NULL. CASCADE means that a DELETE or UPDATE of the
10468: ** referenced table row is propagated into the row that holds the
10469: ** foreign key.
10470: **
10471: ** The following symbolic values are used to record which type
10472: ** of action to take.
10473: */
10474: #define OE_None 0 /* There is no constraint to check */
10475: #define OE_Rollback 1 /* Fail the operation and rollback the transaction */
10476: #define OE_Abort 2 /* Back out changes but do no rollback transaction */
10477: #define OE_Fail 3 /* Stop the operation but leave all prior changes */
10478: #define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */
10479: #define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */
10480:
10481: #define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */
10482: #define OE_SetNull 7 /* Set the foreign key value to NULL */
10483: #define OE_SetDflt 8 /* Set the foreign key value to its default */
10484: #define OE_Cascade 9 /* Cascade the changes */
10485:
10486: #define OE_Default 99 /* Do whatever the default action is */
10487:
10488:
10489: /*
10490: ** An instance of the following structure is passed as the first
10491: ** argument to sqlite3VdbeKeyCompare and is used to control the
10492: ** comparison of the two index keys.
10493: */
10494: struct KeyInfo {
10495: sqlite3 *db; /* The database connection */
10496: u8 enc; /* Text encoding - one of the SQLITE_UTF* values */
10497: u16 nField; /* Number of entries in aColl[] */
10498: u8 *aSortOrder; /* Sort order for each column. May be NULL */
10499: CollSeq *aColl[1]; /* Collating sequence for each term of the key */
10500: };
10501:
10502: /*
10503: ** An instance of the following structure holds information about a
10504: ** single index record that has already been parsed out into individual
10505: ** values.
10506: **
10507: ** A record is an object that contains one or more fields of data.
10508: ** Records are used to store the content of a table row and to store
10509: ** the key of an index. A blob encoding of a record is created by
10510: ** the OP_MakeRecord opcode of the VDBE and is disassembled by the
10511: ** OP_Column opcode.
10512: **
10513: ** This structure holds a record that has already been disassembled
10514: ** into its constituent fields.
10515: */
10516: struct UnpackedRecord {
10517: KeyInfo *pKeyInfo; /* Collation and sort-order information */
10518: u16 nField; /* Number of entries in apMem[] */
10519: u8 flags; /* Boolean settings. UNPACKED_... below */
10520: i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */
10521: Mem *aMem; /* Values */
10522: };
10523:
10524: /*
10525: ** Allowed values of UnpackedRecord.flags
10526: */
10527: #define UNPACKED_INCRKEY 0x01 /* Make this key an epsilon larger */
10528: #define UNPACKED_PREFIX_MATCH 0x02 /* A prefix match is considered OK */
10529: #define UNPACKED_PREFIX_SEARCH 0x04 /* Ignore final (rowid) field */
10530:
10531: /*
10532: ** Each SQL index is represented in memory by an
10533: ** instance of the following structure.
10534: **
10535: ** The columns of the table that are to be indexed are described
10536: ** by the aiColumn[] field of this structure. For example, suppose
10537: ** we have the following table and index:
10538: **
10539: ** CREATE TABLE Ex1(c1 int, c2 int, c3 text);
10540: ** CREATE INDEX Ex2 ON Ex1(c3,c1);
10541: **
10542: ** In the Table structure describing Ex1, nCol==3 because there are
10543: ** three columns in the table. In the Index structure describing
10544: ** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed.
10545: ** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the
10546: ** first column to be indexed (c3) has an index of 2 in Ex1.aCol[].
10547: ** The second column to be indexed (c1) has an index of 0 in
10548: ** Ex1.aCol[], hence Ex2.aiColumn[1]==0.
10549: **
10550: ** The Index.onError field determines whether or not the indexed columns
10551: ** must be unique and what to do if they are not. When Index.onError=OE_None,
10552: ** it means this is not a unique index. Otherwise it is a unique index
10553: ** and the value of Index.onError indicate the which conflict resolution
10554: ** algorithm to employ whenever an attempt is made to insert a non-unique
10555: ** element.
10556: */
10557: struct Index {
10558: char *zName; /* Name of this index */
10559: int *aiColumn; /* Which columns are used by this index. 1st is 0 */
10560: tRowcnt *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */
10561: Table *pTable; /* The SQL table being indexed */
10562: char *zColAff; /* String defining the affinity of each column */
10563: Index *pNext; /* The next index associated with the same table */
10564: Schema *pSchema; /* Schema containing this index */
10565: u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */
10566: char **azColl; /* Array of collation sequence names for index */
1.2.2.1 ! misho 10567: int nColumn; /* Number of columns in the table used by this index */
! 10568: int tnum; /* Page containing root of this index in database file */
! 10569: u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
! 10570: u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */
! 10571: u8 bUnordered; /* Use this index for == or IN queries only */
1.2 misho 10572: #ifdef SQLITE_ENABLE_STAT3
10573: int nSample; /* Number of elements in aSample[] */
10574: tRowcnt avgEq; /* Average nEq value for key values not in aSample */
10575: IndexSample *aSample; /* Samples of the left-most key */
10576: #endif
10577: };
10578:
10579: /*
10580: ** Each sample stored in the sqlite_stat3 table is represented in memory
10581: ** using a structure of this type. See documentation at the top of the
10582: ** analyze.c source file for additional information.
10583: */
10584: struct IndexSample {
10585: union {
10586: char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */
10587: double r; /* Value if eType is SQLITE_FLOAT */
10588: i64 i; /* Value if eType is SQLITE_INTEGER */
10589: } u;
10590: u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */
10591: int nByte; /* Size in byte of text or blob. */
10592: tRowcnt nEq; /* Est. number of rows where the key equals this sample */
10593: tRowcnt nLt; /* Est. number of rows where key is less than this sample */
10594: tRowcnt nDLt; /* Est. number of distinct keys less than this sample */
10595: };
10596:
10597: /*
10598: ** Each token coming out of the lexer is an instance of
10599: ** this structure. Tokens are also used as part of an expression.
10600: **
10601: ** Note if Token.z==0 then Token.dyn and Token.n are undefined and
10602: ** may contain random values. Do not make any assumptions about Token.dyn
10603: ** and Token.n when Token.z==0.
10604: */
10605: struct Token {
10606: const char *z; /* Text of the token. Not NULL-terminated! */
10607: unsigned int n; /* Number of characters in this token */
10608: };
10609:
10610: /*
10611: ** An instance of this structure contains information needed to generate
10612: ** code for a SELECT that contains aggregate functions.
10613: **
10614: ** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a
10615: ** pointer to this structure. The Expr.iColumn field is the index in
10616: ** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate
10617: ** code for that node.
10618: **
10619: ** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the
10620: ** original Select structure that describes the SELECT statement. These
10621: ** fields do not need to be freed when deallocating the AggInfo structure.
10622: */
10623: struct AggInfo {
10624: u8 directMode; /* Direct rendering mode means take data directly
10625: ** from source tables rather than from accumulators */
10626: u8 useSortingIdx; /* In direct mode, reference the sorting index rather
10627: ** than the source table */
10628: int sortingIdx; /* Cursor number of the sorting index */
10629: int sortingIdxPTab; /* Cursor number of pseudo-table */
10630: int nSortingColumn; /* Number of columns in the sorting index */
1.2.2.1 ! misho 10631: ExprList *pGroupBy; /* The group by clause */
1.2 misho 10632: struct AggInfo_col { /* For each column used in source tables */
10633: Table *pTab; /* Source table */
10634: int iTable; /* Cursor number of the source table */
10635: int iColumn; /* Column number within the source table */
10636: int iSorterColumn; /* Column number in the sorting index */
10637: int iMem; /* Memory location that acts as accumulator */
10638: Expr *pExpr; /* The original expression */
10639: } *aCol;
10640: int nColumn; /* Number of used entries in aCol[] */
10641: int nAccumulator; /* Number of columns that show through to the output.
10642: ** Additional columns are used only as parameters to
10643: ** aggregate functions */
10644: struct AggInfo_func { /* For each aggregate function */
10645: Expr *pExpr; /* Expression encoding the function */
10646: FuncDef *pFunc; /* The aggregate function implementation */
10647: int iMem; /* Memory location that acts as accumulator */
10648: int iDistinct; /* Ephemeral table used to enforce DISTINCT */
10649: } *aFunc;
10650: int nFunc; /* Number of entries in aFunc[] */
10651: };
10652:
10653: /*
10654: ** The datatype ynVar is a signed integer, either 16-bit or 32-bit.
10655: ** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater
10656: ** than 32767 we have to make it 32-bit. 16-bit is preferred because
10657: ** it uses less memory in the Expr object, which is a big memory user
10658: ** in systems with lots of prepared statements. And few applications
10659: ** need more than about 10 or 20 variables. But some extreme users want
10660: ** to have prepared statements with over 32767 variables, and for them
10661: ** the option is available (at compile-time).
10662: */
10663: #if SQLITE_MAX_VARIABLE_NUMBER<=32767
10664: typedef i16 ynVar;
10665: #else
10666: typedef int ynVar;
10667: #endif
10668:
10669: /*
10670: ** Each node of an expression in the parse tree is an instance
10671: ** of this structure.
10672: **
10673: ** Expr.op is the opcode. The integer parser token codes are reused
10674: ** as opcodes here. For example, the parser defines TK_GE to be an integer
10675: ** code representing the ">=" operator. This same integer code is reused
10676: ** to represent the greater-than-or-equal-to operator in the expression
10677: ** tree.
10678: **
10679: ** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB,
10680: ** or TK_STRING), then Expr.token contains the text of the SQL literal. If
10681: ** the expression is a variable (TK_VARIABLE), then Expr.token contains the
10682: ** variable name. Finally, if the expression is an SQL function (TK_FUNCTION),
10683: ** then Expr.token contains the name of the function.
10684: **
10685: ** Expr.pRight and Expr.pLeft are the left and right subexpressions of a
10686: ** binary operator. Either or both may be NULL.
10687: **
10688: ** Expr.x.pList is a list of arguments if the expression is an SQL function,
10689: ** a CASE expression or an IN expression of the form "<lhs> IN (<y>, <z>...)".
10690: ** Expr.x.pSelect is used if the expression is a sub-select or an expression of
10691: ** the form "<lhs> IN (SELECT ...)". If the EP_xIsSelect bit is set in the
10692: ** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is
10693: ** valid.
10694: **
10695: ** An expression of the form ID or ID.ID refers to a column in a table.
10696: ** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is
10697: ** the integer cursor number of a VDBE cursor pointing to that table and
10698: ** Expr.iColumn is the column number for the specific column. If the
10699: ** expression is used as a result in an aggregate SELECT, then the
10700: ** value is also stored in the Expr.iAgg column in the aggregate so that
10701: ** it can be accessed after all aggregates are computed.
10702: **
10703: ** If the expression is an unbound variable marker (a question mark
10704: ** character '?' in the original SQL) then the Expr.iTable holds the index
10705: ** number for that variable.
10706: **
10707: ** If the expression is a subquery then Expr.iColumn holds an integer
10708: ** register number containing the result of the subquery. If the
10709: ** subquery gives a constant result, then iTable is -1. If the subquery
10710: ** gives a different answer at different times during statement processing
10711: ** then iTable is the address of a subroutine that computes the subquery.
10712: **
10713: ** If the Expr is of type OP_Column, and the table it is selecting from
10714: ** is a disk table or the "old.*" pseudo-table, then pTab points to the
10715: ** corresponding table definition.
10716: **
10717: ** ALLOCATION NOTES:
10718: **
10719: ** Expr objects can use a lot of memory space in database schema. To
10720: ** help reduce memory requirements, sometimes an Expr object will be
10721: ** truncated. And to reduce the number of memory allocations, sometimes
10722: ** two or more Expr objects will be stored in a single memory allocation,
10723: ** together with Expr.zToken strings.
10724: **
10725: ** If the EP_Reduced and EP_TokenOnly flags are set when
10726: ** an Expr object is truncated. When EP_Reduced is set, then all
10727: ** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees
10728: ** are contained within the same memory allocation. Note, however, that
10729: ** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately
10730: ** allocated, regardless of whether or not EP_Reduced is set.
10731: */
10732: struct Expr {
10733: u8 op; /* Operation performed by this node */
10734: char affinity; /* The affinity of the column or 0 if not a column */
10735: u16 flags; /* Various flags. EP_* See below */
10736: union {
10737: char *zToken; /* Token value. Zero terminated and dequoted */
10738: int iValue; /* Non-negative integer value if EP_IntValue */
10739: } u;
10740:
10741: /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no
10742: ** space is allocated for the fields below this point. An attempt to
10743: ** access them will result in a segfault or malfunction.
10744: *********************************************************************/
10745:
10746: Expr *pLeft; /* Left subnode */
10747: Expr *pRight; /* Right subnode */
10748: union {
10749: ExprList *pList; /* Function arguments or in "<expr> IN (<expr-list)" */
10750: Select *pSelect; /* Used for sub-selects and "<expr> IN (<select>)" */
10751: } x;
10752:
10753: /* If the EP_Reduced flag is set in the Expr.flags mask, then no
10754: ** space is allocated for the fields below this point. An attempt to
10755: ** access them will result in a segfault or malfunction.
10756: *********************************************************************/
10757:
1.2.2.1 ! misho 10758: #if SQLITE_MAX_EXPR_DEPTH>0
! 10759: int nHeight; /* Height of the tree headed by this node */
! 10760: #endif
1.2 misho 10761: int iTable; /* TK_COLUMN: cursor number of table holding column
10762: ** TK_REGISTER: register number
10763: ** TK_TRIGGER: 1 -> new, 0 -> old */
10764: ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid.
10765: ** TK_VARIABLE: variable number (always >= 1). */
10766: i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
10767: i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */
10768: u8 flags2; /* Second set of flags. EP2_... */
1.2.2.1 ! misho 10769: u8 op2; /* TK_REGISTER: original value of Expr.op
! 10770: ** TK_COLUMN: the value of p5 for OP_Column
! 10771: ** TK_AGG_FUNCTION: nesting depth */
1.2 misho 10772: AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */
10773: Table *pTab; /* Table for TK_COLUMN expressions. */
10774: };
10775:
10776: /*
10777: ** The following are the meanings of bits in the Expr.flags field.
10778: */
10779: #define EP_FromJoin 0x0001 /* Originated in ON or USING clause of a join */
10780: #define EP_Agg 0x0002 /* Contains one or more aggregate functions */
10781: #define EP_Resolved 0x0004 /* IDs have been resolved to COLUMNs */
10782: #define EP_Error 0x0008 /* Expression contains one or more errors */
10783: #define EP_Distinct 0x0010 /* Aggregate function with DISTINCT keyword */
10784: #define EP_VarSelect 0x0020 /* pSelect is correlated, not constant */
10785: #define EP_DblQuoted 0x0040 /* token.z was originally in "..." */
10786: #define EP_InfixFunc 0x0080 /* True for an infix function: LIKE, GLOB, etc */
1.2.2.1 ! misho 10787: #define EP_Collate 0x0100 /* Tree contains a TK_COLLATE opeartor */
1.2 misho 10788: #define EP_FixedDest 0x0200 /* Result needed in a specific register */
10789: #define EP_IntValue 0x0400 /* Integer value contained in u.iValue */
10790: #define EP_xIsSelect 0x0800 /* x.pSelect is valid (otherwise x.pList is) */
1.2.2.1 ! misho 10791: #define EP_Hint 0x1000 /* Not used */
1.2 misho 10792: #define EP_Reduced 0x2000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */
10793: #define EP_TokenOnly 0x4000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */
10794: #define EP_Static 0x8000 /* Held in memory not obtained from malloc() */
10795:
10796: /*
10797: ** The following are the meanings of bits in the Expr.flags2 field.
10798: */
10799: #define EP2_MallocedToken 0x0001 /* Need to sqlite3DbFree() Expr.zToken */
10800: #define EP2_Irreducible 0x0002 /* Cannot EXPRDUP_REDUCE this Expr */
10801:
10802: /*
10803: ** The pseudo-routine sqlite3ExprSetIrreducible sets the EP2_Irreducible
10804: ** flag on an expression structure. This flag is used for VV&A only. The
10805: ** routine is implemented as a macro that only works when in debugging mode,
10806: ** so as not to burden production code.
10807: */
10808: #ifdef SQLITE_DEBUG
10809: # define ExprSetIrreducible(X) (X)->flags2 |= EP2_Irreducible
10810: #else
10811: # define ExprSetIrreducible(X)
10812: #endif
10813:
10814: /*
10815: ** These macros can be used to test, set, or clear bits in the
10816: ** Expr.flags field.
10817: */
10818: #define ExprHasProperty(E,P) (((E)->flags&(P))==(P))
10819: #define ExprHasAnyProperty(E,P) (((E)->flags&(P))!=0)
10820: #define ExprSetProperty(E,P) (E)->flags|=(P)
10821: #define ExprClearProperty(E,P) (E)->flags&=~(P)
10822:
10823: /*
10824: ** Macros to determine the number of bytes required by a normal Expr
10825: ** struct, an Expr struct with the EP_Reduced flag set in Expr.flags
10826: ** and an Expr struct with the EP_TokenOnly flag set.
10827: */
10828: #define EXPR_FULLSIZE sizeof(Expr) /* Full size */
10829: #define EXPR_REDUCEDSIZE offsetof(Expr,iTable) /* Common features */
10830: #define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */
10831:
10832: /*
10833: ** Flags passed to the sqlite3ExprDup() function. See the header comment
10834: ** above sqlite3ExprDup() for details.
10835: */
10836: #define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */
10837:
10838: /*
10839: ** A list of expressions. Each expression may optionally have a
10840: ** name. An expr/name combination can be used in several ways, such
10841: ** as the list of "expr AS ID" fields following a "SELECT" or in the
10842: ** list of "ID = expr" items in an UPDATE. A list of expressions can
10843: ** also be used as the argument to a function, in which case the a.zName
10844: ** field is not used.
10845: */
10846: struct ExprList {
10847: int nExpr; /* Number of expressions on the list */
10848: int iECursor; /* VDBE Cursor associated with this ExprList */
1.2.2.1 ! misho 10849: struct ExprList_item { /* For each expression in the list */
1.2 misho 10850: Expr *pExpr; /* The list of expressions */
10851: char *zName; /* Token associated with this expression */
10852: char *zSpan; /* Original text of the expression */
10853: u8 sortOrder; /* 1 for DESC or 0 for ASC */
10854: u8 done; /* A flag to indicate when processing is finished */
10855: u16 iOrderByCol; /* For ORDER BY, column number in result set */
10856: u16 iAlias; /* Index into Parse.aAlias[] for zName */
1.2.2.1 ! misho 10857: } *a; /* Alloc a power of two greater or equal to nExpr */
1.2 misho 10858: };
10859:
10860: /*
10861: ** An instance of this structure is used by the parser to record both
10862: ** the parse tree for an expression and the span of input text for an
10863: ** expression.
10864: */
10865: struct ExprSpan {
10866: Expr *pExpr; /* The expression parse tree */
10867: const char *zStart; /* First character of input text */
10868: const char *zEnd; /* One character past the end of input text */
10869: };
10870:
10871: /*
10872: ** An instance of this structure can hold a simple list of identifiers,
10873: ** such as the list "a,b,c" in the following statements:
10874: **
10875: ** INSERT INTO t(a,b,c) VALUES ...;
10876: ** CREATE INDEX idx ON t(a,b,c);
10877: ** CREATE TRIGGER trig BEFORE UPDATE ON t(a,b,c) ...;
10878: **
10879: ** The IdList.a.idx field is used when the IdList represents the list of
10880: ** column names after a table name in an INSERT statement. In the statement
10881: **
10882: ** INSERT INTO t(a,b,c) ...
10883: **
10884: ** If "a" is the k-th column of table "t", then IdList.a[0].idx==k.
10885: */
10886: struct IdList {
10887: struct IdList_item {
10888: char *zName; /* Name of the identifier */
10889: int idx; /* Index in some Table.aCol[] of a column named zName */
10890: } *a;
10891: int nId; /* Number of identifiers on the list */
10892: };
10893:
10894: /*
10895: ** The bitmask datatype defined below is used for various optimizations.
10896: **
10897: ** Changing this from a 64-bit to a 32-bit type limits the number of
10898: ** tables in a join to 32 instead of 64. But it also reduces the size
10899: ** of the library by 738 bytes on ix86.
10900: */
10901: typedef u64 Bitmask;
10902:
10903: /*
10904: ** The number of bits in a Bitmask. "BMS" means "BitMask Size".
10905: */
10906: #define BMS ((int)(sizeof(Bitmask)*8))
10907:
10908: /*
10909: ** The following structure describes the FROM clause of a SELECT statement.
10910: ** Each table or subquery in the FROM clause is a separate element of
10911: ** the SrcList.a[] array.
10912: **
10913: ** With the addition of multiple database support, the following structure
10914: ** can also be used to describe a particular table such as the table that
10915: ** is modified by an INSERT, DELETE, or UPDATE statement. In standard SQL,
10916: ** such a table must be a simple name: ID. But in SQLite, the table can
10917: ** now be identified by a database name, a dot, then the table name: ID.ID.
10918: **
10919: ** The jointype starts out showing the join type between the current table
10920: ** and the next table on the list. The parser builds the list this way.
10921: ** But sqlite3SrcListShiftJoinType() later shifts the jointypes so that each
10922: ** jointype expresses the join between the table and the previous table.
10923: **
10924: ** In the colUsed field, the high-order bit (bit 63) is set if the table
10925: ** contains more than 63 columns and the 64-th or later column is used.
10926: */
10927: struct SrcList {
10928: i16 nSrc; /* Number of tables or subqueries in the FROM clause */
10929: i16 nAlloc; /* Number of entries allocated in a[] below */
10930: struct SrcList_item {
1.2.2.1 ! misho 10931: Schema *pSchema; /* Schema to which this item is fixed */
1.2 misho 10932: char *zDatabase; /* Name of database holding this table */
10933: char *zName; /* Name of the table */
10934: char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */
10935: Table *pTab; /* An SQL table corresponding to zName */
10936: Select *pSelect; /* A SELECT statement used in place of a table name */
10937: int addrFillSub; /* Address of subroutine to manifest a subquery */
10938: int regReturn; /* Register holding return address of addrFillSub */
10939: u8 jointype; /* Type of join between this able and the previous */
1.2.2.1 ! misho 10940: unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */
! 10941: unsigned isCorrelated :1; /* True if sub-query is correlated */
! 10942: unsigned viaCoroutine :1; /* Implemented as a co-routine */
1.2 misho 10943: #ifndef SQLITE_OMIT_EXPLAIN
10944: u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */
10945: #endif
10946: int iCursor; /* The VDBE cursor number used to access this table */
10947: Expr *pOn; /* The ON clause of a join */
10948: IdList *pUsing; /* The USING clause of a join */
10949: Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used */
10950: char *zIndex; /* Identifier from "INDEXED BY <zIndex>" clause */
10951: Index *pIndex; /* Index structure corresponding to zIndex, if any */
10952: } a[1]; /* One entry for each identifier on the list */
10953: };
10954:
10955: /*
10956: ** Permitted values of the SrcList.a.jointype field
10957: */
10958: #define JT_INNER 0x0001 /* Any kind of inner or cross join */
10959: #define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */
10960: #define JT_NATURAL 0x0004 /* True for a "natural" join */
10961: #define JT_LEFT 0x0008 /* Left outer join */
10962: #define JT_RIGHT 0x0010 /* Right outer join */
10963: #define JT_OUTER 0x0020 /* The "OUTER" keyword is present */
10964: #define JT_ERROR 0x0040 /* unknown or unsupported join type */
10965:
10966:
10967: /*
10968: ** A WherePlan object holds information that describes a lookup
10969: ** strategy.
10970: **
10971: ** This object is intended to be opaque outside of the where.c module.
10972: ** It is included here only so that that compiler will know how big it
10973: ** is. None of the fields in this object should be used outside of
10974: ** the where.c module.
10975: **
10976: ** Within the union, pIdx is only used when wsFlags&WHERE_INDEXED is true.
10977: ** pTerm is only used when wsFlags&WHERE_MULTI_OR is true. And pVtabIdx
10978: ** is only used when wsFlags&WHERE_VIRTUALTABLE is true. It is never the
10979: ** case that more than one of these conditions is true.
10980: */
10981: struct WherePlan {
10982: u32 wsFlags; /* WHERE_* flags that describe the strategy */
1.2.2.1 ! misho 10983: u16 nEq; /* Number of == constraints */
! 10984: u16 nOBSat; /* Number of ORDER BY terms satisfied */
1.2 misho 10985: double nRow; /* Estimated number of rows (for EQP) */
10986: union {
10987: Index *pIdx; /* Index when WHERE_INDEXED is true */
10988: struct WhereTerm *pTerm; /* WHERE clause term for OR-search */
10989: sqlite3_index_info *pVtabIdx; /* Virtual table index to use */
10990: } u;
10991: };
10992:
10993: /*
10994: ** For each nested loop in a WHERE clause implementation, the WhereInfo
10995: ** structure contains a single instance of this structure. This structure
1.2.2.1 ! misho 10996: ** is intended to be private to the where.c module and should not be
1.2 misho 10997: ** access or modified by other modules.
10998: **
10999: ** The pIdxInfo field is used to help pick the best index on a
11000: ** virtual table. The pIdxInfo pointer contains indexing
11001: ** information for the i-th table in the FROM clause before reordering.
11002: ** All the pIdxInfo pointers are freed by whereInfoFree() in where.c.
11003: ** All other information in the i-th WhereLevel object for the i-th table
11004: ** after FROM clause ordering.
11005: */
11006: struct WhereLevel {
11007: WherePlan plan; /* query plan for this element of the FROM clause */
11008: int iLeftJoin; /* Memory cell used to implement LEFT OUTER JOIN */
11009: int iTabCur; /* The VDBE cursor used to access the table */
11010: int iIdxCur; /* The VDBE cursor used to access pIdx */
11011: int addrBrk; /* Jump here to break out of the loop */
11012: int addrNxt; /* Jump here to start the next IN combination */
11013: int addrCont; /* Jump here to continue with the next loop cycle */
11014: int addrFirst; /* First instruction of interior of the loop */
11015: u8 iFrom; /* Which entry in the FROM clause */
11016: u8 op, p5; /* Opcode and P5 of the opcode that ends the loop */
11017: int p1, p2; /* Operands of the opcode used to ends the loop */
11018: union { /* Information that depends on plan.wsFlags */
11019: struct {
11020: int nIn; /* Number of entries in aInLoop[] */
11021: struct InLoop {
11022: int iCur; /* The VDBE cursor used by this IN operator */
11023: int addrInTop; /* Top of the IN loop */
11024: } *aInLoop; /* Information about each nested IN operator */
11025: } in; /* Used when plan.wsFlags&WHERE_IN_ABLE */
1.2.2.1 ! misho 11026: Index *pCovidx; /* Possible covering index for WHERE_MULTI_OR */
1.2 misho 11027: } u;
1.2.2.1 ! misho 11028: double rOptCost; /* "Optimal" cost for this level */
1.2 misho 11029:
11030: /* The following field is really not part of the current level. But
11031: ** we need a place to cache virtual table index information for each
11032: ** virtual table in the FROM clause and the WhereLevel structure is
11033: ** a convenient place since there is one WhereLevel for each FROM clause
11034: ** element.
11035: */
11036: sqlite3_index_info *pIdxInfo; /* Index info for n-th source table */
11037: };
11038:
11039: /*
11040: ** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin()
11041: ** and the WhereInfo.wctrlFlags member.
11042: */
11043: #define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */
11044: #define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */
11045: #define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */
11046: #define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */
11047: #define WHERE_DUPLICATES_OK 0x0008 /* Ok to return a row more than once */
11048: #define WHERE_OMIT_OPEN_CLOSE 0x0010 /* Table cursors are already open */
11049: #define WHERE_FORCE_TABLE 0x0020 /* Do not use an index-only search */
11050: #define WHERE_ONETABLE_ONLY 0x0040 /* Only code the 1st table in pTabList */
11051: #define WHERE_AND_ONLY 0x0080 /* Don't use indices for OR terms */
11052:
11053: /*
11054: ** The WHERE clause processing routine has two halves. The
11055: ** first part does the start of the WHERE loop and the second
11056: ** half does the tail of the WHERE loop. An instance of
11057: ** this structure is returned by the first half and passed
11058: ** into the second half to give some continuity.
11059: */
11060: struct WhereInfo {
1.2.2.1 ! misho 11061: Parse *pParse; /* Parsing and code generating context */
! 11062: SrcList *pTabList; /* List of tables in the join */
! 11063: u16 nOBSat; /* Number of ORDER BY terms satisfied by indices */
! 11064: u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */
! 11065: u8 okOnePass; /* Ok to use one-pass algorithm for UPDATE/DELETE */
! 11066: u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */
! 11067: u8 eDistinct; /* One of the WHERE_DISTINCT_* values below */
! 11068: int iTop; /* The very beginning of the WHERE loop */
! 11069: int iContinue; /* Jump here to continue with next record */
! 11070: int iBreak; /* Jump here to break out of the loop */
! 11071: int nLevel; /* Number of nested loop */
! 11072: struct WhereClause *pWC; /* Decomposition of the WHERE clause */
! 11073: double savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */
! 11074: double nRowOut; /* Estimated number of output rows */
! 11075: WhereLevel a[1]; /* Information about each nest loop in WHERE */
! 11076: };
! 11077:
! 11078: /* Allowed values for WhereInfo.eDistinct and DistinctCtx.eTnctType */
! 11079: #define WHERE_DISTINCT_NOOP 0 /* DISTINCT keyword not used */
! 11080: #define WHERE_DISTINCT_UNIQUE 1 /* No duplicates */
! 11081: #define WHERE_DISTINCT_ORDERED 2 /* All duplicates are adjacent */
! 11082: #define WHERE_DISTINCT_UNORDERED 3 /* Duplicates are scattered */
1.2 misho 11083:
11084: /*
11085: ** A NameContext defines a context in which to resolve table and column
11086: ** names. The context consists of a list of tables (the pSrcList) field and
11087: ** a list of named expression (pEList). The named expression list may
11088: ** be NULL. The pSrc corresponds to the FROM clause of a SELECT or
11089: ** to the table being operated on by INSERT, UPDATE, or DELETE. The
11090: ** pEList corresponds to the result set of a SELECT and is NULL for
11091: ** other statements.
11092: **
11093: ** NameContexts can be nested. When resolving names, the inner-most
11094: ** context is searched first. If no match is found, the next outer
11095: ** context is checked. If there is still no match, the next context
11096: ** is checked. This process continues until either a match is found
11097: ** or all contexts are check. When a match is found, the nRef member of
11098: ** the context containing the match is incremented.
11099: **
11100: ** Each subquery gets a new NameContext. The pNext field points to the
11101: ** NameContext in the parent query. Thus the process of scanning the
11102: ** NameContext list corresponds to searching through successively outer
11103: ** subqueries looking for a match.
11104: */
11105: struct NameContext {
11106: Parse *pParse; /* The parser */
11107: SrcList *pSrcList; /* One or more tables used to resolve names */
11108: ExprList *pEList; /* Optional list of named expressions */
11109: AggInfo *pAggInfo; /* Information about aggregates at this level */
11110: NameContext *pNext; /* Next outer name context. NULL for outermost */
1.2.2.1 ! misho 11111: int nRef; /* Number of names resolved by this context */
! 11112: int nErr; /* Number of errors encountered while resolving names */
! 11113: u8 ncFlags; /* Zero or more NC_* flags defined below */
1.2 misho 11114: };
11115:
11116: /*
1.2.2.1 ! misho 11117: ** Allowed values for the NameContext, ncFlags field.
! 11118: */
! 11119: #define NC_AllowAgg 0x01 /* Aggregate functions are allowed here */
! 11120: #define NC_HasAgg 0x02 /* One or more aggregate functions seen */
! 11121: #define NC_IsCheck 0x04 /* True if resolving names in a CHECK constraint */
! 11122: #define NC_InAggFunc 0x08 /* True if analyzing arguments to an agg func */
! 11123:
! 11124: /*
1.2 misho 11125: ** An instance of the following structure contains all information
11126: ** needed to generate code for a single SELECT statement.
11127: **
11128: ** nLimit is set to -1 if there is no LIMIT clause. nOffset is set to 0.
11129: ** If there is a LIMIT clause, the parser sets nLimit to the value of the
11130: ** limit and nOffset to the value of the offset (or 0 if there is not
11131: ** offset). But later on, nLimit and nOffset become the memory locations
11132: ** in the VDBE that record the limit and offset counters.
11133: **
11134: ** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes.
11135: ** These addresses must be stored so that we can go back and fill in
11136: ** the P4_KEYINFO and P2 parameters later. Neither the KeyInfo nor
11137: ** the number of columns in P2 can be computed at the same time
11138: ** as the OP_OpenEphm instruction is coded because not
11139: ** enough information about the compound query is known at that point.
11140: ** The KeyInfo for addrOpenTran[0] and [1] contains collating sequences
1.2.2.1 ! misho 11141: ** for the result set. The KeyInfo for addrOpenEphm[2] contains collating
1.2 misho 11142: ** sequences for the ORDER BY clause.
11143: */
11144: struct Select {
11145: ExprList *pEList; /* The fields of the result */
11146: u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */
11147: u16 selFlags; /* Various SF_* values */
1.2.2.1 ! misho 11148: int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */
! 11149: int addrOpenEphm[3]; /* OP_OpenEphem opcodes related to this select */
! 11150: double nSelectRow; /* Estimated number of result rows */
1.2 misho 11151: SrcList *pSrc; /* The FROM clause */
11152: Expr *pWhere; /* The WHERE clause */
11153: ExprList *pGroupBy; /* The GROUP BY clause */
11154: Expr *pHaving; /* The HAVING clause */
11155: ExprList *pOrderBy; /* The ORDER BY clause */
11156: Select *pPrior; /* Prior select in a compound select statement */
11157: Select *pNext; /* Next select to the left in a compound */
11158: Select *pRightmost; /* Right-most select in a compound select statement */
11159: Expr *pLimit; /* LIMIT expression. NULL means not used. */
11160: Expr *pOffset; /* OFFSET expression. NULL means not used. */
11161: };
11162:
11163: /*
11164: ** Allowed values for Select.selFlags. The "SF" prefix stands for
11165: ** "Select Flag".
11166: */
1.2.2.1 ! misho 11167: #define SF_Distinct 0x0001 /* Output should be DISTINCT */
! 11168: #define SF_Resolved 0x0002 /* Identifiers have been resolved */
! 11169: #define SF_Aggregate 0x0004 /* Contains aggregate functions */
! 11170: #define SF_UsesEphemeral 0x0008 /* Uses the OpenEphemeral opcode */
! 11171: #define SF_Expanded 0x0010 /* sqlite3SelectExpand() called on this */
! 11172: #define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */
! 11173: #define SF_UseSorter 0x0040 /* Sort using a sorter */
! 11174: #define SF_Values 0x0080 /* Synthesized from VALUES clause */
! 11175: #define SF_Materialize 0x0100 /* Force materialization of views */
1.2 misho 11176:
11177:
11178: /*
11179: ** The results of a select can be distributed in several ways. The
11180: ** "SRT" prefix means "SELECT Result Type".
11181: */
11182: #define SRT_Union 1 /* Store result as keys in an index */
11183: #define SRT_Except 2 /* Remove result from a UNION index */
11184: #define SRT_Exists 3 /* Store 1 if the result is not empty */
11185: #define SRT_Discard 4 /* Do not save the results anywhere */
11186:
11187: /* The ORDER BY clause is ignored for all of the above */
11188: #define IgnorableOrderby(X) ((X->eDest)<=SRT_Discard)
11189:
11190: #define SRT_Output 5 /* Output each row of result */
11191: #define SRT_Mem 6 /* Store result in a memory cell */
11192: #define SRT_Set 7 /* Store results as keys in an index */
11193: #define SRT_Table 8 /* Store result as data with an automatic rowid */
11194: #define SRT_EphemTab 9 /* Create transient tab and store like SRT_Table */
11195: #define SRT_Coroutine 10 /* Generate a single row of result */
11196:
11197: /*
1.2.2.1 ! misho 11198: ** An instance of this object describes where to put of the results of
! 11199: ** a SELECT statement.
1.2 misho 11200: */
11201: struct SelectDest {
1.2.2.1 ! misho 11202: u8 eDest; /* How to dispose of the results. On of SRT_* above. */
! 11203: char affSdst; /* Affinity used when eDest==SRT_Set */
! 11204: int iSDParm; /* A parameter used by the eDest disposal method */
! 11205: int iSdst; /* Base register where results are written */
! 11206: int nSdst; /* Number of registers allocated */
1.2 misho 11207: };
11208:
11209: /*
11210: ** During code generation of statements that do inserts into AUTOINCREMENT
11211: ** tables, the following information is attached to the Table.u.autoInc.p
11212: ** pointer of each autoincrement table to record some side information that
11213: ** the code generator needs. We have to keep per-table autoincrement
11214: ** information in case inserts are down within triggers. Triggers do not
11215: ** normally coordinate their activities, but we do need to coordinate the
11216: ** loading and saving of autoincrement information.
11217: */
11218: struct AutoincInfo {
11219: AutoincInfo *pNext; /* Next info block in a list of them all */
11220: Table *pTab; /* Table this info block refers to */
11221: int iDb; /* Index in sqlite3.aDb[] of database holding pTab */
11222: int regCtr; /* Memory register holding the rowid counter */
11223: };
11224:
11225: /*
11226: ** Size of the column cache
11227: */
11228: #ifndef SQLITE_N_COLCACHE
11229: # define SQLITE_N_COLCACHE 10
11230: #endif
11231:
11232: /*
11233: ** At least one instance of the following structure is created for each
11234: ** trigger that may be fired while parsing an INSERT, UPDATE or DELETE
11235: ** statement. All such objects are stored in the linked list headed at
11236: ** Parse.pTriggerPrg and deleted once statement compilation has been
11237: ** completed.
11238: **
11239: ** A Vdbe sub-program that implements the body and WHEN clause of trigger
11240: ** TriggerPrg.pTrigger, assuming a default ON CONFLICT clause of
11241: ** TriggerPrg.orconf, is stored in the TriggerPrg.pProgram variable.
11242: ** The Parse.pTriggerPrg list never contains two entries with the same
11243: ** values for both pTrigger and orconf.
11244: **
11245: ** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns
11246: ** accessed (or set to 0 for triggers fired as a result of INSERT
11247: ** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to
11248: ** a mask of new.* columns used by the program.
11249: */
11250: struct TriggerPrg {
11251: Trigger *pTrigger; /* Trigger this program was coded from */
1.2.2.1 ! misho 11252: TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */
1.2 misho 11253: SubProgram *pProgram; /* Program implementing pTrigger/orconf */
1.2.2.1 ! misho 11254: int orconf; /* Default ON CONFLICT policy */
1.2 misho 11255: u32 aColmask[2]; /* Masks of old.*, new.* columns accessed */
11256: };
11257:
11258: /*
11259: ** The yDbMask datatype for the bitmask of all attached databases.
11260: */
11261: #if SQLITE_MAX_ATTACHED>30
11262: typedef sqlite3_uint64 yDbMask;
11263: #else
11264: typedef unsigned int yDbMask;
11265: #endif
11266:
11267: /*
11268: ** An SQL parser context. A copy of this structure is passed through
11269: ** the parser and down into all the parser action routine in order to
11270: ** carry around information that is global to the entire parse.
11271: **
11272: ** The structure is divided into two parts. When the parser and code
11273: ** generate call themselves recursively, the first part of the structure
11274: ** is constant but the second part is reset at the beginning and end of
11275: ** each recursion.
11276: **
11277: ** The nTableLock and aTableLock variables are only used if the shared-cache
11278: ** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are
11279: ** used to store the set of table-locks required by the statement being
11280: ** compiled. Function sqlite3TableLock() is used to add entries to the
11281: ** list.
11282: */
11283: struct Parse {
11284: sqlite3 *db; /* The main database structure */
11285: char *zErrMsg; /* An error message */
11286: Vdbe *pVdbe; /* An engine for executing database bytecode */
1.2.2.1 ! misho 11287: int rc; /* Return code from execution */
1.2 misho 11288: u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */
11289: u8 checkSchema; /* Causes schema cookie check after an error */
11290: u8 nested; /* Number of nested calls to the parser/code generator */
11291: u8 nTempReg; /* Number of temporary registers in aTempReg[] */
11292: u8 nTempInUse; /* Number of aTempReg[] currently checked out */
1.2.2.1 ! misho 11293: u8 nColCache; /* Number of entries in aColCache[] */
! 11294: u8 iColCache; /* Next entry in aColCache[] to replace */
! 11295: u8 isMultiWrite; /* True if statement may modify/insert multiple rows */
! 11296: u8 mayAbort; /* True if statement may throw an ABORT exception */
1.2 misho 11297: int aTempReg[8]; /* Holding area for temporary registers */
11298: int nRangeReg; /* Size of the temporary register block */
11299: int iRangeReg; /* First register in temporary register block */
11300: int nErr; /* Number of errors seen */
11301: int nTab; /* Number of previously allocated VDBE cursors */
11302: int nMem; /* Number of memory cells used so far */
11303: int nSet; /* Number of sets used so far */
11304: int nOnce; /* Number of OP_Once instructions so far */
11305: int ckBase; /* Base register of data during check constraints */
11306: int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */
11307: int iCacheCnt; /* Counter used to generate aColCache[].lru values */
11308: struct yColCache {
11309: int iTable; /* Table cursor number */
11310: int iColumn; /* Table column number */
11311: u8 tempReg; /* iReg is a temp register that needs to be freed */
11312: int iLevel; /* Nesting level */
11313: int iReg; /* Reg with value of this column. 0 means none. */
11314: int lru; /* Least recently used entry has the smallest value */
11315: } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */
11316: yDbMask writeMask; /* Start a write transaction on these databases */
11317: yDbMask cookieMask; /* Bitmask of schema verified databases */
11318: int cookieGoto; /* Address of OP_Goto to cookie verifier subroutine */
11319: int cookieValue[SQLITE_MAX_ATTACHED+2]; /* Values of cookies to verify */
1.2.2.1 ! misho 11320: int regRowid; /* Register holding rowid of CREATE TABLE entry */
! 11321: int regRoot; /* Register holding root page number for new objects */
! 11322: int nMaxArg; /* Max args passed to user function by sub-program */
! 11323: Token constraintName;/* Name of the constraint currently being parsed */
1.2 misho 11324: #ifndef SQLITE_OMIT_SHARED_CACHE
11325: int nTableLock; /* Number of locks in aTableLock */
11326: TableLock *aTableLock; /* Required table locks for shared-cache mode */
11327: #endif
11328: AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */
11329:
11330: /* Information used while coding trigger programs. */
11331: Parse *pToplevel; /* Parse structure for main program (or NULL) */
11332: Table *pTriggerTab; /* Table triggers are being coded for */
1.2.2.1 ! misho 11333: double nQueryLoop; /* Estimated number of iterations of a query */
1.2 misho 11334: u32 oldmask; /* Mask of old.* columns referenced */
11335: u32 newmask; /* Mask of new.* columns referenced */
11336: u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */
11337: u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */
11338: u8 disableTriggers; /* True to disable triggers */
11339:
11340: /* Above is constant between recursions. Below is reset before and after
11341: ** each recursion */
11342:
1.2.2.1 ! misho 11343: int nVar; /* Number of '?' variables seen in the SQL so far */
! 11344: int nzVar; /* Number of available slots in azVar[] */
! 11345: u8 explain; /* True if the EXPLAIN flag is found on the query */
! 11346: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 11347: u8 declareVtab; /* True if inside sqlite3_declare_vtab() */
! 11348: int nVtabLock; /* Number of virtual tables to lock */
! 11349: #endif
! 11350: int nAlias; /* Number of aliased result set columns */
! 11351: int nHeight; /* Expression tree height of current sub-select */
! 11352: #ifndef SQLITE_OMIT_EXPLAIN
! 11353: int iSelectId; /* ID of current select for EXPLAIN output */
! 11354: int iNextSelectId; /* Next available select ID for EXPLAIN output */
! 11355: #endif
! 11356: char **azVar; /* Pointers to names of parameters */
! 11357: Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */
! 11358: int *aAlias; /* Register used to hold aliased result */
! 11359: const char *zTail; /* All SQL text past the last semicolon parsed */
! 11360: Table *pNewTable; /* A table being constructed by CREATE TABLE */
1.2 misho 11361: Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */
11362: const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
1.2.2.1 ! misho 11363: Token sNameToken; /* Token with unqualified schema object name */
! 11364: Token sLastToken; /* The last token parsed */
1.2 misho 11365: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 11366: Token sArg; /* Complete text of a module argument */
! 11367: Table **apVtabLock; /* Pointer to virtual tables needing locking */
1.2 misho 11368: #endif
1.2.2.1 ! misho 11369: Table *pZombieTab; /* List of Table objects to delete after code gen */
! 11370: TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
1.2 misho 11371: };
11372:
1.2.2.1 ! misho 11373: /*
! 11374: ** Return true if currently inside an sqlite3_declare_vtab() call.
! 11375: */
1.2 misho 11376: #ifdef SQLITE_OMIT_VIRTUALTABLE
11377: #define IN_DECLARE_VTAB 0
11378: #else
11379: #define IN_DECLARE_VTAB (pParse->declareVtab)
11380: #endif
11381:
11382: /*
11383: ** An instance of the following structure can be declared on a stack and used
11384: ** to save the Parse.zAuthContext value so that it can be restored later.
11385: */
11386: struct AuthContext {
11387: const char *zAuthContext; /* Put saved Parse.zAuthContext here */
11388: Parse *pParse; /* The Parse structure */
11389: };
11390:
11391: /*
1.2.2.1 ! misho 11392: ** Bitfield flags for P5 value in various opcodes.
1.2 misho 11393: */
11394: #define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */
11395: #define OPFLAG_LASTROWID 0x02 /* Set to update db->lastRowid */
11396: #define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */
11397: #define OPFLAG_APPEND 0x08 /* This is likely to be an append */
11398: #define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */
11399: #define OPFLAG_CLEARCACHE 0x20 /* Clear pseudo-table cache in OP_Column */
1.2.2.1 ! misho 11400: #define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */
! 11401: #define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */
! 11402: #define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */
! 11403: #define OPFLAG_P2ISREG 0x02 /* P2 to OP_Open** is a register number */
! 11404: #define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */
1.2 misho 11405:
11406: /*
11407: * Each trigger present in the database schema is stored as an instance of
11408: * struct Trigger.
11409: *
11410: * Pointers to instances of struct Trigger are stored in two ways.
11411: * 1. In the "trigHash" hash table (part of the sqlite3* that represents the
11412: * database). This allows Trigger structures to be retrieved by name.
11413: * 2. All triggers associated with a single table form a linked list, using the
11414: * pNext member of struct Trigger. A pointer to the first element of the
11415: * linked list is stored as the "pTrigger" member of the associated
11416: * struct Table.
11417: *
11418: * The "step_list" member points to the first element of a linked list
11419: * containing the SQL statements specified as the trigger program.
11420: */
11421: struct Trigger {
11422: char *zName; /* The name of the trigger */
11423: char *table; /* The table or view to which the trigger applies */
11424: u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT */
11425: u8 tr_tm; /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
11426: Expr *pWhen; /* The WHEN clause of the expression (may be NULL) */
11427: IdList *pColumns; /* If this is an UPDATE OF <column-list> trigger,
11428: the <column-list> is stored here */
11429: Schema *pSchema; /* Schema containing the trigger */
11430: Schema *pTabSchema; /* Schema containing the table */
11431: TriggerStep *step_list; /* Link list of trigger program steps */
11432: Trigger *pNext; /* Next trigger associated with the table */
11433: };
11434:
11435: /*
11436: ** A trigger is either a BEFORE or an AFTER trigger. The following constants
11437: ** determine which.
11438: **
11439: ** If there are multiple triggers, you might of some BEFORE and some AFTER.
11440: ** In that cases, the constants below can be ORed together.
11441: */
11442: #define TRIGGER_BEFORE 1
11443: #define TRIGGER_AFTER 2
11444:
11445: /*
11446: * An instance of struct TriggerStep is used to store a single SQL statement
11447: * that is a part of a trigger-program.
11448: *
11449: * Instances of struct TriggerStep are stored in a singly linked list (linked
11450: * using the "pNext" member) referenced by the "step_list" member of the
11451: * associated struct Trigger instance. The first element of the linked list is
11452: * the first step of the trigger-program.
11453: *
11454: * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or
11455: * "SELECT" statement. The meanings of the other members is determined by the
11456: * value of "op" as follows:
11457: *
11458: * (op == TK_INSERT)
11459: * orconf -> stores the ON CONFLICT algorithm
11460: * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then
11461: * this stores a pointer to the SELECT statement. Otherwise NULL.
11462: * target -> A token holding the quoted name of the table to insert into.
11463: * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then
11464: * this stores values to be inserted. Otherwise NULL.
11465: * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ...
11466: * statement, then this stores the column-names to be
11467: * inserted into.
11468: *
11469: * (op == TK_DELETE)
11470: * target -> A token holding the quoted name of the table to delete from.
11471: * pWhere -> The WHERE clause of the DELETE statement if one is specified.
11472: * Otherwise NULL.
11473: *
11474: * (op == TK_UPDATE)
11475: * target -> A token holding the quoted name of the table to update rows of.
11476: * pWhere -> The WHERE clause of the UPDATE statement if one is specified.
11477: * Otherwise NULL.
11478: * pExprList -> A list of the columns to update and the expressions to update
11479: * them to. See sqlite3Update() documentation of "pChanges"
11480: * argument.
11481: *
11482: */
11483: struct TriggerStep {
11484: u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */
11485: u8 orconf; /* OE_Rollback etc. */
11486: Trigger *pTrig; /* The trigger that this step is a part of */
11487: Select *pSelect; /* SELECT statment or RHS of INSERT INTO .. SELECT ... */
11488: Token target; /* Target table for DELETE, UPDATE, INSERT */
11489: Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */
11490: ExprList *pExprList; /* SET clause for UPDATE. VALUES clause for INSERT */
11491: IdList *pIdList; /* Column names for INSERT */
11492: TriggerStep *pNext; /* Next in the link-list */
11493: TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
11494: };
11495:
11496: /*
11497: ** The following structure contains information used by the sqliteFix...
11498: ** routines as they walk the parse tree to make database references
11499: ** explicit.
11500: */
11501: typedef struct DbFixer DbFixer;
11502: struct DbFixer {
11503: Parse *pParse; /* The parsing context. Error messages written here */
1.2.2.1 ! misho 11504: Schema *pSchema; /* Fix items to this schema */
1.2 misho 11505: const char *zDb; /* Make sure all objects are contained in this database */
11506: const char *zType; /* Type of the container - used for error messages */
11507: const Token *pName; /* Name of the container - used for error messages */
11508: };
11509:
11510: /*
11511: ** An objected used to accumulate the text of a string where we
11512: ** do not necessarily know how big the string will be in the end.
11513: */
11514: struct StrAccum {
11515: sqlite3 *db; /* Optional database for lookaside. Can be NULL */
11516: char *zBase; /* A base allocation. Not from malloc. */
11517: char *zText; /* The string collected so far */
11518: int nChar; /* Length of the string so far */
11519: int nAlloc; /* Amount of space allocated in zText */
11520: int mxAlloc; /* Maximum allowed string length */
11521: u8 mallocFailed; /* Becomes true if any memory allocation fails */
11522: u8 useMalloc; /* 0: none, 1: sqlite3DbMalloc, 2: sqlite3_malloc */
11523: u8 tooBig; /* Becomes true if string size exceeds limits */
11524: };
11525:
11526: /*
11527: ** A pointer to this structure is used to communicate information
11528: ** from sqlite3Init and OP_ParseSchema into the sqlite3InitCallback.
11529: */
11530: typedef struct {
11531: sqlite3 *db; /* The database being initialized */
11532: char **pzErrMsg; /* Error message stored here */
1.2.2.1 ! misho 11533: int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */
1.2 misho 11534: int rc; /* Result code stored here */
11535: } InitData;
11536:
11537: /*
11538: ** Structure containing global configuration data for the SQLite library.
11539: **
11540: ** This structure also contains some state information.
11541: */
11542: struct Sqlite3Config {
11543: int bMemstat; /* True to enable memory status */
11544: int bCoreMutex; /* True to enable core mutexing */
11545: int bFullMutex; /* True to enable full mutexing */
11546: int bOpenUri; /* True to interpret filenames as URIs */
1.2.2.1 ! misho 11547: int bUseCis; /* Use covering indices for full-scans */
1.2 misho 11548: int mxStrlen; /* Maximum string length */
11549: int szLookaside; /* Default lookaside buffer size */
11550: int nLookaside; /* Default lookaside buffer count */
11551: sqlite3_mem_methods m; /* Low-level memory allocation interface */
11552: sqlite3_mutex_methods mutex; /* Low-level mutex interface */
11553: sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */
11554: void *pHeap; /* Heap storage space */
11555: int nHeap; /* Size of pHeap[] */
11556: int mnReq, mxReq; /* Min and max heap requests sizes */
11557: void *pScratch; /* Scratch memory */
11558: int szScratch; /* Size of each scratch buffer */
11559: int nScratch; /* Number of scratch buffers */
11560: void *pPage; /* Page cache memory */
11561: int szPage; /* Size of each page in pPage[] */
11562: int nPage; /* Number of pages in pPage[] */
11563: int mxParserStack; /* maximum depth of the parser stack */
11564: int sharedCacheEnabled; /* true if shared-cache mode enabled */
11565: /* The above might be initialized to non-zero. The following need to always
11566: ** initially be zero, however. */
11567: int isInit; /* True after initialization has finished */
11568: int inProgress; /* True while initialization in progress */
11569: int isMutexInit; /* True after mutexes are initialized */
11570: int isMallocInit; /* True after malloc is initialized */
11571: int isPCacheInit; /* True after malloc is initialized */
11572: sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */
11573: int nRefInitMutex; /* Number of users of pInitMutex */
11574: void (*xLog)(void*,int,const char*); /* Function for logging */
11575: void *pLogArg; /* First argument to xLog() */
11576: int bLocaltimeFault; /* True to fail localtime() calls */
1.2.2.1 ! misho 11577: #ifdef SQLITE_ENABLE_SQLLOG
! 11578: void(*xSqllog)(void*,sqlite3*,const char*, int);
! 11579: void *pSqllogArg;
! 11580: #endif
1.2 misho 11581: };
11582:
11583: /*
11584: ** Context pointer passed down through the tree-walk.
11585: */
11586: struct Walker {
11587: int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */
11588: int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */
11589: Parse *pParse; /* Parser context. */
1.2.2.1 ! misho 11590: int walkerDepth; /* Number of subqueries */
1.2 misho 11591: union { /* Extra data for callback */
11592: NameContext *pNC; /* Naming context */
11593: int i; /* Integer value */
1.2.2.1 ! misho 11594: SrcList *pSrcList; /* FROM clause */
! 11595: struct SrcCount *pSrcCount; /* Counting column references */
1.2 misho 11596: } u;
11597: };
11598:
11599: /* Forward declarations */
11600: SQLITE_PRIVATE int sqlite3WalkExpr(Walker*, Expr*);
11601: SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*);
11602: SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*);
11603: SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*);
11604: SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*);
11605:
11606: /*
11607: ** Return code from the parse-tree walking primitives and their
11608: ** callbacks.
11609: */
11610: #define WRC_Continue 0 /* Continue down into children */
11611: #define WRC_Prune 1 /* Omit children but continue walking siblings */
11612: #define WRC_Abort 2 /* Abandon the tree walk */
11613:
11614: /*
11615: ** Assuming zIn points to the first byte of a UTF-8 character,
11616: ** advance zIn to point to the first byte of the next UTF-8 character.
11617: */
11618: #define SQLITE_SKIP_UTF8(zIn) { \
11619: if( (*(zIn++))>=0xc0 ){ \
11620: while( (*zIn & 0xc0)==0x80 ){ zIn++; } \
11621: } \
11622: }
11623:
11624: /*
11625: ** The SQLITE_*_BKPT macros are substitutes for the error codes with
11626: ** the same name but without the _BKPT suffix. These macros invoke
11627: ** routines that report the line-number on which the error originated
11628: ** using sqlite3_log(). The routines also provide a convenient place
11629: ** to set a debugger breakpoint.
11630: */
11631: SQLITE_PRIVATE int sqlite3CorruptError(int);
11632: SQLITE_PRIVATE int sqlite3MisuseError(int);
11633: SQLITE_PRIVATE int sqlite3CantopenError(int);
11634: #define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__)
11635: #define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__)
11636: #define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__)
11637:
11638:
11639: /*
11640: ** FTS4 is really an extension for FTS3. It is enabled using the
11641: ** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all
11642: ** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3.
11643: */
11644: #if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3)
11645: # define SQLITE_ENABLE_FTS3
11646: #endif
11647:
11648: /*
11649: ** The ctype.h header is needed for non-ASCII systems. It is also
11650: ** needed by FTS3 when FTS3 is included in the amalgamation.
11651: */
11652: #if !defined(SQLITE_ASCII) || \
11653: (defined(SQLITE_ENABLE_FTS3) && defined(SQLITE_AMALGAMATION))
11654: # include <ctype.h>
11655: #endif
11656:
11657: /*
11658: ** The following macros mimic the standard library functions toupper(),
11659: ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
11660: ** sqlite versions only work for ASCII characters, regardless of locale.
11661: */
11662: #ifdef SQLITE_ASCII
11663: # define sqlite3Toupper(x) ((x)&~(sqlite3CtypeMap[(unsigned char)(x)]&0x20))
11664: # define sqlite3Isspace(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x01)
11665: # define sqlite3Isalnum(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x06)
11666: # define sqlite3Isalpha(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x02)
11667: # define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04)
11668: # define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08)
11669: # define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)])
11670: #else
11671: # define sqlite3Toupper(x) toupper((unsigned char)(x))
11672: # define sqlite3Isspace(x) isspace((unsigned char)(x))
11673: # define sqlite3Isalnum(x) isalnum((unsigned char)(x))
11674: # define sqlite3Isalpha(x) isalpha((unsigned char)(x))
11675: # define sqlite3Isdigit(x) isdigit((unsigned char)(x))
11676: # define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
11677: # define sqlite3Tolower(x) tolower((unsigned char)(x))
11678: #endif
11679:
11680: /*
11681: ** Internal function prototypes
11682: */
1.2.2.1 ! misho 11683: #define sqlite3StrICmp sqlite3_stricmp
1.2 misho 11684: SQLITE_PRIVATE int sqlite3Strlen30(const char*);
11685: #define sqlite3StrNICmp sqlite3_strnicmp
11686:
11687: SQLITE_PRIVATE int sqlite3MallocInit(void);
11688: SQLITE_PRIVATE void sqlite3MallocEnd(void);
11689: SQLITE_PRIVATE void *sqlite3Malloc(int);
11690: SQLITE_PRIVATE void *sqlite3MallocZero(int);
11691: SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, int);
11692: SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, int);
11693: SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*);
11694: SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, int);
11695: SQLITE_PRIVATE void *sqlite3Realloc(void*, int);
11696: SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, int);
11697: SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, int);
11698: SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*);
11699: SQLITE_PRIVATE int sqlite3MallocSize(void*);
11700: SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*);
11701: SQLITE_PRIVATE void *sqlite3ScratchMalloc(int);
11702: SQLITE_PRIVATE void sqlite3ScratchFree(void*);
11703: SQLITE_PRIVATE void *sqlite3PageMalloc(int);
11704: SQLITE_PRIVATE void sqlite3PageFree(void*);
11705: SQLITE_PRIVATE void sqlite3MemSetDefault(void);
11706: SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void));
11707: SQLITE_PRIVATE int sqlite3HeapNearlyFull(void);
11708:
11709: /*
11710: ** On systems with ample stack space and that support alloca(), make
11711: ** use of alloca() to obtain space for large automatic objects. By default,
11712: ** obtain space from malloc().
11713: **
11714: ** The alloca() routine never returns NULL. This will cause code paths
11715: ** that deal with sqlite3StackAlloc() failures to be unreachable.
11716: */
11717: #ifdef SQLITE_USE_ALLOCA
11718: # define sqlite3StackAllocRaw(D,N) alloca(N)
11719: # define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N)
11720: # define sqlite3StackFree(D,P)
11721: #else
11722: # define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N)
11723: # define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N)
11724: # define sqlite3StackFree(D,P) sqlite3DbFree(D,P)
11725: #endif
11726:
11727: #ifdef SQLITE_ENABLE_MEMSYS3
11728: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void);
11729: #endif
11730: #ifdef SQLITE_ENABLE_MEMSYS5
11731: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void);
11732: #endif
11733:
11734:
11735: #ifndef SQLITE_MUTEX_OMIT
11736: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void);
11737: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void);
11738: SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int);
11739: SQLITE_PRIVATE int sqlite3MutexInit(void);
11740: SQLITE_PRIVATE int sqlite3MutexEnd(void);
11741: #endif
11742:
11743: SQLITE_PRIVATE int sqlite3StatusValue(int);
11744: SQLITE_PRIVATE void sqlite3StatusAdd(int, int);
11745: SQLITE_PRIVATE void sqlite3StatusSet(int, int);
11746:
11747: #ifndef SQLITE_OMIT_FLOATING_POINT
11748: SQLITE_PRIVATE int sqlite3IsNaN(double);
11749: #else
11750: # define sqlite3IsNaN(X) 0
11751: #endif
11752:
11753: SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, int, const char*, va_list);
11754: #ifndef SQLITE_OMIT_TRACE
11755: SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, const char*, ...);
11756: #endif
11757: SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...);
11758: SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
11759: SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3*,char*,const char*,...);
11760: #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
11761: SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...);
11762: #endif
11763: #if defined(SQLITE_TEST)
11764: SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*);
11765: #endif
11766:
11767: /* Output formatting for SQLITE_TESTCTRL_EXPLAIN */
11768: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
11769: SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe*);
11770: SQLITE_PRIVATE void sqlite3ExplainPrintf(Vdbe*, const char*, ...);
11771: SQLITE_PRIVATE void sqlite3ExplainNL(Vdbe*);
11772: SQLITE_PRIVATE void sqlite3ExplainPush(Vdbe*);
11773: SQLITE_PRIVATE void sqlite3ExplainPop(Vdbe*);
11774: SQLITE_PRIVATE void sqlite3ExplainFinish(Vdbe*);
11775: SQLITE_PRIVATE void sqlite3ExplainSelect(Vdbe*, Select*);
11776: SQLITE_PRIVATE void sqlite3ExplainExpr(Vdbe*, Expr*);
11777: SQLITE_PRIVATE void sqlite3ExplainExprList(Vdbe*, ExprList*);
11778: SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe*);
11779: #else
11780: # define sqlite3ExplainBegin(X)
11781: # define sqlite3ExplainSelect(A,B)
11782: # define sqlite3ExplainExpr(A,B)
11783: # define sqlite3ExplainExprList(A,B)
11784: # define sqlite3ExplainFinish(X)
11785: # define sqlite3VdbeExplanation(X) 0
11786: #endif
11787:
11788:
11789: SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*, ...);
11790: SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...);
11791: SQLITE_PRIVATE int sqlite3Dequote(char*);
11792: SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int);
11793: SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **);
11794: SQLITE_PRIVATE void sqlite3FinishCoding(Parse*);
11795: SQLITE_PRIVATE int sqlite3GetTempReg(Parse*);
11796: SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int);
11797: SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int);
11798: SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int);
11799: SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*);
11800: SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int);
11801: SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*);
11802: SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*);
11803: SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*);
11804: SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*);
11805: SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*);
11806: SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*);
11807: SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*);
11808: SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
11809: SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
11810: SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*);
11811: SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*);
11812: SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**);
11813: SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**);
11814: SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int);
1.2.2.1 ! misho 11815: SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*);
! 11816: SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int);
! 11817: SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*);
1.2 misho 11818: SQLITE_PRIVATE void sqlite3BeginParse(Parse*,int);
11819: SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*);
11820: SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*);
11821: SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int);
11822: SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int);
11823: SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*);
11824: SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int);
11825: SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
11826: SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*);
11827: SQLITE_PRIVATE void sqlite3AddColumnType(Parse*,Token*);
11828: SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*);
11829: SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*);
11830: SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,Select*);
11831: SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*,
11832: sqlite3_vfs**,char**,char **);
1.2.2.1 ! misho 11833: SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*);
1.2 misho 11834: SQLITE_PRIVATE int sqlite3CodeOnce(Parse *);
11835:
11836: SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32);
11837: SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32);
11838: SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32);
11839: SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*);
11840: SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*);
11841: SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*);
11842: SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*);
11843:
11844: SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
11845: SQLITE_PRIVATE void sqlite3RowSetClear(RowSet*);
11846: SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64);
11847: SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, u8 iBatch, i64);
11848: SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*);
11849:
11850: SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int);
11851:
11852: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
11853: SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*);
11854: #else
11855: # define sqlite3ViewGetColumnNames(A,B) 0
11856: #endif
11857:
11858: SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int);
11859: SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int);
11860: SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*);
11861: #ifndef SQLITE_OMIT_AUTOINCREMENT
11862: SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse);
11863: SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
11864: #else
11865: # define sqlite3AutoincrementBegin(X)
11866: # define sqlite3AutoincrementEnd(X)
11867: #endif
1.2.2.1 ! misho 11868: SQLITE_PRIVATE int sqlite3CodeCoroutine(Parse*, Select*, SelectDest*);
1.2 misho 11869: SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, ExprList*, Select*, IdList*, int);
1.2.2.1 ! misho 11870: SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*);
1.2 misho 11871: SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*);
11872: SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*);
11873: SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int);
11874: SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*);
11875: SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*,
11876: Token*, Select*, Expr*, IdList*);
11877: SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *);
11878: SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, struct SrcList_item *);
11879: SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*);
11880: SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*);
11881: SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*);
11882: SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*);
11883: SQLITE_PRIVATE Index *sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*,
11884: Token*, int, int);
11885: SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int);
11886: SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*);
11887: SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*,
11888: Expr*,ExprList*,int,Expr*,Expr*);
11889: SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*);
11890: SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*);
11891: SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int);
11892: SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int);
11893: #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
11894: SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse *, SrcList *, Expr *, ExprList *, Expr *, Expr *, char *);
11895: #endif
11896: SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
11897: SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
1.2.2.1 ! misho 11898: SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int);
1.2 misho 11899: SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
1.2.2.1 ! misho 11900: SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8);
1.2 misho 11901: SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
11902: SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
11903: SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int);
11904: SQLITE_PRIVATE void sqlite3ExprCachePush(Parse*);
11905: SQLITE_PRIVATE void sqlite3ExprCachePop(Parse*, int);
11906: SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int);
11907: SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*);
11908: SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int);
11909: SQLITE_PRIVATE int sqlite3ExprCode(Parse*, Expr*, int);
11910: SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*);
11911: SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int);
11912: SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse*, Expr*, int);
11913: SQLITE_PRIVATE void sqlite3ExprCodeConstants(Parse*, Expr*);
11914: SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int);
11915: SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse*, Expr*, int, int);
11916: SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse*, Expr*, int, int);
11917: SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*);
11918: SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,int isView,const char*, const char*);
1.2.2.1 ! misho 11919: SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,int isView,struct SrcList_item *);
1.2 misho 11920: SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*);
11921: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*);
11922: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*);
11923: SQLITE_PRIVATE void sqlite3Vacuum(Parse*);
11924: SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*);
11925: SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*);
11926: SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*);
11927: SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*);
11928: SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
11929: SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
1.2.2.1 ! misho 11930: SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr*, SrcList*);
1.2 misho 11931: SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*);
11932: SQLITE_PRIVATE void sqlite3PrngSaveState(void);
11933: SQLITE_PRIVATE void sqlite3PrngRestoreState(void);
11934: SQLITE_PRIVATE void sqlite3PrngResetState(void);
1.2.2.1 ! misho 11935: SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int);
1.2 misho 11936: SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int);
11937: SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb);
11938: SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int);
11939: SQLITE_PRIVATE void sqlite3CommitTransaction(Parse*);
11940: SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse*);
11941: SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*);
11942: SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *);
1.2.2.1 ! misho 11943: SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
1.2 misho 11944: SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*);
11945: SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*);
11946: SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*);
11947: SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*);
11948: SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*);
11949: SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump(Vdbe*, const Expr*, int, int);
11950: SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char);
11951: SQLITE_PRIVATE int sqlite3IsRowid(const char*);
11952: SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*, Table*, int, int, int, Trigger *, int);
11953: SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int*);
11954: SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int);
11955: SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int,int,
11956: int*,int,int,int,int,int*);
11957: SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*, Table*, int, int, int*, int, int, int);
11958: SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, int);
11959: SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int);
11960: SQLITE_PRIVATE void sqlite3MultiWrite(Parse*);
11961: SQLITE_PRIVATE void sqlite3MayAbort(Parse*);
11962: SQLITE_PRIVATE void sqlite3HaltConstraint(Parse*, int, char*, int);
11963: SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3*,Expr*,int);
11964: SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int);
11965: SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int);
11966: SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3*,IdList*);
11967: SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3*,Select*,int);
11968: SQLITE_PRIVATE void sqlite3FuncDefInsert(FuncDefHash*, FuncDef*);
1.2.2.1 ! misho 11969: SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,int,u8,u8);
1.2 misho 11970: SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3*);
11971: SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void);
11972: SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void);
11973: SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*);
11974: SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*);
11975: SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int);
11976:
11977: #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
11978: SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
11979: #endif
11980:
11981: #ifndef SQLITE_OMIT_TRIGGER
11982: SQLITE_PRIVATE void sqlite3BeginTrigger(Parse*, Token*,Token*,int,int,IdList*,SrcList*,
11983: Expr*,int, int);
11984: SQLITE_PRIVATE void sqlite3FinishTrigger(Parse*, TriggerStep*, Token*);
11985: SQLITE_PRIVATE void sqlite3DropTrigger(Parse*, SrcList*, int);
11986: SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse*, Trigger*);
11987: SQLITE_PRIVATE Trigger *sqlite3TriggersExist(Parse *, Table*, int, ExprList*, int *pMask);
11988: SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *, Table *);
11989: SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, int, Table *,
11990: int, int, int);
11991: SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int);
11992: void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*);
11993: SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*);
11994: SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*);
11995: SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*,
11996: ExprList*,Select*,u8);
11997: SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8);
11998: SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*);
11999: SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*);
12000: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
12001: SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int);
12002: # define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p))
12003: #else
12004: # define sqlite3TriggersExist(B,C,D,E,F) 0
12005: # define sqlite3DeleteTrigger(A,B)
12006: # define sqlite3DropTriggerPtr(A,B)
12007: # define sqlite3UnlinkAndDeleteTrigger(A,B,C)
12008: # define sqlite3CodeRowTrigger(A,B,C,D,E,F,G,H,I)
12009: # define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F)
12010: # define sqlite3TriggerList(X, Y) 0
12011: # define sqlite3ParseToplevel(p) p
12012: # define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0
12013: #endif
12014:
12015: SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*);
12016: SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int);
12017: SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int);
12018: #ifndef SQLITE_OMIT_AUTHORIZATION
12019: SQLITE_PRIVATE void sqlite3AuthRead(Parse*,Expr*,Schema*,SrcList*);
12020: SQLITE_PRIVATE int sqlite3AuthCheck(Parse*,int, const char*, const char*, const char*);
12021: SQLITE_PRIVATE void sqlite3AuthContextPush(Parse*, AuthContext*, const char*);
12022: SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext*);
12023: SQLITE_PRIVATE int sqlite3AuthReadCol(Parse*, const char *, const char *, int);
12024: #else
12025: # define sqlite3AuthRead(a,b,c,d)
12026: # define sqlite3AuthCheck(a,b,c,d,e) SQLITE_OK
12027: # define sqlite3AuthContextPush(a,b,c)
12028: # define sqlite3AuthContextPop(a) ((void)(a))
12029: #endif
12030: SQLITE_PRIVATE void sqlite3Attach(Parse*, Expr*, Expr*, Expr*);
12031: SQLITE_PRIVATE void sqlite3Detach(Parse*, Expr*);
12032: SQLITE_PRIVATE int sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*);
12033: SQLITE_PRIVATE int sqlite3FixSrcList(DbFixer*, SrcList*);
12034: SQLITE_PRIVATE int sqlite3FixSelect(DbFixer*, Select*);
12035: SQLITE_PRIVATE int sqlite3FixExpr(DbFixer*, Expr*);
12036: SQLITE_PRIVATE int sqlite3FixExprList(DbFixer*, ExprList*);
12037: SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
12038: SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8);
12039: SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*);
12040: SQLITE_PRIVATE int sqlite3Atoi(const char*);
12041: SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar);
12042: SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte);
1.2.2.1 ! misho 12043: SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**);
1.2 misho 12044:
12045: /*
12046: ** Routines to read and write variable-length integers. These used to
12047: ** be defined locally, but now we use the varint routines in the util.c
12048: ** file. Code should use the MACRO forms below, as the Varint32 versions
12049: ** are coded to assume the single byte case is already handled (which
12050: ** the MACRO form does).
12051: */
12052: SQLITE_PRIVATE int sqlite3PutVarint(unsigned char*, u64);
12053: SQLITE_PRIVATE int sqlite3PutVarint32(unsigned char*, u32);
12054: SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *, u64 *);
12055: SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *, u32 *);
12056: SQLITE_PRIVATE int sqlite3VarintLen(u64 v);
12057:
12058: /*
12059: ** The header of a record consists of a sequence variable-length integers.
12060: ** These integers are almost always small and are encoded as a single byte.
12061: ** The following macros take advantage this fact to provide a fast encode
12062: ** and decode of the integers in a record header. It is faster for the common
12063: ** case where the integer is a single byte. It is a little slower when the
12064: ** integer is two or more bytes. But overall it is faster.
12065: **
12066: ** The following expressions are equivalent:
12067: **
12068: ** x = sqlite3GetVarint32( A, &B );
12069: ** x = sqlite3PutVarint32( A, B );
12070: **
12071: ** x = getVarint32( A, B );
12072: ** x = putVarint32( A, B );
12073: **
12074: */
12075: #define getVarint32(A,B) (u8)((*(A)<(u8)0x80) ? ((B) = (u32)*(A)),1 : sqlite3GetVarint32((A), (u32 *)&(B)))
12076: #define putVarint32(A,B) (u8)(((u32)(B)<(u32)0x80) ? (*(A) = (unsigned char)(B)),1 : sqlite3PutVarint32((A), (B)))
12077: #define getVarint sqlite3GetVarint
12078: #define putVarint sqlite3PutVarint
12079:
12080:
12081: SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *, Index *);
12082: SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *, Table *);
12083: SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2);
12084: SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity);
12085: SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr);
12086: SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8);
12087: SQLITE_PRIVATE void sqlite3Error(sqlite3*, int, const char*,...);
12088: SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n);
12089: SQLITE_PRIVATE u8 sqlite3HexToInt(int h);
12090: SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
12091: SQLITE_PRIVATE const char *sqlite3ErrStr(int);
12092: SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse);
12093: SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int);
12094: SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName);
12095: SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr);
1.2.2.1 ! misho 12096: SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, Token*);
! 12097: SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*);
! 12098: SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*);
1.2 misho 12099: SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *);
12100: SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *, const char *);
12101: SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *, int);
12102: SQLITE_PRIVATE int sqlite3AddInt64(i64*,i64);
12103: SQLITE_PRIVATE int sqlite3SubInt64(i64*,i64);
12104: SQLITE_PRIVATE int sqlite3MulInt64(i64*,i64);
12105: SQLITE_PRIVATE int sqlite3AbsInt32(int);
12106: #ifdef SQLITE_ENABLE_8_3_NAMES
12107: SQLITE_PRIVATE void sqlite3FileSuffix3(const char*, char*);
12108: #else
12109: # define sqlite3FileSuffix3(X,Y)
12110: #endif
1.2.2.1 ! misho 12111: SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,int);
1.2 misho 12112:
12113: SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8);
12114: SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8);
12115: SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8,
12116: void(*)(void*));
12117: SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*);
12118: SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *);
12119: SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8);
12120: #ifdef SQLITE_ENABLE_STAT3
12121: SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *, u8, char *, int, int *);
12122: #endif
12123: SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
12124: SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
12125: #ifndef SQLITE_AMALGAMATION
12126: SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[];
12127: SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[];
12128: SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[];
12129: SQLITE_PRIVATE const Token sqlite3IntTokens[];
12130: SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config;
12131: SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
12132: #ifndef SQLITE_OMIT_WSD
12133: SQLITE_PRIVATE int sqlite3PendingByte;
12134: #endif
12135: #endif
12136: SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int);
12137: SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
12138: SQLITE_PRIVATE void sqlite3AlterFunctions(void);
12139: SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);
12140: SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *);
12141: SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...);
12142: SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*);
12143: SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *, Expr *, int, int);
12144: SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*);
12145: SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*);
12146: SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*);
12147: SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*);
12148: SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int);
12149: SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *);
12150: SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *);
1.2.2.1 ! misho 12151: SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*);
1.2 misho 12152: SQLITE_PRIVATE char sqlite3AffinityType(const char*);
12153: SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*);
12154: SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*);
12155: SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*);
12156: SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *);
12157: SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB);
12158: SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*);
12159: SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*);
12160: SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int);
12161: SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*);
12162: SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse*, int, int);
12163: SQLITE_PRIVATE void sqlite3SchemaClear(void *);
12164: SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *);
12165: SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *);
12166: SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *, Index *);
12167: SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
12168: void (*)(sqlite3_context*,int,sqlite3_value **),
12169: void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*),
12170: FuncDestructor *pDestructor
12171: );
12172: SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int);
12173: SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *);
12174:
12175: SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, char*, int, int);
12176: SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int);
12177: SQLITE_PRIVATE void sqlite3AppendSpace(StrAccum*,int);
12178: SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*);
12179: SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*);
12180: SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int);
12181: SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int);
12182:
12183: SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *);
12184: SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *);
12185:
12186: /*
12187: ** The interface to the LEMON-generated parser
12188: */
12189: SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(size_t));
12190: SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*));
12191: SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*);
12192: #ifdef YYTRACKMAXSTACKDEPTH
12193: SQLITE_PRIVATE int sqlite3ParserStackPeak(void*);
12194: #endif
12195:
12196: SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3*);
12197: #ifndef SQLITE_OMIT_LOAD_EXTENSION
12198: SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3*);
12199: #else
12200: # define sqlite3CloseExtensions(X)
12201: #endif
12202:
12203: #ifndef SQLITE_OMIT_SHARED_CACHE
12204: SQLITE_PRIVATE void sqlite3TableLock(Parse *, int, int, u8, const char *);
12205: #else
12206: #define sqlite3TableLock(v,w,x,y,z)
12207: #endif
12208:
12209: #ifdef SQLITE_TEST
12210: SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*);
12211: #endif
12212:
12213: #ifdef SQLITE_OMIT_VIRTUALTABLE
12214: # define sqlite3VtabClear(Y)
12215: # define sqlite3VtabSync(X,Y) SQLITE_OK
12216: # define sqlite3VtabRollback(X)
12217: # define sqlite3VtabCommit(X)
12218: # define sqlite3VtabInSync(db) 0
12219: # define sqlite3VtabLock(X)
12220: # define sqlite3VtabUnlock(X)
12221: # define sqlite3VtabUnlockList(X)
12222: # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK
12223: # define sqlite3GetVTable(X,Y) ((VTable*)0)
12224: #else
12225: SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table*);
1.2.2.1 ! misho 12226: SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p);
1.2 misho 12227: SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **);
12228: SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db);
12229: SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db);
12230: SQLITE_PRIVATE void sqlite3VtabLock(VTable *);
12231: SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *);
12232: SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*);
12233: SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int);
12234: SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*);
12235: # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
12236: #endif
12237: SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*);
1.2.2.1 ! misho 12238: SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int);
1.2 misho 12239: SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*);
12240: SQLITE_PRIVATE void sqlite3VtabArgInit(Parse*);
12241: SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse*, Token*);
12242: SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
12243: SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
12244: SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
12245: SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
12246: SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
12247: SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**);
12248: SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
12249: SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
12250: SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
12251: SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
12252: SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *);
12253: SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3*);
12254: SQLITE_PRIVATE const char *sqlite3JournalModename(int);
1.2.2.1 ! misho 12255: #ifndef SQLITE_OMIT_WAL
! 12256: SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3*, int, int, int*, int*);
! 12257: SQLITE_PRIVATE int sqlite3WalDefaultHook(void*,sqlite3*,const char*,int);
! 12258: #endif
1.2 misho 12259:
12260: /* Declarations for functions in fkey.c. All of these are replaced by
12261: ** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign
12262: ** key functionality is available. If OMIT_TRIGGER is defined but
12263: ** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In
12264: ** this case foreign keys are parsed, but no other functionality is
12265: ** provided (enforcement of FK constraints requires the triggers sub-system).
12266: */
12267: #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
12268: SQLITE_PRIVATE void sqlite3FkCheck(Parse*, Table*, int, int);
12269: SQLITE_PRIVATE void sqlite3FkDropTable(Parse*, SrcList *, Table*);
12270: SQLITE_PRIVATE void sqlite3FkActions(Parse*, Table*, ExprList*, int);
12271: SQLITE_PRIVATE int sqlite3FkRequired(Parse*, Table*, int*, int);
12272: SQLITE_PRIVATE u32 sqlite3FkOldmask(Parse*, Table*);
12273: SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *);
12274: #else
12275: #define sqlite3FkActions(a,b,c,d)
12276: #define sqlite3FkCheck(a,b,c,d)
12277: #define sqlite3FkDropTable(a,b,c)
12278: #define sqlite3FkOldmask(a,b) 0
12279: #define sqlite3FkRequired(a,b,c,d) 0
12280: #endif
12281: #ifndef SQLITE_OMIT_FOREIGN_KEY
12282: SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*);
12283: #else
12284: #define sqlite3FkDelete(a,b)
12285: #endif
12286:
12287:
12288: /*
12289: ** Available fault injectors. Should be numbered beginning with 0.
12290: */
12291: #define SQLITE_FAULTINJECTOR_MALLOC 0
12292: #define SQLITE_FAULTINJECTOR_COUNT 1
12293:
12294: /*
12295: ** The interface to the code in fault.c used for identifying "benign"
12296: ** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST
12297: ** is not defined.
12298: */
12299: #ifndef SQLITE_OMIT_BUILTIN_TEST
12300: SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void);
12301: SQLITE_PRIVATE void sqlite3EndBenignMalloc(void);
12302: #else
12303: #define sqlite3BeginBenignMalloc()
12304: #define sqlite3EndBenignMalloc()
12305: #endif
12306:
12307: #define IN_INDEX_ROWID 1
12308: #define IN_INDEX_EPH 2
12309: #define IN_INDEX_INDEX 3
12310: SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, int*);
12311:
12312: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
12313: SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
12314: SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *);
12315: SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *);
1.2.2.1 ! misho 12316: SQLITE_PRIVATE int sqlite3JournalExists(sqlite3_file *p);
1.2 misho 12317: #else
12318: #define sqlite3JournalSize(pVfs) ((pVfs)->szOsFile)
1.2.2.1 ! misho 12319: #define sqlite3JournalExists(p) 1
1.2 misho 12320: #endif
12321:
12322: SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *);
12323: SQLITE_PRIVATE int sqlite3MemJournalSize(void);
12324: SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *);
12325:
12326: #if SQLITE_MAX_EXPR_DEPTH>0
12327: SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p);
12328: SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *);
12329: SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int);
12330: #else
12331: #define sqlite3ExprSetHeight(x,y)
12332: #define sqlite3SelectExprHeight(x) 0
12333: #define sqlite3ExprCheckHeight(x,y)
12334: #endif
12335:
12336: SQLITE_PRIVATE u32 sqlite3Get4byte(const u8*);
12337: SQLITE_PRIVATE void sqlite3Put4byte(u8*, u32);
12338:
12339: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
12340: SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *, sqlite3 *);
12341: SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db);
12342: SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db);
12343: #else
12344: #define sqlite3ConnectionBlocked(x,y)
12345: #define sqlite3ConnectionUnlocked(x)
12346: #define sqlite3ConnectionClosed(x)
12347: #endif
12348:
12349: #ifdef SQLITE_DEBUG
12350: SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *);
12351: #endif
12352:
12353: /*
12354: ** If the SQLITE_ENABLE IOTRACE exists then the global variable
12355: ** sqlite3IoTrace is a pointer to a printf-like routine used to
12356: ** print I/O tracing messages.
12357: */
12358: #ifdef SQLITE_ENABLE_IOTRACE
12359: # define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; }
12360: SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe*);
12361: SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*,...);
12362: #else
12363: # define IOTRACE(A)
12364: # define sqlite3VdbeIOTraceSql(X)
12365: #endif
12366:
12367: /*
12368: ** These routines are available for the mem2.c debugging memory allocator
12369: ** only. They are used to verify that different "types" of memory
12370: ** allocations are properly tracked by the system.
12371: **
12372: ** sqlite3MemdebugSetType() sets the "type" of an allocation to one of
12373: ** the MEMTYPE_* macros defined below. The type must be a bitmask with
12374: ** a single bit set.
12375: **
12376: ** sqlite3MemdebugHasType() returns true if any of the bits in its second
12377: ** argument match the type set by the previous sqlite3MemdebugSetType().
12378: ** sqlite3MemdebugHasType() is intended for use inside assert() statements.
12379: **
12380: ** sqlite3MemdebugNoType() returns true if none of the bits in its second
12381: ** argument match the type set by the previous sqlite3MemdebugSetType().
12382: **
12383: ** Perhaps the most important point is the difference between MEMTYPE_HEAP
12384: ** and MEMTYPE_LOOKASIDE. If an allocation is MEMTYPE_LOOKASIDE, that means
12385: ** it might have been allocated by lookaside, except the allocation was
12386: ** too large or lookaside was already full. It is important to verify
12387: ** that allocations that might have been satisfied by lookaside are not
12388: ** passed back to non-lookaside free() routines. Asserts such as the
12389: ** example above are placed on the non-lookaside free() routines to verify
12390: ** this constraint.
12391: **
12392: ** All of this is no-op for a production build. It only comes into
12393: ** play when the SQLITE_MEMDEBUG compile-time option is used.
12394: */
12395: #ifdef SQLITE_MEMDEBUG
12396: SQLITE_PRIVATE void sqlite3MemdebugSetType(void*,u8);
12397: SQLITE_PRIVATE int sqlite3MemdebugHasType(void*,u8);
12398: SQLITE_PRIVATE int sqlite3MemdebugNoType(void*,u8);
12399: #else
12400: # define sqlite3MemdebugSetType(X,Y) /* no-op */
12401: # define sqlite3MemdebugHasType(X,Y) 1
12402: # define sqlite3MemdebugNoType(X,Y) 1
12403: #endif
12404: #define MEMTYPE_HEAP 0x01 /* General heap allocations */
12405: #define MEMTYPE_LOOKASIDE 0x02 /* Might have been lookaside memory */
12406: #define MEMTYPE_SCRATCH 0x04 /* Scratch allocations */
12407: #define MEMTYPE_PCACHE 0x08 /* Page cache allocations */
12408: #define MEMTYPE_DB 0x10 /* Uses sqlite3DbMalloc, not sqlite_malloc */
12409:
12410: #endif /* _SQLITEINT_H_ */
12411:
12412: /************** End of sqliteInt.h *******************************************/
12413: /************** Begin file global.c ******************************************/
12414: /*
12415: ** 2008 June 13
12416: **
12417: ** The author disclaims copyright to this source code. In place of
12418: ** a legal notice, here is a blessing:
12419: **
12420: ** May you do good and not evil.
12421: ** May you find forgiveness for yourself and forgive others.
12422: ** May you share freely, never taking more than you give.
12423: **
12424: *************************************************************************
12425: **
12426: ** This file contains definitions of global variables and contants.
12427: */
12428:
12429: /* An array to map all upper-case characters into their corresponding
12430: ** lower-case character.
12431: **
12432: ** SQLite only considers US-ASCII (or EBCDIC) characters. We do not
12433: ** handle case conversions for the UTF character set since the tables
12434: ** involved are nearly as big or bigger than SQLite itself.
12435: */
12436: SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = {
12437: #ifdef SQLITE_ASCII
12438: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
12439: 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
12440: 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
12441: 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
12442: 104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
12443: 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
12444: 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
12445: 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
12446: 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
12447: 162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
12448: 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
12449: 198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
12450: 216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
12451: 234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
12452: 252,253,254,255
12453: #endif
12454: #ifdef SQLITE_EBCDIC
12455: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* 0x */
12456: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */
12457: 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */
12458: 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */
12459: 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */
12460: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */
12461: 96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */
12462: 112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */
12463: 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */
12464: 144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */
12465: 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */
12466: 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */
12467: 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */
12468: 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */
12469: 224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */
12470: 239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */
12471: #endif
12472: };
12473:
12474: /*
12475: ** The following 256 byte lookup table is used to support SQLites built-in
12476: ** equivalents to the following standard library functions:
12477: **
12478: ** isspace() 0x01
12479: ** isalpha() 0x02
12480: ** isdigit() 0x04
12481: ** isalnum() 0x06
12482: ** isxdigit() 0x08
12483: ** toupper() 0x20
12484: ** SQLite identifier character 0x40
12485: **
12486: ** Bit 0x20 is set if the mapped character requires translation to upper
12487: ** case. i.e. if the character is a lower-case ASCII character.
12488: ** If x is a lower-case ASCII character, then its upper-case equivalent
12489: ** is (x - 0x20). Therefore toupper() can be implemented as:
12490: **
12491: ** (x & ~(map[x]&0x20))
12492: **
12493: ** Standard function tolower() is implemented using the sqlite3UpperToLower[]
12494: ** array. tolower() is used more often than toupper() by SQLite.
12495: **
12496: ** Bit 0x40 is set if the character non-alphanumeric and can be used in an
12497: ** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any
12498: ** non-ASCII UTF character. Hence the test for whether or not a character is
12499: ** part of an identifier is 0x46.
12500: **
12501: ** SQLite's versions are identical to the standard versions assuming a
12502: ** locale of "C". They are implemented as macros in sqliteInt.h.
12503: */
12504: #ifdef SQLITE_ASCII
12505: SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = {
12506: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00..07 ........ */
12507: 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */
12508: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */
12509: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */
12510: 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, /* 20..27 !"#$%&' */
12511: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */
12512: 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */
12513: 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */
12514:
12515: 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */
12516: 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */
12517: 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */
12518: 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */
12519: 0x00, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */
12520: 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */
12521: 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */
12522: 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */
12523:
12524: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 80..87 ........ */
12525: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 88..8f ........ */
12526: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 90..97 ........ */
12527: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* 98..9f ........ */
12528: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a0..a7 ........ */
12529: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* a8..af ........ */
12530: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b0..b7 ........ */
12531: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* b8..bf ........ */
12532:
12533: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c0..c7 ........ */
12534: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* c8..cf ........ */
12535: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d0..d7 ........ */
12536: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* d8..df ........ */
12537: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e0..e7 ........ */
12538: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* e8..ef ........ */
12539: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, /* f0..f7 ........ */
12540: 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40 /* f8..ff ........ */
12541: };
12542: #endif
12543:
12544: #ifndef SQLITE_USE_URI
12545: # define SQLITE_USE_URI 0
12546: #endif
12547:
1.2.2.1 ! misho 12548: #ifndef SQLITE_ALLOW_COVERING_INDEX_SCAN
! 12549: # define SQLITE_ALLOW_COVERING_INDEX_SCAN 1
! 12550: #endif
! 12551:
1.2 misho 12552: /*
12553: ** The following singleton contains the global configuration for
12554: ** the SQLite library.
12555: */
12556: SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = {
12557: SQLITE_DEFAULT_MEMSTATUS, /* bMemstat */
12558: 1, /* bCoreMutex */
12559: SQLITE_THREADSAFE==1, /* bFullMutex */
12560: SQLITE_USE_URI, /* bOpenUri */
1.2.2.1 ! misho 12561: SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */
1.2 misho 12562: 0x7ffffffe, /* mxStrlen */
12563: 128, /* szLookaside */
12564: 500, /* nLookaside */
12565: {0,0,0,0,0,0,0,0}, /* m */
12566: {0,0,0,0,0,0,0,0,0}, /* mutex */
12567: {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */
12568: (void*)0, /* pHeap */
12569: 0, /* nHeap */
12570: 0, 0, /* mnHeap, mxHeap */
12571: (void*)0, /* pScratch */
12572: 0, /* szScratch */
12573: 0, /* nScratch */
12574: (void*)0, /* pPage */
12575: 0, /* szPage */
12576: 0, /* nPage */
12577: 0, /* mxParserStack */
12578: 0, /* sharedCacheEnabled */
12579: /* All the rest should always be initialized to zero */
12580: 0, /* isInit */
12581: 0, /* inProgress */
12582: 0, /* isMutexInit */
12583: 0, /* isMallocInit */
12584: 0, /* isPCacheInit */
12585: 0, /* pInitMutex */
12586: 0, /* nRefInitMutex */
12587: 0, /* xLog */
12588: 0, /* pLogArg */
12589: 0, /* bLocaltimeFault */
1.2.2.1 ! misho 12590: #ifdef SQLITE_ENABLE_SQLLOG
! 12591: 0, /* xSqllog */
! 12592: 0 /* pSqllogArg */
! 12593: #endif
1.2 misho 12594: };
12595:
12596:
12597: /*
12598: ** Hash table for global functions - functions common to all
12599: ** database connections. After initialization, this table is
12600: ** read-only.
12601: */
12602: SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
12603:
12604: /*
12605: ** Constant tokens for values 0 and 1.
12606: */
12607: SQLITE_PRIVATE const Token sqlite3IntTokens[] = {
12608: { "0", 1 },
12609: { "1", 1 }
12610: };
12611:
12612:
12613: /*
12614: ** The value of the "pending" byte must be 0x40000000 (1 byte past the
12615: ** 1-gibabyte boundary) in a compatible database. SQLite never uses
12616: ** the database page that contains the pending byte. It never attempts
12617: ** to read or write that page. The pending byte page is set assign
12618: ** for use by the VFS layers as space for managing file locks.
12619: **
12620: ** During testing, it is often desirable to move the pending byte to
12621: ** a different position in the file. This allows code that has to
12622: ** deal with the pending byte to run on files that are much smaller
12623: ** than 1 GiB. The sqlite3_test_control() interface can be used to
12624: ** move the pending byte.
12625: **
12626: ** IMPORTANT: Changing the pending byte to any value other than
12627: ** 0x40000000 results in an incompatible database file format!
12628: ** Changing the pending byte during operating results in undefined
12629: ** and dileterious behavior.
12630: */
12631: #ifndef SQLITE_OMIT_WSD
12632: SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000;
12633: #endif
12634:
12635: /*
12636: ** Properties of opcodes. The OPFLG_INITIALIZER macro is
12637: ** created by mkopcodeh.awk during compilation. Data is obtained
12638: ** from the comments following the "case OP_xxxx:" statements in
12639: ** the vdbe.c file.
12640: */
12641: SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER;
12642:
12643: /************** End of global.c **********************************************/
12644: /************** Begin file ctime.c *******************************************/
12645: /*
12646: ** 2010 February 23
12647: **
12648: ** The author disclaims copyright to this source code. In place of
12649: ** a legal notice, here is a blessing:
12650: **
12651: ** May you do good and not evil.
12652: ** May you find forgiveness for yourself and forgive others.
12653: ** May you share freely, never taking more than you give.
12654: **
12655: *************************************************************************
12656: **
12657: ** This file implements routines used to report what compile-time options
12658: ** SQLite was built with.
12659: */
12660:
12661: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
12662:
12663:
12664: /*
12665: ** An array of names of all compile-time options. This array should
12666: ** be sorted A-Z.
12667: **
12668: ** This array looks large, but in a typical installation actually uses
12669: ** only a handful of compile-time options, so most times this array is usually
12670: ** rather short and uses little memory space.
12671: */
12672: static const char * const azCompileOpt[] = {
12673:
12674: /* These macros are provided to "stringify" the value of the define
12675: ** for those options in which the value is meaningful. */
12676: #define CTIMEOPT_VAL_(opt) #opt
12677: #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
12678:
12679: #ifdef SQLITE_32BIT_ROWID
12680: "32BIT_ROWID",
12681: #endif
12682: #ifdef SQLITE_4_BYTE_ALIGNED_MALLOC
12683: "4_BYTE_ALIGNED_MALLOC",
12684: #endif
12685: #ifdef SQLITE_CASE_SENSITIVE_LIKE
12686: "CASE_SENSITIVE_LIKE",
12687: #endif
12688: #ifdef SQLITE_CHECK_PAGES
12689: "CHECK_PAGES",
12690: #endif
12691: #ifdef SQLITE_COVERAGE_TEST
12692: "COVERAGE_TEST",
12693: #endif
1.2.2.1 ! misho 12694: #ifdef SQLITE_CURDIR
! 12695: "CURDIR",
! 12696: #endif
1.2 misho 12697: #ifdef SQLITE_DEBUG
12698: "DEBUG",
12699: #endif
12700: #ifdef SQLITE_DEFAULT_LOCKING_MODE
12701: "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE),
12702: #endif
12703: #ifdef SQLITE_DISABLE_DIRSYNC
12704: "DISABLE_DIRSYNC",
12705: #endif
12706: #ifdef SQLITE_DISABLE_LFS
12707: "DISABLE_LFS",
12708: #endif
12709: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
12710: "ENABLE_ATOMIC_WRITE",
12711: #endif
12712: #ifdef SQLITE_ENABLE_CEROD
12713: "ENABLE_CEROD",
12714: #endif
12715: #ifdef SQLITE_ENABLE_COLUMN_METADATA
12716: "ENABLE_COLUMN_METADATA",
12717: #endif
12718: #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
12719: "ENABLE_EXPENSIVE_ASSERT",
12720: #endif
12721: #ifdef SQLITE_ENABLE_FTS1
12722: "ENABLE_FTS1",
12723: #endif
12724: #ifdef SQLITE_ENABLE_FTS2
12725: "ENABLE_FTS2",
12726: #endif
12727: #ifdef SQLITE_ENABLE_FTS3
12728: "ENABLE_FTS3",
12729: #endif
12730: #ifdef SQLITE_ENABLE_FTS3_PARENTHESIS
12731: "ENABLE_FTS3_PARENTHESIS",
12732: #endif
12733: #ifdef SQLITE_ENABLE_FTS4
12734: "ENABLE_FTS4",
12735: #endif
12736: #ifdef SQLITE_ENABLE_ICU
12737: "ENABLE_ICU",
12738: #endif
12739: #ifdef SQLITE_ENABLE_IOTRACE
12740: "ENABLE_IOTRACE",
12741: #endif
12742: #ifdef SQLITE_ENABLE_LOAD_EXTENSION
12743: "ENABLE_LOAD_EXTENSION",
12744: #endif
12745: #ifdef SQLITE_ENABLE_LOCKING_STYLE
12746: "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE),
12747: #endif
12748: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
12749: "ENABLE_MEMORY_MANAGEMENT",
12750: #endif
12751: #ifdef SQLITE_ENABLE_MEMSYS3
12752: "ENABLE_MEMSYS3",
12753: #endif
12754: #ifdef SQLITE_ENABLE_MEMSYS5
12755: "ENABLE_MEMSYS5",
12756: #endif
12757: #ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK
12758: "ENABLE_OVERSIZE_CELL_CHECK",
12759: #endif
12760: #ifdef SQLITE_ENABLE_RTREE
12761: "ENABLE_RTREE",
12762: #endif
12763: #ifdef SQLITE_ENABLE_STAT3
12764: "ENABLE_STAT3",
12765: #endif
12766: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
12767: "ENABLE_UNLOCK_NOTIFY",
12768: #endif
12769: #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
12770: "ENABLE_UPDATE_DELETE_LIMIT",
12771: #endif
12772: #ifdef SQLITE_HAS_CODEC
12773: "HAS_CODEC",
12774: #endif
12775: #ifdef SQLITE_HAVE_ISNAN
12776: "HAVE_ISNAN",
12777: #endif
12778: #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
12779: "HOMEGROWN_RECURSIVE_MUTEX",
12780: #endif
12781: #ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
12782: "IGNORE_AFP_LOCK_ERRORS",
12783: #endif
12784: #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
12785: "IGNORE_FLOCK_LOCK_ERRORS",
12786: #endif
12787: #ifdef SQLITE_INT64_TYPE
12788: "INT64_TYPE",
12789: #endif
12790: #ifdef SQLITE_LOCK_TRACE
12791: "LOCK_TRACE",
12792: #endif
12793: #ifdef SQLITE_MAX_SCHEMA_RETRY
12794: "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY),
12795: #endif
12796: #ifdef SQLITE_MEMDEBUG
12797: "MEMDEBUG",
12798: #endif
12799: #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
12800: "MIXED_ENDIAN_64BIT_FLOAT",
12801: #endif
12802: #ifdef SQLITE_NO_SYNC
12803: "NO_SYNC",
12804: #endif
12805: #ifdef SQLITE_OMIT_ALTERTABLE
12806: "OMIT_ALTERTABLE",
12807: #endif
12808: #ifdef SQLITE_OMIT_ANALYZE
12809: "OMIT_ANALYZE",
12810: #endif
12811: #ifdef SQLITE_OMIT_ATTACH
12812: "OMIT_ATTACH",
12813: #endif
12814: #ifdef SQLITE_OMIT_AUTHORIZATION
12815: "OMIT_AUTHORIZATION",
12816: #endif
12817: #ifdef SQLITE_OMIT_AUTOINCREMENT
12818: "OMIT_AUTOINCREMENT",
12819: #endif
12820: #ifdef SQLITE_OMIT_AUTOINIT
12821: "OMIT_AUTOINIT",
12822: #endif
12823: #ifdef SQLITE_OMIT_AUTOMATIC_INDEX
12824: "OMIT_AUTOMATIC_INDEX",
12825: #endif
12826: #ifdef SQLITE_OMIT_AUTORESET
12827: "OMIT_AUTORESET",
12828: #endif
12829: #ifdef SQLITE_OMIT_AUTOVACUUM
12830: "OMIT_AUTOVACUUM",
12831: #endif
12832: #ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION
12833: "OMIT_BETWEEN_OPTIMIZATION",
12834: #endif
12835: #ifdef SQLITE_OMIT_BLOB_LITERAL
12836: "OMIT_BLOB_LITERAL",
12837: #endif
12838: #ifdef SQLITE_OMIT_BTREECOUNT
12839: "OMIT_BTREECOUNT",
12840: #endif
12841: #ifdef SQLITE_OMIT_BUILTIN_TEST
12842: "OMIT_BUILTIN_TEST",
12843: #endif
12844: #ifdef SQLITE_OMIT_CAST
12845: "OMIT_CAST",
12846: #endif
12847: #ifdef SQLITE_OMIT_CHECK
12848: "OMIT_CHECK",
12849: #endif
12850: /* // redundant
12851: ** #ifdef SQLITE_OMIT_COMPILEOPTION_DIAGS
12852: ** "OMIT_COMPILEOPTION_DIAGS",
12853: ** #endif
12854: */
12855: #ifdef SQLITE_OMIT_COMPLETE
12856: "OMIT_COMPLETE",
12857: #endif
12858: #ifdef SQLITE_OMIT_COMPOUND_SELECT
12859: "OMIT_COMPOUND_SELECT",
12860: #endif
12861: #ifdef SQLITE_OMIT_DATETIME_FUNCS
12862: "OMIT_DATETIME_FUNCS",
12863: #endif
12864: #ifdef SQLITE_OMIT_DECLTYPE
12865: "OMIT_DECLTYPE",
12866: #endif
12867: #ifdef SQLITE_OMIT_DEPRECATED
12868: "OMIT_DEPRECATED",
12869: #endif
12870: #ifdef SQLITE_OMIT_DISKIO
12871: "OMIT_DISKIO",
12872: #endif
12873: #ifdef SQLITE_OMIT_EXPLAIN
12874: "OMIT_EXPLAIN",
12875: #endif
12876: #ifdef SQLITE_OMIT_FLAG_PRAGMAS
12877: "OMIT_FLAG_PRAGMAS",
12878: #endif
12879: #ifdef SQLITE_OMIT_FLOATING_POINT
12880: "OMIT_FLOATING_POINT",
12881: #endif
12882: #ifdef SQLITE_OMIT_FOREIGN_KEY
12883: "OMIT_FOREIGN_KEY",
12884: #endif
12885: #ifdef SQLITE_OMIT_GET_TABLE
12886: "OMIT_GET_TABLE",
12887: #endif
12888: #ifdef SQLITE_OMIT_INCRBLOB
12889: "OMIT_INCRBLOB",
12890: #endif
12891: #ifdef SQLITE_OMIT_INTEGRITY_CHECK
12892: "OMIT_INTEGRITY_CHECK",
12893: #endif
12894: #ifdef SQLITE_OMIT_LIKE_OPTIMIZATION
12895: "OMIT_LIKE_OPTIMIZATION",
12896: #endif
12897: #ifdef SQLITE_OMIT_LOAD_EXTENSION
12898: "OMIT_LOAD_EXTENSION",
12899: #endif
12900: #ifdef SQLITE_OMIT_LOCALTIME
12901: "OMIT_LOCALTIME",
12902: #endif
12903: #ifdef SQLITE_OMIT_LOOKASIDE
12904: "OMIT_LOOKASIDE",
12905: #endif
12906: #ifdef SQLITE_OMIT_MEMORYDB
12907: "OMIT_MEMORYDB",
12908: #endif
12909: #ifdef SQLITE_OMIT_MERGE_SORT
12910: "OMIT_MERGE_SORT",
12911: #endif
12912: #ifdef SQLITE_OMIT_OR_OPTIMIZATION
12913: "OMIT_OR_OPTIMIZATION",
12914: #endif
12915: #ifdef SQLITE_OMIT_PAGER_PRAGMAS
12916: "OMIT_PAGER_PRAGMAS",
12917: #endif
12918: #ifdef SQLITE_OMIT_PRAGMA
12919: "OMIT_PRAGMA",
12920: #endif
12921: #ifdef SQLITE_OMIT_PROGRESS_CALLBACK
12922: "OMIT_PROGRESS_CALLBACK",
12923: #endif
12924: #ifdef SQLITE_OMIT_QUICKBALANCE
12925: "OMIT_QUICKBALANCE",
12926: #endif
12927: #ifdef SQLITE_OMIT_REINDEX
12928: "OMIT_REINDEX",
12929: #endif
12930: #ifdef SQLITE_OMIT_SCHEMA_PRAGMAS
12931: "OMIT_SCHEMA_PRAGMAS",
12932: #endif
12933: #ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
12934: "OMIT_SCHEMA_VERSION_PRAGMAS",
12935: #endif
12936: #ifdef SQLITE_OMIT_SHARED_CACHE
12937: "OMIT_SHARED_CACHE",
12938: #endif
12939: #ifdef SQLITE_OMIT_SUBQUERY
12940: "OMIT_SUBQUERY",
12941: #endif
12942: #ifdef SQLITE_OMIT_TCL_VARIABLE
12943: "OMIT_TCL_VARIABLE",
12944: #endif
12945: #ifdef SQLITE_OMIT_TEMPDB
12946: "OMIT_TEMPDB",
12947: #endif
12948: #ifdef SQLITE_OMIT_TRACE
12949: "OMIT_TRACE",
12950: #endif
12951: #ifdef SQLITE_OMIT_TRIGGER
12952: "OMIT_TRIGGER",
12953: #endif
12954: #ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
12955: "OMIT_TRUNCATE_OPTIMIZATION",
12956: #endif
12957: #ifdef SQLITE_OMIT_UTF16
12958: "OMIT_UTF16",
12959: #endif
12960: #ifdef SQLITE_OMIT_VACUUM
12961: "OMIT_VACUUM",
12962: #endif
12963: #ifdef SQLITE_OMIT_VIEW
12964: "OMIT_VIEW",
12965: #endif
12966: #ifdef SQLITE_OMIT_VIRTUALTABLE
12967: "OMIT_VIRTUALTABLE",
12968: #endif
12969: #ifdef SQLITE_OMIT_WAL
12970: "OMIT_WAL",
12971: #endif
12972: #ifdef SQLITE_OMIT_WSD
12973: "OMIT_WSD",
12974: #endif
12975: #ifdef SQLITE_OMIT_XFER_OPT
12976: "OMIT_XFER_OPT",
12977: #endif
12978: #ifdef SQLITE_PERFORMANCE_TRACE
12979: "PERFORMANCE_TRACE",
12980: #endif
12981: #ifdef SQLITE_PROXY_DEBUG
12982: "PROXY_DEBUG",
12983: #endif
1.2.2.1 ! misho 12984: #ifdef SQLITE_RTREE_INT_ONLY
! 12985: "RTREE_INT_ONLY",
! 12986: #endif
1.2 misho 12987: #ifdef SQLITE_SECURE_DELETE
12988: "SECURE_DELETE",
12989: #endif
12990: #ifdef SQLITE_SMALL_STACK
12991: "SMALL_STACK",
12992: #endif
12993: #ifdef SQLITE_SOUNDEX
12994: "SOUNDEX",
12995: #endif
12996: #ifdef SQLITE_TCL
12997: "TCL",
12998: #endif
12999: #ifdef SQLITE_TEMP_STORE
13000: "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE),
13001: #endif
13002: #ifdef SQLITE_TEST
13003: "TEST",
13004: #endif
13005: #ifdef SQLITE_THREADSAFE
13006: "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE),
13007: #endif
13008: #ifdef SQLITE_USE_ALLOCA
13009: "USE_ALLOCA",
13010: #endif
13011: #ifdef SQLITE_ZERO_MALLOC
13012: "ZERO_MALLOC"
13013: #endif
13014: };
13015:
13016: /*
13017: ** Given the name of a compile-time option, return true if that option
13018: ** was used and false if not.
13019: **
13020: ** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix
13021: ** is not required for a match.
13022: */
13023: SQLITE_API int sqlite3_compileoption_used(const char *zOptName){
13024: int i, n;
13025: if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7;
13026: n = sqlite3Strlen30(zOptName);
13027:
13028: /* Since ArraySize(azCompileOpt) is normally in single digits, a
13029: ** linear search is adequate. No need for a binary search. */
13030: for(i=0; i<ArraySize(azCompileOpt); i++){
13031: if( (sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0)
13032: && ( (azCompileOpt[i][n]==0) || (azCompileOpt[i][n]=='=') ) ) return 1;
13033: }
13034: return 0;
13035: }
13036:
13037: /*
13038: ** Return the N-th compile-time option string. If N is out of range,
13039: ** return a NULL pointer.
13040: */
13041: SQLITE_API const char *sqlite3_compileoption_get(int N){
13042: if( N>=0 && N<ArraySize(azCompileOpt) ){
13043: return azCompileOpt[N];
13044: }
13045: return 0;
13046: }
13047:
13048: #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
13049:
13050: /************** End of ctime.c ***********************************************/
13051: /************** Begin file status.c ******************************************/
13052: /*
13053: ** 2008 June 18
13054: **
13055: ** The author disclaims copyright to this source code. In place of
13056: ** a legal notice, here is a blessing:
13057: **
13058: ** May you do good and not evil.
13059: ** May you find forgiveness for yourself and forgive others.
13060: ** May you share freely, never taking more than you give.
13061: **
13062: *************************************************************************
13063: **
13064: ** This module implements the sqlite3_status() interface and related
13065: ** functionality.
13066: */
13067: /************** Include vdbeInt.h in the middle of status.c ******************/
13068: /************** Begin file vdbeInt.h *****************************************/
13069: /*
13070: ** 2003 September 6
13071: **
13072: ** The author disclaims copyright to this source code. In place of
13073: ** a legal notice, here is a blessing:
13074: **
13075: ** May you do good and not evil.
13076: ** May you find forgiveness for yourself and forgive others.
13077: ** May you share freely, never taking more than you give.
13078: **
13079: *************************************************************************
13080: ** This is the header file for information that is private to the
13081: ** VDBE. This information used to all be at the top of the single
13082: ** source code file "vdbe.c". When that file became too big (over
13083: ** 6000 lines long) it was split up into several smaller files and
13084: ** this header information was factored out.
13085: */
13086: #ifndef _VDBEINT_H_
13087: #define _VDBEINT_H_
13088:
13089: /*
13090: ** SQL is translated into a sequence of instructions to be
13091: ** executed by a virtual machine. Each instruction is an instance
13092: ** of the following structure.
13093: */
13094: typedef struct VdbeOp Op;
13095:
13096: /*
13097: ** Boolean values
13098: */
13099: typedef unsigned char Bool;
13100:
13101: /* Opaque type used by code in vdbesort.c */
13102: typedef struct VdbeSorter VdbeSorter;
13103:
13104: /* Opaque type used by the explainer */
13105: typedef struct Explain Explain;
13106:
13107: /*
13108: ** A cursor is a pointer into a single BTree within a database file.
13109: ** The cursor can seek to a BTree entry with a particular key, or
13110: ** loop over all entries of the Btree. You can also insert new BTree
13111: ** entries or retrieve the key or data from the entry that the cursor
13112: ** is currently pointing to.
13113: **
13114: ** Every cursor that the virtual machine has open is represented by an
13115: ** instance of the following structure.
13116: */
13117: struct VdbeCursor {
13118: BtCursor *pCursor; /* The cursor structure of the backend */
13119: Btree *pBt; /* Separate file holding temporary table */
13120: KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */
13121: int iDb; /* Index of cursor database in db->aDb[] (or -1) */
13122: int pseudoTableReg; /* Register holding pseudotable content. */
13123: int nField; /* Number of fields in the header */
13124: Bool zeroed; /* True if zeroed out and ready for reuse */
13125: Bool rowidIsValid; /* True if lastRowid is valid */
13126: Bool atFirst; /* True if pointing to first entry */
13127: Bool useRandomRowid; /* Generate new record numbers semi-randomly */
13128: Bool nullRow; /* True if pointing to a row with no data */
13129: Bool deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */
13130: Bool isTable; /* True if a table requiring integer keys */
13131: Bool isIndex; /* True if an index containing keys only - no data */
13132: Bool isOrdered; /* True if the underlying table is BTREE_UNORDERED */
13133: Bool isSorter; /* True if a new-style sorter */
1.2.2.1 ! misho 13134: Bool multiPseudo; /* Multi-register pseudo-cursor */
1.2 misho 13135: sqlite3_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */
13136: const sqlite3_module *pModule; /* Module for cursor pVtabCursor */
13137: i64 seqCount; /* Sequence counter */
13138: i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */
13139: i64 lastRowid; /* Last rowid from a Next or NextIdx operation */
13140: VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */
13141:
13142: /* Result of last sqlite3BtreeMoveto() done by an OP_NotExists or
13143: ** OP_IsUnique opcode on this cursor. */
13144: int seekResult;
13145:
13146: /* Cached information about the header for the data record that the
13147: ** cursor is currently pointing to. Only valid if cacheStatus matches
13148: ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of
13149: ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that
13150: ** the cache is out of date.
13151: **
13152: ** aRow might point to (ephemeral) data for the current row, or it might
13153: ** be NULL.
13154: */
13155: u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */
13156: int payloadSize; /* Total number of bytes in the record */
13157: u32 *aType; /* Type values for all entries in the record */
13158: u32 *aOffset; /* Cached offsets to the start of each columns data */
13159: u8 *aRow; /* Data for the current row, if all on one page */
13160: };
13161: typedef struct VdbeCursor VdbeCursor;
13162:
13163: /*
13164: ** When a sub-program is executed (OP_Program), a structure of this type
13165: ** is allocated to store the current value of the program counter, as
13166: ** well as the current memory cell array and various other frame specific
13167: ** values stored in the Vdbe struct. When the sub-program is finished,
13168: ** these values are copied back to the Vdbe from the VdbeFrame structure,
13169: ** restoring the state of the VM to as it was before the sub-program
13170: ** began executing.
13171: **
13172: ** The memory for a VdbeFrame object is allocated and managed by a memory
13173: ** cell in the parent (calling) frame. When the memory cell is deleted or
13174: ** overwritten, the VdbeFrame object is not freed immediately. Instead, it
13175: ** is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame
13176: ** list is deleted when the VM is reset in VdbeHalt(). The reason for doing
13177: ** this instead of deleting the VdbeFrame immediately is to avoid recursive
13178: ** calls to sqlite3VdbeMemRelease() when the memory cells belonging to the
13179: ** child frame are released.
13180: **
13181: ** The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is
13182: ** set to NULL if the currently executing frame is the main program.
13183: */
13184: typedef struct VdbeFrame VdbeFrame;
13185: struct VdbeFrame {
13186: Vdbe *v; /* VM this frame belongs to */
1.2.2.1 ! misho 13187: VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */
1.2 misho 13188: Op *aOp; /* Program instructions for parent frame */
13189: Mem *aMem; /* Array of memory cells for parent frame */
13190: u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */
13191: VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */
13192: void *token; /* Copy of SubProgram.token */
1.2.2.1 ! misho 13193: i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */
! 13194: u16 nCursor; /* Number of entries in apCsr */
! 13195: int pc; /* Program Counter in parent (calling) frame */
! 13196: int nOp; /* Size of aOp array */
! 13197: int nMem; /* Number of entries in aMem */
! 13198: int nOnceFlag; /* Number of entries in aOnceFlag */
1.2 misho 13199: int nChildMem; /* Number of memory cells for child frame */
13200: int nChildCsr; /* Number of cursors for child frame */
13201: int nChange; /* Statement changes (Vdbe.nChanges) */
13202: };
13203:
13204: #define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
13205:
13206: /*
13207: ** A value for VdbeCursor.cacheValid that means the cache is always invalid.
13208: */
13209: #define CACHE_STALE 0
13210:
13211: /*
13212: ** Internally, the vdbe manipulates nearly all SQL values as Mem
13213: ** structures. Each Mem struct may cache multiple representations (string,
13214: ** integer etc.) of the same value.
13215: */
13216: struct Mem {
13217: sqlite3 *db; /* The associated database connection */
13218: char *z; /* String or BLOB value */
13219: double r; /* Real value */
13220: union {
13221: i64 i; /* Integer value used when MEM_Int is set in flags */
13222: int nZero; /* Used when bit MEM_Zero is set in flags */
13223: FuncDef *pDef; /* Used only when flags==MEM_Agg */
13224: RowSet *pRowSet; /* Used only when flags==MEM_RowSet */
13225: VdbeFrame *pFrame; /* Used when flags==MEM_Frame */
13226: } u;
13227: int n; /* Number of characters in string value, excluding '\0' */
13228: u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
13229: u8 type; /* One of SQLITE_NULL, SQLITE_TEXT, SQLITE_INTEGER, etc */
13230: u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
13231: #ifdef SQLITE_DEBUG
13232: Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */
13233: void *pFiller; /* So that sizeof(Mem) is a multiple of 8 */
13234: #endif
13235: void (*xDel)(void *); /* If not null, call this function to delete Mem.z */
13236: char *zMalloc; /* Dynamic buffer allocated by sqlite3_malloc() */
13237: };
13238:
13239: /* One or more of the following flags are set to indicate the validOK
13240: ** representations of the value stored in the Mem struct.
13241: **
13242: ** If the MEM_Null flag is set, then the value is an SQL NULL value.
13243: ** No other flags may be set in this case.
13244: **
13245: ** If the MEM_Str flag is set then Mem.z points at a string representation.
13246: ** Usually this is encoded in the same unicode encoding as the main
13247: ** database (see below for exceptions). If the MEM_Term flag is also
13248: ** set, then the string is nul terminated. The MEM_Int and MEM_Real
13249: ** flags may coexist with the MEM_Str flag.
13250: */
13251: #define MEM_Null 0x0001 /* Value is NULL */
13252: #define MEM_Str 0x0002 /* Value is a string */
13253: #define MEM_Int 0x0004 /* Value is an integer */
13254: #define MEM_Real 0x0008 /* Value is a real number */
13255: #define MEM_Blob 0x0010 /* Value is a BLOB */
13256: #define MEM_RowSet 0x0020 /* Value is a RowSet object */
13257: #define MEM_Frame 0x0040 /* Value is a VdbeFrame object */
13258: #define MEM_Invalid 0x0080 /* Value is undefined */
1.2.2.1 ! misho 13259: #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */
! 13260: #define MEM_TypeMask 0x01ff /* Mask of type bits */
! 13261:
1.2 misho 13262:
13263: /* Whenever Mem contains a valid string or blob representation, one of
13264: ** the following flags must be set to determine the memory management
13265: ** policy for Mem.z. The MEM_Term flag tells us whether or not the
13266: ** string is \000 or \u0000 terminated
13267: */
13268: #define MEM_Term 0x0200 /* String rep is nul terminated */
13269: #define MEM_Dyn 0x0400 /* Need to call sqliteFree() on Mem.z */
13270: #define MEM_Static 0x0800 /* Mem.z points to a static string */
13271: #define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */
13272: #define MEM_Agg 0x2000 /* Mem.z points to an agg function context */
13273: #define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */
13274: #ifdef SQLITE_OMIT_INCRBLOB
13275: #undef MEM_Zero
13276: #define MEM_Zero 0x0000
13277: #endif
13278:
13279: /*
13280: ** Clear any existing type flags from a Mem and replace them with f
13281: */
13282: #define MemSetTypeFlag(p, f) \
13283: ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f)
13284:
13285: /*
13286: ** Return true if a memory cell is not marked as invalid. This macro
13287: ** is for use inside assert() statements only.
13288: */
13289: #ifdef SQLITE_DEBUG
13290: #define memIsValid(M) ((M)->flags & MEM_Invalid)==0
13291: #endif
13292:
13293:
13294: /* A VdbeFunc is just a FuncDef (defined in sqliteInt.h) that contains
13295: ** additional information about auxiliary information bound to arguments
13296: ** of the function. This is used to implement the sqlite3_get_auxdata()
13297: ** and sqlite3_set_auxdata() APIs. The "auxdata" is some auxiliary data
13298: ** that can be associated with a constant argument to a function. This
13299: ** allows functions such as "regexp" to compile their constant regular
13300: ** expression argument once and reused the compiled code for multiple
13301: ** invocations.
13302: */
13303: struct VdbeFunc {
13304: FuncDef *pFunc; /* The definition of the function */
13305: int nAux; /* Number of entries allocated for apAux[] */
13306: struct AuxData {
13307: void *pAux; /* Aux data for the i-th argument */
13308: void (*xDelete)(void *); /* Destructor for the aux data */
13309: } apAux[1]; /* One slot for each function argument */
13310: };
13311:
13312: /*
13313: ** The "context" argument for a installable function. A pointer to an
13314: ** instance of this structure is the first argument to the routines used
13315: ** implement the SQL functions.
13316: **
13317: ** There is a typedef for this structure in sqlite.h. So all routines,
13318: ** even the public interface to SQLite, can use a pointer to this structure.
13319: ** But this file is the only place where the internal details of this
13320: ** structure are known.
13321: **
13322: ** This structure is defined inside of vdbeInt.h because it uses substructures
13323: ** (Mem) which are only defined there.
13324: */
13325: struct sqlite3_context {
13326: FuncDef *pFunc; /* Pointer to function information. MUST BE FIRST */
13327: VdbeFunc *pVdbeFunc; /* Auxilary data, if created. */
13328: Mem s; /* The return value is stored here */
13329: Mem *pMem; /* Memory cell used to store aggregate context */
13330: CollSeq *pColl; /* Collating sequence */
1.2.2.1 ! misho 13331: int isError; /* Error code returned by the function. */
! 13332: int skipFlag; /* Skip skip accumulator loading if true */
1.2 misho 13333: };
13334:
13335: /*
13336: ** An Explain object accumulates indented output which is helpful
13337: ** in describing recursive data structures.
13338: */
13339: struct Explain {
13340: Vdbe *pVdbe; /* Attach the explanation to this Vdbe */
13341: StrAccum str; /* The string being accumulated */
13342: int nIndent; /* Number of elements in aIndent */
13343: u16 aIndent[100]; /* Levels of indentation */
13344: char zBase[100]; /* Initial space */
13345: };
13346:
1.2.2.1 ! misho 13347: /* A bitfield type for use inside of structures. Always follow with :N where
! 13348: ** N is the number of bits.
! 13349: */
! 13350: typedef unsigned bft; /* Bit Field Type */
! 13351:
1.2 misho 13352: /*
13353: ** An instance of the virtual machine. This structure contains the complete
13354: ** state of the virtual machine.
13355: **
13356: ** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare()
13357: ** is really a pointer to an instance of this structure.
13358: **
13359: ** The Vdbe.inVtabMethod variable is set to non-zero for the duration of
13360: ** any virtual table method invocations made by the vdbe program. It is
13361: ** set to 2 for xDestroy method calls and 1 for all other methods. This
13362: ** variable is used for two purposes: to allow xDestroy methods to execute
13363: ** "DROP TABLE" statements and to prevent some nasty side effects of
13364: ** malloc failure when SQLite is invoked recursively by a virtual table
13365: ** method function.
13366: */
13367: struct Vdbe {
13368: sqlite3 *db; /* The database connection that owns this statement */
13369: Op *aOp; /* Space to hold the virtual machine's program */
13370: Mem *aMem; /* The memory locations */
13371: Mem **apArg; /* Arguments to currently executing user function */
13372: Mem *aColName; /* Column names to return */
13373: Mem *pResultSet; /* Pointer to an array of results */
13374: int nMem; /* Number of memory locations currently allocated */
13375: int nOp; /* Number of instructions in the program */
13376: int nOpAlloc; /* Number of slots allocated for aOp[] */
13377: int nLabel; /* Number of labels used */
13378: int *aLabel; /* Space to hold the labels */
13379: u16 nResColumn; /* Number of columns in one row of the result set */
13380: u16 nCursor; /* Number of slots in apCsr[] */
13381: u32 magic; /* Magic number for sanity checking */
13382: char *zErrMsg; /* Error message written here */
13383: Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
13384: VdbeCursor **apCsr; /* One element of this array for each open cursor */
13385: Mem *aVar; /* Values for the OP_Variable opcode. */
13386: char **azVar; /* Name of variables */
13387: ynVar nVar; /* Number of entries in aVar[] */
13388: ynVar nzVar; /* Number of entries in azVar[] */
13389: u32 cacheCtr; /* VdbeCursor row cache generation counter */
13390: int pc; /* The program counter */
13391: int rc; /* Value to return */
13392: u8 errorAction; /* Recovery action to do in case of an error */
13393: u8 minWriteFileFormat; /* Minimum file format for writable database files */
1.2.2.1 ! misho 13394: bft explain:2; /* True if EXPLAIN present on SQL command */
! 13395: bft inVtabMethod:2; /* See comments above */
! 13396: bft changeCntOn:1; /* True to update the change-counter */
! 13397: bft expired:1; /* True if the VM needs to be recompiled */
! 13398: bft runOnlyOnce:1; /* Automatically expire on reset */
! 13399: bft usesStmtJournal:1; /* True if uses a statement journal */
! 13400: bft readOnly:1; /* True for read-only statements */
! 13401: bft isPrepareV2:1; /* True if prepared with prepare_v2() */
! 13402: bft doingRerun:1; /* True if rerunning after an auto-reprepare */
1.2 misho 13403: int nChange; /* Number of db changes made since last reset */
13404: yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */
13405: yDbMask lockMask; /* Subset of btreeMask that requires a lock */
13406: int iStatement; /* Statement number (or 0 if has not opened stmt) */
13407: int aCounter[3]; /* Counters used by sqlite3_stmt_status() */
13408: #ifndef SQLITE_OMIT_TRACE
13409: i64 startTime; /* Time when query started - used for profiling */
13410: #endif
13411: i64 nFkConstraint; /* Number of imm. FK constraints this VM */
13412: i64 nStmtDefCons; /* Number of def. constraints when stmt started */
13413: char *zSql; /* Text of the SQL statement that generated this */
13414: void *pFree; /* Free this when deleting the vdbe */
13415: #ifdef SQLITE_DEBUG
13416: FILE *trace; /* Write an execution trace here, if not NULL */
13417: #endif
13418: #ifdef SQLITE_ENABLE_TREE_EXPLAIN
13419: Explain *pExplain; /* The explainer */
13420: char *zExplain; /* Explanation of data structures */
13421: #endif
13422: VdbeFrame *pFrame; /* Parent frame */
13423: VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */
13424: int nFrame; /* Number of frames in pFrame list */
13425: u32 expmask; /* Binding to these vars invalidates VM */
13426: SubProgram *pProgram; /* Linked list of all sub-programs used by VM */
13427: int nOnceFlag; /* Size of array aOnceFlag[] */
13428: u8 *aOnceFlag; /* Flags for OP_Once */
13429: };
13430:
13431: /*
13432: ** The following are allowed values for Vdbe.magic
13433: */
13434: #define VDBE_MAGIC_INIT 0x26bceaa5 /* Building a VDBE program */
13435: #define VDBE_MAGIC_RUN 0xbdf20da3 /* VDBE is ready to execute */
13436: #define VDBE_MAGIC_HALT 0x519c2973 /* VDBE has completed execution */
13437: #define VDBE_MAGIC_DEAD 0xb606c3c8 /* The VDBE has been deallocated */
13438:
13439: /*
13440: ** Function prototypes
13441: */
13442: SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
13443: void sqliteVdbePopStack(Vdbe*,int);
13444: SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor*);
13445: #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
13446: SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*);
13447: #endif
13448: SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32);
13449: SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int);
13450: SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
13451: SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
13452: SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc*, int);
13453:
13454: int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
13455: SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*);
13456: SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *);
13457: SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
13458: SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe*);
13459: SQLITE_PRIVATE int sqlite3VdbeList(Vdbe*);
13460: SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe*);
13461: SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *, int);
13462: SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem*);
13463: SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem*, const Mem*);
13464: SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int);
13465: SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem*, Mem*);
13466: SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem*);
13467: SQLITE_PRIVATE int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*));
13468: SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64);
13469: #ifdef SQLITE_OMIT_FLOATING_POINT
13470: # define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64
13471: #else
13472: SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double);
13473: #endif
13474: SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*);
13475: SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int);
13476: SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem*);
13477: SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem*);
13478: SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, int);
13479: SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*);
13480: SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*);
13481: SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*);
13482: SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*);
13483: SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*);
13484: SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*);
13485: SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,int,int,int,Mem*);
13486: SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p);
13487: SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p);
13488: #define VdbeMemRelease(X) \
13489: if((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame)) \
13490: sqlite3VdbeMemReleaseExternal(X);
13491: SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
13492: SQLITE_PRIVATE const char *sqlite3OpcodeName(int);
13493: SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
13494: SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int);
13495: SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*);
13496: SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *);
13497: SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem);
13498: SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p);
13499:
13500: #ifdef SQLITE_OMIT_MERGE_SORT
13501: # define sqlite3VdbeSorterInit(Y,Z) SQLITE_OK
13502: # define sqlite3VdbeSorterWrite(X,Y,Z) SQLITE_OK
13503: # define sqlite3VdbeSorterClose(Y,Z)
13504: # define sqlite3VdbeSorterRowkey(Y,Z) SQLITE_OK
13505: # define sqlite3VdbeSorterRewind(X,Y,Z) SQLITE_OK
13506: # define sqlite3VdbeSorterNext(X,Y,Z) SQLITE_OK
13507: # define sqlite3VdbeSorterCompare(X,Y,Z) SQLITE_OK
13508: #else
13509: SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *);
13510: SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *);
1.2.2.1 ! misho 13511: SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *);
! 13512: SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *, int *);
! 13513: SQLITE_PRIVATE int sqlite3VdbeSorterRewind(sqlite3 *, const VdbeCursor *, int *);
! 13514: SQLITE_PRIVATE int sqlite3VdbeSorterWrite(sqlite3 *, const VdbeCursor *, Mem *);
! 13515: SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int *);
1.2 misho 13516: #endif
13517:
13518: #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0
13519: SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*);
13520: SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*);
13521: #else
13522: # define sqlite3VdbeEnter(X)
13523: # define sqlite3VdbeLeave(X)
13524: #endif
13525:
13526: #ifdef SQLITE_DEBUG
13527: SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*);
13528: #endif
13529:
13530: #ifndef SQLITE_OMIT_FOREIGN_KEY
13531: SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int);
13532: #else
13533: # define sqlite3VdbeCheckFk(p,i) 0
13534: #endif
13535:
13536: SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8);
13537: #ifdef SQLITE_DEBUG
13538: SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*);
13539: SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf);
13540: #endif
13541: SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem);
13542:
13543: #ifndef SQLITE_OMIT_INCRBLOB
13544: SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *);
13545: #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
13546: #else
13547: #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK
13548: #define ExpandBlob(P) SQLITE_OK
13549: #endif
13550:
13551: #endif /* !defined(_VDBEINT_H_) */
13552:
13553: /************** End of vdbeInt.h *********************************************/
13554: /************** Continuing where we left off in status.c *********************/
13555:
13556: /*
13557: ** Variables in which to record status information.
13558: */
13559: typedef struct sqlite3StatType sqlite3StatType;
13560: static SQLITE_WSD struct sqlite3StatType {
13561: int nowValue[10]; /* Current value */
13562: int mxValue[10]; /* Maximum value */
13563: } sqlite3Stat = { {0,}, {0,} };
13564:
13565:
13566: /* The "wsdStat" macro will resolve to the status information
13567: ** state vector. If writable static data is unsupported on the target,
13568: ** we have to locate the state vector at run-time. In the more common
13569: ** case where writable static data is supported, wsdStat can refer directly
13570: ** to the "sqlite3Stat" state vector declared above.
13571: */
13572: #ifdef SQLITE_OMIT_WSD
13573: # define wsdStatInit sqlite3StatType *x = &GLOBAL(sqlite3StatType,sqlite3Stat)
13574: # define wsdStat x[0]
13575: #else
13576: # define wsdStatInit
13577: # define wsdStat sqlite3Stat
13578: #endif
13579:
13580: /*
13581: ** Return the current value of a status parameter.
13582: */
13583: SQLITE_PRIVATE int sqlite3StatusValue(int op){
13584: wsdStatInit;
13585: assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
13586: return wsdStat.nowValue[op];
13587: }
13588:
13589: /*
13590: ** Add N to the value of a status record. It is assumed that the
13591: ** caller holds appropriate locks.
13592: */
13593: SQLITE_PRIVATE void sqlite3StatusAdd(int op, int N){
13594: wsdStatInit;
13595: assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
13596: wsdStat.nowValue[op] += N;
13597: if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){
13598: wsdStat.mxValue[op] = wsdStat.nowValue[op];
13599: }
13600: }
13601:
13602: /*
13603: ** Set the value of a status to X.
13604: */
13605: SQLITE_PRIVATE void sqlite3StatusSet(int op, int X){
13606: wsdStatInit;
13607: assert( op>=0 && op<ArraySize(wsdStat.nowValue) );
13608: wsdStat.nowValue[op] = X;
13609: if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){
13610: wsdStat.mxValue[op] = wsdStat.nowValue[op];
13611: }
13612: }
13613:
13614: /*
13615: ** Query status information.
13616: **
13617: ** This implementation assumes that reading or writing an aligned
13618: ** 32-bit integer is an atomic operation. If that assumption is not true,
13619: ** then this routine is not threadsafe.
13620: */
13621: SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){
13622: wsdStatInit;
13623: if( op<0 || op>=ArraySize(wsdStat.nowValue) ){
13624: return SQLITE_MISUSE_BKPT;
13625: }
13626: *pCurrent = wsdStat.nowValue[op];
13627: *pHighwater = wsdStat.mxValue[op];
13628: if( resetFlag ){
13629: wsdStat.mxValue[op] = wsdStat.nowValue[op];
13630: }
13631: return SQLITE_OK;
13632: }
13633:
13634: /*
13635: ** Query status information for a single database connection
13636: */
13637: SQLITE_API int sqlite3_db_status(
13638: sqlite3 *db, /* The database connection whose status is desired */
13639: int op, /* Status verb */
13640: int *pCurrent, /* Write current value here */
13641: int *pHighwater, /* Write high-water mark here */
13642: int resetFlag /* Reset high-water mark if true */
13643: ){
13644: int rc = SQLITE_OK; /* Return code */
13645: sqlite3_mutex_enter(db->mutex);
13646: switch( op ){
13647: case SQLITE_DBSTATUS_LOOKASIDE_USED: {
13648: *pCurrent = db->lookaside.nOut;
13649: *pHighwater = db->lookaside.mxOut;
13650: if( resetFlag ){
13651: db->lookaside.mxOut = db->lookaside.nOut;
13652: }
13653: break;
13654: }
13655:
13656: case SQLITE_DBSTATUS_LOOKASIDE_HIT:
13657: case SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE:
13658: case SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL: {
13659: testcase( op==SQLITE_DBSTATUS_LOOKASIDE_HIT );
13660: testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE );
13661: testcase( op==SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL );
13662: assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)>=0 );
13663: assert( (op-SQLITE_DBSTATUS_LOOKASIDE_HIT)<3 );
13664: *pCurrent = 0;
13665: *pHighwater = db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT];
13666: if( resetFlag ){
13667: db->lookaside.anStat[op - SQLITE_DBSTATUS_LOOKASIDE_HIT] = 0;
13668: }
13669: break;
13670: }
13671:
13672: /*
13673: ** Return an approximation for the amount of memory currently used
13674: ** by all pagers associated with the given database connection. The
13675: ** highwater mark is meaningless and is returned as zero.
13676: */
13677: case SQLITE_DBSTATUS_CACHE_USED: {
13678: int totalUsed = 0;
13679: int i;
13680: sqlite3BtreeEnterAll(db);
13681: for(i=0; i<db->nDb; i++){
13682: Btree *pBt = db->aDb[i].pBt;
13683: if( pBt ){
13684: Pager *pPager = sqlite3BtreePager(pBt);
13685: totalUsed += sqlite3PagerMemUsed(pPager);
13686: }
13687: }
13688: sqlite3BtreeLeaveAll(db);
13689: *pCurrent = totalUsed;
13690: *pHighwater = 0;
13691: break;
13692: }
13693:
13694: /*
13695: ** *pCurrent gets an accurate estimate of the amount of memory used
13696: ** to store the schema for all databases (main, temp, and any ATTACHed
13697: ** databases. *pHighwater is set to zero.
13698: */
13699: case SQLITE_DBSTATUS_SCHEMA_USED: {
13700: int i; /* Used to iterate through schemas */
13701: int nByte = 0; /* Used to accumulate return value */
13702:
13703: sqlite3BtreeEnterAll(db);
13704: db->pnBytesFreed = &nByte;
13705: for(i=0; i<db->nDb; i++){
13706: Schema *pSchema = db->aDb[i].pSchema;
13707: if( ALWAYS(pSchema!=0) ){
13708: HashElem *p;
13709:
13710: nByte += sqlite3GlobalConfig.m.xRoundup(sizeof(HashElem)) * (
13711: pSchema->tblHash.count
13712: + pSchema->trigHash.count
13713: + pSchema->idxHash.count
13714: + pSchema->fkeyHash.count
13715: );
13716: nByte += sqlite3MallocSize(pSchema->tblHash.ht);
13717: nByte += sqlite3MallocSize(pSchema->trigHash.ht);
13718: nByte += sqlite3MallocSize(pSchema->idxHash.ht);
13719: nByte += sqlite3MallocSize(pSchema->fkeyHash.ht);
13720:
13721: for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){
13722: sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p));
13723: }
13724: for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){
13725: sqlite3DeleteTable(db, (Table *)sqliteHashData(p));
13726: }
13727: }
13728: }
13729: db->pnBytesFreed = 0;
13730: sqlite3BtreeLeaveAll(db);
13731:
13732: *pHighwater = 0;
13733: *pCurrent = nByte;
13734: break;
13735: }
13736:
13737: /*
13738: ** *pCurrent gets an accurate estimate of the amount of memory used
13739: ** to store all prepared statements.
13740: ** *pHighwater is set to zero.
13741: */
13742: case SQLITE_DBSTATUS_STMT_USED: {
13743: struct Vdbe *pVdbe; /* Used to iterate through VMs */
13744: int nByte = 0; /* Used to accumulate return value */
13745:
13746: db->pnBytesFreed = &nByte;
13747: for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){
1.2.2.1 ! misho 13748: sqlite3VdbeClearObject(db, pVdbe);
! 13749: sqlite3DbFree(db, pVdbe);
1.2 misho 13750: }
13751: db->pnBytesFreed = 0;
13752:
13753: *pHighwater = 0;
13754: *pCurrent = nByte;
13755:
13756: break;
13757: }
13758:
13759: /*
13760: ** Set *pCurrent to the total cache hits or misses encountered by all
13761: ** pagers the database handle is connected to. *pHighwater is always set
13762: ** to zero.
13763: */
13764: case SQLITE_DBSTATUS_CACHE_HIT:
1.2.2.1 ! misho 13765: case SQLITE_DBSTATUS_CACHE_MISS:
! 13766: case SQLITE_DBSTATUS_CACHE_WRITE:{
1.2 misho 13767: int i;
13768: int nRet = 0;
13769: assert( SQLITE_DBSTATUS_CACHE_MISS==SQLITE_DBSTATUS_CACHE_HIT+1 );
1.2.2.1 ! misho 13770: assert( SQLITE_DBSTATUS_CACHE_WRITE==SQLITE_DBSTATUS_CACHE_HIT+2 );
1.2 misho 13771:
13772: for(i=0; i<db->nDb; i++){
13773: if( db->aDb[i].pBt ){
13774: Pager *pPager = sqlite3BtreePager(db->aDb[i].pBt);
13775: sqlite3PagerCacheStat(pPager, op, resetFlag, &nRet);
13776: }
13777: }
13778: *pHighwater = 0;
13779: *pCurrent = nRet;
13780: break;
13781: }
13782:
13783: default: {
13784: rc = SQLITE_ERROR;
13785: }
13786: }
13787: sqlite3_mutex_leave(db->mutex);
13788: return rc;
13789: }
13790:
13791: /************** End of status.c **********************************************/
13792: /************** Begin file date.c ********************************************/
13793: /*
13794: ** 2003 October 31
13795: **
13796: ** The author disclaims copyright to this source code. In place of
13797: ** a legal notice, here is a blessing:
13798: **
13799: ** May you do good and not evil.
13800: ** May you find forgiveness for yourself and forgive others.
13801: ** May you share freely, never taking more than you give.
13802: **
13803: *************************************************************************
13804: ** This file contains the C functions that implement date and time
13805: ** functions for SQLite.
13806: **
13807: ** There is only one exported symbol in this file - the function
13808: ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file.
13809: ** All other code has file scope.
13810: **
13811: ** SQLite processes all times and dates as Julian Day numbers. The
13812: ** dates and times are stored as the number of days since noon
13813: ** in Greenwich on November 24, 4714 B.C. according to the Gregorian
13814: ** calendar system.
13815: **
13816: ** 1970-01-01 00:00:00 is JD 2440587.5
13817: ** 2000-01-01 00:00:00 is JD 2451544.5
13818: **
13819: ** This implemention requires years to be expressed as a 4-digit number
13820: ** which means that only dates between 0000-01-01 and 9999-12-31 can
13821: ** be represented, even though julian day numbers allow a much wider
13822: ** range of dates.
13823: **
13824: ** The Gregorian calendar system is used for all dates and times,
13825: ** even those that predate the Gregorian calendar. Historians usually
13826: ** use the Julian calendar for dates prior to 1582-10-15 and for some
13827: ** dates afterwards, depending on locale. Beware of this difference.
13828: **
13829: ** The conversion algorithms are implemented based on descriptions
13830: ** in the following text:
13831: **
13832: ** Jean Meeus
13833: ** Astronomical Algorithms, 2nd Edition, 1998
13834: ** ISBM 0-943396-61-1
13835: ** Willmann-Bell, Inc
13836: ** Richmond, Virginia (USA)
13837: */
13838: /* #include <stdlib.h> */
13839: /* #include <assert.h> */
13840: #include <time.h>
13841:
13842: #ifndef SQLITE_OMIT_DATETIME_FUNCS
13843:
13844:
13845: /*
13846: ** A structure for holding a single date and time.
13847: */
13848: typedef struct DateTime DateTime;
13849: struct DateTime {
13850: sqlite3_int64 iJD; /* The julian day number times 86400000 */
13851: int Y, M, D; /* Year, month, and day */
13852: int h, m; /* Hour and minutes */
13853: int tz; /* Timezone offset in minutes */
13854: double s; /* Seconds */
13855: char validYMD; /* True (1) if Y,M,D are valid */
13856: char validHMS; /* True (1) if h,m,s are valid */
13857: char validJD; /* True (1) if iJD is valid */
13858: char validTZ; /* True (1) if tz is valid */
13859: };
13860:
13861:
13862: /*
13863: ** Convert zDate into one or more integers. Additional arguments
13864: ** come in groups of 5 as follows:
13865: **
13866: ** N number of digits in the integer
13867: ** min minimum allowed value of the integer
13868: ** max maximum allowed value of the integer
13869: ** nextC first character after the integer
13870: ** pVal where to write the integers value.
13871: **
13872: ** Conversions continue until one with nextC==0 is encountered.
13873: ** The function returns the number of successful conversions.
13874: */
13875: static int getDigits(const char *zDate, ...){
13876: va_list ap;
13877: int val;
13878: int N;
13879: int min;
13880: int max;
13881: int nextC;
13882: int *pVal;
13883: int cnt = 0;
13884: va_start(ap, zDate);
13885: do{
13886: N = va_arg(ap, int);
13887: min = va_arg(ap, int);
13888: max = va_arg(ap, int);
13889: nextC = va_arg(ap, int);
13890: pVal = va_arg(ap, int*);
13891: val = 0;
13892: while( N-- ){
13893: if( !sqlite3Isdigit(*zDate) ){
13894: goto end_getDigits;
13895: }
13896: val = val*10 + *zDate - '0';
13897: zDate++;
13898: }
13899: if( val<min || val>max || (nextC!=0 && nextC!=*zDate) ){
13900: goto end_getDigits;
13901: }
13902: *pVal = val;
13903: zDate++;
13904: cnt++;
13905: }while( nextC );
13906: end_getDigits:
13907: va_end(ap);
13908: return cnt;
13909: }
13910:
13911: /*
13912: ** Parse a timezone extension on the end of a date-time.
13913: ** The extension is of the form:
13914: **
13915: ** (+/-)HH:MM
13916: **
13917: ** Or the "zulu" notation:
13918: **
13919: ** Z
13920: **
13921: ** If the parse is successful, write the number of minutes
13922: ** of change in p->tz and return 0. If a parser error occurs,
13923: ** return non-zero.
13924: **
13925: ** A missing specifier is not considered an error.
13926: */
13927: static int parseTimezone(const char *zDate, DateTime *p){
13928: int sgn = 0;
13929: int nHr, nMn;
13930: int c;
13931: while( sqlite3Isspace(*zDate) ){ zDate++; }
13932: p->tz = 0;
13933: c = *zDate;
13934: if( c=='-' ){
13935: sgn = -1;
13936: }else if( c=='+' ){
13937: sgn = +1;
13938: }else if( c=='Z' || c=='z' ){
13939: zDate++;
13940: goto zulu_time;
13941: }else{
13942: return c!=0;
13943: }
13944: zDate++;
13945: if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){
13946: return 1;
13947: }
13948: zDate += 5;
13949: p->tz = sgn*(nMn + nHr*60);
13950: zulu_time:
13951: while( sqlite3Isspace(*zDate) ){ zDate++; }
13952: return *zDate!=0;
13953: }
13954:
13955: /*
13956: ** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF.
13957: ** The HH, MM, and SS must each be exactly 2 digits. The
13958: ** fractional seconds FFFF can be one or more digits.
13959: **
13960: ** Return 1 if there is a parsing error and 0 on success.
13961: */
13962: static int parseHhMmSs(const char *zDate, DateTime *p){
13963: int h, m, s;
13964: double ms = 0.0;
13965: if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){
13966: return 1;
13967: }
13968: zDate += 5;
13969: if( *zDate==':' ){
13970: zDate++;
13971: if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){
13972: return 1;
13973: }
13974: zDate += 2;
13975: if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){
13976: double rScale = 1.0;
13977: zDate++;
13978: while( sqlite3Isdigit(*zDate) ){
13979: ms = ms*10.0 + *zDate - '0';
13980: rScale *= 10.0;
13981: zDate++;
13982: }
13983: ms /= rScale;
13984: }
13985: }else{
13986: s = 0;
13987: }
13988: p->validJD = 0;
13989: p->validHMS = 1;
13990: p->h = h;
13991: p->m = m;
13992: p->s = s + ms;
13993: if( parseTimezone(zDate, p) ) return 1;
13994: p->validTZ = (p->tz!=0)?1:0;
13995: return 0;
13996: }
13997:
13998: /*
13999: ** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume
14000: ** that the YYYY-MM-DD is according to the Gregorian calendar.
14001: **
14002: ** Reference: Meeus page 61
14003: */
14004: static void computeJD(DateTime *p){
14005: int Y, M, D, A, B, X1, X2;
14006:
14007: if( p->validJD ) return;
14008: if( p->validYMD ){
14009: Y = p->Y;
14010: M = p->M;
14011: D = p->D;
14012: }else{
14013: Y = 2000; /* If no YMD specified, assume 2000-Jan-01 */
14014: M = 1;
14015: D = 1;
14016: }
14017: if( M<=2 ){
14018: Y--;
14019: M += 12;
14020: }
14021: A = Y/100;
14022: B = 2 - A + (A/4);
14023: X1 = 36525*(Y+4716)/100;
14024: X2 = 306001*(M+1)/10000;
14025: p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000);
14026: p->validJD = 1;
14027: if( p->validHMS ){
14028: p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000);
14029: if( p->validTZ ){
14030: p->iJD -= p->tz*60000;
14031: p->validYMD = 0;
14032: p->validHMS = 0;
14033: p->validTZ = 0;
14034: }
14035: }
14036: }
14037:
14038: /*
14039: ** Parse dates of the form
14040: **
14041: ** YYYY-MM-DD HH:MM:SS.FFF
14042: ** YYYY-MM-DD HH:MM:SS
14043: ** YYYY-MM-DD HH:MM
14044: ** YYYY-MM-DD
14045: **
14046: ** Write the result into the DateTime structure and return 0
14047: ** on success and 1 if the input string is not a well-formed
14048: ** date.
14049: */
14050: static int parseYyyyMmDd(const char *zDate, DateTime *p){
14051: int Y, M, D, neg;
14052:
14053: if( zDate[0]=='-' ){
14054: zDate++;
14055: neg = 1;
14056: }else{
14057: neg = 0;
14058: }
14059: if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){
14060: return 1;
14061: }
14062: zDate += 10;
14063: while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; }
14064: if( parseHhMmSs(zDate, p)==0 ){
14065: /* We got the time */
14066: }else if( *zDate==0 ){
14067: p->validHMS = 0;
14068: }else{
14069: return 1;
14070: }
14071: p->validJD = 0;
14072: p->validYMD = 1;
14073: p->Y = neg ? -Y : Y;
14074: p->M = M;
14075: p->D = D;
14076: if( p->validTZ ){
14077: computeJD(p);
14078: }
14079: return 0;
14080: }
14081:
14082: /*
14083: ** Set the time to the current time reported by the VFS.
14084: **
14085: ** Return the number of errors.
14086: */
14087: static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
14088: sqlite3 *db = sqlite3_context_db_handle(context);
14089: if( sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD)==SQLITE_OK ){
14090: p->validJD = 1;
14091: return 0;
14092: }else{
14093: return 1;
14094: }
14095: }
14096:
14097: /*
14098: ** Attempt to parse the given string into a Julian Day Number. Return
14099: ** the number of errors.
14100: **
14101: ** The following are acceptable forms for the input string:
14102: **
14103: ** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM
14104: ** DDDD.DD
14105: ** now
14106: **
14107: ** In the first form, the +/-HH:MM is always optional. The fractional
14108: ** seconds extension (the ".FFF") is optional. The seconds portion
14109: ** (":SS.FFF") is option. The year and date can be omitted as long
14110: ** as there is a time string. The time string can be omitted as long
14111: ** as there is a year and date.
14112: */
14113: static int parseDateOrTime(
14114: sqlite3_context *context,
14115: const char *zDate,
14116: DateTime *p
14117: ){
14118: double r;
14119: if( parseYyyyMmDd(zDate,p)==0 ){
14120: return 0;
14121: }else if( parseHhMmSs(zDate, p)==0 ){
14122: return 0;
14123: }else if( sqlite3StrICmp(zDate,"now")==0){
14124: return setDateTimeToCurrent(context, p);
14125: }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
14126: p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
14127: p->validJD = 1;
14128: return 0;
14129: }
14130: return 1;
14131: }
14132:
14133: /*
14134: ** Compute the Year, Month, and Day from the julian day number.
14135: */
14136: static void computeYMD(DateTime *p){
14137: int Z, A, B, C, D, E, X1;
14138: if( p->validYMD ) return;
14139: if( !p->validJD ){
14140: p->Y = 2000;
14141: p->M = 1;
14142: p->D = 1;
14143: }else{
14144: Z = (int)((p->iJD + 43200000)/86400000);
14145: A = (int)((Z - 1867216.25)/36524.25);
14146: A = Z + 1 + A - (A/4);
14147: B = A + 1524;
14148: C = (int)((B - 122.1)/365.25);
14149: D = (36525*C)/100;
14150: E = (int)((B-D)/30.6001);
14151: X1 = (int)(30.6001*E);
14152: p->D = B - D - X1;
14153: p->M = E<14 ? E-1 : E-13;
14154: p->Y = p->M>2 ? C - 4716 : C - 4715;
14155: }
14156: p->validYMD = 1;
14157: }
14158:
14159: /*
14160: ** Compute the Hour, Minute, and Seconds from the julian day number.
14161: */
14162: static void computeHMS(DateTime *p){
14163: int s;
14164: if( p->validHMS ) return;
14165: computeJD(p);
14166: s = (int)((p->iJD + 43200000) % 86400000);
14167: p->s = s/1000.0;
14168: s = (int)p->s;
14169: p->s -= s;
14170: p->h = s/3600;
14171: s -= p->h*3600;
14172: p->m = s/60;
14173: p->s += s - p->m*60;
14174: p->validHMS = 1;
14175: }
14176:
14177: /*
14178: ** Compute both YMD and HMS
14179: */
14180: static void computeYMD_HMS(DateTime *p){
14181: computeYMD(p);
14182: computeHMS(p);
14183: }
14184:
14185: /*
14186: ** Clear the YMD and HMS and the TZ
14187: */
14188: static void clearYMD_HMS_TZ(DateTime *p){
14189: p->validYMD = 0;
14190: p->validHMS = 0;
14191: p->validTZ = 0;
14192: }
14193:
14194: /*
14195: ** On recent Windows platforms, the localtime_s() function is available
14196: ** as part of the "Secure CRT". It is essentially equivalent to
14197: ** localtime_r() available under most POSIX platforms, except that the
14198: ** order of the parameters is reversed.
14199: **
14200: ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
14201: **
14202: ** If the user has not indicated to use localtime_r() or localtime_s()
14203: ** already, check for an MSVC build environment that provides
14204: ** localtime_s().
14205: */
14206: #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
14207: defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
14208: #define HAVE_LOCALTIME_S 1
14209: #endif
14210:
14211: #ifndef SQLITE_OMIT_LOCALTIME
14212: /*
14213: ** The following routine implements the rough equivalent of localtime_r()
14214: ** using whatever operating-system specific localtime facility that
14215: ** is available. This routine returns 0 on success and
14216: ** non-zero on any kind of error.
14217: **
14218: ** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
14219: ** routine will always fail.
14220: */
14221: static int osLocaltime(time_t *t, struct tm *pTm){
14222: int rc;
14223: #if (!defined(HAVE_LOCALTIME_R) || !HAVE_LOCALTIME_R) \
14224: && (!defined(HAVE_LOCALTIME_S) || !HAVE_LOCALTIME_S)
14225: struct tm *pX;
14226: #if SQLITE_THREADSAFE>0
14227: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
14228: #endif
14229: sqlite3_mutex_enter(mutex);
14230: pX = localtime(t);
14231: #ifndef SQLITE_OMIT_BUILTIN_TEST
14232: if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0;
14233: #endif
14234: if( pX ) *pTm = *pX;
14235: sqlite3_mutex_leave(mutex);
14236: rc = pX==0;
14237: #else
14238: #ifndef SQLITE_OMIT_BUILTIN_TEST
14239: if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
14240: #endif
14241: #if defined(HAVE_LOCALTIME_R) && HAVE_LOCALTIME_R
14242: rc = localtime_r(t, pTm)==0;
14243: #else
14244: rc = localtime_s(pTm, t);
14245: #endif /* HAVE_LOCALTIME_R */
14246: #endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */
14247: return rc;
14248: }
14249: #endif /* SQLITE_OMIT_LOCALTIME */
14250:
14251:
14252: #ifndef SQLITE_OMIT_LOCALTIME
14253: /*
14254: ** Compute the difference (in milliseconds) between localtime and UTC
14255: ** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
14256: ** return this value and set *pRc to SQLITE_OK.
14257: **
14258: ** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value
14259: ** is undefined in this case.
14260: */
14261: static sqlite3_int64 localtimeOffset(
14262: DateTime *p, /* Date at which to calculate offset */
14263: sqlite3_context *pCtx, /* Write error here if one occurs */
14264: int *pRc /* OUT: Error code. SQLITE_OK or ERROR */
14265: ){
14266: DateTime x, y;
14267: time_t t;
14268: struct tm sLocal;
14269:
14270: /* Initialize the contents of sLocal to avoid a compiler warning. */
14271: memset(&sLocal, 0, sizeof(sLocal));
14272:
14273: x = *p;
14274: computeYMD_HMS(&x);
14275: if( x.Y<1971 || x.Y>=2038 ){
14276: x.Y = 2000;
14277: x.M = 1;
14278: x.D = 1;
14279: x.h = 0;
14280: x.m = 0;
14281: x.s = 0.0;
14282: } else {
14283: int s = (int)(x.s + 0.5);
14284: x.s = s;
14285: }
14286: x.tz = 0;
14287: x.validJD = 0;
14288: computeJD(&x);
14289: t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
14290: if( osLocaltime(&t, &sLocal) ){
14291: sqlite3_result_error(pCtx, "local time unavailable", -1);
14292: *pRc = SQLITE_ERROR;
14293: return 0;
14294: }
14295: y.Y = sLocal.tm_year + 1900;
14296: y.M = sLocal.tm_mon + 1;
14297: y.D = sLocal.tm_mday;
14298: y.h = sLocal.tm_hour;
14299: y.m = sLocal.tm_min;
14300: y.s = sLocal.tm_sec;
14301: y.validYMD = 1;
14302: y.validHMS = 1;
14303: y.validJD = 0;
14304: y.validTZ = 0;
14305: computeJD(&y);
14306: *pRc = SQLITE_OK;
14307: return y.iJD - x.iJD;
14308: }
14309: #endif /* SQLITE_OMIT_LOCALTIME */
14310:
14311: /*
14312: ** Process a modifier to a date-time stamp. The modifiers are
14313: ** as follows:
14314: **
14315: ** NNN days
14316: ** NNN hours
14317: ** NNN minutes
14318: ** NNN.NNNN seconds
14319: ** NNN months
14320: ** NNN years
14321: ** start of month
14322: ** start of year
14323: ** start of week
14324: ** start of day
14325: ** weekday N
14326: ** unixepoch
14327: ** localtime
14328: ** utc
14329: **
14330: ** Return 0 on success and 1 if there is any kind of error. If the error
14331: ** is in a system call (i.e. localtime()), then an error message is written
14332: ** to context pCtx. If the error is an unrecognized modifier, no error is
14333: ** written to pCtx.
14334: */
14335: static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){
14336: int rc = 1;
14337: int n;
14338: double r;
14339: char *z, zBuf[30];
14340: z = zBuf;
14341: for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){
14342: z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]];
14343: }
14344: z[n] = 0;
14345: switch( z[0] ){
14346: #ifndef SQLITE_OMIT_LOCALTIME
14347: case 'l': {
14348: /* localtime
14349: **
14350: ** Assuming the current time value is UTC (a.k.a. GMT), shift it to
14351: ** show local time.
14352: */
14353: if( strcmp(z, "localtime")==0 ){
14354: computeJD(p);
14355: p->iJD += localtimeOffset(p, pCtx, &rc);
14356: clearYMD_HMS_TZ(p);
14357: }
14358: break;
14359: }
14360: #endif
14361: case 'u': {
14362: /*
14363: ** unixepoch
14364: **
14365: ** Treat the current value of p->iJD as the number of
14366: ** seconds since 1970. Convert to a real julian day number.
14367: */
14368: if( strcmp(z, "unixepoch")==0 && p->validJD ){
14369: p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000;
14370: clearYMD_HMS_TZ(p);
14371: rc = 0;
14372: }
14373: #ifndef SQLITE_OMIT_LOCALTIME
14374: else if( strcmp(z, "utc")==0 ){
14375: sqlite3_int64 c1;
14376: computeJD(p);
14377: c1 = localtimeOffset(p, pCtx, &rc);
14378: if( rc==SQLITE_OK ){
14379: p->iJD -= c1;
14380: clearYMD_HMS_TZ(p);
14381: p->iJD += c1 - localtimeOffset(p, pCtx, &rc);
14382: }
14383: }
14384: #endif
14385: break;
14386: }
14387: case 'w': {
14388: /*
14389: ** weekday N
14390: **
14391: ** Move the date to the same time on the next occurrence of
14392: ** weekday N where 0==Sunday, 1==Monday, and so forth. If the
14393: ** date is already on the appropriate weekday, this is a no-op.
14394: */
14395: if( strncmp(z, "weekday ", 8)==0
14396: && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)
14397: && (n=(int)r)==r && n>=0 && r<7 ){
14398: sqlite3_int64 Z;
14399: computeYMD_HMS(p);
14400: p->validTZ = 0;
14401: p->validJD = 0;
14402: computeJD(p);
14403: Z = ((p->iJD + 129600000)/86400000) % 7;
14404: if( Z>n ) Z -= 7;
14405: p->iJD += (n - Z)*86400000;
14406: clearYMD_HMS_TZ(p);
14407: rc = 0;
14408: }
14409: break;
14410: }
14411: case 's': {
14412: /*
14413: ** start of TTTTT
14414: **
14415: ** Move the date backwards to the beginning of the current day,
14416: ** or month or year.
14417: */
14418: if( strncmp(z, "start of ", 9)!=0 ) break;
14419: z += 9;
14420: computeYMD(p);
14421: p->validHMS = 1;
14422: p->h = p->m = 0;
14423: p->s = 0.0;
14424: p->validTZ = 0;
14425: p->validJD = 0;
14426: if( strcmp(z,"month")==0 ){
14427: p->D = 1;
14428: rc = 0;
14429: }else if( strcmp(z,"year")==0 ){
14430: computeYMD(p);
14431: p->M = 1;
14432: p->D = 1;
14433: rc = 0;
14434: }else if( strcmp(z,"day")==0 ){
14435: rc = 0;
14436: }
14437: break;
14438: }
14439: case '+':
14440: case '-':
14441: case '0':
14442: case '1':
14443: case '2':
14444: case '3':
14445: case '4':
14446: case '5':
14447: case '6':
14448: case '7':
14449: case '8':
14450: case '9': {
14451: double rRounder;
14452: for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){}
14453: if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){
14454: rc = 1;
14455: break;
14456: }
14457: if( z[n]==':' ){
14458: /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the
14459: ** specified number of hours, minutes, seconds, and fractional seconds
14460: ** to the time. The ".FFF" may be omitted. The ":SS.FFF" may be
14461: ** omitted.
14462: */
14463: const char *z2 = z;
14464: DateTime tx;
14465: sqlite3_int64 day;
14466: if( !sqlite3Isdigit(*z2) ) z2++;
14467: memset(&tx, 0, sizeof(tx));
14468: if( parseHhMmSs(z2, &tx) ) break;
14469: computeJD(&tx);
14470: tx.iJD -= 43200000;
14471: day = tx.iJD/86400000;
14472: tx.iJD -= day*86400000;
14473: if( z[0]=='-' ) tx.iJD = -tx.iJD;
14474: computeJD(p);
14475: clearYMD_HMS_TZ(p);
14476: p->iJD += tx.iJD;
14477: rc = 0;
14478: break;
14479: }
14480: z += n;
14481: while( sqlite3Isspace(*z) ) z++;
14482: n = sqlite3Strlen30(z);
14483: if( n>10 || n<3 ) break;
14484: if( z[n-1]=='s' ){ z[n-1] = 0; n--; }
14485: computeJD(p);
14486: rc = 0;
14487: rRounder = r<0 ? -0.5 : +0.5;
14488: if( n==3 && strcmp(z,"day")==0 ){
14489: p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder);
14490: }else if( n==4 && strcmp(z,"hour")==0 ){
14491: p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder);
14492: }else if( n==6 && strcmp(z,"minute")==0 ){
14493: p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder);
14494: }else if( n==6 && strcmp(z,"second")==0 ){
14495: p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder);
14496: }else if( n==5 && strcmp(z,"month")==0 ){
14497: int x, y;
14498: computeYMD_HMS(p);
14499: p->M += (int)r;
14500: x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12;
14501: p->Y += x;
14502: p->M -= x*12;
14503: p->validJD = 0;
14504: computeJD(p);
14505: y = (int)r;
14506: if( y!=r ){
14507: p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder);
14508: }
14509: }else if( n==4 && strcmp(z,"year")==0 ){
14510: int y = (int)r;
14511: computeYMD_HMS(p);
14512: p->Y += y;
14513: p->validJD = 0;
14514: computeJD(p);
14515: if( y!=r ){
14516: p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder);
14517: }
14518: }else{
14519: rc = 1;
14520: }
14521: clearYMD_HMS_TZ(p);
14522: break;
14523: }
14524: default: {
14525: break;
14526: }
14527: }
14528: return rc;
14529: }
14530:
14531: /*
14532: ** Process time function arguments. argv[0] is a date-time stamp.
14533: ** argv[1] and following are modifiers. Parse them all and write
14534: ** the resulting time into the DateTime structure p. Return 0
14535: ** on success and 1 if there are any errors.
14536: **
14537: ** If there are zero parameters (if even argv[0] is undefined)
14538: ** then assume a default value of "now" for argv[0].
14539: */
14540: static int isDate(
14541: sqlite3_context *context,
14542: int argc,
14543: sqlite3_value **argv,
14544: DateTime *p
14545: ){
14546: int i;
14547: const unsigned char *z;
14548: int eType;
14549: memset(p, 0, sizeof(*p));
14550: if( argc==0 ){
14551: return setDateTimeToCurrent(context, p);
14552: }
14553: if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
14554: || eType==SQLITE_INTEGER ){
14555: p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
14556: p->validJD = 1;
14557: }else{
14558: z = sqlite3_value_text(argv[0]);
14559: if( !z || parseDateOrTime(context, (char*)z, p) ){
14560: return 1;
14561: }
14562: }
14563: for(i=1; i<argc; i++){
14564: z = sqlite3_value_text(argv[i]);
14565: if( z==0 || parseModifier(context, (char*)z, p) ) return 1;
14566: }
14567: return 0;
14568: }
14569:
14570:
14571: /*
14572: ** The following routines implement the various date and time functions
14573: ** of SQLite.
14574: */
14575:
14576: /*
14577: ** julianday( TIMESTRING, MOD, MOD, ...)
14578: **
14579: ** Return the julian day number of the date specified in the arguments
14580: */
14581: static void juliandayFunc(
14582: sqlite3_context *context,
14583: int argc,
14584: sqlite3_value **argv
14585: ){
14586: DateTime x;
14587: if( isDate(context, argc, argv, &x)==0 ){
14588: computeJD(&x);
14589: sqlite3_result_double(context, x.iJD/86400000.0);
14590: }
14591: }
14592:
14593: /*
14594: ** datetime( TIMESTRING, MOD, MOD, ...)
14595: **
14596: ** Return YYYY-MM-DD HH:MM:SS
14597: */
14598: static void datetimeFunc(
14599: sqlite3_context *context,
14600: int argc,
14601: sqlite3_value **argv
14602: ){
14603: DateTime x;
14604: if( isDate(context, argc, argv, &x)==0 ){
14605: char zBuf[100];
14606: computeYMD_HMS(&x);
14607: sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d",
14608: x.Y, x.M, x.D, x.h, x.m, (int)(x.s));
14609: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14610: }
14611: }
14612:
14613: /*
14614: ** time( TIMESTRING, MOD, MOD, ...)
14615: **
14616: ** Return HH:MM:SS
14617: */
14618: static void timeFunc(
14619: sqlite3_context *context,
14620: int argc,
14621: sqlite3_value **argv
14622: ){
14623: DateTime x;
14624: if( isDate(context, argc, argv, &x)==0 ){
14625: char zBuf[100];
14626: computeHMS(&x);
14627: sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s);
14628: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14629: }
14630: }
14631:
14632: /*
14633: ** date( TIMESTRING, MOD, MOD, ...)
14634: **
14635: ** Return YYYY-MM-DD
14636: */
14637: static void dateFunc(
14638: sqlite3_context *context,
14639: int argc,
14640: sqlite3_value **argv
14641: ){
14642: DateTime x;
14643: if( isDate(context, argc, argv, &x)==0 ){
14644: char zBuf[100];
14645: computeYMD(&x);
14646: sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D);
14647: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14648: }
14649: }
14650:
14651: /*
14652: ** strftime( FORMAT, TIMESTRING, MOD, MOD, ...)
14653: **
14654: ** Return a string described by FORMAT. Conversions as follows:
14655: **
14656: ** %d day of month
14657: ** %f ** fractional seconds SS.SSS
14658: ** %H hour 00-24
14659: ** %j day of year 000-366
14660: ** %J ** Julian day number
14661: ** %m month 01-12
14662: ** %M minute 00-59
14663: ** %s seconds since 1970-01-01
14664: ** %S seconds 00-59
14665: ** %w day of week 0-6 sunday==0
14666: ** %W week of year 00-53
14667: ** %Y year 0000-9999
14668: ** %% %
14669: */
14670: static void strftimeFunc(
14671: sqlite3_context *context,
14672: int argc,
14673: sqlite3_value **argv
14674: ){
14675: DateTime x;
14676: u64 n;
14677: size_t i,j;
14678: char *z;
14679: sqlite3 *db;
14680: const char *zFmt = (const char*)sqlite3_value_text(argv[0]);
14681: char zBuf[100];
14682: if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return;
14683: db = sqlite3_context_db_handle(context);
14684: for(i=0, n=1; zFmt[i]; i++, n++){
14685: if( zFmt[i]=='%' ){
14686: switch( zFmt[i+1] ){
14687: case 'd':
14688: case 'H':
14689: case 'm':
14690: case 'M':
14691: case 'S':
14692: case 'W':
14693: n++;
14694: /* fall thru */
14695: case 'w':
14696: case '%':
14697: break;
14698: case 'f':
14699: n += 8;
14700: break;
14701: case 'j':
14702: n += 3;
14703: break;
14704: case 'Y':
14705: n += 8;
14706: break;
14707: case 's':
14708: case 'J':
14709: n += 50;
14710: break;
14711: default:
14712: return; /* ERROR. return a NULL */
14713: }
14714: i++;
14715: }
14716: }
14717: testcase( n==sizeof(zBuf)-1 );
14718: testcase( n==sizeof(zBuf) );
14719: testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
14720: testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] );
14721: if( n<sizeof(zBuf) ){
14722: z = zBuf;
14723: }else if( n>(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){
14724: sqlite3_result_error_toobig(context);
14725: return;
14726: }else{
14727: z = sqlite3DbMallocRaw(db, (int)n);
14728: if( z==0 ){
14729: sqlite3_result_error_nomem(context);
14730: return;
14731: }
14732: }
14733: computeJD(&x);
14734: computeYMD_HMS(&x);
14735: for(i=j=0; zFmt[i]; i++){
14736: if( zFmt[i]!='%' ){
14737: z[j++] = zFmt[i];
14738: }else{
14739: i++;
14740: switch( zFmt[i] ){
14741: case 'd': sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break;
14742: case 'f': {
14743: double s = x.s;
14744: if( s>59.999 ) s = 59.999;
14745: sqlite3_snprintf(7, &z[j],"%06.3f", s);
14746: j += sqlite3Strlen30(&z[j]);
14747: break;
14748: }
14749: case 'H': sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break;
14750: case 'W': /* Fall thru */
14751: case 'j': {
14752: int nDay; /* Number of days since 1st day of year */
14753: DateTime y = x;
14754: y.validJD = 0;
14755: y.M = 1;
14756: y.D = 1;
14757: computeJD(&y);
14758: nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
14759: if( zFmt[i]=='W' ){
14760: int wd; /* 0=Monday, 1=Tuesday, ... 6=Sunday */
14761: wd = (int)(((x.iJD+43200000)/86400000)%7);
14762: sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7);
14763: j += 2;
14764: }else{
14765: sqlite3_snprintf(4, &z[j],"%03d",nDay+1);
14766: j += 3;
14767: }
14768: break;
14769: }
14770: case 'J': {
14771: sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0);
14772: j+=sqlite3Strlen30(&z[j]);
14773: break;
14774: }
14775: case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
14776: case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
14777: case 's': {
14778: sqlite3_snprintf(30,&z[j],"%lld",
14779: (i64)(x.iJD/1000 - 21086676*(i64)10000));
14780: j += sqlite3Strlen30(&z[j]);
14781: break;
14782: }
14783: case 'S': sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break;
14784: case 'w': {
14785: z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0';
14786: break;
14787: }
14788: case 'Y': {
14789: sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]);
14790: break;
14791: }
14792: default: z[j++] = '%'; break;
14793: }
14794: }
14795: }
14796: z[j] = 0;
14797: sqlite3_result_text(context, z, -1,
14798: z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC);
14799: }
14800:
14801: /*
14802: ** current_time()
14803: **
14804: ** This function returns the same value as time('now').
14805: */
14806: static void ctimeFunc(
14807: sqlite3_context *context,
14808: int NotUsed,
14809: sqlite3_value **NotUsed2
14810: ){
14811: UNUSED_PARAMETER2(NotUsed, NotUsed2);
14812: timeFunc(context, 0, 0);
14813: }
14814:
14815: /*
14816: ** current_date()
14817: **
14818: ** This function returns the same value as date('now').
14819: */
14820: static void cdateFunc(
14821: sqlite3_context *context,
14822: int NotUsed,
14823: sqlite3_value **NotUsed2
14824: ){
14825: UNUSED_PARAMETER2(NotUsed, NotUsed2);
14826: dateFunc(context, 0, 0);
14827: }
14828:
14829: /*
14830: ** current_timestamp()
14831: **
14832: ** This function returns the same value as datetime('now').
14833: */
14834: static void ctimestampFunc(
14835: sqlite3_context *context,
14836: int NotUsed,
14837: sqlite3_value **NotUsed2
14838: ){
14839: UNUSED_PARAMETER2(NotUsed, NotUsed2);
14840: datetimeFunc(context, 0, 0);
14841: }
14842: #endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */
14843:
14844: #ifdef SQLITE_OMIT_DATETIME_FUNCS
14845: /*
14846: ** If the library is compiled to omit the full-scale date and time
14847: ** handling (to get a smaller binary), the following minimal version
14848: ** of the functions current_time(), current_date() and current_timestamp()
14849: ** are included instead. This is to support column declarations that
14850: ** include "DEFAULT CURRENT_TIME" etc.
14851: **
14852: ** This function uses the C-library functions time(), gmtime()
14853: ** and strftime(). The format string to pass to strftime() is supplied
14854: ** as the user-data for the function.
14855: */
14856: static void currentTimeFunc(
14857: sqlite3_context *context,
14858: int argc,
14859: sqlite3_value **argv
14860: ){
14861: time_t t;
14862: char *zFormat = (char *)sqlite3_user_data(context);
14863: sqlite3 *db;
14864: sqlite3_int64 iT;
14865: struct tm *pTm;
14866: struct tm sNow;
14867: char zBuf[20];
14868:
14869: UNUSED_PARAMETER(argc);
14870: UNUSED_PARAMETER(argv);
14871:
14872: db = sqlite3_context_db_handle(context);
14873: if( sqlite3OsCurrentTimeInt64(db->pVfs, &iT) ) return;
14874: t = iT/1000 - 10000*(sqlite3_int64)21086676;
14875: #ifdef HAVE_GMTIME_R
14876: pTm = gmtime_r(&t, &sNow);
14877: #else
14878: sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14879: pTm = gmtime(&t);
14880: if( pTm ) memcpy(&sNow, pTm, sizeof(sNow));
14881: sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
14882: #endif
14883: if( pTm ){
14884: strftime(zBuf, 20, zFormat, &sNow);
14885: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
14886: }
14887: }
14888: #endif
14889:
14890: /*
14891: ** This function registered all of the above C functions as SQL
14892: ** functions. This should be the only routine in this file with
14893: ** external linkage.
14894: */
14895: SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){
14896: static SQLITE_WSD FuncDef aDateTimeFuncs[] = {
14897: #ifndef SQLITE_OMIT_DATETIME_FUNCS
14898: FUNCTION(julianday, -1, 0, 0, juliandayFunc ),
14899: FUNCTION(date, -1, 0, 0, dateFunc ),
14900: FUNCTION(time, -1, 0, 0, timeFunc ),
14901: FUNCTION(datetime, -1, 0, 0, datetimeFunc ),
14902: FUNCTION(strftime, -1, 0, 0, strftimeFunc ),
14903: FUNCTION(current_time, 0, 0, 0, ctimeFunc ),
14904: FUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc),
14905: FUNCTION(current_date, 0, 0, 0, cdateFunc ),
14906: #else
14907: STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc),
14908: STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc),
14909: STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc),
14910: #endif
14911: };
14912: int i;
14913: FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
14914: FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs);
14915:
14916: for(i=0; i<ArraySize(aDateTimeFuncs); i++){
14917: sqlite3FuncDefInsert(pHash, &aFunc[i]);
14918: }
14919: }
14920:
14921: /************** End of date.c ************************************************/
14922: /************** Begin file os.c **********************************************/
14923: /*
14924: ** 2005 November 29
14925: **
14926: ** The author disclaims copyright to this source code. In place of
14927: ** a legal notice, here is a blessing:
14928: **
14929: ** May you do good and not evil.
14930: ** May you find forgiveness for yourself and forgive others.
14931: ** May you share freely, never taking more than you give.
14932: **
14933: ******************************************************************************
14934: **
14935: ** This file contains OS interface code that is common to all
14936: ** architectures.
14937: */
14938: #define _SQLITE_OS_C_ 1
14939: #undef _SQLITE_OS_C_
14940:
14941: /*
14942: ** The default SQLite sqlite3_vfs implementations do not allocate
14943: ** memory (actually, os_unix.c allocates a small amount of memory
14944: ** from within OsOpen()), but some third-party implementations may.
14945: ** So we test the effects of a malloc() failing and the sqlite3OsXXX()
14946: ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro.
14947: **
14948: ** The following functions are instrumented for malloc() failure
14949: ** testing:
14950: **
14951: ** sqlite3OsRead()
14952: ** sqlite3OsWrite()
14953: ** sqlite3OsSync()
14954: ** sqlite3OsFileSize()
14955: ** sqlite3OsLock()
14956: ** sqlite3OsCheckReservedLock()
14957: ** sqlite3OsFileControl()
14958: ** sqlite3OsShmMap()
14959: ** sqlite3OsOpen()
14960: ** sqlite3OsDelete()
14961: ** sqlite3OsAccess()
14962: ** sqlite3OsFullPathname()
14963: **
14964: */
14965: #if defined(SQLITE_TEST)
14966: SQLITE_API int sqlite3_memdebug_vfs_oom_test = 1;
14967: #define DO_OS_MALLOC_TEST(x) \
14968: if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \
14969: void *pTstAlloc = sqlite3Malloc(10); \
14970: if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \
14971: sqlite3_free(pTstAlloc); \
14972: }
14973: #else
14974: #define DO_OS_MALLOC_TEST(x)
14975: #endif
14976:
14977: /*
14978: ** The following routines are convenience wrappers around methods
14979: ** of the sqlite3_file object. This is mostly just syntactic sugar. All
14980: ** of this would be completely automatic if SQLite were coded using
14981: ** C++ instead of plain old C.
14982: */
14983: SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file *pId){
14984: int rc = SQLITE_OK;
14985: if( pId->pMethods ){
14986: rc = pId->pMethods->xClose(pId);
14987: pId->pMethods = 0;
14988: }
14989: return rc;
14990: }
14991: SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){
14992: DO_OS_MALLOC_TEST(id);
14993: return id->pMethods->xRead(id, pBuf, amt, offset);
14994: }
14995: SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file *id, const void *pBuf, int amt, i64 offset){
14996: DO_OS_MALLOC_TEST(id);
14997: return id->pMethods->xWrite(id, pBuf, amt, offset);
14998: }
14999: SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){
15000: return id->pMethods->xTruncate(id, size);
15001: }
15002: SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){
15003: DO_OS_MALLOC_TEST(id);
15004: return id->pMethods->xSync(id, flags);
15005: }
15006: SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){
15007: DO_OS_MALLOC_TEST(id);
15008: return id->pMethods->xFileSize(id, pSize);
15009: }
15010: SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file *id, int lockType){
15011: DO_OS_MALLOC_TEST(id);
15012: return id->pMethods->xLock(id, lockType);
15013: }
15014: SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file *id, int lockType){
15015: return id->pMethods->xUnlock(id, lockType);
15016: }
15017: SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){
15018: DO_OS_MALLOC_TEST(id);
15019: return id->pMethods->xCheckReservedLock(id, pResOut);
15020: }
15021:
15022: /*
15023: ** Use sqlite3OsFileControl() when we are doing something that might fail
15024: ** and we need to know about the failures. Use sqlite3OsFileControlHint()
15025: ** when simply tossing information over the wall to the VFS and we do not
15026: ** really care if the VFS receives and understands the information since it
15027: ** is only a hint and can be safely ignored. The sqlite3OsFileControlHint()
15028: ** routine has no return value since the return value would be meaningless.
15029: */
15030: SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){
15031: DO_OS_MALLOC_TEST(id);
15032: return id->pMethods->xFileControl(id, op, pArg);
15033: }
15034: SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){
15035: (void)id->pMethods->xFileControl(id, op, pArg);
15036: }
15037:
15038: SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){
15039: int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize;
15040: return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE);
15041: }
15042: SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){
15043: return id->pMethods->xDeviceCharacteristics(id);
15044: }
15045: SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){
15046: return id->pMethods->xShmLock(id, offset, n, flags);
15047: }
15048: SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id){
15049: id->pMethods->xShmBarrier(id);
15050: }
15051: SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int deleteFlag){
15052: return id->pMethods->xShmUnmap(id, deleteFlag);
15053: }
15054: SQLITE_PRIVATE int sqlite3OsShmMap(
15055: sqlite3_file *id, /* Database file handle */
15056: int iPage,
15057: int pgsz,
15058: int bExtend, /* True to extend file if necessary */
15059: void volatile **pp /* OUT: Pointer to mapping */
15060: ){
15061: DO_OS_MALLOC_TEST(id);
15062: return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp);
15063: }
15064:
15065: /*
15066: ** The next group of routines are convenience wrappers around the
15067: ** VFS methods.
15068: */
15069: SQLITE_PRIVATE int sqlite3OsOpen(
15070: sqlite3_vfs *pVfs,
15071: const char *zPath,
15072: sqlite3_file *pFile,
15073: int flags,
15074: int *pFlagsOut
15075: ){
15076: int rc;
15077: DO_OS_MALLOC_TEST(0);
15078: /* 0x87f7f is a mask of SQLITE_OPEN_ flags that are valid to be passed
15079: ** down into the VFS layer. Some SQLITE_OPEN_ flags (for example,
15080: ** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before
15081: ** reaching the VFS. */
15082: rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut);
15083: assert( rc==SQLITE_OK || pFile->pMethods==0 );
15084: return rc;
15085: }
15086: SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
15087: DO_OS_MALLOC_TEST(0);
15088: assert( dirSync==0 || dirSync==1 );
15089: return pVfs->xDelete(pVfs, zPath, dirSync);
15090: }
15091: SQLITE_PRIVATE int sqlite3OsAccess(
15092: sqlite3_vfs *pVfs,
15093: const char *zPath,
15094: int flags,
15095: int *pResOut
15096: ){
15097: DO_OS_MALLOC_TEST(0);
15098: return pVfs->xAccess(pVfs, zPath, flags, pResOut);
15099: }
15100: SQLITE_PRIVATE int sqlite3OsFullPathname(
15101: sqlite3_vfs *pVfs,
15102: const char *zPath,
15103: int nPathOut,
15104: char *zPathOut
15105: ){
15106: DO_OS_MALLOC_TEST(0);
15107: zPathOut[0] = 0;
15108: return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut);
15109: }
15110: #ifndef SQLITE_OMIT_LOAD_EXTENSION
15111: SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *pVfs, const char *zPath){
15112: return pVfs->xDlOpen(pVfs, zPath);
15113: }
15114: SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
15115: pVfs->xDlError(pVfs, nByte, zBufOut);
15116: }
15117: SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
15118: return pVfs->xDlSym(pVfs, pHdle, zSym);
15119: }
15120: SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){
15121: pVfs->xDlClose(pVfs, pHandle);
15122: }
15123: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
15124: SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){
15125: return pVfs->xRandomness(pVfs, nByte, zBufOut);
15126: }
15127: SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){
15128: return pVfs->xSleep(pVfs, nMicro);
15129: }
15130: SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){
15131: int rc;
15132: /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64()
15133: ** method to get the current date and time if that method is available
15134: ** (if iVersion is 2 or greater and the function pointer is not NULL) and
15135: ** will fall back to xCurrentTime() if xCurrentTimeInt64() is
15136: ** unavailable.
15137: */
15138: if( pVfs->iVersion>=2 && pVfs->xCurrentTimeInt64 ){
15139: rc = pVfs->xCurrentTimeInt64(pVfs, pTimeOut);
15140: }else{
15141: double r;
15142: rc = pVfs->xCurrentTime(pVfs, &r);
15143: *pTimeOut = (sqlite3_int64)(r*86400000.0);
15144: }
15145: return rc;
15146: }
15147:
15148: SQLITE_PRIVATE int sqlite3OsOpenMalloc(
15149: sqlite3_vfs *pVfs,
15150: const char *zFile,
15151: sqlite3_file **ppFile,
15152: int flags,
15153: int *pOutFlags
15154: ){
15155: int rc = SQLITE_NOMEM;
15156: sqlite3_file *pFile;
15157: pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile);
15158: if( pFile ){
15159: rc = sqlite3OsOpen(pVfs, zFile, pFile, flags, pOutFlags);
15160: if( rc!=SQLITE_OK ){
15161: sqlite3_free(pFile);
15162: }else{
15163: *ppFile = pFile;
15164: }
15165: }
15166: return rc;
15167: }
15168: SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *pFile){
15169: int rc = SQLITE_OK;
15170: assert( pFile );
15171: rc = sqlite3OsClose(pFile);
15172: sqlite3_free(pFile);
15173: return rc;
15174: }
15175:
15176: /*
15177: ** This function is a wrapper around the OS specific implementation of
15178: ** sqlite3_os_init(). The purpose of the wrapper is to provide the
15179: ** ability to simulate a malloc failure, so that the handling of an
15180: ** error in sqlite3_os_init() by the upper layers can be tested.
15181: */
15182: SQLITE_PRIVATE int sqlite3OsInit(void){
15183: void *p = sqlite3_malloc(10);
15184: if( p==0 ) return SQLITE_NOMEM;
15185: sqlite3_free(p);
15186: return sqlite3_os_init();
15187: }
15188:
15189: /*
15190: ** The list of all registered VFS implementations.
15191: */
15192: static sqlite3_vfs * SQLITE_WSD vfsList = 0;
15193: #define vfsList GLOBAL(sqlite3_vfs *, vfsList)
15194:
15195: /*
15196: ** Locate a VFS by name. If no name is given, simply return the
15197: ** first VFS on the list.
15198: */
15199: SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){
15200: sqlite3_vfs *pVfs = 0;
15201: #if SQLITE_THREADSAFE
15202: sqlite3_mutex *mutex;
15203: #endif
15204: #ifndef SQLITE_OMIT_AUTOINIT
15205: int rc = sqlite3_initialize();
15206: if( rc ) return 0;
15207: #endif
15208: #if SQLITE_THREADSAFE
15209: mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
15210: #endif
15211: sqlite3_mutex_enter(mutex);
15212: for(pVfs = vfsList; pVfs; pVfs=pVfs->pNext){
15213: if( zVfs==0 ) break;
15214: if( strcmp(zVfs, pVfs->zName)==0 ) break;
15215: }
15216: sqlite3_mutex_leave(mutex);
15217: return pVfs;
15218: }
15219:
15220: /*
15221: ** Unlink a VFS from the linked list
15222: */
15223: static void vfsUnlink(sqlite3_vfs *pVfs){
15224: assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) );
15225: if( pVfs==0 ){
15226: /* No-op */
15227: }else if( vfsList==pVfs ){
15228: vfsList = pVfs->pNext;
15229: }else if( vfsList ){
15230: sqlite3_vfs *p = vfsList;
15231: while( p->pNext && p->pNext!=pVfs ){
15232: p = p->pNext;
15233: }
15234: if( p->pNext==pVfs ){
15235: p->pNext = pVfs->pNext;
15236: }
15237: }
15238: }
15239:
15240: /*
15241: ** Register a VFS with the system. It is harmless to register the same
15242: ** VFS multiple times. The new VFS becomes the default if makeDflt is
15243: ** true.
15244: */
15245: SQLITE_API int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
15246: MUTEX_LOGIC(sqlite3_mutex *mutex;)
15247: #ifndef SQLITE_OMIT_AUTOINIT
15248: int rc = sqlite3_initialize();
15249: if( rc ) return rc;
15250: #endif
15251: MUTEX_LOGIC( mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
15252: sqlite3_mutex_enter(mutex);
15253: vfsUnlink(pVfs);
15254: if( makeDflt || vfsList==0 ){
15255: pVfs->pNext = vfsList;
15256: vfsList = pVfs;
15257: }else{
15258: pVfs->pNext = vfsList->pNext;
15259: vfsList->pNext = pVfs;
15260: }
15261: assert(vfsList);
15262: sqlite3_mutex_leave(mutex);
15263: return SQLITE_OK;
15264: }
15265:
15266: /*
15267: ** Unregister a VFS so that it is no longer accessible.
15268: */
15269: SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){
15270: #if SQLITE_THREADSAFE
15271: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
15272: #endif
15273: sqlite3_mutex_enter(mutex);
15274: vfsUnlink(pVfs);
15275: sqlite3_mutex_leave(mutex);
15276: return SQLITE_OK;
15277: }
15278:
15279: /************** End of os.c **************************************************/
15280: /************** Begin file fault.c *******************************************/
15281: /*
15282: ** 2008 Jan 22
15283: **
15284: ** The author disclaims copyright to this source code. In place of
15285: ** a legal notice, here is a blessing:
15286: **
15287: ** May you do good and not evil.
15288: ** May you find forgiveness for yourself and forgive others.
15289: ** May you share freely, never taking more than you give.
15290: **
15291: *************************************************************************
15292: **
15293: ** This file contains code to support the concept of "benign"
15294: ** malloc failures (when the xMalloc() or xRealloc() method of the
15295: ** sqlite3_mem_methods structure fails to allocate a block of memory
15296: ** and returns 0).
15297: **
15298: ** Most malloc failures are non-benign. After they occur, SQLite
15299: ** abandons the current operation and returns an error code (usually
15300: ** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily
15301: ** fatal. For example, if a malloc fails while resizing a hash table, this
15302: ** is completely recoverable simply by not carrying out the resize. The
15303: ** hash table will continue to function normally. So a malloc failure
15304: ** during a hash table resize is a benign fault.
15305: */
15306:
15307:
15308: #ifndef SQLITE_OMIT_BUILTIN_TEST
15309:
15310: /*
15311: ** Global variables.
15312: */
15313: typedef struct BenignMallocHooks BenignMallocHooks;
15314: static SQLITE_WSD struct BenignMallocHooks {
15315: void (*xBenignBegin)(void);
15316: void (*xBenignEnd)(void);
15317: } sqlite3Hooks = { 0, 0 };
15318:
15319: /* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks
15320: ** structure. If writable static data is unsupported on the target,
15321: ** we have to locate the state vector at run-time. In the more common
15322: ** case where writable static data is supported, wsdHooks can refer directly
15323: ** to the "sqlite3Hooks" state vector declared above.
15324: */
15325: #ifdef SQLITE_OMIT_WSD
15326: # define wsdHooksInit \
15327: BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks)
15328: # define wsdHooks x[0]
15329: #else
15330: # define wsdHooksInit
15331: # define wsdHooks sqlite3Hooks
15332: #endif
15333:
15334:
15335: /*
15336: ** Register hooks to call when sqlite3BeginBenignMalloc() and
15337: ** sqlite3EndBenignMalloc() are called, respectively.
15338: */
15339: SQLITE_PRIVATE void sqlite3BenignMallocHooks(
15340: void (*xBenignBegin)(void),
15341: void (*xBenignEnd)(void)
15342: ){
15343: wsdHooksInit;
15344: wsdHooks.xBenignBegin = xBenignBegin;
15345: wsdHooks.xBenignEnd = xBenignEnd;
15346: }
15347:
15348: /*
15349: ** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that
15350: ** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc()
15351: ** indicates that subsequent malloc failures are non-benign.
15352: */
15353: SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void){
15354: wsdHooksInit;
15355: if( wsdHooks.xBenignBegin ){
15356: wsdHooks.xBenignBegin();
15357: }
15358: }
15359: SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){
15360: wsdHooksInit;
15361: if( wsdHooks.xBenignEnd ){
15362: wsdHooks.xBenignEnd();
15363: }
15364: }
15365:
15366: #endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */
15367:
15368: /************** End of fault.c ***********************************************/
15369: /************** Begin file mem0.c ********************************************/
15370: /*
15371: ** 2008 October 28
15372: **
15373: ** The author disclaims copyright to this source code. In place of
15374: ** a legal notice, here is a blessing:
15375: **
15376: ** May you do good and not evil.
15377: ** May you find forgiveness for yourself and forgive others.
15378: ** May you share freely, never taking more than you give.
15379: **
15380: *************************************************************************
15381: **
15382: ** This file contains a no-op memory allocation drivers for use when
15383: ** SQLITE_ZERO_MALLOC is defined. The allocation drivers implemented
15384: ** here always fail. SQLite will not operate with these drivers. These
15385: ** are merely placeholders. Real drivers must be substituted using
15386: ** sqlite3_config() before SQLite will operate.
15387: */
15388:
15389: /*
15390: ** This version of the memory allocator is the default. It is
15391: ** used when no other memory allocator is specified using compile-time
15392: ** macros.
15393: */
15394: #ifdef SQLITE_ZERO_MALLOC
15395:
15396: /*
15397: ** No-op versions of all memory allocation routines
15398: */
15399: static void *sqlite3MemMalloc(int nByte){ return 0; }
15400: static void sqlite3MemFree(void *pPrior){ return; }
15401: static void *sqlite3MemRealloc(void *pPrior, int nByte){ return 0; }
15402: static int sqlite3MemSize(void *pPrior){ return 0; }
15403: static int sqlite3MemRoundup(int n){ return n; }
15404: static int sqlite3MemInit(void *NotUsed){ return SQLITE_OK; }
15405: static void sqlite3MemShutdown(void *NotUsed){ return; }
15406:
15407: /*
15408: ** This routine is the only routine in this file with external linkage.
15409: **
15410: ** Populate the low-level memory allocation function pointers in
15411: ** sqlite3GlobalConfig.m with pointers to the routines in this file.
15412: */
15413: SQLITE_PRIVATE void sqlite3MemSetDefault(void){
15414: static const sqlite3_mem_methods defaultMethods = {
15415: sqlite3MemMalloc,
15416: sqlite3MemFree,
15417: sqlite3MemRealloc,
15418: sqlite3MemSize,
15419: sqlite3MemRoundup,
15420: sqlite3MemInit,
15421: sqlite3MemShutdown,
15422: 0
15423: };
15424: sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
15425: }
15426:
15427: #endif /* SQLITE_ZERO_MALLOC */
15428:
15429: /************** End of mem0.c ************************************************/
15430: /************** Begin file mem1.c ********************************************/
15431: /*
15432: ** 2007 August 14
15433: **
15434: ** The author disclaims copyright to this source code. In place of
15435: ** a legal notice, here is a blessing:
15436: **
15437: ** May you do good and not evil.
15438: ** May you find forgiveness for yourself and forgive others.
15439: ** May you share freely, never taking more than you give.
15440: **
15441: *************************************************************************
15442: **
15443: ** This file contains low-level memory allocation drivers for when
15444: ** SQLite will use the standard C-library malloc/realloc/free interface
15445: ** to obtain the memory it needs.
15446: **
15447: ** This file contains implementations of the low-level memory allocation
1.2.2.1 ! misho 15448: ** routines specified in the sqlite3_mem_methods object. The content of
! 15449: ** this file is only used if SQLITE_SYSTEM_MALLOC is defined. The
! 15450: ** SQLITE_SYSTEM_MALLOC macro is defined automatically if neither the
! 15451: ** SQLITE_MEMDEBUG nor the SQLITE_WIN32_MALLOC macros are defined. The
! 15452: ** default configuration is to use memory allocation routines in this
! 15453: ** file.
! 15454: **
! 15455: ** C-preprocessor macro summary:
! 15456: **
! 15457: ** HAVE_MALLOC_USABLE_SIZE The configure script sets this symbol if
! 15458: ** the malloc_usable_size() interface exists
! 15459: ** on the target platform. Or, this symbol
! 15460: ** can be set manually, if desired.
! 15461: ** If an equivalent interface exists by
! 15462: ** a different name, using a separate -D
! 15463: ** option to rename it.
! 15464: **
! 15465: ** SQLITE_WITHOUT_ZONEMALLOC Some older macs lack support for the zone
! 15466: ** memory allocator. Set this symbol to enable
! 15467: ** building on older macs.
! 15468: **
! 15469: ** SQLITE_WITHOUT_MSIZE Set this symbol to disable the use of
! 15470: ** _msize() on windows systems. This might
! 15471: ** be necessary when compiling for Delphi,
! 15472: ** for example.
1.2 misho 15473: */
15474:
15475: /*
15476: ** This version of the memory allocator is the default. It is
15477: ** used when no other memory allocator is specified using compile-time
15478: ** macros.
15479: */
15480: #ifdef SQLITE_SYSTEM_MALLOC
15481:
15482: /*
1.2.2.1 ! misho 15483: ** The MSVCRT has malloc_usable_size() but it is called _msize().
! 15484: ** The use of _msize() is automatic, but can be disabled by compiling
! 15485: ** with -DSQLITE_WITHOUT_MSIZE
1.2 misho 15486: */
1.2.2.1 ! misho 15487: #if defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)
! 15488: # define SQLITE_MALLOCSIZE _msize
1.2 misho 15489: #endif
15490:
1.2.2.1 ! misho 15491: #if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
1.2 misho 15492:
15493: /*
1.2.2.1 ! misho 15494: ** Use the zone allocator available on apple products unless the
! 15495: ** SQLITE_WITHOUT_ZONEMALLOC symbol is defined.
1.2 misho 15496: */
15497: #include <sys/sysctl.h>
15498: #include <malloc/malloc.h>
15499: #include <libkern/OSAtomic.h>
15500: static malloc_zone_t* _sqliteZone_;
15501: #define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x))
15502: #define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x));
15503: #define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y))
15504: #define SQLITE_MALLOCSIZE(x) \
15505: (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x))
15506:
15507: #else /* if not __APPLE__ */
15508:
15509: /*
1.2.2.1 ! misho 15510: ** Use standard C library malloc and free on non-Apple systems.
! 15511: ** Also used by Apple systems if SQLITE_WITHOUT_ZONEMALLOC is defined.
1.2 misho 15512: */
15513: #define SQLITE_MALLOC(x) malloc(x)
15514: #define SQLITE_FREE(x) free(x)
15515: #define SQLITE_REALLOC(x,y) realloc((x),(y))
15516:
1.2.2.1 ! misho 15517: #if (defined(_MSC_VER) && !defined(SQLITE_WITHOUT_MSIZE)) \
! 15518: || (defined(HAVE_MALLOC_H) && defined(HAVE_MALLOC_USABLE_SIZE))
! 15519: # include <malloc.h> /* Needed for malloc_usable_size on linux */
! 15520: #endif
1.2 misho 15521: #ifdef HAVE_MALLOC_USABLE_SIZE
1.2.2.1 ! misho 15522: # ifndef SQLITE_MALLOCSIZE
! 15523: # define SQLITE_MALLOCSIZE(x) malloc_usable_size(x)
! 15524: # endif
1.2 misho 15525: #else
1.2.2.1 ! misho 15526: # undef SQLITE_MALLOCSIZE
1.2 misho 15527: #endif
15528:
15529: #endif /* __APPLE__ or not __APPLE__ */
15530:
15531: /*
15532: ** Like malloc(), but remember the size of the allocation
15533: ** so that we can find it later using sqlite3MemSize().
15534: **
15535: ** For this low-level routine, we are guaranteed that nByte>0 because
15536: ** cases of nByte<=0 will be intercepted and dealt with by higher level
15537: ** routines.
15538: */
15539: static void *sqlite3MemMalloc(int nByte){
15540: #ifdef SQLITE_MALLOCSIZE
15541: void *p = SQLITE_MALLOC( nByte );
15542: if( p==0 ){
15543: testcase( sqlite3GlobalConfig.xLog!=0 );
15544: sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
15545: }
15546: return p;
15547: #else
15548: sqlite3_int64 *p;
15549: assert( nByte>0 );
15550: nByte = ROUND8(nByte);
15551: p = SQLITE_MALLOC( nByte+8 );
15552: if( p ){
15553: p[0] = nByte;
15554: p++;
15555: }else{
15556: testcase( sqlite3GlobalConfig.xLog!=0 );
15557: sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte);
15558: }
15559: return (void *)p;
15560: #endif
15561: }
15562:
15563: /*
15564: ** Like free() but works for allocations obtained from sqlite3MemMalloc()
15565: ** or sqlite3MemRealloc().
15566: **
15567: ** For this low-level routine, we already know that pPrior!=0 since
15568: ** cases where pPrior==0 will have been intecepted and dealt with
15569: ** by higher-level routines.
15570: */
15571: static void sqlite3MemFree(void *pPrior){
15572: #ifdef SQLITE_MALLOCSIZE
15573: SQLITE_FREE(pPrior);
15574: #else
15575: sqlite3_int64 *p = (sqlite3_int64*)pPrior;
15576: assert( pPrior!=0 );
15577: p--;
15578: SQLITE_FREE(p);
15579: #endif
15580: }
15581:
15582: /*
15583: ** Report the allocated size of a prior return from xMalloc()
15584: ** or xRealloc().
15585: */
15586: static int sqlite3MemSize(void *pPrior){
15587: #ifdef SQLITE_MALLOCSIZE
15588: return pPrior ? (int)SQLITE_MALLOCSIZE(pPrior) : 0;
15589: #else
15590: sqlite3_int64 *p;
15591: if( pPrior==0 ) return 0;
15592: p = (sqlite3_int64*)pPrior;
15593: p--;
15594: return (int)p[0];
15595: #endif
15596: }
15597:
15598: /*
15599: ** Like realloc(). Resize an allocation previously obtained from
15600: ** sqlite3MemMalloc().
15601: **
15602: ** For this low-level interface, we know that pPrior!=0. Cases where
15603: ** pPrior==0 while have been intercepted by higher-level routine and
15604: ** redirected to xMalloc. Similarly, we know that nByte>0 becauses
15605: ** cases where nByte<=0 will have been intercepted by higher-level
15606: ** routines and redirected to xFree.
15607: */
15608: static void *sqlite3MemRealloc(void *pPrior, int nByte){
15609: #ifdef SQLITE_MALLOCSIZE
15610: void *p = SQLITE_REALLOC(pPrior, nByte);
15611: if( p==0 ){
15612: testcase( sqlite3GlobalConfig.xLog!=0 );
15613: sqlite3_log(SQLITE_NOMEM,
15614: "failed memory resize %u to %u bytes",
15615: SQLITE_MALLOCSIZE(pPrior), nByte);
15616: }
15617: return p;
15618: #else
15619: sqlite3_int64 *p = (sqlite3_int64*)pPrior;
15620: assert( pPrior!=0 && nByte>0 );
15621: assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */
15622: p--;
15623: p = SQLITE_REALLOC(p, nByte+8 );
15624: if( p ){
15625: p[0] = nByte;
15626: p++;
15627: }else{
15628: testcase( sqlite3GlobalConfig.xLog!=0 );
15629: sqlite3_log(SQLITE_NOMEM,
15630: "failed memory resize %u to %u bytes",
15631: sqlite3MemSize(pPrior), nByte);
15632: }
15633: return (void*)p;
15634: #endif
15635: }
15636:
15637: /*
15638: ** Round up a request size to the next valid allocation size.
15639: */
15640: static int sqlite3MemRoundup(int n){
15641: return ROUND8(n);
15642: }
15643:
15644: /*
15645: ** Initialize this module.
15646: */
15647: static int sqlite3MemInit(void *NotUsed){
1.2.2.1 ! misho 15648: #if defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC)
1.2 misho 15649: int cpuCount;
15650: size_t len;
15651: if( _sqliteZone_ ){
15652: return SQLITE_OK;
15653: }
15654: len = sizeof(cpuCount);
15655: /* One usually wants to use hw.acctivecpu for MT decisions, but not here */
15656: sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0);
15657: if( cpuCount>1 ){
15658: /* defer MT decisions to system malloc */
15659: _sqliteZone_ = malloc_default_zone();
15660: }else{
15661: /* only 1 core, use our own zone to contention over global locks,
15662: ** e.g. we have our own dedicated locks */
1.2.2.1 ! misho 15663: bool success;
1.2 misho 15664: malloc_zone_t* newzone = malloc_create_zone(4096, 0);
15665: malloc_set_zone_name(newzone, "Sqlite_Heap");
15666: do{
15667: success = OSAtomicCompareAndSwapPtrBarrier(NULL, newzone,
15668: (void * volatile *)&_sqliteZone_);
15669: }while(!_sqliteZone_);
1.2.2.1 ! misho 15670: if( !success ){
1.2 misho 15671: /* somebody registered a zone first */
15672: malloc_destroy_zone(newzone);
15673: }
15674: }
15675: #endif
15676: UNUSED_PARAMETER(NotUsed);
15677: return SQLITE_OK;
15678: }
15679:
15680: /*
15681: ** Deinitialize this module.
15682: */
15683: static void sqlite3MemShutdown(void *NotUsed){
15684: UNUSED_PARAMETER(NotUsed);
15685: return;
15686: }
15687:
15688: /*
15689: ** This routine is the only routine in this file with external linkage.
15690: **
15691: ** Populate the low-level memory allocation function pointers in
15692: ** sqlite3GlobalConfig.m with pointers to the routines in this file.
15693: */
15694: SQLITE_PRIVATE void sqlite3MemSetDefault(void){
15695: static const sqlite3_mem_methods defaultMethods = {
15696: sqlite3MemMalloc,
15697: sqlite3MemFree,
15698: sqlite3MemRealloc,
15699: sqlite3MemSize,
15700: sqlite3MemRoundup,
15701: sqlite3MemInit,
15702: sqlite3MemShutdown,
15703: 0
15704: };
15705: sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
15706: }
15707:
15708: #endif /* SQLITE_SYSTEM_MALLOC */
15709:
15710: /************** End of mem1.c ************************************************/
15711: /************** Begin file mem2.c ********************************************/
15712: /*
15713: ** 2007 August 15
15714: **
15715: ** The author disclaims copyright to this source code. In place of
15716: ** a legal notice, here is a blessing:
15717: **
15718: ** May you do good and not evil.
15719: ** May you find forgiveness for yourself and forgive others.
15720: ** May you share freely, never taking more than you give.
15721: **
15722: *************************************************************************
15723: **
15724: ** This file contains low-level memory allocation drivers for when
15725: ** SQLite will use the standard C-library malloc/realloc/free interface
15726: ** to obtain the memory it needs while adding lots of additional debugging
15727: ** information to each allocation in order to help detect and fix memory
15728: ** leaks and memory usage errors.
15729: **
15730: ** This file contains implementations of the low-level memory allocation
15731: ** routines specified in the sqlite3_mem_methods object.
15732: */
15733:
15734: /*
15735: ** This version of the memory allocator is used only if the
15736: ** SQLITE_MEMDEBUG macro is defined
15737: */
15738: #ifdef SQLITE_MEMDEBUG
15739:
15740: /*
15741: ** The backtrace functionality is only available with GLIBC
15742: */
15743: #ifdef __GLIBC__
15744: extern int backtrace(void**,int);
15745: extern void backtrace_symbols_fd(void*const*,int,int);
15746: #else
15747: # define backtrace(A,B) 1
15748: # define backtrace_symbols_fd(A,B,C)
15749: #endif
15750: /* #include <stdio.h> */
15751:
15752: /*
15753: ** Each memory allocation looks like this:
15754: **
15755: ** ------------------------------------------------------------------------
15756: ** | Title | backtrace pointers | MemBlockHdr | allocation | EndGuard |
15757: ** ------------------------------------------------------------------------
15758: **
15759: ** The application code sees only a pointer to the allocation. We have
15760: ** to back up from the allocation pointer to find the MemBlockHdr. The
15761: ** MemBlockHdr tells us the size of the allocation and the number of
15762: ** backtrace pointers. There is also a guard word at the end of the
15763: ** MemBlockHdr.
15764: */
15765: struct MemBlockHdr {
15766: i64 iSize; /* Size of this allocation */
15767: struct MemBlockHdr *pNext, *pPrev; /* Linked list of all unfreed memory */
15768: char nBacktrace; /* Number of backtraces on this alloc */
15769: char nBacktraceSlots; /* Available backtrace slots */
15770: u8 nTitle; /* Bytes of title; includes '\0' */
15771: u8 eType; /* Allocation type code */
15772: int iForeGuard; /* Guard word for sanity */
15773: };
15774:
15775: /*
15776: ** Guard words
15777: */
15778: #define FOREGUARD 0x80F5E153
15779: #define REARGUARD 0xE4676B53
15780:
15781: /*
15782: ** Number of malloc size increments to track.
15783: */
15784: #define NCSIZE 1000
15785:
15786: /*
15787: ** All of the static variables used by this module are collected
15788: ** into a single structure named "mem". This is to keep the
15789: ** static variables organized and to reduce namespace pollution
15790: ** when this module is combined with other in the amalgamation.
15791: */
15792: static struct {
15793:
15794: /*
15795: ** Mutex to control access to the memory allocation subsystem.
15796: */
15797: sqlite3_mutex *mutex;
15798:
15799: /*
15800: ** Head and tail of a linked list of all outstanding allocations
15801: */
15802: struct MemBlockHdr *pFirst;
15803: struct MemBlockHdr *pLast;
15804:
15805: /*
15806: ** The number of levels of backtrace to save in new allocations.
15807: */
15808: int nBacktrace;
15809: void (*xBacktrace)(int, int, void **);
15810:
15811: /*
15812: ** Title text to insert in front of each block
15813: */
15814: int nTitle; /* Bytes of zTitle to save. Includes '\0' and padding */
15815: char zTitle[100]; /* The title text */
15816:
15817: /*
15818: ** sqlite3MallocDisallow() increments the following counter.
15819: ** sqlite3MallocAllow() decrements it.
15820: */
15821: int disallow; /* Do not allow memory allocation */
15822:
15823: /*
15824: ** Gather statistics on the sizes of memory allocations.
15825: ** nAlloc[i] is the number of allocation attempts of i*8
15826: ** bytes. i==NCSIZE is the number of allocation attempts for
15827: ** sizes more than NCSIZE*8 bytes.
15828: */
15829: int nAlloc[NCSIZE]; /* Total number of allocations */
15830: int nCurrent[NCSIZE]; /* Current number of allocations */
15831: int mxCurrent[NCSIZE]; /* Highwater mark for nCurrent */
15832:
15833: } mem;
15834:
15835:
15836: /*
15837: ** Adjust memory usage statistics
15838: */
15839: static void adjustStats(int iSize, int increment){
15840: int i = ROUND8(iSize)/8;
15841: if( i>NCSIZE-1 ){
15842: i = NCSIZE - 1;
15843: }
15844: if( increment>0 ){
15845: mem.nAlloc[i]++;
15846: mem.nCurrent[i]++;
15847: if( mem.nCurrent[i]>mem.mxCurrent[i] ){
15848: mem.mxCurrent[i] = mem.nCurrent[i];
15849: }
15850: }else{
15851: mem.nCurrent[i]--;
15852: assert( mem.nCurrent[i]>=0 );
15853: }
15854: }
15855:
15856: /*
15857: ** Given an allocation, find the MemBlockHdr for that allocation.
15858: **
15859: ** This routine checks the guards at either end of the allocation and
15860: ** if they are incorrect it asserts.
15861: */
15862: static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){
15863: struct MemBlockHdr *p;
15864: int *pInt;
15865: u8 *pU8;
15866: int nReserve;
15867:
15868: p = (struct MemBlockHdr*)pAllocation;
15869: p--;
15870: assert( p->iForeGuard==(int)FOREGUARD );
15871: nReserve = ROUND8(p->iSize);
15872: pInt = (int*)pAllocation;
15873: pU8 = (u8*)pAllocation;
15874: assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD );
15875: /* This checks any of the "extra" bytes allocated due
15876: ** to rounding up to an 8 byte boundary to ensure
15877: ** they haven't been overwritten.
15878: */
15879: while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 );
15880: return p;
15881: }
15882:
15883: /*
15884: ** Return the number of bytes currently allocated at address p.
15885: */
15886: static int sqlite3MemSize(void *p){
15887: struct MemBlockHdr *pHdr;
15888: if( !p ){
15889: return 0;
15890: }
15891: pHdr = sqlite3MemsysGetHeader(p);
15892: return pHdr->iSize;
15893: }
15894:
15895: /*
15896: ** Initialize the memory allocation subsystem.
15897: */
15898: static int sqlite3MemInit(void *NotUsed){
15899: UNUSED_PARAMETER(NotUsed);
15900: assert( (sizeof(struct MemBlockHdr)&7) == 0 );
15901: if( !sqlite3GlobalConfig.bMemstat ){
15902: /* If memory status is enabled, then the malloc.c wrapper will already
15903: ** hold the STATIC_MEM mutex when the routines here are invoked. */
15904: mem.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
15905: }
15906: return SQLITE_OK;
15907: }
15908:
15909: /*
15910: ** Deinitialize the memory allocation subsystem.
15911: */
15912: static void sqlite3MemShutdown(void *NotUsed){
15913: UNUSED_PARAMETER(NotUsed);
15914: mem.mutex = 0;
15915: }
15916:
15917: /*
15918: ** Round up a request size to the next valid allocation size.
15919: */
15920: static int sqlite3MemRoundup(int n){
15921: return ROUND8(n);
15922: }
15923:
15924: /*
15925: ** Fill a buffer with pseudo-random bytes. This is used to preset
15926: ** the content of a new memory allocation to unpredictable values and
15927: ** to clear the content of a freed allocation to unpredictable values.
15928: */
15929: static void randomFill(char *pBuf, int nByte){
15930: unsigned int x, y, r;
15931: x = SQLITE_PTR_TO_INT(pBuf);
15932: y = nByte | 1;
15933: while( nByte >= 4 ){
15934: x = (x>>1) ^ (-(x&1) & 0xd0000001);
15935: y = y*1103515245 + 12345;
15936: r = x ^ y;
15937: *(int*)pBuf = r;
15938: pBuf += 4;
15939: nByte -= 4;
15940: }
15941: while( nByte-- > 0 ){
15942: x = (x>>1) ^ (-(x&1) & 0xd0000001);
15943: y = y*1103515245 + 12345;
15944: r = x ^ y;
15945: *(pBuf++) = r & 0xff;
15946: }
15947: }
15948:
15949: /*
15950: ** Allocate nByte bytes of memory.
15951: */
15952: static void *sqlite3MemMalloc(int nByte){
15953: struct MemBlockHdr *pHdr;
15954: void **pBt;
15955: char *z;
15956: int *pInt;
15957: void *p = 0;
15958: int totalSize;
15959: int nReserve;
15960: sqlite3_mutex_enter(mem.mutex);
15961: assert( mem.disallow==0 );
15962: nReserve = ROUND8(nByte);
15963: totalSize = nReserve + sizeof(*pHdr) + sizeof(int) +
15964: mem.nBacktrace*sizeof(void*) + mem.nTitle;
15965: p = malloc(totalSize);
15966: if( p ){
15967: z = p;
15968: pBt = (void**)&z[mem.nTitle];
15969: pHdr = (struct MemBlockHdr*)&pBt[mem.nBacktrace];
15970: pHdr->pNext = 0;
15971: pHdr->pPrev = mem.pLast;
15972: if( mem.pLast ){
15973: mem.pLast->pNext = pHdr;
15974: }else{
15975: mem.pFirst = pHdr;
15976: }
15977: mem.pLast = pHdr;
15978: pHdr->iForeGuard = FOREGUARD;
15979: pHdr->eType = MEMTYPE_HEAP;
15980: pHdr->nBacktraceSlots = mem.nBacktrace;
15981: pHdr->nTitle = mem.nTitle;
15982: if( mem.nBacktrace ){
15983: void *aAddr[40];
15984: pHdr->nBacktrace = backtrace(aAddr, mem.nBacktrace+1)-1;
15985: memcpy(pBt, &aAddr[1], pHdr->nBacktrace*sizeof(void*));
15986: assert(pBt[0]);
15987: if( mem.xBacktrace ){
15988: mem.xBacktrace(nByte, pHdr->nBacktrace-1, &aAddr[1]);
15989: }
15990: }else{
15991: pHdr->nBacktrace = 0;
15992: }
15993: if( mem.nTitle ){
15994: memcpy(z, mem.zTitle, mem.nTitle);
15995: }
15996: pHdr->iSize = nByte;
15997: adjustStats(nByte, +1);
15998: pInt = (int*)&pHdr[1];
15999: pInt[nReserve/sizeof(int)] = REARGUARD;
16000: randomFill((char*)pInt, nByte);
16001: memset(((char*)pInt)+nByte, 0x65, nReserve-nByte);
16002: p = (void*)pInt;
16003: }
16004: sqlite3_mutex_leave(mem.mutex);
16005: return p;
16006: }
16007:
16008: /*
16009: ** Free memory.
16010: */
16011: static void sqlite3MemFree(void *pPrior){
16012: struct MemBlockHdr *pHdr;
16013: void **pBt;
16014: char *z;
16015: assert( sqlite3GlobalConfig.bMemstat || sqlite3GlobalConfig.bCoreMutex==0
16016: || mem.mutex!=0 );
16017: pHdr = sqlite3MemsysGetHeader(pPrior);
16018: pBt = (void**)pHdr;
16019: pBt -= pHdr->nBacktraceSlots;
16020: sqlite3_mutex_enter(mem.mutex);
16021: if( pHdr->pPrev ){
16022: assert( pHdr->pPrev->pNext==pHdr );
16023: pHdr->pPrev->pNext = pHdr->pNext;
16024: }else{
16025: assert( mem.pFirst==pHdr );
16026: mem.pFirst = pHdr->pNext;
16027: }
16028: if( pHdr->pNext ){
16029: assert( pHdr->pNext->pPrev==pHdr );
16030: pHdr->pNext->pPrev = pHdr->pPrev;
16031: }else{
16032: assert( mem.pLast==pHdr );
16033: mem.pLast = pHdr->pPrev;
16034: }
16035: z = (char*)pBt;
16036: z -= pHdr->nTitle;
16037: adjustStats(pHdr->iSize, -1);
16038: randomFill(z, sizeof(void*)*pHdr->nBacktraceSlots + sizeof(*pHdr) +
16039: pHdr->iSize + sizeof(int) + pHdr->nTitle);
16040: free(z);
16041: sqlite3_mutex_leave(mem.mutex);
16042: }
16043:
16044: /*
16045: ** Change the size of an existing memory allocation.
16046: **
16047: ** For this debugging implementation, we *always* make a copy of the
16048: ** allocation into a new place in memory. In this way, if the
16049: ** higher level code is using pointer to the old allocation, it is
16050: ** much more likely to break and we are much more liking to find
16051: ** the error.
16052: */
16053: static void *sqlite3MemRealloc(void *pPrior, int nByte){
16054: struct MemBlockHdr *pOldHdr;
16055: void *pNew;
16056: assert( mem.disallow==0 );
16057: assert( (nByte & 7)==0 ); /* EV: R-46199-30249 */
16058: pOldHdr = sqlite3MemsysGetHeader(pPrior);
16059: pNew = sqlite3MemMalloc(nByte);
16060: if( pNew ){
16061: memcpy(pNew, pPrior, nByte<pOldHdr->iSize ? nByte : pOldHdr->iSize);
16062: if( nByte>pOldHdr->iSize ){
16063: randomFill(&((char*)pNew)[pOldHdr->iSize], nByte - pOldHdr->iSize);
16064: }
16065: sqlite3MemFree(pPrior);
16066: }
16067: return pNew;
16068: }
16069:
16070: /*
16071: ** Populate the low-level memory allocation function pointers in
16072: ** sqlite3GlobalConfig.m with pointers to the routines in this file.
16073: */
16074: SQLITE_PRIVATE void sqlite3MemSetDefault(void){
16075: static const sqlite3_mem_methods defaultMethods = {
16076: sqlite3MemMalloc,
16077: sqlite3MemFree,
16078: sqlite3MemRealloc,
16079: sqlite3MemSize,
16080: sqlite3MemRoundup,
16081: sqlite3MemInit,
16082: sqlite3MemShutdown,
16083: 0
16084: };
16085: sqlite3_config(SQLITE_CONFIG_MALLOC, &defaultMethods);
16086: }
16087:
16088: /*
16089: ** Set the "type" of an allocation.
16090: */
16091: SQLITE_PRIVATE void sqlite3MemdebugSetType(void *p, u8 eType){
16092: if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
16093: struct MemBlockHdr *pHdr;
16094: pHdr = sqlite3MemsysGetHeader(p);
16095: assert( pHdr->iForeGuard==FOREGUARD );
16096: pHdr->eType = eType;
16097: }
16098: }
16099:
16100: /*
16101: ** Return TRUE if the mask of type in eType matches the type of the
16102: ** allocation p. Also return true if p==NULL.
16103: **
16104: ** This routine is designed for use within an assert() statement, to
16105: ** verify the type of an allocation. For example:
16106: **
16107: ** assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
16108: */
16109: SQLITE_PRIVATE int sqlite3MemdebugHasType(void *p, u8 eType){
16110: int rc = 1;
16111: if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
16112: struct MemBlockHdr *pHdr;
16113: pHdr = sqlite3MemsysGetHeader(p);
16114: assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */
16115: if( (pHdr->eType&eType)==0 ){
16116: rc = 0;
16117: }
16118: }
16119: return rc;
16120: }
16121:
16122: /*
16123: ** Return TRUE if the mask of type in eType matches no bits of the type of the
16124: ** allocation p. Also return true if p==NULL.
16125: **
16126: ** This routine is designed for use within an assert() statement, to
16127: ** verify the type of an allocation. For example:
16128: **
16129: ** assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
16130: */
16131: SQLITE_PRIVATE int sqlite3MemdebugNoType(void *p, u8 eType){
16132: int rc = 1;
16133: if( p && sqlite3GlobalConfig.m.xMalloc==sqlite3MemMalloc ){
16134: struct MemBlockHdr *pHdr;
16135: pHdr = sqlite3MemsysGetHeader(p);
16136: assert( pHdr->iForeGuard==FOREGUARD ); /* Allocation is valid */
16137: if( (pHdr->eType&eType)!=0 ){
16138: rc = 0;
16139: }
16140: }
16141: return rc;
16142: }
16143:
16144: /*
16145: ** Set the number of backtrace levels kept for each allocation.
16146: ** A value of zero turns off backtracing. The number is always rounded
16147: ** up to a multiple of 2.
16148: */
16149: SQLITE_PRIVATE void sqlite3MemdebugBacktrace(int depth){
16150: if( depth<0 ){ depth = 0; }
16151: if( depth>20 ){ depth = 20; }
16152: depth = (depth+1)&0xfe;
16153: mem.nBacktrace = depth;
16154: }
16155:
16156: SQLITE_PRIVATE void sqlite3MemdebugBacktraceCallback(void (*xBacktrace)(int, int, void **)){
16157: mem.xBacktrace = xBacktrace;
16158: }
16159:
16160: /*
16161: ** Set the title string for subsequent allocations.
16162: */
16163: SQLITE_PRIVATE void sqlite3MemdebugSettitle(const char *zTitle){
16164: unsigned int n = sqlite3Strlen30(zTitle) + 1;
16165: sqlite3_mutex_enter(mem.mutex);
16166: if( n>=sizeof(mem.zTitle) ) n = sizeof(mem.zTitle)-1;
16167: memcpy(mem.zTitle, zTitle, n);
16168: mem.zTitle[n] = 0;
16169: mem.nTitle = ROUND8(n);
16170: sqlite3_mutex_leave(mem.mutex);
16171: }
16172:
16173: SQLITE_PRIVATE void sqlite3MemdebugSync(){
16174: struct MemBlockHdr *pHdr;
16175: for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){
16176: void **pBt = (void**)pHdr;
16177: pBt -= pHdr->nBacktraceSlots;
16178: mem.xBacktrace(pHdr->iSize, pHdr->nBacktrace-1, &pBt[1]);
16179: }
16180: }
16181:
16182: /*
16183: ** Open the file indicated and write a log of all unfreed memory
16184: ** allocations into that log.
16185: */
16186: SQLITE_PRIVATE void sqlite3MemdebugDump(const char *zFilename){
16187: FILE *out;
16188: struct MemBlockHdr *pHdr;
16189: void **pBt;
16190: int i;
16191: out = fopen(zFilename, "w");
16192: if( out==0 ){
16193: fprintf(stderr, "** Unable to output memory debug output log: %s **\n",
16194: zFilename);
16195: return;
16196: }
16197: for(pHdr=mem.pFirst; pHdr; pHdr=pHdr->pNext){
16198: char *z = (char*)pHdr;
16199: z -= pHdr->nBacktraceSlots*sizeof(void*) + pHdr->nTitle;
16200: fprintf(out, "**** %lld bytes at %p from %s ****\n",
16201: pHdr->iSize, &pHdr[1], pHdr->nTitle ? z : "???");
16202: if( pHdr->nBacktrace ){
16203: fflush(out);
16204: pBt = (void**)pHdr;
16205: pBt -= pHdr->nBacktraceSlots;
16206: backtrace_symbols_fd(pBt, pHdr->nBacktrace, fileno(out));
16207: fprintf(out, "\n");
16208: }
16209: }
16210: fprintf(out, "COUNTS:\n");
16211: for(i=0; i<NCSIZE-1; i++){
16212: if( mem.nAlloc[i] ){
16213: fprintf(out, " %5d: %10d %10d %10d\n",
16214: i*8, mem.nAlloc[i], mem.nCurrent[i], mem.mxCurrent[i]);
16215: }
16216: }
16217: if( mem.nAlloc[NCSIZE-1] ){
16218: fprintf(out, " %5d: %10d %10d %10d\n",
16219: NCSIZE*8-8, mem.nAlloc[NCSIZE-1],
16220: mem.nCurrent[NCSIZE-1], mem.mxCurrent[NCSIZE-1]);
16221: }
16222: fclose(out);
16223: }
16224:
16225: /*
16226: ** Return the number of times sqlite3MemMalloc() has been called.
16227: */
16228: SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){
16229: int i;
16230: int nTotal = 0;
16231: for(i=0; i<NCSIZE; i++){
16232: nTotal += mem.nAlloc[i];
16233: }
16234: return nTotal;
16235: }
16236:
16237:
16238: #endif /* SQLITE_MEMDEBUG */
16239:
16240: /************** End of mem2.c ************************************************/
16241: /************** Begin file mem3.c ********************************************/
16242: /*
16243: ** 2007 October 14
16244: **
16245: ** The author disclaims copyright to this source code. In place of
16246: ** a legal notice, here is a blessing:
16247: **
16248: ** May you do good and not evil.
16249: ** May you find forgiveness for yourself and forgive others.
16250: ** May you share freely, never taking more than you give.
16251: **
16252: *************************************************************************
16253: ** This file contains the C functions that implement a memory
16254: ** allocation subsystem for use by SQLite.
16255: **
16256: ** This version of the memory allocation subsystem omits all
16257: ** use of malloc(). The SQLite user supplies a block of memory
16258: ** before calling sqlite3_initialize() from which allocations
16259: ** are made and returned by the xMalloc() and xRealloc()
16260: ** implementations. Once sqlite3_initialize() has been called,
16261: ** the amount of memory available to SQLite is fixed and cannot
16262: ** be changed.
16263: **
16264: ** This version of the memory allocation subsystem is included
16265: ** in the build only if SQLITE_ENABLE_MEMSYS3 is defined.
16266: */
16267:
16268: /*
16269: ** This version of the memory allocator is only built into the library
16270: ** SQLITE_ENABLE_MEMSYS3 is defined. Defining this symbol does not
16271: ** mean that the library will use a memory-pool by default, just that
16272: ** it is available. The mempool allocator is activated by calling
16273: ** sqlite3_config().
16274: */
16275: #ifdef SQLITE_ENABLE_MEMSYS3
16276:
16277: /*
16278: ** Maximum size (in Mem3Blocks) of a "small" chunk.
16279: */
16280: #define MX_SMALL 10
16281:
16282:
16283: /*
16284: ** Number of freelist hash slots
16285: */
16286: #define N_HASH 61
16287:
16288: /*
16289: ** A memory allocation (also called a "chunk") consists of two or
16290: ** more blocks where each block is 8 bytes. The first 8 bytes are
16291: ** a header that is not returned to the user.
16292: **
16293: ** A chunk is two or more blocks that is either checked out or
16294: ** free. The first block has format u.hdr. u.hdr.size4x is 4 times the
16295: ** size of the allocation in blocks if the allocation is free.
16296: ** The u.hdr.size4x&1 bit is true if the chunk is checked out and
16297: ** false if the chunk is on the freelist. The u.hdr.size4x&2 bit
16298: ** is true if the previous chunk is checked out and false if the
16299: ** previous chunk is free. The u.hdr.prevSize field is the size of
16300: ** the previous chunk in blocks if the previous chunk is on the
16301: ** freelist. If the previous chunk is checked out, then
16302: ** u.hdr.prevSize can be part of the data for that chunk and should
16303: ** not be read or written.
16304: **
16305: ** We often identify a chunk by its index in mem3.aPool[]. When
16306: ** this is done, the chunk index refers to the second block of
16307: ** the chunk. In this way, the first chunk has an index of 1.
16308: ** A chunk index of 0 means "no such chunk" and is the equivalent
16309: ** of a NULL pointer.
16310: **
16311: ** The second block of free chunks is of the form u.list. The
16312: ** two fields form a double-linked list of chunks of related sizes.
16313: ** Pointers to the head of the list are stored in mem3.aiSmall[]
16314: ** for smaller chunks and mem3.aiHash[] for larger chunks.
16315: **
16316: ** The second block of a chunk is user data if the chunk is checked
16317: ** out. If a chunk is checked out, the user data may extend into
16318: ** the u.hdr.prevSize value of the following chunk.
16319: */
16320: typedef struct Mem3Block Mem3Block;
16321: struct Mem3Block {
16322: union {
16323: struct {
16324: u32 prevSize; /* Size of previous chunk in Mem3Block elements */
16325: u32 size4x; /* 4x the size of current chunk in Mem3Block elements */
16326: } hdr;
16327: struct {
16328: u32 next; /* Index in mem3.aPool[] of next free chunk */
16329: u32 prev; /* Index in mem3.aPool[] of previous free chunk */
16330: } list;
16331: } u;
16332: };
16333:
16334: /*
16335: ** All of the static variables used by this module are collected
16336: ** into a single structure named "mem3". This is to keep the
16337: ** static variables organized and to reduce namespace pollution
16338: ** when this module is combined with other in the amalgamation.
16339: */
16340: static SQLITE_WSD struct Mem3Global {
16341: /*
16342: ** Memory available for allocation. nPool is the size of the array
16343: ** (in Mem3Blocks) pointed to by aPool less 2.
16344: */
16345: u32 nPool;
16346: Mem3Block *aPool;
16347:
16348: /*
16349: ** True if we are evaluating an out-of-memory callback.
16350: */
16351: int alarmBusy;
16352:
16353: /*
16354: ** Mutex to control access to the memory allocation subsystem.
16355: */
16356: sqlite3_mutex *mutex;
16357:
16358: /*
16359: ** The minimum amount of free space that we have seen.
16360: */
16361: u32 mnMaster;
16362:
16363: /*
16364: ** iMaster is the index of the master chunk. Most new allocations
16365: ** occur off of this chunk. szMaster is the size (in Mem3Blocks)
16366: ** of the current master. iMaster is 0 if there is not master chunk.
16367: ** The master chunk is not in either the aiHash[] or aiSmall[].
16368: */
16369: u32 iMaster;
16370: u32 szMaster;
16371:
16372: /*
16373: ** Array of lists of free blocks according to the block size
16374: ** for smaller chunks, or a hash on the block size for larger
16375: ** chunks.
16376: */
16377: u32 aiSmall[MX_SMALL-1]; /* For sizes 2 through MX_SMALL, inclusive */
16378: u32 aiHash[N_HASH]; /* For sizes MX_SMALL+1 and larger */
16379: } mem3 = { 97535575 };
16380:
16381: #define mem3 GLOBAL(struct Mem3Global, mem3)
16382:
16383: /*
16384: ** Unlink the chunk at mem3.aPool[i] from list it is currently
16385: ** on. *pRoot is the list that i is a member of.
16386: */
16387: static void memsys3UnlinkFromList(u32 i, u32 *pRoot){
16388: u32 next = mem3.aPool[i].u.list.next;
16389: u32 prev = mem3.aPool[i].u.list.prev;
16390: assert( sqlite3_mutex_held(mem3.mutex) );
16391: if( prev==0 ){
16392: *pRoot = next;
16393: }else{
16394: mem3.aPool[prev].u.list.next = next;
16395: }
16396: if( next ){
16397: mem3.aPool[next].u.list.prev = prev;
16398: }
16399: mem3.aPool[i].u.list.next = 0;
16400: mem3.aPool[i].u.list.prev = 0;
16401: }
16402:
16403: /*
16404: ** Unlink the chunk at index i from
16405: ** whatever list is currently a member of.
16406: */
16407: static void memsys3Unlink(u32 i){
16408: u32 size, hash;
16409: assert( sqlite3_mutex_held(mem3.mutex) );
16410: assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 );
16411: assert( i>=1 );
16412: size = mem3.aPool[i-1].u.hdr.size4x/4;
16413: assert( size==mem3.aPool[i+size-1].u.hdr.prevSize );
16414: assert( size>=2 );
16415: if( size <= MX_SMALL ){
16416: memsys3UnlinkFromList(i, &mem3.aiSmall[size-2]);
16417: }else{
16418: hash = size % N_HASH;
16419: memsys3UnlinkFromList(i, &mem3.aiHash[hash]);
16420: }
16421: }
16422:
16423: /*
16424: ** Link the chunk at mem3.aPool[i] so that is on the list rooted
16425: ** at *pRoot.
16426: */
16427: static void memsys3LinkIntoList(u32 i, u32 *pRoot){
16428: assert( sqlite3_mutex_held(mem3.mutex) );
16429: mem3.aPool[i].u.list.next = *pRoot;
16430: mem3.aPool[i].u.list.prev = 0;
16431: if( *pRoot ){
16432: mem3.aPool[*pRoot].u.list.prev = i;
16433: }
16434: *pRoot = i;
16435: }
16436:
16437: /*
16438: ** Link the chunk at index i into either the appropriate
16439: ** small chunk list, or into the large chunk hash table.
16440: */
16441: static void memsys3Link(u32 i){
16442: u32 size, hash;
16443: assert( sqlite3_mutex_held(mem3.mutex) );
16444: assert( i>=1 );
16445: assert( (mem3.aPool[i-1].u.hdr.size4x & 1)==0 );
16446: size = mem3.aPool[i-1].u.hdr.size4x/4;
16447: assert( size==mem3.aPool[i+size-1].u.hdr.prevSize );
16448: assert( size>=2 );
16449: if( size <= MX_SMALL ){
16450: memsys3LinkIntoList(i, &mem3.aiSmall[size-2]);
16451: }else{
16452: hash = size % N_HASH;
16453: memsys3LinkIntoList(i, &mem3.aiHash[hash]);
16454: }
16455: }
16456:
16457: /*
16458: ** If the STATIC_MEM mutex is not already held, obtain it now. The mutex
16459: ** will already be held (obtained by code in malloc.c) if
16460: ** sqlite3GlobalConfig.bMemStat is true.
16461: */
16462: static void memsys3Enter(void){
16463: if( sqlite3GlobalConfig.bMemstat==0 && mem3.mutex==0 ){
16464: mem3.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
16465: }
16466: sqlite3_mutex_enter(mem3.mutex);
16467: }
16468: static void memsys3Leave(void){
16469: sqlite3_mutex_leave(mem3.mutex);
16470: }
16471:
16472: /*
16473: ** Called when we are unable to satisfy an allocation of nBytes.
16474: */
16475: static void memsys3OutOfMemory(int nByte){
16476: if( !mem3.alarmBusy ){
16477: mem3.alarmBusy = 1;
16478: assert( sqlite3_mutex_held(mem3.mutex) );
16479: sqlite3_mutex_leave(mem3.mutex);
16480: sqlite3_release_memory(nByte);
16481: sqlite3_mutex_enter(mem3.mutex);
16482: mem3.alarmBusy = 0;
16483: }
16484: }
16485:
16486:
16487: /*
16488: ** Chunk i is a free chunk that has been unlinked. Adjust its
16489: ** size parameters for check-out and return a pointer to the
16490: ** user portion of the chunk.
16491: */
16492: static void *memsys3Checkout(u32 i, u32 nBlock){
16493: u32 x;
16494: assert( sqlite3_mutex_held(mem3.mutex) );
16495: assert( i>=1 );
16496: assert( mem3.aPool[i-1].u.hdr.size4x/4==nBlock );
16497: assert( mem3.aPool[i+nBlock-1].u.hdr.prevSize==nBlock );
16498: x = mem3.aPool[i-1].u.hdr.size4x;
16499: mem3.aPool[i-1].u.hdr.size4x = nBlock*4 | 1 | (x&2);
16500: mem3.aPool[i+nBlock-1].u.hdr.prevSize = nBlock;
16501: mem3.aPool[i+nBlock-1].u.hdr.size4x |= 2;
16502: return &mem3.aPool[i];
16503: }
16504:
16505: /*
16506: ** Carve a piece off of the end of the mem3.iMaster free chunk.
16507: ** Return a pointer to the new allocation. Or, if the master chunk
16508: ** is not large enough, return 0.
16509: */
16510: static void *memsys3FromMaster(u32 nBlock){
16511: assert( sqlite3_mutex_held(mem3.mutex) );
16512: assert( mem3.szMaster>=nBlock );
16513: if( nBlock>=mem3.szMaster-1 ){
16514: /* Use the entire master */
16515: void *p = memsys3Checkout(mem3.iMaster, mem3.szMaster);
16516: mem3.iMaster = 0;
16517: mem3.szMaster = 0;
16518: mem3.mnMaster = 0;
16519: return p;
16520: }else{
16521: /* Split the master block. Return the tail. */
16522: u32 newi, x;
16523: newi = mem3.iMaster + mem3.szMaster - nBlock;
16524: assert( newi > mem3.iMaster+1 );
16525: mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = nBlock;
16526: mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x |= 2;
16527: mem3.aPool[newi-1].u.hdr.size4x = nBlock*4 + 1;
16528: mem3.szMaster -= nBlock;
16529: mem3.aPool[newi-1].u.hdr.prevSize = mem3.szMaster;
16530: x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
16531: mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
16532: if( mem3.szMaster < mem3.mnMaster ){
16533: mem3.mnMaster = mem3.szMaster;
16534: }
16535: return (void*)&mem3.aPool[newi];
16536: }
16537: }
16538:
16539: /*
16540: ** *pRoot is the head of a list of free chunks of the same size
16541: ** or same size hash. In other words, *pRoot is an entry in either
16542: ** mem3.aiSmall[] or mem3.aiHash[].
16543: **
16544: ** This routine examines all entries on the given list and tries
16545: ** to coalesce each entries with adjacent free chunks.
16546: **
16547: ** If it sees a chunk that is larger than mem3.iMaster, it replaces
16548: ** the current mem3.iMaster with the new larger chunk. In order for
16549: ** this mem3.iMaster replacement to work, the master chunk must be
16550: ** linked into the hash tables. That is not the normal state of
16551: ** affairs, of course. The calling routine must link the master
16552: ** chunk before invoking this routine, then must unlink the (possibly
16553: ** changed) master chunk once this routine has finished.
16554: */
16555: static void memsys3Merge(u32 *pRoot){
16556: u32 iNext, prev, size, i, x;
16557:
16558: assert( sqlite3_mutex_held(mem3.mutex) );
16559: for(i=*pRoot; i>0; i=iNext){
16560: iNext = mem3.aPool[i].u.list.next;
16561: size = mem3.aPool[i-1].u.hdr.size4x;
16562: assert( (size&1)==0 );
16563: if( (size&2)==0 ){
16564: memsys3UnlinkFromList(i, pRoot);
16565: assert( i > mem3.aPool[i-1].u.hdr.prevSize );
16566: prev = i - mem3.aPool[i-1].u.hdr.prevSize;
16567: if( prev==iNext ){
16568: iNext = mem3.aPool[prev].u.list.next;
16569: }
16570: memsys3Unlink(prev);
16571: size = i + size/4 - prev;
16572: x = mem3.aPool[prev-1].u.hdr.size4x & 2;
16573: mem3.aPool[prev-1].u.hdr.size4x = size*4 | x;
16574: mem3.aPool[prev+size-1].u.hdr.prevSize = size;
16575: memsys3Link(prev);
16576: i = prev;
16577: }else{
16578: size /= 4;
16579: }
16580: if( size>mem3.szMaster ){
16581: mem3.iMaster = i;
16582: mem3.szMaster = size;
16583: }
16584: }
16585: }
16586:
16587: /*
16588: ** Return a block of memory of at least nBytes in size.
16589: ** Return NULL if unable.
16590: **
16591: ** This function assumes that the necessary mutexes, if any, are
16592: ** already held by the caller. Hence "Unsafe".
16593: */
16594: static void *memsys3MallocUnsafe(int nByte){
16595: u32 i;
16596: u32 nBlock;
16597: u32 toFree;
16598:
16599: assert( sqlite3_mutex_held(mem3.mutex) );
16600: assert( sizeof(Mem3Block)==8 );
16601: if( nByte<=12 ){
16602: nBlock = 2;
16603: }else{
16604: nBlock = (nByte + 11)/8;
16605: }
16606: assert( nBlock>=2 );
16607:
16608: /* STEP 1:
16609: ** Look for an entry of the correct size in either the small
16610: ** chunk table or in the large chunk hash table. This is
16611: ** successful most of the time (about 9 times out of 10).
16612: */
16613: if( nBlock <= MX_SMALL ){
16614: i = mem3.aiSmall[nBlock-2];
16615: if( i>0 ){
16616: memsys3UnlinkFromList(i, &mem3.aiSmall[nBlock-2]);
16617: return memsys3Checkout(i, nBlock);
16618: }
16619: }else{
16620: int hash = nBlock % N_HASH;
16621: for(i=mem3.aiHash[hash]; i>0; i=mem3.aPool[i].u.list.next){
16622: if( mem3.aPool[i-1].u.hdr.size4x/4==nBlock ){
16623: memsys3UnlinkFromList(i, &mem3.aiHash[hash]);
16624: return memsys3Checkout(i, nBlock);
16625: }
16626: }
16627: }
16628:
16629: /* STEP 2:
16630: ** Try to satisfy the allocation by carving a piece off of the end
16631: ** of the master chunk. This step usually works if step 1 fails.
16632: */
16633: if( mem3.szMaster>=nBlock ){
16634: return memsys3FromMaster(nBlock);
16635: }
16636:
16637:
16638: /* STEP 3:
16639: ** Loop through the entire memory pool. Coalesce adjacent free
16640: ** chunks. Recompute the master chunk as the largest free chunk.
16641: ** Then try again to satisfy the allocation by carving a piece off
16642: ** of the end of the master chunk. This step happens very
16643: ** rarely (we hope!)
16644: */
16645: for(toFree=nBlock*16; toFree<(mem3.nPool*16); toFree *= 2){
16646: memsys3OutOfMemory(toFree);
16647: if( mem3.iMaster ){
16648: memsys3Link(mem3.iMaster);
16649: mem3.iMaster = 0;
16650: mem3.szMaster = 0;
16651: }
16652: for(i=0; i<N_HASH; i++){
16653: memsys3Merge(&mem3.aiHash[i]);
16654: }
16655: for(i=0; i<MX_SMALL-1; i++){
16656: memsys3Merge(&mem3.aiSmall[i]);
16657: }
16658: if( mem3.szMaster ){
16659: memsys3Unlink(mem3.iMaster);
16660: if( mem3.szMaster>=nBlock ){
16661: return memsys3FromMaster(nBlock);
16662: }
16663: }
16664: }
16665:
16666: /* If none of the above worked, then we fail. */
16667: return 0;
16668: }
16669:
16670: /*
16671: ** Free an outstanding memory allocation.
16672: **
16673: ** This function assumes that the necessary mutexes, if any, are
16674: ** already held by the caller. Hence "Unsafe".
16675: */
16676: static void memsys3FreeUnsafe(void *pOld){
16677: Mem3Block *p = (Mem3Block*)pOld;
16678: int i;
16679: u32 size, x;
16680: assert( sqlite3_mutex_held(mem3.mutex) );
16681: assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] );
16682: i = p - mem3.aPool;
16683: assert( (mem3.aPool[i-1].u.hdr.size4x&1)==1 );
16684: size = mem3.aPool[i-1].u.hdr.size4x/4;
16685: assert( i+size<=mem3.nPool+1 );
16686: mem3.aPool[i-1].u.hdr.size4x &= ~1;
16687: mem3.aPool[i+size-1].u.hdr.prevSize = size;
16688: mem3.aPool[i+size-1].u.hdr.size4x &= ~2;
16689: memsys3Link(i);
16690:
16691: /* Try to expand the master using the newly freed chunk */
16692: if( mem3.iMaster ){
16693: while( (mem3.aPool[mem3.iMaster-1].u.hdr.size4x&2)==0 ){
16694: size = mem3.aPool[mem3.iMaster-1].u.hdr.prevSize;
16695: mem3.iMaster -= size;
16696: mem3.szMaster += size;
16697: memsys3Unlink(mem3.iMaster);
16698: x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
16699: mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
16700: mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster;
16701: }
16702: x = mem3.aPool[mem3.iMaster-1].u.hdr.size4x & 2;
16703: while( (mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x&1)==0 ){
16704: memsys3Unlink(mem3.iMaster+mem3.szMaster);
16705: mem3.szMaster += mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.size4x/4;
16706: mem3.aPool[mem3.iMaster-1].u.hdr.size4x = mem3.szMaster*4 | x;
16707: mem3.aPool[mem3.iMaster+mem3.szMaster-1].u.hdr.prevSize = mem3.szMaster;
16708: }
16709: }
16710: }
16711:
16712: /*
16713: ** Return the size of an outstanding allocation, in bytes. The
16714: ** size returned omits the 8-byte header overhead. This only
16715: ** works for chunks that are currently checked out.
16716: */
16717: static int memsys3Size(void *p){
16718: Mem3Block *pBlock;
16719: if( p==0 ) return 0;
16720: pBlock = (Mem3Block*)p;
16721: assert( (pBlock[-1].u.hdr.size4x&1)!=0 );
16722: return (pBlock[-1].u.hdr.size4x&~3)*2 - 4;
16723: }
16724:
16725: /*
16726: ** Round up a request size to the next valid allocation size.
16727: */
16728: static int memsys3Roundup(int n){
16729: if( n<=12 ){
16730: return 12;
16731: }else{
16732: return ((n+11)&~7) - 4;
16733: }
16734: }
16735:
16736: /*
16737: ** Allocate nBytes of memory.
16738: */
16739: static void *memsys3Malloc(int nBytes){
16740: sqlite3_int64 *p;
16741: assert( nBytes>0 ); /* malloc.c filters out 0 byte requests */
16742: memsys3Enter();
16743: p = memsys3MallocUnsafe(nBytes);
16744: memsys3Leave();
16745: return (void*)p;
16746: }
16747:
16748: /*
16749: ** Free memory.
16750: */
16751: static void memsys3Free(void *pPrior){
16752: assert( pPrior );
16753: memsys3Enter();
16754: memsys3FreeUnsafe(pPrior);
16755: memsys3Leave();
16756: }
16757:
16758: /*
16759: ** Change the size of an existing memory allocation
16760: */
16761: static void *memsys3Realloc(void *pPrior, int nBytes){
16762: int nOld;
16763: void *p;
16764: if( pPrior==0 ){
16765: return sqlite3_malloc(nBytes);
16766: }
16767: if( nBytes<=0 ){
16768: sqlite3_free(pPrior);
16769: return 0;
16770: }
16771: nOld = memsys3Size(pPrior);
16772: if( nBytes<=nOld && nBytes>=nOld-128 ){
16773: return pPrior;
16774: }
16775: memsys3Enter();
16776: p = memsys3MallocUnsafe(nBytes);
16777: if( p ){
16778: if( nOld<nBytes ){
16779: memcpy(p, pPrior, nOld);
16780: }else{
16781: memcpy(p, pPrior, nBytes);
16782: }
16783: memsys3FreeUnsafe(pPrior);
16784: }
16785: memsys3Leave();
16786: return p;
16787: }
16788:
16789: /*
16790: ** Initialize this module.
16791: */
16792: static int memsys3Init(void *NotUsed){
16793: UNUSED_PARAMETER(NotUsed);
16794: if( !sqlite3GlobalConfig.pHeap ){
16795: return SQLITE_ERROR;
16796: }
16797:
16798: /* Store a pointer to the memory block in global structure mem3. */
16799: assert( sizeof(Mem3Block)==8 );
16800: mem3.aPool = (Mem3Block *)sqlite3GlobalConfig.pHeap;
16801: mem3.nPool = (sqlite3GlobalConfig.nHeap / sizeof(Mem3Block)) - 2;
16802:
16803: /* Initialize the master block. */
16804: mem3.szMaster = mem3.nPool;
16805: mem3.mnMaster = mem3.szMaster;
16806: mem3.iMaster = 1;
16807: mem3.aPool[0].u.hdr.size4x = (mem3.szMaster<<2) + 2;
16808: mem3.aPool[mem3.nPool].u.hdr.prevSize = mem3.nPool;
16809: mem3.aPool[mem3.nPool].u.hdr.size4x = 1;
16810:
16811: return SQLITE_OK;
16812: }
16813:
16814: /*
16815: ** Deinitialize this module.
16816: */
16817: static void memsys3Shutdown(void *NotUsed){
16818: UNUSED_PARAMETER(NotUsed);
16819: mem3.mutex = 0;
16820: return;
16821: }
16822:
16823:
16824:
16825: /*
16826: ** Open the file indicated and write a log of all unfreed memory
16827: ** allocations into that log.
16828: */
16829: SQLITE_PRIVATE void sqlite3Memsys3Dump(const char *zFilename){
16830: #ifdef SQLITE_DEBUG
16831: FILE *out;
16832: u32 i, j;
16833: u32 size;
16834: if( zFilename==0 || zFilename[0]==0 ){
16835: out = stdout;
16836: }else{
16837: out = fopen(zFilename, "w");
16838: if( out==0 ){
16839: fprintf(stderr, "** Unable to output memory debug output log: %s **\n",
16840: zFilename);
16841: return;
16842: }
16843: }
16844: memsys3Enter();
16845: fprintf(out, "CHUNKS:\n");
16846: for(i=1; i<=mem3.nPool; i+=size/4){
16847: size = mem3.aPool[i-1].u.hdr.size4x;
16848: if( size/4<=1 ){
16849: fprintf(out, "%p size error\n", &mem3.aPool[i]);
16850: assert( 0 );
16851: break;
16852: }
16853: if( (size&1)==0 && mem3.aPool[i+size/4-1].u.hdr.prevSize!=size/4 ){
16854: fprintf(out, "%p tail size does not match\n", &mem3.aPool[i]);
16855: assert( 0 );
16856: break;
16857: }
16858: if( ((mem3.aPool[i+size/4-1].u.hdr.size4x&2)>>1)!=(size&1) ){
16859: fprintf(out, "%p tail checkout bit is incorrect\n", &mem3.aPool[i]);
16860: assert( 0 );
16861: break;
16862: }
16863: if( size&1 ){
16864: fprintf(out, "%p %6d bytes checked out\n", &mem3.aPool[i], (size/4)*8-8);
16865: }else{
16866: fprintf(out, "%p %6d bytes free%s\n", &mem3.aPool[i], (size/4)*8-8,
16867: i==mem3.iMaster ? " **master**" : "");
16868: }
16869: }
16870: for(i=0; i<MX_SMALL-1; i++){
16871: if( mem3.aiSmall[i]==0 ) continue;
16872: fprintf(out, "small(%2d):", i);
16873: for(j = mem3.aiSmall[i]; j>0; j=mem3.aPool[j].u.list.next){
16874: fprintf(out, " %p(%d)", &mem3.aPool[j],
16875: (mem3.aPool[j-1].u.hdr.size4x/4)*8-8);
16876: }
16877: fprintf(out, "\n");
16878: }
16879: for(i=0; i<N_HASH; i++){
16880: if( mem3.aiHash[i]==0 ) continue;
16881: fprintf(out, "hash(%2d):", i);
16882: for(j = mem3.aiHash[i]; j>0; j=mem3.aPool[j].u.list.next){
16883: fprintf(out, " %p(%d)", &mem3.aPool[j],
16884: (mem3.aPool[j-1].u.hdr.size4x/4)*8-8);
16885: }
16886: fprintf(out, "\n");
16887: }
16888: fprintf(out, "master=%d\n", mem3.iMaster);
16889: fprintf(out, "nowUsed=%d\n", mem3.nPool*8 - mem3.szMaster*8);
16890: fprintf(out, "mxUsed=%d\n", mem3.nPool*8 - mem3.mnMaster*8);
16891: sqlite3_mutex_leave(mem3.mutex);
16892: if( out==stdout ){
16893: fflush(stdout);
16894: }else{
16895: fclose(out);
16896: }
16897: #else
16898: UNUSED_PARAMETER(zFilename);
16899: #endif
16900: }
16901:
16902: /*
16903: ** This routine is the only routine in this file with external
16904: ** linkage.
16905: **
16906: ** Populate the low-level memory allocation function pointers in
16907: ** sqlite3GlobalConfig.m with pointers to the routines in this file. The
16908: ** arguments specify the block of memory to manage.
16909: **
16910: ** This routine is only called by sqlite3_config(), and therefore
16911: ** is not required to be threadsafe (it is not).
16912: */
16913: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){
16914: static const sqlite3_mem_methods mempoolMethods = {
16915: memsys3Malloc,
16916: memsys3Free,
16917: memsys3Realloc,
16918: memsys3Size,
16919: memsys3Roundup,
16920: memsys3Init,
16921: memsys3Shutdown,
16922: 0
16923: };
16924: return &mempoolMethods;
16925: }
16926:
16927: #endif /* SQLITE_ENABLE_MEMSYS3 */
16928:
16929: /************** End of mem3.c ************************************************/
16930: /************** Begin file mem5.c ********************************************/
16931: /*
16932: ** 2007 October 14
16933: **
16934: ** The author disclaims copyright to this source code. In place of
16935: ** a legal notice, here is a blessing:
16936: **
16937: ** May you do good and not evil.
16938: ** May you find forgiveness for yourself and forgive others.
16939: ** May you share freely, never taking more than you give.
16940: **
16941: *************************************************************************
16942: ** This file contains the C functions that implement a memory
16943: ** allocation subsystem for use by SQLite.
16944: **
16945: ** This version of the memory allocation subsystem omits all
16946: ** use of malloc(). The application gives SQLite a block of memory
16947: ** before calling sqlite3_initialize() from which allocations
16948: ** are made and returned by the xMalloc() and xRealloc()
16949: ** implementations. Once sqlite3_initialize() has been called,
16950: ** the amount of memory available to SQLite is fixed and cannot
16951: ** be changed.
16952: **
16953: ** This version of the memory allocation subsystem is included
16954: ** in the build only if SQLITE_ENABLE_MEMSYS5 is defined.
16955: **
16956: ** This memory allocator uses the following algorithm:
16957: **
16958: ** 1. All memory allocations sizes are rounded up to a power of 2.
16959: **
16960: ** 2. If two adjacent free blocks are the halves of a larger block,
16961: ** then the two blocks are coalesed into the single larger block.
16962: **
16963: ** 3. New memory is allocated from the first available free block.
16964: **
16965: ** This algorithm is described in: J. M. Robson. "Bounds for Some Functions
16966: ** Concerning Dynamic Storage Allocation". Journal of the Association for
16967: ** Computing Machinery, Volume 21, Number 8, July 1974, pages 491-499.
16968: **
16969: ** Let n be the size of the largest allocation divided by the minimum
16970: ** allocation size (after rounding all sizes up to a power of 2.) Let M
16971: ** be the maximum amount of memory ever outstanding at one time. Let
16972: ** N be the total amount of memory available for allocation. Robson
16973: ** proved that this memory allocator will never breakdown due to
16974: ** fragmentation as long as the following constraint holds:
16975: **
16976: ** N >= M*(1 + log2(n)/2) - n + 1
16977: **
16978: ** The sqlite3_status() logic tracks the maximum values of n and M so
16979: ** that an application can, at any time, verify this constraint.
16980: */
16981:
16982: /*
16983: ** This version of the memory allocator is used only when
16984: ** SQLITE_ENABLE_MEMSYS5 is defined.
16985: */
16986: #ifdef SQLITE_ENABLE_MEMSYS5
16987:
16988: /*
16989: ** A minimum allocation is an instance of the following structure.
16990: ** Larger allocations are an array of these structures where the
16991: ** size of the array is a power of 2.
16992: **
16993: ** The size of this object must be a power of two. That fact is
16994: ** verified in memsys5Init().
16995: */
16996: typedef struct Mem5Link Mem5Link;
16997: struct Mem5Link {
16998: int next; /* Index of next free chunk */
16999: int prev; /* Index of previous free chunk */
17000: };
17001:
17002: /*
17003: ** Maximum size of any allocation is ((1<<LOGMAX)*mem5.szAtom). Since
17004: ** mem5.szAtom is always at least 8 and 32-bit integers are used,
17005: ** it is not actually possible to reach this limit.
17006: */
17007: #define LOGMAX 30
17008:
17009: /*
17010: ** Masks used for mem5.aCtrl[] elements.
17011: */
17012: #define CTRL_LOGSIZE 0x1f /* Log2 Size of this block */
17013: #define CTRL_FREE 0x20 /* True if not checked out */
17014:
17015: /*
17016: ** All of the static variables used by this module are collected
17017: ** into a single structure named "mem5". This is to keep the
17018: ** static variables organized and to reduce namespace pollution
17019: ** when this module is combined with other in the amalgamation.
17020: */
17021: static SQLITE_WSD struct Mem5Global {
17022: /*
17023: ** Memory available for allocation
17024: */
17025: int szAtom; /* Smallest possible allocation in bytes */
17026: int nBlock; /* Number of szAtom sized blocks in zPool */
17027: u8 *zPool; /* Memory available to be allocated */
17028:
17029: /*
17030: ** Mutex to control access to the memory allocation subsystem.
17031: */
17032: sqlite3_mutex *mutex;
17033:
17034: /*
17035: ** Performance statistics
17036: */
17037: u64 nAlloc; /* Total number of calls to malloc */
17038: u64 totalAlloc; /* Total of all malloc calls - includes internal frag */
17039: u64 totalExcess; /* Total internal fragmentation */
17040: u32 currentOut; /* Current checkout, including internal fragmentation */
17041: u32 currentCount; /* Current number of distinct checkouts */
17042: u32 maxOut; /* Maximum instantaneous currentOut */
17043: u32 maxCount; /* Maximum instantaneous currentCount */
17044: u32 maxRequest; /* Largest allocation (exclusive of internal frag) */
17045:
17046: /*
17047: ** Lists of free blocks. aiFreelist[0] is a list of free blocks of
17048: ** size mem5.szAtom. aiFreelist[1] holds blocks of size szAtom*2.
17049: ** and so forth.
17050: */
17051: int aiFreelist[LOGMAX+1];
17052:
17053: /*
17054: ** Space for tracking which blocks are checked out and the size
17055: ** of each block. One byte per block.
17056: */
17057: u8 *aCtrl;
17058:
17059: } mem5;
17060:
17061: /*
17062: ** Access the static variable through a macro for SQLITE_OMIT_WSD
17063: */
17064: #define mem5 GLOBAL(struct Mem5Global, mem5)
17065:
17066: /*
17067: ** Assuming mem5.zPool is divided up into an array of Mem5Link
17068: ** structures, return a pointer to the idx-th such lik.
17069: */
17070: #define MEM5LINK(idx) ((Mem5Link *)(&mem5.zPool[(idx)*mem5.szAtom]))
17071:
17072: /*
17073: ** Unlink the chunk at mem5.aPool[i] from list it is currently
17074: ** on. It should be found on mem5.aiFreelist[iLogsize].
17075: */
17076: static void memsys5Unlink(int i, int iLogsize){
17077: int next, prev;
17078: assert( i>=0 && i<mem5.nBlock );
17079: assert( iLogsize>=0 && iLogsize<=LOGMAX );
17080: assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
17081:
17082: next = MEM5LINK(i)->next;
17083: prev = MEM5LINK(i)->prev;
17084: if( prev<0 ){
17085: mem5.aiFreelist[iLogsize] = next;
17086: }else{
17087: MEM5LINK(prev)->next = next;
17088: }
17089: if( next>=0 ){
17090: MEM5LINK(next)->prev = prev;
17091: }
17092: }
17093:
17094: /*
17095: ** Link the chunk at mem5.aPool[i] so that is on the iLogsize
17096: ** free list.
17097: */
17098: static void memsys5Link(int i, int iLogsize){
17099: int x;
17100: assert( sqlite3_mutex_held(mem5.mutex) );
17101: assert( i>=0 && i<mem5.nBlock );
17102: assert( iLogsize>=0 && iLogsize<=LOGMAX );
17103: assert( (mem5.aCtrl[i] & CTRL_LOGSIZE)==iLogsize );
17104:
17105: x = MEM5LINK(i)->next = mem5.aiFreelist[iLogsize];
17106: MEM5LINK(i)->prev = -1;
17107: if( x>=0 ){
17108: assert( x<mem5.nBlock );
17109: MEM5LINK(x)->prev = i;
17110: }
17111: mem5.aiFreelist[iLogsize] = i;
17112: }
17113:
17114: /*
17115: ** If the STATIC_MEM mutex is not already held, obtain it now. The mutex
17116: ** will already be held (obtained by code in malloc.c) if
17117: ** sqlite3GlobalConfig.bMemStat is true.
17118: */
17119: static void memsys5Enter(void){
17120: sqlite3_mutex_enter(mem5.mutex);
17121: }
17122: static void memsys5Leave(void){
17123: sqlite3_mutex_leave(mem5.mutex);
17124: }
17125:
17126: /*
17127: ** Return the size of an outstanding allocation, in bytes. The
17128: ** size returned omits the 8-byte header overhead. This only
17129: ** works for chunks that are currently checked out.
17130: */
17131: static int memsys5Size(void *p){
17132: int iSize = 0;
17133: if( p ){
17134: int i = ((u8 *)p-mem5.zPool)/mem5.szAtom;
17135: assert( i>=0 && i<mem5.nBlock );
17136: iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE));
17137: }
17138: return iSize;
17139: }
17140:
17141: /*
17142: ** Find the first entry on the freelist iLogsize. Unlink that
17143: ** entry and return its index.
17144: */
17145: static int memsys5UnlinkFirst(int iLogsize){
17146: int i;
17147: int iFirst;
17148:
17149: assert( iLogsize>=0 && iLogsize<=LOGMAX );
17150: i = iFirst = mem5.aiFreelist[iLogsize];
17151: assert( iFirst>=0 );
17152: while( i>0 ){
17153: if( i<iFirst ) iFirst = i;
17154: i = MEM5LINK(i)->next;
17155: }
17156: memsys5Unlink(iFirst, iLogsize);
17157: return iFirst;
17158: }
17159:
17160: /*
17161: ** Return a block of memory of at least nBytes in size.
17162: ** Return NULL if unable. Return NULL if nBytes==0.
17163: **
17164: ** The caller guarantees that nByte positive.
17165: **
17166: ** The caller has obtained a mutex prior to invoking this
17167: ** routine so there is never any chance that two or more
17168: ** threads can be in this routine at the same time.
17169: */
17170: static void *memsys5MallocUnsafe(int nByte){
17171: int i; /* Index of a mem5.aPool[] slot */
17172: int iBin; /* Index into mem5.aiFreelist[] */
17173: int iFullSz; /* Size of allocation rounded up to power of 2 */
17174: int iLogsize; /* Log2 of iFullSz/POW2_MIN */
17175:
17176: /* nByte must be a positive */
17177: assert( nByte>0 );
17178:
17179: /* Keep track of the maximum allocation request. Even unfulfilled
17180: ** requests are counted */
17181: if( (u32)nByte>mem5.maxRequest ){
17182: mem5.maxRequest = nByte;
17183: }
17184:
17185: /* Abort if the requested allocation size is larger than the largest
17186: ** power of two that we can represent using 32-bit signed integers.
17187: */
17188: if( nByte > 0x40000000 ){
17189: return 0;
17190: }
17191:
17192: /* Round nByte up to the next valid power of two */
17193: for(iFullSz=mem5.szAtom, iLogsize=0; iFullSz<nByte; iFullSz *= 2, iLogsize++){}
17194:
17195: /* Make sure mem5.aiFreelist[iLogsize] contains at least one free
17196: ** block. If not, then split a block of the next larger power of
17197: ** two in order to create a new free block of size iLogsize.
17198: */
17199: for(iBin=iLogsize; mem5.aiFreelist[iBin]<0 && iBin<=LOGMAX; iBin++){}
17200: if( iBin>LOGMAX ){
17201: testcase( sqlite3GlobalConfig.xLog!=0 );
17202: sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes", nByte);
17203: return 0;
17204: }
17205: i = memsys5UnlinkFirst(iBin);
17206: while( iBin>iLogsize ){
17207: int newSize;
17208:
17209: iBin--;
17210: newSize = 1 << iBin;
17211: mem5.aCtrl[i+newSize] = CTRL_FREE | iBin;
17212: memsys5Link(i+newSize, iBin);
17213: }
17214: mem5.aCtrl[i] = iLogsize;
17215:
17216: /* Update allocator performance statistics. */
17217: mem5.nAlloc++;
17218: mem5.totalAlloc += iFullSz;
17219: mem5.totalExcess += iFullSz - nByte;
17220: mem5.currentCount++;
17221: mem5.currentOut += iFullSz;
17222: if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount;
17223: if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut;
17224:
17225: /* Return a pointer to the allocated memory. */
17226: return (void*)&mem5.zPool[i*mem5.szAtom];
17227: }
17228:
17229: /*
17230: ** Free an outstanding memory allocation.
17231: */
17232: static void memsys5FreeUnsafe(void *pOld){
17233: u32 size, iLogsize;
17234: int iBlock;
17235:
17236: /* Set iBlock to the index of the block pointed to by pOld in
17237: ** the array of mem5.szAtom byte blocks pointed to by mem5.zPool.
17238: */
17239: iBlock = ((u8 *)pOld-mem5.zPool)/mem5.szAtom;
17240:
17241: /* Check that the pointer pOld points to a valid, non-free block. */
17242: assert( iBlock>=0 && iBlock<mem5.nBlock );
17243: assert( ((u8 *)pOld-mem5.zPool)%mem5.szAtom==0 );
17244: assert( (mem5.aCtrl[iBlock] & CTRL_FREE)==0 );
17245:
17246: iLogsize = mem5.aCtrl[iBlock] & CTRL_LOGSIZE;
17247: size = 1<<iLogsize;
17248: assert( iBlock+size-1<(u32)mem5.nBlock );
17249:
17250: mem5.aCtrl[iBlock] |= CTRL_FREE;
17251: mem5.aCtrl[iBlock+size-1] |= CTRL_FREE;
17252: assert( mem5.currentCount>0 );
17253: assert( mem5.currentOut>=(size*mem5.szAtom) );
17254: mem5.currentCount--;
17255: mem5.currentOut -= size*mem5.szAtom;
17256: assert( mem5.currentOut>0 || mem5.currentCount==0 );
17257: assert( mem5.currentCount>0 || mem5.currentOut==0 );
17258:
17259: mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize;
17260: while( ALWAYS(iLogsize<LOGMAX) ){
17261: int iBuddy;
17262: if( (iBlock>>iLogsize) & 1 ){
17263: iBuddy = iBlock - size;
17264: }else{
17265: iBuddy = iBlock + size;
17266: }
17267: assert( iBuddy>=0 );
17268: if( (iBuddy+(1<<iLogsize))>mem5.nBlock ) break;
17269: if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break;
17270: memsys5Unlink(iBuddy, iLogsize);
17271: iLogsize++;
17272: if( iBuddy<iBlock ){
17273: mem5.aCtrl[iBuddy] = CTRL_FREE | iLogsize;
17274: mem5.aCtrl[iBlock] = 0;
17275: iBlock = iBuddy;
17276: }else{
17277: mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize;
17278: mem5.aCtrl[iBuddy] = 0;
17279: }
17280: size *= 2;
17281: }
17282: memsys5Link(iBlock, iLogsize);
17283: }
17284:
17285: /*
17286: ** Allocate nBytes of memory
17287: */
17288: static void *memsys5Malloc(int nBytes){
17289: sqlite3_int64 *p = 0;
17290: if( nBytes>0 ){
17291: memsys5Enter();
17292: p = memsys5MallocUnsafe(nBytes);
17293: memsys5Leave();
17294: }
17295: return (void*)p;
17296: }
17297:
17298: /*
17299: ** Free memory.
17300: **
17301: ** The outer layer memory allocator prevents this routine from
17302: ** being called with pPrior==0.
17303: */
17304: static void memsys5Free(void *pPrior){
17305: assert( pPrior!=0 );
17306: memsys5Enter();
17307: memsys5FreeUnsafe(pPrior);
17308: memsys5Leave();
17309: }
17310:
17311: /*
17312: ** Change the size of an existing memory allocation.
17313: **
17314: ** The outer layer memory allocator prevents this routine from
17315: ** being called with pPrior==0.
17316: **
17317: ** nBytes is always a value obtained from a prior call to
17318: ** memsys5Round(). Hence nBytes is always a non-negative power
17319: ** of two. If nBytes==0 that means that an oversize allocation
17320: ** (an allocation larger than 0x40000000) was requested and this
17321: ** routine should return 0 without freeing pPrior.
17322: */
17323: static void *memsys5Realloc(void *pPrior, int nBytes){
17324: int nOld;
17325: void *p;
17326: assert( pPrior!=0 );
17327: assert( (nBytes&(nBytes-1))==0 ); /* EV: R-46199-30249 */
17328: assert( nBytes>=0 );
17329: if( nBytes==0 ){
17330: return 0;
17331: }
17332: nOld = memsys5Size(pPrior);
17333: if( nBytes<=nOld ){
17334: return pPrior;
17335: }
17336: memsys5Enter();
17337: p = memsys5MallocUnsafe(nBytes);
17338: if( p ){
17339: memcpy(p, pPrior, nOld);
17340: memsys5FreeUnsafe(pPrior);
17341: }
17342: memsys5Leave();
17343: return p;
17344: }
17345:
17346: /*
17347: ** Round up a request size to the next valid allocation size. If
17348: ** the allocation is too large to be handled by this allocation system,
17349: ** return 0.
17350: **
17351: ** All allocations must be a power of two and must be expressed by a
17352: ** 32-bit signed integer. Hence the largest allocation is 0x40000000
17353: ** or 1073741824 bytes.
17354: */
17355: static int memsys5Roundup(int n){
17356: int iFullSz;
17357: if( n > 0x40000000 ) return 0;
17358: for(iFullSz=mem5.szAtom; iFullSz<n; iFullSz *= 2);
17359: return iFullSz;
17360: }
17361:
17362: /*
17363: ** Return the ceiling of the logarithm base 2 of iValue.
17364: **
17365: ** Examples: memsys5Log(1) -> 0
17366: ** memsys5Log(2) -> 1
17367: ** memsys5Log(4) -> 2
17368: ** memsys5Log(5) -> 3
17369: ** memsys5Log(8) -> 3
17370: ** memsys5Log(9) -> 4
17371: */
17372: static int memsys5Log(int iValue){
17373: int iLog;
17374: for(iLog=0; (iLog<(int)((sizeof(int)*8)-1)) && (1<<iLog)<iValue; iLog++);
17375: return iLog;
17376: }
17377:
17378: /*
17379: ** Initialize the memory allocator.
17380: **
17381: ** This routine is not threadsafe. The caller must be holding a mutex
17382: ** to prevent multiple threads from entering at the same time.
17383: */
17384: static int memsys5Init(void *NotUsed){
17385: int ii; /* Loop counter */
17386: int nByte; /* Number of bytes of memory available to this allocator */
17387: u8 *zByte; /* Memory usable by this allocator */
17388: int nMinLog; /* Log base 2 of minimum allocation size in bytes */
17389: int iOffset; /* An offset into mem5.aCtrl[] */
17390:
17391: UNUSED_PARAMETER(NotUsed);
17392:
17393: /* For the purposes of this routine, disable the mutex */
17394: mem5.mutex = 0;
17395:
17396: /* The size of a Mem5Link object must be a power of two. Verify that
17397: ** this is case.
17398: */
17399: assert( (sizeof(Mem5Link)&(sizeof(Mem5Link)-1))==0 );
17400:
17401: nByte = sqlite3GlobalConfig.nHeap;
17402: zByte = (u8*)sqlite3GlobalConfig.pHeap;
17403: assert( zByte!=0 ); /* sqlite3_config() does not allow otherwise */
17404:
17405: /* boundaries on sqlite3GlobalConfig.mnReq are enforced in sqlite3_config() */
17406: nMinLog = memsys5Log(sqlite3GlobalConfig.mnReq);
17407: mem5.szAtom = (1<<nMinLog);
17408: while( (int)sizeof(Mem5Link)>mem5.szAtom ){
17409: mem5.szAtom = mem5.szAtom << 1;
17410: }
17411:
17412: mem5.nBlock = (nByte / (mem5.szAtom+sizeof(u8)));
17413: mem5.zPool = zByte;
17414: mem5.aCtrl = (u8 *)&mem5.zPool[mem5.nBlock*mem5.szAtom];
17415:
17416: for(ii=0; ii<=LOGMAX; ii++){
17417: mem5.aiFreelist[ii] = -1;
17418: }
17419:
17420: iOffset = 0;
17421: for(ii=LOGMAX; ii>=0; ii--){
17422: int nAlloc = (1<<ii);
17423: if( (iOffset+nAlloc)<=mem5.nBlock ){
17424: mem5.aCtrl[iOffset] = ii | CTRL_FREE;
17425: memsys5Link(iOffset, ii);
17426: iOffset += nAlloc;
17427: }
17428: assert((iOffset+nAlloc)>mem5.nBlock);
17429: }
17430:
17431: /* If a mutex is required for normal operation, allocate one */
17432: if( sqlite3GlobalConfig.bMemstat==0 ){
17433: mem5.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
17434: }
17435:
17436: return SQLITE_OK;
17437: }
17438:
17439: /*
17440: ** Deinitialize this module.
17441: */
17442: static void memsys5Shutdown(void *NotUsed){
17443: UNUSED_PARAMETER(NotUsed);
17444: mem5.mutex = 0;
17445: return;
17446: }
17447:
17448: #ifdef SQLITE_TEST
17449: /*
17450: ** Open the file indicated and write a log of all unfreed memory
17451: ** allocations into that log.
17452: */
17453: SQLITE_PRIVATE void sqlite3Memsys5Dump(const char *zFilename){
17454: FILE *out;
17455: int i, j, n;
17456: int nMinLog;
17457:
17458: if( zFilename==0 || zFilename[0]==0 ){
17459: out = stdout;
17460: }else{
17461: out = fopen(zFilename, "w");
17462: if( out==0 ){
17463: fprintf(stderr, "** Unable to output memory debug output log: %s **\n",
17464: zFilename);
17465: return;
17466: }
17467: }
17468: memsys5Enter();
17469: nMinLog = memsys5Log(mem5.szAtom);
17470: for(i=0; i<=LOGMAX && i+nMinLog<32; i++){
17471: for(n=0, j=mem5.aiFreelist[i]; j>=0; j = MEM5LINK(j)->next, n++){}
17472: fprintf(out, "freelist items of size %d: %d\n", mem5.szAtom << i, n);
17473: }
17474: fprintf(out, "mem5.nAlloc = %llu\n", mem5.nAlloc);
17475: fprintf(out, "mem5.totalAlloc = %llu\n", mem5.totalAlloc);
17476: fprintf(out, "mem5.totalExcess = %llu\n", mem5.totalExcess);
17477: fprintf(out, "mem5.currentOut = %u\n", mem5.currentOut);
17478: fprintf(out, "mem5.currentCount = %u\n", mem5.currentCount);
17479: fprintf(out, "mem5.maxOut = %u\n", mem5.maxOut);
17480: fprintf(out, "mem5.maxCount = %u\n", mem5.maxCount);
17481: fprintf(out, "mem5.maxRequest = %u\n", mem5.maxRequest);
17482: memsys5Leave();
17483: if( out==stdout ){
17484: fflush(stdout);
17485: }else{
17486: fclose(out);
17487: }
17488: }
17489: #endif
17490:
17491: /*
17492: ** This routine is the only routine in this file with external
17493: ** linkage. It returns a pointer to a static sqlite3_mem_methods
17494: ** struct populated with the memsys5 methods.
17495: */
17496: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){
17497: static const sqlite3_mem_methods memsys5Methods = {
17498: memsys5Malloc,
17499: memsys5Free,
17500: memsys5Realloc,
17501: memsys5Size,
17502: memsys5Roundup,
17503: memsys5Init,
17504: memsys5Shutdown,
17505: 0
17506: };
17507: return &memsys5Methods;
17508: }
17509:
17510: #endif /* SQLITE_ENABLE_MEMSYS5 */
17511:
17512: /************** End of mem5.c ************************************************/
17513: /************** Begin file mutex.c *******************************************/
17514: /*
17515: ** 2007 August 14
17516: **
17517: ** The author disclaims copyright to this source code. In place of
17518: ** a legal notice, here is a blessing:
17519: **
17520: ** May you do good and not evil.
17521: ** May you find forgiveness for yourself and forgive others.
17522: ** May you share freely, never taking more than you give.
17523: **
17524: *************************************************************************
17525: ** This file contains the C functions that implement mutexes.
17526: **
17527: ** This file contains code that is common across all mutex implementations.
17528: */
17529:
17530: #if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT)
17531: /*
17532: ** For debugging purposes, record when the mutex subsystem is initialized
17533: ** and uninitialized so that we can assert() if there is an attempt to
17534: ** allocate a mutex while the system is uninitialized.
17535: */
17536: static SQLITE_WSD int mutexIsInit = 0;
17537: #endif /* SQLITE_DEBUG */
17538:
17539:
17540: #ifndef SQLITE_MUTEX_OMIT
17541: /*
17542: ** Initialize the mutex system.
17543: */
17544: SQLITE_PRIVATE int sqlite3MutexInit(void){
17545: int rc = SQLITE_OK;
17546: if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
17547: /* If the xMutexAlloc method has not been set, then the user did not
17548: ** install a mutex implementation via sqlite3_config() prior to
17549: ** sqlite3_initialize() being called. This block copies pointers to
17550: ** the default implementation into the sqlite3GlobalConfig structure.
17551: */
17552: sqlite3_mutex_methods const *pFrom;
17553: sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;
17554:
17555: if( sqlite3GlobalConfig.bCoreMutex ){
17556: pFrom = sqlite3DefaultMutex();
17557: }else{
17558: pFrom = sqlite3NoopMutex();
17559: }
17560: memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc));
17561: memcpy(&pTo->xMutexFree, &pFrom->xMutexFree,
17562: sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree));
17563: pTo->xMutexAlloc = pFrom->xMutexAlloc;
17564: }
17565: rc = sqlite3GlobalConfig.mutex.xMutexInit();
17566:
17567: #ifdef SQLITE_DEBUG
17568: GLOBAL(int, mutexIsInit) = 1;
17569: #endif
17570:
17571: return rc;
17572: }
17573:
17574: /*
17575: ** Shutdown the mutex system. This call frees resources allocated by
17576: ** sqlite3MutexInit().
17577: */
17578: SQLITE_PRIVATE int sqlite3MutexEnd(void){
17579: int rc = SQLITE_OK;
17580: if( sqlite3GlobalConfig.mutex.xMutexEnd ){
17581: rc = sqlite3GlobalConfig.mutex.xMutexEnd();
17582: }
17583:
17584: #ifdef SQLITE_DEBUG
17585: GLOBAL(int, mutexIsInit) = 0;
17586: #endif
17587:
17588: return rc;
17589: }
17590:
17591: /*
17592: ** Retrieve a pointer to a static mutex or allocate a new dynamic one.
17593: */
17594: SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){
17595: #ifndef SQLITE_OMIT_AUTOINIT
17596: if( sqlite3_initialize() ) return 0;
17597: #endif
17598: return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
17599: }
17600:
17601: SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){
17602: if( !sqlite3GlobalConfig.bCoreMutex ){
17603: return 0;
17604: }
17605: assert( GLOBAL(int, mutexIsInit) );
17606: return sqlite3GlobalConfig.mutex.xMutexAlloc(id);
17607: }
17608:
17609: /*
17610: ** Free a dynamic mutex.
17611: */
17612: SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){
17613: if( p ){
17614: sqlite3GlobalConfig.mutex.xMutexFree(p);
17615: }
17616: }
17617:
17618: /*
17619: ** Obtain the mutex p. If some other thread already has the mutex, block
17620: ** until it can be obtained.
17621: */
17622: SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){
17623: if( p ){
17624: sqlite3GlobalConfig.mutex.xMutexEnter(p);
17625: }
17626: }
17627:
17628: /*
17629: ** Obtain the mutex p. If successful, return SQLITE_OK. Otherwise, if another
17630: ** thread holds the mutex and it cannot be obtained, return SQLITE_BUSY.
17631: */
17632: SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){
17633: int rc = SQLITE_OK;
17634: if( p ){
17635: return sqlite3GlobalConfig.mutex.xMutexTry(p);
17636: }
17637: return rc;
17638: }
17639:
17640: /*
17641: ** The sqlite3_mutex_leave() routine exits a mutex that was previously
17642: ** entered by the same thread. The behavior is undefined if the mutex
17643: ** is not currently entered. If a NULL pointer is passed as an argument
17644: ** this function is a no-op.
17645: */
17646: SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){
17647: if( p ){
17648: sqlite3GlobalConfig.mutex.xMutexLeave(p);
17649: }
17650: }
17651:
17652: #ifndef NDEBUG
17653: /*
17654: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
17655: ** intended for use inside assert() statements.
17656: */
17657: SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){
17658: return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p);
17659: }
17660: SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){
17661: return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p);
17662: }
17663: #endif
17664:
17665: #endif /* !defined(SQLITE_MUTEX_OMIT) */
17666:
17667: /************** End of mutex.c ***********************************************/
17668: /************** Begin file mutex_noop.c **************************************/
17669: /*
17670: ** 2008 October 07
17671: **
17672: ** The author disclaims copyright to this source code. In place of
17673: ** a legal notice, here is a blessing:
17674: **
17675: ** May you do good and not evil.
17676: ** May you find forgiveness for yourself and forgive others.
17677: ** May you share freely, never taking more than you give.
17678: **
17679: *************************************************************************
17680: ** This file contains the C functions that implement mutexes.
17681: **
17682: ** This implementation in this file does not provide any mutual
17683: ** exclusion and is thus suitable for use only in applications
17684: ** that use SQLite in a single thread. The routines defined
17685: ** here are place-holders. Applications can substitute working
17686: ** mutex routines at start-time using the
17687: **
17688: ** sqlite3_config(SQLITE_CONFIG_MUTEX,...)
17689: **
17690: ** interface.
17691: **
17692: ** If compiled with SQLITE_DEBUG, then additional logic is inserted
17693: ** that does error checking on mutexes to make sure they are being
17694: ** called correctly.
17695: */
17696:
17697: #ifndef SQLITE_MUTEX_OMIT
17698:
17699: #ifndef SQLITE_DEBUG
17700: /*
17701: ** Stub routines for all mutex methods.
17702: **
17703: ** This routines provide no mutual exclusion or error checking.
17704: */
17705: static int noopMutexInit(void){ return SQLITE_OK; }
17706: static int noopMutexEnd(void){ return SQLITE_OK; }
17707: static sqlite3_mutex *noopMutexAlloc(int id){
17708: UNUSED_PARAMETER(id);
17709: return (sqlite3_mutex*)8;
17710: }
17711: static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
17712: static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
17713: static int noopMutexTry(sqlite3_mutex *p){
17714: UNUSED_PARAMETER(p);
17715: return SQLITE_OK;
17716: }
17717: static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; }
17718:
17719: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){
17720: static const sqlite3_mutex_methods sMutex = {
17721: noopMutexInit,
17722: noopMutexEnd,
17723: noopMutexAlloc,
17724: noopMutexFree,
17725: noopMutexEnter,
17726: noopMutexTry,
17727: noopMutexLeave,
17728:
17729: 0,
17730: 0,
17731: };
17732:
17733: return &sMutex;
17734: }
17735: #endif /* !SQLITE_DEBUG */
17736:
17737: #ifdef SQLITE_DEBUG
17738: /*
17739: ** In this implementation, error checking is provided for testing
17740: ** and debugging purposes. The mutexes still do not provide any
17741: ** mutual exclusion.
17742: */
17743:
17744: /*
17745: ** The mutex object
17746: */
17747: typedef struct sqlite3_debug_mutex {
17748: int id; /* The mutex type */
17749: int cnt; /* Number of entries without a matching leave */
17750: } sqlite3_debug_mutex;
17751:
17752: /*
17753: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
17754: ** intended for use inside assert() statements.
17755: */
17756: static int debugMutexHeld(sqlite3_mutex *pX){
17757: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17758: return p==0 || p->cnt>0;
17759: }
17760: static int debugMutexNotheld(sqlite3_mutex *pX){
17761: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17762: return p==0 || p->cnt==0;
17763: }
17764:
17765: /*
17766: ** Initialize and deinitialize the mutex subsystem.
17767: */
17768: static int debugMutexInit(void){ return SQLITE_OK; }
17769: static int debugMutexEnd(void){ return SQLITE_OK; }
17770:
17771: /*
17772: ** The sqlite3_mutex_alloc() routine allocates a new
17773: ** mutex and returns a pointer to it. If it returns NULL
17774: ** that means that a mutex could not be allocated.
17775: */
17776: static sqlite3_mutex *debugMutexAlloc(int id){
17777: static sqlite3_debug_mutex aStatic[6];
17778: sqlite3_debug_mutex *pNew = 0;
17779: switch( id ){
17780: case SQLITE_MUTEX_FAST:
17781: case SQLITE_MUTEX_RECURSIVE: {
17782: pNew = sqlite3Malloc(sizeof(*pNew));
17783: if( pNew ){
17784: pNew->id = id;
17785: pNew->cnt = 0;
17786: }
17787: break;
17788: }
17789: default: {
17790: assert( id-2 >= 0 );
17791: assert( id-2 < (int)(sizeof(aStatic)/sizeof(aStatic[0])) );
17792: pNew = &aStatic[id-2];
17793: pNew->id = id;
17794: break;
17795: }
17796: }
17797: return (sqlite3_mutex*)pNew;
17798: }
17799:
17800: /*
17801: ** This routine deallocates a previously allocated mutex.
17802: */
17803: static void debugMutexFree(sqlite3_mutex *pX){
17804: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17805: assert( p->cnt==0 );
17806: assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
17807: sqlite3_free(p);
17808: }
17809:
17810: /*
17811: ** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
17812: ** to enter a mutex. If another thread is already within the mutex,
17813: ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
17814: ** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK
17815: ** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can
17816: ** be entered multiple times by the same thread. In such cases the,
17817: ** mutex must be exited an equal number of times before another thread
17818: ** can enter. If the same thread tries to enter any other kind of mutex
17819: ** more than once, the behavior is undefined.
17820: */
17821: static void debugMutexEnter(sqlite3_mutex *pX){
17822: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17823: assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
17824: p->cnt++;
17825: }
17826: static int debugMutexTry(sqlite3_mutex *pX){
17827: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17828: assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
17829: p->cnt++;
17830: return SQLITE_OK;
17831: }
17832:
17833: /*
17834: ** The sqlite3_mutex_leave() routine exits a mutex that was
17835: ** previously entered by the same thread. The behavior
17836: ** is undefined if the mutex is not currently entered or
17837: ** is not currently allocated. SQLite will never do either.
17838: */
17839: static void debugMutexLeave(sqlite3_mutex *pX){
17840: sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX;
17841: assert( debugMutexHeld(pX) );
17842: p->cnt--;
17843: assert( p->id==SQLITE_MUTEX_RECURSIVE || debugMutexNotheld(pX) );
17844: }
17845:
17846: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3NoopMutex(void){
17847: static const sqlite3_mutex_methods sMutex = {
17848: debugMutexInit,
17849: debugMutexEnd,
17850: debugMutexAlloc,
17851: debugMutexFree,
17852: debugMutexEnter,
17853: debugMutexTry,
17854: debugMutexLeave,
17855:
17856: debugMutexHeld,
17857: debugMutexNotheld
17858: };
17859:
17860: return &sMutex;
17861: }
17862: #endif /* SQLITE_DEBUG */
17863:
17864: /*
17865: ** If compiled with SQLITE_MUTEX_NOOP, then the no-op mutex implementation
17866: ** is used regardless of the run-time threadsafety setting.
17867: */
17868: #ifdef SQLITE_MUTEX_NOOP
17869: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
17870: return sqlite3NoopMutex();
17871: }
17872: #endif /* defined(SQLITE_MUTEX_NOOP) */
17873: #endif /* !defined(SQLITE_MUTEX_OMIT) */
17874:
17875: /************** End of mutex_noop.c ******************************************/
17876: /************** Begin file mutex_unix.c **************************************/
17877: /*
17878: ** 2007 August 28
17879: **
17880: ** The author disclaims copyright to this source code. In place of
17881: ** a legal notice, here is a blessing:
17882: **
17883: ** May you do good and not evil.
17884: ** May you find forgiveness for yourself and forgive others.
17885: ** May you share freely, never taking more than you give.
17886: **
17887: *************************************************************************
17888: ** This file contains the C functions that implement mutexes for pthreads
17889: */
17890:
17891: /*
17892: ** The code in this file is only used if we are compiling threadsafe
17893: ** under unix with pthreads.
17894: **
17895: ** Note that this implementation requires a version of pthreads that
17896: ** supports recursive mutexes.
17897: */
17898: #ifdef SQLITE_MUTEX_PTHREADS
17899:
17900: #include <pthread.h>
17901:
17902: /*
17903: ** The sqlite3_mutex.id, sqlite3_mutex.nRef, and sqlite3_mutex.owner fields
17904: ** are necessary under two condidtions: (1) Debug builds and (2) using
17905: ** home-grown mutexes. Encapsulate these conditions into a single #define.
17906: */
17907: #if defined(SQLITE_DEBUG) || defined(SQLITE_HOMEGROWN_RECURSIVE_MUTEX)
17908: # define SQLITE_MUTEX_NREF 1
17909: #else
17910: # define SQLITE_MUTEX_NREF 0
17911: #endif
17912:
17913: /*
17914: ** Each recursive mutex is an instance of the following structure.
17915: */
17916: struct sqlite3_mutex {
17917: pthread_mutex_t mutex; /* Mutex controlling the lock */
17918: #if SQLITE_MUTEX_NREF
17919: int id; /* Mutex type */
17920: volatile int nRef; /* Number of entrances */
17921: volatile pthread_t owner; /* Thread that is within this mutex */
17922: int trace; /* True to trace changes */
17923: #endif
17924: };
17925: #if SQLITE_MUTEX_NREF
17926: #define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0, 0 }
17927: #else
17928: #define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
17929: #endif
17930:
17931: /*
17932: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
17933: ** intended for use only inside assert() statements. On some platforms,
17934: ** there might be race conditions that can cause these routines to
17935: ** deliver incorrect results. In particular, if pthread_equal() is
17936: ** not an atomic operation, then these routines might delivery
17937: ** incorrect results. On most platforms, pthread_equal() is a
17938: ** comparison of two integers and is therefore atomic. But we are
17939: ** told that HPUX is not such a platform. If so, then these routines
17940: ** will not always work correctly on HPUX.
17941: **
17942: ** On those platforms where pthread_equal() is not atomic, SQLite
17943: ** should be compiled without -DSQLITE_DEBUG and with -DNDEBUG to
17944: ** make sure no assert() statements are evaluated and hence these
17945: ** routines are never called.
17946: */
17947: #if !defined(NDEBUG) || defined(SQLITE_DEBUG)
17948: static int pthreadMutexHeld(sqlite3_mutex *p){
17949: return (p->nRef!=0 && pthread_equal(p->owner, pthread_self()));
17950: }
17951: static int pthreadMutexNotheld(sqlite3_mutex *p){
17952: return p->nRef==0 || pthread_equal(p->owner, pthread_self())==0;
17953: }
17954: #endif
17955:
17956: /*
17957: ** Initialize and deinitialize the mutex subsystem.
17958: */
17959: static int pthreadMutexInit(void){ return SQLITE_OK; }
17960: static int pthreadMutexEnd(void){ return SQLITE_OK; }
17961:
17962: /*
17963: ** The sqlite3_mutex_alloc() routine allocates a new
17964: ** mutex and returns a pointer to it. If it returns NULL
17965: ** that means that a mutex could not be allocated. SQLite
17966: ** will unwind its stack and return an error. The argument
17967: ** to sqlite3_mutex_alloc() is one of these integer constants:
17968: **
17969: ** <ul>
17970: ** <li> SQLITE_MUTEX_FAST
17971: ** <li> SQLITE_MUTEX_RECURSIVE
17972: ** <li> SQLITE_MUTEX_STATIC_MASTER
17973: ** <li> SQLITE_MUTEX_STATIC_MEM
17974: ** <li> SQLITE_MUTEX_STATIC_MEM2
17975: ** <li> SQLITE_MUTEX_STATIC_PRNG
17976: ** <li> SQLITE_MUTEX_STATIC_LRU
17977: ** <li> SQLITE_MUTEX_STATIC_PMEM
17978: ** </ul>
17979: **
17980: ** The first two constants cause sqlite3_mutex_alloc() to create
17981: ** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
17982: ** is used but not necessarily so when SQLITE_MUTEX_FAST is used.
17983: ** The mutex implementation does not need to make a distinction
17984: ** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
17985: ** not want to. But SQLite will only request a recursive mutex in
17986: ** cases where it really needs one. If a faster non-recursive mutex
17987: ** implementation is available on the host platform, the mutex subsystem
17988: ** might return such a mutex in response to SQLITE_MUTEX_FAST.
17989: **
17990: ** The other allowed parameters to sqlite3_mutex_alloc() each return
17991: ** a pointer to a static preexisting mutex. Six static mutexes are
17992: ** used by the current version of SQLite. Future versions of SQLite
17993: ** may add additional static mutexes. Static mutexes are for internal
17994: ** use by SQLite only. Applications that use SQLite mutexes should
17995: ** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
17996: ** SQLITE_MUTEX_RECURSIVE.
17997: **
17998: ** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
17999: ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
18000: ** returns a different mutex on every call. But for the static
18001: ** mutex types, the same mutex is returned on every call that has
18002: ** the same type number.
18003: */
18004: static sqlite3_mutex *pthreadMutexAlloc(int iType){
18005: static sqlite3_mutex staticMutexes[] = {
18006: SQLITE3_MUTEX_INITIALIZER,
18007: SQLITE3_MUTEX_INITIALIZER,
18008: SQLITE3_MUTEX_INITIALIZER,
18009: SQLITE3_MUTEX_INITIALIZER,
18010: SQLITE3_MUTEX_INITIALIZER,
18011: SQLITE3_MUTEX_INITIALIZER
18012: };
18013: sqlite3_mutex *p;
18014: switch( iType ){
18015: case SQLITE_MUTEX_RECURSIVE: {
18016: p = sqlite3MallocZero( sizeof(*p) );
18017: if( p ){
18018: #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
18019: /* If recursive mutexes are not available, we will have to
18020: ** build our own. See below. */
18021: pthread_mutex_init(&p->mutex, 0);
18022: #else
18023: /* Use a recursive mutex if it is available */
18024: pthread_mutexattr_t recursiveAttr;
18025: pthread_mutexattr_init(&recursiveAttr);
18026: pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE);
18027: pthread_mutex_init(&p->mutex, &recursiveAttr);
18028: pthread_mutexattr_destroy(&recursiveAttr);
18029: #endif
18030: #if SQLITE_MUTEX_NREF
18031: p->id = iType;
18032: #endif
18033: }
18034: break;
18035: }
18036: case SQLITE_MUTEX_FAST: {
18037: p = sqlite3MallocZero( sizeof(*p) );
18038: if( p ){
18039: #if SQLITE_MUTEX_NREF
18040: p->id = iType;
18041: #endif
18042: pthread_mutex_init(&p->mutex, 0);
18043: }
18044: break;
18045: }
18046: default: {
18047: assert( iType-2 >= 0 );
18048: assert( iType-2 < ArraySize(staticMutexes) );
18049: p = &staticMutexes[iType-2];
18050: #if SQLITE_MUTEX_NREF
18051: p->id = iType;
18052: #endif
18053: break;
18054: }
18055: }
18056: return p;
18057: }
18058:
18059:
18060: /*
18061: ** This routine deallocates a previously
18062: ** allocated mutex. SQLite is careful to deallocate every
18063: ** mutex that it allocates.
18064: */
18065: static void pthreadMutexFree(sqlite3_mutex *p){
18066: assert( p->nRef==0 );
18067: assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
18068: pthread_mutex_destroy(&p->mutex);
18069: sqlite3_free(p);
18070: }
18071:
18072: /*
18073: ** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
18074: ** to enter a mutex. If another thread is already within the mutex,
18075: ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
18076: ** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK
18077: ** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can
18078: ** be entered multiple times by the same thread. In such cases the,
18079: ** mutex must be exited an equal number of times before another thread
18080: ** can enter. If the same thread tries to enter any other kind of mutex
18081: ** more than once, the behavior is undefined.
18082: */
18083: static void pthreadMutexEnter(sqlite3_mutex *p){
18084: assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) );
18085:
18086: #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
18087: /* If recursive mutexes are not available, then we have to grow
18088: ** our own. This implementation assumes that pthread_equal()
18089: ** is atomic - that it cannot be deceived into thinking self
18090: ** and p->owner are equal if p->owner changes between two values
18091: ** that are not equal to self while the comparison is taking place.
18092: ** This implementation also assumes a coherent cache - that
18093: ** separate processes cannot read different values from the same
18094: ** address at the same time. If either of these two conditions
18095: ** are not met, then the mutexes will fail and problems will result.
18096: */
18097: {
18098: pthread_t self = pthread_self();
18099: if( p->nRef>0 && pthread_equal(p->owner, self) ){
18100: p->nRef++;
18101: }else{
18102: pthread_mutex_lock(&p->mutex);
18103: assert( p->nRef==0 );
18104: p->owner = self;
18105: p->nRef = 1;
18106: }
18107: }
18108: #else
18109: /* Use the built-in recursive mutexes if they are available.
18110: */
18111: pthread_mutex_lock(&p->mutex);
18112: #if SQLITE_MUTEX_NREF
18113: assert( p->nRef>0 || p->owner==0 );
18114: p->owner = pthread_self();
18115: p->nRef++;
18116: #endif
18117: #endif
18118:
18119: #ifdef SQLITE_DEBUG
18120: if( p->trace ){
18121: printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18122: }
18123: #endif
18124: }
18125: static int pthreadMutexTry(sqlite3_mutex *p){
18126: int rc;
18127: assert( p->id==SQLITE_MUTEX_RECURSIVE || pthreadMutexNotheld(p) );
18128:
18129: #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
18130: /* If recursive mutexes are not available, then we have to grow
18131: ** our own. This implementation assumes that pthread_equal()
18132: ** is atomic - that it cannot be deceived into thinking self
18133: ** and p->owner are equal if p->owner changes between two values
18134: ** that are not equal to self while the comparison is taking place.
18135: ** This implementation also assumes a coherent cache - that
18136: ** separate processes cannot read different values from the same
18137: ** address at the same time. If either of these two conditions
18138: ** are not met, then the mutexes will fail and problems will result.
18139: */
18140: {
18141: pthread_t self = pthread_self();
18142: if( p->nRef>0 && pthread_equal(p->owner, self) ){
18143: p->nRef++;
18144: rc = SQLITE_OK;
18145: }else if( pthread_mutex_trylock(&p->mutex)==0 ){
18146: assert( p->nRef==0 );
18147: p->owner = self;
18148: p->nRef = 1;
18149: rc = SQLITE_OK;
18150: }else{
18151: rc = SQLITE_BUSY;
18152: }
18153: }
18154: #else
18155: /* Use the built-in recursive mutexes if they are available.
18156: */
18157: if( pthread_mutex_trylock(&p->mutex)==0 ){
18158: #if SQLITE_MUTEX_NREF
18159: p->owner = pthread_self();
18160: p->nRef++;
18161: #endif
18162: rc = SQLITE_OK;
18163: }else{
18164: rc = SQLITE_BUSY;
18165: }
18166: #endif
18167:
18168: #ifdef SQLITE_DEBUG
18169: if( rc==SQLITE_OK && p->trace ){
18170: printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18171: }
18172: #endif
18173: return rc;
18174: }
18175:
18176: /*
18177: ** The sqlite3_mutex_leave() routine exits a mutex that was
18178: ** previously entered by the same thread. The behavior
18179: ** is undefined if the mutex is not currently entered or
18180: ** is not currently allocated. SQLite will never do either.
18181: */
18182: static void pthreadMutexLeave(sqlite3_mutex *p){
18183: assert( pthreadMutexHeld(p) );
18184: #if SQLITE_MUTEX_NREF
18185: p->nRef--;
18186: if( p->nRef==0 ) p->owner = 0;
18187: #endif
18188: assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
18189:
18190: #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
18191: if( p->nRef==0 ){
18192: pthread_mutex_unlock(&p->mutex);
18193: }
18194: #else
18195: pthread_mutex_unlock(&p->mutex);
18196: #endif
18197:
18198: #ifdef SQLITE_DEBUG
18199: if( p->trace ){
18200: printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18201: }
18202: #endif
18203: }
18204:
18205: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
18206: static const sqlite3_mutex_methods sMutex = {
18207: pthreadMutexInit,
18208: pthreadMutexEnd,
18209: pthreadMutexAlloc,
18210: pthreadMutexFree,
18211: pthreadMutexEnter,
18212: pthreadMutexTry,
18213: pthreadMutexLeave,
18214: #ifdef SQLITE_DEBUG
18215: pthreadMutexHeld,
18216: pthreadMutexNotheld
18217: #else
18218: 0,
18219: 0
18220: #endif
18221: };
18222:
18223: return &sMutex;
18224: }
18225:
18226: #endif /* SQLITE_MUTEX_PTHREADS */
18227:
18228: /************** End of mutex_unix.c ******************************************/
18229: /************** Begin file mutex_w32.c ***************************************/
18230: /*
18231: ** 2007 August 14
18232: **
18233: ** The author disclaims copyright to this source code. In place of
18234: ** a legal notice, here is a blessing:
18235: **
18236: ** May you do good and not evil.
18237: ** May you find forgiveness for yourself and forgive others.
18238: ** May you share freely, never taking more than you give.
18239: **
18240: *************************************************************************
18241: ** This file contains the C functions that implement mutexes for win32
18242: */
18243:
18244: /*
18245: ** The code in this file is only used if we are compiling multithreaded
18246: ** on a win32 system.
18247: */
18248: #ifdef SQLITE_MUTEX_W32
18249:
18250: /*
18251: ** Each recursive mutex is an instance of the following structure.
18252: */
18253: struct sqlite3_mutex {
18254: CRITICAL_SECTION mutex; /* Mutex controlling the lock */
18255: int id; /* Mutex type */
18256: #ifdef SQLITE_DEBUG
18257: volatile int nRef; /* Number of enterances */
18258: volatile DWORD owner; /* Thread holding this mutex */
18259: int trace; /* True to trace changes */
18260: #endif
18261: };
18262: #define SQLITE_W32_MUTEX_INITIALIZER { 0 }
18263: #ifdef SQLITE_DEBUG
18264: #define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, 0L, (DWORD)0, 0 }
18265: #else
18266: #define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 }
18267: #endif
18268:
18269: /*
18270: ** Return true (non-zero) if we are running under WinNT, Win2K, WinXP,
18271: ** or WinCE. Return false (zero) for Win95, Win98, or WinME.
18272: **
18273: ** Here is an interesting observation: Win95, Win98, and WinME lack
18274: ** the LockFileEx() API. But we can still statically link against that
18275: ** API as long as we don't call it win running Win95/98/ME. A call to
18276: ** this routine is used to determine if the host is Win95/98/ME or
18277: ** WinNT/2K/XP so that we will know whether or not we can safely call
18278: ** the LockFileEx() API.
18279: **
18280: ** mutexIsNT() is only used for the TryEnterCriticalSection() API call,
18281: ** which is only available if your application was compiled with
18282: ** _WIN32_WINNT defined to a value >= 0x0400. Currently, the only
18283: ** call to TryEnterCriticalSection() is #ifdef'ed out, so #ifdef
18284: ** this out as well.
18285: */
18286: #if 0
1.2.2.1 ! misho 18287: #if SQLITE_OS_WINCE || SQLITE_OS_WINRT
1.2 misho 18288: # define mutexIsNT() (1)
18289: #else
18290: static int mutexIsNT(void){
18291: static int osType = 0;
18292: if( osType==0 ){
18293: OSVERSIONINFO sInfo;
18294: sInfo.dwOSVersionInfoSize = sizeof(sInfo);
18295: GetVersionEx(&sInfo);
18296: osType = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1;
18297: }
18298: return osType==2;
18299: }
18300: #endif /* SQLITE_OS_WINCE */
18301: #endif
18302:
18303: #ifdef SQLITE_DEBUG
18304: /*
18305: ** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routine are
18306: ** intended for use only inside assert() statements.
18307: */
18308: static int winMutexHeld(sqlite3_mutex *p){
18309: return p->nRef!=0 && p->owner==GetCurrentThreadId();
18310: }
18311: static int winMutexNotheld2(sqlite3_mutex *p, DWORD tid){
18312: return p->nRef==0 || p->owner!=tid;
18313: }
18314: static int winMutexNotheld(sqlite3_mutex *p){
18315: DWORD tid = GetCurrentThreadId();
18316: return winMutexNotheld2(p, tid);
18317: }
18318: #endif
18319:
18320:
18321: /*
18322: ** Initialize and deinitialize the mutex subsystem.
18323: */
18324: static sqlite3_mutex winMutex_staticMutexes[6] = {
18325: SQLITE3_MUTEX_INITIALIZER,
18326: SQLITE3_MUTEX_INITIALIZER,
18327: SQLITE3_MUTEX_INITIALIZER,
18328: SQLITE3_MUTEX_INITIALIZER,
18329: SQLITE3_MUTEX_INITIALIZER,
18330: SQLITE3_MUTEX_INITIALIZER
18331: };
18332: static int winMutex_isInit = 0;
18333: /* As winMutexInit() and winMutexEnd() are called as part
18334: ** of the sqlite3_initialize and sqlite3_shutdown()
18335: ** processing, the "interlocked" magic is probably not
18336: ** strictly necessary.
18337: */
18338: static long winMutex_lock = 0;
18339:
1.2.2.1 ! misho 18340: SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds); /* os_win.c */
! 18341:
1.2 misho 18342: static int winMutexInit(void){
18343: /* The first to increment to 1 does actual initialization */
18344: if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){
18345: int i;
18346: for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
1.2.2.1 ! misho 18347: #if SQLITE_OS_WINRT
! 18348: InitializeCriticalSectionEx(&winMutex_staticMutexes[i].mutex, 0, 0);
! 18349: #else
1.2 misho 18350: InitializeCriticalSection(&winMutex_staticMutexes[i].mutex);
1.2.2.1 ! misho 18351: #endif
1.2 misho 18352: }
18353: winMutex_isInit = 1;
18354: }else{
18355: /* Someone else is in the process of initing the static mutexes */
18356: while( !winMutex_isInit ){
1.2.2.1 ! misho 18357: sqlite3_win32_sleep(1);
1.2 misho 18358: }
18359: }
18360: return SQLITE_OK;
18361: }
18362:
18363: static int winMutexEnd(void){
18364: /* The first to decrement to 0 does actual shutdown
18365: ** (which should be the last to shutdown.) */
18366: if( InterlockedCompareExchange(&winMutex_lock, 0, 1)==1 ){
18367: if( winMutex_isInit==1 ){
18368: int i;
18369: for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
18370: DeleteCriticalSection(&winMutex_staticMutexes[i].mutex);
18371: }
18372: winMutex_isInit = 0;
18373: }
18374: }
18375: return SQLITE_OK;
18376: }
18377:
18378: /*
18379: ** The sqlite3_mutex_alloc() routine allocates a new
18380: ** mutex and returns a pointer to it. If it returns NULL
18381: ** that means that a mutex could not be allocated. SQLite
18382: ** will unwind its stack and return an error. The argument
18383: ** to sqlite3_mutex_alloc() is one of these integer constants:
18384: **
18385: ** <ul>
18386: ** <li> SQLITE_MUTEX_FAST
18387: ** <li> SQLITE_MUTEX_RECURSIVE
18388: ** <li> SQLITE_MUTEX_STATIC_MASTER
18389: ** <li> SQLITE_MUTEX_STATIC_MEM
18390: ** <li> SQLITE_MUTEX_STATIC_MEM2
18391: ** <li> SQLITE_MUTEX_STATIC_PRNG
18392: ** <li> SQLITE_MUTEX_STATIC_LRU
18393: ** <li> SQLITE_MUTEX_STATIC_PMEM
18394: ** </ul>
18395: **
18396: ** The first two constants cause sqlite3_mutex_alloc() to create
18397: ** a new mutex. The new mutex is recursive when SQLITE_MUTEX_RECURSIVE
18398: ** is used but not necessarily so when SQLITE_MUTEX_FAST is used.
18399: ** The mutex implementation does not need to make a distinction
18400: ** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does
18401: ** not want to. But SQLite will only request a recursive mutex in
18402: ** cases where it really needs one. If a faster non-recursive mutex
18403: ** implementation is available on the host platform, the mutex subsystem
18404: ** might return such a mutex in response to SQLITE_MUTEX_FAST.
18405: **
18406: ** The other allowed parameters to sqlite3_mutex_alloc() each return
18407: ** a pointer to a static preexisting mutex. Six static mutexes are
18408: ** used by the current version of SQLite. Future versions of SQLite
18409: ** may add additional static mutexes. Static mutexes are for internal
18410: ** use by SQLite only. Applications that use SQLite mutexes should
18411: ** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or
18412: ** SQLITE_MUTEX_RECURSIVE.
18413: **
18414: ** Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST
18415: ** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc()
18416: ** returns a different mutex on every call. But for the static
18417: ** mutex types, the same mutex is returned on every call that has
18418: ** the same type number.
18419: */
18420: static sqlite3_mutex *winMutexAlloc(int iType){
18421: sqlite3_mutex *p;
18422:
18423: switch( iType ){
18424: case SQLITE_MUTEX_FAST:
18425: case SQLITE_MUTEX_RECURSIVE: {
18426: p = sqlite3MallocZero( sizeof(*p) );
18427: if( p ){
18428: #ifdef SQLITE_DEBUG
18429: p->id = iType;
18430: #endif
1.2.2.1 ! misho 18431: #if SQLITE_OS_WINRT
! 18432: InitializeCriticalSectionEx(&p->mutex, 0, 0);
! 18433: #else
1.2 misho 18434: InitializeCriticalSection(&p->mutex);
1.2.2.1 ! misho 18435: #endif
1.2 misho 18436: }
18437: break;
18438: }
18439: default: {
18440: assert( winMutex_isInit==1 );
18441: assert( iType-2 >= 0 );
18442: assert( iType-2 < ArraySize(winMutex_staticMutexes) );
18443: p = &winMutex_staticMutexes[iType-2];
18444: #ifdef SQLITE_DEBUG
18445: p->id = iType;
18446: #endif
18447: break;
18448: }
18449: }
18450: return p;
18451: }
18452:
18453:
18454: /*
18455: ** This routine deallocates a previously
18456: ** allocated mutex. SQLite is careful to deallocate every
18457: ** mutex that it allocates.
18458: */
18459: static void winMutexFree(sqlite3_mutex *p){
18460: assert( p );
18461: assert( p->nRef==0 && p->owner==0 );
18462: assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
18463: DeleteCriticalSection(&p->mutex);
18464: sqlite3_free(p);
18465: }
18466:
18467: /*
18468: ** The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt
18469: ** to enter a mutex. If another thread is already within the mutex,
18470: ** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return
18471: ** SQLITE_BUSY. The sqlite3_mutex_try() interface returns SQLITE_OK
18472: ** upon successful entry. Mutexes created using SQLITE_MUTEX_RECURSIVE can
18473: ** be entered multiple times by the same thread. In such cases the,
18474: ** mutex must be exited an equal number of times before another thread
18475: ** can enter. If the same thread tries to enter any other kind of mutex
18476: ** more than once, the behavior is undefined.
18477: */
18478: static void winMutexEnter(sqlite3_mutex *p){
18479: #ifdef SQLITE_DEBUG
18480: DWORD tid = GetCurrentThreadId();
18481: assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) );
18482: #endif
18483: EnterCriticalSection(&p->mutex);
18484: #ifdef SQLITE_DEBUG
18485: assert( p->nRef>0 || p->owner==0 );
18486: p->owner = tid;
18487: p->nRef++;
18488: if( p->trace ){
18489: printf("enter mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18490: }
18491: #endif
18492: }
18493: static int winMutexTry(sqlite3_mutex *p){
18494: #ifndef NDEBUG
18495: DWORD tid = GetCurrentThreadId();
18496: #endif
18497: int rc = SQLITE_BUSY;
18498: assert( p->id==SQLITE_MUTEX_RECURSIVE || winMutexNotheld2(p, tid) );
18499: /*
18500: ** The sqlite3_mutex_try() routine is very rarely used, and when it
18501: ** is used it is merely an optimization. So it is OK for it to always
18502: ** fail.
18503: **
18504: ** The TryEnterCriticalSection() interface is only available on WinNT.
18505: ** And some windows compilers complain if you try to use it without
18506: ** first doing some #defines that prevent SQLite from building on Win98.
18507: ** For that reason, we will omit this optimization for now. See
18508: ** ticket #2685.
18509: */
18510: #if 0
18511: if( mutexIsNT() && TryEnterCriticalSection(&p->mutex) ){
18512: p->owner = tid;
18513: p->nRef++;
18514: rc = SQLITE_OK;
18515: }
18516: #else
18517: UNUSED_PARAMETER(p);
18518: #endif
18519: #ifdef SQLITE_DEBUG
18520: if( rc==SQLITE_OK && p->trace ){
18521: printf("try mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18522: }
18523: #endif
18524: return rc;
18525: }
18526:
18527: /*
18528: ** The sqlite3_mutex_leave() routine exits a mutex that was
18529: ** previously entered by the same thread. The behavior
18530: ** is undefined if the mutex is not currently entered or
18531: ** is not currently allocated. SQLite will never do either.
18532: */
18533: static void winMutexLeave(sqlite3_mutex *p){
18534: #ifndef NDEBUG
18535: DWORD tid = GetCurrentThreadId();
18536: assert( p->nRef>0 );
18537: assert( p->owner==tid );
18538: p->nRef--;
18539: if( p->nRef==0 ) p->owner = 0;
18540: assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
18541: #endif
18542: LeaveCriticalSection(&p->mutex);
18543: #ifdef SQLITE_DEBUG
18544: if( p->trace ){
18545: printf("leave mutex %p (%d) with nRef=%d\n", p, p->trace, p->nRef);
18546: }
18547: #endif
18548: }
18549:
18550: SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){
18551: static const sqlite3_mutex_methods sMutex = {
18552: winMutexInit,
18553: winMutexEnd,
18554: winMutexAlloc,
18555: winMutexFree,
18556: winMutexEnter,
18557: winMutexTry,
18558: winMutexLeave,
18559: #ifdef SQLITE_DEBUG
18560: winMutexHeld,
18561: winMutexNotheld
18562: #else
18563: 0,
18564: 0
18565: #endif
18566: };
18567:
18568: return &sMutex;
18569: }
18570: #endif /* SQLITE_MUTEX_W32 */
18571:
18572: /************** End of mutex_w32.c *******************************************/
18573: /************** Begin file malloc.c ******************************************/
18574: /*
18575: ** 2001 September 15
18576: **
18577: ** The author disclaims copyright to this source code. In place of
18578: ** a legal notice, here is a blessing:
18579: **
18580: ** May you do good and not evil.
18581: ** May you find forgiveness for yourself and forgive others.
18582: ** May you share freely, never taking more than you give.
18583: **
18584: *************************************************************************
18585: **
18586: ** Memory allocation functions used throughout sqlite.
18587: */
18588: /* #include <stdarg.h> */
18589:
18590: /*
18591: ** Attempt to release up to n bytes of non-essential memory currently
18592: ** held by SQLite. An example of non-essential memory is memory used to
18593: ** cache database pages that are not currently in use.
18594: */
18595: SQLITE_API int sqlite3_release_memory(int n){
18596: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
18597: return sqlite3PcacheReleaseMemory(n);
18598: #else
18599: /* IMPLEMENTATION-OF: R-34391-24921 The sqlite3_release_memory() routine
18600: ** is a no-op returning zero if SQLite is not compiled with
18601: ** SQLITE_ENABLE_MEMORY_MANAGEMENT. */
18602: UNUSED_PARAMETER(n);
18603: return 0;
18604: #endif
18605: }
18606:
18607: /*
18608: ** An instance of the following object records the location of
18609: ** each unused scratch buffer.
18610: */
18611: typedef struct ScratchFreeslot {
18612: struct ScratchFreeslot *pNext; /* Next unused scratch buffer */
18613: } ScratchFreeslot;
18614:
18615: /*
18616: ** State information local to the memory allocation subsystem.
18617: */
18618: static SQLITE_WSD struct Mem0Global {
18619: sqlite3_mutex *mutex; /* Mutex to serialize access */
18620:
18621: /*
18622: ** The alarm callback and its arguments. The mem0.mutex lock will
18623: ** be held while the callback is running. Recursive calls into
18624: ** the memory subsystem are allowed, but no new callbacks will be
18625: ** issued.
18626: */
18627: sqlite3_int64 alarmThreshold;
18628: void (*alarmCallback)(void*, sqlite3_int64,int);
18629: void *alarmArg;
18630:
18631: /*
18632: ** Pointers to the end of sqlite3GlobalConfig.pScratch memory
18633: ** (so that a range test can be used to determine if an allocation
18634: ** being freed came from pScratch) and a pointer to the list of
18635: ** unused scratch allocations.
18636: */
18637: void *pScratchEnd;
18638: ScratchFreeslot *pScratchFree;
18639: u32 nScratchFree;
18640:
18641: /*
18642: ** True if heap is nearly "full" where "full" is defined by the
18643: ** sqlite3_soft_heap_limit() setting.
18644: */
18645: int nearlyFull;
18646: } mem0 = { 0, 0, 0, 0, 0, 0, 0, 0 };
18647:
18648: #define mem0 GLOBAL(struct Mem0Global, mem0)
18649:
18650: /*
18651: ** This routine runs when the memory allocator sees that the
18652: ** total memory allocation is about to exceed the soft heap
18653: ** limit.
18654: */
18655: static void softHeapLimitEnforcer(
18656: void *NotUsed,
18657: sqlite3_int64 NotUsed2,
18658: int allocSize
18659: ){
18660: UNUSED_PARAMETER2(NotUsed, NotUsed2);
18661: sqlite3_release_memory(allocSize);
18662: }
18663:
18664: /*
18665: ** Change the alarm callback
18666: */
18667: static int sqlite3MemoryAlarm(
18668: void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
18669: void *pArg,
18670: sqlite3_int64 iThreshold
18671: ){
18672: int nUsed;
18673: sqlite3_mutex_enter(mem0.mutex);
18674: mem0.alarmCallback = xCallback;
18675: mem0.alarmArg = pArg;
18676: mem0.alarmThreshold = iThreshold;
18677: nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
18678: mem0.nearlyFull = (iThreshold>0 && iThreshold<=nUsed);
18679: sqlite3_mutex_leave(mem0.mutex);
18680: return SQLITE_OK;
18681: }
18682:
18683: #ifndef SQLITE_OMIT_DEPRECATED
18684: /*
18685: ** Deprecated external interface. Internal/core SQLite code
18686: ** should call sqlite3MemoryAlarm.
18687: */
18688: SQLITE_API int sqlite3_memory_alarm(
18689: void(*xCallback)(void *pArg, sqlite3_int64 used,int N),
18690: void *pArg,
18691: sqlite3_int64 iThreshold
18692: ){
18693: return sqlite3MemoryAlarm(xCallback, pArg, iThreshold);
18694: }
18695: #endif
18696:
18697: /*
18698: ** Set the soft heap-size limit for the library. Passing a zero or
18699: ** negative value indicates no limit.
18700: */
18701: SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){
18702: sqlite3_int64 priorLimit;
18703: sqlite3_int64 excess;
18704: #ifndef SQLITE_OMIT_AUTOINIT
18705: int rc = sqlite3_initialize();
18706: if( rc ) return -1;
18707: #endif
18708: sqlite3_mutex_enter(mem0.mutex);
18709: priorLimit = mem0.alarmThreshold;
18710: sqlite3_mutex_leave(mem0.mutex);
18711: if( n<0 ) return priorLimit;
18712: if( n>0 ){
18713: sqlite3MemoryAlarm(softHeapLimitEnforcer, 0, n);
18714: }else{
18715: sqlite3MemoryAlarm(0, 0, 0);
18716: }
18717: excess = sqlite3_memory_used() - n;
18718: if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff));
18719: return priorLimit;
18720: }
18721: SQLITE_API void sqlite3_soft_heap_limit(int n){
18722: if( n<0 ) n = 0;
18723: sqlite3_soft_heap_limit64(n);
18724: }
18725:
18726: /*
18727: ** Initialize the memory allocation subsystem.
18728: */
18729: SQLITE_PRIVATE int sqlite3MallocInit(void){
18730: if( sqlite3GlobalConfig.m.xMalloc==0 ){
18731: sqlite3MemSetDefault();
18732: }
18733: memset(&mem0, 0, sizeof(mem0));
18734: if( sqlite3GlobalConfig.bCoreMutex ){
18735: mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM);
18736: }
18737: if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100
18738: && sqlite3GlobalConfig.nScratch>0 ){
18739: int i, n, sz;
18740: ScratchFreeslot *pSlot;
18741: sz = ROUNDDOWN8(sqlite3GlobalConfig.szScratch);
18742: sqlite3GlobalConfig.szScratch = sz;
18743: pSlot = (ScratchFreeslot*)sqlite3GlobalConfig.pScratch;
18744: n = sqlite3GlobalConfig.nScratch;
18745: mem0.pScratchFree = pSlot;
18746: mem0.nScratchFree = n;
18747: for(i=0; i<n-1; i++){
18748: pSlot->pNext = (ScratchFreeslot*)(sz+(char*)pSlot);
18749: pSlot = pSlot->pNext;
18750: }
18751: pSlot->pNext = 0;
18752: mem0.pScratchEnd = (void*)&pSlot[1];
18753: }else{
18754: mem0.pScratchEnd = 0;
18755: sqlite3GlobalConfig.pScratch = 0;
18756: sqlite3GlobalConfig.szScratch = 0;
18757: sqlite3GlobalConfig.nScratch = 0;
18758: }
18759: if( sqlite3GlobalConfig.pPage==0 || sqlite3GlobalConfig.szPage<512
18760: || sqlite3GlobalConfig.nPage<1 ){
18761: sqlite3GlobalConfig.pPage = 0;
18762: sqlite3GlobalConfig.szPage = 0;
18763: sqlite3GlobalConfig.nPage = 0;
18764: }
18765: return sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData);
18766: }
18767:
18768: /*
18769: ** Return true if the heap is currently under memory pressure - in other
18770: ** words if the amount of heap used is close to the limit set by
18771: ** sqlite3_soft_heap_limit().
18772: */
18773: SQLITE_PRIVATE int sqlite3HeapNearlyFull(void){
18774: return mem0.nearlyFull;
18775: }
18776:
18777: /*
18778: ** Deinitialize the memory allocation subsystem.
18779: */
18780: SQLITE_PRIVATE void sqlite3MallocEnd(void){
18781: if( sqlite3GlobalConfig.m.xShutdown ){
18782: sqlite3GlobalConfig.m.xShutdown(sqlite3GlobalConfig.m.pAppData);
18783: }
18784: memset(&mem0, 0, sizeof(mem0));
18785: }
18786:
18787: /*
18788: ** Return the amount of memory currently checked out.
18789: */
18790: SQLITE_API sqlite3_int64 sqlite3_memory_used(void){
18791: int n, mx;
18792: sqlite3_int64 res;
18793: sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, 0);
18794: res = (sqlite3_int64)n; /* Work around bug in Borland C. Ticket #3216 */
18795: return res;
18796: }
18797:
18798: /*
18799: ** Return the maximum amount of memory that has ever been
18800: ** checked out since either the beginning of this process
18801: ** or since the most recent reset.
18802: */
18803: SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){
18804: int n, mx;
18805: sqlite3_int64 res;
18806: sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, resetFlag);
18807: res = (sqlite3_int64)mx; /* Work around bug in Borland C. Ticket #3216 */
18808: return res;
18809: }
18810:
18811: /*
18812: ** Trigger the alarm
18813: */
18814: static void sqlite3MallocAlarm(int nByte){
18815: void (*xCallback)(void*,sqlite3_int64,int);
18816: sqlite3_int64 nowUsed;
18817: void *pArg;
18818: if( mem0.alarmCallback==0 ) return;
18819: xCallback = mem0.alarmCallback;
18820: nowUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
18821: pArg = mem0.alarmArg;
18822: mem0.alarmCallback = 0;
18823: sqlite3_mutex_leave(mem0.mutex);
18824: xCallback(pArg, nowUsed, nByte);
18825: sqlite3_mutex_enter(mem0.mutex);
18826: mem0.alarmCallback = xCallback;
18827: mem0.alarmArg = pArg;
18828: }
18829:
18830: /*
18831: ** Do a memory allocation with statistics and alarms. Assume the
18832: ** lock is already held.
18833: */
18834: static int mallocWithAlarm(int n, void **pp){
18835: int nFull;
18836: void *p;
18837: assert( sqlite3_mutex_held(mem0.mutex) );
18838: nFull = sqlite3GlobalConfig.m.xRoundup(n);
18839: sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, n);
18840: if( mem0.alarmCallback!=0 ){
18841: int nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED);
18842: if( nUsed >= mem0.alarmThreshold - nFull ){
18843: mem0.nearlyFull = 1;
18844: sqlite3MallocAlarm(nFull);
18845: }else{
18846: mem0.nearlyFull = 0;
18847: }
18848: }
18849: p = sqlite3GlobalConfig.m.xMalloc(nFull);
18850: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
18851: if( p==0 && mem0.alarmCallback ){
18852: sqlite3MallocAlarm(nFull);
18853: p = sqlite3GlobalConfig.m.xMalloc(nFull);
18854: }
18855: #endif
18856: if( p ){
18857: nFull = sqlite3MallocSize(p);
18858: sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nFull);
18859: sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, 1);
18860: }
18861: *pp = p;
18862: return nFull;
18863: }
18864:
18865: /*
18866: ** Allocate memory. This routine is like sqlite3_malloc() except that it
18867: ** assumes the memory subsystem has already been initialized.
18868: */
18869: SQLITE_PRIVATE void *sqlite3Malloc(int n){
18870: void *p;
18871: if( n<=0 /* IMP: R-65312-04917 */
18872: || n>=0x7fffff00
18873: ){
18874: /* A memory allocation of a number of bytes which is near the maximum
18875: ** signed integer value might cause an integer overflow inside of the
18876: ** xMalloc(). Hence we limit the maximum size to 0x7fffff00, giving
18877: ** 255 bytes of overhead. SQLite itself will never use anything near
18878: ** this amount. The only way to reach the limit is with sqlite3_malloc() */
18879: p = 0;
18880: }else if( sqlite3GlobalConfig.bMemstat ){
18881: sqlite3_mutex_enter(mem0.mutex);
18882: mallocWithAlarm(n, &p);
18883: sqlite3_mutex_leave(mem0.mutex);
18884: }else{
18885: p = sqlite3GlobalConfig.m.xMalloc(n);
18886: }
18887: assert( EIGHT_BYTE_ALIGNMENT(p) ); /* IMP: R-04675-44850 */
18888: return p;
18889: }
18890:
18891: /*
18892: ** This version of the memory allocation is for use by the application.
18893: ** First make sure the memory subsystem is initialized, then do the
18894: ** allocation.
18895: */
18896: SQLITE_API void *sqlite3_malloc(int n){
18897: #ifndef SQLITE_OMIT_AUTOINIT
18898: if( sqlite3_initialize() ) return 0;
18899: #endif
18900: return sqlite3Malloc(n);
18901: }
18902:
18903: /*
18904: ** Each thread may only have a single outstanding allocation from
18905: ** xScratchMalloc(). We verify this constraint in the single-threaded
18906: ** case by setting scratchAllocOut to 1 when an allocation
18907: ** is outstanding clearing it when the allocation is freed.
18908: */
18909: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
18910: static int scratchAllocOut = 0;
18911: #endif
18912:
18913:
18914: /*
18915: ** Allocate memory that is to be used and released right away.
18916: ** This routine is similar to alloca() in that it is not intended
18917: ** for situations where the memory might be held long-term. This
18918: ** routine is intended to get memory to old large transient data
18919: ** structures that would not normally fit on the stack of an
18920: ** embedded processor.
18921: */
18922: SQLITE_PRIVATE void *sqlite3ScratchMalloc(int n){
18923: void *p;
18924: assert( n>0 );
18925:
18926: sqlite3_mutex_enter(mem0.mutex);
18927: if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){
18928: p = mem0.pScratchFree;
18929: mem0.pScratchFree = mem0.pScratchFree->pNext;
18930: mem0.nScratchFree--;
18931: sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, 1);
18932: sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
18933: sqlite3_mutex_leave(mem0.mutex);
18934: }else{
18935: if( sqlite3GlobalConfig.bMemstat ){
18936: sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n);
18937: n = mallocWithAlarm(n, &p);
18938: if( p ) sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, n);
18939: sqlite3_mutex_leave(mem0.mutex);
18940: }else{
18941: sqlite3_mutex_leave(mem0.mutex);
18942: p = sqlite3GlobalConfig.m.xMalloc(n);
18943: }
18944: sqlite3MemdebugSetType(p, MEMTYPE_SCRATCH);
18945: }
18946: assert( sqlite3_mutex_notheld(mem0.mutex) );
18947:
18948:
18949: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
18950: /* Verify that no more than two scratch allocations per thread
18951: ** are outstanding at one time. (This is only checked in the
18952: ** single-threaded case since checking in the multi-threaded case
18953: ** would be much more complicated.) */
18954: assert( scratchAllocOut<=1 );
18955: if( p ) scratchAllocOut++;
18956: #endif
18957:
18958: return p;
18959: }
18960: SQLITE_PRIVATE void sqlite3ScratchFree(void *p){
18961: if( p ){
18962:
18963: #if SQLITE_THREADSAFE==0 && !defined(NDEBUG)
18964: /* Verify that no more than two scratch allocation per thread
18965: ** is outstanding at one time. (This is only checked in the
18966: ** single-threaded case since checking in the multi-threaded case
18967: ** would be much more complicated.) */
18968: assert( scratchAllocOut>=1 && scratchAllocOut<=2 );
18969: scratchAllocOut--;
18970: #endif
18971:
18972: if( p>=sqlite3GlobalConfig.pScratch && p<mem0.pScratchEnd ){
18973: /* Release memory from the SQLITE_CONFIG_SCRATCH allocation */
18974: ScratchFreeslot *pSlot;
18975: pSlot = (ScratchFreeslot*)p;
18976: sqlite3_mutex_enter(mem0.mutex);
18977: pSlot->pNext = mem0.pScratchFree;
18978: mem0.pScratchFree = pSlot;
18979: mem0.nScratchFree++;
18980: assert( mem0.nScratchFree <= (u32)sqlite3GlobalConfig.nScratch );
18981: sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, -1);
18982: sqlite3_mutex_leave(mem0.mutex);
18983: }else{
18984: /* Release memory back to the heap */
18985: assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) );
18986: assert( sqlite3MemdebugNoType(p, ~MEMTYPE_SCRATCH) );
18987: sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
18988: if( sqlite3GlobalConfig.bMemstat ){
18989: int iSize = sqlite3MallocSize(p);
18990: sqlite3_mutex_enter(mem0.mutex);
18991: sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, -iSize);
18992: sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -iSize);
18993: sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
18994: sqlite3GlobalConfig.m.xFree(p);
18995: sqlite3_mutex_leave(mem0.mutex);
18996: }else{
18997: sqlite3GlobalConfig.m.xFree(p);
18998: }
18999: }
19000: }
19001: }
19002:
19003: /*
19004: ** TRUE if p is a lookaside memory allocation from db
19005: */
19006: #ifndef SQLITE_OMIT_LOOKASIDE
19007: static int isLookaside(sqlite3 *db, void *p){
19008: return p && p>=db->lookaside.pStart && p<db->lookaside.pEnd;
19009: }
19010: #else
19011: #define isLookaside(A,B) 0
19012: #endif
19013:
19014: /*
19015: ** Return the size of a memory allocation previously obtained from
19016: ** sqlite3Malloc() or sqlite3_malloc().
19017: */
19018: SQLITE_PRIVATE int sqlite3MallocSize(void *p){
19019: assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
19020: assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
19021: return sqlite3GlobalConfig.m.xSize(p);
19022: }
19023: SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){
19024: assert( db==0 || sqlite3_mutex_held(db->mutex) );
19025: if( db && isLookaside(db, p) ){
19026: return db->lookaside.sz;
19027: }else{
19028: assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
19029: assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
19030: assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
19031: return sqlite3GlobalConfig.m.xSize(p);
19032: }
19033: }
19034:
19035: /*
19036: ** Free memory previously obtained from sqlite3Malloc().
19037: */
19038: SQLITE_API void sqlite3_free(void *p){
19039: if( p==0 ) return; /* IMP: R-49053-54554 */
19040: assert( sqlite3MemdebugNoType(p, MEMTYPE_DB) );
19041: assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) );
19042: if( sqlite3GlobalConfig.bMemstat ){
19043: sqlite3_mutex_enter(mem0.mutex);
19044: sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -sqlite3MallocSize(p));
19045: sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1);
19046: sqlite3GlobalConfig.m.xFree(p);
19047: sqlite3_mutex_leave(mem0.mutex);
19048: }else{
19049: sqlite3GlobalConfig.m.xFree(p);
19050: }
19051: }
19052:
19053: /*
19054: ** Free memory that might be associated with a particular database
19055: ** connection.
19056: */
19057: SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){
19058: assert( db==0 || sqlite3_mutex_held(db->mutex) );
19059: if( db ){
19060: if( db->pnBytesFreed ){
19061: *db->pnBytesFreed += sqlite3DbMallocSize(db, p);
19062: return;
19063: }
19064: if( isLookaside(db, p) ){
19065: LookasideSlot *pBuf = (LookasideSlot*)p;
1.2.2.1 ! misho 19066: #if SQLITE_DEBUG
! 19067: /* Trash all content in the buffer being freed */
! 19068: memset(p, 0xaa, db->lookaside.sz);
! 19069: #endif
1.2 misho 19070: pBuf->pNext = db->lookaside.pFree;
19071: db->lookaside.pFree = pBuf;
19072: db->lookaside.nOut--;
19073: return;
19074: }
19075: }
19076: assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
19077: assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
19078: assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) );
19079: sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
19080: sqlite3_free(p);
19081: }
19082:
19083: /*
19084: ** Change the size of an existing memory allocation
19085: */
19086: SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, int nBytes){
19087: int nOld, nNew, nDiff;
19088: void *pNew;
19089: if( pOld==0 ){
19090: return sqlite3Malloc(nBytes); /* IMP: R-28354-25769 */
19091: }
19092: if( nBytes<=0 ){
19093: sqlite3_free(pOld); /* IMP: R-31593-10574 */
19094: return 0;
19095: }
19096: if( nBytes>=0x7fffff00 ){
19097: /* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */
19098: return 0;
19099: }
19100: nOld = sqlite3MallocSize(pOld);
19101: /* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second
19102: ** argument to xRealloc is always a value returned by a prior call to
19103: ** xRoundup. */
19104: nNew = sqlite3GlobalConfig.m.xRoundup(nBytes);
19105: if( nOld==nNew ){
19106: pNew = pOld;
19107: }else if( sqlite3GlobalConfig.bMemstat ){
19108: sqlite3_mutex_enter(mem0.mutex);
19109: sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, nBytes);
19110: nDiff = nNew - nOld;
19111: if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >=
19112: mem0.alarmThreshold-nDiff ){
19113: sqlite3MallocAlarm(nDiff);
19114: }
19115: assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) );
19116: assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) );
19117: pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
19118: if( pNew==0 && mem0.alarmCallback ){
19119: sqlite3MallocAlarm(nBytes);
19120: pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
19121: }
19122: if( pNew ){
19123: nNew = sqlite3MallocSize(pNew);
19124: sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nNew-nOld);
19125: }
19126: sqlite3_mutex_leave(mem0.mutex);
19127: }else{
19128: pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
19129: }
19130: assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-04675-44850 */
19131: return pNew;
19132: }
19133:
19134: /*
19135: ** The public interface to sqlite3Realloc. Make sure that the memory
19136: ** subsystem is initialized prior to invoking sqliteRealloc.
19137: */
19138: SQLITE_API void *sqlite3_realloc(void *pOld, int n){
19139: #ifndef SQLITE_OMIT_AUTOINIT
19140: if( sqlite3_initialize() ) return 0;
19141: #endif
19142: return sqlite3Realloc(pOld, n);
19143: }
19144:
19145:
19146: /*
19147: ** Allocate and zero memory.
19148: */
19149: SQLITE_PRIVATE void *sqlite3MallocZero(int n){
19150: void *p = sqlite3Malloc(n);
19151: if( p ){
19152: memset(p, 0, n);
19153: }
19154: return p;
19155: }
19156:
19157: /*
19158: ** Allocate and zero memory. If the allocation fails, make
19159: ** the mallocFailed flag in the connection pointer.
19160: */
19161: SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, int n){
19162: void *p = sqlite3DbMallocRaw(db, n);
19163: if( p ){
19164: memset(p, 0, n);
19165: }
19166: return p;
19167: }
19168:
19169: /*
19170: ** Allocate and zero memory. If the allocation fails, make
19171: ** the mallocFailed flag in the connection pointer.
19172: **
19173: ** If db!=0 and db->mallocFailed is true (indicating a prior malloc
19174: ** failure on the same database connection) then always return 0.
19175: ** Hence for a particular database connection, once malloc starts
19176: ** failing, it fails consistently until mallocFailed is reset.
19177: ** This is an important assumption. There are many places in the
19178: ** code that do things like this:
19179: **
19180: ** int *a = (int*)sqlite3DbMallocRaw(db, 100);
19181: ** int *b = (int*)sqlite3DbMallocRaw(db, 200);
19182: ** if( b ) a[10] = 9;
19183: **
19184: ** In other words, if a subsequent malloc (ex: "b") worked, it is assumed
19185: ** that all prior mallocs (ex: "a") worked too.
19186: */
19187: SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, int n){
19188: void *p;
19189: assert( db==0 || sqlite3_mutex_held(db->mutex) );
19190: assert( db==0 || db->pnBytesFreed==0 );
19191: #ifndef SQLITE_OMIT_LOOKASIDE
19192: if( db ){
19193: LookasideSlot *pBuf;
19194: if( db->mallocFailed ){
19195: return 0;
19196: }
19197: if( db->lookaside.bEnabled ){
19198: if( n>db->lookaside.sz ){
19199: db->lookaside.anStat[1]++;
19200: }else if( (pBuf = db->lookaside.pFree)==0 ){
19201: db->lookaside.anStat[2]++;
19202: }else{
19203: db->lookaside.pFree = pBuf->pNext;
19204: db->lookaside.nOut++;
19205: db->lookaside.anStat[0]++;
19206: if( db->lookaside.nOut>db->lookaside.mxOut ){
19207: db->lookaside.mxOut = db->lookaside.nOut;
19208: }
19209: return (void*)pBuf;
19210: }
19211: }
19212: }
19213: #else
19214: if( db && db->mallocFailed ){
19215: return 0;
19216: }
19217: #endif
19218: p = sqlite3Malloc(n);
19219: if( !p && db ){
19220: db->mallocFailed = 1;
19221: }
19222: sqlite3MemdebugSetType(p, MEMTYPE_DB |
19223: ((db && db->lookaside.bEnabled) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
19224: return p;
19225: }
19226:
19227: /*
19228: ** Resize the block of memory pointed to by p to n bytes. If the
19229: ** resize fails, set the mallocFailed flag in the connection object.
19230: */
19231: SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, int n){
19232: void *pNew = 0;
19233: assert( db!=0 );
19234: assert( sqlite3_mutex_held(db->mutex) );
19235: if( db->mallocFailed==0 ){
19236: if( p==0 ){
19237: return sqlite3DbMallocRaw(db, n);
19238: }
19239: if( isLookaside(db, p) ){
19240: if( n<=db->lookaside.sz ){
19241: return p;
19242: }
19243: pNew = sqlite3DbMallocRaw(db, n);
19244: if( pNew ){
19245: memcpy(pNew, p, db->lookaside.sz);
19246: sqlite3DbFree(db, p);
19247: }
19248: }else{
19249: assert( sqlite3MemdebugHasType(p, MEMTYPE_DB) );
19250: assert( sqlite3MemdebugHasType(p, MEMTYPE_LOOKASIDE|MEMTYPE_HEAP) );
19251: sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
19252: pNew = sqlite3_realloc(p, n);
19253: if( !pNew ){
19254: sqlite3MemdebugSetType(p, MEMTYPE_DB|MEMTYPE_HEAP);
19255: db->mallocFailed = 1;
19256: }
19257: sqlite3MemdebugSetType(pNew, MEMTYPE_DB |
19258: (db->lookaside.bEnabled ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP));
19259: }
19260: }
19261: return pNew;
19262: }
19263:
19264: /*
19265: ** Attempt to reallocate p. If the reallocation fails, then free p
19266: ** and set the mallocFailed flag in the database connection.
19267: */
19268: SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *db, void *p, int n){
19269: void *pNew;
19270: pNew = sqlite3DbRealloc(db, p, n);
19271: if( !pNew ){
19272: sqlite3DbFree(db, p);
19273: }
19274: return pNew;
19275: }
19276:
19277: /*
19278: ** Make a copy of a string in memory obtained from sqliteMalloc(). These
19279: ** functions call sqlite3MallocRaw() directly instead of sqliteMalloc(). This
19280: ** is because when memory debugging is turned on, these two functions are
19281: ** called via macros that record the current file and line number in the
19282: ** ThreadData structure.
19283: */
19284: SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){
19285: char *zNew;
19286: size_t n;
19287: if( z==0 ){
19288: return 0;
19289: }
19290: n = sqlite3Strlen30(z) + 1;
19291: assert( (n&0x7fffffff)==n );
19292: zNew = sqlite3DbMallocRaw(db, (int)n);
19293: if( zNew ){
19294: memcpy(zNew, z, n);
19295: }
19296: return zNew;
19297: }
19298: SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, int n){
19299: char *zNew;
19300: if( z==0 ){
19301: return 0;
19302: }
19303: assert( (n&0x7fffffff)==n );
19304: zNew = sqlite3DbMallocRaw(db, n+1);
19305: if( zNew ){
19306: memcpy(zNew, z, n);
19307: zNew[n] = 0;
19308: }
19309: return zNew;
19310: }
19311:
19312: /*
19313: ** Create a string from the zFromat argument and the va_list that follows.
19314: ** Store the string in memory obtained from sqliteMalloc() and make *pz
19315: ** point to that string.
19316: */
19317: SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zFormat, ...){
19318: va_list ap;
19319: char *z;
19320:
19321: va_start(ap, zFormat);
19322: z = sqlite3VMPrintf(db, zFormat, ap);
19323: va_end(ap);
19324: sqlite3DbFree(db, *pz);
19325: *pz = z;
19326: }
19327:
19328:
19329: /*
19330: ** This function must be called before exiting any API function (i.e.
19331: ** returning control to the user) that has called sqlite3_malloc or
19332: ** sqlite3_realloc.
19333: **
19334: ** The returned value is normally a copy of the second argument to this
19335: ** function. However, if a malloc() failure has occurred since the previous
19336: ** invocation SQLITE_NOMEM is returned instead.
19337: **
19338: ** If the first argument, db, is not NULL and a malloc() error has occurred,
19339: ** then the connection error-code (the value returned by sqlite3_errcode())
19340: ** is set to SQLITE_NOMEM.
19341: */
19342: SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){
19343: /* If the db handle is not NULL, then we must hold the connection handle
19344: ** mutex here. Otherwise the read (and possible write) of db->mallocFailed
19345: ** is unsafe, as is the call to sqlite3Error().
19346: */
19347: assert( !db || sqlite3_mutex_held(db->mutex) );
19348: if( db && (db->mallocFailed || rc==SQLITE_IOERR_NOMEM) ){
19349: sqlite3Error(db, SQLITE_NOMEM, 0);
19350: db->mallocFailed = 0;
19351: rc = SQLITE_NOMEM;
19352: }
19353: return rc & (db ? db->errMask : 0xff);
19354: }
19355:
19356: /************** End of malloc.c **********************************************/
19357: /************** Begin file printf.c ******************************************/
19358: /*
19359: ** The "printf" code that follows dates from the 1980's. It is in
19360: ** the public domain. The original comments are included here for
19361: ** completeness. They are very out-of-date but might be useful as
19362: ** an historical reference. Most of the "enhancements" have been backed
19363: ** out so that the functionality is now the same as standard printf().
19364: **
19365: **************************************************************************
19366: **
19367: ** This file contains code for a set of "printf"-like routines. These
19368: ** routines format strings much like the printf() from the standard C
19369: ** library, though the implementation here has enhancements to support
19370: ** SQLlite.
19371: */
19372:
19373: /*
19374: ** Conversion types fall into various categories as defined by the
19375: ** following enumeration.
19376: */
19377: #define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */
19378: #define etFLOAT 2 /* Floating point. %f */
19379: #define etEXP 3 /* Exponentional notation. %e and %E */
19380: #define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */
19381: #define etSIZE 5 /* Return number of characters processed so far. %n */
19382: #define etSTRING 6 /* Strings. %s */
19383: #define etDYNSTRING 7 /* Dynamically allocated strings. %z */
19384: #define etPERCENT 8 /* Percent symbol. %% */
19385: #define etCHARX 9 /* Characters. %c */
19386: /* The rest are extensions, not normally found in printf() */
19387: #define etSQLESCAPE 10 /* Strings with '\'' doubled. %q */
19388: #define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '',
19389: NULL pointers replaced by SQL NULL. %Q */
19390: #define etTOKEN 12 /* a pointer to a Token structure */
19391: #define etSRCLIST 13 /* a pointer to a SrcList */
19392: #define etPOINTER 14 /* The %p conversion */
19393: #define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */
19394: #define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */
19395:
19396: #define etINVALID 0 /* Any unrecognized conversion type */
19397:
19398:
19399: /*
19400: ** An "etByte" is an 8-bit unsigned value.
19401: */
19402: typedef unsigned char etByte;
19403:
19404: /*
19405: ** Each builtin conversion character (ex: the 'd' in "%d") is described
19406: ** by an instance of the following structure
19407: */
19408: typedef struct et_info { /* Information about each format field */
19409: char fmttype; /* The format field code letter */
19410: etByte base; /* The base for radix conversion */
19411: etByte flags; /* One or more of FLAG_ constants below */
19412: etByte type; /* Conversion paradigm */
19413: etByte charset; /* Offset into aDigits[] of the digits string */
19414: etByte prefix; /* Offset into aPrefix[] of the prefix string */
19415: } et_info;
19416:
19417: /*
19418: ** Allowed values for et_info.flags
19419: */
19420: #define FLAG_SIGNED 1 /* True if the value to convert is signed */
19421: #define FLAG_INTERN 2 /* True if for internal use only */
19422: #define FLAG_STRING 4 /* Allow infinity precision */
19423:
19424:
19425: /*
19426: ** The following table is searched linearly, so it is good to put the
19427: ** most frequently used conversion types first.
19428: */
19429: static const char aDigits[] = "0123456789ABCDEF0123456789abcdef";
19430: static const char aPrefix[] = "-x0\000X0";
19431: static const et_info fmtinfo[] = {
19432: { 'd', 10, 1, etRADIX, 0, 0 },
19433: { 's', 0, 4, etSTRING, 0, 0 },
19434: { 'g', 0, 1, etGENERIC, 30, 0 },
19435: { 'z', 0, 4, etDYNSTRING, 0, 0 },
19436: { 'q', 0, 4, etSQLESCAPE, 0, 0 },
19437: { 'Q', 0, 4, etSQLESCAPE2, 0, 0 },
19438: { 'w', 0, 4, etSQLESCAPE3, 0, 0 },
19439: { 'c', 0, 0, etCHARX, 0, 0 },
19440: { 'o', 8, 0, etRADIX, 0, 2 },
19441: { 'u', 10, 0, etRADIX, 0, 0 },
19442: { 'x', 16, 0, etRADIX, 16, 1 },
19443: { 'X', 16, 0, etRADIX, 0, 4 },
19444: #ifndef SQLITE_OMIT_FLOATING_POINT
19445: { 'f', 0, 1, etFLOAT, 0, 0 },
19446: { 'e', 0, 1, etEXP, 30, 0 },
19447: { 'E', 0, 1, etEXP, 14, 0 },
19448: { 'G', 0, 1, etGENERIC, 14, 0 },
19449: #endif
19450: { 'i', 10, 1, etRADIX, 0, 0 },
19451: { 'n', 0, 0, etSIZE, 0, 0 },
19452: { '%', 0, 0, etPERCENT, 0, 0 },
19453: { 'p', 16, 0, etPOINTER, 0, 1 },
19454:
19455: /* All the rest have the FLAG_INTERN bit set and are thus for internal
19456: ** use only */
19457: { 'T', 0, 2, etTOKEN, 0, 0 },
19458: { 'S', 0, 2, etSRCLIST, 0, 0 },
19459: { 'r', 10, 3, etORDINAL, 0, 0 },
19460: };
19461:
19462: /*
19463: ** If SQLITE_OMIT_FLOATING_POINT is defined, then none of the floating point
19464: ** conversions will work.
19465: */
19466: #ifndef SQLITE_OMIT_FLOATING_POINT
19467: /*
19468: ** "*val" is a double such that 0.1 <= *val < 10.0
19469: ** Return the ascii code for the leading digit of *val, then
19470: ** multiply "*val" by 10.0 to renormalize.
19471: **
19472: ** Example:
19473: ** input: *val = 3.14159
19474: ** output: *val = 1.4159 function return = '3'
19475: **
19476: ** The counter *cnt is incremented each time. After counter exceeds
19477: ** 16 (the number of significant digits in a 64-bit float) '0' is
19478: ** always returned.
19479: */
19480: static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){
19481: int digit;
19482: LONGDOUBLE_TYPE d;
1.2.2.1 ! misho 19483: if( (*cnt)<=0 ) return '0';
! 19484: (*cnt)--;
1.2 misho 19485: digit = (int)*val;
19486: d = digit;
19487: digit += '0';
19488: *val = (*val - d)*10.0;
19489: return (char)digit;
19490: }
19491: #endif /* SQLITE_OMIT_FLOATING_POINT */
19492:
19493: /*
19494: ** Append N space characters to the given string buffer.
19495: */
19496: SQLITE_PRIVATE void sqlite3AppendSpace(StrAccum *pAccum, int N){
19497: static const char zSpaces[] = " ";
19498: while( N>=(int)sizeof(zSpaces)-1 ){
19499: sqlite3StrAccumAppend(pAccum, zSpaces, sizeof(zSpaces)-1);
19500: N -= sizeof(zSpaces)-1;
19501: }
19502: if( N>0 ){
19503: sqlite3StrAccumAppend(pAccum, zSpaces, N);
19504: }
19505: }
19506:
19507: /*
19508: ** On machines with a small stack size, you can redefine the
19509: ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired.
19510: */
19511: #ifndef SQLITE_PRINT_BUF_SIZE
19512: # define SQLITE_PRINT_BUF_SIZE 70
19513: #endif
19514: #define etBUFSIZE SQLITE_PRINT_BUF_SIZE /* Size of the output buffer */
19515:
19516: /*
19517: ** Render a string given by "fmt" into the StrAccum object.
19518: */
19519: SQLITE_PRIVATE void sqlite3VXPrintf(
19520: StrAccum *pAccum, /* Accumulate results here */
19521: int useExtended, /* Allow extended %-conversions */
19522: const char *fmt, /* Format string */
19523: va_list ap /* arguments */
19524: ){
19525: int c; /* Next character in the format string */
19526: char *bufpt; /* Pointer to the conversion buffer */
19527: int precision; /* Precision of the current field */
19528: int length; /* Length of the field */
19529: int idx; /* A general purpose loop counter */
19530: int width; /* Width of the current field */
19531: etByte flag_leftjustify; /* True if "-" flag is present */
19532: etByte flag_plussign; /* True if "+" flag is present */
19533: etByte flag_blanksign; /* True if " " flag is present */
19534: etByte flag_alternateform; /* True if "#" flag is present */
19535: etByte flag_altform2; /* True if "!" flag is present */
19536: etByte flag_zeropad; /* True if field width constant starts with zero */
19537: etByte flag_long; /* True if "l" flag is present */
19538: etByte flag_longlong; /* True if the "ll" flag is present */
19539: etByte done; /* Loop termination flag */
19540: etByte xtype = 0; /* Conversion paradigm */
19541: char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */
19542: sqlite_uint64 longvalue; /* Value for integer types */
19543: LONGDOUBLE_TYPE realvalue; /* Value for real types */
19544: const et_info *infop; /* Pointer to the appropriate info structure */
19545: char *zOut; /* Rendering buffer */
19546: int nOut; /* Size of the rendering buffer */
19547: char *zExtra; /* Malloced memory used by some conversion */
19548: #ifndef SQLITE_OMIT_FLOATING_POINT
19549: int exp, e2; /* exponent of real numbers */
19550: int nsd; /* Number of significant digits returned */
19551: double rounder; /* Used for rounding floating point values */
19552: etByte flag_dp; /* True if decimal point should be shown */
19553: etByte flag_rtz; /* True if trailing zeros should be removed */
19554: #endif
19555: char buf[etBUFSIZE]; /* Conversion buffer */
19556:
19557: bufpt = 0;
19558: for(; (c=(*fmt))!=0; ++fmt){
19559: if( c!='%' ){
19560: int amt;
19561: bufpt = (char *)fmt;
19562: amt = 1;
19563: while( (c=(*++fmt))!='%' && c!=0 ) amt++;
19564: sqlite3StrAccumAppend(pAccum, bufpt, amt);
19565: if( c==0 ) break;
19566: }
19567: if( (c=(*++fmt))==0 ){
19568: sqlite3StrAccumAppend(pAccum, "%", 1);
19569: break;
19570: }
19571: /* Find out what flags are present */
19572: flag_leftjustify = flag_plussign = flag_blanksign =
19573: flag_alternateform = flag_altform2 = flag_zeropad = 0;
19574: done = 0;
19575: do{
19576: switch( c ){
19577: case '-': flag_leftjustify = 1; break;
19578: case '+': flag_plussign = 1; break;
19579: case ' ': flag_blanksign = 1; break;
19580: case '#': flag_alternateform = 1; break;
19581: case '!': flag_altform2 = 1; break;
19582: case '0': flag_zeropad = 1; break;
19583: default: done = 1; break;
19584: }
19585: }while( !done && (c=(*++fmt))!=0 );
19586: /* Get the field width */
19587: width = 0;
19588: if( c=='*' ){
19589: width = va_arg(ap,int);
19590: if( width<0 ){
19591: flag_leftjustify = 1;
19592: width = -width;
19593: }
19594: c = *++fmt;
19595: }else{
19596: while( c>='0' && c<='9' ){
19597: width = width*10 + c - '0';
19598: c = *++fmt;
19599: }
19600: }
19601: /* Get the precision */
19602: if( c=='.' ){
19603: precision = 0;
19604: c = *++fmt;
19605: if( c=='*' ){
19606: precision = va_arg(ap,int);
19607: if( precision<0 ) precision = -precision;
19608: c = *++fmt;
19609: }else{
19610: while( c>='0' && c<='9' ){
19611: precision = precision*10 + c - '0';
19612: c = *++fmt;
19613: }
19614: }
19615: }else{
19616: precision = -1;
19617: }
19618: /* Get the conversion type modifier */
19619: if( c=='l' ){
19620: flag_long = 1;
19621: c = *++fmt;
19622: if( c=='l' ){
19623: flag_longlong = 1;
19624: c = *++fmt;
19625: }else{
19626: flag_longlong = 0;
19627: }
19628: }else{
19629: flag_long = flag_longlong = 0;
19630: }
19631: /* Fetch the info entry for the field */
19632: infop = &fmtinfo[0];
19633: xtype = etINVALID;
19634: for(idx=0; idx<ArraySize(fmtinfo); idx++){
19635: if( c==fmtinfo[idx].fmttype ){
19636: infop = &fmtinfo[idx];
19637: if( useExtended || (infop->flags & FLAG_INTERN)==0 ){
19638: xtype = infop->type;
19639: }else{
19640: return;
19641: }
19642: break;
19643: }
19644: }
19645: zExtra = 0;
19646:
19647: /*
19648: ** At this point, variables are initialized as follows:
19649: **
19650: ** flag_alternateform TRUE if a '#' is present.
19651: ** flag_altform2 TRUE if a '!' is present.
19652: ** flag_plussign TRUE if a '+' is present.
19653: ** flag_leftjustify TRUE if a '-' is present or if the
19654: ** field width was negative.
19655: ** flag_zeropad TRUE if the width began with 0.
19656: ** flag_long TRUE if the letter 'l' (ell) prefixed
19657: ** the conversion character.
19658: ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed
19659: ** the conversion character.
19660: ** flag_blanksign TRUE if a ' ' is present.
19661: ** width The specified field width. This is
19662: ** always non-negative. Zero is the default.
19663: ** precision The specified precision. The default
19664: ** is -1.
19665: ** xtype The class of the conversion.
19666: ** infop Pointer to the appropriate info struct.
19667: */
19668: switch( xtype ){
19669: case etPOINTER:
19670: flag_longlong = sizeof(char*)==sizeof(i64);
19671: flag_long = sizeof(char*)==sizeof(long int);
19672: /* Fall through into the next case */
19673: case etORDINAL:
19674: case etRADIX:
19675: if( infop->flags & FLAG_SIGNED ){
19676: i64 v;
19677: if( flag_longlong ){
19678: v = va_arg(ap,i64);
19679: }else if( flag_long ){
19680: v = va_arg(ap,long int);
19681: }else{
19682: v = va_arg(ap,int);
19683: }
19684: if( v<0 ){
19685: if( v==SMALLEST_INT64 ){
19686: longvalue = ((u64)1)<<63;
19687: }else{
19688: longvalue = -v;
19689: }
19690: prefix = '-';
19691: }else{
19692: longvalue = v;
19693: if( flag_plussign ) prefix = '+';
19694: else if( flag_blanksign ) prefix = ' ';
19695: else prefix = 0;
19696: }
19697: }else{
19698: if( flag_longlong ){
19699: longvalue = va_arg(ap,u64);
19700: }else if( flag_long ){
19701: longvalue = va_arg(ap,unsigned long int);
19702: }else{
19703: longvalue = va_arg(ap,unsigned int);
19704: }
19705: prefix = 0;
19706: }
19707: if( longvalue==0 ) flag_alternateform = 0;
19708: if( flag_zeropad && precision<width-(prefix!=0) ){
19709: precision = width-(prefix!=0);
19710: }
19711: if( precision<etBUFSIZE-10 ){
19712: nOut = etBUFSIZE;
19713: zOut = buf;
19714: }else{
19715: nOut = precision + 10;
19716: zOut = zExtra = sqlite3Malloc( nOut );
19717: if( zOut==0 ){
19718: pAccum->mallocFailed = 1;
19719: return;
19720: }
19721: }
19722: bufpt = &zOut[nOut-1];
19723: if( xtype==etORDINAL ){
19724: static const char zOrd[] = "thstndrd";
19725: int x = (int)(longvalue % 10);
19726: if( x>=4 || (longvalue/10)%10==1 ){
19727: x = 0;
19728: }
19729: *(--bufpt) = zOrd[x*2+1];
19730: *(--bufpt) = zOrd[x*2];
19731: }
19732: {
19733: register const char *cset; /* Use registers for speed */
19734: register int base;
19735: cset = &aDigits[infop->charset];
19736: base = infop->base;
19737: do{ /* Convert to ascii */
19738: *(--bufpt) = cset[longvalue%base];
19739: longvalue = longvalue/base;
19740: }while( longvalue>0 );
19741: }
19742: length = (int)(&zOut[nOut-1]-bufpt);
19743: for(idx=precision-length; idx>0; idx--){
19744: *(--bufpt) = '0'; /* Zero pad */
19745: }
19746: if( prefix ) *(--bufpt) = prefix; /* Add sign */
19747: if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */
19748: const char *pre;
19749: char x;
19750: pre = &aPrefix[infop->prefix];
19751: for(; (x=(*pre))!=0; pre++) *(--bufpt) = x;
19752: }
19753: length = (int)(&zOut[nOut-1]-bufpt);
19754: break;
19755: case etFLOAT:
19756: case etEXP:
19757: case etGENERIC:
19758: realvalue = va_arg(ap,double);
19759: #ifdef SQLITE_OMIT_FLOATING_POINT
19760: length = 0;
19761: #else
19762: if( precision<0 ) precision = 6; /* Set default precision */
19763: if( realvalue<0.0 ){
19764: realvalue = -realvalue;
19765: prefix = '-';
19766: }else{
19767: if( flag_plussign ) prefix = '+';
19768: else if( flag_blanksign ) prefix = ' ';
19769: else prefix = 0;
19770: }
19771: if( xtype==etGENERIC && precision>0 ) precision--;
19772: #if 0
19773: /* Rounding works like BSD when the constant 0.4999 is used. Wierd! */
19774: for(idx=precision, rounder=0.4999; idx>0; idx--, rounder*=0.1);
19775: #else
19776: /* It makes more sense to use 0.5 */
19777: for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){}
19778: #endif
19779: if( xtype==etFLOAT ) realvalue += rounder;
19780: /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */
19781: exp = 0;
19782: if( sqlite3IsNaN((double)realvalue) ){
19783: bufpt = "NaN";
19784: length = 3;
19785: break;
19786: }
19787: if( realvalue>0.0 ){
1.2.2.1 ! misho 19788: LONGDOUBLE_TYPE scale = 1.0;
! 19789: while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;}
! 19790: while( realvalue>=1e64*scale && exp<=350 ){ scale *= 1e64; exp+=64; }
! 19791: while( realvalue>=1e8*scale && exp<=350 ){ scale *= 1e8; exp+=8; }
! 19792: while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; }
! 19793: realvalue /= scale;
1.2 misho 19794: while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; }
19795: while( realvalue<1.0 ){ realvalue *= 10.0; exp--; }
19796: if( exp>350 ){
19797: if( prefix=='-' ){
19798: bufpt = "-Inf";
19799: }else if( prefix=='+' ){
19800: bufpt = "+Inf";
19801: }else{
19802: bufpt = "Inf";
19803: }
19804: length = sqlite3Strlen30(bufpt);
19805: break;
19806: }
19807: }
19808: bufpt = buf;
19809: /*
19810: ** If the field type is etGENERIC, then convert to either etEXP
19811: ** or etFLOAT, as appropriate.
19812: */
19813: if( xtype!=etFLOAT ){
19814: realvalue += rounder;
19815: if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; }
19816: }
19817: if( xtype==etGENERIC ){
19818: flag_rtz = !flag_alternateform;
19819: if( exp<-4 || exp>precision ){
19820: xtype = etEXP;
19821: }else{
19822: precision = precision - exp;
19823: xtype = etFLOAT;
19824: }
19825: }else{
1.2.2.1 ! misho 19826: flag_rtz = flag_altform2;
1.2 misho 19827: }
19828: if( xtype==etEXP ){
19829: e2 = 0;
19830: }else{
19831: e2 = exp;
19832: }
19833: if( e2+precision+width > etBUFSIZE - 15 ){
19834: bufpt = zExtra = sqlite3Malloc( e2+precision+width+15 );
19835: if( bufpt==0 ){
19836: pAccum->mallocFailed = 1;
19837: return;
19838: }
19839: }
19840: zOut = bufpt;
1.2.2.1 ! misho 19841: nsd = 16 + flag_altform2*10;
1.2 misho 19842: flag_dp = (precision>0 ?1:0) | flag_alternateform | flag_altform2;
19843: /* The sign in front of the number */
19844: if( prefix ){
19845: *(bufpt++) = prefix;
19846: }
19847: /* Digits prior to the decimal point */
19848: if( e2<0 ){
19849: *(bufpt++) = '0';
19850: }else{
19851: for(; e2>=0; e2--){
19852: *(bufpt++) = et_getdigit(&realvalue,&nsd);
19853: }
19854: }
19855: /* The decimal point */
19856: if( flag_dp ){
19857: *(bufpt++) = '.';
19858: }
19859: /* "0" digits after the decimal point but before the first
19860: ** significant digit of the number */
19861: for(e2++; e2<0; precision--, e2++){
19862: assert( precision>0 );
19863: *(bufpt++) = '0';
19864: }
19865: /* Significant digits after the decimal point */
19866: while( (precision--)>0 ){
19867: *(bufpt++) = et_getdigit(&realvalue,&nsd);
19868: }
19869: /* Remove trailing zeros and the "." if no digits follow the "." */
19870: if( flag_rtz && flag_dp ){
19871: while( bufpt[-1]=='0' ) *(--bufpt) = 0;
19872: assert( bufpt>zOut );
19873: if( bufpt[-1]=='.' ){
19874: if( flag_altform2 ){
19875: *(bufpt++) = '0';
19876: }else{
19877: *(--bufpt) = 0;
19878: }
19879: }
19880: }
19881: /* Add the "eNNN" suffix */
19882: if( xtype==etEXP ){
19883: *(bufpt++) = aDigits[infop->charset];
19884: if( exp<0 ){
19885: *(bufpt++) = '-'; exp = -exp;
19886: }else{
19887: *(bufpt++) = '+';
19888: }
19889: if( exp>=100 ){
19890: *(bufpt++) = (char)((exp/100)+'0'); /* 100's digit */
19891: exp %= 100;
19892: }
19893: *(bufpt++) = (char)(exp/10+'0'); /* 10's digit */
19894: *(bufpt++) = (char)(exp%10+'0'); /* 1's digit */
19895: }
19896: *bufpt = 0;
19897:
19898: /* The converted number is in buf[] and zero terminated. Output it.
19899: ** Note that the number is in the usual order, not reversed as with
19900: ** integer conversions. */
19901: length = (int)(bufpt-zOut);
19902: bufpt = zOut;
19903:
19904: /* Special case: Add leading zeros if the flag_zeropad flag is
19905: ** set and we are not left justified */
19906: if( flag_zeropad && !flag_leftjustify && length < width){
19907: int i;
19908: int nPad = width - length;
19909: for(i=width; i>=nPad; i--){
19910: bufpt[i] = bufpt[i-nPad];
19911: }
19912: i = prefix!=0;
19913: while( nPad-- ) bufpt[i++] = '0';
19914: length = width;
19915: }
19916: #endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */
19917: break;
19918: case etSIZE:
19919: *(va_arg(ap,int*)) = pAccum->nChar;
19920: length = width = 0;
19921: break;
19922: case etPERCENT:
19923: buf[0] = '%';
19924: bufpt = buf;
19925: length = 1;
19926: break;
19927: case etCHARX:
19928: c = va_arg(ap,int);
19929: buf[0] = (char)c;
19930: if( precision>=0 ){
19931: for(idx=1; idx<precision; idx++) buf[idx] = (char)c;
19932: length = precision;
19933: }else{
19934: length =1;
19935: }
19936: bufpt = buf;
19937: break;
19938: case etSTRING:
19939: case etDYNSTRING:
19940: bufpt = va_arg(ap,char*);
19941: if( bufpt==0 ){
19942: bufpt = "";
19943: }else if( xtype==etDYNSTRING ){
19944: zExtra = bufpt;
19945: }
19946: if( precision>=0 ){
19947: for(length=0; length<precision && bufpt[length]; length++){}
19948: }else{
19949: length = sqlite3Strlen30(bufpt);
19950: }
19951: break;
19952: case etSQLESCAPE:
19953: case etSQLESCAPE2:
19954: case etSQLESCAPE3: {
19955: int i, j, k, n, isnull;
19956: int needQuote;
19957: char ch;
19958: char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */
19959: char *escarg = va_arg(ap,char*);
19960: isnull = escarg==0;
19961: if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)");
19962: k = precision;
19963: for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){
19964: if( ch==q ) n++;
19965: }
19966: needQuote = !isnull && xtype==etSQLESCAPE2;
19967: n += i + 1 + needQuote*2;
19968: if( n>etBUFSIZE ){
19969: bufpt = zExtra = sqlite3Malloc( n );
19970: if( bufpt==0 ){
19971: pAccum->mallocFailed = 1;
19972: return;
19973: }
19974: }else{
19975: bufpt = buf;
19976: }
19977: j = 0;
19978: if( needQuote ) bufpt[j++] = q;
19979: k = i;
19980: for(i=0; i<k; i++){
19981: bufpt[j++] = ch = escarg[i];
19982: if( ch==q ) bufpt[j++] = ch;
19983: }
19984: if( needQuote ) bufpt[j++] = q;
19985: bufpt[j] = 0;
19986: length = j;
19987: /* The precision in %q and %Q means how many input characters to
19988: ** consume, not the length of the output...
19989: ** if( precision>=0 && precision<length ) length = precision; */
19990: break;
19991: }
19992: case etTOKEN: {
19993: Token *pToken = va_arg(ap, Token*);
19994: if( pToken ){
19995: sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n);
19996: }
19997: length = width = 0;
19998: break;
19999: }
20000: case etSRCLIST: {
20001: SrcList *pSrc = va_arg(ap, SrcList*);
20002: int k = va_arg(ap, int);
20003: struct SrcList_item *pItem = &pSrc->a[k];
20004: assert( k>=0 && k<pSrc->nSrc );
20005: if( pItem->zDatabase ){
20006: sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1);
20007: sqlite3StrAccumAppend(pAccum, ".", 1);
20008: }
20009: sqlite3StrAccumAppend(pAccum, pItem->zName, -1);
20010: length = width = 0;
20011: break;
20012: }
20013: default: {
20014: assert( xtype==etINVALID );
20015: return;
20016: }
20017: }/* End switch over the format type */
20018: /*
20019: ** The text of the conversion is pointed to by "bufpt" and is
20020: ** "length" characters long. The field width is "width". Do
20021: ** the output.
20022: */
20023: if( !flag_leftjustify ){
20024: register int nspace;
20025: nspace = width-length;
20026: if( nspace>0 ){
20027: sqlite3AppendSpace(pAccum, nspace);
20028: }
20029: }
20030: if( length>0 ){
20031: sqlite3StrAccumAppend(pAccum, bufpt, length);
20032: }
20033: if( flag_leftjustify ){
20034: register int nspace;
20035: nspace = width-length;
20036: if( nspace>0 ){
20037: sqlite3AppendSpace(pAccum, nspace);
20038: }
20039: }
20040: sqlite3_free(zExtra);
20041: }/* End for loop over the format string */
20042: } /* End of function */
20043:
20044: /*
20045: ** Append N bytes of text from z to the StrAccum object.
20046: */
20047: SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
20048: assert( z!=0 || N==0 );
20049: if( p->tooBig | p->mallocFailed ){
20050: testcase(p->tooBig);
20051: testcase(p->mallocFailed);
20052: return;
20053: }
20054: assert( p->zText!=0 || p->nChar==0 );
20055: if( N<0 ){
20056: N = sqlite3Strlen30(z);
20057: }
20058: if( N==0 || NEVER(z==0) ){
20059: return;
20060: }
20061: if( p->nChar+N >= p->nAlloc ){
20062: char *zNew;
20063: if( !p->useMalloc ){
20064: p->tooBig = 1;
20065: N = p->nAlloc - p->nChar - 1;
20066: if( N<=0 ){
20067: return;
20068: }
20069: }else{
20070: char *zOld = (p->zText==p->zBase ? 0 : p->zText);
20071: i64 szNew = p->nChar;
20072: szNew += N + 1;
20073: if( szNew > p->mxAlloc ){
20074: sqlite3StrAccumReset(p);
20075: p->tooBig = 1;
20076: return;
20077: }else{
20078: p->nAlloc = (int)szNew;
20079: }
20080: if( p->useMalloc==1 ){
20081: zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc);
20082: }else{
20083: zNew = sqlite3_realloc(zOld, p->nAlloc);
20084: }
20085: if( zNew ){
20086: if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
20087: p->zText = zNew;
20088: }else{
20089: p->mallocFailed = 1;
20090: sqlite3StrAccumReset(p);
20091: return;
20092: }
20093: }
20094: }
20095: assert( p->zText );
20096: memcpy(&p->zText[p->nChar], z, N);
20097: p->nChar += N;
20098: }
20099:
20100: /*
20101: ** Finish off a string by making sure it is zero-terminated.
20102: ** Return a pointer to the resulting string. Return a NULL
20103: ** pointer if any kind of error was encountered.
20104: */
20105: SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){
20106: if( p->zText ){
20107: p->zText[p->nChar] = 0;
20108: if( p->useMalloc && p->zText==p->zBase ){
20109: if( p->useMalloc==1 ){
20110: p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 );
20111: }else{
20112: p->zText = sqlite3_malloc(p->nChar+1);
20113: }
20114: if( p->zText ){
20115: memcpy(p->zText, p->zBase, p->nChar+1);
20116: }else{
20117: p->mallocFailed = 1;
20118: }
20119: }
20120: }
20121: return p->zText;
20122: }
20123:
20124: /*
20125: ** Reset an StrAccum string. Reclaim all malloced memory.
20126: */
20127: SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){
20128: if( p->zText!=p->zBase ){
20129: if( p->useMalloc==1 ){
20130: sqlite3DbFree(p->db, p->zText);
20131: }else{
20132: sqlite3_free(p->zText);
20133: }
20134: }
20135: p->zText = 0;
20136: }
20137:
20138: /*
20139: ** Initialize a string accumulator
20140: */
20141: SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, char *zBase, int n, int mx){
20142: p->zText = p->zBase = zBase;
20143: p->db = 0;
20144: p->nChar = 0;
20145: p->nAlloc = n;
20146: p->mxAlloc = mx;
20147: p->useMalloc = 1;
20148: p->tooBig = 0;
20149: p->mallocFailed = 0;
20150: }
20151:
20152: /*
20153: ** Print into memory obtained from sqliteMalloc(). Use the internal
20154: ** %-conversion extensions.
20155: */
20156: SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){
20157: char *z;
20158: char zBase[SQLITE_PRINT_BUF_SIZE];
20159: StrAccum acc;
20160: assert( db!=0 );
20161: sqlite3StrAccumInit(&acc, zBase, sizeof(zBase),
20162: db->aLimit[SQLITE_LIMIT_LENGTH]);
20163: acc.db = db;
20164: sqlite3VXPrintf(&acc, 1, zFormat, ap);
20165: z = sqlite3StrAccumFinish(&acc);
20166: if( acc.mallocFailed ){
20167: db->mallocFailed = 1;
20168: }
20169: return z;
20170: }
20171:
20172: /*
20173: ** Print into memory obtained from sqliteMalloc(). Use the internal
20174: ** %-conversion extensions.
20175: */
20176: SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){
20177: va_list ap;
20178: char *z;
20179: va_start(ap, zFormat);
20180: z = sqlite3VMPrintf(db, zFormat, ap);
20181: va_end(ap);
20182: return z;
20183: }
20184:
20185: /*
20186: ** Like sqlite3MPrintf(), but call sqlite3DbFree() on zStr after formatting
20187: ** the string and before returnning. This routine is intended to be used
20188: ** to modify an existing string. For example:
20189: **
20190: ** x = sqlite3MPrintf(db, x, "prefix %s suffix", x);
20191: **
20192: */
20193: SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3 *db, char *zStr, const char *zFormat, ...){
20194: va_list ap;
20195: char *z;
20196: va_start(ap, zFormat);
20197: z = sqlite3VMPrintf(db, zFormat, ap);
20198: va_end(ap);
20199: sqlite3DbFree(db, zStr);
20200: return z;
20201: }
20202:
20203: /*
20204: ** Print into memory obtained from sqlite3_malloc(). Omit the internal
20205: ** %-conversion extensions.
20206: */
20207: SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){
20208: char *z;
20209: char zBase[SQLITE_PRINT_BUF_SIZE];
20210: StrAccum acc;
20211: #ifndef SQLITE_OMIT_AUTOINIT
20212: if( sqlite3_initialize() ) return 0;
20213: #endif
20214: sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH);
20215: acc.useMalloc = 2;
20216: sqlite3VXPrintf(&acc, 0, zFormat, ap);
20217: z = sqlite3StrAccumFinish(&acc);
20218: return z;
20219: }
20220:
20221: /*
20222: ** Print into memory obtained from sqlite3_malloc()(). Omit the internal
20223: ** %-conversion extensions.
20224: */
20225: SQLITE_API char *sqlite3_mprintf(const char *zFormat, ...){
20226: va_list ap;
20227: char *z;
20228: #ifndef SQLITE_OMIT_AUTOINIT
20229: if( sqlite3_initialize() ) return 0;
20230: #endif
20231: va_start(ap, zFormat);
20232: z = sqlite3_vmprintf(zFormat, ap);
20233: va_end(ap);
20234: return z;
20235: }
20236:
20237: /*
20238: ** sqlite3_snprintf() works like snprintf() except that it ignores the
20239: ** current locale settings. This is important for SQLite because we
20240: ** are not able to use a "," as the decimal point in place of "." as
20241: ** specified by some locales.
20242: **
20243: ** Oops: The first two arguments of sqlite3_snprintf() are backwards
20244: ** from the snprintf() standard. Unfortunately, it is too late to change
20245: ** this without breaking compatibility, so we just have to live with the
20246: ** mistake.
20247: **
20248: ** sqlite3_vsnprintf() is the varargs version.
20249: */
20250: SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_list ap){
20251: StrAccum acc;
20252: if( n<=0 ) return zBuf;
20253: sqlite3StrAccumInit(&acc, zBuf, n, 0);
20254: acc.useMalloc = 0;
20255: sqlite3VXPrintf(&acc, 0, zFormat, ap);
20256: return sqlite3StrAccumFinish(&acc);
20257: }
20258: SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
20259: char *z;
20260: va_list ap;
20261: va_start(ap,zFormat);
20262: z = sqlite3_vsnprintf(n, zBuf, zFormat, ap);
20263: va_end(ap);
20264: return z;
20265: }
20266:
20267: /*
20268: ** This is the routine that actually formats the sqlite3_log() message.
20269: ** We house it in a separate routine from sqlite3_log() to avoid using
20270: ** stack space on small-stack systems when logging is disabled.
20271: **
20272: ** sqlite3_log() must render into a static buffer. It cannot dynamically
20273: ** allocate memory because it might be called while the memory allocator
20274: ** mutex is held.
20275: */
20276: static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
20277: StrAccum acc; /* String accumulator */
20278: char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */
20279:
20280: sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0);
20281: acc.useMalloc = 0;
20282: sqlite3VXPrintf(&acc, 0, zFormat, ap);
20283: sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
20284: sqlite3StrAccumFinish(&acc));
20285: }
20286:
20287: /*
20288: ** Format and write a message to the log if logging is enabled.
20289: */
20290: SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){
20291: va_list ap; /* Vararg list */
20292: if( sqlite3GlobalConfig.xLog ){
20293: va_start(ap, zFormat);
20294: renderLogMsg(iErrCode, zFormat, ap);
20295: va_end(ap);
20296: }
20297: }
20298:
20299: #if defined(SQLITE_DEBUG)
20300: /*
20301: ** A version of printf() that understands %lld. Used for debugging.
20302: ** The printf() built into some versions of windows does not understand %lld
20303: ** and segfaults if you give it a long long int.
20304: */
20305: SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){
20306: va_list ap;
20307: StrAccum acc;
20308: char zBuf[500];
20309: sqlite3StrAccumInit(&acc, zBuf, sizeof(zBuf), 0);
20310: acc.useMalloc = 0;
20311: va_start(ap,zFormat);
20312: sqlite3VXPrintf(&acc, 0, zFormat, ap);
20313: va_end(ap);
20314: sqlite3StrAccumFinish(&acc);
20315: fprintf(stdout,"%s", zBuf);
20316: fflush(stdout);
20317: }
20318: #endif
20319:
20320: #ifndef SQLITE_OMIT_TRACE
20321: /*
20322: ** variable-argument wrapper around sqlite3VXPrintf().
20323: */
20324: SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){
20325: va_list ap;
20326: va_start(ap,zFormat);
20327: sqlite3VXPrintf(p, 1, zFormat, ap);
20328: va_end(ap);
20329: }
20330: #endif
20331:
20332: /************** End of printf.c **********************************************/
20333: /************** Begin file random.c ******************************************/
20334: /*
20335: ** 2001 September 15
20336: **
20337: ** The author disclaims copyright to this source code. In place of
20338: ** a legal notice, here is a blessing:
20339: **
20340: ** May you do good and not evil.
20341: ** May you find forgiveness for yourself and forgive others.
20342: ** May you share freely, never taking more than you give.
20343: **
20344: *************************************************************************
20345: ** This file contains code to implement a pseudo-random number
20346: ** generator (PRNG) for SQLite.
20347: **
20348: ** Random numbers are used by some of the database backends in order
20349: ** to generate random integer keys for tables or random filenames.
20350: */
20351:
20352:
20353: /* All threads share a single random number generator.
20354: ** This structure is the current state of the generator.
20355: */
20356: static SQLITE_WSD struct sqlite3PrngType {
20357: unsigned char isInit; /* True if initialized */
20358: unsigned char i, j; /* State variables */
20359: unsigned char s[256]; /* State variables */
20360: } sqlite3Prng;
20361:
20362: /*
20363: ** Get a single 8-bit random value from the RC4 PRNG. The Mutex
20364: ** must be held while executing this routine.
20365: **
20366: ** Why not just use a library random generator like lrand48() for this?
20367: ** Because the OP_NewRowid opcode in the VDBE depends on having a very
20368: ** good source of random numbers. The lrand48() library function may
20369: ** well be good enough. But maybe not. Or maybe lrand48() has some
20370: ** subtle problems on some systems that could cause problems. It is hard
20371: ** to know. To minimize the risk of problems due to bad lrand48()
20372: ** implementations, SQLite uses this random number generator based
20373: ** on RC4, which we know works very well.
20374: **
20375: ** (Later): Actually, OP_NewRowid does not depend on a good source of
20376: ** randomness any more. But we will leave this code in all the same.
20377: */
20378: static u8 randomByte(void){
20379: unsigned char t;
20380:
20381:
20382: /* The "wsdPrng" macro will resolve to the pseudo-random number generator
20383: ** state vector. If writable static data is unsupported on the target,
20384: ** we have to locate the state vector at run-time. In the more common
20385: ** case where writable static data is supported, wsdPrng can refer directly
20386: ** to the "sqlite3Prng" state vector declared above.
20387: */
20388: #ifdef SQLITE_OMIT_WSD
20389: struct sqlite3PrngType *p = &GLOBAL(struct sqlite3PrngType, sqlite3Prng);
20390: # define wsdPrng p[0]
20391: #else
20392: # define wsdPrng sqlite3Prng
20393: #endif
20394:
20395:
20396: /* Initialize the state of the random number generator once,
20397: ** the first time this routine is called. The seed value does
20398: ** not need to contain a lot of randomness since we are not
20399: ** trying to do secure encryption or anything like that...
20400: **
20401: ** Nothing in this file or anywhere else in SQLite does any kind of
20402: ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random
20403: ** number generator) not as an encryption device.
20404: */
20405: if( !wsdPrng.isInit ){
20406: int i;
20407: char k[256];
20408: wsdPrng.j = 0;
20409: wsdPrng.i = 0;
20410: sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k);
20411: for(i=0; i<256; i++){
20412: wsdPrng.s[i] = (u8)i;
20413: }
20414: for(i=0; i<256; i++){
20415: wsdPrng.j += wsdPrng.s[i] + k[i];
20416: t = wsdPrng.s[wsdPrng.j];
20417: wsdPrng.s[wsdPrng.j] = wsdPrng.s[i];
20418: wsdPrng.s[i] = t;
20419: }
20420: wsdPrng.isInit = 1;
20421: }
20422:
20423: /* Generate and return single random byte
20424: */
20425: wsdPrng.i++;
20426: t = wsdPrng.s[wsdPrng.i];
20427: wsdPrng.j += t;
20428: wsdPrng.s[wsdPrng.i] = wsdPrng.s[wsdPrng.j];
20429: wsdPrng.s[wsdPrng.j] = t;
20430: t += wsdPrng.s[wsdPrng.i];
20431: return wsdPrng.s[t];
20432: }
20433:
20434: /*
20435: ** Return N random bytes.
20436: */
20437: SQLITE_API void sqlite3_randomness(int N, void *pBuf){
20438: unsigned char *zBuf = pBuf;
20439: #if SQLITE_THREADSAFE
20440: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PRNG);
20441: #endif
20442: sqlite3_mutex_enter(mutex);
20443: while( N-- ){
20444: *(zBuf++) = randomByte();
20445: }
20446: sqlite3_mutex_leave(mutex);
20447: }
20448:
20449: #ifndef SQLITE_OMIT_BUILTIN_TEST
20450: /*
20451: ** For testing purposes, we sometimes want to preserve the state of
20452: ** PRNG and restore the PRNG to its saved state at a later time, or
20453: ** to reset the PRNG to its initial state. These routines accomplish
20454: ** those tasks.
20455: **
20456: ** The sqlite3_test_control() interface calls these routines to
20457: ** control the PRNG.
20458: */
20459: static SQLITE_WSD struct sqlite3PrngType sqlite3SavedPrng;
20460: SQLITE_PRIVATE void sqlite3PrngSaveState(void){
20461: memcpy(
20462: &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
20463: &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
20464: sizeof(sqlite3Prng)
20465: );
20466: }
20467: SQLITE_PRIVATE void sqlite3PrngRestoreState(void){
20468: memcpy(
20469: &GLOBAL(struct sqlite3PrngType, sqlite3Prng),
20470: &GLOBAL(struct sqlite3PrngType, sqlite3SavedPrng),
20471: sizeof(sqlite3Prng)
20472: );
20473: }
20474: SQLITE_PRIVATE void sqlite3PrngResetState(void){
20475: GLOBAL(struct sqlite3PrngType, sqlite3Prng).isInit = 0;
20476: }
20477: #endif /* SQLITE_OMIT_BUILTIN_TEST */
20478:
20479: /************** End of random.c **********************************************/
20480: /************** Begin file utf.c *********************************************/
20481: /*
20482: ** 2004 April 13
20483: **
20484: ** The author disclaims copyright to this source code. In place of
20485: ** a legal notice, here is a blessing:
20486: **
20487: ** May you do good and not evil.
20488: ** May you find forgiveness for yourself and forgive others.
20489: ** May you share freely, never taking more than you give.
20490: **
20491: *************************************************************************
20492: ** This file contains routines used to translate between UTF-8,
20493: ** UTF-16, UTF-16BE, and UTF-16LE.
20494: **
20495: ** Notes on UTF-8:
20496: **
20497: ** Byte-0 Byte-1 Byte-2 Byte-3 Value
20498: ** 0xxxxxxx 00000000 00000000 0xxxxxxx
20499: ** 110yyyyy 10xxxxxx 00000000 00000yyy yyxxxxxx
20500: ** 1110zzzz 10yyyyyy 10xxxxxx 00000000 zzzzyyyy yyxxxxxx
20501: ** 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx 000uuuuu zzzzyyyy yyxxxxxx
20502: **
20503: **
20504: ** Notes on UTF-16: (with wwww+1==uuuuu)
20505: **
20506: ** Word-0 Word-1 Value
20507: ** 110110ww wwzzzzyy 110111yy yyxxxxxx 000uuuuu zzzzyyyy yyxxxxxx
20508: ** zzzzyyyy yyxxxxxx 00000000 zzzzyyyy yyxxxxxx
20509: **
20510: **
20511: ** BOM or Byte Order Mark:
20512: ** 0xff 0xfe little-endian utf-16 follows
20513: ** 0xfe 0xff big-endian utf-16 follows
20514: **
20515: */
20516: /* #include <assert.h> */
20517:
20518: #ifndef SQLITE_AMALGAMATION
20519: /*
20520: ** The following constant value is used by the SQLITE_BIGENDIAN and
20521: ** SQLITE_LITTLEENDIAN macros.
20522: */
20523: SQLITE_PRIVATE const int sqlite3one = 1;
20524: #endif /* SQLITE_AMALGAMATION */
20525:
20526: /*
20527: ** This lookup table is used to help decode the first byte of
20528: ** a multi-byte UTF8 character.
20529: */
20530: static const unsigned char sqlite3Utf8Trans1[] = {
20531: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
20532: 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
20533: 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
20534: 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
20535: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
20536: 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
20537: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
20538: 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00,
20539: };
20540:
20541:
20542: #define WRITE_UTF8(zOut, c) { \
20543: if( c<0x00080 ){ \
20544: *zOut++ = (u8)(c&0xFF); \
20545: } \
20546: else if( c<0x00800 ){ \
20547: *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \
20548: *zOut++ = 0x80 + (u8)(c & 0x3F); \
20549: } \
20550: else if( c<0x10000 ){ \
20551: *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \
20552: *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
20553: *zOut++ = 0x80 + (u8)(c & 0x3F); \
20554: }else{ \
20555: *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \
20556: *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \
20557: *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
20558: *zOut++ = 0x80 + (u8)(c & 0x3F); \
20559: } \
20560: }
20561:
20562: #define WRITE_UTF16LE(zOut, c) { \
20563: if( c<=0xFFFF ){ \
20564: *zOut++ = (u8)(c&0x00FF); \
20565: *zOut++ = (u8)((c>>8)&0x00FF); \
20566: }else{ \
20567: *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
20568: *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \
20569: *zOut++ = (u8)(c&0x00FF); \
20570: *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \
20571: } \
20572: }
20573:
20574: #define WRITE_UTF16BE(zOut, c) { \
20575: if( c<=0xFFFF ){ \
20576: *zOut++ = (u8)((c>>8)&0x00FF); \
20577: *zOut++ = (u8)(c&0x00FF); \
20578: }else{ \
20579: *zOut++ = (u8)(0x00D8 + (((c-0x10000)>>18)&0x03)); \
20580: *zOut++ = (u8)(((c>>10)&0x003F) + (((c-0x10000)>>10)&0x00C0)); \
20581: *zOut++ = (u8)(0x00DC + ((c>>8)&0x03)); \
20582: *zOut++ = (u8)(c&0x00FF); \
20583: } \
20584: }
20585:
20586: #define READ_UTF16LE(zIn, TERM, c){ \
20587: c = (*zIn++); \
20588: c += ((*zIn++)<<8); \
20589: if( c>=0xD800 && c<0xE000 && TERM ){ \
20590: int c2 = (*zIn++); \
20591: c2 += ((*zIn++)<<8); \
20592: c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \
20593: } \
20594: }
20595:
20596: #define READ_UTF16BE(zIn, TERM, c){ \
20597: c = ((*zIn++)<<8); \
20598: c += (*zIn++); \
20599: if( c>=0xD800 && c<0xE000 && TERM ){ \
20600: int c2 = ((*zIn++)<<8); \
20601: c2 += (*zIn++); \
20602: c = (c2&0x03FF) + ((c&0x003F)<<10) + (((c&0x03C0)+0x0040)<<10); \
20603: } \
20604: }
20605:
20606: /*
20607: ** Translate a single UTF-8 character. Return the unicode value.
20608: **
20609: ** During translation, assume that the byte that zTerm points
20610: ** is a 0x00.
20611: **
20612: ** Write a pointer to the next unread byte back into *pzNext.
20613: **
20614: ** Notes On Invalid UTF-8:
20615: **
20616: ** * This routine never allows a 7-bit character (0x00 through 0x7f) to
20617: ** be encoded as a multi-byte character. Any multi-byte character that
20618: ** attempts to encode a value between 0x00 and 0x7f is rendered as 0xfffd.
20619: **
20620: ** * This routine never allows a UTF16 surrogate value to be encoded.
20621: ** If a multi-byte character attempts to encode a value between
20622: ** 0xd800 and 0xe000 then it is rendered as 0xfffd.
20623: **
20624: ** * Bytes in the range of 0x80 through 0xbf which occur as the first
20625: ** byte of a character are interpreted as single-byte characters
20626: ** and rendered as themselves even though they are technically
20627: ** invalid characters.
20628: **
20629: ** * This routine accepts an infinite number of different UTF8 encodings
20630: ** for unicode values 0x80 and greater. It do not change over-length
20631: ** encodings to 0xfffd as some systems recommend.
20632: */
20633: #define READ_UTF8(zIn, zTerm, c) \
20634: c = *(zIn++); \
20635: if( c>=0xc0 ){ \
20636: c = sqlite3Utf8Trans1[c-0xc0]; \
20637: while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \
20638: c = (c<<6) + (0x3f & *(zIn++)); \
20639: } \
20640: if( c<0x80 \
20641: || (c&0xFFFFF800)==0xD800 \
20642: || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \
20643: }
20644: SQLITE_PRIVATE u32 sqlite3Utf8Read(
1.2.2.1 ! misho 20645: const unsigned char **pz /* Pointer to string from which to read char */
1.2 misho 20646: ){
20647: unsigned int c;
20648:
20649: /* Same as READ_UTF8() above but without the zTerm parameter.
20650: ** For this routine, we assume the UTF8 string is always zero-terminated.
20651: */
1.2.2.1 ! misho 20652: c = *((*pz)++);
1.2 misho 20653: if( c>=0xc0 ){
20654: c = sqlite3Utf8Trans1[c-0xc0];
1.2.2.1 ! misho 20655: while( (*(*pz) & 0xc0)==0x80 ){
! 20656: c = (c<<6) + (0x3f & *((*pz)++));
1.2 misho 20657: }
20658: if( c<0x80
20659: || (c&0xFFFFF800)==0xD800
20660: || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; }
20661: }
20662: return c;
20663: }
20664:
20665:
20666:
20667:
20668: /*
20669: ** If the TRANSLATE_TRACE macro is defined, the value of each Mem is
20670: ** printed on stderr on the way into and out of sqlite3VdbeMemTranslate().
20671: */
20672: /* #define TRANSLATE_TRACE 1 */
20673:
20674: #ifndef SQLITE_OMIT_UTF16
20675: /*
20676: ** This routine transforms the internal text encoding used by pMem to
20677: ** desiredEnc. It is an error if the string is already of the desired
20678: ** encoding, or if *pMem does not contain a string value.
20679: */
20680: SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){
20681: int len; /* Maximum length of output string in bytes */
20682: unsigned char *zOut; /* Output buffer */
20683: unsigned char *zIn; /* Input iterator */
20684: unsigned char *zTerm; /* End of input */
20685: unsigned char *z; /* Output iterator */
20686: unsigned int c;
20687:
20688: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
20689: assert( pMem->flags&MEM_Str );
20690: assert( pMem->enc!=desiredEnc );
20691: assert( pMem->enc!=0 );
20692: assert( pMem->n>=0 );
20693:
20694: #if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG)
20695: {
20696: char zBuf[100];
20697: sqlite3VdbeMemPrettyPrint(pMem, zBuf);
20698: fprintf(stderr, "INPUT: %s\n", zBuf);
20699: }
20700: #endif
20701:
20702: /* If the translation is between UTF-16 little and big endian, then
20703: ** all that is required is to swap the byte order. This case is handled
20704: ** differently from the others.
20705: */
20706: if( pMem->enc!=SQLITE_UTF8 && desiredEnc!=SQLITE_UTF8 ){
20707: u8 temp;
20708: int rc;
20709: rc = sqlite3VdbeMemMakeWriteable(pMem);
20710: if( rc!=SQLITE_OK ){
20711: assert( rc==SQLITE_NOMEM );
20712: return SQLITE_NOMEM;
20713: }
20714: zIn = (u8*)pMem->z;
20715: zTerm = &zIn[pMem->n&~1];
20716: while( zIn<zTerm ){
20717: temp = *zIn;
20718: *zIn = *(zIn+1);
20719: zIn++;
20720: *zIn++ = temp;
20721: }
20722: pMem->enc = desiredEnc;
20723: goto translate_out;
20724: }
20725:
20726: /* Set len to the maximum number of bytes required in the output buffer. */
20727: if( desiredEnc==SQLITE_UTF8 ){
20728: /* When converting from UTF-16, the maximum growth results from
20729: ** translating a 2-byte character to a 4-byte UTF-8 character.
20730: ** A single byte is required for the output string
20731: ** nul-terminator.
20732: */
20733: pMem->n &= ~1;
20734: len = pMem->n * 2 + 1;
20735: }else{
20736: /* When converting from UTF-8 to UTF-16 the maximum growth is caused
20737: ** when a 1-byte UTF-8 character is translated into a 2-byte UTF-16
20738: ** character. Two bytes are required in the output buffer for the
20739: ** nul-terminator.
20740: */
20741: len = pMem->n * 2 + 2;
20742: }
20743:
20744: /* Set zIn to point at the start of the input buffer and zTerm to point 1
20745: ** byte past the end.
20746: **
20747: ** Variable zOut is set to point at the output buffer, space obtained
20748: ** from sqlite3_malloc().
20749: */
20750: zIn = (u8*)pMem->z;
20751: zTerm = &zIn[pMem->n];
20752: zOut = sqlite3DbMallocRaw(pMem->db, len);
20753: if( !zOut ){
20754: return SQLITE_NOMEM;
20755: }
20756: z = zOut;
20757:
20758: if( pMem->enc==SQLITE_UTF8 ){
20759: if( desiredEnc==SQLITE_UTF16LE ){
20760: /* UTF-8 -> UTF-16 Little-endian */
20761: while( zIn<zTerm ){
20762: READ_UTF8(zIn, zTerm, c);
20763: WRITE_UTF16LE(z, c);
20764: }
20765: }else{
20766: assert( desiredEnc==SQLITE_UTF16BE );
20767: /* UTF-8 -> UTF-16 Big-endian */
20768: while( zIn<zTerm ){
20769: READ_UTF8(zIn, zTerm, c);
20770: WRITE_UTF16BE(z, c);
20771: }
20772: }
20773: pMem->n = (int)(z - zOut);
20774: *z++ = 0;
20775: }else{
20776: assert( desiredEnc==SQLITE_UTF8 );
20777: if( pMem->enc==SQLITE_UTF16LE ){
20778: /* UTF-16 Little-endian -> UTF-8 */
20779: while( zIn<zTerm ){
20780: READ_UTF16LE(zIn, zIn<zTerm, c);
20781: WRITE_UTF8(z, c);
20782: }
20783: }else{
20784: /* UTF-16 Big-endian -> UTF-8 */
20785: while( zIn<zTerm ){
20786: READ_UTF16BE(zIn, zIn<zTerm, c);
20787: WRITE_UTF8(z, c);
20788: }
20789: }
20790: pMem->n = (int)(z - zOut);
20791: }
20792: *z = 0;
20793: assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len );
20794:
20795: sqlite3VdbeMemRelease(pMem);
20796: pMem->flags &= ~(MEM_Static|MEM_Dyn|MEM_Ephem);
20797: pMem->enc = desiredEnc;
20798: pMem->flags |= (MEM_Term|MEM_Dyn);
20799: pMem->z = (char*)zOut;
20800: pMem->zMalloc = pMem->z;
20801:
20802: translate_out:
20803: #if defined(TRANSLATE_TRACE) && defined(SQLITE_DEBUG)
20804: {
20805: char zBuf[100];
20806: sqlite3VdbeMemPrettyPrint(pMem, zBuf);
20807: fprintf(stderr, "OUTPUT: %s\n", zBuf);
20808: }
20809: #endif
20810: return SQLITE_OK;
20811: }
20812:
20813: /*
20814: ** This routine checks for a byte-order mark at the beginning of the
20815: ** UTF-16 string stored in *pMem. If one is present, it is removed and
20816: ** the encoding of the Mem adjusted. This routine does not do any
20817: ** byte-swapping, it just sets Mem.enc appropriately.
20818: **
20819: ** The allocation (static, dynamic etc.) and encoding of the Mem may be
20820: ** changed by this function.
20821: */
20822: SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem){
20823: int rc = SQLITE_OK;
20824: u8 bom = 0;
20825:
20826: assert( pMem->n>=0 );
20827: if( pMem->n>1 ){
20828: u8 b1 = *(u8 *)pMem->z;
20829: u8 b2 = *(((u8 *)pMem->z) + 1);
20830: if( b1==0xFE && b2==0xFF ){
20831: bom = SQLITE_UTF16BE;
20832: }
20833: if( b1==0xFF && b2==0xFE ){
20834: bom = SQLITE_UTF16LE;
20835: }
20836: }
20837:
20838: if( bom ){
20839: rc = sqlite3VdbeMemMakeWriteable(pMem);
20840: if( rc==SQLITE_OK ){
20841: pMem->n -= 2;
20842: memmove(pMem->z, &pMem->z[2], pMem->n);
20843: pMem->z[pMem->n] = '\0';
20844: pMem->z[pMem->n+1] = '\0';
20845: pMem->flags |= MEM_Term;
20846: pMem->enc = bom;
20847: }
20848: }
20849: return rc;
20850: }
20851: #endif /* SQLITE_OMIT_UTF16 */
20852:
20853: /*
20854: ** pZ is a UTF-8 encoded unicode string. If nByte is less than zero,
20855: ** return the number of unicode characters in pZ up to (but not including)
20856: ** the first 0x00 byte. If nByte is not less than zero, return the
20857: ** number of unicode characters in the first nByte of pZ (or up to
20858: ** the first 0x00, whichever comes first).
20859: */
20860: SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *zIn, int nByte){
20861: int r = 0;
20862: const u8 *z = (const u8*)zIn;
20863: const u8 *zTerm;
20864: if( nByte>=0 ){
20865: zTerm = &z[nByte];
20866: }else{
20867: zTerm = (const u8*)(-1);
20868: }
20869: assert( z<=zTerm );
20870: while( *z!=0 && z<zTerm ){
20871: SQLITE_SKIP_UTF8(z);
20872: r++;
20873: }
20874: return r;
20875: }
20876:
20877: /* This test function is not currently used by the automated test-suite.
20878: ** Hence it is only available in debug builds.
20879: */
20880: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
20881: /*
20882: ** Translate UTF-8 to UTF-8.
20883: **
20884: ** This has the effect of making sure that the string is well-formed
20885: ** UTF-8. Miscoded characters are removed.
20886: **
20887: ** The translation is done in-place and aborted if the output
20888: ** overruns the input.
20889: */
20890: SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char *zIn){
20891: unsigned char *zOut = zIn;
20892: unsigned char *zStart = zIn;
20893: u32 c;
20894:
20895: while( zIn[0] && zOut<=zIn ){
1.2.2.1 ! misho 20896: c = sqlite3Utf8Read((const u8**)&zIn);
1.2 misho 20897: if( c!=0xfffd ){
20898: WRITE_UTF8(zOut, c);
20899: }
20900: }
20901: *zOut = 0;
20902: return (int)(zOut - zStart);
20903: }
20904: #endif
20905:
20906: #ifndef SQLITE_OMIT_UTF16
20907: /*
20908: ** Convert a UTF-16 string in the native encoding into a UTF-8 string.
20909: ** Memory to hold the UTF-8 string is obtained from sqlite3_malloc and must
20910: ** be freed by the calling function.
20911: **
20912: ** NULL is returned if there is an allocation error.
20913: */
20914: SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *db, const void *z, int nByte, u8 enc){
20915: Mem m;
20916: memset(&m, 0, sizeof(m));
20917: m.db = db;
20918: sqlite3VdbeMemSetStr(&m, z, nByte, enc, SQLITE_STATIC);
20919: sqlite3VdbeChangeEncoding(&m, SQLITE_UTF8);
20920: if( db->mallocFailed ){
20921: sqlite3VdbeMemRelease(&m);
20922: m.z = 0;
20923: }
20924: assert( (m.flags & MEM_Term)!=0 || db->mallocFailed );
20925: assert( (m.flags & MEM_Str)!=0 || db->mallocFailed );
20926: assert( (m.flags & MEM_Dyn)!=0 || db->mallocFailed );
20927: assert( m.z || db->mallocFailed );
20928: return m.z;
20929: }
20930:
20931: /*
20932: ** Convert a UTF-8 string to the UTF-16 encoding specified by parameter
20933: ** enc. A pointer to the new string is returned, and the value of *pnOut
20934: ** is set to the length of the returned string in bytes. The call should
20935: ** arrange to call sqlite3DbFree() on the returned pointer when it is
20936: ** no longer required.
20937: **
20938: ** If a malloc failure occurs, NULL is returned and the db.mallocFailed
20939: ** flag set.
20940: */
20941: #ifdef SQLITE_ENABLE_STAT3
20942: SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *db, u8 enc, char *z, int n, int *pnOut){
20943: Mem m;
20944: memset(&m, 0, sizeof(m));
20945: m.db = db;
20946: sqlite3VdbeMemSetStr(&m, z, n, SQLITE_UTF8, SQLITE_STATIC);
20947: if( sqlite3VdbeMemTranslate(&m, enc) ){
20948: assert( db->mallocFailed );
20949: return 0;
20950: }
20951: assert( m.z==m.zMalloc );
20952: *pnOut = m.n;
20953: return m.z;
20954: }
20955: #endif
20956:
20957: /*
20958: ** zIn is a UTF-16 encoded unicode string at least nChar characters long.
20959: ** Return the number of bytes in the first nChar unicode characters
20960: ** in pZ. nChar must be non-negative.
20961: */
20962: SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){
20963: int c;
20964: unsigned char const *z = zIn;
20965: int n = 0;
20966:
20967: if( SQLITE_UTF16NATIVE==SQLITE_UTF16BE ){
20968: while( n<nChar ){
20969: READ_UTF16BE(z, 1, c);
20970: n++;
20971: }
20972: }else{
20973: while( n<nChar ){
20974: READ_UTF16LE(z, 1, c);
20975: n++;
20976: }
20977: }
20978: return (int)(z-(unsigned char const *)zIn);
20979: }
20980:
20981: #if defined(SQLITE_TEST)
20982: /*
20983: ** This routine is called from the TCL test function "translate_selftest".
20984: ** It checks that the primitives for serializing and deserializing
20985: ** characters in each encoding are inverses of each other.
20986: */
20987: SQLITE_PRIVATE void sqlite3UtfSelfTest(void){
20988: unsigned int i, t;
20989: unsigned char zBuf[20];
20990: unsigned char *z;
20991: int n;
20992: unsigned int c;
20993:
20994: for(i=0; i<0x00110000; i++){
20995: z = zBuf;
20996: WRITE_UTF8(z, i);
20997: n = (int)(z-zBuf);
20998: assert( n>0 && n<=4 );
20999: z[0] = 0;
21000: z = zBuf;
1.2.2.1 ! misho 21001: c = sqlite3Utf8Read((const u8**)&z);
1.2 misho 21002: t = i;
21003: if( i>=0xD800 && i<=0xDFFF ) t = 0xFFFD;
21004: if( (i&0xFFFFFFFE)==0xFFFE ) t = 0xFFFD;
21005: assert( c==t );
21006: assert( (z-zBuf)==n );
21007: }
21008: for(i=0; i<0x00110000; i++){
21009: if( i>=0xD800 && i<0xE000 ) continue;
21010: z = zBuf;
21011: WRITE_UTF16LE(z, i);
21012: n = (int)(z-zBuf);
21013: assert( n>0 && n<=4 );
21014: z[0] = 0;
21015: z = zBuf;
21016: READ_UTF16LE(z, 1, c);
21017: assert( c==i );
21018: assert( (z-zBuf)==n );
21019: }
21020: for(i=0; i<0x00110000; i++){
21021: if( i>=0xD800 && i<0xE000 ) continue;
21022: z = zBuf;
21023: WRITE_UTF16BE(z, i);
21024: n = (int)(z-zBuf);
21025: assert( n>0 && n<=4 );
21026: z[0] = 0;
21027: z = zBuf;
21028: READ_UTF16BE(z, 1, c);
21029: assert( c==i );
21030: assert( (z-zBuf)==n );
21031: }
21032: }
21033: #endif /* SQLITE_TEST */
21034: #endif /* SQLITE_OMIT_UTF16 */
21035:
21036: /************** End of utf.c *************************************************/
21037: /************** Begin file util.c ********************************************/
21038: /*
21039: ** 2001 September 15
21040: **
21041: ** The author disclaims copyright to this source code. In place of
21042: ** a legal notice, here is a blessing:
21043: **
21044: ** May you do good and not evil.
21045: ** May you find forgiveness for yourself and forgive others.
21046: ** May you share freely, never taking more than you give.
21047: **
21048: *************************************************************************
21049: ** Utility functions used throughout sqlite.
21050: **
21051: ** This file contains functions for allocating memory, comparing
21052: ** strings, and stuff like that.
21053: **
21054: */
21055: /* #include <stdarg.h> */
21056: #ifdef SQLITE_HAVE_ISNAN
21057: # include <math.h>
21058: #endif
21059:
21060: /*
21061: ** Routine needed to support the testcase() macro.
21062: */
21063: #ifdef SQLITE_COVERAGE_TEST
21064: SQLITE_PRIVATE void sqlite3Coverage(int x){
21065: static unsigned dummy = 0;
21066: dummy += (unsigned)x;
21067: }
21068: #endif
21069:
21070: #ifndef SQLITE_OMIT_FLOATING_POINT
21071: /*
21072: ** Return true if the floating point value is Not a Number (NaN).
21073: **
21074: ** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN.
21075: ** Otherwise, we have our own implementation that works on most systems.
21076: */
21077: SQLITE_PRIVATE int sqlite3IsNaN(double x){
21078: int rc; /* The value return */
21079: #if !defined(SQLITE_HAVE_ISNAN)
21080: /*
21081: ** Systems that support the isnan() library function should probably
21082: ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have
21083: ** found that many systems do not have a working isnan() function so
21084: ** this implementation is provided as an alternative.
21085: **
21086: ** This NaN test sometimes fails if compiled on GCC with -ffast-math.
21087: ** On the other hand, the use of -ffast-math comes with the following
21088: ** warning:
21089: **
21090: ** This option [-ffast-math] should never be turned on by any
21091: ** -O option since it can result in incorrect output for programs
21092: ** which depend on an exact implementation of IEEE or ISO
21093: ** rules/specifications for math functions.
21094: **
21095: ** Under MSVC, this NaN test may fail if compiled with a floating-
21096: ** point precision mode other than /fp:precise. From the MSDN
21097: ** documentation:
21098: **
21099: ** The compiler [with /fp:precise] will properly handle comparisons
21100: ** involving NaN. For example, x != x evaluates to true if x is NaN
21101: ** ...
21102: */
21103: #ifdef __FAST_MATH__
21104: # error SQLite will not work correctly with the -ffast-math option of GCC.
21105: #endif
21106: volatile double y = x;
21107: volatile double z = y;
21108: rc = (y!=z);
21109: #else /* if defined(SQLITE_HAVE_ISNAN) */
21110: rc = isnan(x);
21111: #endif /* SQLITE_HAVE_ISNAN */
21112: testcase( rc );
21113: return rc;
21114: }
21115: #endif /* SQLITE_OMIT_FLOATING_POINT */
21116:
21117: /*
21118: ** Compute a string length that is limited to what can be stored in
21119: ** lower 30 bits of a 32-bit signed integer.
21120: **
21121: ** The value returned will never be negative. Nor will it ever be greater
21122: ** than the actual length of the string. For very long strings (greater
21123: ** than 1GiB) the value returned might be less than the true string length.
21124: */
21125: SQLITE_PRIVATE int sqlite3Strlen30(const char *z){
21126: const char *z2 = z;
21127: if( z==0 ) return 0;
21128: while( *z2 ){ z2++; }
21129: return 0x3fffffff & (int)(z2 - z);
21130: }
21131:
21132: /*
21133: ** Set the most recent error code and error string for the sqlite
21134: ** handle "db". The error code is set to "err_code".
21135: **
21136: ** If it is not NULL, string zFormat specifies the format of the
21137: ** error string in the style of the printf functions: The following
21138: ** format characters are allowed:
21139: **
21140: ** %s Insert a string
21141: ** %z A string that should be freed after use
21142: ** %d Insert an integer
21143: ** %T Insert a token
21144: ** %S Insert the first element of a SrcList
21145: **
21146: ** zFormat and any string tokens that follow it are assumed to be
21147: ** encoded in UTF-8.
21148: **
21149: ** To clear the most recent error for sqlite handle "db", sqlite3Error
21150: ** should be called with err_code set to SQLITE_OK and zFormat set
21151: ** to NULL.
21152: */
21153: SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code, const char *zFormat, ...){
21154: if( db && (db->pErr || (db->pErr = sqlite3ValueNew(db))!=0) ){
21155: db->errCode = err_code;
21156: if( zFormat ){
21157: char *z;
21158: va_list ap;
21159: va_start(ap, zFormat);
21160: z = sqlite3VMPrintf(db, zFormat, ap);
21161: va_end(ap);
21162: sqlite3ValueSetStr(db->pErr, -1, z, SQLITE_UTF8, SQLITE_DYNAMIC);
21163: }else{
21164: sqlite3ValueSetStr(db->pErr, 0, 0, SQLITE_UTF8, SQLITE_STATIC);
21165: }
21166: }
21167: }
21168:
21169: /*
21170: ** Add an error message to pParse->zErrMsg and increment pParse->nErr.
21171: ** The following formatting characters are allowed:
21172: **
21173: ** %s Insert a string
21174: ** %z A string that should be freed after use
21175: ** %d Insert an integer
21176: ** %T Insert a token
21177: ** %S Insert the first element of a SrcList
21178: **
21179: ** This function should be used to report any error that occurs whilst
21180: ** compiling an SQL statement (i.e. within sqlite3_prepare()). The
21181: ** last thing the sqlite3_prepare() function does is copy the error
21182: ** stored by this function into the database handle using sqlite3Error().
21183: ** Function sqlite3Error() should be used during statement execution
21184: ** (sqlite3_step() etc.).
21185: */
21186: SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
21187: char *zMsg;
21188: va_list ap;
21189: sqlite3 *db = pParse->db;
21190: va_start(ap, zFormat);
21191: zMsg = sqlite3VMPrintf(db, zFormat, ap);
21192: va_end(ap);
21193: if( db->suppressErr ){
21194: sqlite3DbFree(db, zMsg);
21195: }else{
21196: pParse->nErr++;
21197: sqlite3DbFree(db, pParse->zErrMsg);
21198: pParse->zErrMsg = zMsg;
21199: pParse->rc = SQLITE_ERROR;
21200: }
21201: }
21202:
21203: /*
21204: ** Convert an SQL-style quoted string into a normal string by removing
21205: ** the quote characters. The conversion is done in-place. If the
21206: ** input does not begin with a quote character, then this routine
21207: ** is a no-op.
21208: **
21209: ** The input string must be zero-terminated. A new zero-terminator
21210: ** is added to the dequoted string.
21211: **
21212: ** The return value is -1 if no dequoting occurs or the length of the
21213: ** dequoted string, exclusive of the zero terminator, if dequoting does
21214: ** occur.
21215: **
21216: ** 2002-Feb-14: This routine is extended to remove MS-Access style
21217: ** brackets from around identifers. For example: "[a-b-c]" becomes
21218: ** "a-b-c".
21219: */
21220: SQLITE_PRIVATE int sqlite3Dequote(char *z){
21221: char quote;
21222: int i, j;
21223: if( z==0 ) return -1;
21224: quote = z[0];
21225: switch( quote ){
21226: case '\'': break;
21227: case '"': break;
21228: case '`': break; /* For MySQL compatibility */
21229: case '[': quote = ']'; break; /* For MS SqlServer compatibility */
21230: default: return -1;
21231: }
21232: for(i=1, j=0; ALWAYS(z[i]); i++){
21233: if( z[i]==quote ){
21234: if( z[i+1]==quote ){
21235: z[j++] = quote;
21236: i++;
21237: }else{
21238: break;
21239: }
21240: }else{
21241: z[j++] = z[i];
21242: }
21243: }
21244: z[j] = 0;
21245: return j;
21246: }
21247:
21248: /* Convenient short-hand */
21249: #define UpperToLower sqlite3UpperToLower
21250:
21251: /*
21252: ** Some systems have stricmp(). Others have strcasecmp(). Because
21253: ** there is no consistency, we will define our own.
21254: **
1.2.2.1 ! misho 21255: ** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and
! 21256: ** sqlite3_strnicmp() APIs allow applications and extensions to compare
! 21257: ** the contents of two buffers containing UTF-8 strings in a
! 21258: ** case-independent fashion, using the same definition of "case
! 21259: ** independence" that SQLite uses internally when comparing identifiers.
1.2 misho 21260: */
1.2.2.1 ! misho 21261: SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){
1.2 misho 21262: register unsigned char *a, *b;
21263: a = (unsigned char *)zLeft;
21264: b = (unsigned char *)zRight;
21265: while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
21266: return UpperToLower[*a] - UpperToLower[*b];
21267: }
21268: SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){
21269: register unsigned char *a, *b;
21270: a = (unsigned char *)zLeft;
21271: b = (unsigned char *)zRight;
21272: while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
21273: return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b];
21274: }
21275:
21276: /*
21277: ** The string z[] is an text representation of a real number.
21278: ** Convert this string to a double and write it into *pResult.
21279: **
21280: ** The string z[] is length bytes in length (bytes, not characters) and
21281: ** uses the encoding enc. The string is not necessarily zero-terminated.
21282: **
21283: ** Return TRUE if the result is a valid real number (or integer) and FALSE
21284: ** if the string is empty or contains extraneous text. Valid numbers
21285: ** are in one of these formats:
21286: **
21287: ** [+-]digits[E[+-]digits]
21288: ** [+-]digits.[digits][E[+-]digits]
21289: ** [+-].digits[E[+-]digits]
21290: **
21291: ** Leading and trailing whitespace is ignored for the purpose of determining
21292: ** validity.
21293: **
21294: ** If some prefix of the input string is a valid number, this routine
21295: ** returns FALSE but it still converts the prefix and writes the result
21296: ** into *pResult.
21297: */
21298: SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){
21299: #ifndef SQLITE_OMIT_FLOATING_POINT
21300: int incr = (enc==SQLITE_UTF8?1:2);
21301: const char *zEnd = z + length;
21302: /* sign * significand * (10 ^ (esign * exponent)) */
21303: int sign = 1; /* sign of significand */
21304: i64 s = 0; /* significand */
21305: int d = 0; /* adjust exponent for shifting decimal point */
21306: int esign = 1; /* sign of exponent */
21307: int e = 0; /* exponent */
21308: int eValid = 1; /* True exponent is either not used or is well-formed */
21309: double result;
21310: int nDigits = 0;
21311:
21312: *pResult = 0.0; /* Default return value, in case of an error */
21313:
21314: if( enc==SQLITE_UTF16BE ) z++;
21315:
21316: /* skip leading spaces */
21317: while( z<zEnd && sqlite3Isspace(*z) ) z+=incr;
21318: if( z>=zEnd ) return 0;
21319:
21320: /* get sign of significand */
21321: if( *z=='-' ){
21322: sign = -1;
21323: z+=incr;
21324: }else if( *z=='+' ){
21325: z+=incr;
21326: }
21327:
21328: /* skip leading zeroes */
21329: while( z<zEnd && z[0]=='0' ) z+=incr, nDigits++;
21330:
21331: /* copy max significant digits to significand */
21332: while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
21333: s = s*10 + (*z - '0');
21334: z+=incr, nDigits++;
21335: }
21336:
21337: /* skip non-significant significand digits
21338: ** (increase exponent by d to shift decimal left) */
21339: while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++, d++;
21340: if( z>=zEnd ) goto do_atof_calc;
21341:
21342: /* if decimal point is present */
21343: if( *z=='.' ){
21344: z+=incr;
21345: /* copy digits from after decimal to significand
21346: ** (decrease exponent by d to shift decimal right) */
21347: while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){
21348: s = s*10 + (*z - '0');
21349: z+=incr, nDigits++, d--;
21350: }
21351: /* skip non-significant digits */
21352: while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++;
21353: }
21354: if( z>=zEnd ) goto do_atof_calc;
21355:
21356: /* if exponent is present */
21357: if( *z=='e' || *z=='E' ){
21358: z+=incr;
21359: eValid = 0;
21360: if( z>=zEnd ) goto do_atof_calc;
21361: /* get sign of exponent */
21362: if( *z=='-' ){
21363: esign = -1;
21364: z+=incr;
21365: }else if( *z=='+' ){
21366: z+=incr;
21367: }
21368: /* copy digits to exponent */
21369: while( z<zEnd && sqlite3Isdigit(*z) ){
21370: e = e<10000 ? (e*10 + (*z - '0')) : 10000;
21371: z+=incr;
21372: eValid = 1;
21373: }
21374: }
21375:
21376: /* skip trailing spaces */
21377: if( nDigits && eValid ){
21378: while( z<zEnd && sqlite3Isspace(*z) ) z+=incr;
21379: }
21380:
21381: do_atof_calc:
21382: /* adjust exponent by d, and update sign */
21383: e = (e*esign) + d;
21384: if( e<0 ) {
21385: esign = -1;
21386: e *= -1;
21387: } else {
21388: esign = 1;
21389: }
21390:
21391: /* if 0 significand */
21392: if( !s ) {
21393: /* In the IEEE 754 standard, zero is signed.
21394: ** Add the sign if we've seen at least one digit */
21395: result = (sign<0 && nDigits) ? -(double)0 : (double)0;
21396: } else {
21397: /* attempt to reduce exponent */
21398: if( esign>0 ){
21399: while( s<(LARGEST_INT64/10) && e>0 ) e--,s*=10;
21400: }else{
21401: while( !(s%10) && e>0 ) e--,s/=10;
21402: }
21403:
21404: /* adjust the sign of significand */
21405: s = sign<0 ? -s : s;
21406:
21407: /* if exponent, scale significand as appropriate
21408: ** and store in result. */
21409: if( e ){
1.2.2.1 ! misho 21410: LONGDOUBLE_TYPE scale = 1.0;
1.2 misho 21411: /* attempt to handle extremely small/large numbers better */
21412: if( e>307 && e<342 ){
21413: while( e%308 ) { scale *= 1.0e+1; e -= 1; }
21414: if( esign<0 ){
21415: result = s / scale;
1.2.2.1 ! misho 21416: result /= 1.0e+308;
1.2 misho 21417: }else{
21418: result = s * scale;
1.2.2.1 ! misho 21419: result *= 1.0e+308;
1.2 misho 21420: }
21421: }else if( e>=342 ){
21422: if( esign<0 ){
21423: result = 0.0*s;
21424: }else{
21425: result = 1e308*1e308*s; /* Infinity */
21426: }
1.2.2.1 ! misho 21427: }else{
1.2 misho 21428: /* 1.0e+22 is the largest power of 10 than can be
21429: ** represented exactly. */
21430: while( e%22 ) { scale *= 1.0e+1; e -= 1; }
21431: while( e>0 ) { scale *= 1.0e+22; e -= 22; }
21432: if( esign<0 ){
21433: result = s / scale;
21434: }else{
21435: result = s * scale;
21436: }
21437: }
21438: } else {
21439: result = (double)s;
21440: }
21441: }
21442:
21443: /* store the result */
21444: *pResult = result;
21445:
21446: /* return true if number and no extra non-whitespace chracters after */
21447: return z>=zEnd && nDigits>0 && eValid;
21448: #else
21449: return !sqlite3Atoi64(z, pResult, length, enc);
21450: #endif /* SQLITE_OMIT_FLOATING_POINT */
21451: }
21452:
21453: /*
21454: ** Compare the 19-character string zNum against the text representation
21455: ** value 2^63: 9223372036854775808. Return negative, zero, or positive
21456: ** if zNum is less than, equal to, or greater than the string.
21457: ** Note that zNum must contain exactly 19 characters.
21458: **
21459: ** Unlike memcmp() this routine is guaranteed to return the difference
21460: ** in the values of the last digit if the only difference is in the
21461: ** last digit. So, for example,
21462: **
21463: ** compare2pow63("9223372036854775800", 1)
21464: **
21465: ** will return -8.
21466: */
21467: static int compare2pow63(const char *zNum, int incr){
21468: int c = 0;
21469: int i;
21470: /* 012345678901234567 */
21471: const char *pow63 = "922337203685477580";
21472: for(i=0; c==0 && i<18; i++){
21473: c = (zNum[i*incr]-pow63[i])*10;
21474: }
21475: if( c==0 ){
21476: c = zNum[18*incr] - '8';
21477: testcase( c==(-1) );
21478: testcase( c==0 );
21479: testcase( c==(+1) );
21480: }
21481: return c;
21482: }
21483:
21484:
21485: /*
21486: ** Convert zNum to a 64-bit signed integer.
21487: **
21488: ** If the zNum value is representable as a 64-bit twos-complement
21489: ** integer, then write that value into *pNum and return 0.
21490: **
21491: ** If zNum is exactly 9223372036854665808, return 2. This special
21492: ** case is broken out because while 9223372036854665808 cannot be a
21493: ** signed 64-bit integer, its negative -9223372036854665808 can be.
21494: **
21495: ** If zNum is too big for a 64-bit integer and is not
21496: ** 9223372036854665808 then return 1.
21497: **
21498: ** length is the number of bytes in the string (bytes, not characters).
21499: ** The string is not necessarily zero-terminated. The encoding is
21500: ** given by enc.
21501: */
21502: SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){
21503: int incr = (enc==SQLITE_UTF8?1:2);
21504: u64 u = 0;
21505: int neg = 0; /* assume positive */
21506: int i;
21507: int c = 0;
21508: const char *zStart;
21509: const char *zEnd = zNum + length;
21510: if( enc==SQLITE_UTF16BE ) zNum++;
21511: while( zNum<zEnd && sqlite3Isspace(*zNum) ) zNum+=incr;
21512: if( zNum<zEnd ){
21513: if( *zNum=='-' ){
21514: neg = 1;
21515: zNum+=incr;
21516: }else if( *zNum=='+' ){
21517: zNum+=incr;
21518: }
21519: }
21520: zStart = zNum;
21521: while( zNum<zEnd && zNum[0]=='0' ){ zNum+=incr; } /* Skip leading zeros. */
21522: for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){
21523: u = u*10 + c - '0';
21524: }
21525: if( u>LARGEST_INT64 ){
21526: *pNum = SMALLEST_INT64;
21527: }else if( neg ){
21528: *pNum = -(i64)u;
21529: }else{
21530: *pNum = (i64)u;
21531: }
21532: testcase( i==18 );
21533: testcase( i==19 );
21534: testcase( i==20 );
21535: if( (c!=0 && &zNum[i]<zEnd) || (i==0 && zStart==zNum) || i>19*incr ){
21536: /* zNum is empty or contains non-numeric text or is longer
21537: ** than 19 digits (thus guaranteeing that it is too large) */
21538: return 1;
21539: }else if( i<19*incr ){
21540: /* Less than 19 digits, so we know that it fits in 64 bits */
21541: assert( u<=LARGEST_INT64 );
21542: return 0;
21543: }else{
21544: /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */
21545: c = compare2pow63(zNum, incr);
21546: if( c<0 ){
21547: /* zNum is less than 9223372036854775808 so it fits */
21548: assert( u<=LARGEST_INT64 );
21549: return 0;
21550: }else if( c>0 ){
21551: /* zNum is greater than 9223372036854775808 so it overflows */
21552: return 1;
21553: }else{
21554: /* zNum is exactly 9223372036854775808. Fits if negative. The
21555: ** special case 2 overflow if positive */
21556: assert( u-1==LARGEST_INT64 );
21557: assert( (*pNum)==SMALLEST_INT64 );
21558: return neg ? 0 : 2;
21559: }
21560: }
21561: }
21562:
21563: /*
21564: ** If zNum represents an integer that will fit in 32-bits, then set
21565: ** *pValue to that integer and return true. Otherwise return false.
21566: **
21567: ** Any non-numeric characters that following zNum are ignored.
21568: ** This is different from sqlite3Atoi64() which requires the
21569: ** input number to be zero-terminated.
21570: */
21571: SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){
21572: sqlite_int64 v = 0;
21573: int i, c;
21574: int neg = 0;
21575: if( zNum[0]=='-' ){
21576: neg = 1;
21577: zNum++;
21578: }else if( zNum[0]=='+' ){
21579: zNum++;
21580: }
21581: while( zNum[0]=='0' ) zNum++;
21582: for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){
21583: v = v*10 + c;
21584: }
21585:
21586: /* The longest decimal representation of a 32 bit integer is 10 digits:
21587: **
21588: ** 1234567890
21589: ** 2^31 -> 2147483648
21590: */
21591: testcase( i==10 );
21592: if( i>10 ){
21593: return 0;
21594: }
21595: testcase( v-neg==2147483647 );
21596: if( v-neg>2147483647 ){
21597: return 0;
21598: }
21599: if( neg ){
21600: v = -v;
21601: }
21602: *pValue = (int)v;
21603: return 1;
21604: }
21605:
21606: /*
21607: ** Return a 32-bit integer value extracted from a string. If the
21608: ** string is not an integer, just return 0.
21609: */
21610: SQLITE_PRIVATE int sqlite3Atoi(const char *z){
21611: int x = 0;
21612: if( z ) sqlite3GetInt32(z, &x);
21613: return x;
21614: }
21615:
21616: /*
21617: ** The variable-length integer encoding is as follows:
21618: **
21619: ** KEY:
21620: ** A = 0xxxxxxx 7 bits of data and one flag bit
21621: ** B = 1xxxxxxx 7 bits of data and one flag bit
21622: ** C = xxxxxxxx 8 bits of data
21623: **
21624: ** 7 bits - A
21625: ** 14 bits - BA
21626: ** 21 bits - BBA
21627: ** 28 bits - BBBA
21628: ** 35 bits - BBBBA
21629: ** 42 bits - BBBBBA
21630: ** 49 bits - BBBBBBA
21631: ** 56 bits - BBBBBBBA
21632: ** 64 bits - BBBBBBBBC
21633: */
21634:
21635: /*
21636: ** Write a 64-bit variable-length integer to memory starting at p[0].
21637: ** The length of data write will be between 1 and 9 bytes. The number
21638: ** of bytes written is returned.
21639: **
21640: ** A variable-length integer consists of the lower 7 bits of each byte
21641: ** for all bytes that have the 8th bit set and one byte with the 8th
21642: ** bit clear. Except, if we get to the 9th byte, it stores the full
21643: ** 8 bits and is the last byte.
21644: */
21645: SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){
21646: int i, j, n;
21647: u8 buf[10];
21648: if( v & (((u64)0xff000000)<<32) ){
21649: p[8] = (u8)v;
21650: v >>= 8;
21651: for(i=7; i>=0; i--){
21652: p[i] = (u8)((v & 0x7f) | 0x80);
21653: v >>= 7;
21654: }
21655: return 9;
21656: }
21657: n = 0;
21658: do{
21659: buf[n++] = (u8)((v & 0x7f) | 0x80);
21660: v >>= 7;
21661: }while( v!=0 );
21662: buf[0] &= 0x7f;
21663: assert( n<=9 );
21664: for(i=0, j=n-1; j>=0; j--, i++){
21665: p[i] = buf[j];
21666: }
21667: return n;
21668: }
21669:
21670: /*
21671: ** This routine is a faster version of sqlite3PutVarint() that only
21672: ** works for 32-bit positive integers and which is optimized for
21673: ** the common case of small integers. A MACRO version, putVarint32,
21674: ** is provided which inlines the single-byte case. All code should use
21675: ** the MACRO version as this function assumes the single-byte case has
21676: ** already been handled.
21677: */
21678: SQLITE_PRIVATE int sqlite3PutVarint32(unsigned char *p, u32 v){
21679: #ifndef putVarint32
21680: if( (v & ~0x7f)==0 ){
21681: p[0] = v;
21682: return 1;
21683: }
21684: #endif
21685: if( (v & ~0x3fff)==0 ){
21686: p[0] = (u8)((v>>7) | 0x80);
21687: p[1] = (u8)(v & 0x7f);
21688: return 2;
21689: }
21690: return sqlite3PutVarint(p, v);
21691: }
21692:
21693: /*
21694: ** Bitmasks used by sqlite3GetVarint(). These precomputed constants
21695: ** are defined here rather than simply putting the constant expressions
21696: ** inline in order to work around bugs in the RVT compiler.
21697: **
21698: ** SLOT_2_0 A mask for (0x7f<<14) | 0x7f
21699: **
21700: ** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0
21701: */
21702: #define SLOT_2_0 0x001fc07f
21703: #define SLOT_4_2_0 0xf01fc07f
21704:
21705:
21706: /*
21707: ** Read a 64-bit variable-length integer from memory starting at p[0].
21708: ** Return the number of bytes read. The value is stored in *v.
21709: */
21710: SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){
21711: u32 a,b,s;
21712:
21713: a = *p;
21714: /* a: p0 (unmasked) */
21715: if (!(a&0x80))
21716: {
21717: *v = a;
21718: return 1;
21719: }
21720:
21721: p++;
21722: b = *p;
21723: /* b: p1 (unmasked) */
21724: if (!(b&0x80))
21725: {
21726: a &= 0x7f;
21727: a = a<<7;
21728: a |= b;
21729: *v = a;
21730: return 2;
21731: }
21732:
21733: /* Verify that constants are precomputed correctly */
21734: assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) );
21735: assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) );
21736:
21737: p++;
21738: a = a<<14;
21739: a |= *p;
21740: /* a: p0<<14 | p2 (unmasked) */
21741: if (!(a&0x80))
21742: {
21743: a &= SLOT_2_0;
21744: b &= 0x7f;
21745: b = b<<7;
21746: a |= b;
21747: *v = a;
21748: return 3;
21749: }
21750:
21751: /* CSE1 from below */
21752: a &= SLOT_2_0;
21753: p++;
21754: b = b<<14;
21755: b |= *p;
21756: /* b: p1<<14 | p3 (unmasked) */
21757: if (!(b&0x80))
21758: {
21759: b &= SLOT_2_0;
21760: /* moved CSE1 up */
21761: /* a &= (0x7f<<14)|(0x7f); */
21762: a = a<<7;
21763: a |= b;
21764: *v = a;
21765: return 4;
21766: }
21767:
21768: /* a: p0<<14 | p2 (masked) */
21769: /* b: p1<<14 | p3 (unmasked) */
21770: /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
21771: /* moved CSE1 up */
21772: /* a &= (0x7f<<14)|(0x7f); */
21773: b &= SLOT_2_0;
21774: s = a;
21775: /* s: p0<<14 | p2 (masked) */
21776:
21777: p++;
21778: a = a<<14;
21779: a |= *p;
21780: /* a: p0<<28 | p2<<14 | p4 (unmasked) */
21781: if (!(a&0x80))
21782: {
21783: /* we can skip these cause they were (effectively) done above in calc'ing s */
21784: /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
21785: /* b &= (0x7f<<14)|(0x7f); */
21786: b = b<<7;
21787: a |= b;
21788: s = s>>18;
21789: *v = ((u64)s)<<32 | a;
21790: return 5;
21791: }
21792:
21793: /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
21794: s = s<<7;
21795: s |= b;
21796: /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
21797:
21798: p++;
21799: b = b<<14;
21800: b |= *p;
21801: /* b: p1<<28 | p3<<14 | p5 (unmasked) */
21802: if (!(b&0x80))
21803: {
21804: /* we can skip this cause it was (effectively) done above in calc'ing s */
21805: /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
21806: a &= SLOT_2_0;
21807: a = a<<7;
21808: a |= b;
21809: s = s>>18;
21810: *v = ((u64)s)<<32 | a;
21811: return 6;
21812: }
21813:
21814: p++;
21815: a = a<<14;
21816: a |= *p;
21817: /* a: p2<<28 | p4<<14 | p6 (unmasked) */
21818: if (!(a&0x80))
21819: {
21820: a &= SLOT_4_2_0;
21821: b &= SLOT_2_0;
21822: b = b<<7;
21823: a |= b;
21824: s = s>>11;
21825: *v = ((u64)s)<<32 | a;
21826: return 7;
21827: }
21828:
21829: /* CSE2 from below */
21830: a &= SLOT_2_0;
21831: p++;
21832: b = b<<14;
21833: b |= *p;
21834: /* b: p3<<28 | p5<<14 | p7 (unmasked) */
21835: if (!(b&0x80))
21836: {
21837: b &= SLOT_4_2_0;
21838: /* moved CSE2 up */
21839: /* a &= (0x7f<<14)|(0x7f); */
21840: a = a<<7;
21841: a |= b;
21842: s = s>>4;
21843: *v = ((u64)s)<<32 | a;
21844: return 8;
21845: }
21846:
21847: p++;
21848: a = a<<15;
21849: a |= *p;
21850: /* a: p4<<29 | p6<<15 | p8 (unmasked) */
21851:
21852: /* moved CSE2 up */
21853: /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
21854: b &= SLOT_2_0;
21855: b = b<<8;
21856: a |= b;
21857:
21858: s = s<<4;
21859: b = p[-4];
21860: b &= 0x7f;
21861: b = b>>3;
21862: s |= b;
21863:
21864: *v = ((u64)s)<<32 | a;
21865:
21866: return 9;
21867: }
21868:
21869: /*
21870: ** Read a 32-bit variable-length integer from memory starting at p[0].
21871: ** Return the number of bytes read. The value is stored in *v.
21872: **
21873: ** If the varint stored in p[0] is larger than can fit in a 32-bit unsigned
21874: ** integer, then set *v to 0xffffffff.
21875: **
21876: ** A MACRO version, getVarint32, is provided which inlines the
21877: ** single-byte case. All code should use the MACRO version as
21878: ** this function assumes the single-byte case has already been handled.
21879: */
21880: SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){
21881: u32 a,b;
21882:
21883: /* The 1-byte case. Overwhelmingly the most common. Handled inline
21884: ** by the getVarin32() macro */
21885: a = *p;
21886: /* a: p0 (unmasked) */
21887: #ifndef getVarint32
21888: if (!(a&0x80))
21889: {
21890: /* Values between 0 and 127 */
21891: *v = a;
21892: return 1;
21893: }
21894: #endif
21895:
21896: /* The 2-byte case */
21897: p++;
21898: b = *p;
21899: /* b: p1 (unmasked) */
21900: if (!(b&0x80))
21901: {
21902: /* Values between 128 and 16383 */
21903: a &= 0x7f;
21904: a = a<<7;
21905: *v = a | b;
21906: return 2;
21907: }
21908:
21909: /* The 3-byte case */
21910: p++;
21911: a = a<<14;
21912: a |= *p;
21913: /* a: p0<<14 | p2 (unmasked) */
21914: if (!(a&0x80))
21915: {
21916: /* Values between 16384 and 2097151 */
21917: a &= (0x7f<<14)|(0x7f);
21918: b &= 0x7f;
21919: b = b<<7;
21920: *v = a | b;
21921: return 3;
21922: }
21923:
21924: /* A 32-bit varint is used to store size information in btrees.
21925: ** Objects are rarely larger than 2MiB limit of a 3-byte varint.
21926: ** A 3-byte varint is sufficient, for example, to record the size
21927: ** of a 1048569-byte BLOB or string.
21928: **
21929: ** We only unroll the first 1-, 2-, and 3- byte cases. The very
21930: ** rare larger cases can be handled by the slower 64-bit varint
21931: ** routine.
21932: */
21933: #if 1
21934: {
21935: u64 v64;
21936: u8 n;
21937:
21938: p -= 2;
21939: n = sqlite3GetVarint(p, &v64);
21940: assert( n>3 && n<=9 );
21941: if( (v64 & SQLITE_MAX_U32)!=v64 ){
21942: *v = 0xffffffff;
21943: }else{
21944: *v = (u32)v64;
21945: }
21946: return n;
21947: }
21948:
21949: #else
21950: /* For following code (kept for historical record only) shows an
21951: ** unrolling for the 3- and 4-byte varint cases. This code is
21952: ** slightly faster, but it is also larger and much harder to test.
21953: */
21954: p++;
21955: b = b<<14;
21956: b |= *p;
21957: /* b: p1<<14 | p3 (unmasked) */
21958: if (!(b&0x80))
21959: {
21960: /* Values between 2097152 and 268435455 */
21961: b &= (0x7f<<14)|(0x7f);
21962: a &= (0x7f<<14)|(0x7f);
21963: a = a<<7;
21964: *v = a | b;
21965: return 4;
21966: }
21967:
21968: p++;
21969: a = a<<14;
21970: a |= *p;
21971: /* a: p0<<28 | p2<<14 | p4 (unmasked) */
21972: if (!(a&0x80))
21973: {
21974: /* Values between 268435456 and 34359738367 */
21975: a &= SLOT_4_2_0;
21976: b &= SLOT_4_2_0;
21977: b = b<<7;
21978: *v = a | b;
21979: return 5;
21980: }
21981:
21982: /* We can only reach this point when reading a corrupt database
21983: ** file. In that case we are not in any hurry. Use the (relatively
21984: ** slow) general-purpose sqlite3GetVarint() routine to extract the
21985: ** value. */
21986: {
21987: u64 v64;
21988: u8 n;
21989:
21990: p -= 4;
21991: n = sqlite3GetVarint(p, &v64);
21992: assert( n>5 && n<=9 );
21993: *v = (u32)v64;
21994: return n;
21995: }
21996: #endif
21997: }
21998:
21999: /*
22000: ** Return the number of bytes that will be needed to store the given
22001: ** 64-bit integer.
22002: */
22003: SQLITE_PRIVATE int sqlite3VarintLen(u64 v){
22004: int i = 0;
22005: do{
22006: i++;
22007: v >>= 7;
22008: }while( v!=0 && ALWAYS(i<9) );
22009: return i;
22010: }
22011:
22012:
22013: /*
22014: ** Read or write a four-byte big-endian integer value.
22015: */
22016: SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){
22017: return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
22018: }
22019: SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){
22020: p[0] = (u8)(v>>24);
22021: p[1] = (u8)(v>>16);
22022: p[2] = (u8)(v>>8);
22023: p[3] = (u8)v;
22024: }
22025:
22026:
22027:
22028: /*
22029: ** Translate a single byte of Hex into an integer.
22030: ** This routine only works if h really is a valid hexadecimal
22031: ** character: 0..9a..fA..F
22032: */
22033: SQLITE_PRIVATE u8 sqlite3HexToInt(int h){
22034: assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') );
22035: #ifdef SQLITE_ASCII
22036: h += 9*(1&(h>>6));
22037: #endif
22038: #ifdef SQLITE_EBCDIC
22039: h += 9*(1&~(h>>4));
22040: #endif
22041: return (u8)(h & 0xf);
22042: }
22043:
22044: #if !defined(SQLITE_OMIT_BLOB_LITERAL) || defined(SQLITE_HAS_CODEC)
22045: /*
22046: ** Convert a BLOB literal of the form "x'hhhhhh'" into its binary
22047: ** value. Return a pointer to its binary value. Space to hold the
22048: ** binary value has been obtained from malloc and must be freed by
22049: ** the calling routine.
22050: */
22051: SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){
22052: char *zBlob;
22053: int i;
22054:
22055: zBlob = (char *)sqlite3DbMallocRaw(db, n/2 + 1);
22056: n--;
22057: if( zBlob ){
22058: for(i=0; i<n; i+=2){
22059: zBlob[i/2] = (sqlite3HexToInt(z[i])<<4) | sqlite3HexToInt(z[i+1]);
22060: }
22061: zBlob[i/2] = 0;
22062: }
22063: return zBlob;
22064: }
22065: #endif /* !SQLITE_OMIT_BLOB_LITERAL || SQLITE_HAS_CODEC */
22066:
22067: /*
22068: ** Log an error that is an API call on a connection pointer that should
22069: ** not have been used. The "type" of connection pointer is given as the
22070: ** argument. The zType is a word like "NULL" or "closed" or "invalid".
22071: */
22072: static void logBadConnection(const char *zType){
22073: sqlite3_log(SQLITE_MISUSE,
22074: "API call with %s database connection pointer",
22075: zType
22076: );
22077: }
22078:
22079: /*
22080: ** Check to make sure we have a valid db pointer. This test is not
22081: ** foolproof but it does provide some measure of protection against
22082: ** misuse of the interface such as passing in db pointers that are
22083: ** NULL or which have been previously closed. If this routine returns
22084: ** 1 it means that the db pointer is valid and 0 if it should not be
22085: ** dereferenced for any reason. The calling function should invoke
22086: ** SQLITE_MISUSE immediately.
22087: **
22088: ** sqlite3SafetyCheckOk() requires that the db pointer be valid for
22089: ** use. sqlite3SafetyCheckSickOrOk() allows a db pointer that failed to
22090: ** open properly and is not fit for general use but which can be
22091: ** used as an argument to sqlite3_errmsg() or sqlite3_close().
22092: */
22093: SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3 *db){
22094: u32 magic;
22095: if( db==0 ){
22096: logBadConnection("NULL");
22097: return 0;
22098: }
22099: magic = db->magic;
22100: if( magic!=SQLITE_MAGIC_OPEN ){
22101: if( sqlite3SafetyCheckSickOrOk(db) ){
22102: testcase( sqlite3GlobalConfig.xLog!=0 );
22103: logBadConnection("unopened");
22104: }
22105: return 0;
22106: }else{
22107: return 1;
22108: }
22109: }
22110: SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){
22111: u32 magic;
22112: magic = db->magic;
22113: if( magic!=SQLITE_MAGIC_SICK &&
22114: magic!=SQLITE_MAGIC_OPEN &&
22115: magic!=SQLITE_MAGIC_BUSY ){
22116: testcase( sqlite3GlobalConfig.xLog!=0 );
22117: logBadConnection("invalid");
22118: return 0;
22119: }else{
22120: return 1;
22121: }
22122: }
22123:
22124: /*
22125: ** Attempt to add, substract, or multiply the 64-bit signed value iB against
22126: ** the other 64-bit signed integer at *pA and store the result in *pA.
22127: ** Return 0 on success. Or if the operation would have resulted in an
22128: ** overflow, leave *pA unchanged and return 1.
22129: */
22130: SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){
22131: i64 iA = *pA;
22132: testcase( iA==0 ); testcase( iA==1 );
22133: testcase( iB==-1 ); testcase( iB==0 );
22134: if( iB>=0 ){
22135: testcase( iA>0 && LARGEST_INT64 - iA == iB );
22136: testcase( iA>0 && LARGEST_INT64 - iA == iB - 1 );
22137: if( iA>0 && LARGEST_INT64 - iA < iB ) return 1;
22138: *pA += iB;
22139: }else{
22140: testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 1 );
22141: testcase( iA<0 && -(iA + LARGEST_INT64) == iB + 2 );
22142: if( iA<0 && -(iA + LARGEST_INT64) > iB + 1 ) return 1;
22143: *pA += iB;
22144: }
22145: return 0;
22146: }
22147: SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){
22148: testcase( iB==SMALLEST_INT64+1 );
22149: if( iB==SMALLEST_INT64 ){
22150: testcase( (*pA)==(-1) ); testcase( (*pA)==0 );
22151: if( (*pA)>=0 ) return 1;
22152: *pA -= iB;
22153: return 0;
22154: }else{
22155: return sqlite3AddInt64(pA, -iB);
22156: }
22157: }
22158: #define TWOPOWER32 (((i64)1)<<32)
22159: #define TWOPOWER31 (((i64)1)<<31)
22160: SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){
22161: i64 iA = *pA;
22162: i64 iA1, iA0, iB1, iB0, r;
22163:
22164: iA1 = iA/TWOPOWER32;
22165: iA0 = iA % TWOPOWER32;
22166: iB1 = iB/TWOPOWER32;
22167: iB0 = iB % TWOPOWER32;
22168: if( iA1*iB1 != 0 ) return 1;
22169: assert( iA1*iB0==0 || iA0*iB1==0 );
22170: r = iA1*iB0 + iA0*iB1;
22171: testcase( r==(-TWOPOWER31)-1 );
22172: testcase( r==(-TWOPOWER31) );
22173: testcase( r==TWOPOWER31 );
22174: testcase( r==TWOPOWER31-1 );
22175: if( r<(-TWOPOWER31) || r>=TWOPOWER31 ) return 1;
22176: r *= TWOPOWER32;
22177: if( sqlite3AddInt64(&r, iA0*iB0) ) return 1;
22178: *pA = r;
22179: return 0;
22180: }
22181:
22182: /*
22183: ** Compute the absolute value of a 32-bit signed integer, of possible. Or
22184: ** if the integer has a value of -2147483648, return +2147483647
22185: */
22186: SQLITE_PRIVATE int sqlite3AbsInt32(int x){
22187: if( x>=0 ) return x;
22188: if( x==(int)0x80000000 ) return 0x7fffffff;
22189: return -x;
22190: }
22191:
22192: #ifdef SQLITE_ENABLE_8_3_NAMES
22193: /*
22194: ** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database
22195: ** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and
22196: ** if filename in z[] has a suffix (a.k.a. "extension") that is longer than
22197: ** three characters, then shorten the suffix on z[] to be the last three
22198: ** characters of the original suffix.
22199: **
22200: ** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always
22201: ** do the suffix shortening regardless of URI parameter.
22202: **
22203: ** Examples:
22204: **
22205: ** test.db-journal => test.nal
22206: ** test.db-wal => test.wal
22207: ** test.db-shm => test.shm
22208: ** test.db-mj7f3319fa => test.9fa
22209: */
22210: SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){
22211: #if SQLITE_ENABLE_8_3_NAMES<2
22212: if( sqlite3_uri_boolean(zBaseFilename, "8_3_names", 0) )
22213: #endif
22214: {
22215: int i, sz;
22216: sz = sqlite3Strlen30(z);
22217: for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){}
22218: if( z[i]=='.' && ALWAYS(sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4);
22219: }
22220: }
22221: #endif
22222:
22223: /************** End of util.c ************************************************/
22224: /************** Begin file hash.c ********************************************/
22225: /*
22226: ** 2001 September 22
22227: **
22228: ** The author disclaims copyright to this source code. In place of
22229: ** a legal notice, here is a blessing:
22230: **
22231: ** May you do good and not evil.
22232: ** May you find forgiveness for yourself and forgive others.
22233: ** May you share freely, never taking more than you give.
22234: **
22235: *************************************************************************
22236: ** This is the implementation of generic hash-tables
22237: ** used in SQLite.
22238: */
22239: /* #include <assert.h> */
22240:
22241: /* Turn bulk memory into a hash table object by initializing the
22242: ** fields of the Hash structure.
22243: **
22244: ** "pNew" is a pointer to the hash table that is to be initialized.
22245: */
22246: SQLITE_PRIVATE void sqlite3HashInit(Hash *pNew){
22247: assert( pNew!=0 );
22248: pNew->first = 0;
22249: pNew->count = 0;
22250: pNew->htsize = 0;
22251: pNew->ht = 0;
22252: }
22253:
22254: /* Remove all entries from a hash table. Reclaim all memory.
22255: ** Call this routine to delete a hash table or to reset a hash table
22256: ** to the empty state.
22257: */
22258: SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){
22259: HashElem *elem; /* For looping over all elements of the table */
22260:
22261: assert( pH!=0 );
22262: elem = pH->first;
22263: pH->first = 0;
22264: sqlite3_free(pH->ht);
22265: pH->ht = 0;
22266: pH->htsize = 0;
22267: while( elem ){
22268: HashElem *next_elem = elem->next;
22269: sqlite3_free(elem);
22270: elem = next_elem;
22271: }
22272: pH->count = 0;
22273: }
22274:
22275: /*
22276: ** The hashing function.
22277: */
22278: static unsigned int strHash(const char *z, int nKey){
22279: int h = 0;
22280: assert( nKey>=0 );
22281: while( nKey > 0 ){
22282: h = (h<<3) ^ h ^ sqlite3UpperToLower[(unsigned char)*z++];
22283: nKey--;
22284: }
22285: return h;
22286: }
22287:
22288:
22289: /* Link pNew element into the hash table pH. If pEntry!=0 then also
22290: ** insert pNew into the pEntry hash bucket.
22291: */
22292: static void insertElement(
22293: Hash *pH, /* The complete hash table */
22294: struct _ht *pEntry, /* The entry into which pNew is inserted */
22295: HashElem *pNew /* The element to be inserted */
22296: ){
22297: HashElem *pHead; /* First element already in pEntry */
22298: if( pEntry ){
22299: pHead = pEntry->count ? pEntry->chain : 0;
22300: pEntry->count++;
22301: pEntry->chain = pNew;
22302: }else{
22303: pHead = 0;
22304: }
22305: if( pHead ){
22306: pNew->next = pHead;
22307: pNew->prev = pHead->prev;
22308: if( pHead->prev ){ pHead->prev->next = pNew; }
22309: else { pH->first = pNew; }
22310: pHead->prev = pNew;
22311: }else{
22312: pNew->next = pH->first;
22313: if( pH->first ){ pH->first->prev = pNew; }
22314: pNew->prev = 0;
22315: pH->first = pNew;
22316: }
22317: }
22318:
22319:
22320: /* Resize the hash table so that it cantains "new_size" buckets.
22321: **
22322: ** The hash table might fail to resize if sqlite3_malloc() fails or
22323: ** if the new size is the same as the prior size.
22324: ** Return TRUE if the resize occurs and false if not.
22325: */
22326: static int rehash(Hash *pH, unsigned int new_size){
22327: struct _ht *new_ht; /* The new hash table */
22328: HashElem *elem, *next_elem; /* For looping over existing elements */
22329:
22330: #if SQLITE_MALLOC_SOFT_LIMIT>0
22331: if( new_size*sizeof(struct _ht)>SQLITE_MALLOC_SOFT_LIMIT ){
22332: new_size = SQLITE_MALLOC_SOFT_LIMIT/sizeof(struct _ht);
22333: }
22334: if( new_size==pH->htsize ) return 0;
22335: #endif
22336:
22337: /* The inability to allocates space for a larger hash table is
22338: ** a performance hit but it is not a fatal error. So mark the
1.2.2.1 ! misho 22339: ** allocation as a benign. Use sqlite3Malloc()/memset(0) instead of
! 22340: ** sqlite3MallocZero() to make the allocation, as sqlite3MallocZero()
! 22341: ** only zeroes the requested number of bytes whereas this module will
! 22342: ** use the actual amount of space allocated for the hash table (which
! 22343: ** may be larger than the requested amount).
1.2 misho 22344: */
22345: sqlite3BeginBenignMalloc();
22346: new_ht = (struct _ht *)sqlite3Malloc( new_size*sizeof(struct _ht) );
22347: sqlite3EndBenignMalloc();
22348:
22349: if( new_ht==0 ) return 0;
22350: sqlite3_free(pH->ht);
22351: pH->ht = new_ht;
22352: pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht);
22353: memset(new_ht, 0, new_size*sizeof(struct _ht));
22354: for(elem=pH->first, pH->first=0; elem; elem = next_elem){
22355: unsigned int h = strHash(elem->pKey, elem->nKey) % new_size;
22356: next_elem = elem->next;
22357: insertElement(pH, &new_ht[h], elem);
22358: }
22359: return 1;
22360: }
22361:
22362: /* This function (for internal use only) locates an element in an
22363: ** hash table that matches the given key. The hash for this key has
22364: ** already been computed and is passed as the 4th parameter.
22365: */
22366: static HashElem *findElementGivenHash(
22367: const Hash *pH, /* The pH to be searched */
22368: const char *pKey, /* The key we are searching for */
22369: int nKey, /* Bytes in key (not counting zero terminator) */
22370: unsigned int h /* The hash for this key. */
22371: ){
22372: HashElem *elem; /* Used to loop thru the element list */
22373: int count; /* Number of elements left to test */
22374:
22375: if( pH->ht ){
22376: struct _ht *pEntry = &pH->ht[h];
22377: elem = pEntry->chain;
22378: count = pEntry->count;
22379: }else{
22380: elem = pH->first;
22381: count = pH->count;
22382: }
22383: while( count-- && ALWAYS(elem) ){
22384: if( elem->nKey==nKey && sqlite3StrNICmp(elem->pKey,pKey,nKey)==0 ){
22385: return elem;
22386: }
22387: elem = elem->next;
22388: }
22389: return 0;
22390: }
22391:
22392: /* Remove a single entry from the hash table given a pointer to that
22393: ** element and a hash on the element's key.
22394: */
22395: static void removeElementGivenHash(
22396: Hash *pH, /* The pH containing "elem" */
22397: HashElem* elem, /* The element to be removed from the pH */
22398: unsigned int h /* Hash value for the element */
22399: ){
22400: struct _ht *pEntry;
22401: if( elem->prev ){
22402: elem->prev->next = elem->next;
22403: }else{
22404: pH->first = elem->next;
22405: }
22406: if( elem->next ){
22407: elem->next->prev = elem->prev;
22408: }
22409: if( pH->ht ){
22410: pEntry = &pH->ht[h];
22411: if( pEntry->chain==elem ){
22412: pEntry->chain = elem->next;
22413: }
22414: pEntry->count--;
22415: assert( pEntry->count>=0 );
22416: }
22417: sqlite3_free( elem );
22418: pH->count--;
1.2.2.1 ! misho 22419: if( pH->count==0 ){
1.2 misho 22420: assert( pH->first==0 );
22421: assert( pH->count==0 );
22422: sqlite3HashClear(pH);
22423: }
22424: }
22425:
22426: /* Attempt to locate an element of the hash table pH with a key
22427: ** that matches pKey,nKey. Return the data for this element if it is
22428: ** found, or NULL if there is no match.
22429: */
22430: SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey, int nKey){
22431: HashElem *elem; /* The element that matches key */
22432: unsigned int h; /* A hash on key */
22433:
22434: assert( pH!=0 );
22435: assert( pKey!=0 );
22436: assert( nKey>=0 );
22437: if( pH->ht ){
22438: h = strHash(pKey, nKey) % pH->htsize;
22439: }else{
22440: h = 0;
22441: }
22442: elem = findElementGivenHash(pH, pKey, nKey, h);
22443: return elem ? elem->data : 0;
22444: }
22445:
22446: /* Insert an element into the hash table pH. The key is pKey,nKey
22447: ** and the data is "data".
22448: **
22449: ** If no element exists with a matching key, then a new
22450: ** element is created and NULL is returned.
22451: **
22452: ** If another element already exists with the same key, then the
22453: ** new data replaces the old data and the old data is returned.
22454: ** The key is not copied in this instance. If a malloc fails, then
22455: ** the new data is returned and the hash table is unchanged.
22456: **
22457: ** If the "data" parameter to this function is NULL, then the
22458: ** element corresponding to "key" is removed from the hash table.
22459: */
22460: SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, int nKey, void *data){
22461: unsigned int h; /* the hash of the key modulo hash table size */
22462: HashElem *elem; /* Used to loop thru the element list */
22463: HashElem *new_elem; /* New element added to the pH */
22464:
22465: assert( pH!=0 );
22466: assert( pKey!=0 );
22467: assert( nKey>=0 );
22468: if( pH->htsize ){
22469: h = strHash(pKey, nKey) % pH->htsize;
22470: }else{
22471: h = 0;
22472: }
22473: elem = findElementGivenHash(pH,pKey,nKey,h);
22474: if( elem ){
22475: void *old_data = elem->data;
22476: if( data==0 ){
22477: removeElementGivenHash(pH,elem,h);
22478: }else{
22479: elem->data = data;
22480: elem->pKey = pKey;
22481: assert(nKey==elem->nKey);
22482: }
22483: return old_data;
22484: }
22485: if( data==0 ) return 0;
22486: new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) );
22487: if( new_elem==0 ) return data;
22488: new_elem->pKey = pKey;
22489: new_elem->nKey = nKey;
22490: new_elem->data = data;
22491: pH->count++;
22492: if( pH->count>=10 && pH->count > 2*pH->htsize ){
22493: if( rehash(pH, pH->count*2) ){
22494: assert( pH->htsize>0 );
22495: h = strHash(pKey, nKey) % pH->htsize;
22496: }
22497: }
22498: if( pH->ht ){
22499: insertElement(pH, &pH->ht[h], new_elem);
22500: }else{
22501: insertElement(pH, 0, new_elem);
22502: }
22503: return 0;
22504: }
22505:
22506: /************** End of hash.c ************************************************/
22507: /************** Begin file opcodes.c *****************************************/
22508: /* Automatically generated. Do not edit */
22509: /* See the mkopcodec.awk script for details. */
22510: #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
22511: SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){
22512: static const char *const azName[] = { "?",
22513: /* 1 */ "Goto",
22514: /* 2 */ "Gosub",
22515: /* 3 */ "Return",
22516: /* 4 */ "Yield",
22517: /* 5 */ "HaltIfNull",
22518: /* 6 */ "Halt",
22519: /* 7 */ "Integer",
22520: /* 8 */ "Int64",
22521: /* 9 */ "String",
22522: /* 10 */ "Null",
22523: /* 11 */ "Blob",
22524: /* 12 */ "Variable",
22525: /* 13 */ "Move",
22526: /* 14 */ "Copy",
22527: /* 15 */ "SCopy",
22528: /* 16 */ "ResultRow",
22529: /* 17 */ "CollSeq",
22530: /* 18 */ "Function",
22531: /* 19 */ "Not",
22532: /* 20 */ "AddImm",
22533: /* 21 */ "MustBeInt",
22534: /* 22 */ "RealAffinity",
22535: /* 23 */ "Permutation",
22536: /* 24 */ "Compare",
22537: /* 25 */ "Jump",
22538: /* 26 */ "Once",
22539: /* 27 */ "If",
22540: /* 28 */ "IfNot",
22541: /* 29 */ "Column",
22542: /* 30 */ "Affinity",
22543: /* 31 */ "MakeRecord",
22544: /* 32 */ "Count",
22545: /* 33 */ "Savepoint",
22546: /* 34 */ "AutoCommit",
22547: /* 35 */ "Transaction",
22548: /* 36 */ "ReadCookie",
22549: /* 37 */ "SetCookie",
22550: /* 38 */ "VerifyCookie",
22551: /* 39 */ "OpenRead",
22552: /* 40 */ "OpenWrite",
22553: /* 41 */ "OpenAutoindex",
22554: /* 42 */ "OpenEphemeral",
22555: /* 43 */ "SorterOpen",
22556: /* 44 */ "OpenPseudo",
22557: /* 45 */ "Close",
22558: /* 46 */ "SeekLt",
22559: /* 47 */ "SeekLe",
22560: /* 48 */ "SeekGe",
22561: /* 49 */ "SeekGt",
22562: /* 50 */ "Seek",
22563: /* 51 */ "NotFound",
22564: /* 52 */ "Found",
22565: /* 53 */ "IsUnique",
22566: /* 54 */ "NotExists",
22567: /* 55 */ "Sequence",
22568: /* 56 */ "NewRowid",
22569: /* 57 */ "Insert",
22570: /* 58 */ "InsertInt",
22571: /* 59 */ "Delete",
22572: /* 60 */ "ResetCount",
22573: /* 61 */ "SorterCompare",
22574: /* 62 */ "SorterData",
22575: /* 63 */ "RowKey",
22576: /* 64 */ "RowData",
22577: /* 65 */ "Rowid",
22578: /* 66 */ "NullRow",
22579: /* 67 */ "Last",
22580: /* 68 */ "Or",
22581: /* 69 */ "And",
22582: /* 70 */ "SorterSort",
22583: /* 71 */ "Sort",
22584: /* 72 */ "Rewind",
22585: /* 73 */ "IsNull",
22586: /* 74 */ "NotNull",
22587: /* 75 */ "Ne",
22588: /* 76 */ "Eq",
22589: /* 77 */ "Gt",
22590: /* 78 */ "Le",
22591: /* 79 */ "Lt",
22592: /* 80 */ "Ge",
22593: /* 81 */ "SorterNext",
22594: /* 82 */ "BitAnd",
22595: /* 83 */ "BitOr",
22596: /* 84 */ "ShiftLeft",
22597: /* 85 */ "ShiftRight",
22598: /* 86 */ "Add",
22599: /* 87 */ "Subtract",
22600: /* 88 */ "Multiply",
22601: /* 89 */ "Divide",
22602: /* 90 */ "Remainder",
22603: /* 91 */ "Concat",
22604: /* 92 */ "Prev",
22605: /* 93 */ "BitNot",
22606: /* 94 */ "String8",
22607: /* 95 */ "Next",
22608: /* 96 */ "SorterInsert",
22609: /* 97 */ "IdxInsert",
22610: /* 98 */ "IdxDelete",
22611: /* 99 */ "IdxRowid",
22612: /* 100 */ "IdxLT",
22613: /* 101 */ "IdxGE",
22614: /* 102 */ "Destroy",
22615: /* 103 */ "Clear",
22616: /* 104 */ "CreateIndex",
22617: /* 105 */ "CreateTable",
22618: /* 106 */ "ParseSchema",
22619: /* 107 */ "LoadAnalysis",
22620: /* 108 */ "DropTable",
22621: /* 109 */ "DropIndex",
22622: /* 110 */ "DropTrigger",
22623: /* 111 */ "IntegrityCk",
22624: /* 112 */ "RowSetAdd",
22625: /* 113 */ "RowSetRead",
22626: /* 114 */ "RowSetTest",
22627: /* 115 */ "Program",
22628: /* 116 */ "Param",
22629: /* 117 */ "FkCounter",
22630: /* 118 */ "FkIfZero",
22631: /* 119 */ "MemMax",
22632: /* 120 */ "IfPos",
22633: /* 121 */ "IfNeg",
22634: /* 122 */ "IfZero",
22635: /* 123 */ "AggStep",
22636: /* 124 */ "AggFinal",
22637: /* 125 */ "Checkpoint",
22638: /* 126 */ "JournalMode",
22639: /* 127 */ "Vacuum",
22640: /* 128 */ "IncrVacuum",
22641: /* 129 */ "Expire",
22642: /* 130 */ "Real",
22643: /* 131 */ "TableLock",
22644: /* 132 */ "VBegin",
22645: /* 133 */ "VCreate",
22646: /* 134 */ "VDestroy",
22647: /* 135 */ "VOpen",
22648: /* 136 */ "VFilter",
22649: /* 137 */ "VColumn",
22650: /* 138 */ "VNext",
22651: /* 139 */ "VRename",
22652: /* 140 */ "VUpdate",
22653: /* 141 */ "ToText",
22654: /* 142 */ "ToBlob",
22655: /* 143 */ "ToNumeric",
22656: /* 144 */ "ToInt",
22657: /* 145 */ "ToReal",
22658: /* 146 */ "Pagecount",
22659: /* 147 */ "MaxPgcnt",
22660: /* 148 */ "Trace",
22661: /* 149 */ "Noop",
22662: /* 150 */ "Explain",
22663: };
22664: return azName[i];
22665: }
22666: #endif
22667:
22668: /************** End of opcodes.c *********************************************/
1.2.2.1 ! misho 22669: /************** Begin file os_unix.c *****************************************/
1.2 misho 22670: /*
1.2.2.1 ! misho 22671: ** 2004 May 22
1.2 misho 22672: **
22673: ** The author disclaims copyright to this source code. In place of
22674: ** a legal notice, here is a blessing:
22675: **
22676: ** May you do good and not evil.
22677: ** May you find forgiveness for yourself and forgive others.
22678: ** May you share freely, never taking more than you give.
22679: **
22680: ******************************************************************************
22681: **
1.2.2.1 ! misho 22682: ** This file contains the VFS implementation for unix-like operating systems
! 22683: ** include Linux, MacOSX, *BSD, QNX, VxWorks, AIX, HPUX, and others.
! 22684: **
! 22685: ** There are actually several different VFS implementations in this file.
! 22686: ** The differences are in the way that file locking is done. The default
! 22687: ** implementation uses Posix Advisory Locks. Alternative implementations
! 22688: ** use flock(), dot-files, various proprietary locking schemas, or simply
! 22689: ** skip locking all together.
1.2 misho 22690: **
1.2.2.1 ! misho 22691: ** This source file is organized into divisions where the logic for various
! 22692: ** subfunctions is contained within the appropriate division. PLEASE
! 22693: ** KEEP THE STRUCTURE OF THIS FILE INTACT. New code should be placed
! 22694: ** in the correct division and should be clearly labeled.
1.2 misho 22695: **
1.2.2.1 ! misho 22696: ** The layout of divisions is as follows:
1.2 misho 22697: **
1.2.2.1 ! misho 22698: ** * General-purpose declarations and utility functions.
! 22699: ** * Unique file ID logic used by VxWorks.
! 22700: ** * Various locking primitive implementations (all except proxy locking):
! 22701: ** + for Posix Advisory Locks
! 22702: ** + for no-op locks
! 22703: ** + for dot-file locks
! 22704: ** + for flock() locking
! 22705: ** + for named semaphore locks (VxWorks only)
! 22706: ** + for AFP filesystem locks (MacOSX only)
! 22707: ** * sqlite3_file methods not associated with locking.
! 22708: ** * Definitions of sqlite3_io_methods objects for all locking
! 22709: ** methods plus "finder" functions for each locking method.
! 22710: ** * sqlite3_vfs method implementations.
! 22711: ** * Locking primitives for the proxy uber-locking-method. (MacOSX only)
! 22712: ** * Definitions of sqlite3_vfs objects for all locking methods
! 22713: ** plus implementations of sqlite3_os_init() and sqlite3_os_end().
1.2 misho 22714: */
1.2.2.1 ! misho 22715: #if SQLITE_OS_UNIX /* This file is used on unix only */
1.2 misho 22716:
1.2.2.1 ! misho 22717: /* Use posix_fallocate() if it is available
1.2 misho 22718: */
1.2.2.1 ! misho 22719: #if !defined(HAVE_POSIX_FALLOCATE) \
! 22720: && (_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L)
! 22721: # define HAVE_POSIX_FALLOCATE 1
1.2 misho 22722: #endif
22723:
22724: /*
1.2.2.1 ! misho 22725: ** There are various methods for file locking used for concurrency
! 22726: ** control:
1.2 misho 22727: **
1.2.2.1 ! misho 22728: ** 1. POSIX locking (the default),
! 22729: ** 2. No locking,
! 22730: ** 3. Dot-file locking,
! 22731: ** 4. flock() locking,
! 22732: ** 5. AFP locking (OSX only),
! 22733: ** 6. Named POSIX semaphores (VXWorks only),
! 22734: ** 7. proxy locking. (OSX only)
1.2 misho 22735: **
1.2.2.1 ! misho 22736: ** Styles 4, 5, and 7 are only available of SQLITE_ENABLE_LOCKING_STYLE
! 22737: ** is defined to 1. The SQLITE_ENABLE_LOCKING_STYLE also enables automatic
! 22738: ** selection of the appropriate locking style based on the filesystem
! 22739: ** where the database is located.
1.2 misho 22740: */
1.2.2.1 ! misho 22741: #if !defined(SQLITE_ENABLE_LOCKING_STYLE)
! 22742: # if defined(__APPLE__)
! 22743: # define SQLITE_ENABLE_LOCKING_STYLE 1
! 22744: # else
! 22745: # define SQLITE_ENABLE_LOCKING_STYLE 0
! 22746: # endif
! 22747: #endif
1.2 misho 22748:
22749: /*
1.2.2.1 ! misho 22750: ** Define the OS_VXWORKS pre-processor macro to 1 if building on
! 22751: ** vxworks, or 0 otherwise.
1.2 misho 22752: */
1.2.2.1 ! misho 22753: #ifndef OS_VXWORKS
! 22754: # if defined(__RTP__) || defined(_WRS_KERNEL)
! 22755: # define OS_VXWORKS 1
! 22756: # else
! 22757: # define OS_VXWORKS 0
! 22758: # endif
1.2 misho 22759: #endif
22760:
1.2.2.1 ! misho 22761: /*
! 22762: ** These #defines should enable >2GB file support on Posix if the
! 22763: ** underlying operating system supports it. If the OS lacks
! 22764: ** large file support, these should be no-ops.
! 22765: **
! 22766: ** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch
! 22767: ** on the compiler command line. This is necessary if you are compiling
! 22768: ** on a recent machine (ex: RedHat 7.2) but you want your code to work
! 22769: ** on an older machine (ex: RedHat 6.0). If you compile on RedHat 7.2
! 22770: ** without this option, LFS is enable. But LFS does not exist in the kernel
! 22771: ** in RedHat 6.0, so the code won't work. Hence, for maximum binary
! 22772: ** portability you should omit LFS.
! 22773: **
! 22774: ** The previous paragraph was written in 2005. (This paragraph is written
! 22775: ** on 2008-11-28.) These days, all Linux kernels support large files, so
! 22776: ** you should probably leave LFS enabled. But some embedded platforms might
! 22777: ** lack LFS in which case the SQLITE_DISABLE_LFS macro might still be useful.
! 22778: */
! 22779: #ifndef SQLITE_DISABLE_LFS
! 22780: # define _LARGE_FILE 1
! 22781: # ifndef _FILE_OFFSET_BITS
! 22782: # define _FILE_OFFSET_BITS 64
! 22783: # endif
! 22784: # define _LARGEFILE_SOURCE 1
! 22785: #endif
! 22786:
! 22787: /*
! 22788: ** standard include files.
! 22789: */
! 22790: #include <sys/types.h>
! 22791: #include <sys/stat.h>
! 22792: #include <fcntl.h>
! 22793: #include <unistd.h>
! 22794: /* #include <time.h> */
! 22795: #include <sys/time.h>
! 22796: #include <errno.h>
! 22797: #ifndef SQLITE_OMIT_WAL
! 22798: #include <sys/mman.h>
! 22799: #endif
! 22800:
! 22801:
! 22802: #if SQLITE_ENABLE_LOCKING_STYLE
! 22803: # include <sys/ioctl.h>
! 22804: # if OS_VXWORKS
! 22805: # include <semaphore.h>
! 22806: # include <limits.h>
! 22807: # else
! 22808: # include <sys/file.h>
! 22809: # include <sys/param.h>
! 22810: # endif
! 22811: #endif /* SQLITE_ENABLE_LOCKING_STYLE */
! 22812:
! 22813: #if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS)
! 22814: # include <sys/mount.h>
! 22815: #endif
! 22816:
! 22817: #ifdef HAVE_UTIME
! 22818: # include <utime.h>
! 22819: #endif
! 22820:
! 22821: /*
! 22822: ** Allowed values of unixFile.fsFlags
! 22823: */
! 22824: #define SQLITE_FSFLAGS_IS_MSDOS 0x1
! 22825:
! 22826: /*
! 22827: ** If we are to be thread-safe, include the pthreads header and define
! 22828: ** the SQLITE_UNIX_THREADS macro.
! 22829: */
! 22830: #if SQLITE_THREADSAFE
! 22831: /* # include <pthread.h> */
! 22832: # define SQLITE_UNIX_THREADS 1
! 22833: #endif
! 22834:
! 22835: /*
! 22836: ** Default permissions when creating a new file
! 22837: */
! 22838: #ifndef SQLITE_DEFAULT_FILE_PERMISSIONS
! 22839: # define SQLITE_DEFAULT_FILE_PERMISSIONS 0644
! 22840: #endif
! 22841:
! 22842: /*
! 22843: ** Default permissions when creating auto proxy dir
! 22844: */
! 22845: #ifndef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
! 22846: # define SQLITE_DEFAULT_PROXYDIR_PERMISSIONS 0755
! 22847: #endif
! 22848:
! 22849: /*
! 22850: ** Maximum supported path-length.
! 22851: */
! 22852: #define MAX_PATHNAME 512
! 22853:
! 22854: /*
! 22855: ** Only set the lastErrno if the error code is a real error and not
! 22856: ** a normal expected return code of SQLITE_BUSY or SQLITE_OK
! 22857: */
! 22858: #define IS_LOCK_ERROR(x) ((x != SQLITE_OK) && (x != SQLITE_BUSY))
! 22859:
! 22860: /* Forward references */
! 22861: typedef struct unixShm unixShm; /* Connection shared memory */
! 22862: typedef struct unixShmNode unixShmNode; /* Shared memory instance */
! 22863: typedef struct unixInodeInfo unixInodeInfo; /* An i-node */
! 22864: typedef struct UnixUnusedFd UnixUnusedFd; /* An unused file descriptor */
! 22865:
! 22866: /*
! 22867: ** Sometimes, after a file handle is closed by SQLite, the file descriptor
! 22868: ** cannot be closed immediately. In these cases, instances of the following
! 22869: ** structure are used to store the file descriptor while waiting for an
! 22870: ** opportunity to either close or reuse it.
! 22871: */
! 22872: struct UnixUnusedFd {
! 22873: int fd; /* File descriptor to close */
! 22874: int flags; /* Flags this file descriptor was opened with */
! 22875: UnixUnusedFd *pNext; /* Next unused file descriptor on same file */
! 22876: };
! 22877:
! 22878: /*
! 22879: ** The unixFile structure is subclass of sqlite3_file specific to the unix
! 22880: ** VFS implementations.
! 22881: */
! 22882: typedef struct unixFile unixFile;
! 22883: struct unixFile {
! 22884: sqlite3_io_methods const *pMethod; /* Always the first entry */
! 22885: sqlite3_vfs *pVfs; /* The VFS that created this unixFile */
! 22886: unixInodeInfo *pInode; /* Info about locks on this inode */
! 22887: int h; /* The file descriptor */
! 22888: unsigned char eFileLock; /* The type of lock held on this fd */
! 22889: unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */
! 22890: int lastErrno; /* The unix errno from last I/O error */
! 22891: void *lockingContext; /* Locking style specific state */
! 22892: UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */
! 22893: const char *zPath; /* Name of the file */
! 22894: unixShm *pShm; /* Shared memory segment information */
! 22895: int szChunk; /* Configured by FCNTL_CHUNK_SIZE */
! 22896: #ifdef __QNXNTO__
! 22897: int sectorSize; /* Device sector size */
! 22898: int deviceCharacteristics; /* Precomputed device characteristics */
! 22899: #endif
! 22900: #if SQLITE_ENABLE_LOCKING_STYLE
! 22901: int openFlags; /* The flags specified at open() */
! 22902: #endif
! 22903: #if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__)
! 22904: unsigned fsFlags; /* cached details from statfs() */
! 22905: #endif
! 22906: #if OS_VXWORKS
! 22907: struct vxworksFileId *pId; /* Unique file ID */
! 22908: #endif
! 22909: #ifdef SQLITE_DEBUG
! 22910: /* The next group of variables are used to track whether or not the
! 22911: ** transaction counter in bytes 24-27 of database files are updated
! 22912: ** whenever any part of the database changes. An assertion fault will
! 22913: ** occur if a file is updated without also updating the transaction
! 22914: ** counter. This test is made to avoid new problems similar to the
! 22915: ** one described by ticket #3584.
! 22916: */
! 22917: unsigned char transCntrChng; /* True if the transaction counter changed */
! 22918: unsigned char dbUpdate; /* True if any part of database file changed */
! 22919: unsigned char inNormalWrite; /* True if in a normal write operation */
! 22920: #endif
! 22921: #ifdef SQLITE_TEST
! 22922: /* In test mode, increase the size of this structure a bit so that
! 22923: ** it is larger than the struct CrashFile defined in test6.c.
! 22924: */
! 22925: char aPadding[32];
! 22926: #endif
! 22927: };
! 22928:
! 22929: /*
! 22930: ** Allowed values for the unixFile.ctrlFlags bitmask:
! 22931: */
! 22932: #define UNIXFILE_EXCL 0x01 /* Connections from one process only */
! 22933: #define UNIXFILE_RDONLY 0x02 /* Connection is read only */
! 22934: #define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */
! 22935: #ifndef SQLITE_DISABLE_DIRSYNC
! 22936: # define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */
! 22937: #else
! 22938: # define UNIXFILE_DIRSYNC 0x00
! 22939: #endif
! 22940: #define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */
! 22941: #define UNIXFILE_DELETE 0x20 /* Delete on close */
! 22942: #define UNIXFILE_URI 0x40 /* Filename might have query parameters */
! 22943: #define UNIXFILE_NOLOCK 0x80 /* Do no file locking */
! 22944:
! 22945: /*
! 22946: ** Include code that is common to all os_*.c files
! 22947: */
! 22948: /************** Include os_common.h in the middle of os_unix.c ***************/
! 22949: /************** Begin file os_common.h ***************************************/
! 22950: /*
! 22951: ** 2004 May 22
! 22952: **
! 22953: ** The author disclaims copyright to this source code. In place of
! 22954: ** a legal notice, here is a blessing:
! 22955: **
! 22956: ** May you do good and not evil.
! 22957: ** May you find forgiveness for yourself and forgive others.
! 22958: ** May you share freely, never taking more than you give.
! 22959: **
! 22960: ******************************************************************************
! 22961: **
! 22962: ** This file contains macros and a little bit of code that is common to
! 22963: ** all of the platform-specific files (os_*.c) and is #included into those
! 22964: ** files.
! 22965: **
! 22966: ** This file should be #included by the os_*.c files only. It is not a
! 22967: ** general purpose header file.
! 22968: */
! 22969: #ifndef _OS_COMMON_H_
! 22970: #define _OS_COMMON_H_
! 22971:
! 22972: /*
! 22973: ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
! 22974: ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
! 22975: ** switch. The following code should catch this problem at compile-time.
! 22976: */
! 22977: #ifdef MEMORY_DEBUG
! 22978: # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
! 22979: #endif
! 22980:
! 22981: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
! 22982: # ifndef SQLITE_DEBUG_OS_TRACE
! 22983: # define SQLITE_DEBUG_OS_TRACE 0
! 22984: # endif
! 22985: int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
! 22986: # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
1.2 misho 22987: #else
22988: # define OSTRACE(X)
22989: #endif
22990:
22991: /*
22992: ** Macros for performance tracing. Normally turned off. Only works
22993: ** on i486 hardware.
22994: */
22995: #ifdef SQLITE_PERFORMANCE_TRACE
22996:
22997: /*
22998: ** hwtime.h contains inline assembler code for implementing
22999: ** high-performance timing routines.
23000: */
23001: /************** Include hwtime.h in the middle of os_common.h ****************/
23002: /************** Begin file hwtime.h ******************************************/
23003: /*
23004: ** 2008 May 27
23005: **
23006: ** The author disclaims copyright to this source code. In place of
23007: ** a legal notice, here is a blessing:
23008: **
23009: ** May you do good and not evil.
23010: ** May you find forgiveness for yourself and forgive others.
23011: ** May you share freely, never taking more than you give.
23012: **
23013: ******************************************************************************
23014: **
23015: ** This file contains inline asm code for retrieving "high-performance"
23016: ** counters for x86 class CPUs.
23017: */
23018: #ifndef _HWTIME_H_
23019: #define _HWTIME_H_
23020:
23021: /*
23022: ** The following routine only works on pentium-class (or newer) processors.
23023: ** It uses the RDTSC opcode to read the cycle count value out of the
23024: ** processor and returns that value. This can be used for high-res
23025: ** profiling.
23026: */
23027: #if (defined(__GNUC__) || defined(_MSC_VER)) && \
23028: (defined(i386) || defined(__i386__) || defined(_M_IX86))
23029:
23030: #if defined(__GNUC__)
23031:
23032: __inline__ sqlite_uint64 sqlite3Hwtime(void){
23033: unsigned int lo, hi;
23034: __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
23035: return (sqlite_uint64)hi << 32 | lo;
23036: }
23037:
23038: #elif defined(_MSC_VER)
23039:
23040: __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
23041: __asm {
23042: rdtsc
23043: ret ; return value at EDX:EAX
23044: }
23045: }
23046:
23047: #endif
23048:
23049: #elif (defined(__GNUC__) && defined(__x86_64__))
23050:
23051: __inline__ sqlite_uint64 sqlite3Hwtime(void){
23052: unsigned long val;
23053: __asm__ __volatile__ ("rdtsc" : "=A" (val));
23054: return val;
23055: }
23056:
23057: #elif (defined(__GNUC__) && defined(__ppc__))
23058:
23059: __inline__ sqlite_uint64 sqlite3Hwtime(void){
23060: unsigned long long retval;
23061: unsigned long junk;
23062: __asm__ __volatile__ ("\n\
23063: 1: mftbu %1\n\
23064: mftb %L0\n\
23065: mftbu %0\n\
23066: cmpw %0,%1\n\
23067: bne 1b"
23068: : "=r" (retval), "=r" (junk));
23069: return retval;
23070: }
23071:
23072: #else
23073:
23074: #error Need implementation of sqlite3Hwtime() for your platform.
23075:
23076: /*
23077: ** To compile without implementing sqlite3Hwtime() for your platform,
23078: ** you can remove the above #error and use the following
23079: ** stub function. You will lose timing support for many
23080: ** of the debugging and testing utilities, but it should at
23081: ** least compile and run.
23082: */
23083: SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
23084:
23085: #endif
23086:
23087: #endif /* !defined(_HWTIME_H_) */
23088:
23089: /************** End of hwtime.h **********************************************/
23090: /************** Continuing where we left off in os_common.h ******************/
23091:
23092: static sqlite_uint64 g_start;
23093: static sqlite_uint64 g_elapsed;
23094: #define TIMER_START g_start=sqlite3Hwtime()
23095: #define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
23096: #define TIMER_ELAPSED g_elapsed
23097: #else
23098: #define TIMER_START
23099: #define TIMER_END
23100: #define TIMER_ELAPSED ((sqlite_uint64)0)
23101: #endif
23102:
23103: /*
23104: ** If we compile with the SQLITE_TEST macro set, then the following block
23105: ** of code will give us the ability to simulate a disk I/O error. This
23106: ** is used for testing the I/O recovery logic.
23107: */
23108: #ifdef SQLITE_TEST
23109: SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */
23110: SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */
23111: SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */
23112: SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */
23113: SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */
23114: SQLITE_API int sqlite3_diskfull_pending = 0;
23115: SQLITE_API int sqlite3_diskfull = 0;
23116: #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
23117: #define SimulateIOError(CODE) \
23118: if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
23119: || sqlite3_io_error_pending-- == 1 ) \
23120: { local_ioerr(); CODE; }
23121: static void local_ioerr(){
23122: IOTRACE(("IOERR\n"));
23123: sqlite3_io_error_hit++;
23124: if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
23125: }
23126: #define SimulateDiskfullError(CODE) \
23127: if( sqlite3_diskfull_pending ){ \
23128: if( sqlite3_diskfull_pending == 1 ){ \
23129: local_ioerr(); \
23130: sqlite3_diskfull = 1; \
23131: sqlite3_io_error_hit = 1; \
23132: CODE; \
23133: }else{ \
23134: sqlite3_diskfull_pending--; \
23135: } \
23136: }
23137: #else
23138: #define SimulateIOErrorBenign(X)
23139: #define SimulateIOError(A)
23140: #define SimulateDiskfullError(A)
23141: #endif
23142:
23143: /*
23144: ** When testing, keep a count of the number of open files.
23145: */
23146: #ifdef SQLITE_TEST
23147: SQLITE_API int sqlite3_open_file_count = 0;
23148: #define OpenCounter(X) sqlite3_open_file_count+=(X)
23149: #else
23150: #define OpenCounter(X)
23151: #endif
23152:
23153: #endif /* !defined(_OS_COMMON_H_) */
23154:
23155: /************** End of os_common.h *******************************************/
1.2.2.1 ! misho 23156: /************** Continuing where we left off in os_unix.c ********************/
1.2 misho 23157:
23158: /*
1.2.2.1 ! misho 23159: ** Define various macros that are missing from some systems.
1.2 misho 23160: */
1.2.2.1 ! misho 23161: #ifndef O_LARGEFILE
! 23162: # define O_LARGEFILE 0
! 23163: #endif
! 23164: #ifdef SQLITE_DISABLE_LFS
! 23165: # undef O_LARGEFILE
! 23166: # define O_LARGEFILE 0
! 23167: #endif
! 23168: #ifndef O_NOFOLLOW
! 23169: # define O_NOFOLLOW 0
! 23170: #endif
! 23171: #ifndef O_BINARY
! 23172: # define O_BINARY 0
! 23173: #endif
1.2 misho 23174:
23175: /*
1.2.2.1 ! misho 23176: ** The threadid macro resolves to the thread-id or to 0. Used for
! 23177: ** testing and debugging only.
1.2 misho 23178: */
1.2.2.1 ! misho 23179: #if SQLITE_THREADSAFE
! 23180: #define threadid pthread_self()
! 23181: #else
! 23182: #define threadid 0
1.2 misho 23183: #endif
23184:
23185: /*
1.2.2.1 ! misho 23186: ** Different Unix systems declare open() in different ways. Same use
! 23187: ** open(const char*,int,mode_t). Others use open(const char*,int,...).
! 23188: ** The difference is important when using a pointer to the function.
! 23189: **
! 23190: ** The safest way to deal with the problem is to always use this wrapper
! 23191: ** which always has the same well-defined interface.
1.2 misho 23192: */
1.2.2.1 ! misho 23193: static int posixOpen(const char *zFile, int flags, int mode){
! 23194: return open(zFile, flags, mode);
1.2 misho 23195: }
23196:
23197: /*
1.2.2.1 ! misho 23198: ** On some systems, calls to fchown() will trigger a message in a security
! 23199: ** log if they come from non-root processes. So avoid calling fchown() if
! 23200: ** we are not running as root.
1.2 misho 23201: */
1.2.2.1 ! misho 23202: static int posixFchown(int fd, uid_t uid, gid_t gid){
! 23203: return geteuid() ? 0 : fchown(fd,uid,gid);
1.2 misho 23204: }
23205:
1.2.2.1 ! misho 23206: /* Forward reference */
! 23207: static int openDirectory(const char*, int*);
! 23208:
1.2 misho 23209: /*
1.2.2.1 ! misho 23210: ** Many system calls are accessed through pointer-to-functions so that
! 23211: ** they may be overridden at runtime to facilitate fault injection during
! 23212: ** testing and sandboxing. The following array holds the names and pointers
! 23213: ** to all overrideable system calls.
1.2 misho 23214: */
1.2.2.1 ! misho 23215: static struct unix_syscall {
! 23216: const char *zName; /* Name of the sytem call */
! 23217: sqlite3_syscall_ptr pCurrent; /* Current value of the system call */
! 23218: sqlite3_syscall_ptr pDefault; /* Default value */
! 23219: } aSyscall[] = {
! 23220: { "open", (sqlite3_syscall_ptr)posixOpen, 0 },
! 23221: #define osOpen ((int(*)(const char*,int,int))aSyscall[0].pCurrent)
1.2 misho 23222:
1.2.2.1 ! misho 23223: { "close", (sqlite3_syscall_ptr)close, 0 },
! 23224: #define osClose ((int(*)(int))aSyscall[1].pCurrent)
1.2 misho 23225:
1.2.2.1 ! misho 23226: { "access", (sqlite3_syscall_ptr)access, 0 },
! 23227: #define osAccess ((int(*)(const char*,int))aSyscall[2].pCurrent)
1.2 misho 23228:
1.2.2.1 ! misho 23229: { "getcwd", (sqlite3_syscall_ptr)getcwd, 0 },
! 23230: #define osGetcwd ((char*(*)(char*,size_t))aSyscall[3].pCurrent)
! 23231:
! 23232: { "stat", (sqlite3_syscall_ptr)stat, 0 },
! 23233: #define osStat ((int(*)(const char*,struct stat*))aSyscall[4].pCurrent)
1.2 misho 23234:
23235: /*
1.2.2.1 ! misho 23236: ** The DJGPP compiler environment looks mostly like Unix, but it
! 23237: ** lacks the fcntl() system call. So redefine fcntl() to be something
! 23238: ** that always succeeds. This means that locking does not occur under
! 23239: ** DJGPP. But it is DOS - what did you expect?
1.2 misho 23240: */
1.2.2.1 ! misho 23241: #ifdef __DJGPP__
! 23242: { "fstat", 0, 0 },
! 23243: #define osFstat(a,b,c) 0
! 23244: #else
! 23245: { "fstat", (sqlite3_syscall_ptr)fstat, 0 },
! 23246: #define osFstat ((int(*)(int,struct stat*))aSyscall[5].pCurrent)
1.2 misho 23247: #endif
23248:
1.2.2.1 ! misho 23249: { "ftruncate", (sqlite3_syscall_ptr)ftruncate, 0 },
! 23250: #define osFtruncate ((int(*)(int,off_t))aSyscall[6].pCurrent)
! 23251:
! 23252: { "fcntl", (sqlite3_syscall_ptr)fcntl, 0 },
! 23253: #define osFcntl ((int(*)(int,int,...))aSyscall[7].pCurrent)
! 23254:
! 23255: { "read", (sqlite3_syscall_ptr)read, 0 },
! 23256: #define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent)
! 23257:
! 23258: #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE
! 23259: { "pread", (sqlite3_syscall_ptr)pread, 0 },
! 23260: #else
! 23261: { "pread", (sqlite3_syscall_ptr)0, 0 },
1.2 misho 23262: #endif
1.2.2.1 ! misho 23263: #define osPread ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[9].pCurrent)
! 23264:
! 23265: #if defined(USE_PREAD64)
! 23266: { "pread64", (sqlite3_syscall_ptr)pread64, 0 },
1.2 misho 23267: #else
1.2.2.1 ! misho 23268: { "pread64", (sqlite3_syscall_ptr)0, 0 },
1.2 misho 23269: #endif
1.2.2.1 ! misho 23270: #define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent)
! 23271:
! 23272: { "write", (sqlite3_syscall_ptr)write, 0 },
! 23273: #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent)
! 23274:
! 23275: #if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE
! 23276: { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 },
! 23277: #else
! 23278: { "pwrite", (sqlite3_syscall_ptr)0, 0 },
! 23279: #endif
! 23280: #define osPwrite ((ssize_t(*)(int,const void*,size_t,off_t))\
! 23281: aSyscall[12].pCurrent)
! 23282:
! 23283: #if defined(USE_PREAD64)
! 23284: { "pwrite64", (sqlite3_syscall_ptr)pwrite64, 0 },
! 23285: #else
! 23286: { "pwrite64", (sqlite3_syscall_ptr)0, 0 },
! 23287: #endif
! 23288: #define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\
! 23289: aSyscall[13].pCurrent)
! 23290:
! 23291: #if SQLITE_ENABLE_LOCKING_STYLE
! 23292: { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 },
! 23293: #else
! 23294: { "fchmod", (sqlite3_syscall_ptr)0, 0 },
! 23295: #endif
! 23296: #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent)
! 23297:
! 23298: #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
! 23299: { "fallocate", (sqlite3_syscall_ptr)posix_fallocate, 0 },
! 23300: #else
! 23301: { "fallocate", (sqlite3_syscall_ptr)0, 0 },
! 23302: #endif
! 23303: #define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent)
! 23304:
! 23305: { "unlink", (sqlite3_syscall_ptr)unlink, 0 },
! 23306: #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent)
! 23307:
! 23308: { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 },
! 23309: #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent)
! 23310:
! 23311: { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 },
! 23312: #define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent)
! 23313:
! 23314: { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 },
! 23315: #define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent)
! 23316:
! 23317: { "fchown", (sqlite3_syscall_ptr)posixFchown, 0 },
! 23318: #define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent)
! 23319:
! 23320: { "umask", (sqlite3_syscall_ptr)umask, 0 },
! 23321: #define osUmask ((mode_t(*)(mode_t))aSyscall[21].pCurrent)
! 23322:
! 23323: }; /* End of the overrideable system calls */
1.2 misho 23324:
23325: /*
1.2.2.1 ! misho 23326: ** This is the xSetSystemCall() method of sqlite3_vfs for all of the
! 23327: ** "unix" VFSes. Return SQLITE_OK opon successfully updating the
! 23328: ** system call pointer, or SQLITE_NOTFOUND if there is no configurable
! 23329: ** system call named zName.
1.2 misho 23330: */
1.2.2.1 ! misho 23331: static int unixSetSystemCall(
! 23332: sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */
! 23333: const char *zName, /* Name of system call to override */
! 23334: sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */
! 23335: ){
! 23336: unsigned int i;
! 23337: int rc = SQLITE_NOTFOUND;
! 23338:
! 23339: UNUSED_PARAMETER(pNotUsed);
! 23340: if( zName==0 ){
! 23341: /* If no zName is given, restore all system calls to their default
! 23342: ** settings and return NULL
! 23343: */
! 23344: rc = SQLITE_OK;
! 23345: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
! 23346: if( aSyscall[i].pDefault ){
! 23347: aSyscall[i].pCurrent = aSyscall[i].pDefault;
! 23348: }
! 23349: }
1.2 misho 23350: }else{
1.2.2.1 ! misho 23351: /* If zName is specified, operate on only the one system call
! 23352: ** specified.
! 23353: */
! 23354: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
! 23355: if( strcmp(zName, aSyscall[i].zName)==0 ){
! 23356: if( aSyscall[i].pDefault==0 ){
! 23357: aSyscall[i].pDefault = aSyscall[i].pCurrent;
! 23358: }
! 23359: rc = SQLITE_OK;
! 23360: if( pNewFunc==0 ) pNewFunc = aSyscall[i].pDefault;
! 23361: aSyscall[i].pCurrent = pNewFunc;
! 23362: break;
! 23363: }
! 23364: }
1.2 misho 23365: }
1.2.2.1 ! misho 23366: return rc;
1.2 misho 23367: }
23368:
23369: /*
1.2.2.1 ! misho 23370: ** Return the value of a system call. Return NULL if zName is not a
! 23371: ** recognized system call name. NULL is also returned if the system call
! 23372: ** is currently undefined.
1.2 misho 23373: */
1.2.2.1 ! misho 23374: static sqlite3_syscall_ptr unixGetSystemCall(
! 23375: sqlite3_vfs *pNotUsed,
! 23376: const char *zName
! 23377: ){
! 23378: unsigned int i;
! 23379:
! 23380: UNUSED_PARAMETER(pNotUsed);
! 23381: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
! 23382: if( strcmp(zName, aSyscall[i].zName)==0 ) return aSyscall[i].pCurrent;
! 23383: }
! 23384: return 0;
1.2 misho 23385: }
23386:
23387: /*
1.2.2.1 ! misho 23388: ** Return the name of the first system call after zName. If zName==NULL
! 23389: ** then return the name of the first system call. Return NULL if zName
! 23390: ** is the last system call or if zName is not the name of a valid
! 23391: ** system call.
1.2 misho 23392: */
1.2.2.1 ! misho 23393: static const char *unixNextSystemCall(sqlite3_vfs *p, const char *zName){
! 23394: int i = -1;
! 23395:
! 23396: UNUSED_PARAMETER(p);
! 23397: if( zName ){
! 23398: for(i=0; i<ArraySize(aSyscall)-1; i++){
! 23399: if( strcmp(zName, aSyscall[i].zName)==0 ) break;
! 23400: }
! 23401: }
! 23402: for(i++; i<ArraySize(aSyscall); i++){
! 23403: if( aSyscall[i].pCurrent!=0 ) return aSyscall[i].zName;
! 23404: }
! 23405: return 0;
1.2 misho 23406: }
23407:
23408: /*
1.2.2.1 ! misho 23409: ** Invoke open(). Do so multiple times, until it either succeeds or
! 23410: ** fails for some reason other than EINTR.
1.2 misho 23411: **
1.2.2.1 ! misho 23412: ** If the file creation mode "m" is 0 then set it to the default for
! 23413: ** SQLite. The default is SQLITE_DEFAULT_FILE_PERMISSIONS (normally
! 23414: ** 0644) as modified by the system umask. If m is not 0, then
! 23415: ** make the file creation mode be exactly m ignoring the umask.
! 23416: **
! 23417: ** The m parameter will be non-zero only when creating -wal, -journal,
! 23418: ** and -shm files. We want those files to have *exactly* the same
! 23419: ** permissions as their original database, unadulterated by the umask.
! 23420: ** In that way, if a database file is -rw-rw-rw or -rw-rw-r-, and a
! 23421: ** transaction crashes and leaves behind hot journals, then any
! 23422: ** process that is able to write to the database will also be able to
! 23423: ** recover the hot journals.
1.2 misho 23424: */
1.2.2.1 ! misho 23425: static int robust_open(const char *z, int f, mode_t m){
! 23426: int fd;
! 23427: mode_t m2;
! 23428: mode_t origM = 0;
! 23429: if( m==0 ){
! 23430: m2 = SQLITE_DEFAULT_FILE_PERMISSIONS;
1.2 misho 23431: }else{
1.2.2.1 ! misho 23432: m2 = m;
! 23433: origM = osUmask(0);
1.2 misho 23434: }
1.2.2.1 ! misho 23435: do{
! 23436: #if defined(O_CLOEXEC)
! 23437: fd = osOpen(z,f|O_CLOEXEC,m2);
! 23438: #else
! 23439: fd = osOpen(z,f,m2);
! 23440: #endif
! 23441: }while( fd<0 && errno==EINTR );
! 23442: if( m ){
! 23443: osUmask(origM);
1.2 misho 23444: }
1.2.2.1 ! misho 23445: #if defined(FD_CLOEXEC) && (!defined(O_CLOEXEC) || O_CLOEXEC==0)
! 23446: if( fd>=0 ) osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
! 23447: #endif
! 23448: return fd;
1.2 misho 23449: }
23450:
23451: /*
1.2.2.1 ! misho 23452: ** Helper functions to obtain and relinquish the global mutex. The
! 23453: ** global mutex is used to protect the unixInodeInfo and
! 23454: ** vxworksFileId objects used by this file, all of which may be
! 23455: ** shared by multiple threads.
1.2 misho 23456: **
1.2.2.1 ! misho 23457: ** Function unixMutexHeld() is used to assert() that the global mutex
! 23458: ** is held when required. This function is only used as part of assert()
! 23459: ** statements. e.g.
1.2 misho 23460: **
1.2.2.1 ! misho 23461: ** unixEnterMutex()
! 23462: ** assert( unixMutexHeld() );
! 23463: ** unixEnterLeave()
1.2 misho 23464: */
1.2.2.1 ! misho 23465: static void unixEnterMutex(void){
! 23466: sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1.2 misho 23467: }
1.2.2.1 ! misho 23468: static void unixLeaveMutex(void){
! 23469: sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1.2 misho 23470: }
1.2.2.1 ! misho 23471: #ifdef SQLITE_DEBUG
! 23472: static int unixMutexHeld(void) {
! 23473: return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1.2 misho 23474: }
1.2.2.1 ! misho 23475: #endif
1.2 misho 23476:
23477:
1.2.2.1 ! misho 23478: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
1.2 misho 23479: /*
1.2.2.1 ! misho 23480: ** Helper function for printing out trace information from debugging
! 23481: ** binaries. This returns the string represetation of the supplied
! 23482: ** integer lock-type.
1.2 misho 23483: */
1.2.2.1 ! misho 23484: static const char *azFileLock(int eFileLock){
! 23485: switch( eFileLock ){
! 23486: case NO_LOCK: return "NONE";
! 23487: case SHARED_LOCK: return "SHARED";
! 23488: case RESERVED_LOCK: return "RESERVED";
! 23489: case PENDING_LOCK: return "PENDING";
! 23490: case EXCLUSIVE_LOCK: return "EXCLUSIVE";
! 23491: }
! 23492: return "ERROR";
1.2 misho 23493: }
1.2.2.1 ! misho 23494: #endif
1.2 misho 23495:
1.2.2.1 ! misho 23496: #ifdef SQLITE_LOCK_TRACE
1.2 misho 23497: /*
1.2.2.1 ! misho 23498: ** Print out information about all locking operations.
! 23499: **
! 23500: ** This routine is used for troubleshooting locks on multithreaded
! 23501: ** platforms. Enable by compiling with the -DSQLITE_LOCK_TRACE
! 23502: ** command-line option on the compiler. This code is normally
! 23503: ** turned off.
1.2 misho 23504: */
1.2.2.1 ! misho 23505: static int lockTrace(int fd, int op, struct flock *p){
! 23506: char *zOpName, *zType;
! 23507: int s;
! 23508: int savedErrno;
! 23509: if( op==F_GETLK ){
! 23510: zOpName = "GETLK";
! 23511: }else if( op==F_SETLK ){
! 23512: zOpName = "SETLK";
! 23513: }else{
! 23514: s = osFcntl(fd, op, p);
! 23515: sqlite3DebugPrintf("fcntl unknown %d %d %d\n", fd, op, s);
! 23516: return s;
! 23517: }
! 23518: if( p->l_type==F_RDLCK ){
! 23519: zType = "RDLCK";
! 23520: }else if( p->l_type==F_WRLCK ){
! 23521: zType = "WRLCK";
! 23522: }else if( p->l_type==F_UNLCK ){
! 23523: zType = "UNLCK";
! 23524: }else{
! 23525: assert( 0 );
! 23526: }
! 23527: assert( p->l_whence==SEEK_SET );
! 23528: s = osFcntl(fd, op, p);
! 23529: savedErrno = errno;
! 23530: sqlite3DebugPrintf("fcntl %d %d %s %s %d %d %d %d\n",
! 23531: threadid, fd, zOpName, zType, (int)p->l_start, (int)p->l_len,
! 23532: (int)p->l_pid, s);
! 23533: if( s==(-1) && op==F_SETLK && (p->l_type==F_RDLCK || p->l_type==F_WRLCK) ){
! 23534: struct flock l2;
! 23535: l2 = *p;
! 23536: osFcntl(fd, F_GETLK, &l2);
! 23537: if( l2.l_type==F_RDLCK ){
! 23538: zType = "RDLCK";
! 23539: }else if( l2.l_type==F_WRLCK ){
! 23540: zType = "WRLCK";
! 23541: }else if( l2.l_type==F_UNLCK ){
! 23542: zType = "UNLCK";
! 23543: }else{
! 23544: assert( 0 );
! 23545: }
! 23546: sqlite3DebugPrintf("fcntl-failure-reason: %s %d %d %d\n",
! 23547: zType, (int)l2.l_start, (int)l2.l_len, (int)l2.l_pid);
! 23548: }
! 23549: errno = savedErrno;
! 23550: return s;
1.2 misho 23551: }
1.2.2.1 ! misho 23552: #undef osFcntl
! 23553: #define osFcntl lockTrace
! 23554: #endif /* SQLITE_LOCK_TRACE */
1.2 misho 23555:
23556: /*
1.2.2.1 ! misho 23557: ** Retry ftruncate() calls that fail due to EINTR
1.2 misho 23558: */
1.2.2.1 ! misho 23559: static int robust_ftruncate(int h, sqlite3_int64 sz){
! 23560: int rc;
! 23561: do{ rc = osFtruncate(h,sz); }while( rc<0 && errno==EINTR );
! 23562: return rc;
1.2 misho 23563: }
23564:
23565: /*
1.2.2.1 ! misho 23566: ** This routine translates a standard POSIX errno code into something
! 23567: ** useful to the clients of the sqlite3 functions. Specifically, it is
! 23568: ** intended to translate a variety of "try again" errors into SQLITE_BUSY
! 23569: ** and a variety of "please close the file descriptor NOW" errors into
! 23570: ** SQLITE_IOERR
! 23571: **
! 23572: ** Errors during initialization of locks, or file system support for locks,
! 23573: ** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately.
1.2 misho 23574: */
1.2.2.1 ! misho 23575: static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) {
! 23576: switch (posixError) {
1.2 misho 23577: #if 0
1.2.2.1 ! misho 23578: /* At one point this code was not commented out. In theory, this branch
! 23579: ** should never be hit, as this function should only be called after
! 23580: ** a locking-related function (i.e. fcntl()) has returned non-zero with
! 23581: ** the value of errno as the first argument. Since a system call has failed,
! 23582: ** errno should be non-zero.
! 23583: **
! 23584: ** Despite this, if errno really is zero, we still don't want to return
! 23585: ** SQLITE_OK. The system call failed, and *some* SQLite error should be
! 23586: ** propagated back to the caller. Commenting this branch out means errno==0
! 23587: ** will be handled by the "default:" case below.
! 23588: */
! 23589: case 0:
! 23590: return SQLITE_OK;
1.2 misho 23591: #endif
23592:
1.2.2.1 ! misho 23593: case EAGAIN:
! 23594: case ETIMEDOUT:
! 23595: case EBUSY:
! 23596: case EINTR:
! 23597: case ENOLCK:
! 23598: /* random NFS retry error, unless during file system support
! 23599: * introspection, in which it actually means what it says */
! 23600: return SQLITE_BUSY;
! 23601:
! 23602: case EACCES:
! 23603: /* EACCES is like EAGAIN during locking operations, but not any other time*/
! 23604: if( (sqliteIOErr == SQLITE_IOERR_LOCK) ||
! 23605: (sqliteIOErr == SQLITE_IOERR_UNLOCK) ||
! 23606: (sqliteIOErr == SQLITE_IOERR_RDLOCK) ||
! 23607: (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ){
! 23608: return SQLITE_BUSY;
! 23609: }
! 23610: /* else fall through */
! 23611: case EPERM:
! 23612: return SQLITE_PERM;
! 23613:
! 23614: /* EDEADLK is only possible if a call to fcntl(F_SETLKW) is made. And
! 23615: ** this module never makes such a call. And the code in SQLite itself
! 23616: ** asserts that SQLITE_IOERR_BLOCKED is never returned. For these reasons
! 23617: ** this case is also commented out. If the system does set errno to EDEADLK,
! 23618: ** the default SQLITE_IOERR_XXX code will be returned. */
! 23619: #if 0
! 23620: case EDEADLK:
! 23621: return SQLITE_IOERR_BLOCKED;
! 23622: #endif
! 23623:
! 23624: #if EOPNOTSUPP!=ENOTSUP
! 23625: case EOPNOTSUPP:
! 23626: /* something went terribly awry, unless during file system support
! 23627: * introspection, in which it actually means what it says */
! 23628: #endif
! 23629: #ifdef ENOTSUP
! 23630: case ENOTSUP:
! 23631: /* invalid fd, unless during file system support introspection, in which
! 23632: * it actually means what it says */
! 23633: #endif
! 23634: case EIO:
! 23635: case EBADF:
! 23636: case EINVAL:
! 23637: case ENOTCONN:
! 23638: case ENODEV:
! 23639: case ENXIO:
! 23640: case ENOENT:
! 23641: #ifdef ESTALE /* ESTALE is not defined on Interix systems */
! 23642: case ESTALE:
1.2 misho 23643: #endif
1.2.2.1 ! misho 23644: case ENOSYS:
! 23645: /* these should force the client to close the file and reconnect */
! 23646:
! 23647: default:
! 23648: return sqliteIOErr;
! 23649: }
! 23650: }
1.2 misho 23651:
1.2.2.1 ! misho 23652:
! 23653:
! 23654: /******************************************************************************
! 23655: ****************** Begin Unique File ID Utility Used By VxWorks ***************
1.2 misho 23656: **
1.2.2.1 ! misho 23657: ** On most versions of unix, we can get a unique ID for a file by concatenating
! 23658: ** the device number and the inode number. But this does not work on VxWorks.
! 23659: ** On VxWorks, a unique file id must be based on the canonical filename.
1.2 misho 23660: **
1.2.2.1 ! misho 23661: ** A pointer to an instance of the following structure can be used as a
! 23662: ** unique file ID in VxWorks. Each instance of this structure contains
! 23663: ** a copy of the canonical filename. There is also a reference count.
! 23664: ** The structure is reclaimed when the number of pointers to it drops to
! 23665: ** zero.
1.2 misho 23666: **
1.2.2.1 ! misho 23667: ** There are never very many files open at one time and lookups are not
! 23668: ** a performance-critical path, so it is sufficient to put these
! 23669: ** structures on a linked list.
1.2 misho 23670: */
1.2.2.1 ! misho 23671: struct vxworksFileId {
! 23672: struct vxworksFileId *pNext; /* Next in a list of them all */
! 23673: int nRef; /* Number of references to this one */
! 23674: int nName; /* Length of the zCanonicalName[] string */
! 23675: char *zCanonicalName; /* Canonical filename */
1.2 misho 23676: };
23677:
1.2.2.1 ! misho 23678: #if OS_VXWORKS
! 23679: /*
! 23680: ** All unique filenames are held on a linked list headed by this
! 23681: ** variable:
! 23682: */
! 23683: static struct vxworksFileId *vxworksFileList = 0;
1.2 misho 23684:
23685: /*
1.2.2.1 ! misho 23686: ** Simplify a filename into its canonical form
! 23687: ** by making the following changes:
1.2 misho 23688: **
1.2.2.1 ! misho 23689: ** * removing any trailing and duplicate /
! 23690: ** * convert /./ into just /
! 23691: ** * convert /A/../ where A is any simple name into just /
1.2 misho 23692: **
1.2.2.1 ! misho 23693: ** Changes are made in-place. Return the new name length.
1.2 misho 23694: **
1.2.2.1 ! misho 23695: ** The original filename is in z[0..n-1]. Return the number of
! 23696: ** characters in the simplified name.
1.2 misho 23697: */
1.2.2.1 ! misho 23698: static int vxworksSimplifyName(char *z, int n){
! 23699: int i, j;
! 23700: while( n>1 && z[n-1]=='/' ){ n--; }
! 23701: for(i=j=0; i<n; i++){
! 23702: if( z[i]=='/' ){
! 23703: if( z[i+1]=='/' ) continue;
! 23704: if( z[i+1]=='.' && i+2<n && z[i+2]=='/' ){
! 23705: i += 1;
! 23706: continue;
! 23707: }
! 23708: if( z[i+1]=='.' && i+3<n && z[i+2]=='.' && z[i+3]=='/' ){
! 23709: while( j>0 && z[j-1]!='/' ){ j--; }
! 23710: if( j>0 ){ j--; }
! 23711: i += 2;
! 23712: continue;
! 23713: }
! 23714: }
! 23715: z[j++] = z[i];
! 23716: }
! 23717: z[j] = 0;
! 23718: return j;
! 23719: }
1.2 misho 23720:
23721: /*
1.2.2.1 ! misho 23722: ** Find a unique file ID for the given absolute pathname. Return
! 23723: ** a pointer to the vxworksFileId object. This pointer is the unique
! 23724: ** file ID.
1.2 misho 23725: **
1.2.2.1 ! misho 23726: ** The nRef field of the vxworksFileId object is incremented before
! 23727: ** the object is returned. A new vxworksFileId object is created
! 23728: ** and added to the global list if necessary.
! 23729: **
! 23730: ** If a memory allocation error occurs, return NULL.
1.2 misho 23731: */
1.2.2.1 ! misho 23732: static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){
! 23733: struct vxworksFileId *pNew; /* search key and new file ID */
! 23734: struct vxworksFileId *pCandidate; /* For looping over existing file IDs */
! 23735: int n; /* Length of zAbsoluteName string */
1.2 misho 23736:
1.2.2.1 ! misho 23737: assert( zAbsoluteName[0]=='/' );
! 23738: n = (int)strlen(zAbsoluteName);
! 23739: pNew = sqlite3_malloc( sizeof(*pNew) + (n+1) );
! 23740: if( pNew==0 ) return 0;
! 23741: pNew->zCanonicalName = (char*)&pNew[1];
! 23742: memcpy(pNew->zCanonicalName, zAbsoluteName, n+1);
! 23743: n = vxworksSimplifyName(pNew->zCanonicalName, n);
1.2 misho 23744:
1.2.2.1 ! misho 23745: /* Search for an existing entry that matching the canonical name.
! 23746: ** If found, increment the reference count and return a pointer to
! 23747: ** the existing file ID.
! 23748: */
! 23749: unixEnterMutex();
! 23750: for(pCandidate=vxworksFileList; pCandidate; pCandidate=pCandidate->pNext){
! 23751: if( pCandidate->nName==n
! 23752: && memcmp(pCandidate->zCanonicalName, pNew->zCanonicalName, n)==0
! 23753: ){
! 23754: sqlite3_free(pNew);
! 23755: pCandidate->nRef++;
! 23756: unixLeaveMutex();
! 23757: return pCandidate;
! 23758: }
1.2 misho 23759: }
23760:
1.2.2.1 ! misho 23761: /* No match was found. We will make a new file ID */
! 23762: pNew->nRef = 1;
! 23763: pNew->nName = n;
! 23764: pNew->pNext = vxworksFileList;
! 23765: vxworksFileList = pNew;
! 23766: unixLeaveMutex();
! 23767: return pNew;
1.2 misho 23768: }
23769:
23770: /*
1.2.2.1 ! misho 23771: ** Decrement the reference count on a vxworksFileId object. Free
! 23772: ** the object when the reference count reaches zero.
1.2 misho 23773: */
1.2.2.1 ! misho 23774: static void vxworksReleaseFileId(struct vxworksFileId *pId){
! 23775: unixEnterMutex();
! 23776: assert( pId->nRef>0 );
! 23777: pId->nRef--;
! 23778: if( pId->nRef==0 ){
! 23779: struct vxworksFileId **pp;
! 23780: for(pp=&vxworksFileList; *pp && *pp!=pId; pp = &((*pp)->pNext)){}
! 23781: assert( *pp==pId );
! 23782: *pp = pId->pNext;
! 23783: sqlite3_free(pId);
1.2 misho 23784: }
1.2.2.1 ! misho 23785: unixLeaveMutex();
! 23786: }
! 23787: #endif /* OS_VXWORKS */
! 23788: /*************** End of Unique File ID Utility Used By VxWorks ****************
! 23789: ******************************************************************************/
1.2 misho 23790:
23791:
1.2.2.1 ! misho 23792: /******************************************************************************
! 23793: *************************** Posix Advisory Locking ****************************
! 23794: **
! 23795: ** POSIX advisory locks are broken by design. ANSI STD 1003.1 (1996)
! 23796: ** section 6.5.2.2 lines 483 through 490 specify that when a process
! 23797: ** sets or clears a lock, that operation overrides any prior locks set
! 23798: ** by the same process. It does not explicitly say so, but this implies
! 23799: ** that it overrides locks set by the same process using a different
! 23800: ** file descriptor. Consider this test case:
! 23801: **
! 23802: ** int fd1 = open("./file1", O_RDWR|O_CREAT, 0644);
! 23803: ** int fd2 = open("./file2", O_RDWR|O_CREAT, 0644);
! 23804: **
! 23805: ** Suppose ./file1 and ./file2 are really the same file (because
! 23806: ** one is a hard or symbolic link to the other) then if you set
! 23807: ** an exclusive lock on fd1, then try to get an exclusive lock
! 23808: ** on fd2, it works. I would have expected the second lock to
! 23809: ** fail since there was already a lock on the file due to fd1.
! 23810: ** But not so. Since both locks came from the same process, the
! 23811: ** second overrides the first, even though they were on different
! 23812: ** file descriptors opened on different file names.
! 23813: **
! 23814: ** This means that we cannot use POSIX locks to synchronize file access
! 23815: ** among competing threads of the same process. POSIX locks will work fine
! 23816: ** to synchronize access for threads in separate processes, but not
! 23817: ** threads within the same process.
! 23818: **
! 23819: ** To work around the problem, SQLite has to manage file locks internally
! 23820: ** on its own. Whenever a new database is opened, we have to find the
! 23821: ** specific inode of the database file (the inode is determined by the
! 23822: ** st_dev and st_ino fields of the stat structure that fstat() fills in)
! 23823: ** and check for locks already existing on that inode. When locks are
! 23824: ** created or removed, we have to look at our own internal record of the
! 23825: ** locks to see if another thread has previously set a lock on that same
! 23826: ** inode.
! 23827: **
! 23828: ** (Aside: The use of inode numbers as unique IDs does not work on VxWorks.
! 23829: ** For VxWorks, we have to use the alternative unique ID system based on
! 23830: ** canonical filename and implemented in the previous division.)
! 23831: **
! 23832: ** The sqlite3_file structure for POSIX is no longer just an integer file
! 23833: ** descriptor. It is now a structure that holds the integer file
! 23834: ** descriptor and a pointer to a structure that describes the internal
! 23835: ** locks on the corresponding inode. There is one locking structure
! 23836: ** per inode, so if the same inode is opened twice, both unixFile structures
! 23837: ** point to the same locking structure. The locking structure keeps
! 23838: ** a reference count (so we will know when to delete it) and a "cnt"
! 23839: ** field that tells us its internal lock status. cnt==0 means the
! 23840: ** file is unlocked. cnt==-1 means the file has an exclusive lock.
! 23841: ** cnt>0 means there are cnt shared locks on the file.
! 23842: **
! 23843: ** Any attempt to lock or unlock a file first checks the locking
! 23844: ** structure. The fcntl() system call is only invoked to set a
! 23845: ** POSIX lock if the internal lock structure transitions between
! 23846: ** a locked and an unlocked state.
! 23847: **
! 23848: ** But wait: there are yet more problems with POSIX advisory locks.
! 23849: **
! 23850: ** If you close a file descriptor that points to a file that has locks,
! 23851: ** all locks on that file that are owned by the current process are
! 23852: ** released. To work around this problem, each unixInodeInfo object
! 23853: ** maintains a count of the number of pending locks on tha inode.
! 23854: ** When an attempt is made to close an unixFile, if there are
! 23855: ** other unixFile open on the same inode that are holding locks, the call
! 23856: ** to close() the file descriptor is deferred until all of the locks clear.
! 23857: ** The unixInodeInfo structure keeps a list of file descriptors that need to
! 23858: ** be closed and that list is walked (and cleared) when the last lock
! 23859: ** clears.
! 23860: **
! 23861: ** Yet another problem: LinuxThreads do not play well with posix locks.
! 23862: **
! 23863: ** Many older versions of linux use the LinuxThreads library which is
! 23864: ** not posix compliant. Under LinuxThreads, a lock created by thread
! 23865: ** A cannot be modified or overridden by a different thread B.
! 23866: ** Only thread A can modify the lock. Locking behavior is correct
! 23867: ** if the appliation uses the newer Native Posix Thread Library (NPTL)
! 23868: ** on linux - with NPTL a lock created by thread A can override locks
! 23869: ** in thread B. But there is no way to know at compile-time which
! 23870: ** threading library is being used. So there is no way to know at
! 23871: ** compile-time whether or not thread A can override locks on thread B.
! 23872: ** One has to do a run-time check to discover the behavior of the
! 23873: ** current process.
! 23874: **
! 23875: ** SQLite used to support LinuxThreads. But support for LinuxThreads
! 23876: ** was dropped beginning with version 3.7.0. SQLite will still work with
! 23877: ** LinuxThreads provided that (1) there is no more than one connection
! 23878: ** per database file in the same process and (2) database connections
! 23879: ** do not move across threads.
! 23880: */
1.2 misho 23881:
1.2.2.1 ! misho 23882: /*
! 23883: ** An instance of the following structure serves as the key used
! 23884: ** to locate a particular unixInodeInfo object.
! 23885: */
! 23886: struct unixFileId {
! 23887: dev_t dev; /* Device number */
! 23888: #if OS_VXWORKS
! 23889: struct vxworksFileId *pId; /* Unique file ID for vxworks. */
! 23890: #else
! 23891: ino_t ino; /* Inode number */
! 23892: #endif
! 23893: };
1.2 misho 23894:
23895: /*
1.2.2.1 ! misho 23896: ** An instance of the following structure is allocated for each open
! 23897: ** inode. Or, on LinuxThreads, there is one of these structures for
! 23898: ** each inode opened by each thread.
1.2 misho 23899: **
1.2.2.1 ! misho 23900: ** A single inode can have multiple file descriptors, so each unixFile
! 23901: ** structure contains a pointer to an instance of this object and this
! 23902: ** object keeps a count of the number of unixFile pointing to it.
1.2 misho 23903: */
1.2.2.1 ! misho 23904: struct unixInodeInfo {
! 23905: struct unixFileId fileId; /* The lookup key */
! 23906: int nShared; /* Number of SHARED locks held */
! 23907: unsigned char eFileLock; /* One of SHARED_LOCK, RESERVED_LOCK etc. */
! 23908: unsigned char bProcessLock; /* An exclusive process lock is held */
! 23909: int nRef; /* Number of pointers to this structure */
! 23910: unixShmNode *pShmNode; /* Shared memory associated with this inode */
! 23911: int nLock; /* Number of outstanding file locks */
! 23912: UnixUnusedFd *pUnused; /* Unused file descriptors to close */
! 23913: unixInodeInfo *pNext; /* List of all unixInodeInfo objects */
! 23914: unixInodeInfo *pPrev; /* .... doubly linked */
! 23915: #if SQLITE_ENABLE_LOCKING_STYLE
! 23916: unsigned long long sharedByte; /* for AFP simulated shared lock */
1.2 misho 23917: #endif
1.2.2.1 ! misho 23918: #if OS_VXWORKS
! 23919: sem_t *pSem; /* Named POSIX semaphore */
! 23920: char aSemName[MAX_PATHNAME+2]; /* Name of that semaphore */
! 23921: #endif
! 23922: };
1.2 misho 23923:
1.2.2.1 ! misho 23924: /*
! 23925: ** A lists of all unixInodeInfo objects.
! 23926: */
! 23927: static unixInodeInfo *inodeList = 0;
1.2 misho 23928:
23929: /*
23930: **
1.2.2.1 ! misho 23931: ** This function - unixLogError_x(), is only ever called via the macro
! 23932: ** unixLogError().
1.2 misho 23933: **
1.2.2.1 ! misho 23934: ** It is invoked after an error occurs in an OS function and errno has been
! 23935: ** set. It logs a message using sqlite3_log() containing the current value of
! 23936: ** errno and, if possible, the human-readable equivalent from strerror() or
! 23937: ** strerror_r().
1.2 misho 23938: **
1.2.2.1 ! misho 23939: ** The first argument passed to the macro should be the error code that
! 23940: ** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN).
! 23941: ** The two subsequent arguments should be the name of the OS function that
! 23942: ** failed (e.g. "unlink", "open") and the associated file-system path,
! 23943: ** if any.
1.2 misho 23944: */
1.2.2.1 ! misho 23945: #define unixLogError(a,b,c) unixLogErrorAtLine(a,b,c,__LINE__)
! 23946: static int unixLogErrorAtLine(
! 23947: int errcode, /* SQLite error code */
! 23948: const char *zFunc, /* Name of OS function that failed */
! 23949: const char *zPath, /* File path associated with error */
! 23950: int iLine /* Source line number where error occurred */
1.2 misho 23951: ){
1.2.2.1 ! misho 23952: char *zErr; /* Message from strerror() or equivalent */
! 23953: int iErrno = errno; /* Saved syscall error number */
1.2 misho 23954:
1.2.2.1 ! misho 23955: /* If this is not a threadsafe build (SQLITE_THREADSAFE==0), then use
! 23956: ** the strerror() function to obtain the human-readable error message
! 23957: ** equivalent to errno. Otherwise, use strerror_r().
! 23958: */
! 23959: #if SQLITE_THREADSAFE && defined(HAVE_STRERROR_R)
! 23960: char aErr[80];
! 23961: memset(aErr, 0, sizeof(aErr));
! 23962: zErr = aErr;
1.2 misho 23963:
1.2.2.1 ! misho 23964: /* If STRERROR_R_CHAR_P (set by autoconf scripts) or __USE_GNU is defined,
! 23965: ** assume that the system provides the GNU version of strerror_r() that
! 23966: ** returns a pointer to a buffer containing the error message. That pointer
! 23967: ** may point to aErr[], or it may point to some static storage somewhere.
! 23968: ** Otherwise, assume that the system provides the POSIX version of
! 23969: ** strerror_r(), which always writes an error message into aErr[].
! 23970: **
! 23971: ** If the code incorrectly assumes that it is the POSIX version that is
! 23972: ** available, the error message will often be an empty string. Not a
! 23973: ** huge problem. Incorrectly concluding that the GNU version is available
! 23974: ** could lead to a segfault though.
! 23975: */
! 23976: #if defined(STRERROR_R_CHAR_P) || defined(__USE_GNU)
! 23977: zErr =
! 23978: # endif
! 23979: strerror_r(iErrno, aErr, sizeof(aErr)-1);
1.2 misho 23980:
1.2.2.1 ! misho 23981: #elif SQLITE_THREADSAFE
! 23982: /* This is a threadsafe build, but strerror_r() is not available. */
! 23983: zErr = "";
! 23984: #else
! 23985: /* Non-threadsafe build, use strerror(). */
! 23986: zErr = strerror(iErrno);
! 23987: #endif
1.2 misho 23988:
1.2.2.1 ! misho 23989: assert( errcode!=SQLITE_OK );
! 23990: if( zPath==0 ) zPath = "";
! 23991: sqlite3_log(errcode,
! 23992: "os_unix.c:%d: (%d) %s(%s) - %s",
! 23993: iLine, iErrno, zFunc, zPath, zErr
! 23994: );
1.2 misho 23995:
1.2.2.1 ! misho 23996: return errcode;
1.2 misho 23997: }
23998:
23999: /*
1.2.2.1 ! misho 24000: ** Close a file descriptor.
1.2 misho 24001: **
1.2.2.1 ! misho 24002: ** We assume that close() almost always works, since it is only in a
! 24003: ** very sick application or on a very sick platform that it might fail.
! 24004: ** If it does fail, simply leak the file descriptor, but do log the
! 24005: ** error.
! 24006: **
! 24007: ** Note that it is not safe to retry close() after EINTR since the
! 24008: ** file descriptor might have already been reused by another thread.
! 24009: ** So we don't even try to recover from an EINTR. Just log the error
! 24010: ** and move on.
1.2 misho 24011: */
1.2.2.1 ! misho 24012: static void robust_close(unixFile *pFile, int h, int lineno){
! 24013: if( osClose(h) ){
! 24014: unixLogErrorAtLine(SQLITE_IOERR_CLOSE, "close",
! 24015: pFile ? pFile->zPath : 0, lineno);
1.2 misho 24016: }
1.2.2.1 ! misho 24017: }
1.2 misho 24018:
1.2.2.1 ! misho 24019: /*
! 24020: ** Close all file descriptors accumuated in the unixInodeInfo->pUnused list.
! 24021: */
! 24022: static void closePendingFds(unixFile *pFile){
! 24023: unixInodeInfo *pInode = pFile->pInode;
! 24024: UnixUnusedFd *p;
! 24025: UnixUnusedFd *pNext;
! 24026: for(p=pInode->pUnused; p; p=pNext){
! 24027: pNext = p->pNext;
! 24028: robust_close(pFile, p->fd, __LINE__);
! 24029: sqlite3_free(p);
! 24030: }
! 24031: pInode->pUnused = 0;
1.2 misho 24032: }
24033:
24034: /*
1.2.2.1 ! misho 24035: ** Release a unixInodeInfo structure previously allocated by findInodeInfo().
1.2 misho 24036: **
1.2.2.1 ! misho 24037: ** The mutex entered using the unixEnterMutex() function must be held
! 24038: ** when this function is called.
1.2 misho 24039: */
1.2.2.1 ! misho 24040: static void releaseInodeInfo(unixFile *pFile){
! 24041: unixInodeInfo *pInode = pFile->pInode;
! 24042: assert( unixMutexHeld() );
! 24043: if( ALWAYS(pInode) ){
! 24044: pInode->nRef--;
! 24045: if( pInode->nRef==0 ){
! 24046: assert( pInode->pShmNode==0 );
! 24047: closePendingFds(pFile);
! 24048: if( pInode->pPrev ){
! 24049: assert( pInode->pPrev->pNext==pInode );
! 24050: pInode->pPrev->pNext = pInode->pNext;
1.2 misho 24051: }else{
1.2.2.1 ! misho 24052: assert( inodeList==pInode );
! 24053: inodeList = pInode->pNext;
1.2 misho 24054: }
1.2.2.1 ! misho 24055: if( pInode->pNext ){
! 24056: assert( pInode->pNext->pPrev==pInode );
! 24057: pInode->pNext->pPrev = pInode->pPrev;
1.2 misho 24058: }
1.2.2.1 ! misho 24059: sqlite3_free(pInode);
1.2 misho 24060: }
24061: }
24062: }
24063:
24064: /*
1.2.2.1 ! misho 24065: ** Given a file descriptor, locate the unixInodeInfo object that
! 24066: ** describes that file descriptor. Create a new one if necessary. The
! 24067: ** return value might be uninitialized if an error occurs.
1.2 misho 24068: **
1.2.2.1 ! misho 24069: ** The mutex entered using the unixEnterMutex() function must be held
! 24070: ** when this function is called.
! 24071: **
! 24072: ** Return an appropriate error code.
1.2 misho 24073: */
1.2.2.1 ! misho 24074: static int findInodeInfo(
! 24075: unixFile *pFile, /* Unix file with file desc used in the key */
! 24076: unixInodeInfo **ppInode /* Return the unixInodeInfo object here */
1.2 misho 24077: ){
1.2.2.1 ! misho 24078: int rc; /* System call return code */
! 24079: int fd; /* The file descriptor for pFile */
! 24080: struct unixFileId fileId; /* Lookup key for the unixInodeInfo */
! 24081: struct stat statbuf; /* Low-level file information */
! 24082: unixInodeInfo *pInode = 0; /* Candidate unixInodeInfo object */
1.2 misho 24083:
1.2.2.1 ! misho 24084: assert( unixMutexHeld() );
1.2 misho 24085:
1.2.2.1 ! misho 24086: /* Get low-level information about the file that we can used to
! 24087: ** create a unique name for the file.
1.2 misho 24088: */
1.2.2.1 ! misho 24089: fd = pFile->h;
! 24090: rc = osFstat(fd, &statbuf);
! 24091: if( rc!=0 ){
! 24092: pFile->lastErrno = errno;
! 24093: #ifdef EOVERFLOW
! 24094: if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS;
! 24095: #endif
! 24096: return SQLITE_IOERR;
1.2 misho 24097: }
24098:
1.2.2.1 ! misho 24099: #ifdef __APPLE__
! 24100: /* On OS X on an msdos filesystem, the inode number is reported
! 24101: ** incorrectly for zero-size files. See ticket #3260. To work
! 24102: ** around this problem (we consider it a bug in OS X, not SQLite)
! 24103: ** we always increase the file size to 1 by writing a single byte
! 24104: ** prior to accessing the inode number. The one byte written is
! 24105: ** an ASCII 'S' character which also happens to be the first byte
! 24106: ** in the header of every SQLite database. In this way, if there
! 24107: ** is a race condition such that another thread has already populated
! 24108: ** the first page of the database, no damage is done.
! 24109: */
! 24110: if( statbuf.st_size==0 && (pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS)!=0 ){
! 24111: do{ rc = osWrite(fd, "S", 1); }while( rc<0 && errno==EINTR );
! 24112: if( rc!=1 ){
! 24113: pFile->lastErrno = errno;
! 24114: return SQLITE_IOERR;
! 24115: }
! 24116: rc = osFstat(fd, &statbuf);
! 24117: if( rc!=0 ){
! 24118: pFile->lastErrno = errno;
! 24119: return SQLITE_IOERR;
! 24120: }
! 24121: }
! 24122: #endif
1.2 misho 24123:
1.2.2.1 ! misho 24124: memset(&fileId, 0, sizeof(fileId));
! 24125: fileId.dev = statbuf.st_dev;
! 24126: #if OS_VXWORKS
! 24127: fileId.pId = pFile->pId;
! 24128: #else
! 24129: fileId.ino = statbuf.st_ino;
1.2 misho 24130: #endif
1.2.2.1 ! misho 24131: pInode = inodeList;
! 24132: while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){
! 24133: pInode = pInode->pNext;
! 24134: }
! 24135: if( pInode==0 ){
! 24136: pInode = sqlite3_malloc( sizeof(*pInode) );
! 24137: if( pInode==0 ){
! 24138: return SQLITE_NOMEM;
! 24139: }
! 24140: memset(pInode, 0, sizeof(*pInode));
! 24141: memcpy(&pInode->fileId, &fileId, sizeof(fileId));
! 24142: pInode->nRef = 1;
! 24143: pInode->pNext = inodeList;
! 24144: pInode->pPrev = 0;
! 24145: if( inodeList ) inodeList->pPrev = pInode;
! 24146: inodeList = pInode;
! 24147: }else{
! 24148: pInode->nRef++;
! 24149: }
! 24150: *ppInode = pInode;
! 24151: return SQLITE_OK;
! 24152: }
1.2 misho 24153:
24154:
1.2.2.1 ! misho 24155: /*
! 24156: ** This routine checks if there is a RESERVED lock held on the specified
! 24157: ** file by this or any other process. If such a lock is held, set *pResOut
! 24158: ** to a non-zero value otherwise *pResOut is set to zero. The return value
! 24159: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
! 24160: */
! 24161: static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){
! 24162: int rc = SQLITE_OK;
! 24163: int reserved = 0;
! 24164: unixFile *pFile = (unixFile*)id;
1.2 misho 24165:
1.2.2.1 ! misho 24166: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
1.2 misho 24167:
1.2.2.1 ! misho 24168: assert( pFile );
! 24169: unixEnterMutex(); /* Because pFile->pInode is shared across threads */
1.2 misho 24170:
1.2.2.1 ! misho 24171: /* Check if a thread in this process holds such a lock */
! 24172: if( pFile->pInode->eFileLock>SHARED_LOCK ){
! 24173: reserved = 1;
! 24174: }
1.2 misho 24175:
1.2.2.1 ! misho 24176: /* Otherwise see if some other process holds it.
1.2 misho 24177: */
1.2.2.1 ! misho 24178: #ifndef __DJGPP__
! 24179: if( !reserved && !pFile->pInode->bProcessLock ){
! 24180: struct flock lock;
! 24181: lock.l_whence = SEEK_SET;
! 24182: lock.l_start = RESERVED_BYTE;
! 24183: lock.l_len = 1;
! 24184: lock.l_type = F_WRLCK;
! 24185: if( osFcntl(pFile->h, F_GETLK, &lock) ){
! 24186: rc = SQLITE_IOERR_CHECKRESERVEDLOCK;
! 24187: pFile->lastErrno = errno;
! 24188: } else if( lock.l_type!=F_UNLCK ){
! 24189: reserved = 1;
1.2 misho 24190: }
24191: }
1.2.2.1 ! misho 24192: #endif
! 24193:
! 24194: unixLeaveMutex();
! 24195: OSTRACE(("TEST WR-LOCK %d %d %d (unix)\n", pFile->h, rc, reserved));
1.2 misho 24196:
1.2.2.1 ! misho 24197: *pResOut = reserved;
! 24198: return rc;
! 24199: }
! 24200:
! 24201: /*
! 24202: ** Attempt to set a system-lock on the file pFile. The lock is
! 24203: ** described by pLock.
! 24204: **
! 24205: ** If the pFile was opened read/write from unix-excl, then the only lock
! 24206: ** ever obtained is an exclusive lock, and it is obtained exactly once
! 24207: ** the first time any lock is attempted. All subsequent system locking
! 24208: ** operations become no-ops. Locking operations still happen internally,
! 24209: ** in order to coordinate access between separate database connections
! 24210: ** within this process, but all of that is handled in memory and the
! 24211: ** operating system does not participate.
! 24212: **
! 24213: ** This function is a pass-through to fcntl(F_SETLK) if pFile is using
! 24214: ** any VFS other than "unix-excl" or if pFile is opened on "unix-excl"
! 24215: ** and is read-only.
! 24216: **
! 24217: ** Zero is returned if the call completes successfully, or -1 if a call
! 24218: ** to fcntl() fails. In this case, errno is set appropriately (by fcntl()).
! 24219: */
! 24220: static int unixFileLock(unixFile *pFile, struct flock *pLock){
! 24221: int rc;
! 24222: unixInodeInfo *pInode = pFile->pInode;
! 24223: assert( unixMutexHeld() );
! 24224: assert( pInode!=0 );
! 24225: if( ((pFile->ctrlFlags & UNIXFILE_EXCL)!=0 || pInode->bProcessLock)
! 24226: && ((pFile->ctrlFlags & UNIXFILE_RDONLY)==0)
! 24227: ){
! 24228: if( pInode->bProcessLock==0 ){
! 24229: struct flock lock;
! 24230: assert( pInode->nLock==0 );
! 24231: lock.l_whence = SEEK_SET;
! 24232: lock.l_start = SHARED_FIRST;
! 24233: lock.l_len = SHARED_SIZE;
! 24234: lock.l_type = F_WRLCK;
! 24235: rc = osFcntl(pFile->h, F_SETLK, &lock);
! 24236: if( rc<0 ) return rc;
! 24237: pInode->bProcessLock = 1;
! 24238: pInode->nLock++;
! 24239: }else{
! 24240: rc = 0;
! 24241: }
1.2 misho 24242: }else{
1.2.2.1 ! misho 24243: rc = osFcntl(pFile->h, F_SETLK, pLock);
1.2 misho 24244: }
1.2.2.1 ! misho 24245: return rc;
! 24246: }
1.2 misho 24247:
1.2.2.1 ! misho 24248: /*
! 24249: ** Lock the file with the lock specified by parameter eFileLock - one
! 24250: ** of the following:
! 24251: **
! 24252: ** (1) SHARED_LOCK
! 24253: ** (2) RESERVED_LOCK
! 24254: ** (3) PENDING_LOCK
! 24255: ** (4) EXCLUSIVE_LOCK
! 24256: **
! 24257: ** Sometimes when requesting one lock state, additional lock states
! 24258: ** are inserted in between. The locking might fail on one of the later
! 24259: ** transitions leaving the lock state different from what it started but
! 24260: ** still short of its goal. The following chart shows the allowed
! 24261: ** transitions and the inserted intermediate states:
! 24262: **
! 24263: ** UNLOCKED -> SHARED
! 24264: ** SHARED -> RESERVED
! 24265: ** SHARED -> (PENDING) -> EXCLUSIVE
! 24266: ** RESERVED -> (PENDING) -> EXCLUSIVE
! 24267: ** PENDING -> EXCLUSIVE
! 24268: **
! 24269: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
! 24270: ** routine to lower a locking level.
! 24271: */
! 24272: static int unixLock(sqlite3_file *id, int eFileLock){
! 24273: /* The following describes the implementation of the various locks and
! 24274: ** lock transitions in terms of the POSIX advisory shared and exclusive
! 24275: ** lock primitives (called read-locks and write-locks below, to avoid
! 24276: ** confusion with SQLite lock names). The algorithms are complicated
! 24277: ** slightly in order to be compatible with windows systems simultaneously
! 24278: ** accessing the same database file, in case that is ever required.
! 24279: **
! 24280: ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved
! 24281: ** byte', each single bytes at well known offsets, and the 'shared byte
! 24282: ** range', a range of 510 bytes at a well known offset.
! 24283: **
! 24284: ** To obtain a SHARED lock, a read-lock is obtained on the 'pending
! 24285: ** byte'. If this is successful, a random byte from the 'shared byte
! 24286: ** range' is read-locked and the lock on the 'pending byte' released.
! 24287: **
! 24288: ** A process may only obtain a RESERVED lock after it has a SHARED lock.
! 24289: ** A RESERVED lock is implemented by grabbing a write-lock on the
! 24290: ** 'reserved byte'.
! 24291: **
! 24292: ** A process may only obtain a PENDING lock after it has obtained a
! 24293: ** SHARED lock. A PENDING lock is implemented by obtaining a write-lock
! 24294: ** on the 'pending byte'. This ensures that no new SHARED locks can be
! 24295: ** obtained, but existing SHARED locks are allowed to persist. A process
! 24296: ** does not have to obtain a RESERVED lock on the way to a PENDING lock.
! 24297: ** This property is used by the algorithm for rolling back a journal file
! 24298: ** after a crash.
! 24299: **
! 24300: ** An EXCLUSIVE lock, obtained after a PENDING lock is held, is
! 24301: ** implemented by obtaining a write-lock on the entire 'shared byte
! 24302: ** range'. Since all other locks require a read-lock on one of the bytes
! 24303: ** within this range, this ensures that no other locks are held on the
! 24304: ** database.
! 24305: **
! 24306: ** The reason a single byte cannot be used instead of the 'shared byte
! 24307: ** range' is that some versions of windows do not support read-locks. By
! 24308: ** locking a random byte from a range, concurrent SHARED locks may exist
! 24309: ** even if the locking primitive used is always a write-lock.
1.2 misho 24310: */
1.2.2.1 ! misho 24311: int rc = SQLITE_OK;
! 24312: unixFile *pFile = (unixFile*)id;
! 24313: unixInodeInfo *pInode;
! 24314: struct flock lock;
! 24315: int tErrno = 0;
1.2 misho 24316:
1.2.2.1 ! misho 24317: assert( pFile );
! 24318: OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h,
! 24319: azFileLock(eFileLock), azFileLock(pFile->eFileLock),
! 24320: azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid()));
! 24321:
! 24322: /* If there is already a lock of this type or more restrictive on the
! 24323: ** unixFile, do nothing. Don't use the end_lock: exit path, as
! 24324: ** unixEnterMutex() hasn't been called yet.
1.2 misho 24325: */
1.2.2.1 ! misho 24326: if( pFile->eFileLock>=eFileLock ){
! 24327: OSTRACE(("LOCK %d %s ok (already held) (unix)\n", pFile->h,
! 24328: azFileLock(eFileLock)));
! 24329: return SQLITE_OK;
1.2 misho 24330: }
24331:
1.2.2.1 ! misho 24332: /* Make sure the locking sequence is correct.
! 24333: ** (1) We never move from unlocked to anything higher than shared lock.
! 24334: ** (2) SQLite never explicitly requests a pendig lock.
! 24335: ** (3) A shared lock is always held when a reserve lock is requested.
! 24336: */
! 24337: assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK );
! 24338: assert( eFileLock!=PENDING_LOCK );
! 24339: assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK );
! 24340:
! 24341: /* This mutex is needed because pFile->pInode is shared across threads
! 24342: */
! 24343: unixEnterMutex();
! 24344: pInode = pFile->pInode;
1.2 misho 24345:
1.2.2.1 ! misho 24346: /* If some thread using this PID has a lock via a different unixFile*
! 24347: ** handle that precludes the requested lock, return BUSY.
! 24348: */
! 24349: if( (pFile->eFileLock!=pInode->eFileLock &&
! 24350: (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK))
! 24351: ){
! 24352: rc = SQLITE_BUSY;
! 24353: goto end_lock;
1.2 misho 24354: }
24355:
1.2.2.1 ! misho 24356: /* If a SHARED lock is requested, and some thread using this PID already
! 24357: ** has a SHARED or RESERVED lock, then increment reference counts and
! 24358: ** return SQLITE_OK.
! 24359: */
! 24360: if( eFileLock==SHARED_LOCK &&
! 24361: (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){
! 24362: assert( eFileLock==SHARED_LOCK );
! 24363: assert( pFile->eFileLock==0 );
! 24364: assert( pInode->nShared>0 );
! 24365: pFile->eFileLock = SHARED_LOCK;
! 24366: pInode->nShared++;
! 24367: pInode->nLock++;
! 24368: goto end_lock;
1.2 misho 24369: }
24370:
24371:
1.2.2.1 ! misho 24372: /* A PENDING lock is needed before acquiring a SHARED lock and before
! 24373: ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
! 24374: ** be released.
! 24375: */
! 24376: lock.l_len = 1L;
! 24377: lock.l_whence = SEEK_SET;
! 24378: if( eFileLock==SHARED_LOCK
! 24379: || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
! 24380: ){
! 24381: lock.l_type = (eFileLock==SHARED_LOCK?F_RDLCK:F_WRLCK);
! 24382: lock.l_start = PENDING_BYTE;
! 24383: if( unixFileLock(pFile, &lock) ){
! 24384: tErrno = errno;
! 24385: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 24386: if( rc!=SQLITE_BUSY ){
! 24387: pFile->lastErrno = tErrno;
! 24388: }
! 24389: goto end_lock;
! 24390: }
! 24391: }
1.2 misho 24392:
24393:
1.2.2.1 ! misho 24394: /* If control gets to this point, then actually go ahead and make
! 24395: ** operating system calls for the specified lock.
! 24396: */
! 24397: if( eFileLock==SHARED_LOCK ){
! 24398: assert( pInode->nShared==0 );
! 24399: assert( pInode->eFileLock==0 );
! 24400: assert( rc==SQLITE_OK );
1.2 misho 24401:
1.2.2.1 ! misho 24402: /* Now get the read-lock */
! 24403: lock.l_start = SHARED_FIRST;
! 24404: lock.l_len = SHARED_SIZE;
! 24405: if( unixFileLock(pFile, &lock) ){
! 24406: tErrno = errno;
! 24407: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 24408: }
1.2 misho 24409:
1.2.2.1 ! misho 24410: /* Drop the temporary PENDING lock */
! 24411: lock.l_start = PENDING_BYTE;
! 24412: lock.l_len = 1L;
! 24413: lock.l_type = F_UNLCK;
! 24414: if( unixFileLock(pFile, &lock) && rc==SQLITE_OK ){
! 24415: /* This could happen with a network mount */
! 24416: tErrno = errno;
! 24417: rc = SQLITE_IOERR_UNLOCK;
! 24418: }
1.2 misho 24419:
1.2.2.1 ! misho 24420: if( rc ){
! 24421: if( rc!=SQLITE_BUSY ){
! 24422: pFile->lastErrno = tErrno;
! 24423: }
! 24424: goto end_lock;
! 24425: }else{
! 24426: pFile->eFileLock = SHARED_LOCK;
! 24427: pInode->nLock++;
! 24428: pInode->nShared = 1;
! 24429: }
! 24430: }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){
! 24431: /* We are trying for an exclusive lock but another thread in this
! 24432: ** same process is still holding a shared lock. */
! 24433: rc = SQLITE_BUSY;
! 24434: }else{
! 24435: /* The request was for a RESERVED or EXCLUSIVE lock. It is
! 24436: ** assumed that there is a SHARED or greater lock on the file
! 24437: ** already.
! 24438: */
! 24439: assert( 0!=pFile->eFileLock );
! 24440: lock.l_type = F_WRLCK;
1.2 misho 24441:
1.2.2.1 ! misho 24442: assert( eFileLock==RESERVED_LOCK || eFileLock==EXCLUSIVE_LOCK );
! 24443: if( eFileLock==RESERVED_LOCK ){
! 24444: lock.l_start = RESERVED_BYTE;
! 24445: lock.l_len = 1L;
! 24446: }else{
! 24447: lock.l_start = SHARED_FIRST;
! 24448: lock.l_len = SHARED_SIZE;
! 24449: }
1.2 misho 24450:
1.2.2.1 ! misho 24451: if( unixFileLock(pFile, &lock) ){
! 24452: tErrno = errno;
! 24453: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 24454: if( rc!=SQLITE_BUSY ){
! 24455: pFile->lastErrno = tErrno;
! 24456: }
! 24457: }
! 24458: }
! 24459:
1.2 misho 24460:
1.2.2.1 ! misho 24461: #ifdef SQLITE_DEBUG
! 24462: /* Set up the transaction-counter change checking flags when
! 24463: ** transitioning from a SHARED to a RESERVED lock. The change
! 24464: ** from SHARED to RESERVED marks the beginning of a normal
! 24465: ** write operation (not a hot journal rollback).
! 24466: */
! 24467: if( rc==SQLITE_OK
! 24468: && pFile->eFileLock<=SHARED_LOCK
! 24469: && eFileLock==RESERVED_LOCK
! 24470: ){
! 24471: pFile->transCntrChng = 0;
! 24472: pFile->dbUpdate = 0;
! 24473: pFile->inNormalWrite = 1;
1.2 misho 24474: }
24475: #endif
24476:
24477:
1.2.2.1 ! misho 24478: if( rc==SQLITE_OK ){
! 24479: pFile->eFileLock = eFileLock;
! 24480: pInode->eFileLock = eFileLock;
! 24481: }else if( eFileLock==EXCLUSIVE_LOCK ){
! 24482: pFile->eFileLock = PENDING_LOCK;
! 24483: pInode->eFileLock = PENDING_LOCK;
! 24484: }
1.2 misho 24485:
1.2.2.1 ! misho 24486: end_lock:
! 24487: unixLeaveMutex();
! 24488: OSTRACE(("LOCK %d %s %s (unix)\n", pFile->h, azFileLock(eFileLock),
! 24489: rc==SQLITE_OK ? "ok" : "failed"));
! 24490: return rc;
1.2 misho 24491: }
24492:
24493: /*
1.2.2.1 ! misho 24494: ** Add the file descriptor used by file handle pFile to the corresponding
! 24495: ** pUnused list.
1.2 misho 24496: */
1.2.2.1 ! misho 24497: static void setPendingFd(unixFile *pFile){
! 24498: unixInodeInfo *pInode = pFile->pInode;
! 24499: UnixUnusedFd *p = pFile->pUnused;
! 24500: p->pNext = pInode->pUnused;
! 24501: pInode->pUnused = p;
! 24502: pFile->h = -1;
! 24503: pFile->pUnused = 0;
1.2 misho 24504: }
24505:
24506: /*
1.2.2.1 ! misho 24507: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
! 24508: ** must be either NO_LOCK or SHARED_LOCK.
1.2 misho 24509: **
1.2.2.1 ! misho 24510: ** If the locking level of the file descriptor is already at or below
! 24511: ** the requested locking level, this routine is a no-op.
! 24512: **
! 24513: ** If handleNFSUnlock is true, then on downgrading an EXCLUSIVE_LOCK to SHARED
! 24514: ** the byte range is divided into 2 parts and the first part is unlocked then
! 24515: ** set to a read lock, then the other part is simply unlocked. This works
! 24516: ** around a bug in BSD NFS lockd (also seen on MacOSX 10.3+) that fails to
! 24517: ** remove the write lock on a region when a read lock is set.
1.2 misho 24518: */
1.2.2.1 ! misho 24519: static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){
! 24520: unixFile *pFile = (unixFile*)id;
! 24521: unixInodeInfo *pInode;
! 24522: struct flock lock;
! 24523: int rc = SQLITE_OK;
1.2 misho 24524:
1.2.2.1 ! misho 24525: assert( pFile );
! 24526: OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock,
! 24527: pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
! 24528: getpid()));
1.2 misho 24529:
1.2.2.1 ! misho 24530: assert( eFileLock<=SHARED_LOCK );
! 24531: if( pFile->eFileLock<=eFileLock ){
! 24532: return SQLITE_OK;
1.2 misho 24533: }
1.2.2.1 ! misho 24534: unixEnterMutex();
! 24535: pInode = pFile->pInode;
! 24536: assert( pInode->nShared!=0 );
! 24537: if( pFile->eFileLock>SHARED_LOCK ){
! 24538: assert( pInode->eFileLock==pFile->eFileLock );
! 24539:
! 24540: #ifdef SQLITE_DEBUG
! 24541: /* When reducing a lock such that other processes can start
! 24542: ** reading the database file again, make sure that the
! 24543: ** transaction counter was updated if any part of the database
! 24544: ** file changed. If the transaction counter is not updated,
! 24545: ** other connections to the same file might not realize that
! 24546: ** the file has changed and hence might not know to flush their
! 24547: ** cache. The use of a stale cache can lead to database corruption.
! 24548: */
! 24549: pFile->inNormalWrite = 0;
1.2 misho 24550: #endif
24551:
1.2.2.1 ! misho 24552: /* downgrading to a shared lock on NFS involves clearing the write lock
! 24553: ** before establishing the readlock - to avoid a race condition we downgrade
! 24554: ** the lock in 2 blocks, so that part of the range will be covered by a
! 24555: ** write lock until the rest is covered by a read lock:
! 24556: ** 1: [WWWWW]
! 24557: ** 2: [....W]
! 24558: ** 3: [RRRRW]
! 24559: ** 4: [RRRR.]
! 24560: */
! 24561: if( eFileLock==SHARED_LOCK ){
1.2 misho 24562:
1.2.2.1 ! misho 24563: #if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE
! 24564: (void)handleNFSUnlock;
! 24565: assert( handleNFSUnlock==0 );
! 24566: #endif
! 24567: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
! 24568: if( handleNFSUnlock ){
! 24569: int tErrno; /* Error code from system call errors */
! 24570: off_t divSize = SHARED_SIZE - 1;
! 24571:
! 24572: lock.l_type = F_UNLCK;
! 24573: lock.l_whence = SEEK_SET;
! 24574: lock.l_start = SHARED_FIRST;
! 24575: lock.l_len = divSize;
! 24576: if( unixFileLock(pFile, &lock)==(-1) ){
! 24577: tErrno = errno;
! 24578: rc = SQLITE_IOERR_UNLOCK;
! 24579: if( IS_LOCK_ERROR(rc) ){
! 24580: pFile->lastErrno = tErrno;
! 24581: }
! 24582: goto end_unlock;
! 24583: }
! 24584: lock.l_type = F_RDLCK;
! 24585: lock.l_whence = SEEK_SET;
! 24586: lock.l_start = SHARED_FIRST;
! 24587: lock.l_len = divSize;
! 24588: if( unixFileLock(pFile, &lock)==(-1) ){
! 24589: tErrno = errno;
! 24590: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK);
! 24591: if( IS_LOCK_ERROR(rc) ){
! 24592: pFile->lastErrno = tErrno;
! 24593: }
! 24594: goto end_unlock;
! 24595: }
! 24596: lock.l_type = F_UNLCK;
! 24597: lock.l_whence = SEEK_SET;
! 24598: lock.l_start = SHARED_FIRST+divSize;
! 24599: lock.l_len = SHARED_SIZE-divSize;
! 24600: if( unixFileLock(pFile, &lock)==(-1) ){
! 24601: tErrno = errno;
! 24602: rc = SQLITE_IOERR_UNLOCK;
! 24603: if( IS_LOCK_ERROR(rc) ){
! 24604: pFile->lastErrno = tErrno;
! 24605: }
! 24606: goto end_unlock;
! 24607: }
! 24608: }else
! 24609: #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
! 24610: {
! 24611: lock.l_type = F_RDLCK;
! 24612: lock.l_whence = SEEK_SET;
! 24613: lock.l_start = SHARED_FIRST;
! 24614: lock.l_len = SHARED_SIZE;
! 24615: if( unixFileLock(pFile, &lock) ){
! 24616: /* In theory, the call to unixFileLock() cannot fail because another
! 24617: ** process is holding an incompatible lock. If it does, this
! 24618: ** indicates that the other process is not following the locking
! 24619: ** protocol. If this happens, return SQLITE_IOERR_RDLOCK. Returning
! 24620: ** SQLITE_BUSY would confuse the upper layer (in practice it causes
! 24621: ** an assert to fail). */
! 24622: rc = SQLITE_IOERR_RDLOCK;
! 24623: pFile->lastErrno = errno;
! 24624: goto end_unlock;
! 24625: }
! 24626: }
! 24627: }
! 24628: lock.l_type = F_UNLCK;
! 24629: lock.l_whence = SEEK_SET;
! 24630: lock.l_start = PENDING_BYTE;
! 24631: lock.l_len = 2L; assert( PENDING_BYTE+1==RESERVED_BYTE );
! 24632: if( unixFileLock(pFile, &lock)==0 ){
! 24633: pInode->eFileLock = SHARED_LOCK;
! 24634: }else{
! 24635: rc = SQLITE_IOERR_UNLOCK;
! 24636: pFile->lastErrno = errno;
! 24637: goto end_unlock;
! 24638: }
! 24639: }
! 24640: if( eFileLock==NO_LOCK ){
! 24641: /* Decrement the shared lock counter. Release the lock using an
! 24642: ** OS call only when all threads in this same process have released
! 24643: ** the lock.
! 24644: */
! 24645: pInode->nShared--;
! 24646: if( pInode->nShared==0 ){
! 24647: lock.l_type = F_UNLCK;
! 24648: lock.l_whence = SEEK_SET;
! 24649: lock.l_start = lock.l_len = 0L;
! 24650: if( unixFileLock(pFile, &lock)==0 ){
! 24651: pInode->eFileLock = NO_LOCK;
! 24652: }else{
! 24653: rc = SQLITE_IOERR_UNLOCK;
! 24654: pFile->lastErrno = errno;
! 24655: pInode->eFileLock = NO_LOCK;
! 24656: pFile->eFileLock = NO_LOCK;
! 24657: }
! 24658: }
! 24659:
! 24660: /* Decrement the count of locks against this same file. When the
! 24661: ** count reaches zero, close any other file descriptors whose close
! 24662: ** was deferred because of outstanding locks.
! 24663: */
! 24664: pInode->nLock--;
! 24665: assert( pInode->nLock>=0 );
! 24666: if( pInode->nLock==0 ){
! 24667: closePendingFds(pFile);
! 24668: }
1.2 misho 24669: }
1.2.2.1 ! misho 24670:
! 24671: end_unlock:
! 24672: unixLeaveMutex();
! 24673: if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
1.2 misho 24674: return rc;
24675: }
24676:
24677: /*
1.2.2.1 ! misho 24678: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
! 24679: ** must be either NO_LOCK or SHARED_LOCK.
1.2 misho 24680: **
1.2.2.1 ! misho 24681: ** If the locking level of the file descriptor is already at or below
! 24682: ** the requested locking level, this routine is a no-op.
1.2 misho 24683: */
1.2.2.1 ! misho 24684: static int unixUnlock(sqlite3_file *id, int eFileLock){
! 24685: return posixUnlock(id, eFileLock, 0);
1.2 misho 24686: }
24687:
24688: /*
1.2.2.1 ! misho 24689: ** This function performs the parts of the "close file" operation
! 24690: ** common to all locking schemes. It closes the directory and file
! 24691: ** handles, if they are valid, and sets all fields of the unixFile
! 24692: ** structure to 0.
! 24693: **
! 24694: ** It is *not* necessary to hold the mutex when this routine is called,
! 24695: ** even on VxWorks. A mutex will be acquired on VxWorks by the
! 24696: ** vxworksReleaseFileId() routine.
1.2 misho 24697: */
1.2.2.1 ! misho 24698: static int closeUnixFile(sqlite3_file *id){
! 24699: unixFile *pFile = (unixFile*)id;
! 24700: if( pFile->h>=0 ){
! 24701: robust_close(pFile, pFile->h, __LINE__);
! 24702: pFile->h = -1;
! 24703: }
! 24704: #if OS_VXWORKS
! 24705: if( pFile->pId ){
! 24706: if( pFile->ctrlFlags & UNIXFILE_DELETE ){
! 24707: osUnlink(pFile->pId->zCanonicalName);
! 24708: }
! 24709: vxworksReleaseFileId(pFile->pId);
! 24710: pFile->pId = 0;
! 24711: }
! 24712: #endif
! 24713: OSTRACE(("CLOSE %-3d\n", pFile->h));
! 24714: OpenCounter(-1);
! 24715: sqlite3_free(pFile->pUnused);
! 24716: memset(pFile, 0, sizeof(unixFile));
1.2 misho 24717: return SQLITE_OK;
24718: }
1.2.2.1 ! misho 24719:
! 24720: /*
! 24721: ** Close a file.
! 24722: */
! 24723: static int unixClose(sqlite3_file *id){
! 24724: int rc = SQLITE_OK;
! 24725: unixFile *pFile = (unixFile *)id;
! 24726: unixUnlock(id, NO_LOCK);
! 24727: unixEnterMutex();
! 24728:
! 24729: /* unixFile.pInode is always valid here. Otherwise, a different close
! 24730: ** routine (e.g. nolockClose()) would be called instead.
! 24731: */
! 24732: assert( pFile->pInode->nLock>0 || pFile->pInode->bProcessLock==0 );
! 24733: if( ALWAYS(pFile->pInode) && pFile->pInode->nLock ){
! 24734: /* If there are outstanding locks, do not actually close the file just
! 24735: ** yet because that would clear those locks. Instead, add the file
! 24736: ** descriptor to pInode->pUnused list. It will be automatically closed
! 24737: ** when the last lock is cleared.
! 24738: */
! 24739: setPendingFd(pFile);
! 24740: }
! 24741: releaseInodeInfo(pFile);
! 24742: rc = closeUnixFile(id);
! 24743: unixLeaveMutex();
! 24744: return rc;
1.2 misho 24745: }
24746:
1.2.2.1 ! misho 24747: /************** End of the posix advisory lock implementation *****************
! 24748: ******************************************************************************/
1.2 misho 24749:
1.2.2.1 ! misho 24750: /******************************************************************************
! 24751: ****************************** No-op Locking **********************************
1.2 misho 24752: **
1.2.2.1 ! misho 24753: ** Of the various locking implementations available, this is by far the
! 24754: ** simplest: locking is ignored. No attempt is made to lock the database
! 24755: ** file for reading or writing.
1.2 misho 24756: **
1.2.2.1 ! misho 24757: ** This locking mode is appropriate for use on read-only databases
! 24758: ** (ex: databases that are burned into CD-ROM, for example.) It can
! 24759: ** also be used if the application employs some external mechanism to
! 24760: ** prevent simultaneous access of the same database by two or more
! 24761: ** database connections. But there is a serious risk of database
! 24762: ** corruption if this locking mode is used in situations where multiple
! 24763: ** database connections are accessing the same database file at the same
! 24764: ** time and one or more of those connections are writing.
! 24765: */
! 24766:
! 24767: static int nolockCheckReservedLock(sqlite3_file *NotUsed, int *pResOut){
! 24768: UNUSED_PARAMETER(NotUsed);
! 24769: *pResOut = 0;
! 24770: return SQLITE_OK;
! 24771: }
! 24772: static int nolockLock(sqlite3_file *NotUsed, int NotUsed2){
! 24773: UNUSED_PARAMETER2(NotUsed, NotUsed2);
! 24774: return SQLITE_OK;
! 24775: }
! 24776: static int nolockUnlock(sqlite3_file *NotUsed, int NotUsed2){
! 24777: UNUSED_PARAMETER2(NotUsed, NotUsed2);
! 24778: return SQLITE_OK;
! 24779: }
! 24780:
! 24781: /*
! 24782: ** Close the file.
! 24783: */
! 24784: static int nolockClose(sqlite3_file *id) {
! 24785: return closeUnixFile(id);
! 24786: }
! 24787:
! 24788: /******************* End of the no-op lock implementation *********************
! 24789: ******************************************************************************/
! 24790:
! 24791: /******************************************************************************
! 24792: ************************* Begin dot-file Locking ******************************
1.2 misho 24793: **
1.2.2.1 ! misho 24794: ** The dotfile locking implementation uses the existance of separate lock
! 24795: ** files (really a directory) to control access to the database. This works
! 24796: ** on just about every filesystem imaginable. But there are serious downsides:
1.2 misho 24797: **
1.2.2.1 ! misho 24798: ** (1) There is zero concurrency. A single reader blocks all other
! 24799: ** connections from reading or writing the database.
1.2 misho 24800: **
1.2.2.1 ! misho 24801: ** (2) An application crash or power loss can leave stale lock files
! 24802: ** sitting around that need to be cleared manually.
1.2 misho 24803: **
1.2.2.1 ! misho 24804: ** Nevertheless, a dotlock is an appropriate locking mode for use if no
! 24805: ** other locking strategy is available.
1.2 misho 24806: **
1.2.2.1 ! misho 24807: ** Dotfile locking works by creating a subdirectory in the same directory as
! 24808: ** the database and with the same name but with a ".lock" extension added.
! 24809: ** The existance of a lock directory implies an EXCLUSIVE lock. All other
! 24810: ** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE.
1.2 misho 24811: */
24812:
24813: /*
1.2.2.1 ! misho 24814: ** The file suffix added to the data base filename in order to create the
! 24815: ** lock directory.
1.2 misho 24816: */
1.2.2.1 ! misho 24817: #define DOTLOCK_SUFFIX ".lock"
1.2 misho 24818:
24819: /*
1.2.2.1 ! misho 24820: ** This routine checks if there is a RESERVED lock held on the specified
! 24821: ** file by this or any other process. If such a lock is held, set *pResOut
! 24822: ** to a non-zero value otherwise *pResOut is set to zero. The return value
! 24823: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
! 24824: **
! 24825: ** In dotfile locking, either a lock exists or it does not. So in this
! 24826: ** variation of CheckReservedLock(), *pResOut is set to true if any lock
! 24827: ** is held on the file and false if the file is unlocked.
1.2 misho 24828: */
1.2.2.1 ! misho 24829: static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) {
! 24830: int rc = SQLITE_OK;
! 24831: int reserved = 0;
! 24832: unixFile *pFile = (unixFile*)id;
! 24833:
! 24834: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
! 24835:
! 24836: assert( pFile );
! 24837:
! 24838: /* Check if a thread in this process holds such a lock */
! 24839: if( pFile->eFileLock>SHARED_LOCK ){
! 24840: /* Either this connection or some other connection in the same process
! 24841: ** holds a lock on the file. No need to check further. */
! 24842: reserved = 1;
! 24843: }else{
! 24844: /* The lock is held if and only if the lockfile exists */
! 24845: const char *zLockFile = (const char*)pFile->lockingContext;
! 24846: reserved = osAccess(zLockFile, 0)==0;
! 24847: }
! 24848: OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved));
! 24849: *pResOut = reserved;
! 24850: return rc;
! 24851: }
1.2 misho 24852:
24853: /*
1.2.2.1 ! misho 24854: ** Lock the file with the lock specified by parameter eFileLock - one
! 24855: ** of the following:
1.2 misho 24856: **
1.2.2.1 ! misho 24857: ** (1) SHARED_LOCK
! 24858: ** (2) RESERVED_LOCK
! 24859: ** (3) PENDING_LOCK
! 24860: ** (4) EXCLUSIVE_LOCK
1.2 misho 24861: **
1.2.2.1 ! misho 24862: ** Sometimes when requesting one lock state, additional lock states
! 24863: ** are inserted in between. The locking might fail on one of the later
! 24864: ** transitions leaving the lock state different from what it started but
! 24865: ** still short of its goal. The following chart shows the allowed
! 24866: ** transitions and the inserted intermediate states:
! 24867: **
! 24868: ** UNLOCKED -> SHARED
! 24869: ** SHARED -> RESERVED
! 24870: ** SHARED -> (PENDING) -> EXCLUSIVE
! 24871: ** RESERVED -> (PENDING) -> EXCLUSIVE
! 24872: ** PENDING -> EXCLUSIVE
! 24873: **
! 24874: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
! 24875: ** routine to lower a locking level.
! 24876: **
! 24877: ** With dotfile locking, we really only support state (4): EXCLUSIVE.
! 24878: ** But we track the other locking levels internally.
1.2 misho 24879: */
1.2.2.1 ! misho 24880: static int dotlockLock(sqlite3_file *id, int eFileLock) {
! 24881: unixFile *pFile = (unixFile*)id;
! 24882: char *zLockFile = (char *)pFile->lockingContext;
! 24883: int rc = SQLITE_OK;
! 24884:
! 24885:
! 24886: /* If we have any lock, then the lock file already exists. All we have
! 24887: ** to do is adjust our internal record of the lock level.
! 24888: */
! 24889: if( pFile->eFileLock > NO_LOCK ){
! 24890: pFile->eFileLock = eFileLock;
! 24891: /* Always update the timestamp on the old file */
! 24892: #ifdef HAVE_UTIME
! 24893: utime(zLockFile, NULL);
! 24894: #else
! 24895: utimes(zLockFile, NULL);
1.2 misho 24896: #endif
1.2.2.1 ! misho 24897: return SQLITE_OK;
! 24898: }
! 24899:
! 24900: /* grab an exclusive lock */
! 24901: rc = osMkdir(zLockFile, 0777);
! 24902: if( rc<0 ){
! 24903: /* failed to open/create the lock directory */
! 24904: int tErrno = errno;
! 24905: if( EEXIST == tErrno ){
! 24906: rc = SQLITE_BUSY;
! 24907: } else {
! 24908: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 24909: if( IS_LOCK_ERROR(rc) ){
! 24910: pFile->lastErrno = tErrno;
! 24911: }
! 24912: }
! 24913: return rc;
! 24914: }
! 24915:
! 24916: /* got it, set the type and return ok */
! 24917: pFile->eFileLock = eFileLock;
! 24918: return rc;
! 24919: }
1.2 misho 24920:
24921: /*
1.2.2.1 ! misho 24922: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
! 24923: ** must be either NO_LOCK or SHARED_LOCK.
! 24924: **
! 24925: ** If the locking level of the file descriptor is already at or below
! 24926: ** the requested locking level, this routine is a no-op.
! 24927: **
! 24928: ** When the locking level reaches NO_LOCK, delete the lock file.
1.2 misho 24929: */
1.2.2.1 ! misho 24930: static int dotlockUnlock(sqlite3_file *id, int eFileLock) {
! 24931: unixFile *pFile = (unixFile*)id;
! 24932: char *zLockFile = (char *)pFile->lockingContext;
! 24933: int rc;
1.2 misho 24934:
1.2.2.1 ! misho 24935: assert( pFile );
! 24936: OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock,
! 24937: pFile->eFileLock, getpid()));
! 24938: assert( eFileLock<=SHARED_LOCK );
! 24939:
! 24940: /* no-op if possible */
! 24941: if( pFile->eFileLock==eFileLock ){
! 24942: return SQLITE_OK;
! 24943: }
1.2 misho 24944:
1.2.2.1 ! misho 24945: /* To downgrade to shared, simply update our internal notion of the
! 24946: ** lock state. No need to mess with the file on disk.
! 24947: */
! 24948: if( eFileLock==SHARED_LOCK ){
! 24949: pFile->eFileLock = SHARED_LOCK;
! 24950: return SQLITE_OK;
! 24951: }
! 24952:
! 24953: /* To fully unlock the database, delete the lock file */
! 24954: assert( eFileLock==NO_LOCK );
! 24955: rc = osRmdir(zLockFile);
! 24956: if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile);
! 24957: if( rc<0 ){
! 24958: int tErrno = errno;
! 24959: rc = 0;
! 24960: if( ENOENT != tErrno ){
! 24961: rc = SQLITE_IOERR_UNLOCK;
! 24962: }
! 24963: if( IS_LOCK_ERROR(rc) ){
! 24964: pFile->lastErrno = tErrno;
! 24965: }
! 24966: return rc;
! 24967: }
! 24968: pFile->eFileLock = NO_LOCK;
! 24969: return SQLITE_OK;
! 24970: }
1.2 misho 24971:
24972: /*
1.2.2.1 ! misho 24973: ** Close a file. Make sure the lock has been released before closing.
1.2 misho 24974: */
1.2.2.1 ! misho 24975: static int dotlockClose(sqlite3_file *id) {
! 24976: int rc = SQLITE_OK;
! 24977: if( id ){
! 24978: unixFile *pFile = (unixFile*)id;
! 24979: dotlockUnlock(id, NO_LOCK);
! 24980: sqlite3_free(pFile->lockingContext);
! 24981: rc = closeUnixFile(id);
! 24982: }
! 24983: return rc;
! 24984: }
! 24985: /****************** End of the dot-file lock implementation *******************
! 24986: ******************************************************************************/
1.2 misho 24987:
1.2.2.1 ! misho 24988: /******************************************************************************
! 24989: ************************** Begin flock Locking ********************************
! 24990: **
! 24991: ** Use the flock() system call to do file locking.
! 24992: **
! 24993: ** flock() locking is like dot-file locking in that the various
! 24994: ** fine-grain locking levels supported by SQLite are collapsed into
! 24995: ** a single exclusive lock. In other words, SHARED, RESERVED, and
! 24996: ** PENDING locks are the same thing as an EXCLUSIVE lock. SQLite
! 24997: ** still works when you do this, but concurrency is reduced since
! 24998: ** only a single process can be reading the database at a time.
! 24999: **
! 25000: ** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off or if
! 25001: ** compiling for VXWORKS.
1.2 misho 25002: */
1.2.2.1 ! misho 25003: #if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS
1.2 misho 25004:
25005: /*
1.2.2.1 ! misho 25006: ** Retry flock() calls that fail with EINTR
1.2 misho 25007: */
1.2.2.1 ! misho 25008: #ifdef EINTR
! 25009: static int robust_flock(int fd, int op){
! 25010: int rc;
! 25011: do{ rc = flock(fd,op); }while( rc<0 && errno==EINTR );
! 25012: return rc;
! 25013: }
! 25014: #else
! 25015: # define robust_flock(a,b) flock(a,b)
1.2 misho 25016: #endif
1.2.2.1 ! misho 25017:
1.2 misho 25018:
25019: /*
1.2.2.1 ! misho 25020: ** This routine checks if there is a RESERVED lock held on the specified
! 25021: ** file by this or any other process. If such a lock is held, set *pResOut
! 25022: ** to a non-zero value otherwise *pResOut is set to zero. The return value
! 25023: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
1.2 misho 25024: */
1.2.2.1 ! misho 25025: static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){
! 25026: int rc = SQLITE_OK;
! 25027: int reserved = 0;
! 25028: unixFile *pFile = (unixFile*)id;
! 25029:
! 25030: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
! 25031:
! 25032: assert( pFile );
! 25033:
! 25034: /* Check if a thread in this process holds such a lock */
! 25035: if( pFile->eFileLock>SHARED_LOCK ){
! 25036: reserved = 1;
! 25037: }
! 25038:
! 25039: /* Otherwise see if some other process holds it. */
! 25040: if( !reserved ){
! 25041: /* attempt to get the lock */
! 25042: int lrc = robust_flock(pFile->h, LOCK_EX | LOCK_NB);
! 25043: if( !lrc ){
! 25044: /* got the lock, unlock it */
! 25045: lrc = robust_flock(pFile->h, LOCK_UN);
! 25046: if ( lrc ) {
! 25047: int tErrno = errno;
! 25048: /* unlock failed with an error */
! 25049: lrc = SQLITE_IOERR_UNLOCK;
! 25050: if( IS_LOCK_ERROR(lrc) ){
! 25051: pFile->lastErrno = tErrno;
! 25052: rc = lrc;
! 25053: }
! 25054: }
! 25055: } else {
! 25056: int tErrno = errno;
! 25057: reserved = 1;
! 25058: /* someone else might have it reserved */
! 25059: lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 25060: if( IS_LOCK_ERROR(lrc) ){
! 25061: pFile->lastErrno = tErrno;
! 25062: rc = lrc;
! 25063: }
! 25064: }
! 25065: }
! 25066: OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved));
1.2 misho 25067:
1.2.2.1 ! misho 25068: #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
! 25069: if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
! 25070: rc = SQLITE_OK;
! 25071: reserved=1;
! 25072: }
! 25073: #endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
! 25074: *pResOut = reserved;
! 25075: return rc;
! 25076: }
1.2 misho 25077:
25078: /*
1.2.2.1 ! misho 25079: ** Lock the file with the lock specified by parameter eFileLock - one
! 25080: ** of the following:
1.2 misho 25081: **
1.2.2.1 ! misho 25082: ** (1) SHARED_LOCK
! 25083: ** (2) RESERVED_LOCK
! 25084: ** (3) PENDING_LOCK
! 25085: ** (4) EXCLUSIVE_LOCK
1.2 misho 25086: **
1.2.2.1 ! misho 25087: ** Sometimes when requesting one lock state, additional lock states
! 25088: ** are inserted in between. The locking might fail on one of the later
! 25089: ** transitions leaving the lock state different from what it started but
! 25090: ** still short of its goal. The following chart shows the allowed
! 25091: ** transitions and the inserted intermediate states:
1.2 misho 25092: **
1.2.2.1 ! misho 25093: ** UNLOCKED -> SHARED
! 25094: ** SHARED -> RESERVED
! 25095: ** SHARED -> (PENDING) -> EXCLUSIVE
! 25096: ** RESERVED -> (PENDING) -> EXCLUSIVE
! 25097: ** PENDING -> EXCLUSIVE
1.2 misho 25098: **
1.2.2.1 ! misho 25099: ** flock() only really support EXCLUSIVE locks. We track intermediate
! 25100: ** lock states in the sqlite3_file structure, but all locks SHARED or
! 25101: ** above are really EXCLUSIVE locks and exclude all other processes from
! 25102: ** access the file.
1.2 misho 25103: **
1.2.2.1 ! misho 25104: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
! 25105: ** routine to lower a locking level.
1.2 misho 25106: */
1.2.2.1 ! misho 25107: static int flockLock(sqlite3_file *id, int eFileLock) {
! 25108: int rc = SQLITE_OK;
! 25109: unixFile *pFile = (unixFile*)id;
1.2 misho 25110:
1.2.2.1 ! misho 25111: assert( pFile );
1.2 misho 25112:
1.2.2.1 ! misho 25113: /* if we already have a lock, it is exclusive.
! 25114: ** Just adjust level and punt on outta here. */
! 25115: if (pFile->eFileLock > NO_LOCK) {
! 25116: pFile->eFileLock = eFileLock;
! 25117: return SQLITE_OK;
! 25118: }
! 25119:
! 25120: /* grab an exclusive lock */
! 25121:
! 25122: if (robust_flock(pFile->h, LOCK_EX | LOCK_NB)) {
! 25123: int tErrno = errno;
! 25124: /* didn't get, must be busy */
! 25125: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK);
! 25126: if( IS_LOCK_ERROR(rc) ){
! 25127: pFile->lastErrno = tErrno;
! 25128: }
! 25129: } else {
! 25130: /* got it, set the type and return ok */
! 25131: pFile->eFileLock = eFileLock;
! 25132: }
! 25133: OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock),
! 25134: rc==SQLITE_OK ? "ok" : "failed"));
! 25135: #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
! 25136: if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){
! 25137: rc = SQLITE_BUSY;
! 25138: }
! 25139: #endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
! 25140: return rc;
! 25141: }
1.2 misho 25142:
25143:
25144: /*
1.2.2.1 ! misho 25145: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
! 25146: ** must be either NO_LOCK or SHARED_LOCK.
1.2 misho 25147: **
1.2.2.1 ! misho 25148: ** If the locking level of the file descriptor is already at or below
! 25149: ** the requested locking level, this routine is a no-op.
1.2 misho 25150: */
1.2.2.1 ! misho 25151: static int flockUnlock(sqlite3_file *id, int eFileLock) {
! 25152: unixFile *pFile = (unixFile*)id;
! 25153:
! 25154: assert( pFile );
! 25155: OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock,
! 25156: pFile->eFileLock, getpid()));
! 25157: assert( eFileLock<=SHARED_LOCK );
! 25158:
! 25159: /* no-op if possible */
! 25160: if( pFile->eFileLock==eFileLock ){
! 25161: return SQLITE_OK;
! 25162: }
! 25163:
! 25164: /* shared can just be set because we always have an exclusive */
! 25165: if (eFileLock==SHARED_LOCK) {
! 25166: pFile->eFileLock = eFileLock;
! 25167: return SQLITE_OK;
! 25168: }
! 25169:
! 25170: /* no, really, unlock. */
! 25171: if( robust_flock(pFile->h, LOCK_UN) ){
! 25172: #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS
! 25173: return SQLITE_OK;
! 25174: #endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */
! 25175: return SQLITE_IOERR_UNLOCK;
! 25176: }else{
! 25177: pFile->eFileLock = NO_LOCK;
! 25178: return SQLITE_OK;
! 25179: }
! 25180: }
1.2 misho 25181:
25182: /*
1.2.2.1 ! misho 25183: ** Close a file.
1.2 misho 25184: */
1.2.2.1 ! misho 25185: static int flockClose(sqlite3_file *id) {
! 25186: int rc = SQLITE_OK;
! 25187: if( id ){
! 25188: flockUnlock(id, NO_LOCK);
! 25189: rc = closeUnixFile(id);
1.2 misho 25190: }
1.2.2.1 ! misho 25191: return rc;
! 25192: }
1.2 misho 25193:
1.2.2.1 ! misho 25194: #endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */
1.2 misho 25195:
1.2.2.1 ! misho 25196: /******************* End of the flock lock implementation *********************
! 25197: ******************************************************************************/
1.2 misho 25198:
1.2.2.1 ! misho 25199: /******************************************************************************
! 25200: ************************ Begin Named Semaphore Locking ************************
! 25201: **
! 25202: ** Named semaphore locking is only supported on VxWorks.
! 25203: **
! 25204: ** Semaphore locking is like dot-lock and flock in that it really only
! 25205: ** supports EXCLUSIVE locking. Only a single process can read or write
! 25206: ** the database file at a time. This reduces potential concurrency, but
! 25207: ** makes the lock implementation much easier.
! 25208: */
! 25209: #if OS_VXWORKS
1.2 misho 25210:
1.2.2.1 ! misho 25211: /*
! 25212: ** This routine checks if there is a RESERVED lock held on the specified
! 25213: ** file by this or any other process. If such a lock is held, set *pResOut
! 25214: ** to a non-zero value otherwise *pResOut is set to zero. The return value
! 25215: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
! 25216: */
! 25217: static int semCheckReservedLock(sqlite3_file *id, int *pResOut) {
! 25218: int rc = SQLITE_OK;
! 25219: int reserved = 0;
! 25220: unixFile *pFile = (unixFile*)id;
1.2 misho 25221:
1.2.2.1 ! misho 25222: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
! 25223:
! 25224: assert( pFile );
1.2 misho 25225:
1.2.2.1 ! misho 25226: /* Check if a thread in this process holds such a lock */
! 25227: if( pFile->eFileLock>SHARED_LOCK ){
! 25228: reserved = 1;
1.2 misho 25229: }
1.2.2.1 ! misho 25230:
! 25231: /* Otherwise see if some other process holds it. */
! 25232: if( !reserved ){
! 25233: sem_t *pSem = pFile->pInode->pSem;
! 25234: struct stat statBuf;
1.2 misho 25235:
1.2.2.1 ! misho 25236: if( sem_trywait(pSem)==-1 ){
! 25237: int tErrno = errno;
! 25238: if( EAGAIN != tErrno ){
! 25239: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK);
! 25240: pFile->lastErrno = tErrno;
! 25241: } else {
! 25242: /* someone else has the lock when we are in NO_LOCK */
! 25243: reserved = (pFile->eFileLock < SHARED_LOCK);
! 25244: }
! 25245: }else{
! 25246: /* we could have it if we want it */
! 25247: sem_post(pSem);
! 25248: }
! 25249: }
! 25250: OSTRACE(("TEST WR-LOCK %d %d %d (sem)\n", pFile->h, rc, reserved));
1.2 misho 25251:
1.2.2.1 ! misho 25252: *pResOut = reserved;
! 25253: return rc;
! 25254: }
1.2 misho 25255:
25256: /*
25257: ** Lock the file with the lock specified by parameter eFileLock - one
25258: ** of the following:
25259: **
25260: ** (1) SHARED_LOCK
25261: ** (2) RESERVED_LOCK
25262: ** (3) PENDING_LOCK
25263: ** (4) EXCLUSIVE_LOCK
25264: **
25265: ** Sometimes when requesting one lock state, additional lock states
25266: ** are inserted in between. The locking might fail on one of the later
25267: ** transitions leaving the lock state different from what it started but
25268: ** still short of its goal. The following chart shows the allowed
25269: ** transitions and the inserted intermediate states:
25270: **
25271: ** UNLOCKED -> SHARED
25272: ** SHARED -> RESERVED
25273: ** SHARED -> (PENDING) -> EXCLUSIVE
25274: ** RESERVED -> (PENDING) -> EXCLUSIVE
25275: ** PENDING -> EXCLUSIVE
25276: **
25277: ** Semaphore locks only really support EXCLUSIVE locks. We track intermediate
25278: ** lock states in the sqlite3_file structure, but all locks SHARED or
25279: ** above are really EXCLUSIVE locks and exclude all other processes from
25280: ** access the file.
25281: **
25282: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
25283: ** routine to lower a locking level.
25284: */
25285: static int semLock(sqlite3_file *id, int eFileLock) {
25286: unixFile *pFile = (unixFile*)id;
25287: int fd;
25288: sem_t *pSem = pFile->pInode->pSem;
25289: int rc = SQLITE_OK;
25290:
25291: /* if we already have a lock, it is exclusive.
25292: ** Just adjust level and punt on outta here. */
25293: if (pFile->eFileLock > NO_LOCK) {
25294: pFile->eFileLock = eFileLock;
25295: rc = SQLITE_OK;
25296: goto sem_end_lock;
25297: }
25298:
25299: /* lock semaphore now but bail out when already locked. */
25300: if( sem_trywait(pSem)==-1 ){
25301: rc = SQLITE_BUSY;
25302: goto sem_end_lock;
25303: }
25304:
25305: /* got it, set the type and return ok */
25306: pFile->eFileLock = eFileLock;
25307:
25308: sem_end_lock:
25309: return rc;
25310: }
25311:
25312: /*
25313: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
25314: ** must be either NO_LOCK or SHARED_LOCK.
25315: **
25316: ** If the locking level of the file descriptor is already at or below
25317: ** the requested locking level, this routine is a no-op.
25318: */
25319: static int semUnlock(sqlite3_file *id, int eFileLock) {
25320: unixFile *pFile = (unixFile*)id;
25321: sem_t *pSem = pFile->pInode->pSem;
25322:
25323: assert( pFile );
25324: assert( pSem );
25325: OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock,
1.2.2.1 ! misho 25326: pFile->eFileLock, getpid()));
1.2 misho 25327: assert( eFileLock<=SHARED_LOCK );
25328:
25329: /* no-op if possible */
25330: if( pFile->eFileLock==eFileLock ){
25331: return SQLITE_OK;
25332: }
25333:
25334: /* shared can just be set because we always have an exclusive */
25335: if (eFileLock==SHARED_LOCK) {
25336: pFile->eFileLock = eFileLock;
25337: return SQLITE_OK;
25338: }
25339:
25340: /* no, really unlock. */
25341: if ( sem_post(pSem)==-1 ) {
25342: int rc, tErrno = errno;
25343: rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK);
25344: if( IS_LOCK_ERROR(rc) ){
25345: pFile->lastErrno = tErrno;
25346: }
25347: return rc;
25348: }
25349: pFile->eFileLock = NO_LOCK;
25350: return SQLITE_OK;
25351: }
25352:
25353: /*
25354: ** Close a file.
25355: */
25356: static int semClose(sqlite3_file *id) {
25357: if( id ){
25358: unixFile *pFile = (unixFile*)id;
25359: semUnlock(id, NO_LOCK);
25360: assert( pFile );
25361: unixEnterMutex();
25362: releaseInodeInfo(pFile);
25363: unixLeaveMutex();
25364: closeUnixFile(id);
25365: }
25366: return SQLITE_OK;
25367: }
25368:
25369: #endif /* OS_VXWORKS */
25370: /*
25371: ** Named semaphore locking is only available on VxWorks.
25372: **
25373: *************** End of the named semaphore lock implementation ****************
25374: ******************************************************************************/
25375:
25376:
25377: /******************************************************************************
25378: *************************** Begin AFP Locking *********************************
25379: **
25380: ** AFP is the Apple Filing Protocol. AFP is a network filesystem found
25381: ** on Apple Macintosh computers - both OS9 and OSX.
25382: **
25383: ** Third-party implementations of AFP are available. But this code here
25384: ** only works on OSX.
25385: */
25386:
25387: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25388: /*
25389: ** The afpLockingContext structure contains all afp lock specific state
25390: */
25391: typedef struct afpLockingContext afpLockingContext;
25392: struct afpLockingContext {
25393: int reserved;
25394: const char *dbPath; /* Name of the open file */
25395: };
25396:
25397: struct ByteRangeLockPB2
25398: {
25399: unsigned long long offset; /* offset to first byte to lock */
25400: unsigned long long length; /* nbr of bytes to lock */
25401: unsigned long long retRangeStart; /* nbr of 1st byte locked if successful */
25402: unsigned char unLockFlag; /* 1 = unlock, 0 = lock */
25403: unsigned char startEndFlag; /* 1=rel to end of fork, 0=rel to start */
25404: int fd; /* file desc to assoc this lock with */
25405: };
25406:
25407: #define afpfsByteRangeLock2FSCTL _IOWR('z', 23, struct ByteRangeLockPB2)
25408:
25409: /*
25410: ** This is a utility for setting or clearing a bit-range lock on an
25411: ** AFP filesystem.
25412: **
25413: ** Return SQLITE_OK on success, SQLITE_BUSY on failure.
25414: */
25415: static int afpSetLock(
25416: const char *path, /* Name of the file to be locked or unlocked */
25417: unixFile *pFile, /* Open file descriptor on path */
25418: unsigned long long offset, /* First byte to be locked */
25419: unsigned long long length, /* Number of bytes to lock */
25420: int setLockFlag /* True to set lock. False to clear lock */
25421: ){
25422: struct ByteRangeLockPB2 pb;
25423: int err;
25424:
25425: pb.unLockFlag = setLockFlag ? 0 : 1;
25426: pb.startEndFlag = 0;
25427: pb.offset = offset;
25428: pb.length = length;
25429: pb.fd = pFile->h;
25430:
25431: OSTRACE(("AFPSETLOCK [%s] for %d%s in range %llx:%llx\n",
25432: (setLockFlag?"ON":"OFF"), pFile->h, (pb.fd==-1?"[testval-1]":""),
25433: offset, length));
25434: err = fsctl(path, afpfsByteRangeLock2FSCTL, &pb, 0);
25435: if ( err==-1 ) {
25436: int rc;
25437: int tErrno = errno;
25438: OSTRACE(("AFPSETLOCK failed to fsctl() '%s' %d %s\n",
25439: path, tErrno, strerror(tErrno)));
25440: #ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS
25441: rc = SQLITE_BUSY;
25442: #else
25443: rc = sqliteErrorFromPosixError(tErrno,
25444: setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK);
25445: #endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */
25446: if( IS_LOCK_ERROR(rc) ){
25447: pFile->lastErrno = tErrno;
25448: }
25449: return rc;
25450: } else {
25451: return SQLITE_OK;
25452: }
25453: }
25454:
25455: /*
25456: ** This routine checks if there is a RESERVED lock held on the specified
25457: ** file by this or any other process. If such a lock is held, set *pResOut
25458: ** to a non-zero value otherwise *pResOut is set to zero. The return value
25459: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
25460: */
25461: static int afpCheckReservedLock(sqlite3_file *id, int *pResOut){
25462: int rc = SQLITE_OK;
25463: int reserved = 0;
25464: unixFile *pFile = (unixFile*)id;
25465: afpLockingContext *context;
25466:
25467: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
25468:
25469: assert( pFile );
25470: context = (afpLockingContext *) pFile->lockingContext;
25471: if( context->reserved ){
25472: *pResOut = 1;
25473: return SQLITE_OK;
25474: }
25475: unixEnterMutex(); /* Because pFile->pInode is shared across threads */
25476:
25477: /* Check if a thread in this process holds such a lock */
25478: if( pFile->pInode->eFileLock>SHARED_LOCK ){
25479: reserved = 1;
25480: }
25481:
25482: /* Otherwise see if some other process holds it.
25483: */
25484: if( !reserved ){
25485: /* lock the RESERVED byte */
25486: int lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1);
25487: if( SQLITE_OK==lrc ){
25488: /* if we succeeded in taking the reserved lock, unlock it to restore
25489: ** the original state */
25490: lrc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0);
25491: } else {
25492: /* if we failed to get the lock then someone else must have it */
25493: reserved = 1;
25494: }
25495: if( IS_LOCK_ERROR(lrc) ){
25496: rc=lrc;
25497: }
25498: }
25499:
25500: unixLeaveMutex();
25501: OSTRACE(("TEST WR-LOCK %d %d %d (afp)\n", pFile->h, rc, reserved));
25502:
25503: *pResOut = reserved;
25504: return rc;
25505: }
25506:
25507: /*
25508: ** Lock the file with the lock specified by parameter eFileLock - one
25509: ** of the following:
25510: **
25511: ** (1) SHARED_LOCK
25512: ** (2) RESERVED_LOCK
25513: ** (3) PENDING_LOCK
25514: ** (4) EXCLUSIVE_LOCK
25515: **
25516: ** Sometimes when requesting one lock state, additional lock states
25517: ** are inserted in between. The locking might fail on one of the later
25518: ** transitions leaving the lock state different from what it started but
25519: ** still short of its goal. The following chart shows the allowed
25520: ** transitions and the inserted intermediate states:
25521: **
25522: ** UNLOCKED -> SHARED
25523: ** SHARED -> RESERVED
25524: ** SHARED -> (PENDING) -> EXCLUSIVE
25525: ** RESERVED -> (PENDING) -> EXCLUSIVE
25526: ** PENDING -> EXCLUSIVE
25527: **
25528: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
25529: ** routine to lower a locking level.
25530: */
25531: static int afpLock(sqlite3_file *id, int eFileLock){
25532: int rc = SQLITE_OK;
25533: unixFile *pFile = (unixFile*)id;
25534: unixInodeInfo *pInode = pFile->pInode;
25535: afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
25536:
25537: assert( pFile );
25538: OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h,
25539: azFileLock(eFileLock), azFileLock(pFile->eFileLock),
25540: azFileLock(pInode->eFileLock), pInode->nShared , getpid()));
25541:
25542: /* If there is already a lock of this type or more restrictive on the
25543: ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as
25544: ** unixEnterMutex() hasn't been called yet.
25545: */
25546: if( pFile->eFileLock>=eFileLock ){
25547: OSTRACE(("LOCK %d %s ok (already held) (afp)\n", pFile->h,
25548: azFileLock(eFileLock)));
25549: return SQLITE_OK;
25550: }
25551:
25552: /* Make sure the locking sequence is correct
25553: ** (1) We never move from unlocked to anything higher than shared lock.
25554: ** (2) SQLite never explicitly requests a pendig lock.
25555: ** (3) A shared lock is always held when a reserve lock is requested.
25556: */
25557: assert( pFile->eFileLock!=NO_LOCK || eFileLock==SHARED_LOCK );
25558: assert( eFileLock!=PENDING_LOCK );
25559: assert( eFileLock!=RESERVED_LOCK || pFile->eFileLock==SHARED_LOCK );
25560:
25561: /* This mutex is needed because pFile->pInode is shared across threads
25562: */
25563: unixEnterMutex();
25564: pInode = pFile->pInode;
25565:
25566: /* If some thread using this PID has a lock via a different unixFile*
25567: ** handle that precludes the requested lock, return BUSY.
25568: */
25569: if( (pFile->eFileLock!=pInode->eFileLock &&
25570: (pInode->eFileLock>=PENDING_LOCK || eFileLock>SHARED_LOCK))
25571: ){
25572: rc = SQLITE_BUSY;
25573: goto afp_end_lock;
25574: }
25575:
25576: /* If a SHARED lock is requested, and some thread using this PID already
25577: ** has a SHARED or RESERVED lock, then increment reference counts and
25578: ** return SQLITE_OK.
25579: */
25580: if( eFileLock==SHARED_LOCK &&
25581: (pInode->eFileLock==SHARED_LOCK || pInode->eFileLock==RESERVED_LOCK) ){
25582: assert( eFileLock==SHARED_LOCK );
25583: assert( pFile->eFileLock==0 );
25584: assert( pInode->nShared>0 );
25585: pFile->eFileLock = SHARED_LOCK;
25586: pInode->nShared++;
25587: pInode->nLock++;
25588: goto afp_end_lock;
25589: }
25590:
25591: /* A PENDING lock is needed before acquiring a SHARED lock and before
25592: ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will
25593: ** be released.
25594: */
25595: if( eFileLock==SHARED_LOCK
25596: || (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
25597: ){
25598: int failed;
25599: failed = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 1);
25600: if (failed) {
25601: rc = failed;
25602: goto afp_end_lock;
25603: }
25604: }
25605:
25606: /* If control gets to this point, then actually go ahead and make
25607: ** operating system calls for the specified lock.
25608: */
25609: if( eFileLock==SHARED_LOCK ){
25610: int lrc1, lrc2, lrc1Errno = 0;
25611: long lk, mask;
25612:
25613: assert( pInode->nShared==0 );
25614: assert( pInode->eFileLock==0 );
25615:
25616: mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff;
25617: /* Now get the read-lock SHARED_LOCK */
25618: /* note that the quality of the randomness doesn't matter that much */
25619: lk = random();
25620: pInode->sharedByte = (lk & mask)%(SHARED_SIZE - 1);
25621: lrc1 = afpSetLock(context->dbPath, pFile,
25622: SHARED_FIRST+pInode->sharedByte, 1, 1);
25623: if( IS_LOCK_ERROR(lrc1) ){
25624: lrc1Errno = pFile->lastErrno;
25625: }
25626: /* Drop the temporary PENDING lock */
25627: lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0);
25628:
25629: if( IS_LOCK_ERROR(lrc1) ) {
25630: pFile->lastErrno = lrc1Errno;
25631: rc = lrc1;
25632: goto afp_end_lock;
25633: } else if( IS_LOCK_ERROR(lrc2) ){
25634: rc = lrc2;
25635: goto afp_end_lock;
25636: } else if( lrc1 != SQLITE_OK ) {
25637: rc = lrc1;
25638: } else {
25639: pFile->eFileLock = SHARED_LOCK;
25640: pInode->nLock++;
25641: pInode->nShared = 1;
25642: }
25643: }else if( eFileLock==EXCLUSIVE_LOCK && pInode->nShared>1 ){
25644: /* We are trying for an exclusive lock but another thread in this
25645: ** same process is still holding a shared lock. */
25646: rc = SQLITE_BUSY;
25647: }else{
25648: /* The request was for a RESERVED or EXCLUSIVE lock. It is
25649: ** assumed that there is a SHARED or greater lock on the file
25650: ** already.
25651: */
25652: int failed = 0;
25653: assert( 0!=pFile->eFileLock );
25654: if (eFileLock >= RESERVED_LOCK && pFile->eFileLock < RESERVED_LOCK) {
25655: /* Acquire a RESERVED lock */
25656: failed = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1,1);
25657: if( !failed ){
25658: context->reserved = 1;
25659: }
25660: }
25661: if (!failed && eFileLock == EXCLUSIVE_LOCK) {
25662: /* Acquire an EXCLUSIVE lock */
25663:
25664: /* Remove the shared lock before trying the range. we'll need to
25665: ** reestablish the shared lock if we can't get the afpUnlock
25666: */
25667: if( !(failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST +
25668: pInode->sharedByte, 1, 0)) ){
25669: int failed2 = SQLITE_OK;
25670: /* now attemmpt to get the exclusive lock range */
25671: failed = afpSetLock(context->dbPath, pFile, SHARED_FIRST,
25672: SHARED_SIZE, 1);
25673: if( failed && (failed2 = afpSetLock(context->dbPath, pFile,
25674: SHARED_FIRST + pInode->sharedByte, 1, 1)) ){
25675: /* Can't reestablish the shared lock. Sqlite can't deal, this is
25676: ** a critical I/O error
25677: */
25678: rc = ((failed & SQLITE_IOERR) == SQLITE_IOERR) ? failed2 :
25679: SQLITE_IOERR_LOCK;
25680: goto afp_end_lock;
25681: }
25682: }else{
25683: rc = failed;
25684: }
25685: }
25686: if( failed ){
25687: rc = failed;
25688: }
25689: }
25690:
25691: if( rc==SQLITE_OK ){
25692: pFile->eFileLock = eFileLock;
25693: pInode->eFileLock = eFileLock;
25694: }else if( eFileLock==EXCLUSIVE_LOCK ){
25695: pFile->eFileLock = PENDING_LOCK;
25696: pInode->eFileLock = PENDING_LOCK;
25697: }
25698:
25699: afp_end_lock:
25700: unixLeaveMutex();
25701: OSTRACE(("LOCK %d %s %s (afp)\n", pFile->h, azFileLock(eFileLock),
25702: rc==SQLITE_OK ? "ok" : "failed"));
25703: return rc;
25704: }
25705:
25706: /*
25707: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
25708: ** must be either NO_LOCK or SHARED_LOCK.
25709: **
25710: ** If the locking level of the file descriptor is already at or below
25711: ** the requested locking level, this routine is a no-op.
25712: */
25713: static int afpUnlock(sqlite3_file *id, int eFileLock) {
25714: int rc = SQLITE_OK;
25715: unixFile *pFile = (unixFile*)id;
25716: unixInodeInfo *pInode;
25717: afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
25718: int skipShared = 0;
25719: #ifdef SQLITE_TEST
25720: int h = pFile->h;
25721: #endif
25722:
25723: assert( pFile );
25724: OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock,
25725: pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared,
25726: getpid()));
25727:
25728: assert( eFileLock<=SHARED_LOCK );
25729: if( pFile->eFileLock<=eFileLock ){
25730: return SQLITE_OK;
25731: }
25732: unixEnterMutex();
25733: pInode = pFile->pInode;
25734: assert( pInode->nShared!=0 );
25735: if( pFile->eFileLock>SHARED_LOCK ){
25736: assert( pInode->eFileLock==pFile->eFileLock );
25737: SimulateIOErrorBenign(1);
25738: SimulateIOError( h=(-1) )
25739: SimulateIOErrorBenign(0);
25740:
1.2.2.1 ! misho 25741: #ifdef SQLITE_DEBUG
1.2 misho 25742: /* When reducing a lock such that other processes can start
25743: ** reading the database file again, make sure that the
25744: ** transaction counter was updated if any part of the database
25745: ** file changed. If the transaction counter is not updated,
25746: ** other connections to the same file might not realize that
25747: ** the file has changed and hence might not know to flush their
25748: ** cache. The use of a stale cache can lead to database corruption.
25749: */
25750: assert( pFile->inNormalWrite==0
25751: || pFile->dbUpdate==0
25752: || pFile->transCntrChng==1 );
25753: pFile->inNormalWrite = 0;
25754: #endif
25755:
25756: if( pFile->eFileLock==EXCLUSIVE_LOCK ){
25757: rc = afpSetLock(context->dbPath, pFile, SHARED_FIRST, SHARED_SIZE, 0);
25758: if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1) ){
25759: /* only re-establish the shared lock if necessary */
25760: int sharedLockByte = SHARED_FIRST+pInode->sharedByte;
25761: rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 1);
25762: } else {
25763: skipShared = 1;
25764: }
25765: }
25766: if( rc==SQLITE_OK && pFile->eFileLock>=PENDING_LOCK ){
25767: rc = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0);
25768: }
25769: if( rc==SQLITE_OK && pFile->eFileLock>=RESERVED_LOCK && context->reserved ){
25770: rc = afpSetLock(context->dbPath, pFile, RESERVED_BYTE, 1, 0);
25771: if( !rc ){
25772: context->reserved = 0;
25773: }
25774: }
25775: if( rc==SQLITE_OK && (eFileLock==SHARED_LOCK || pInode->nShared>1)){
25776: pInode->eFileLock = SHARED_LOCK;
25777: }
25778: }
25779: if( rc==SQLITE_OK && eFileLock==NO_LOCK ){
25780:
25781: /* Decrement the shared lock counter. Release the lock using an
25782: ** OS call only when all threads in this same process have released
25783: ** the lock.
25784: */
25785: unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte;
25786: pInode->nShared--;
25787: if( pInode->nShared==0 ){
25788: SimulateIOErrorBenign(1);
25789: SimulateIOError( h=(-1) )
25790: SimulateIOErrorBenign(0);
25791: if( !skipShared ){
25792: rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0);
25793: }
25794: if( !rc ){
25795: pInode->eFileLock = NO_LOCK;
25796: pFile->eFileLock = NO_LOCK;
25797: }
25798: }
25799: if( rc==SQLITE_OK ){
25800: pInode->nLock--;
25801: assert( pInode->nLock>=0 );
25802: if( pInode->nLock==0 ){
25803: closePendingFds(pFile);
25804: }
25805: }
25806: }
25807:
25808: unixLeaveMutex();
25809: if( rc==SQLITE_OK ) pFile->eFileLock = eFileLock;
25810: return rc;
25811: }
25812:
25813: /*
25814: ** Close a file & cleanup AFP specific locking context
25815: */
25816: static int afpClose(sqlite3_file *id) {
25817: int rc = SQLITE_OK;
25818: if( id ){
25819: unixFile *pFile = (unixFile*)id;
25820: afpUnlock(id, NO_LOCK);
25821: unixEnterMutex();
25822: if( pFile->pInode && pFile->pInode->nLock ){
25823: /* If there are outstanding locks, do not actually close the file just
25824: ** yet because that would clear those locks. Instead, add the file
25825: ** descriptor to pInode->aPending. It will be automatically closed when
25826: ** the last lock is cleared.
25827: */
25828: setPendingFd(pFile);
25829: }
25830: releaseInodeInfo(pFile);
25831: sqlite3_free(pFile->lockingContext);
25832: rc = closeUnixFile(id);
25833: unixLeaveMutex();
25834: }
25835: return rc;
25836: }
25837:
25838: #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
25839: /*
25840: ** The code above is the AFP lock implementation. The code is specific
25841: ** to MacOSX and does not work on other unix platforms. No alternative
25842: ** is available. If you don't compile for a mac, then the "unix-afp"
25843: ** VFS is not available.
25844: **
25845: ********************* End of the AFP lock implementation **********************
25846: ******************************************************************************/
25847:
25848: /******************************************************************************
25849: *************************** Begin NFS Locking ********************************/
25850:
25851: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
25852: /*
25853: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
25854: ** must be either NO_LOCK or SHARED_LOCK.
25855: **
25856: ** If the locking level of the file descriptor is already at or below
25857: ** the requested locking level, this routine is a no-op.
25858: */
25859: static int nfsUnlock(sqlite3_file *id, int eFileLock){
25860: return posixUnlock(id, eFileLock, 1);
25861: }
25862:
25863: #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
25864: /*
25865: ** The code above is the NFS lock implementation. The code is specific
25866: ** to MacOSX and does not work on other unix platforms. No alternative
25867: ** is available.
25868: **
25869: ********************* End of the NFS lock implementation **********************
25870: ******************************************************************************/
25871:
25872: /******************************************************************************
25873: **************** Non-locking sqlite3_file methods *****************************
25874: **
25875: ** The next division contains implementations for all methods of the
25876: ** sqlite3_file object other than the locking methods. The locking
25877: ** methods were defined in divisions above (one locking method per
25878: ** division). Those methods that are common to all locking modes
25879: ** are gather together into this division.
25880: */
25881:
25882: /*
25883: ** Seek to the offset passed as the second argument, then read cnt
25884: ** bytes into pBuf. Return the number of bytes actually read.
25885: **
25886: ** NB: If you define USE_PREAD or USE_PREAD64, then it might also
25887: ** be necessary to define _XOPEN_SOURCE to be 500. This varies from
25888: ** one system to another. Since SQLite does not define USE_PREAD
25889: ** any any form by default, we will not attempt to define _XOPEN_SOURCE.
25890: ** See tickets #2741 and #2681.
25891: **
25892: ** To avoid stomping the errno value on a failed read the lastErrno value
25893: ** is set before returning.
25894: */
25895: static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){
25896: int got;
25897: int prior = 0;
25898: #if (!defined(USE_PREAD) && !defined(USE_PREAD64))
25899: i64 newOffset;
25900: #endif
25901: TIMER_START;
1.2.2.1 ! misho 25902: assert( cnt==(cnt&0x1ffff) );
! 25903: cnt &= 0x1ffff;
1.2 misho 25904: do{
25905: #if defined(USE_PREAD)
25906: got = osPread(id->h, pBuf, cnt, offset);
25907: SimulateIOError( got = -1 );
25908: #elif defined(USE_PREAD64)
25909: got = osPread64(id->h, pBuf, cnt, offset);
25910: SimulateIOError( got = -1 );
25911: #else
25912: newOffset = lseek(id->h, offset, SEEK_SET);
25913: SimulateIOError( newOffset-- );
25914: if( newOffset!=offset ){
25915: if( newOffset == -1 ){
25916: ((unixFile*)id)->lastErrno = errno;
25917: }else{
1.2.2.1 ! misho 25918: ((unixFile*)id)->lastErrno = 0;
1.2 misho 25919: }
25920: return -1;
25921: }
25922: got = osRead(id->h, pBuf, cnt);
25923: #endif
25924: if( got==cnt ) break;
25925: if( got<0 ){
25926: if( errno==EINTR ){ got = 1; continue; }
25927: prior = 0;
25928: ((unixFile*)id)->lastErrno = errno;
25929: break;
25930: }else if( got>0 ){
25931: cnt -= got;
25932: offset += got;
25933: prior += got;
25934: pBuf = (void*)(got + (char*)pBuf);
25935: }
25936: }while( got>0 );
25937: TIMER_END;
25938: OSTRACE(("READ %-3d %5d %7lld %llu\n",
25939: id->h, got+prior, offset-prior, TIMER_ELAPSED));
25940: return got+prior;
25941: }
25942:
25943: /*
25944: ** Read data from a file into a buffer. Return SQLITE_OK if all
25945: ** bytes were read successfully and SQLITE_IOERR if anything goes
25946: ** wrong.
25947: */
25948: static int unixRead(
25949: sqlite3_file *id,
25950: void *pBuf,
25951: int amt,
25952: sqlite3_int64 offset
25953: ){
25954: unixFile *pFile = (unixFile *)id;
25955: int got;
25956: assert( id );
25957:
25958: /* If this is a database file (not a journal, master-journal or temp
25959: ** file), the bytes in the locking range should never be read or written. */
25960: #if 0
25961: assert( pFile->pUnused==0
25962: || offset>=PENDING_BYTE+512
25963: || offset+amt<=PENDING_BYTE
25964: );
25965: #endif
25966:
25967: got = seekAndRead(pFile, offset, pBuf, amt);
25968: if( got==amt ){
25969: return SQLITE_OK;
25970: }else if( got<0 ){
25971: /* lastErrno set by seekAndRead */
25972: return SQLITE_IOERR_READ;
25973: }else{
25974: pFile->lastErrno = 0; /* not a system error */
25975: /* Unread parts of the buffer must be zero-filled */
25976: memset(&((char*)pBuf)[got], 0, amt-got);
25977: return SQLITE_IOERR_SHORT_READ;
25978: }
25979: }
25980:
25981: /*
25982: ** Seek to the offset in id->offset then read cnt bytes into pBuf.
25983: ** Return the number of bytes actually read. Update the offset.
25984: **
25985: ** To avoid stomping the errno value on a failed write the lastErrno value
25986: ** is set before returning.
25987: */
25988: static int seekAndWrite(unixFile *id, i64 offset, const void *pBuf, int cnt){
25989: int got;
25990: #if (!defined(USE_PREAD) && !defined(USE_PREAD64))
25991: i64 newOffset;
25992: #endif
1.2.2.1 ! misho 25993: assert( cnt==(cnt&0x1ffff) );
! 25994: cnt &= 0x1ffff;
1.2 misho 25995: TIMER_START;
25996: #if defined(USE_PREAD)
25997: do{ got = osPwrite(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR );
25998: #elif defined(USE_PREAD64)
25999: do{ got = osPwrite64(id->h, pBuf, cnt, offset);}while( got<0 && errno==EINTR);
26000: #else
26001: do{
26002: newOffset = lseek(id->h, offset, SEEK_SET);
26003: SimulateIOError( newOffset-- );
26004: if( newOffset!=offset ){
26005: if( newOffset == -1 ){
26006: ((unixFile*)id)->lastErrno = errno;
26007: }else{
1.2.2.1 ! misho 26008: ((unixFile*)id)->lastErrno = 0;
1.2 misho 26009: }
26010: return -1;
26011: }
26012: got = osWrite(id->h, pBuf, cnt);
26013: }while( got<0 && errno==EINTR );
26014: #endif
26015: TIMER_END;
26016: if( got<0 ){
26017: ((unixFile*)id)->lastErrno = errno;
26018: }
26019:
26020: OSTRACE(("WRITE %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED));
26021: return got;
26022: }
26023:
26024:
26025: /*
26026: ** Write data from a buffer into a file. Return SQLITE_OK on success
26027: ** or some other error code on failure.
26028: */
26029: static int unixWrite(
26030: sqlite3_file *id,
26031: const void *pBuf,
26032: int amt,
26033: sqlite3_int64 offset
26034: ){
26035: unixFile *pFile = (unixFile*)id;
26036: int wrote = 0;
26037: assert( id );
26038: assert( amt>0 );
26039:
26040: /* If this is a database file (not a journal, master-journal or temp
26041: ** file), the bytes in the locking range should never be read or written. */
26042: #if 0
26043: assert( pFile->pUnused==0
26044: || offset>=PENDING_BYTE+512
26045: || offset+amt<=PENDING_BYTE
26046: );
26047: #endif
26048:
1.2.2.1 ! misho 26049: #ifdef SQLITE_DEBUG
1.2 misho 26050: /* If we are doing a normal write to a database file (as opposed to
26051: ** doing a hot-journal rollback or a write to some file other than a
26052: ** normal database file) then record the fact that the database
26053: ** has changed. If the transaction counter is modified, record that
26054: ** fact too.
26055: */
26056: if( pFile->inNormalWrite ){
26057: pFile->dbUpdate = 1; /* The database has been modified */
26058: if( offset<=24 && offset+amt>=27 ){
26059: int rc;
26060: char oldCntr[4];
26061: SimulateIOErrorBenign(1);
26062: rc = seekAndRead(pFile, 24, oldCntr, 4);
26063: SimulateIOErrorBenign(0);
26064: if( rc!=4 || memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){
26065: pFile->transCntrChng = 1; /* The transaction counter has changed */
26066: }
26067: }
26068: }
26069: #endif
26070:
26071: while( amt>0 && (wrote = seekAndWrite(pFile, offset, pBuf, amt))>0 ){
26072: amt -= wrote;
26073: offset += wrote;
26074: pBuf = &((char*)pBuf)[wrote];
26075: }
26076: SimulateIOError(( wrote=(-1), amt=1 ));
26077: SimulateDiskfullError(( wrote=0, amt=1 ));
26078:
26079: if( amt>0 ){
26080: if( wrote<0 && pFile->lastErrno!=ENOSPC ){
26081: /* lastErrno set by seekAndWrite */
26082: return SQLITE_IOERR_WRITE;
26083: }else{
26084: pFile->lastErrno = 0; /* not a system error */
26085: return SQLITE_FULL;
26086: }
26087: }
26088:
26089: return SQLITE_OK;
26090: }
26091:
26092: #ifdef SQLITE_TEST
26093: /*
26094: ** Count the number of fullsyncs and normal syncs. This is used to test
26095: ** that syncs and fullsyncs are occurring at the right times.
26096: */
26097: SQLITE_API int sqlite3_sync_count = 0;
26098: SQLITE_API int sqlite3_fullsync_count = 0;
26099: #endif
26100:
26101: /*
26102: ** We do not trust systems to provide a working fdatasync(). Some do.
26103: ** Others do no. To be safe, we will stick with the (slightly slower)
26104: ** fsync(). If you know that your system does support fdatasync() correctly,
26105: ** then simply compile with -Dfdatasync=fdatasync
26106: */
26107: #if !defined(fdatasync)
26108: # define fdatasync fsync
26109: #endif
26110:
26111: /*
26112: ** Define HAVE_FULLFSYNC to 0 or 1 depending on whether or not
26113: ** the F_FULLFSYNC macro is defined. F_FULLFSYNC is currently
26114: ** only available on Mac OS X. But that could change.
26115: */
26116: #ifdef F_FULLFSYNC
26117: # define HAVE_FULLFSYNC 1
26118: #else
26119: # define HAVE_FULLFSYNC 0
26120: #endif
26121:
26122:
26123: /*
26124: ** The fsync() system call does not work as advertised on many
26125: ** unix systems. The following procedure is an attempt to make
26126: ** it work better.
26127: **
26128: ** The SQLITE_NO_SYNC macro disables all fsync()s. This is useful
26129: ** for testing when we want to run through the test suite quickly.
26130: ** You are strongly advised *not* to deploy with SQLITE_NO_SYNC
26131: ** enabled, however, since with SQLITE_NO_SYNC enabled, an OS crash
26132: ** or power failure will likely corrupt the database file.
26133: **
26134: ** SQLite sets the dataOnly flag if the size of the file is unchanged.
26135: ** The idea behind dataOnly is that it should only write the file content
26136: ** to disk, not the inode. We only set dataOnly if the file size is
26137: ** unchanged since the file size is part of the inode. However,
26138: ** Ted Ts'o tells us that fdatasync() will also write the inode if the
26139: ** file size has changed. The only real difference between fdatasync()
26140: ** and fsync(), Ted tells us, is that fdatasync() will not flush the
26141: ** inode if the mtime or owner or other inode attributes have changed.
26142: ** We only care about the file size, not the other file attributes, so
26143: ** as far as SQLite is concerned, an fdatasync() is always adequate.
26144: ** So, we always use fdatasync() if it is available, regardless of
26145: ** the value of the dataOnly flag.
26146: */
26147: static int full_fsync(int fd, int fullSync, int dataOnly){
26148: int rc;
26149:
26150: /* The following "ifdef/elif/else/" block has the same structure as
26151: ** the one below. It is replicated here solely to avoid cluttering
26152: ** up the real code with the UNUSED_PARAMETER() macros.
26153: */
26154: #ifdef SQLITE_NO_SYNC
26155: UNUSED_PARAMETER(fd);
26156: UNUSED_PARAMETER(fullSync);
26157: UNUSED_PARAMETER(dataOnly);
26158: #elif HAVE_FULLFSYNC
26159: UNUSED_PARAMETER(dataOnly);
26160: #else
26161: UNUSED_PARAMETER(fullSync);
26162: UNUSED_PARAMETER(dataOnly);
26163: #endif
26164:
26165: /* Record the number of times that we do a normal fsync() and
26166: ** FULLSYNC. This is used during testing to verify that this procedure
26167: ** gets called with the correct arguments.
26168: */
26169: #ifdef SQLITE_TEST
26170: if( fullSync ) sqlite3_fullsync_count++;
26171: sqlite3_sync_count++;
26172: #endif
26173:
26174: /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
26175: ** no-op
26176: */
26177: #ifdef SQLITE_NO_SYNC
26178: rc = SQLITE_OK;
26179: #elif HAVE_FULLFSYNC
26180: if( fullSync ){
26181: rc = osFcntl(fd, F_FULLFSYNC, 0);
26182: }else{
26183: rc = 1;
26184: }
26185: /* If the FULLFSYNC failed, fall back to attempting an fsync().
26186: ** It shouldn't be possible for fullfsync to fail on the local
26187: ** file system (on OSX), so failure indicates that FULLFSYNC
26188: ** isn't supported for this file system. So, attempt an fsync
26189: ** and (for now) ignore the overhead of a superfluous fcntl call.
26190: ** It'd be better to detect fullfsync support once and avoid
26191: ** the fcntl call every time sync is called.
26192: */
26193: if( rc ) rc = fsync(fd);
26194:
26195: #elif defined(__APPLE__)
26196: /* fdatasync() on HFS+ doesn't yet flush the file size if it changed correctly
26197: ** so currently we default to the macro that redefines fdatasync to fsync
26198: */
26199: rc = fsync(fd);
26200: #else
26201: rc = fdatasync(fd);
26202: #if OS_VXWORKS
26203: if( rc==-1 && errno==ENOTSUP ){
26204: rc = fsync(fd);
26205: }
26206: #endif /* OS_VXWORKS */
26207: #endif /* ifdef SQLITE_NO_SYNC elif HAVE_FULLFSYNC */
26208:
26209: if( OS_VXWORKS && rc!= -1 ){
26210: rc = 0;
26211: }
26212: return rc;
26213: }
26214:
26215: /*
26216: ** Open a file descriptor to the directory containing file zFilename.
26217: ** If successful, *pFd is set to the opened file descriptor and
26218: ** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM
26219: ** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined
26220: ** value.
26221: **
26222: ** The directory file descriptor is used for only one thing - to
26223: ** fsync() a directory to make sure file creation and deletion events
26224: ** are flushed to disk. Such fsyncs are not needed on newer
26225: ** journaling filesystems, but are required on older filesystems.
26226: **
26227: ** This routine can be overridden using the xSetSysCall interface.
26228: ** The ability to override this routine was added in support of the
26229: ** chromium sandbox. Opening a directory is a security risk (we are
26230: ** told) so making it overrideable allows the chromium sandbox to
26231: ** replace this routine with a harmless no-op. To make this routine
26232: ** a no-op, replace it with a stub that returns SQLITE_OK but leaves
26233: ** *pFd set to a negative number.
26234: **
26235: ** If SQLITE_OK is returned, the caller is responsible for closing
26236: ** the file descriptor *pFd using close().
26237: */
26238: static int openDirectory(const char *zFilename, int *pFd){
26239: int ii;
26240: int fd = -1;
26241: char zDirname[MAX_PATHNAME+1];
26242:
26243: sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename);
26244: for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--);
26245: if( ii>0 ){
26246: zDirname[ii] = '\0';
26247: fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0);
26248: if( fd>=0 ){
26249: OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname));
26250: }
26251: }
26252: *pFd = fd;
26253: return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname));
26254: }
26255:
26256: /*
26257: ** Make sure all writes to a particular file are committed to disk.
26258: **
26259: ** If dataOnly==0 then both the file itself and its metadata (file
26260: ** size, access time, etc) are synced. If dataOnly!=0 then only the
26261: ** file data is synced.
26262: **
26263: ** Under Unix, also make sure that the directory entry for the file
26264: ** has been created by fsync-ing the directory that contains the file.
26265: ** If we do not do this and we encounter a power failure, the directory
26266: ** entry for the journal might not exist after we reboot. The next
26267: ** SQLite to access the file will not know that the journal exists (because
26268: ** the directory entry for the journal was never created) and the transaction
26269: ** will not roll back - possibly leading to database corruption.
26270: */
26271: static int unixSync(sqlite3_file *id, int flags){
26272: int rc;
26273: unixFile *pFile = (unixFile*)id;
26274:
26275: int isDataOnly = (flags&SQLITE_SYNC_DATAONLY);
26276: int isFullsync = (flags&0x0F)==SQLITE_SYNC_FULL;
26277:
26278: /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
26279: assert((flags&0x0F)==SQLITE_SYNC_NORMAL
26280: || (flags&0x0F)==SQLITE_SYNC_FULL
26281: );
26282:
26283: /* Unix cannot, but some systems may return SQLITE_FULL from here. This
26284: ** line is to test that doing so does not cause any problems.
26285: */
26286: SimulateDiskfullError( return SQLITE_FULL );
26287:
26288: assert( pFile );
26289: OSTRACE(("SYNC %-3d\n", pFile->h));
26290: rc = full_fsync(pFile->h, isFullsync, isDataOnly);
26291: SimulateIOError( rc=1 );
26292: if( rc ){
26293: pFile->lastErrno = errno;
26294: return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath);
26295: }
26296:
26297: /* Also fsync the directory containing the file if the DIRSYNC flag
26298: ** is set. This is a one-time occurrance. Many systems (examples: AIX)
26299: ** are unable to fsync a directory, so ignore errors on the fsync.
26300: */
26301: if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){
26302: int dirfd;
26303: OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath,
26304: HAVE_FULLFSYNC, isFullsync));
26305: rc = osOpenDirectory(pFile->zPath, &dirfd);
26306: if( rc==SQLITE_OK && dirfd>=0 ){
26307: full_fsync(dirfd, 0, 0);
26308: robust_close(pFile, dirfd, __LINE__);
26309: }else if( rc==SQLITE_CANTOPEN ){
26310: rc = SQLITE_OK;
26311: }
26312: pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC;
26313: }
26314: return rc;
26315: }
26316:
26317: /*
26318: ** Truncate an open file to a specified size
26319: */
26320: static int unixTruncate(sqlite3_file *id, i64 nByte){
26321: unixFile *pFile = (unixFile *)id;
26322: int rc;
26323: assert( pFile );
26324: SimulateIOError( return SQLITE_IOERR_TRUNCATE );
26325:
26326: /* If the user has configured a chunk-size for this file, truncate the
26327: ** file so that it consists of an integer number of chunks (i.e. the
26328: ** actual file size after the operation may be larger than the requested
26329: ** size).
26330: */
1.2.2.1 ! misho 26331: if( pFile->szChunk>0 ){
1.2 misho 26332: nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
26333: }
26334:
26335: rc = robust_ftruncate(pFile->h, (off_t)nByte);
26336: if( rc ){
26337: pFile->lastErrno = errno;
26338: return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath);
26339: }else{
1.2.2.1 ! misho 26340: #ifdef SQLITE_DEBUG
1.2 misho 26341: /* If we are doing a normal write to a database file (as opposed to
26342: ** doing a hot-journal rollback or a write to some file other than a
26343: ** normal database file) and we truncate the file to zero length,
26344: ** that effectively updates the change counter. This might happen
26345: ** when restoring a database using the backup API from a zero-length
26346: ** source.
26347: */
26348: if( pFile->inNormalWrite && nByte==0 ){
26349: pFile->transCntrChng = 1;
26350: }
26351: #endif
26352:
26353: return SQLITE_OK;
26354: }
26355: }
26356:
26357: /*
26358: ** Determine the current size of a file in bytes
26359: */
26360: static int unixFileSize(sqlite3_file *id, i64 *pSize){
26361: int rc;
26362: struct stat buf;
26363: assert( id );
26364: rc = osFstat(((unixFile*)id)->h, &buf);
26365: SimulateIOError( rc=1 );
26366: if( rc!=0 ){
26367: ((unixFile*)id)->lastErrno = errno;
26368: return SQLITE_IOERR_FSTAT;
26369: }
26370: *pSize = buf.st_size;
26371:
26372: /* When opening a zero-size database, the findInodeInfo() procedure
26373: ** writes a single byte into that file in order to work around a bug
26374: ** in the OS-X msdos filesystem. In order to avoid problems with upper
26375: ** layers, we need to report this file size as zero even though it is
26376: ** really 1. Ticket #3260.
26377: */
26378: if( *pSize==1 ) *pSize = 0;
26379:
26380:
26381: return SQLITE_OK;
26382: }
26383:
26384: #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
26385: /*
26386: ** Handler for proxy-locking file-control verbs. Defined below in the
26387: ** proxying locking division.
26388: */
26389: static int proxyFileControl(sqlite3_file*,int,void*);
26390: #endif
26391:
26392: /*
26393: ** This function is called to handle the SQLITE_FCNTL_SIZE_HINT
26394: ** file-control operation. Enlarge the database to nBytes in size
26395: ** (rounded up to the next chunk-size). If the database is already
26396: ** nBytes or larger, this routine is a no-op.
26397: */
26398: static int fcntlSizeHint(unixFile *pFile, i64 nByte){
26399: if( pFile->szChunk>0 ){
26400: i64 nSize; /* Required file size */
26401: struct stat buf; /* Used to hold return values of fstat() */
26402:
26403: if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT;
26404:
26405: nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk;
26406: if( nSize>(i64)buf.st_size ){
26407:
26408: #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
26409: /* The code below is handling the return value of osFallocate()
26410: ** correctly. posix_fallocate() is defined to "returns zero on success,
26411: ** or an error number on failure". See the manpage for details. */
26412: int err;
26413: do{
26414: err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size);
26415: }while( err==EINTR );
26416: if( err ) return SQLITE_IOERR_WRITE;
26417: #else
26418: /* If the OS does not have posix_fallocate(), fake it. First use
26419: ** ftruncate() to set the file size, then write a single byte to
26420: ** the last byte in each block within the extended region. This
26421: ** is the same technique used by glibc to implement posix_fallocate()
26422: ** on systems that do not have a real fallocate() system call.
26423: */
26424: int nBlk = buf.st_blksize; /* File-system block size */
26425: i64 iWrite; /* Next offset to write to */
26426:
26427: if( robust_ftruncate(pFile->h, nSize) ){
26428: pFile->lastErrno = errno;
26429: return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath);
26430: }
26431: iWrite = ((buf.st_size + 2*nBlk - 1)/nBlk)*nBlk-1;
26432: while( iWrite<nSize ){
26433: int nWrite = seekAndWrite(pFile, iWrite, "", 1);
26434: if( nWrite!=1 ) return SQLITE_IOERR_WRITE;
26435: iWrite += nBlk;
26436: }
26437: #endif
26438: }
26439: }
26440:
26441: return SQLITE_OK;
26442: }
26443:
26444: /*
26445: ** If *pArg is inititially negative then this is a query. Set *pArg to
26446: ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
26447: **
26448: ** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags.
26449: */
26450: static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){
26451: if( *pArg<0 ){
26452: *pArg = (pFile->ctrlFlags & mask)!=0;
26453: }else if( (*pArg)==0 ){
26454: pFile->ctrlFlags &= ~mask;
26455: }else{
26456: pFile->ctrlFlags |= mask;
26457: }
26458: }
26459:
1.2.2.1 ! misho 26460: /* Forward declaration */
! 26461: static int unixGetTempname(int nBuf, char *zBuf);
! 26462:
1.2 misho 26463: /*
26464: ** Information and control of an open file handle.
26465: */
26466: static int unixFileControl(sqlite3_file *id, int op, void *pArg){
26467: unixFile *pFile = (unixFile*)id;
26468: switch( op ){
26469: case SQLITE_FCNTL_LOCKSTATE: {
26470: *(int*)pArg = pFile->eFileLock;
26471: return SQLITE_OK;
26472: }
26473: case SQLITE_LAST_ERRNO: {
26474: *(int*)pArg = pFile->lastErrno;
26475: return SQLITE_OK;
26476: }
26477: case SQLITE_FCNTL_CHUNK_SIZE: {
26478: pFile->szChunk = *(int *)pArg;
26479: return SQLITE_OK;
26480: }
26481: case SQLITE_FCNTL_SIZE_HINT: {
26482: int rc;
26483: SimulateIOErrorBenign(1);
26484: rc = fcntlSizeHint(pFile, *(i64 *)pArg);
26485: SimulateIOErrorBenign(0);
26486: return rc;
26487: }
26488: case SQLITE_FCNTL_PERSIST_WAL: {
26489: unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg);
26490: return SQLITE_OK;
26491: }
26492: case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
26493: unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg);
26494: return SQLITE_OK;
26495: }
26496: case SQLITE_FCNTL_VFSNAME: {
26497: *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName);
26498: return SQLITE_OK;
26499: }
1.2.2.1 ! misho 26500: case SQLITE_FCNTL_TEMPFILENAME: {
! 26501: char *zTFile = sqlite3_malloc( pFile->pVfs->mxPathname );
! 26502: if( zTFile ){
! 26503: unixGetTempname(pFile->pVfs->mxPathname, zTFile);
! 26504: *(char**)pArg = zTFile;
! 26505: }
! 26506: return SQLITE_OK;
! 26507: }
! 26508: #ifdef SQLITE_DEBUG
1.2 misho 26509: /* The pager calls this method to signal that it has done
26510: ** a rollback and that the database is therefore unchanged and
26511: ** it hence it is OK for the transaction change counter to be
26512: ** unchanged.
26513: */
26514: case SQLITE_FCNTL_DB_UNCHANGED: {
26515: ((unixFile*)id)->dbUpdate = 0;
26516: return SQLITE_OK;
26517: }
26518: #endif
26519: #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
26520: case SQLITE_SET_LOCKPROXYFILE:
26521: case SQLITE_GET_LOCKPROXYFILE: {
26522: return proxyFileControl(id,op,pArg);
26523: }
26524: #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */
26525: }
26526: return SQLITE_NOTFOUND;
26527: }
26528:
26529: /*
26530: ** Return the sector size in bytes of the underlying block device for
26531: ** the specified file. This is almost always 512 bytes, but may be
26532: ** larger for some devices.
26533: **
26534: ** SQLite code assumes this function cannot fail. It also assumes that
26535: ** if two files are created in the same file-system directory (i.e.
26536: ** a database and its journal file) that the sector size will be the
26537: ** same for both.
26538: */
1.2.2.1 ! misho 26539: #ifndef __QNXNTO__
! 26540: static int unixSectorSize(sqlite3_file *NotUsed){
! 26541: UNUSED_PARAMETER(NotUsed);
1.2 misho 26542: return SQLITE_DEFAULT_SECTOR_SIZE;
26543: }
1.2.2.1 ! misho 26544: #endif
! 26545:
! 26546: /*
! 26547: ** The following version of unixSectorSize() is optimized for QNX.
! 26548: */
! 26549: #ifdef __QNXNTO__
! 26550: #include <sys/dcmd_blk.h>
! 26551: #include <sys/statvfs.h>
! 26552: static int unixSectorSize(sqlite3_file *id){
! 26553: unixFile *pFile = (unixFile*)id;
! 26554: if( pFile->sectorSize == 0 ){
! 26555: struct statvfs fsInfo;
! 26556:
! 26557: /* Set defaults for non-supported filesystems */
! 26558: pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
! 26559: pFile->deviceCharacteristics = 0;
! 26560: if( fstatvfs(pFile->h, &fsInfo) == -1 ) {
! 26561: return pFile->sectorSize;
! 26562: }
! 26563:
! 26564: if( !strcmp(fsInfo.f_basetype, "tmp") ) {
! 26565: pFile->sectorSize = fsInfo.f_bsize;
! 26566: pFile->deviceCharacteristics =
! 26567: SQLITE_IOCAP_ATOMIC4K | /* All ram filesystem writes are atomic */
! 26568: SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until
! 26569: ** the write succeeds */
! 26570: SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind
! 26571: ** so it is ordered */
! 26572: 0;
! 26573: }else if( strstr(fsInfo.f_basetype, "etfs") ){
! 26574: pFile->sectorSize = fsInfo.f_bsize;
! 26575: pFile->deviceCharacteristics =
! 26576: /* etfs cluster size writes are atomic */
! 26577: (pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) |
! 26578: SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until
! 26579: ** the write succeeds */
! 26580: SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind
! 26581: ** so it is ordered */
! 26582: 0;
! 26583: }else if( !strcmp(fsInfo.f_basetype, "qnx6") ){
! 26584: pFile->sectorSize = fsInfo.f_bsize;
! 26585: pFile->deviceCharacteristics =
! 26586: SQLITE_IOCAP_ATOMIC | /* All filesystem writes are atomic */
! 26587: SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until
! 26588: ** the write succeeds */
! 26589: SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind
! 26590: ** so it is ordered */
! 26591: 0;
! 26592: }else if( !strcmp(fsInfo.f_basetype, "qnx4") ){
! 26593: pFile->sectorSize = fsInfo.f_bsize;
! 26594: pFile->deviceCharacteristics =
! 26595: /* full bitset of atomics from max sector size and smaller */
! 26596: ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 |
! 26597: SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind
! 26598: ** so it is ordered */
! 26599: 0;
! 26600: }else if( strstr(fsInfo.f_basetype, "dos") ){
! 26601: pFile->sectorSize = fsInfo.f_bsize;
! 26602: pFile->deviceCharacteristics =
! 26603: /* full bitset of atomics from max sector size and smaller */
! 26604: ((pFile->sectorSize / 512 * SQLITE_IOCAP_ATOMIC512) << 1) - 2 |
! 26605: SQLITE_IOCAP_SEQUENTIAL | /* The ram filesystem has no write behind
! 26606: ** so it is ordered */
! 26607: 0;
! 26608: }else{
! 26609: pFile->deviceCharacteristics =
! 26610: SQLITE_IOCAP_ATOMIC512 | /* blocks are atomic */
! 26611: SQLITE_IOCAP_SAFE_APPEND | /* growing the file does not occur until
! 26612: ** the write succeeds */
! 26613: 0;
! 26614: }
! 26615: }
! 26616: /* Last chance verification. If the sector size isn't a multiple of 512
! 26617: ** then it isn't valid.*/
! 26618: if( pFile->sectorSize % 512 != 0 ){
! 26619: pFile->deviceCharacteristics = 0;
! 26620: pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
! 26621: }
! 26622: return pFile->sectorSize;
! 26623: }
! 26624: #endif /* __QNXNTO__ */
1.2 misho 26625:
26626: /*
26627: ** Return the device characteristics for the file.
26628: **
26629: ** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default.
26630: ** However, that choice is contraversial since technically the underlying
26631: ** file system does not always provide powersafe overwrites. (In other
26632: ** words, after a power-loss event, parts of the file that were never
26633: ** written might end up being altered.) However, non-PSOW behavior is very,
26634: ** very rare. And asserting PSOW makes a large reduction in the amount
26635: ** of required I/O for journaling, since a lot of padding is eliminated.
26636: ** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control
26637: ** available to turn it off and URI query parameter available to turn it off.
26638: */
26639: static int unixDeviceCharacteristics(sqlite3_file *id){
26640: unixFile *p = (unixFile*)id;
1.2.2.1 ! misho 26641: int rc = 0;
! 26642: #ifdef __QNXNTO__
! 26643: if( p->sectorSize==0 ) unixSectorSize(id);
! 26644: rc = p->deviceCharacteristics;
! 26645: #endif
1.2 misho 26646: if( p->ctrlFlags & UNIXFILE_PSOW ){
1.2.2.1 ! misho 26647: rc |= SQLITE_IOCAP_POWERSAFE_OVERWRITE;
1.2 misho 26648: }
1.2.2.1 ! misho 26649: return rc;
1.2 misho 26650: }
26651:
26652: #ifndef SQLITE_OMIT_WAL
26653:
26654:
26655: /*
26656: ** Object used to represent an shared memory buffer.
26657: **
26658: ** When multiple threads all reference the same wal-index, each thread
26659: ** has its own unixShm object, but they all point to a single instance
26660: ** of this unixShmNode object. In other words, each wal-index is opened
26661: ** only once per process.
26662: **
26663: ** Each unixShmNode object is connected to a single unixInodeInfo object.
26664: ** We could coalesce this object into unixInodeInfo, but that would mean
26665: ** every open file that does not use shared memory (in other words, most
26666: ** open files) would have to carry around this extra information. So
26667: ** the unixInodeInfo object contains a pointer to this unixShmNode object
26668: ** and the unixShmNode object is created only when needed.
26669: **
26670: ** unixMutexHeld() must be true when creating or destroying
26671: ** this object or while reading or writing the following fields:
26672: **
26673: ** nRef
26674: **
26675: ** The following fields are read-only after the object is created:
26676: **
26677: ** fid
26678: ** zFilename
26679: **
26680: ** Either unixShmNode.mutex must be held or unixShmNode.nRef==0 and
26681: ** unixMutexHeld() is true when reading or writing any other field
26682: ** in this structure.
26683: */
26684: struct unixShmNode {
26685: unixInodeInfo *pInode; /* unixInodeInfo that owns this SHM node */
26686: sqlite3_mutex *mutex; /* Mutex to access this object */
26687: char *zFilename; /* Name of the mmapped file */
26688: int h; /* Open file descriptor */
26689: int szRegion; /* Size of shared-memory regions */
26690: u16 nRegion; /* Size of array apRegion */
26691: u8 isReadonly; /* True if read-only */
26692: char **apRegion; /* Array of mapped shared-memory regions */
26693: int nRef; /* Number of unixShm objects pointing to this */
26694: unixShm *pFirst; /* All unixShm objects pointing to this */
26695: #ifdef SQLITE_DEBUG
26696: u8 exclMask; /* Mask of exclusive locks held */
26697: u8 sharedMask; /* Mask of shared locks held */
26698: u8 nextShmId; /* Next available unixShm.id value */
26699: #endif
26700: };
26701:
26702: /*
26703: ** Structure used internally by this VFS to record the state of an
26704: ** open shared memory connection.
26705: **
26706: ** The following fields are initialized when this object is created and
26707: ** are read-only thereafter:
26708: **
26709: ** unixShm.pFile
26710: ** unixShm.id
26711: **
26712: ** All other fields are read/write. The unixShm.pFile->mutex must be held
26713: ** while accessing any read/write fields.
26714: */
26715: struct unixShm {
26716: unixShmNode *pShmNode; /* The underlying unixShmNode object */
26717: unixShm *pNext; /* Next unixShm with the same unixShmNode */
26718: u8 hasMutex; /* True if holding the unixShmNode mutex */
26719: u8 id; /* Id of this connection within its unixShmNode */
26720: u16 sharedMask; /* Mask of shared locks held */
26721: u16 exclMask; /* Mask of exclusive locks held */
26722: };
26723:
26724: /*
26725: ** Constants used for locking
26726: */
26727: #define UNIX_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */
26728: #define UNIX_SHM_DMS (UNIX_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
26729:
26730: /*
26731: ** Apply posix advisory locks for all bytes from ofst through ofst+n-1.
26732: **
26733: ** Locks block if the mask is exactly UNIX_SHM_C and are non-blocking
26734: ** otherwise.
26735: */
26736: static int unixShmSystemLock(
26737: unixShmNode *pShmNode, /* Apply locks to this open shared-memory segment */
26738: int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */
26739: int ofst, /* First byte of the locking range */
26740: int n /* Number of bytes to lock */
26741: ){
26742: struct flock f; /* The posix advisory locking structure */
26743: int rc = SQLITE_OK; /* Result code form fcntl() */
26744:
26745: /* Access to the unixShmNode object is serialized by the caller */
26746: assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 );
26747:
26748: /* Shared locks never span more than one byte */
26749: assert( n==1 || lockType!=F_RDLCK );
26750:
26751: /* Locks are within range */
26752: assert( n>=1 && n<SQLITE_SHM_NLOCK );
26753:
26754: if( pShmNode->h>=0 ){
26755: /* Initialize the locking parameters */
26756: memset(&f, 0, sizeof(f));
26757: f.l_type = lockType;
26758: f.l_whence = SEEK_SET;
26759: f.l_start = ofst;
26760: f.l_len = n;
26761:
26762: rc = osFcntl(pShmNode->h, F_SETLK, &f);
26763: rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY;
26764: }
26765:
26766: /* Update the global lock state and do debug tracing */
26767: #ifdef SQLITE_DEBUG
26768: { u16 mask;
26769: OSTRACE(("SHM-LOCK "));
26770: mask = (1<<(ofst+n)) - (1<<ofst);
26771: if( rc==SQLITE_OK ){
26772: if( lockType==F_UNLCK ){
26773: OSTRACE(("unlock %d ok", ofst));
26774: pShmNode->exclMask &= ~mask;
26775: pShmNode->sharedMask &= ~mask;
26776: }else if( lockType==F_RDLCK ){
26777: OSTRACE(("read-lock %d ok", ofst));
26778: pShmNode->exclMask &= ~mask;
26779: pShmNode->sharedMask |= mask;
26780: }else{
26781: assert( lockType==F_WRLCK );
26782: OSTRACE(("write-lock %d ok", ofst));
26783: pShmNode->exclMask |= mask;
26784: pShmNode->sharedMask &= ~mask;
26785: }
26786: }else{
26787: if( lockType==F_UNLCK ){
26788: OSTRACE(("unlock %d failed", ofst));
26789: }else if( lockType==F_RDLCK ){
26790: OSTRACE(("read-lock failed"));
26791: }else{
26792: assert( lockType==F_WRLCK );
26793: OSTRACE(("write-lock %d failed", ofst));
26794: }
26795: }
26796: OSTRACE((" - afterwards %03x,%03x\n",
26797: pShmNode->sharedMask, pShmNode->exclMask));
26798: }
26799: #endif
26800:
26801: return rc;
26802: }
26803:
26804:
26805: /*
26806: ** Purge the unixShmNodeList list of all entries with unixShmNode.nRef==0.
26807: **
26808: ** This is not a VFS shared-memory method; it is a utility function called
26809: ** by VFS shared-memory methods.
26810: */
26811: static void unixShmPurge(unixFile *pFd){
26812: unixShmNode *p = pFd->pInode->pShmNode;
26813: assert( unixMutexHeld() );
26814: if( p && p->nRef==0 ){
26815: int i;
26816: assert( p->pInode==pFd->pInode );
26817: sqlite3_mutex_free(p->mutex);
26818: for(i=0; i<p->nRegion; i++){
26819: if( p->h>=0 ){
26820: munmap(p->apRegion[i], p->szRegion);
26821: }else{
26822: sqlite3_free(p->apRegion[i]);
26823: }
26824: }
26825: sqlite3_free(p->apRegion);
26826: if( p->h>=0 ){
26827: robust_close(pFd, p->h, __LINE__);
26828: p->h = -1;
26829: }
26830: p->pInode->pShmNode = 0;
26831: sqlite3_free(p);
26832: }
26833: }
26834:
26835: /*
26836: ** Open a shared-memory area associated with open database file pDbFd.
26837: ** This particular implementation uses mmapped files.
26838: **
26839: ** The file used to implement shared-memory is in the same directory
26840: ** as the open database file and has the same name as the open database
26841: ** file with the "-shm" suffix added. For example, if the database file
26842: ** is "/home/user1/config.db" then the file that is created and mmapped
26843: ** for shared memory will be called "/home/user1/config.db-shm".
26844: **
26845: ** Another approach to is to use files in /dev/shm or /dev/tmp or an
26846: ** some other tmpfs mount. But if a file in a different directory
26847: ** from the database file is used, then differing access permissions
26848: ** or a chroot() might cause two different processes on the same
26849: ** database to end up using different files for shared memory -
26850: ** meaning that their memory would not really be shared - resulting
26851: ** in database corruption. Nevertheless, this tmpfs file usage
26852: ** can be enabled at compile-time using -DSQLITE_SHM_DIRECTORY="/dev/shm"
26853: ** or the equivalent. The use of the SQLITE_SHM_DIRECTORY compile-time
26854: ** option results in an incompatible build of SQLite; builds of SQLite
26855: ** that with differing SQLITE_SHM_DIRECTORY settings attempt to use the
26856: ** same database file at the same time, database corruption will likely
26857: ** result. The SQLITE_SHM_DIRECTORY compile-time option is considered
26858: ** "unsupported" and may go away in a future SQLite release.
26859: **
26860: ** When opening a new shared-memory file, if no other instances of that
26861: ** file are currently open, in this process or in other processes, then
26862: ** the file must be truncated to zero length or have its header cleared.
26863: **
26864: ** If the original database file (pDbFd) is using the "unix-excl" VFS
26865: ** that means that an exclusive lock is held on the database file and
26866: ** that no other processes are able to read or write the database. In
26867: ** that case, we do not really need shared memory. No shared memory
26868: ** file is created. The shared memory will be simulated with heap memory.
26869: */
26870: static int unixOpenSharedMemory(unixFile *pDbFd){
26871: struct unixShm *p = 0; /* The connection to be opened */
26872: struct unixShmNode *pShmNode; /* The underlying mmapped file */
26873: int rc; /* Result code */
26874: unixInodeInfo *pInode; /* The inode of fd */
26875: char *zShmFilename; /* Name of the file used for SHM */
26876: int nShmFilename; /* Size of the SHM filename in bytes */
26877:
26878: /* Allocate space for the new unixShm object. */
26879: p = sqlite3_malloc( sizeof(*p) );
26880: if( p==0 ) return SQLITE_NOMEM;
26881: memset(p, 0, sizeof(*p));
26882: assert( pDbFd->pShm==0 );
26883:
26884: /* Check to see if a unixShmNode object already exists. Reuse an existing
26885: ** one if present. Create a new one if necessary.
26886: */
26887: unixEnterMutex();
26888: pInode = pDbFd->pInode;
26889: pShmNode = pInode->pShmNode;
26890: if( pShmNode==0 ){
26891: struct stat sStat; /* fstat() info for database file */
26892:
26893: /* Call fstat() to figure out the permissions on the database file. If
26894: ** a new *-shm file is created, an attempt will be made to create it
1.2.2.1 ! misho 26895: ** with the same permissions.
1.2 misho 26896: */
26897: if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){
26898: rc = SQLITE_IOERR_FSTAT;
26899: goto shm_open_err;
26900: }
26901:
26902: #ifdef SQLITE_SHM_DIRECTORY
26903: nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31;
26904: #else
26905: nShmFilename = 6 + (int)strlen(pDbFd->zPath);
26906: #endif
26907: pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename );
26908: if( pShmNode==0 ){
26909: rc = SQLITE_NOMEM;
26910: goto shm_open_err;
26911: }
26912: memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename);
26913: zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1];
26914: #ifdef SQLITE_SHM_DIRECTORY
26915: sqlite3_snprintf(nShmFilename, zShmFilename,
26916: SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x",
26917: (u32)sStat.st_ino, (u32)sStat.st_dev);
26918: #else
26919: sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath);
26920: sqlite3FileSuffix3(pDbFd->zPath, zShmFilename);
26921: #endif
26922: pShmNode->h = -1;
26923: pDbFd->pInode->pShmNode = pShmNode;
26924: pShmNode->pInode = pDbFd->pInode;
26925: pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
26926: if( pShmNode->mutex==0 ){
26927: rc = SQLITE_NOMEM;
26928: goto shm_open_err;
26929: }
26930:
26931: if( pInode->bProcessLock==0 ){
26932: int openFlags = O_RDWR | O_CREAT;
26933: if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
26934: openFlags = O_RDONLY;
26935: pShmNode->isReadonly = 1;
26936: }
26937: pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777));
26938: if( pShmNode->h<0 ){
1.2.2.1 ! misho 26939: rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename);
! 26940: goto shm_open_err;
1.2 misho 26941: }
1.2.2.1 ! misho 26942:
! 26943: /* If this process is running as root, make sure that the SHM file
! 26944: ** is owned by the same user that owns the original database. Otherwise,
! 26945: ** the original owner will not be able to connect.
! 26946: */
! 26947: osFchown(pShmNode->h, sStat.st_uid, sStat.st_gid);
1.2 misho 26948:
26949: /* Check to see if another process is holding the dead-man switch.
26950: ** If not, truncate the file to zero length.
26951: */
26952: rc = SQLITE_OK;
26953: if( unixShmSystemLock(pShmNode, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){
26954: if( robust_ftruncate(pShmNode->h, 0) ){
26955: rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename);
26956: }
26957: }
26958: if( rc==SQLITE_OK ){
26959: rc = unixShmSystemLock(pShmNode, F_RDLCK, UNIX_SHM_DMS, 1);
26960: }
26961: if( rc ) goto shm_open_err;
26962: }
26963: }
26964:
26965: /* Make the new connection a child of the unixShmNode */
26966: p->pShmNode = pShmNode;
26967: #ifdef SQLITE_DEBUG
26968: p->id = pShmNode->nextShmId++;
26969: #endif
26970: pShmNode->nRef++;
26971: pDbFd->pShm = p;
26972: unixLeaveMutex();
26973:
26974: /* The reference count on pShmNode has already been incremented under
26975: ** the cover of the unixEnterMutex() mutex and the pointer from the
26976: ** new (struct unixShm) object to the pShmNode has been set. All that is
26977: ** left to do is to link the new object into the linked list starting
26978: ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
26979: ** mutex.
26980: */
26981: sqlite3_mutex_enter(pShmNode->mutex);
26982: p->pNext = pShmNode->pFirst;
26983: pShmNode->pFirst = p;
26984: sqlite3_mutex_leave(pShmNode->mutex);
26985: return SQLITE_OK;
26986:
26987: /* Jump here on any error */
26988: shm_open_err:
26989: unixShmPurge(pDbFd); /* This call frees pShmNode if required */
26990: sqlite3_free(p);
26991: unixLeaveMutex();
26992: return rc;
26993: }
26994:
26995: /*
26996: ** This function is called to obtain a pointer to region iRegion of the
26997: ** shared-memory associated with the database file fd. Shared-memory regions
26998: ** are numbered starting from zero. Each shared-memory region is szRegion
26999: ** bytes in size.
27000: **
27001: ** If an error occurs, an error code is returned and *pp is set to NULL.
27002: **
27003: ** Otherwise, if the bExtend parameter is 0 and the requested shared-memory
27004: ** region has not been allocated (by any client, including one running in a
27005: ** separate process), then *pp is set to NULL and SQLITE_OK returned. If
27006: ** bExtend is non-zero and the requested shared-memory region has not yet
27007: ** been allocated, it is allocated by this function.
27008: **
27009: ** If the shared-memory region has already been allocated or is allocated by
27010: ** this call as described above, then it is mapped into this processes
27011: ** address space (if it is not already), *pp is set to point to the mapped
27012: ** memory and SQLITE_OK returned.
27013: */
27014: static int unixShmMap(
27015: sqlite3_file *fd, /* Handle open on database file */
27016: int iRegion, /* Region to retrieve */
27017: int szRegion, /* Size of regions */
27018: int bExtend, /* True to extend file if necessary */
27019: void volatile **pp /* OUT: Mapped memory */
27020: ){
27021: unixFile *pDbFd = (unixFile*)fd;
27022: unixShm *p;
27023: unixShmNode *pShmNode;
27024: int rc = SQLITE_OK;
27025:
27026: /* If the shared-memory file has not yet been opened, open it now. */
27027: if( pDbFd->pShm==0 ){
27028: rc = unixOpenSharedMemory(pDbFd);
27029: if( rc!=SQLITE_OK ) return rc;
27030: }
27031:
27032: p = pDbFd->pShm;
27033: pShmNode = p->pShmNode;
27034: sqlite3_mutex_enter(pShmNode->mutex);
27035: assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
27036: assert( pShmNode->pInode==pDbFd->pInode );
27037: assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
27038: assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
27039:
27040: if( pShmNode->nRegion<=iRegion ){
27041: char **apNew; /* New apRegion[] array */
27042: int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
27043: struct stat sStat; /* Used by fstat() */
27044:
27045: pShmNode->szRegion = szRegion;
27046:
27047: if( pShmNode->h>=0 ){
27048: /* The requested region is not mapped into this processes address space.
27049: ** Check to see if it has been allocated (i.e. if the wal-index file is
27050: ** large enough to contain the requested region).
27051: */
27052: if( osFstat(pShmNode->h, &sStat) ){
27053: rc = SQLITE_IOERR_SHMSIZE;
27054: goto shmpage_out;
27055: }
27056:
27057: if( sStat.st_size<nByte ){
27058: /* The requested memory region does not exist. If bExtend is set to
27059: ** false, exit early. *pp will be set to NULL and SQLITE_OK returned.
27060: **
27061: ** Alternatively, if bExtend is true, use ftruncate() to allocate
27062: ** the requested memory region.
27063: */
27064: if( !bExtend ) goto shmpage_out;
1.2.2.1 ! misho 27065: #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
! 27066: if( osFallocate(pShmNode->h, sStat.st_size, nByte)!=0 ){
! 27067: rc = unixLogError(SQLITE_IOERR_SHMSIZE, "fallocate",
! 27068: pShmNode->zFilename);
! 27069: goto shmpage_out;
! 27070: }
! 27071: #else
1.2 misho 27072: if( robust_ftruncate(pShmNode->h, nByte) ){
27073: rc = unixLogError(SQLITE_IOERR_SHMSIZE, "ftruncate",
27074: pShmNode->zFilename);
27075: goto shmpage_out;
27076: }
1.2.2.1 ! misho 27077: #endif
1.2 misho 27078: }
27079: }
27080:
27081: /* Map the requested memory region into this processes address space. */
27082: apNew = (char **)sqlite3_realloc(
27083: pShmNode->apRegion, (iRegion+1)*sizeof(char *)
27084: );
27085: if( !apNew ){
27086: rc = SQLITE_IOERR_NOMEM;
27087: goto shmpage_out;
27088: }
27089: pShmNode->apRegion = apNew;
27090: while(pShmNode->nRegion<=iRegion){
27091: void *pMem;
27092: if( pShmNode->h>=0 ){
27093: pMem = mmap(0, szRegion,
27094: pShmNode->isReadonly ? PROT_READ : PROT_READ|PROT_WRITE,
1.2.2.1 ! misho 27095: MAP_SHARED, pShmNode->h, szRegion*(i64)pShmNode->nRegion
1.2 misho 27096: );
27097: if( pMem==MAP_FAILED ){
27098: rc = unixLogError(SQLITE_IOERR_SHMMAP, "mmap", pShmNode->zFilename);
27099: goto shmpage_out;
27100: }
27101: }else{
27102: pMem = sqlite3_malloc(szRegion);
27103: if( pMem==0 ){
27104: rc = SQLITE_NOMEM;
27105: goto shmpage_out;
27106: }
27107: memset(pMem, 0, szRegion);
27108: }
27109: pShmNode->apRegion[pShmNode->nRegion] = pMem;
27110: pShmNode->nRegion++;
27111: }
27112: }
27113:
27114: shmpage_out:
27115: if( pShmNode->nRegion>iRegion ){
27116: *pp = pShmNode->apRegion[iRegion];
27117: }else{
27118: *pp = 0;
27119: }
27120: if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY;
27121: sqlite3_mutex_leave(pShmNode->mutex);
27122: return rc;
27123: }
27124:
27125: /*
27126: ** Change the lock state for a shared-memory segment.
27127: **
27128: ** Note that the relationship between SHAREd and EXCLUSIVE locks is a little
27129: ** different here than in posix. In xShmLock(), one can go from unlocked
27130: ** to shared and back or from unlocked to exclusive and back. But one may
27131: ** not go from shared to exclusive or from exclusive to shared.
27132: */
27133: static int unixShmLock(
27134: sqlite3_file *fd, /* Database file holding the shared memory */
27135: int ofst, /* First lock to acquire or release */
27136: int n, /* Number of locks to acquire or release */
27137: int flags /* What to do with the lock */
27138: ){
27139: unixFile *pDbFd = (unixFile*)fd; /* Connection holding shared memory */
27140: unixShm *p = pDbFd->pShm; /* The shared memory being locked */
27141: unixShm *pX; /* For looping over all siblings */
27142: unixShmNode *pShmNode = p->pShmNode; /* The underlying file iNode */
27143: int rc = SQLITE_OK; /* Result code */
27144: u16 mask; /* Mask of locks to take or release */
27145:
27146: assert( pShmNode==pDbFd->pInode->pShmNode );
27147: assert( pShmNode->pInode==pDbFd->pInode );
27148: assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
27149: assert( n>=1 );
27150: assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
27151: || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE)
27152: || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
27153: || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
27154: assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
27155: assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 );
27156: assert( pShmNode->h<0 || pDbFd->pInode->bProcessLock==0 );
27157:
27158: mask = (1<<(ofst+n)) - (1<<ofst);
27159: assert( n>1 || mask==(1<<ofst) );
27160: sqlite3_mutex_enter(pShmNode->mutex);
27161: if( flags & SQLITE_SHM_UNLOCK ){
27162: u16 allMask = 0; /* Mask of locks held by siblings */
27163:
27164: /* See if any siblings hold this same lock */
27165: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
27166: if( pX==p ) continue;
27167: assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 );
27168: allMask |= pX->sharedMask;
27169: }
27170:
27171: /* Unlock the system-level locks */
27172: if( (mask & allMask)==0 ){
27173: rc = unixShmSystemLock(pShmNode, F_UNLCK, ofst+UNIX_SHM_BASE, n);
27174: }else{
27175: rc = SQLITE_OK;
27176: }
27177:
27178: /* Undo the local locks */
27179: if( rc==SQLITE_OK ){
27180: p->exclMask &= ~mask;
27181: p->sharedMask &= ~mask;
27182: }
27183: }else if( flags & SQLITE_SHM_SHARED ){
27184: u16 allShared = 0; /* Union of locks held by connections other than "p" */
27185:
27186: /* Find out which shared locks are already held by sibling connections.
27187: ** If any sibling already holds an exclusive lock, go ahead and return
27188: ** SQLITE_BUSY.
27189: */
27190: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
27191: if( (pX->exclMask & mask)!=0 ){
27192: rc = SQLITE_BUSY;
27193: break;
27194: }
27195: allShared |= pX->sharedMask;
27196: }
27197:
27198: /* Get shared locks at the system level, if necessary */
27199: if( rc==SQLITE_OK ){
27200: if( (allShared & mask)==0 ){
27201: rc = unixShmSystemLock(pShmNode, F_RDLCK, ofst+UNIX_SHM_BASE, n);
27202: }else{
27203: rc = SQLITE_OK;
27204: }
27205: }
27206:
27207: /* Get the local shared locks */
27208: if( rc==SQLITE_OK ){
27209: p->sharedMask |= mask;
27210: }
27211: }else{
27212: /* Make sure no sibling connections hold locks that will block this
27213: ** lock. If any do, return SQLITE_BUSY right away.
27214: */
27215: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
27216: if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){
27217: rc = SQLITE_BUSY;
27218: break;
27219: }
27220: }
27221:
27222: /* Get the exclusive locks at the system level. Then if successful
27223: ** also mark the local connection as being locked.
27224: */
27225: if( rc==SQLITE_OK ){
27226: rc = unixShmSystemLock(pShmNode, F_WRLCK, ofst+UNIX_SHM_BASE, n);
27227: if( rc==SQLITE_OK ){
27228: assert( (p->sharedMask & mask)==0 );
27229: p->exclMask |= mask;
27230: }
27231: }
27232: }
27233: sqlite3_mutex_leave(pShmNode->mutex);
27234: OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n",
27235: p->id, getpid(), p->sharedMask, p->exclMask));
27236: return rc;
27237: }
27238:
27239: /*
27240: ** Implement a memory barrier or memory fence on shared memory.
27241: **
27242: ** All loads and stores begun before the barrier must complete before
27243: ** any load or store begun after the barrier.
27244: */
27245: static void unixShmBarrier(
27246: sqlite3_file *fd /* Database file holding the shared memory */
27247: ){
27248: UNUSED_PARAMETER(fd);
27249: unixEnterMutex();
27250: unixLeaveMutex();
27251: }
27252:
27253: /*
27254: ** Close a connection to shared-memory. Delete the underlying
27255: ** storage if deleteFlag is true.
27256: **
27257: ** If there is no shared memory associated with the connection then this
27258: ** routine is a harmless no-op.
27259: */
27260: static int unixShmUnmap(
27261: sqlite3_file *fd, /* The underlying database file */
27262: int deleteFlag /* Delete shared-memory if true */
27263: ){
27264: unixShm *p; /* The connection to be closed */
27265: unixShmNode *pShmNode; /* The underlying shared-memory file */
27266: unixShm **pp; /* For looping over sibling connections */
27267: unixFile *pDbFd; /* The underlying database file */
27268:
27269: pDbFd = (unixFile*)fd;
27270: p = pDbFd->pShm;
27271: if( p==0 ) return SQLITE_OK;
27272: pShmNode = p->pShmNode;
27273:
27274: assert( pShmNode==pDbFd->pInode->pShmNode );
27275: assert( pShmNode->pInode==pDbFd->pInode );
27276:
27277: /* Remove connection p from the set of connections associated
27278: ** with pShmNode */
27279: sqlite3_mutex_enter(pShmNode->mutex);
27280: for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}
27281: *pp = p->pNext;
27282:
27283: /* Free the connection p */
27284: sqlite3_free(p);
27285: pDbFd->pShm = 0;
27286: sqlite3_mutex_leave(pShmNode->mutex);
27287:
27288: /* If pShmNode->nRef has reached 0, then close the underlying
27289: ** shared-memory file, too */
27290: unixEnterMutex();
27291: assert( pShmNode->nRef>0 );
27292: pShmNode->nRef--;
27293: if( pShmNode->nRef==0 ){
27294: if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename);
27295: unixShmPurge(pDbFd);
27296: }
27297: unixLeaveMutex();
27298:
27299: return SQLITE_OK;
27300: }
27301:
27302:
27303: #else
27304: # define unixShmMap 0
27305: # define unixShmLock 0
27306: # define unixShmBarrier 0
27307: # define unixShmUnmap 0
27308: #endif /* #ifndef SQLITE_OMIT_WAL */
27309:
27310: /*
27311: ** Here ends the implementation of all sqlite3_file methods.
27312: **
27313: ********************** End sqlite3_file Methods *******************************
27314: ******************************************************************************/
27315:
27316: /*
27317: ** This division contains definitions of sqlite3_io_methods objects that
27318: ** implement various file locking strategies. It also contains definitions
27319: ** of "finder" functions. A finder-function is used to locate the appropriate
27320: ** sqlite3_io_methods object for a particular database file. The pAppData
27321: ** field of the sqlite3_vfs VFS objects are initialized to be pointers to
27322: ** the correct finder-function for that VFS.
27323: **
27324: ** Most finder functions return a pointer to a fixed sqlite3_io_methods
27325: ** object. The only interesting finder-function is autolockIoFinder, which
27326: ** looks at the filesystem type and tries to guess the best locking
27327: ** strategy from that.
27328: **
27329: ** For finder-funtion F, two objects are created:
27330: **
27331: ** (1) The real finder-function named "FImpt()".
27332: **
27333: ** (2) A constant pointer to this function named just "F".
27334: **
27335: **
27336: ** A pointer to the F pointer is used as the pAppData value for VFS
27337: ** objects. We have to do this instead of letting pAppData point
27338: ** directly at the finder-function since C90 rules prevent a void*
27339: ** from be cast into a function pointer.
27340: **
27341: **
27342: ** Each instance of this macro generates two objects:
27343: **
27344: ** * A constant sqlite3_io_methods object call METHOD that has locking
27345: ** methods CLOSE, LOCK, UNLOCK, CKRESLOCK.
27346: **
27347: ** * An I/O method finder function called FINDER that returns a pointer
27348: ** to the METHOD object in the previous bullet.
27349: */
27350: #define IOMETHODS(FINDER, METHOD, VERSION, CLOSE, LOCK, UNLOCK, CKLOCK) \
27351: static const sqlite3_io_methods METHOD = { \
27352: VERSION, /* iVersion */ \
27353: CLOSE, /* xClose */ \
27354: unixRead, /* xRead */ \
27355: unixWrite, /* xWrite */ \
27356: unixTruncate, /* xTruncate */ \
27357: unixSync, /* xSync */ \
27358: unixFileSize, /* xFileSize */ \
27359: LOCK, /* xLock */ \
27360: UNLOCK, /* xUnlock */ \
27361: CKLOCK, /* xCheckReservedLock */ \
27362: unixFileControl, /* xFileControl */ \
27363: unixSectorSize, /* xSectorSize */ \
27364: unixDeviceCharacteristics, /* xDeviceCapabilities */ \
27365: unixShmMap, /* xShmMap */ \
27366: unixShmLock, /* xShmLock */ \
27367: unixShmBarrier, /* xShmBarrier */ \
27368: unixShmUnmap /* xShmUnmap */ \
27369: }; \
27370: static const sqlite3_io_methods *FINDER##Impl(const char *z, unixFile *p){ \
27371: UNUSED_PARAMETER(z); UNUSED_PARAMETER(p); \
27372: return &METHOD; \
27373: } \
27374: static const sqlite3_io_methods *(*const FINDER)(const char*,unixFile *p) \
27375: = FINDER##Impl;
27376:
27377: /*
27378: ** Here are all of the sqlite3_io_methods objects for each of the
27379: ** locking strategies. Functions that return pointers to these methods
27380: ** are also created.
27381: */
27382: IOMETHODS(
27383: posixIoFinder, /* Finder function name */
27384: posixIoMethods, /* sqlite3_io_methods object name */
27385: 2, /* shared memory is enabled */
27386: unixClose, /* xClose method */
27387: unixLock, /* xLock method */
27388: unixUnlock, /* xUnlock method */
27389: unixCheckReservedLock /* xCheckReservedLock method */
27390: )
27391: IOMETHODS(
27392: nolockIoFinder, /* Finder function name */
27393: nolockIoMethods, /* sqlite3_io_methods object name */
27394: 1, /* shared memory is disabled */
27395: nolockClose, /* xClose method */
27396: nolockLock, /* xLock method */
27397: nolockUnlock, /* xUnlock method */
27398: nolockCheckReservedLock /* xCheckReservedLock method */
27399: )
27400: IOMETHODS(
27401: dotlockIoFinder, /* Finder function name */
27402: dotlockIoMethods, /* sqlite3_io_methods object name */
27403: 1, /* shared memory is disabled */
27404: dotlockClose, /* xClose method */
27405: dotlockLock, /* xLock method */
27406: dotlockUnlock, /* xUnlock method */
27407: dotlockCheckReservedLock /* xCheckReservedLock method */
27408: )
27409:
27410: #if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS
27411: IOMETHODS(
27412: flockIoFinder, /* Finder function name */
27413: flockIoMethods, /* sqlite3_io_methods object name */
27414: 1, /* shared memory is disabled */
27415: flockClose, /* xClose method */
27416: flockLock, /* xLock method */
27417: flockUnlock, /* xUnlock method */
27418: flockCheckReservedLock /* xCheckReservedLock method */
27419: )
27420: #endif
27421:
27422: #if OS_VXWORKS
27423: IOMETHODS(
27424: semIoFinder, /* Finder function name */
27425: semIoMethods, /* sqlite3_io_methods object name */
27426: 1, /* shared memory is disabled */
27427: semClose, /* xClose method */
27428: semLock, /* xLock method */
27429: semUnlock, /* xUnlock method */
27430: semCheckReservedLock /* xCheckReservedLock method */
27431: )
27432: #endif
27433:
27434: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27435: IOMETHODS(
27436: afpIoFinder, /* Finder function name */
27437: afpIoMethods, /* sqlite3_io_methods object name */
27438: 1, /* shared memory is disabled */
27439: afpClose, /* xClose method */
27440: afpLock, /* xLock method */
27441: afpUnlock, /* xUnlock method */
27442: afpCheckReservedLock /* xCheckReservedLock method */
27443: )
27444: #endif
27445:
27446: /*
27447: ** The proxy locking method is a "super-method" in the sense that it
27448: ** opens secondary file descriptors for the conch and lock files and
27449: ** it uses proxy, dot-file, AFP, and flock() locking methods on those
27450: ** secondary files. For this reason, the division that implements
27451: ** proxy locking is located much further down in the file. But we need
27452: ** to go ahead and define the sqlite3_io_methods and finder function
27453: ** for proxy locking here. So we forward declare the I/O methods.
27454: */
27455: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27456: static int proxyClose(sqlite3_file*);
27457: static int proxyLock(sqlite3_file*, int);
27458: static int proxyUnlock(sqlite3_file*, int);
27459: static int proxyCheckReservedLock(sqlite3_file*, int*);
27460: IOMETHODS(
27461: proxyIoFinder, /* Finder function name */
27462: proxyIoMethods, /* sqlite3_io_methods object name */
27463: 1, /* shared memory is disabled */
27464: proxyClose, /* xClose method */
27465: proxyLock, /* xLock method */
27466: proxyUnlock, /* xUnlock method */
27467: proxyCheckReservedLock /* xCheckReservedLock method */
27468: )
27469: #endif
27470:
27471: /* nfs lockd on OSX 10.3+ doesn't clear write locks when a read lock is set */
27472: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27473: IOMETHODS(
27474: nfsIoFinder, /* Finder function name */
27475: nfsIoMethods, /* sqlite3_io_methods object name */
27476: 1, /* shared memory is disabled */
27477: unixClose, /* xClose method */
27478: unixLock, /* xLock method */
27479: nfsUnlock, /* xUnlock method */
27480: unixCheckReservedLock /* xCheckReservedLock method */
27481: )
27482: #endif
27483:
27484: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27485: /*
27486: ** This "finder" function attempts to determine the best locking strategy
27487: ** for the database file "filePath". It then returns the sqlite3_io_methods
27488: ** object that implements that strategy.
27489: **
27490: ** This is for MacOSX only.
27491: */
27492: static const sqlite3_io_methods *autolockIoFinderImpl(
27493: const char *filePath, /* name of the database file */
27494: unixFile *pNew /* open file object for the database file */
27495: ){
27496: static const struct Mapping {
27497: const char *zFilesystem; /* Filesystem type name */
27498: const sqlite3_io_methods *pMethods; /* Appropriate locking method */
27499: } aMap[] = {
27500: { "hfs", &posixIoMethods },
27501: { "ufs", &posixIoMethods },
27502: { "afpfs", &afpIoMethods },
27503: { "smbfs", &afpIoMethods },
27504: { "webdav", &nolockIoMethods },
27505: { 0, 0 }
27506: };
27507: int i;
27508: struct statfs fsInfo;
27509: struct flock lockInfo;
27510:
27511: if( !filePath ){
27512: /* If filePath==NULL that means we are dealing with a transient file
27513: ** that does not need to be locked. */
27514: return &nolockIoMethods;
27515: }
27516: if( statfs(filePath, &fsInfo) != -1 ){
27517: if( fsInfo.f_flags & MNT_RDONLY ){
27518: return &nolockIoMethods;
27519: }
27520: for(i=0; aMap[i].zFilesystem; i++){
27521: if( strcmp(fsInfo.f_fstypename, aMap[i].zFilesystem)==0 ){
27522: return aMap[i].pMethods;
27523: }
27524: }
27525: }
27526:
27527: /* Default case. Handles, amongst others, "nfs".
27528: ** Test byte-range lock using fcntl(). If the call succeeds,
27529: ** assume that the file-system supports POSIX style locks.
27530: */
27531: lockInfo.l_len = 1;
27532: lockInfo.l_start = 0;
27533: lockInfo.l_whence = SEEK_SET;
27534: lockInfo.l_type = F_RDLCK;
27535: if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) {
27536: if( strcmp(fsInfo.f_fstypename, "nfs")==0 ){
27537: return &nfsIoMethods;
27538: } else {
27539: return &posixIoMethods;
27540: }
27541: }else{
27542: return &dotlockIoMethods;
27543: }
27544: }
27545: static const sqlite3_io_methods
27546: *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl;
27547:
27548: #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
27549:
27550: #if OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE
27551: /*
27552: ** This "finder" function attempts to determine the best locking strategy
27553: ** for the database file "filePath". It then returns the sqlite3_io_methods
27554: ** object that implements that strategy.
27555: **
27556: ** This is for VXWorks only.
27557: */
27558: static const sqlite3_io_methods *autolockIoFinderImpl(
27559: const char *filePath, /* name of the database file */
27560: unixFile *pNew /* the open file object */
27561: ){
27562: struct flock lockInfo;
27563:
27564: if( !filePath ){
27565: /* If filePath==NULL that means we are dealing with a transient file
27566: ** that does not need to be locked. */
27567: return &nolockIoMethods;
27568: }
27569:
27570: /* Test if fcntl() is supported and use POSIX style locks.
27571: ** Otherwise fall back to the named semaphore method.
27572: */
27573: lockInfo.l_len = 1;
27574: lockInfo.l_start = 0;
27575: lockInfo.l_whence = SEEK_SET;
27576: lockInfo.l_type = F_RDLCK;
27577: if( osFcntl(pNew->h, F_GETLK, &lockInfo)!=-1 ) {
27578: return &posixIoMethods;
27579: }else{
27580: return &semIoMethods;
27581: }
27582: }
27583: static const sqlite3_io_methods
27584: *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl;
27585:
27586: #endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */
27587:
27588: /*
27589: ** An abstract type for a pointer to a IO method finder function:
27590: */
27591: typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*);
27592:
27593:
27594: /****************************************************************************
27595: **************************** sqlite3_vfs methods ****************************
27596: **
27597: ** This division contains the implementation of methods on the
27598: ** sqlite3_vfs object.
27599: */
27600:
27601: /*
27602: ** Initialize the contents of the unixFile structure pointed to by pId.
27603: */
27604: static int fillInUnixFile(
27605: sqlite3_vfs *pVfs, /* Pointer to vfs object */
27606: int h, /* Open file descriptor of file being opened */
27607: sqlite3_file *pId, /* Write to the unixFile structure here */
27608: const char *zFilename, /* Name of the file being opened */
27609: int ctrlFlags /* Zero or more UNIXFILE_* values */
27610: ){
27611: const sqlite3_io_methods *pLockingStyle;
27612: unixFile *pNew = (unixFile *)pId;
27613: int rc = SQLITE_OK;
27614:
27615: assert( pNew->pInode==NULL );
27616:
27617: /* Usually the path zFilename should not be a relative pathname. The
27618: ** exception is when opening the proxy "conch" file in builds that
27619: ** include the special Apple locking styles.
27620: */
27621: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27622: assert( zFilename==0 || zFilename[0]=='/'
27623: || pVfs->pAppData==(void*)&autolockIoFinder );
27624: #else
27625: assert( zFilename==0 || zFilename[0]=='/' );
27626: #endif
27627:
27628: /* No locking occurs in temporary files */
27629: assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 );
27630:
27631: OSTRACE(("OPEN %-3d %s\n", h, zFilename));
27632: pNew->h = h;
27633: pNew->pVfs = pVfs;
27634: pNew->zPath = zFilename;
27635: pNew->ctrlFlags = (u8)ctrlFlags;
27636: if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0),
27637: "psow", SQLITE_POWERSAFE_OVERWRITE) ){
27638: pNew->ctrlFlags |= UNIXFILE_PSOW;
27639: }
27640: if( memcmp(pVfs->zName,"unix-excl",10)==0 ){
27641: pNew->ctrlFlags |= UNIXFILE_EXCL;
27642: }
27643:
27644: #if OS_VXWORKS
27645: pNew->pId = vxworksFindFileId(zFilename);
27646: if( pNew->pId==0 ){
27647: ctrlFlags |= UNIXFILE_NOLOCK;
27648: rc = SQLITE_NOMEM;
27649: }
27650: #endif
27651:
27652: if( ctrlFlags & UNIXFILE_NOLOCK ){
27653: pLockingStyle = &nolockIoMethods;
27654: }else{
27655: pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew);
27656: #if SQLITE_ENABLE_LOCKING_STYLE
27657: /* Cache zFilename in the locking context (AFP and dotlock override) for
27658: ** proxyLock activation is possible (remote proxy is based on db name)
27659: ** zFilename remains valid until file is closed, to support */
27660: pNew->lockingContext = (void*)zFilename;
27661: #endif
27662: }
27663:
27664: if( pLockingStyle == &posixIoMethods
27665: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
27666: || pLockingStyle == &nfsIoMethods
27667: #endif
27668: ){
27669: unixEnterMutex();
27670: rc = findInodeInfo(pNew, &pNew->pInode);
27671: if( rc!=SQLITE_OK ){
27672: /* If an error occured in findInodeInfo(), close the file descriptor
27673: ** immediately, before releasing the mutex. findInodeInfo() may fail
27674: ** in two scenarios:
27675: **
27676: ** (a) A call to fstat() failed.
27677: ** (b) A malloc failed.
27678: **
27679: ** Scenario (b) may only occur if the process is holding no other
27680: ** file descriptors open on the same file. If there were other file
27681: ** descriptors on this file, then no malloc would be required by
27682: ** findInodeInfo(). If this is the case, it is quite safe to close
27683: ** handle h - as it is guaranteed that no posix locks will be released
27684: ** by doing so.
27685: **
27686: ** If scenario (a) caused the error then things are not so safe. The
27687: ** implicit assumption here is that if fstat() fails, things are in
27688: ** such bad shape that dropping a lock or two doesn't matter much.
27689: */
27690: robust_close(pNew, h, __LINE__);
27691: h = -1;
27692: }
27693: unixLeaveMutex();
27694: }
27695:
27696: #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
27697: else if( pLockingStyle == &afpIoMethods ){
27698: /* AFP locking uses the file path so it needs to be included in
27699: ** the afpLockingContext.
27700: */
27701: afpLockingContext *pCtx;
27702: pNew->lockingContext = pCtx = sqlite3_malloc( sizeof(*pCtx) );
27703: if( pCtx==0 ){
27704: rc = SQLITE_NOMEM;
27705: }else{
27706: /* NB: zFilename exists and remains valid until the file is closed
27707: ** according to requirement F11141. So we do not need to make a
27708: ** copy of the filename. */
27709: pCtx->dbPath = zFilename;
27710: pCtx->reserved = 0;
27711: srandomdev();
27712: unixEnterMutex();
27713: rc = findInodeInfo(pNew, &pNew->pInode);
27714: if( rc!=SQLITE_OK ){
27715: sqlite3_free(pNew->lockingContext);
27716: robust_close(pNew, h, __LINE__);
27717: h = -1;
27718: }
27719: unixLeaveMutex();
27720: }
27721: }
27722: #endif
27723:
27724: else if( pLockingStyle == &dotlockIoMethods ){
27725: /* Dotfile locking uses the file path so it needs to be included in
27726: ** the dotlockLockingContext
27727: */
27728: char *zLockFile;
27729: int nFilename;
27730: assert( zFilename!=0 );
27731: nFilename = (int)strlen(zFilename) + 6;
27732: zLockFile = (char *)sqlite3_malloc(nFilename);
27733: if( zLockFile==0 ){
27734: rc = SQLITE_NOMEM;
27735: }else{
27736: sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename);
27737: }
27738: pNew->lockingContext = zLockFile;
27739: }
27740:
27741: #if OS_VXWORKS
27742: else if( pLockingStyle == &semIoMethods ){
27743: /* Named semaphore locking uses the file path so it needs to be
27744: ** included in the semLockingContext
27745: */
27746: unixEnterMutex();
27747: rc = findInodeInfo(pNew, &pNew->pInode);
27748: if( (rc==SQLITE_OK) && (pNew->pInode->pSem==NULL) ){
27749: char *zSemName = pNew->pInode->aSemName;
27750: int n;
27751: sqlite3_snprintf(MAX_PATHNAME, zSemName, "/%s.sem",
27752: pNew->pId->zCanonicalName);
27753: for( n=1; zSemName[n]; n++ )
27754: if( zSemName[n]=='/' ) zSemName[n] = '_';
27755: pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1);
27756: if( pNew->pInode->pSem == SEM_FAILED ){
27757: rc = SQLITE_NOMEM;
27758: pNew->pInode->aSemName[0] = '\0';
27759: }
27760: }
27761: unixLeaveMutex();
27762: }
27763: #endif
27764:
27765: pNew->lastErrno = 0;
27766: #if OS_VXWORKS
27767: if( rc!=SQLITE_OK ){
27768: if( h>=0 ) robust_close(pNew, h, __LINE__);
27769: h = -1;
27770: osUnlink(zFilename);
27771: isDelete = 0;
27772: }
27773: if( isDelete ) pNew->ctrlFlags |= UNIXFILE_DELETE;
27774: #endif
27775: if( rc!=SQLITE_OK ){
27776: if( h>=0 ) robust_close(pNew, h, __LINE__);
27777: }else{
27778: pNew->pMethod = pLockingStyle;
27779: OpenCounter(+1);
27780: }
27781: return rc;
27782: }
27783:
27784: /*
27785: ** Return the name of a directory in which to put temporary files.
27786: ** If no suitable temporary file directory can be found, return NULL.
27787: */
27788: static const char *unixTempFileDir(void){
27789: static const char *azDirs[] = {
27790: 0,
27791: 0,
27792: "/var/tmp",
27793: "/usr/tmp",
27794: "/tmp",
27795: 0 /* List terminator */
27796: };
27797: unsigned int i;
27798: struct stat buf;
27799: const char *zDir = 0;
27800:
27801: azDirs[0] = sqlite3_temp_directory;
27802: if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR");
27803: for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){
27804: if( zDir==0 ) continue;
27805: if( osStat(zDir, &buf) ) continue;
27806: if( !S_ISDIR(buf.st_mode) ) continue;
27807: if( osAccess(zDir, 07) ) continue;
27808: break;
27809: }
27810: return zDir;
27811: }
27812:
27813: /*
27814: ** Create a temporary file name in zBuf. zBuf must be allocated
27815: ** by the calling process and must be big enough to hold at least
27816: ** pVfs->mxPathname bytes.
27817: */
27818: static int unixGetTempname(int nBuf, char *zBuf){
27819: static const unsigned char zChars[] =
27820: "abcdefghijklmnopqrstuvwxyz"
27821: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
27822: "0123456789";
27823: unsigned int i, j;
27824: const char *zDir;
27825:
27826: /* It's odd to simulate an io-error here, but really this is just
27827: ** using the io-error infrastructure to test that SQLite handles this
27828: ** function failing.
27829: */
27830: SimulateIOError( return SQLITE_IOERR );
27831:
27832: zDir = unixTempFileDir();
27833: if( zDir==0 ) zDir = ".";
27834:
27835: /* Check that the output buffer is large enough for the temporary file
27836: ** name. If it is not, return SQLITE_ERROR.
27837: */
27838: if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 18) >= (size_t)nBuf ){
27839: return SQLITE_ERROR;
27840: }
27841:
27842: do{
27843: sqlite3_snprintf(nBuf-18, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir);
27844: j = (int)strlen(zBuf);
27845: sqlite3_randomness(15, &zBuf[j]);
27846: for(i=0; i<15; i++, j++){
27847: zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
27848: }
27849: zBuf[j] = 0;
27850: zBuf[j+1] = 0;
27851: }while( osAccess(zBuf,0)==0 );
27852: return SQLITE_OK;
27853: }
27854:
27855: #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
27856: /*
27857: ** Routine to transform a unixFile into a proxy-locking unixFile.
27858: ** Implementation in the proxy-lock division, but used by unixOpen()
27859: ** if SQLITE_PREFER_PROXY_LOCKING is defined.
27860: */
27861: static int proxyTransformUnixFile(unixFile*, const char*);
27862: #endif
27863:
27864: /*
27865: ** Search for an unused file descriptor that was opened on the database
27866: ** file (not a journal or master-journal file) identified by pathname
27867: ** zPath with SQLITE_OPEN_XXX flags matching those passed as the second
27868: ** argument to this function.
27869: **
27870: ** Such a file descriptor may exist if a database connection was closed
27871: ** but the associated file descriptor could not be closed because some
27872: ** other file descriptor open on the same file is holding a file-lock.
27873: ** Refer to comments in the unixClose() function and the lengthy comment
27874: ** describing "Posix Advisory Locking" at the start of this file for
27875: ** further details. Also, ticket #4018.
27876: **
27877: ** If a suitable file descriptor is found, then it is returned. If no
27878: ** such file descriptor is located, -1 is returned.
27879: */
27880: static UnixUnusedFd *findReusableFd(const char *zPath, int flags){
27881: UnixUnusedFd *pUnused = 0;
27882:
27883: /* Do not search for an unused file descriptor on vxworks. Not because
27884: ** vxworks would not benefit from the change (it might, we're not sure),
27885: ** but because no way to test it is currently available. It is better
27886: ** not to risk breaking vxworks support for the sake of such an obscure
27887: ** feature. */
27888: #if !OS_VXWORKS
27889: struct stat sStat; /* Results of stat() call */
27890:
27891: /* A stat() call may fail for various reasons. If this happens, it is
27892: ** almost certain that an open() call on the same path will also fail.
27893: ** For this reason, if an error occurs in the stat() call here, it is
27894: ** ignored and -1 is returned. The caller will try to open a new file
27895: ** descriptor on the same path, fail, and return an error to SQLite.
27896: **
27897: ** Even if a subsequent open() call does succeed, the consequences of
27898: ** not searching for a resusable file descriptor are not dire. */
27899: if( 0==osStat(zPath, &sStat) ){
27900: unixInodeInfo *pInode;
27901:
27902: unixEnterMutex();
27903: pInode = inodeList;
27904: while( pInode && (pInode->fileId.dev!=sStat.st_dev
27905: || pInode->fileId.ino!=sStat.st_ino) ){
27906: pInode = pInode->pNext;
27907: }
27908: if( pInode ){
27909: UnixUnusedFd **pp;
27910: for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext));
27911: pUnused = *pp;
27912: if( pUnused ){
27913: *pp = pUnused->pNext;
27914: }
27915: }
27916: unixLeaveMutex();
27917: }
27918: #endif /* if !OS_VXWORKS */
27919: return pUnused;
27920: }
27921:
27922: /*
27923: ** This function is called by unixOpen() to determine the unix permissions
27924: ** to create new files with. If no error occurs, then SQLITE_OK is returned
27925: ** and a value suitable for passing as the third argument to open(2) is
27926: ** written to *pMode. If an IO error occurs, an SQLite error code is
27927: ** returned and the value of *pMode is not modified.
27928: **
1.2.2.1 ! misho 27929: ** In most cases cases, this routine sets *pMode to 0, which will become
! 27930: ** an indication to robust_open() to create the file using
! 27931: ** SQLITE_DEFAULT_FILE_PERMISSIONS adjusted by the umask.
! 27932: ** But if the file being opened is a WAL or regular journal file, then
1.2 misho 27933: ** this function queries the file-system for the permissions on the
27934: ** corresponding database file and sets *pMode to this value. Whenever
27935: ** possible, WAL and journal files are created using the same permissions
27936: ** as the associated database file.
27937: **
27938: ** If the SQLITE_ENABLE_8_3_NAMES option is enabled, then the
27939: ** original filename is unavailable. But 8_3_NAMES is only used for
27940: ** FAT filesystems and permissions do not matter there, so just use
27941: ** the default permissions.
27942: */
27943: static int findCreateFileMode(
27944: const char *zPath, /* Path of file (possibly) being created */
27945: int flags, /* Flags passed as 4th argument to xOpen() */
1.2.2.1 ! misho 27946: mode_t *pMode, /* OUT: Permissions to open file with */
! 27947: uid_t *pUid, /* OUT: uid to set on the file */
! 27948: gid_t *pGid /* OUT: gid to set on the file */
1.2 misho 27949: ){
27950: int rc = SQLITE_OK; /* Return Code */
1.2.2.1 ! misho 27951: *pMode = 0;
! 27952: *pUid = 0;
! 27953: *pGid = 0;
1.2 misho 27954: if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){
27955: char zDb[MAX_PATHNAME+1]; /* Database file path */
27956: int nDb; /* Number of valid bytes in zDb */
27957: struct stat sStat; /* Output of stat() on database file */
27958:
27959: /* zPath is a path to a WAL or journal file. The following block derives
27960: ** the path to the associated database file from zPath. This block handles
27961: ** the following naming conventions:
27962: **
27963: ** "<path to db>-journal"
27964: ** "<path to db>-wal"
27965: ** "<path to db>-journalNN"
27966: ** "<path to db>-walNN"
27967: **
27968: ** where NN is a decimal number. The NN naming schemes are
27969: ** used by the test_multiplex.c module.
27970: */
27971: nDb = sqlite3Strlen30(zPath) - 1;
27972: #ifdef SQLITE_ENABLE_8_3_NAMES
27973: while( nDb>0 && sqlite3Isalnum(zPath[nDb]) ) nDb--;
27974: if( nDb==0 || zPath[nDb]!='-' ) return SQLITE_OK;
27975: #else
27976: while( zPath[nDb]!='-' ){
27977: assert( nDb>0 );
27978: assert( zPath[nDb]!='\n' );
27979: nDb--;
27980: }
27981: #endif
27982: memcpy(zDb, zPath, nDb);
27983: zDb[nDb] = '\0';
27984:
27985: if( 0==osStat(zDb, &sStat) ){
27986: *pMode = sStat.st_mode & 0777;
1.2.2.1 ! misho 27987: *pUid = sStat.st_uid;
! 27988: *pGid = sStat.st_gid;
1.2 misho 27989: }else{
27990: rc = SQLITE_IOERR_FSTAT;
27991: }
27992: }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){
27993: *pMode = 0600;
27994: }
27995: return rc;
27996: }
27997:
27998: /*
27999: ** Open the file zPath.
28000: **
28001: ** Previously, the SQLite OS layer used three functions in place of this
28002: ** one:
28003: **
28004: ** sqlite3OsOpenReadWrite();
28005: ** sqlite3OsOpenReadOnly();
28006: ** sqlite3OsOpenExclusive();
28007: **
28008: ** These calls correspond to the following combinations of flags:
28009: **
28010: ** ReadWrite() -> (READWRITE | CREATE)
28011: ** ReadOnly() -> (READONLY)
28012: ** OpenExclusive() -> (READWRITE | CREATE | EXCLUSIVE)
28013: **
28014: ** The old OpenExclusive() accepted a boolean argument - "delFlag". If
28015: ** true, the file was configured to be automatically deleted when the
28016: ** file handle closed. To achieve the same effect using this new
28017: ** interface, add the DELETEONCLOSE flag to those specified above for
28018: ** OpenExclusive().
28019: */
28020: static int unixOpen(
28021: sqlite3_vfs *pVfs, /* The VFS for which this is the xOpen method */
28022: const char *zPath, /* Pathname of file to be opened */
28023: sqlite3_file *pFile, /* The file descriptor to be filled in */
28024: int flags, /* Input flags to control the opening */
28025: int *pOutFlags /* Output flags returned to SQLite core */
28026: ){
28027: unixFile *p = (unixFile *)pFile;
28028: int fd = -1; /* File descriptor returned by open() */
28029: int openFlags = 0; /* Flags to pass to open() */
28030: int eType = flags&0xFFFFFF00; /* Type of file to open */
28031: int noLock; /* True to omit locking primitives */
28032: int rc = SQLITE_OK; /* Function Return Code */
28033: int ctrlFlags = 0; /* UNIXFILE_* flags */
28034:
28035: int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
28036: int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE);
28037: int isCreate = (flags & SQLITE_OPEN_CREATE);
28038: int isReadonly = (flags & SQLITE_OPEN_READONLY);
28039: int isReadWrite = (flags & SQLITE_OPEN_READWRITE);
28040: #if SQLITE_ENABLE_LOCKING_STYLE
28041: int isAutoProxy = (flags & SQLITE_OPEN_AUTOPROXY);
28042: #endif
28043: #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE
28044: struct statfs fsInfo;
28045: #endif
28046:
28047: /* If creating a master or main-file journal, this function will open
28048: ** a file-descriptor on the directory too. The first time unixSync()
28049: ** is called the directory file descriptor will be fsync()ed and close()d.
28050: */
28051: int syncDir = (isCreate && (
28052: eType==SQLITE_OPEN_MASTER_JOURNAL
28053: || eType==SQLITE_OPEN_MAIN_JOURNAL
28054: || eType==SQLITE_OPEN_WAL
28055: ));
28056:
28057: /* If argument zPath is a NULL pointer, this function is required to open
28058: ** a temporary file. Use this buffer to store the file name in.
28059: */
28060: char zTmpname[MAX_PATHNAME+2];
28061: const char *zName = zPath;
28062:
28063: /* Check the following statements are true:
28064: **
28065: ** (a) Exactly one of the READWRITE and READONLY flags must be set, and
28066: ** (b) if CREATE is set, then READWRITE must also be set, and
28067: ** (c) if EXCLUSIVE is set, then CREATE must also be set.
28068: ** (d) if DELETEONCLOSE is set, then CREATE must also be set.
28069: */
28070: assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly));
28071: assert(isCreate==0 || isReadWrite);
28072: assert(isExclusive==0 || isCreate);
28073: assert(isDelete==0 || isCreate);
28074:
28075: /* The main DB, main journal, WAL file and master journal are never
28076: ** automatically deleted. Nor are they ever temporary files. */
28077: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB );
28078: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL );
28079: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL );
28080: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL );
28081:
28082: /* Assert that the upper layer has set one of the "file-type" flags. */
28083: assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
28084: || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL
28085: || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL
28086: || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL
28087: );
28088:
28089: memset(p, 0, sizeof(unixFile));
28090:
28091: if( eType==SQLITE_OPEN_MAIN_DB ){
28092: UnixUnusedFd *pUnused;
28093: pUnused = findReusableFd(zName, flags);
28094: if( pUnused ){
28095: fd = pUnused->fd;
28096: }else{
28097: pUnused = sqlite3_malloc(sizeof(*pUnused));
28098: if( !pUnused ){
28099: return SQLITE_NOMEM;
28100: }
28101: }
28102: p->pUnused = pUnused;
28103:
28104: /* Database filenames are double-zero terminated if they are not
28105: ** URIs with parameters. Hence, they can always be passed into
28106: ** sqlite3_uri_parameter(). */
28107: assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 );
28108:
28109: }else if( !zName ){
28110: /* If zName is NULL, the upper layer is requesting a temp file. */
28111: assert(isDelete && !syncDir);
28112: rc = unixGetTempname(MAX_PATHNAME+2, zTmpname);
28113: if( rc!=SQLITE_OK ){
28114: return rc;
28115: }
28116: zName = zTmpname;
28117:
28118: /* Generated temporary filenames are always double-zero terminated
28119: ** for use by sqlite3_uri_parameter(). */
28120: assert( zName[strlen(zName)+1]==0 );
28121: }
28122:
28123: /* Determine the value of the flags parameter passed to POSIX function
28124: ** open(). These must be calculated even if open() is not called, as
28125: ** they may be stored as part of the file handle and used by the
28126: ** 'conch file' locking functions later on. */
28127: if( isReadonly ) openFlags |= O_RDONLY;
28128: if( isReadWrite ) openFlags |= O_RDWR;
28129: if( isCreate ) openFlags |= O_CREAT;
28130: if( isExclusive ) openFlags |= (O_EXCL|O_NOFOLLOW);
28131: openFlags |= (O_LARGEFILE|O_BINARY);
28132:
28133: if( fd<0 ){
28134: mode_t openMode; /* Permissions to create file with */
1.2.2.1 ! misho 28135: uid_t uid; /* Userid for the file */
! 28136: gid_t gid; /* Groupid for the file */
! 28137: rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid);
1.2 misho 28138: if( rc!=SQLITE_OK ){
28139: assert( !p->pUnused );
28140: assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL );
28141: return rc;
28142: }
28143: fd = robust_open(zName, openFlags, openMode);
28144: OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags));
28145: if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){
28146: /* Failed to open the file for read/write access. Try read-only. */
28147: flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
28148: openFlags &= ~(O_RDWR|O_CREAT);
28149: flags |= SQLITE_OPEN_READONLY;
28150: openFlags |= O_RDONLY;
28151: isReadonly = 1;
28152: fd = robust_open(zName, openFlags, openMode);
28153: }
28154: if( fd<0 ){
28155: rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName);
28156: goto open_finished;
28157: }
1.2.2.1 ! misho 28158:
! 28159: /* If this process is running as root and if creating a new rollback
! 28160: ** journal or WAL file, set the ownership of the journal or WAL to be
! 28161: ** the same as the original database.
! 28162: */
! 28163: if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){
! 28164: osFchown(fd, uid, gid);
! 28165: }
1.2 misho 28166: }
28167: assert( fd>=0 );
28168: if( pOutFlags ){
28169: *pOutFlags = flags;
28170: }
28171:
28172: if( p->pUnused ){
28173: p->pUnused->fd = fd;
28174: p->pUnused->flags = flags;
28175: }
28176:
28177: if( isDelete ){
28178: #if OS_VXWORKS
28179: zPath = zName;
28180: #else
28181: osUnlink(zName);
28182: #endif
28183: }
28184: #if SQLITE_ENABLE_LOCKING_STYLE
28185: else{
28186: p->openFlags = openFlags;
28187: }
28188: #endif
28189:
28190: noLock = eType!=SQLITE_OPEN_MAIN_DB;
28191:
28192:
28193: #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE
28194: if( fstatfs(fd, &fsInfo) == -1 ){
28195: ((unixFile*)pFile)->lastErrno = errno;
28196: robust_close(p, fd, __LINE__);
28197: return SQLITE_IOERR_ACCESS;
28198: }
28199: if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) {
28200: ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS;
28201: }
28202: #endif
28203:
28204: /* Set up appropriate ctrlFlags */
28205: if( isDelete ) ctrlFlags |= UNIXFILE_DELETE;
28206: if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY;
28207: if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK;
28208: if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC;
28209: if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI;
28210:
28211: #if SQLITE_ENABLE_LOCKING_STYLE
28212: #if SQLITE_PREFER_PROXY_LOCKING
28213: isAutoProxy = 1;
28214: #endif
28215: if( isAutoProxy && (zPath!=NULL) && (!noLock) && pVfs->xOpen ){
28216: char *envforce = getenv("SQLITE_FORCE_PROXY_LOCKING");
28217: int useProxy = 0;
28218:
28219: /* SQLITE_FORCE_PROXY_LOCKING==1 means force always use proxy, 0 means
28220: ** never use proxy, NULL means use proxy for non-local files only. */
28221: if( envforce!=NULL ){
28222: useProxy = atoi(envforce)>0;
28223: }else{
28224: if( statfs(zPath, &fsInfo) == -1 ){
28225: /* In theory, the close(fd) call is sub-optimal. If the file opened
28226: ** with fd is a database file, and there are other connections open
28227: ** on that file that are currently holding advisory locks on it,
28228: ** then the call to close() will cancel those locks. In practice,
28229: ** we're assuming that statfs() doesn't fail very often. At least
28230: ** not while other file descriptors opened by the same process on
28231: ** the same file are working. */
28232: p->lastErrno = errno;
28233: robust_close(p, fd, __LINE__);
28234: rc = SQLITE_IOERR_ACCESS;
28235: goto open_finished;
28236: }
28237: useProxy = !(fsInfo.f_flags&MNT_LOCAL);
28238: }
28239: if( useProxy ){
28240: rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags);
28241: if( rc==SQLITE_OK ){
28242: rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:");
28243: if( rc!=SQLITE_OK ){
28244: /* Use unixClose to clean up the resources added in fillInUnixFile
28245: ** and clear all the structure's references. Specifically,
28246: ** pFile->pMethods will be NULL so sqlite3OsClose will be a no-op
28247: */
28248: unixClose(pFile);
28249: return rc;
28250: }
28251: }
28252: goto open_finished;
28253: }
28254: }
28255: #endif
28256:
28257: rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags);
28258:
28259: open_finished:
28260: if( rc!=SQLITE_OK ){
28261: sqlite3_free(p->pUnused);
28262: }
28263: return rc;
28264: }
28265:
28266:
28267: /*
28268: ** Delete the file at zPath. If the dirSync argument is true, fsync()
28269: ** the directory after deleting the file.
28270: */
28271: static int unixDelete(
28272: sqlite3_vfs *NotUsed, /* VFS containing this as the xDelete method */
28273: const char *zPath, /* Name of file to be deleted */
28274: int dirSync /* If true, fsync() directory after deleting file */
28275: ){
28276: int rc = SQLITE_OK;
28277: UNUSED_PARAMETER(NotUsed);
28278: SimulateIOError(return SQLITE_IOERR_DELETE);
1.2.2.1 ! misho 28279: if( osUnlink(zPath)==(-1) ){
! 28280: if( errno==ENOENT ){
! 28281: rc = SQLITE_IOERR_DELETE_NOENT;
! 28282: }else{
! 28283: rc = unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath);
! 28284: }
! 28285: return rc;
1.2 misho 28286: }
28287: #ifndef SQLITE_DISABLE_DIRSYNC
28288: if( (dirSync & 1)!=0 ){
28289: int fd;
28290: rc = osOpenDirectory(zPath, &fd);
28291: if( rc==SQLITE_OK ){
28292: #if OS_VXWORKS
28293: if( fsync(fd)==-1 )
28294: #else
28295: if( fsync(fd) )
28296: #endif
28297: {
28298: rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath);
28299: }
28300: robust_close(0, fd, __LINE__);
28301: }else if( rc==SQLITE_CANTOPEN ){
28302: rc = SQLITE_OK;
28303: }
28304: }
28305: #endif
28306: return rc;
28307: }
28308:
28309: /*
28310: ** Test the existance of or access permissions of file zPath. The
28311: ** test performed depends on the value of flags:
28312: **
28313: ** SQLITE_ACCESS_EXISTS: Return 1 if the file exists
28314: ** SQLITE_ACCESS_READWRITE: Return 1 if the file is read and writable.
28315: ** SQLITE_ACCESS_READONLY: Return 1 if the file is readable.
28316: **
28317: ** Otherwise return 0.
28318: */
28319: static int unixAccess(
28320: sqlite3_vfs *NotUsed, /* The VFS containing this xAccess method */
28321: const char *zPath, /* Path of the file to examine */
28322: int flags, /* What do we want to learn about the zPath file? */
28323: int *pResOut /* Write result boolean here */
28324: ){
28325: int amode = 0;
28326: UNUSED_PARAMETER(NotUsed);
28327: SimulateIOError( return SQLITE_IOERR_ACCESS; );
28328: switch( flags ){
28329: case SQLITE_ACCESS_EXISTS:
28330: amode = F_OK;
28331: break;
28332: case SQLITE_ACCESS_READWRITE:
28333: amode = W_OK|R_OK;
28334: break;
28335: case SQLITE_ACCESS_READ:
28336: amode = R_OK;
28337: break;
28338:
28339: default:
28340: assert(!"Invalid flags argument");
28341: }
28342: *pResOut = (osAccess(zPath, amode)==0);
28343: if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){
28344: struct stat buf;
28345: if( 0==osStat(zPath, &buf) && buf.st_size==0 ){
28346: *pResOut = 0;
28347: }
28348: }
28349: return SQLITE_OK;
28350: }
28351:
28352:
28353: /*
28354: ** Turn a relative pathname into a full pathname. The relative path
28355: ** is stored as a nul-terminated string in the buffer pointed to by
28356: ** zPath.
28357: **
28358: ** zOut points to a buffer of at least sqlite3_vfs.mxPathname bytes
28359: ** (in this case, MAX_PATHNAME bytes). The full-path is written to
28360: ** this buffer before returning.
28361: */
28362: static int unixFullPathname(
28363: sqlite3_vfs *pVfs, /* Pointer to vfs object */
28364: const char *zPath, /* Possibly relative input path */
28365: int nOut, /* Size of output buffer in bytes */
28366: char *zOut /* Output buffer */
28367: ){
28368:
28369: /* It's odd to simulate an io-error here, but really this is just
28370: ** using the io-error infrastructure to test that SQLite handles this
28371: ** function failing. This function could fail if, for example, the
28372: ** current working directory has been unlinked.
28373: */
28374: SimulateIOError( return SQLITE_ERROR );
28375:
28376: assert( pVfs->mxPathname==MAX_PATHNAME );
28377: UNUSED_PARAMETER(pVfs);
28378:
28379: zOut[nOut-1] = '\0';
28380: if( zPath[0]=='/' ){
28381: sqlite3_snprintf(nOut, zOut, "%s", zPath);
28382: }else{
28383: int nCwd;
28384: if( osGetcwd(zOut, nOut-1)==0 ){
28385: return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath);
28386: }
28387: nCwd = (int)strlen(zOut);
28388: sqlite3_snprintf(nOut-nCwd, &zOut[nCwd], "/%s", zPath);
28389: }
28390: return SQLITE_OK;
28391: }
28392:
28393:
28394: #ifndef SQLITE_OMIT_LOAD_EXTENSION
28395: /*
28396: ** Interfaces for opening a shared library, finding entry points
28397: ** within the shared library, and closing the shared library.
28398: */
28399: #include <dlfcn.h>
28400: static void *unixDlOpen(sqlite3_vfs *NotUsed, const char *zFilename){
28401: UNUSED_PARAMETER(NotUsed);
28402: return dlopen(zFilename, RTLD_NOW | RTLD_GLOBAL);
28403: }
28404:
28405: /*
28406: ** SQLite calls this function immediately after a call to unixDlSym() or
28407: ** unixDlOpen() fails (returns a null pointer). If a more detailed error
28408: ** message is available, it is written to zBufOut. If no error message
28409: ** is available, zBufOut is left unmodified and SQLite uses a default
28410: ** error message.
28411: */
28412: static void unixDlError(sqlite3_vfs *NotUsed, int nBuf, char *zBufOut){
28413: const char *zErr;
28414: UNUSED_PARAMETER(NotUsed);
28415: unixEnterMutex();
28416: zErr = dlerror();
28417: if( zErr ){
28418: sqlite3_snprintf(nBuf, zBufOut, "%s", zErr);
28419: }
28420: unixLeaveMutex();
28421: }
28422: static void (*unixDlSym(sqlite3_vfs *NotUsed, void *p, const char*zSym))(void){
28423: /*
28424: ** GCC with -pedantic-errors says that C90 does not allow a void* to be
28425: ** cast into a pointer to a function. And yet the library dlsym() routine
28426: ** returns a void* which is really a pointer to a function. So how do we
28427: ** use dlsym() with -pedantic-errors?
28428: **
28429: ** Variable x below is defined to be a pointer to a function taking
28430: ** parameters void* and const char* and returning a pointer to a function.
28431: ** We initialize x by assigning it a pointer to the dlsym() function.
28432: ** (That assignment requires a cast.) Then we call the function that
28433: ** x points to.
28434: **
28435: ** This work-around is unlikely to work correctly on any system where
28436: ** you really cannot cast a function pointer into void*. But then, on the
28437: ** other hand, dlsym() will not work on such a system either, so we have
28438: ** not really lost anything.
28439: */
28440: void (*(*x)(void*,const char*))(void);
28441: UNUSED_PARAMETER(NotUsed);
28442: x = (void(*(*)(void*,const char*))(void))dlsym;
28443: return (*x)(p, zSym);
28444: }
28445: static void unixDlClose(sqlite3_vfs *NotUsed, void *pHandle){
28446: UNUSED_PARAMETER(NotUsed);
28447: dlclose(pHandle);
28448: }
28449: #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
28450: #define unixDlOpen 0
28451: #define unixDlError 0
28452: #define unixDlSym 0
28453: #define unixDlClose 0
28454: #endif
28455:
28456: /*
28457: ** Write nBuf bytes of random data to the supplied buffer zBuf.
28458: */
28459: static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){
28460: UNUSED_PARAMETER(NotUsed);
28461: assert((size_t)nBuf>=(sizeof(time_t)+sizeof(int)));
28462:
28463: /* We have to initialize zBuf to prevent valgrind from reporting
28464: ** errors. The reports issued by valgrind are incorrect - we would
28465: ** prefer that the randomness be increased by making use of the
28466: ** uninitialized space in zBuf - but valgrind errors tend to worry
28467: ** some users. Rather than argue, it seems easier just to initialize
28468: ** the whole array and silence valgrind, even if that means less randomness
28469: ** in the random seed.
28470: **
28471: ** When testing, initializing zBuf[] to zero is all we do. That means
28472: ** that we always use the same random number sequence. This makes the
28473: ** tests repeatable.
28474: */
28475: memset(zBuf, 0, nBuf);
28476: #if !defined(SQLITE_TEST)
28477: {
1.2.2.1 ! misho 28478: int pid, fd, got;
1.2 misho 28479: fd = robust_open("/dev/urandom", O_RDONLY, 0);
28480: if( fd<0 ){
28481: time_t t;
28482: time(&t);
28483: memcpy(zBuf, &t, sizeof(t));
28484: pid = getpid();
28485: memcpy(&zBuf[sizeof(t)], &pid, sizeof(pid));
28486: assert( sizeof(t)+sizeof(pid)<=(size_t)nBuf );
28487: nBuf = sizeof(t) + sizeof(pid);
28488: }else{
1.2.2.1 ! misho 28489: do{ got = osRead(fd, zBuf, nBuf); }while( got<0 && errno==EINTR );
1.2 misho 28490: robust_close(0, fd, __LINE__);
28491: }
28492: }
28493: #endif
28494: return nBuf;
28495: }
28496:
28497:
28498: /*
28499: ** Sleep for a little while. Return the amount of time slept.
28500: ** The argument is the number of microseconds we want to sleep.
28501: ** The return value is the number of microseconds of sleep actually
28502: ** requested from the underlying operating system, a number which
28503: ** might be greater than or equal to the argument, but not less
28504: ** than the argument.
28505: */
28506: static int unixSleep(sqlite3_vfs *NotUsed, int microseconds){
28507: #if OS_VXWORKS
28508: struct timespec sp;
28509:
28510: sp.tv_sec = microseconds / 1000000;
28511: sp.tv_nsec = (microseconds % 1000000) * 1000;
28512: nanosleep(&sp, NULL);
28513: UNUSED_PARAMETER(NotUsed);
28514: return microseconds;
28515: #elif defined(HAVE_USLEEP) && HAVE_USLEEP
28516: usleep(microseconds);
28517: UNUSED_PARAMETER(NotUsed);
28518: return microseconds;
28519: #else
28520: int seconds = (microseconds+999999)/1000000;
28521: sleep(seconds);
28522: UNUSED_PARAMETER(NotUsed);
28523: return seconds*1000000;
28524: #endif
28525: }
28526:
28527: /*
28528: ** The following variable, if set to a non-zero value, is interpreted as
28529: ** the number of seconds since 1970 and is used to set the result of
28530: ** sqlite3OsCurrentTime() during testing.
28531: */
28532: #ifdef SQLITE_TEST
28533: SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
28534: #endif
28535:
28536: /*
28537: ** Find the current time (in Universal Coordinated Time). Write into *piNow
28538: ** the current time and date as a Julian Day number times 86_400_000. In
28539: ** other words, write into *piNow the number of milliseconds since the Julian
28540: ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
28541: ** proleptic Gregorian calendar.
28542: **
28543: ** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
28544: ** cannot be found.
28545: */
28546: static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){
28547: static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
28548: int rc = SQLITE_OK;
28549: #if defined(NO_GETTOD)
28550: time_t t;
28551: time(&t);
28552: *piNow = ((sqlite3_int64)t)*1000 + unixEpoch;
28553: #elif OS_VXWORKS
28554: struct timespec sNow;
28555: clock_gettime(CLOCK_REALTIME, &sNow);
28556: *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000;
28557: #else
28558: struct timeval sNow;
28559: if( gettimeofday(&sNow, 0)==0 ){
28560: *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000;
28561: }else{
28562: rc = SQLITE_ERROR;
28563: }
28564: #endif
28565:
28566: #ifdef SQLITE_TEST
28567: if( sqlite3_current_time ){
28568: *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
28569: }
28570: #endif
28571: UNUSED_PARAMETER(NotUsed);
28572: return rc;
28573: }
28574:
28575: /*
28576: ** Find the current time (in Universal Coordinated Time). Write the
28577: ** current time and date as a Julian Day number into *prNow and
28578: ** return 0. Return 1 if the time and date cannot be found.
28579: */
28580: static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){
28581: sqlite3_int64 i = 0;
28582: int rc;
28583: UNUSED_PARAMETER(NotUsed);
28584: rc = unixCurrentTimeInt64(0, &i);
28585: *prNow = i/86400000.0;
28586: return rc;
28587: }
28588:
28589: /*
28590: ** We added the xGetLastError() method with the intention of providing
28591: ** better low-level error messages when operating-system problems come up
28592: ** during SQLite operation. But so far, none of that has been implemented
28593: ** in the core. So this routine is never called. For now, it is merely
28594: ** a place-holder.
28595: */
28596: static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){
28597: UNUSED_PARAMETER(NotUsed);
28598: UNUSED_PARAMETER(NotUsed2);
28599: UNUSED_PARAMETER(NotUsed3);
28600: return 0;
28601: }
28602:
28603:
28604: /*
28605: ************************ End of sqlite3_vfs methods ***************************
28606: ******************************************************************************/
28607:
28608: /******************************************************************************
28609: ************************** Begin Proxy Locking ********************************
28610: **
28611: ** Proxy locking is a "uber-locking-method" in this sense: It uses the
28612: ** other locking methods on secondary lock files. Proxy locking is a
28613: ** meta-layer over top of the primitive locking implemented above. For
28614: ** this reason, the division that implements of proxy locking is deferred
28615: ** until late in the file (here) after all of the other I/O methods have
28616: ** been defined - so that the primitive locking methods are available
28617: ** as services to help with the implementation of proxy locking.
28618: **
28619: ****
28620: **
28621: ** The default locking schemes in SQLite use byte-range locks on the
28622: ** database file to coordinate safe, concurrent access by multiple readers
28623: ** and writers [http://sqlite.org/lockingv3.html]. The five file locking
28624: ** states (UNLOCKED, PENDING, SHARED, RESERVED, EXCLUSIVE) are implemented
28625: ** as POSIX read & write locks over fixed set of locations (via fsctl),
28626: ** on AFP and SMB only exclusive byte-range locks are available via fsctl
28627: ** with _IOWR('z', 23, struct ByteRangeLockPB2) to track the same 5 states.
28628: ** To simulate a F_RDLCK on the shared range, on AFP a randomly selected
28629: ** address in the shared range is taken for a SHARED lock, the entire
28630: ** shared range is taken for an EXCLUSIVE lock):
28631: **
1.2.2.1 ! misho 28632: ** PENDING_BYTE 0x40000000
1.2 misho 28633: ** RESERVED_BYTE 0x40000001
28634: ** SHARED_RANGE 0x40000002 -> 0x40000200
28635: **
28636: ** This works well on the local file system, but shows a nearly 100x
28637: ** slowdown in read performance on AFP because the AFP client disables
28638: ** the read cache when byte-range locks are present. Enabling the read
28639: ** cache exposes a cache coherency problem that is present on all OS X
28640: ** supported network file systems. NFS and AFP both observe the
28641: ** close-to-open semantics for ensuring cache coherency
28642: ** [http://nfs.sourceforge.net/#faq_a8], which does not effectively
28643: ** address the requirements for concurrent database access by multiple
28644: ** readers and writers
28645: ** [http://www.nabble.com/SQLite-on-NFS-cache-coherency-td15655701.html].
28646: **
28647: ** To address the performance and cache coherency issues, proxy file locking
28648: ** changes the way database access is controlled by limiting access to a
28649: ** single host at a time and moving file locks off of the database file
28650: ** and onto a proxy file on the local file system.
28651: **
28652: **
28653: ** Using proxy locks
28654: ** -----------------
28655: **
28656: ** C APIs
28657: **
28658: ** sqlite3_file_control(db, dbname, SQLITE_SET_LOCKPROXYFILE,
28659: ** <proxy_path> | ":auto:");
28660: ** sqlite3_file_control(db, dbname, SQLITE_GET_LOCKPROXYFILE, &<proxy_path>);
28661: **
28662: **
28663: ** SQL pragmas
28664: **
28665: ** PRAGMA [database.]lock_proxy_file=<proxy_path> | :auto:
28666: ** PRAGMA [database.]lock_proxy_file
28667: **
28668: ** Specifying ":auto:" means that if there is a conch file with a matching
28669: ** host ID in it, the proxy path in the conch file will be used, otherwise
28670: ** a proxy path based on the user's temp dir
28671: ** (via confstr(_CS_DARWIN_USER_TEMP_DIR,...)) will be used and the
28672: ** actual proxy file name is generated from the name and path of the
28673: ** database file. For example:
28674: **
28675: ** For database path "/Users/me/foo.db"
28676: ** The lock path will be "<tmpdir>/sqliteplocks/_Users_me_foo.db:auto:")
28677: **
28678: ** Once a lock proxy is configured for a database connection, it can not
28679: ** be removed, however it may be switched to a different proxy path via
28680: ** the above APIs (assuming the conch file is not being held by another
28681: ** connection or process).
28682: **
28683: **
28684: ** How proxy locking works
28685: ** -----------------------
28686: **
28687: ** Proxy file locking relies primarily on two new supporting files:
28688: **
28689: ** * conch file to limit access to the database file to a single host
28690: ** at a time
28691: **
28692: ** * proxy file to act as a proxy for the advisory locks normally
28693: ** taken on the database
28694: **
28695: ** The conch file - to use a proxy file, sqlite must first "hold the conch"
28696: ** by taking an sqlite-style shared lock on the conch file, reading the
28697: ** contents and comparing the host's unique host ID (see below) and lock
28698: ** proxy path against the values stored in the conch. The conch file is
28699: ** stored in the same directory as the database file and the file name
28700: ** is patterned after the database file name as ".<databasename>-conch".
28701: ** If the conch file does not exist, or it's contents do not match the
28702: ** host ID and/or proxy path, then the lock is escalated to an exclusive
28703: ** lock and the conch file contents is updated with the host ID and proxy
28704: ** path and the lock is downgraded to a shared lock again. If the conch
28705: ** is held by another process (with a shared lock), the exclusive lock
28706: ** will fail and SQLITE_BUSY is returned.
28707: **
28708: ** The proxy file - a single-byte file used for all advisory file locks
28709: ** normally taken on the database file. This allows for safe sharing
28710: ** of the database file for multiple readers and writers on the same
28711: ** host (the conch ensures that they all use the same local lock file).
28712: **
28713: ** Requesting the lock proxy does not immediately take the conch, it is
28714: ** only taken when the first request to lock database file is made.
28715: ** This matches the semantics of the traditional locking behavior, where
28716: ** opening a connection to a database file does not take a lock on it.
28717: ** The shared lock and an open file descriptor are maintained until
28718: ** the connection to the database is closed.
28719: **
28720: ** The proxy file and the lock file are never deleted so they only need
28721: ** to be created the first time they are used.
28722: **
28723: ** Configuration options
28724: ** ---------------------
28725: **
28726: ** SQLITE_PREFER_PROXY_LOCKING
28727: **
28728: ** Database files accessed on non-local file systems are
28729: ** automatically configured for proxy locking, lock files are
28730: ** named automatically using the same logic as
28731: ** PRAGMA lock_proxy_file=":auto:"
28732: **
28733: ** SQLITE_PROXY_DEBUG
28734: **
28735: ** Enables the logging of error messages during host id file
28736: ** retrieval and creation
28737: **
28738: ** LOCKPROXYDIR
28739: **
28740: ** Overrides the default directory used for lock proxy files that
28741: ** are named automatically via the ":auto:" setting
28742: **
28743: ** SQLITE_DEFAULT_PROXYDIR_PERMISSIONS
28744: **
28745: ** Permissions to use when creating a directory for storing the
28746: ** lock proxy files, only used when LOCKPROXYDIR is not set.
28747: **
28748: **
28749: ** As mentioned above, when compiled with SQLITE_PREFER_PROXY_LOCKING,
28750: ** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will
28751: ** force proxy locking to be used for every database file opened, and 0
28752: ** will force automatic proxy locking to be disabled for all database
28753: ** files (explicity calling the SQLITE_SET_LOCKPROXYFILE pragma or
28754: ** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING).
28755: */
28756:
28757: /*
28758: ** Proxy locking is only available on MacOSX
28759: */
28760: #if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE
28761:
28762: /*
28763: ** The proxyLockingContext has the path and file structures for the remote
28764: ** and local proxy files in it
28765: */
28766: typedef struct proxyLockingContext proxyLockingContext;
28767: struct proxyLockingContext {
28768: unixFile *conchFile; /* Open conch file */
28769: char *conchFilePath; /* Name of the conch file */
28770: unixFile *lockProxy; /* Open proxy lock file */
28771: char *lockProxyPath; /* Name of the proxy lock file */
28772: char *dbPath; /* Name of the open file */
28773: int conchHeld; /* 1 if the conch is held, -1 if lockless */
28774: void *oldLockingContext; /* Original lockingcontext to restore on close */
28775: sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */
28776: };
28777:
28778: /*
28779: ** The proxy lock file path for the database at dbPath is written into lPath,
28780: ** which must point to valid, writable memory large enough for a maxLen length
28781: ** file path.
28782: */
28783: static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){
28784: int len;
28785: int dbLen;
28786: int i;
28787:
28788: #ifdef LOCKPROXYDIR
28789: len = strlcpy(lPath, LOCKPROXYDIR, maxLen);
28790: #else
28791: # ifdef _CS_DARWIN_USER_TEMP_DIR
28792: {
28793: if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){
28794: OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n",
28795: lPath, errno, getpid()));
28796: return SQLITE_IOERR_LOCK;
28797: }
28798: len = strlcat(lPath, "sqliteplocks", maxLen);
28799: }
28800: # else
28801: len = strlcpy(lPath, "/tmp/", maxLen);
28802: # endif
28803: #endif
28804:
28805: if( lPath[len-1]!='/' ){
28806: len = strlcat(lPath, "/", maxLen);
28807: }
28808:
28809: /* transform the db path to a unique cache name */
28810: dbLen = (int)strlen(dbPath);
28811: for( i=0; i<dbLen && (i+len+7)<(int)maxLen; i++){
28812: char c = dbPath[i];
28813: lPath[i+len] = (c=='/')?'_':c;
28814: }
28815: lPath[i+len]='\0';
28816: strlcat(lPath, ":auto:", maxLen);
28817: OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, getpid()));
28818: return SQLITE_OK;
28819: }
28820:
28821: /*
28822: ** Creates the lock file and any missing directories in lockPath
28823: */
28824: static int proxyCreateLockPath(const char *lockPath){
28825: int i, len;
28826: char buf[MAXPATHLEN];
28827: int start = 0;
28828:
28829: assert(lockPath!=NULL);
28830: /* try to create all the intermediate directories */
28831: len = (int)strlen(lockPath);
28832: buf[0] = lockPath[0];
28833: for( i=1; i<len; i++ ){
28834: if( lockPath[i] == '/' && (i - start > 0) ){
28835: /* only mkdir if leaf dir != "." or "/" or ".." */
28836: if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/')
28837: || (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){
28838: buf[i]='\0';
28839: if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){
28840: int err=errno;
28841: if( err!=EEXIST ) {
28842: OSTRACE(("CREATELOCKPATH FAILED creating %s, "
28843: "'%s' proxy lock path=%s pid=%d\n",
28844: buf, strerror(err), lockPath, getpid()));
28845: return err;
28846: }
28847: }
28848: }
28849: start=i+1;
28850: }
28851: buf[i] = lockPath[i];
28852: }
28853: OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, getpid()));
28854: return 0;
28855: }
28856:
28857: /*
28858: ** Create a new VFS file descriptor (stored in memory obtained from
28859: ** sqlite3_malloc) and open the file named "path" in the file descriptor.
28860: **
28861: ** The caller is responsible not only for closing the file descriptor
28862: ** but also for freeing the memory associated with the file descriptor.
28863: */
28864: static int proxyCreateUnixFile(
28865: const char *path, /* path for the new unixFile */
28866: unixFile **ppFile, /* unixFile created and returned by ref */
28867: int islockfile /* if non zero missing dirs will be created */
28868: ) {
28869: int fd = -1;
28870: unixFile *pNew;
28871: int rc = SQLITE_OK;
28872: int openFlags = O_RDWR | O_CREAT;
28873: sqlite3_vfs dummyVfs;
28874: int terrno = 0;
28875: UnixUnusedFd *pUnused = NULL;
28876:
28877: /* 1. first try to open/create the file
28878: ** 2. if that fails, and this is a lock file (not-conch), try creating
28879: ** the parent directories and then try again.
28880: ** 3. if that fails, try to open the file read-only
28881: ** otherwise return BUSY (if lock file) or CANTOPEN for the conch file
28882: */
28883: pUnused = findReusableFd(path, openFlags);
28884: if( pUnused ){
28885: fd = pUnused->fd;
28886: }else{
28887: pUnused = sqlite3_malloc(sizeof(*pUnused));
28888: if( !pUnused ){
28889: return SQLITE_NOMEM;
28890: }
28891: }
28892: if( fd<0 ){
1.2.2.1 ! misho 28893: fd = robust_open(path, openFlags, 0);
1.2 misho 28894: terrno = errno;
28895: if( fd<0 && errno==ENOENT && islockfile ){
28896: if( proxyCreateLockPath(path) == SQLITE_OK ){
1.2.2.1 ! misho 28897: fd = robust_open(path, openFlags, 0);
1.2 misho 28898: }
28899: }
28900: }
28901: if( fd<0 ){
28902: openFlags = O_RDONLY;
1.2.2.1 ! misho 28903: fd = robust_open(path, openFlags, 0);
1.2 misho 28904: terrno = errno;
28905: }
28906: if( fd<0 ){
28907: if( islockfile ){
28908: return SQLITE_BUSY;
28909: }
28910: switch (terrno) {
28911: case EACCES:
28912: return SQLITE_PERM;
28913: case EIO:
28914: return SQLITE_IOERR_LOCK; /* even though it is the conch */
28915: default:
28916: return SQLITE_CANTOPEN_BKPT;
28917: }
28918: }
28919:
28920: pNew = (unixFile *)sqlite3_malloc(sizeof(*pNew));
28921: if( pNew==NULL ){
28922: rc = SQLITE_NOMEM;
28923: goto end_create_proxy;
28924: }
28925: memset(pNew, 0, sizeof(unixFile));
28926: pNew->openFlags = openFlags;
28927: memset(&dummyVfs, 0, sizeof(dummyVfs));
28928: dummyVfs.pAppData = (void*)&autolockIoFinder;
28929: dummyVfs.zName = "dummy";
28930: pUnused->fd = fd;
28931: pUnused->flags = openFlags;
28932: pNew->pUnused = pUnused;
28933:
28934: rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0);
28935: if( rc==SQLITE_OK ){
28936: *ppFile = pNew;
28937: return SQLITE_OK;
28938: }
28939: end_create_proxy:
28940: robust_close(pNew, fd, __LINE__);
28941: sqlite3_free(pNew);
28942: sqlite3_free(pUnused);
28943: return rc;
28944: }
28945:
28946: #ifdef SQLITE_TEST
28947: /* simulate multiple hosts by creating unique hostid file paths */
28948: SQLITE_API int sqlite3_hostid_num = 0;
28949: #endif
28950:
28951: #define PROXY_HOSTIDLEN 16 /* conch file host id length */
28952:
28953: /* Not always defined in the headers as it ought to be */
28954: extern int gethostuuid(uuid_t id, const struct timespec *wait);
28955:
28956: /* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN
28957: ** bytes of writable memory.
28958: */
28959: static int proxyGetHostID(unsigned char *pHostID, int *pError){
28960: assert(PROXY_HOSTIDLEN == sizeof(uuid_t));
28961: memset(pHostID, 0, PROXY_HOSTIDLEN);
28962: #if defined(__MAX_OS_X_VERSION_MIN_REQUIRED)\
28963: && __MAC_OS_X_VERSION_MIN_REQUIRED<1050
28964: {
28965: static const struct timespec timeout = {1, 0}; /* 1 sec timeout */
28966: if( gethostuuid(pHostID, &timeout) ){
28967: int err = errno;
28968: if( pError ){
28969: *pError = err;
28970: }
28971: return SQLITE_IOERR;
28972: }
28973: }
28974: #else
28975: UNUSED_PARAMETER(pError);
28976: #endif
28977: #ifdef SQLITE_TEST
28978: /* simulate multiple hosts by creating unique hostid file paths */
28979: if( sqlite3_hostid_num != 0){
28980: pHostID[0] = (char)(pHostID[0] + (char)(sqlite3_hostid_num & 0xFF));
28981: }
28982: #endif
28983:
28984: return SQLITE_OK;
28985: }
28986:
28987: /* The conch file contains the header, host id and lock file path
28988: */
28989: #define PROXY_CONCHVERSION 2 /* 1-byte header, 16-byte host id, path */
28990: #define PROXY_HEADERLEN 1 /* conch file header length */
28991: #define PROXY_PATHINDEX (PROXY_HEADERLEN+PROXY_HOSTIDLEN)
28992: #define PROXY_MAXCONCHLEN (PROXY_HEADERLEN+PROXY_HOSTIDLEN+MAXPATHLEN)
28993:
28994: /*
28995: ** Takes an open conch file, copies the contents to a new path and then moves
28996: ** it back. The newly created file's file descriptor is assigned to the
28997: ** conch file structure and finally the original conch file descriptor is
28998: ** closed. Returns zero if successful.
28999: */
29000: static int proxyBreakConchLock(unixFile *pFile, uuid_t myHostID){
29001: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29002: unixFile *conchFile = pCtx->conchFile;
29003: char tPath[MAXPATHLEN];
29004: char buf[PROXY_MAXCONCHLEN];
29005: char *cPath = pCtx->conchFilePath;
29006: size_t readLen = 0;
29007: size_t pathLen = 0;
29008: char errmsg[64] = "";
29009: int fd = -1;
29010: int rc = -1;
29011: UNUSED_PARAMETER(myHostID);
29012:
29013: /* create a new path by replace the trailing '-conch' with '-break' */
29014: pathLen = strlcpy(tPath, cPath, MAXPATHLEN);
29015: if( pathLen>MAXPATHLEN || pathLen<6 ||
29016: (strlcpy(&tPath[pathLen-5], "break", 6) != 5) ){
29017: sqlite3_snprintf(sizeof(errmsg),errmsg,"path error (len %d)",(int)pathLen);
29018: goto end_breaklock;
29019: }
29020: /* read the conch content */
29021: readLen = osPread(conchFile->h, buf, PROXY_MAXCONCHLEN, 0);
29022: if( readLen<PROXY_PATHINDEX ){
29023: sqlite3_snprintf(sizeof(errmsg),errmsg,"read error (len %d)",(int)readLen);
29024: goto end_breaklock;
29025: }
29026: /* write it out to the temporary break file */
1.2.2.1 ! misho 29027: fd = robust_open(tPath, (O_RDWR|O_CREAT|O_EXCL), 0);
1.2 misho 29028: if( fd<0 ){
29029: sqlite3_snprintf(sizeof(errmsg), errmsg, "create failed (%d)", errno);
29030: goto end_breaklock;
29031: }
29032: if( osPwrite(fd, buf, readLen, 0) != (ssize_t)readLen ){
29033: sqlite3_snprintf(sizeof(errmsg), errmsg, "write failed (%d)", errno);
29034: goto end_breaklock;
29035: }
29036: if( rename(tPath, cPath) ){
29037: sqlite3_snprintf(sizeof(errmsg), errmsg, "rename failed (%d)", errno);
29038: goto end_breaklock;
29039: }
29040: rc = 0;
29041: fprintf(stderr, "broke stale lock on %s\n", cPath);
29042: robust_close(pFile, conchFile->h, __LINE__);
29043: conchFile->h = fd;
29044: conchFile->openFlags = O_RDWR | O_CREAT;
29045:
29046: end_breaklock:
29047: if( rc ){
29048: if( fd>=0 ){
29049: osUnlink(tPath);
29050: robust_close(pFile, fd, __LINE__);
29051: }
29052: fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg);
29053: }
29054: return rc;
29055: }
29056:
29057: /* Take the requested lock on the conch file and break a stale lock if the
29058: ** host id matches.
29059: */
29060: static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){
29061: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29062: unixFile *conchFile = pCtx->conchFile;
29063: int rc = SQLITE_OK;
29064: int nTries = 0;
29065: struct timespec conchModTime;
29066:
29067: memset(&conchModTime, 0, sizeof(conchModTime));
29068: do {
29069: rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType);
29070: nTries ++;
29071: if( rc==SQLITE_BUSY ){
29072: /* If the lock failed (busy):
29073: * 1st try: get the mod time of the conch, wait 0.5s and try again.
29074: * 2nd try: fail if the mod time changed or host id is different, wait
29075: * 10 sec and try again
29076: * 3rd try: break the lock unless the mod time has changed.
29077: */
29078: struct stat buf;
29079: if( osFstat(conchFile->h, &buf) ){
29080: pFile->lastErrno = errno;
29081: return SQLITE_IOERR_LOCK;
29082: }
29083:
29084: if( nTries==1 ){
29085: conchModTime = buf.st_mtimespec;
29086: usleep(500000); /* wait 0.5 sec and try the lock again*/
29087: continue;
29088: }
29089:
29090: assert( nTries>1 );
29091: if( conchModTime.tv_sec != buf.st_mtimespec.tv_sec ||
29092: conchModTime.tv_nsec != buf.st_mtimespec.tv_nsec ){
29093: return SQLITE_BUSY;
29094: }
29095:
29096: if( nTries==2 ){
29097: char tBuf[PROXY_MAXCONCHLEN];
29098: int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0);
29099: if( len<0 ){
29100: pFile->lastErrno = errno;
29101: return SQLITE_IOERR_LOCK;
29102: }
29103: if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){
29104: /* don't break the lock if the host id doesn't match */
29105: if( 0!=memcmp(&tBuf[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN) ){
29106: return SQLITE_BUSY;
29107: }
29108: }else{
29109: /* don't break the lock on short read or a version mismatch */
29110: return SQLITE_BUSY;
29111: }
29112: usleep(10000000); /* wait 10 sec and try the lock again */
29113: continue;
29114: }
29115:
29116: assert( nTries==3 );
29117: if( 0==proxyBreakConchLock(pFile, myHostID) ){
29118: rc = SQLITE_OK;
29119: if( lockType==EXCLUSIVE_LOCK ){
29120: rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK);
29121: }
29122: if( !rc ){
29123: rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType);
29124: }
29125: }
29126: }
29127: } while( rc==SQLITE_BUSY && nTries<3 );
29128:
29129: return rc;
29130: }
29131:
29132: /* Takes the conch by taking a shared lock and read the contents conch, if
29133: ** lockPath is non-NULL, the host ID and lock file path must match. A NULL
29134: ** lockPath means that the lockPath in the conch file will be used if the
29135: ** host IDs match, or a new lock path will be generated automatically
29136: ** and written to the conch file.
29137: */
29138: static int proxyTakeConch(unixFile *pFile){
29139: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29140:
29141: if( pCtx->conchHeld!=0 ){
29142: return SQLITE_OK;
29143: }else{
29144: unixFile *conchFile = pCtx->conchFile;
29145: uuid_t myHostID;
29146: int pError = 0;
29147: char readBuf[PROXY_MAXCONCHLEN];
29148: char lockPath[MAXPATHLEN];
29149: char *tempLockPath = NULL;
29150: int rc = SQLITE_OK;
29151: int createConch = 0;
29152: int hostIdMatch = 0;
29153: int readLen = 0;
29154: int tryOldLockPath = 0;
29155: int forceNewLockPath = 0;
29156:
29157: OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h,
29158: (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid()));
29159:
29160: rc = proxyGetHostID(myHostID, &pError);
29161: if( (rc&0xff)==SQLITE_IOERR ){
29162: pFile->lastErrno = pError;
29163: goto end_takeconch;
29164: }
29165: rc = proxyConchLock(pFile, myHostID, SHARED_LOCK);
29166: if( rc!=SQLITE_OK ){
29167: goto end_takeconch;
29168: }
29169: /* read the existing conch file */
29170: readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN);
29171: if( readLen<0 ){
29172: /* I/O error: lastErrno set by seekAndRead */
29173: pFile->lastErrno = conchFile->lastErrno;
29174: rc = SQLITE_IOERR_READ;
29175: goto end_takeconch;
29176: }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) ||
29177: readBuf[0]!=(char)PROXY_CONCHVERSION ){
29178: /* a short read or version format mismatch means we need to create a new
29179: ** conch file.
29180: */
29181: createConch = 1;
29182: }
29183: /* if the host id matches and the lock path already exists in the conch
29184: ** we'll try to use the path there, if we can't open that path, we'll
29185: ** retry with a new auto-generated path
29186: */
29187: do { /* in case we need to try again for an :auto: named lock file */
29188:
29189: if( !createConch && !forceNewLockPath ){
29190: hostIdMatch = !memcmp(&readBuf[PROXY_HEADERLEN], myHostID,
29191: PROXY_HOSTIDLEN);
29192: /* if the conch has data compare the contents */
29193: if( !pCtx->lockProxyPath ){
29194: /* for auto-named local lock file, just check the host ID and we'll
29195: ** use the local lock file path that's already in there
29196: */
29197: if( hostIdMatch ){
29198: size_t pathLen = (readLen - PROXY_PATHINDEX);
29199:
29200: if( pathLen>=MAXPATHLEN ){
29201: pathLen=MAXPATHLEN-1;
29202: }
29203: memcpy(lockPath, &readBuf[PROXY_PATHINDEX], pathLen);
29204: lockPath[pathLen] = 0;
29205: tempLockPath = lockPath;
29206: tryOldLockPath = 1;
29207: /* create a copy of the lock path if the conch is taken */
29208: goto end_takeconch;
29209: }
29210: }else if( hostIdMatch
29211: && !strncmp(pCtx->lockProxyPath, &readBuf[PROXY_PATHINDEX],
29212: readLen-PROXY_PATHINDEX)
29213: ){
29214: /* conch host and lock path match */
29215: goto end_takeconch;
29216: }
29217: }
29218:
29219: /* if the conch isn't writable and doesn't match, we can't take it */
29220: if( (conchFile->openFlags&O_RDWR) == 0 ){
29221: rc = SQLITE_BUSY;
29222: goto end_takeconch;
29223: }
29224:
29225: /* either the conch didn't match or we need to create a new one */
29226: if( !pCtx->lockProxyPath ){
29227: proxyGetLockPath(pCtx->dbPath, lockPath, MAXPATHLEN);
29228: tempLockPath = lockPath;
29229: /* create a copy of the lock path _only_ if the conch is taken */
29230: }
29231:
29232: /* update conch with host and path (this will fail if other process
29233: ** has a shared lock already), if the host id matches, use the big
29234: ** stick.
29235: */
29236: futimes(conchFile->h, NULL);
29237: if( hostIdMatch && !createConch ){
29238: if( conchFile->pInode && conchFile->pInode->nShared>1 ){
29239: /* We are trying for an exclusive lock but another thread in this
29240: ** same process is still holding a shared lock. */
29241: rc = SQLITE_BUSY;
29242: } else {
29243: rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK);
29244: }
29245: }else{
29246: rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, EXCLUSIVE_LOCK);
29247: }
29248: if( rc==SQLITE_OK ){
29249: char writeBuffer[PROXY_MAXCONCHLEN];
29250: int writeSize = 0;
29251:
29252: writeBuffer[0] = (char)PROXY_CONCHVERSION;
29253: memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN);
29254: if( pCtx->lockProxyPath!=NULL ){
29255: strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAXPATHLEN);
29256: }else{
29257: strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN);
29258: }
29259: writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]);
29260: robust_ftruncate(conchFile->h, writeSize);
29261: rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0);
29262: fsync(conchFile->h);
29263: /* If we created a new conch file (not just updated the contents of a
29264: ** valid conch file), try to match the permissions of the database
29265: */
29266: if( rc==SQLITE_OK && createConch ){
29267: struct stat buf;
29268: int err = osFstat(pFile->h, &buf);
29269: if( err==0 ){
29270: mode_t cmode = buf.st_mode&(S_IRUSR|S_IWUSR | S_IRGRP|S_IWGRP |
29271: S_IROTH|S_IWOTH);
29272: /* try to match the database file R/W permissions, ignore failure */
29273: #ifndef SQLITE_PROXY_DEBUG
29274: osFchmod(conchFile->h, cmode);
29275: #else
29276: do{
29277: rc = osFchmod(conchFile->h, cmode);
29278: }while( rc==(-1) && errno==EINTR );
29279: if( rc!=0 ){
29280: int code = errno;
29281: fprintf(stderr, "fchmod %o FAILED with %d %s\n",
29282: cmode, code, strerror(code));
29283: } else {
29284: fprintf(stderr, "fchmod %o SUCCEDED\n",cmode);
29285: }
29286: }else{
29287: int code = errno;
29288: fprintf(stderr, "STAT FAILED[%d] with %d %s\n",
29289: err, code, strerror(code));
29290: #endif
29291: }
29292: }
29293: }
29294: conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, SHARED_LOCK);
29295:
29296: end_takeconch:
29297: OSTRACE(("TRANSPROXY: CLOSE %d\n", pFile->h));
29298: if( rc==SQLITE_OK && pFile->openFlags ){
29299: int fd;
29300: if( pFile->h>=0 ){
29301: robust_close(pFile, pFile->h, __LINE__);
29302: }
29303: pFile->h = -1;
1.2.2.1 ! misho 29304: fd = robust_open(pCtx->dbPath, pFile->openFlags, 0);
1.2 misho 29305: OSTRACE(("TRANSPROXY: OPEN %d\n", fd));
29306: if( fd>=0 ){
29307: pFile->h = fd;
29308: }else{
29309: rc=SQLITE_CANTOPEN_BKPT; /* SQLITE_BUSY? proxyTakeConch called
29310: during locking */
29311: }
29312: }
29313: if( rc==SQLITE_OK && !pCtx->lockProxy ){
29314: char *path = tempLockPath ? tempLockPath : pCtx->lockProxyPath;
29315: rc = proxyCreateUnixFile(path, &pCtx->lockProxy, 1);
29316: if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM && tryOldLockPath ){
29317: /* we couldn't create the proxy lock file with the old lock file path
29318: ** so try again via auto-naming
29319: */
29320: forceNewLockPath = 1;
29321: tryOldLockPath = 0;
29322: continue; /* go back to the do {} while start point, try again */
29323: }
29324: }
29325: if( rc==SQLITE_OK ){
29326: /* Need to make a copy of path if we extracted the value
29327: ** from the conch file or the path was allocated on the stack
29328: */
29329: if( tempLockPath ){
29330: pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath);
29331: if( !pCtx->lockProxyPath ){
29332: rc = SQLITE_NOMEM;
29333: }
29334: }
29335: }
29336: if( rc==SQLITE_OK ){
29337: pCtx->conchHeld = 1;
29338:
29339: if( pCtx->lockProxy->pMethod == &afpIoMethods ){
29340: afpLockingContext *afpCtx;
29341: afpCtx = (afpLockingContext *)pCtx->lockProxy->lockingContext;
29342: afpCtx->dbPath = pCtx->lockProxyPath;
29343: }
29344: } else {
29345: conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
29346: }
29347: OSTRACE(("TAKECONCH %d %s\n", conchFile->h,
29348: rc==SQLITE_OK?"ok":"failed"));
29349: return rc;
29350: } while (1); /* in case we need to retry the :auto: lock file -
29351: ** we should never get here except via the 'continue' call. */
29352: }
29353: }
29354:
29355: /*
29356: ** If pFile holds a lock on a conch file, then release that lock.
29357: */
29358: static int proxyReleaseConch(unixFile *pFile){
29359: int rc = SQLITE_OK; /* Subroutine return code */
29360: proxyLockingContext *pCtx; /* The locking context for the proxy lock */
29361: unixFile *conchFile; /* Name of the conch file */
29362:
29363: pCtx = (proxyLockingContext *)pFile->lockingContext;
29364: conchFile = pCtx->conchFile;
29365: OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h,
29366: (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"),
29367: getpid()));
29368: if( pCtx->conchHeld>0 ){
29369: rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK);
29370: }
29371: pCtx->conchHeld = 0;
29372: OSTRACE(("RELEASECONCH %d %s\n", conchFile->h,
29373: (rc==SQLITE_OK ? "ok" : "failed")));
29374: return rc;
29375: }
29376:
29377: /*
29378: ** Given the name of a database file, compute the name of its conch file.
29379: ** Store the conch filename in memory obtained from sqlite3_malloc().
29380: ** Make *pConchPath point to the new name. Return SQLITE_OK on success
29381: ** or SQLITE_NOMEM if unable to obtain memory.
29382: **
29383: ** The caller is responsible for ensuring that the allocated memory
29384: ** space is eventually freed.
29385: **
29386: ** *pConchPath is set to NULL if a memory allocation error occurs.
29387: */
29388: static int proxyCreateConchPathname(char *dbPath, char **pConchPath){
29389: int i; /* Loop counter */
29390: int len = (int)strlen(dbPath); /* Length of database filename - dbPath */
29391: char *conchPath; /* buffer in which to construct conch name */
29392:
29393: /* Allocate space for the conch filename and initialize the name to
29394: ** the name of the original database file. */
29395: *pConchPath = conchPath = (char *)sqlite3_malloc(len + 8);
29396: if( conchPath==0 ){
29397: return SQLITE_NOMEM;
29398: }
29399: memcpy(conchPath, dbPath, len+1);
29400:
29401: /* now insert a "." before the last / character */
29402: for( i=(len-1); i>=0; i-- ){
29403: if( conchPath[i]=='/' ){
29404: i++;
29405: break;
29406: }
29407: }
29408: conchPath[i]='.';
29409: while ( i<len ){
29410: conchPath[i+1]=dbPath[i];
29411: i++;
29412: }
29413:
29414: /* append the "-conch" suffix to the file */
29415: memcpy(&conchPath[i+1], "-conch", 7);
29416: assert( (int)strlen(conchPath) == len+7 );
29417:
29418: return SQLITE_OK;
29419: }
29420:
29421:
29422: /* Takes a fully configured proxy locking-style unix file and switches
29423: ** the local lock file path
29424: */
29425: static int switchLockProxyPath(unixFile *pFile, const char *path) {
29426: proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
29427: char *oldPath = pCtx->lockProxyPath;
29428: int rc = SQLITE_OK;
29429:
29430: if( pFile->eFileLock!=NO_LOCK ){
29431: return SQLITE_BUSY;
29432: }
29433:
29434: /* nothing to do if the path is NULL, :auto: or matches the existing path */
29435: if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ||
29436: (oldPath && !strncmp(oldPath, path, MAXPATHLEN)) ){
29437: return SQLITE_OK;
29438: }else{
29439: unixFile *lockProxy = pCtx->lockProxy;
29440: pCtx->lockProxy=NULL;
29441: pCtx->conchHeld = 0;
29442: if( lockProxy!=NULL ){
29443: rc=lockProxy->pMethod->xClose((sqlite3_file *)lockProxy);
29444: if( rc ) return rc;
29445: sqlite3_free(lockProxy);
29446: }
29447: sqlite3_free(oldPath);
29448: pCtx->lockProxyPath = sqlite3DbStrDup(0, path);
29449: }
29450:
29451: return rc;
29452: }
29453:
29454: /*
29455: ** pFile is a file that has been opened by a prior xOpen call. dbPath
29456: ** is a string buffer at least MAXPATHLEN+1 characters in size.
29457: **
29458: ** This routine find the filename associated with pFile and writes it
29459: ** int dbPath.
29460: */
29461: static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){
29462: #if defined(__APPLE__)
29463: if( pFile->pMethod == &afpIoMethods ){
29464: /* afp style keeps a reference to the db path in the filePath field
29465: ** of the struct */
29466: assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN );
29467: strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAXPATHLEN);
29468: } else
29469: #endif
29470: if( pFile->pMethod == &dotlockIoMethods ){
29471: /* dot lock style uses the locking context to store the dot lock
29472: ** file path */
29473: int len = strlen((char *)pFile->lockingContext) - strlen(DOTLOCK_SUFFIX);
29474: memcpy(dbPath, (char *)pFile->lockingContext, len + 1);
29475: }else{
29476: /* all other styles use the locking context to store the db file path */
29477: assert( strlen((char*)pFile->lockingContext)<=MAXPATHLEN );
29478: strlcpy(dbPath, (char *)pFile->lockingContext, MAXPATHLEN);
29479: }
29480: return SQLITE_OK;
29481: }
29482:
29483: /*
29484: ** Takes an already filled in unix file and alters it so all file locking
29485: ** will be performed on the local proxy lock file. The following fields
29486: ** are preserved in the locking context so that they can be restored and
29487: ** the unix structure properly cleaned up at close time:
29488: ** ->lockingContext
29489: ** ->pMethod
29490: */
29491: static int proxyTransformUnixFile(unixFile *pFile, const char *path) {
29492: proxyLockingContext *pCtx;
29493: char dbPath[MAXPATHLEN+1]; /* Name of the database file */
29494: char *lockPath=NULL;
29495: int rc = SQLITE_OK;
29496:
29497: if( pFile->eFileLock!=NO_LOCK ){
29498: return SQLITE_BUSY;
29499: }
29500: proxyGetDbPathForUnixFile(pFile, dbPath);
29501: if( !path || path[0]=='\0' || !strcmp(path, ":auto:") ){
29502: lockPath=NULL;
29503: }else{
29504: lockPath=(char *)path;
29505: }
29506:
29507: OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h,
29508: (lockPath ? lockPath : ":auto:"), getpid()));
29509:
29510: pCtx = sqlite3_malloc( sizeof(*pCtx) );
29511: if( pCtx==0 ){
29512: return SQLITE_NOMEM;
29513: }
29514: memset(pCtx, 0, sizeof(*pCtx));
29515:
29516: rc = proxyCreateConchPathname(dbPath, &pCtx->conchFilePath);
29517: if( rc==SQLITE_OK ){
29518: rc = proxyCreateUnixFile(pCtx->conchFilePath, &pCtx->conchFile, 0);
29519: if( rc==SQLITE_CANTOPEN && ((pFile->openFlags&O_RDWR) == 0) ){
29520: /* if (a) the open flags are not O_RDWR, (b) the conch isn't there, and
29521: ** (c) the file system is read-only, then enable no-locking access.
29522: ** Ugh, since O_RDONLY==0x0000 we test for !O_RDWR since unixOpen asserts
29523: ** that openFlags will have only one of O_RDONLY or O_RDWR.
29524: */
29525: struct statfs fsInfo;
29526: struct stat conchInfo;
29527: int goLockless = 0;
29528:
29529: if( osStat(pCtx->conchFilePath, &conchInfo) == -1 ) {
29530: int err = errno;
29531: if( (err==ENOENT) && (statfs(dbPath, &fsInfo) != -1) ){
29532: goLockless = (fsInfo.f_flags&MNT_RDONLY) == MNT_RDONLY;
29533: }
29534: }
29535: if( goLockless ){
29536: pCtx->conchHeld = -1; /* read only FS/ lockless */
29537: rc = SQLITE_OK;
29538: }
29539: }
29540: }
29541: if( rc==SQLITE_OK && lockPath ){
29542: pCtx->lockProxyPath = sqlite3DbStrDup(0, lockPath);
29543: }
29544:
29545: if( rc==SQLITE_OK ){
29546: pCtx->dbPath = sqlite3DbStrDup(0, dbPath);
29547: if( pCtx->dbPath==NULL ){
29548: rc = SQLITE_NOMEM;
29549: }
29550: }
29551: if( rc==SQLITE_OK ){
29552: /* all memory is allocated, proxys are created and assigned,
29553: ** switch the locking context and pMethod then return.
29554: */
29555: pCtx->oldLockingContext = pFile->lockingContext;
29556: pFile->lockingContext = pCtx;
29557: pCtx->pOldMethod = pFile->pMethod;
29558: pFile->pMethod = &proxyIoMethods;
29559: }else{
29560: if( pCtx->conchFile ){
29561: pCtx->conchFile->pMethod->xClose((sqlite3_file *)pCtx->conchFile);
29562: sqlite3_free(pCtx->conchFile);
29563: }
29564: sqlite3DbFree(0, pCtx->lockProxyPath);
29565: sqlite3_free(pCtx->conchFilePath);
29566: sqlite3_free(pCtx);
29567: }
29568: OSTRACE(("TRANSPROXY %d %s\n", pFile->h,
29569: (rc==SQLITE_OK ? "ok" : "failed")));
29570: return rc;
29571: }
29572:
29573:
29574: /*
29575: ** This routine handles sqlite3_file_control() calls that are specific
29576: ** to proxy locking.
29577: */
29578: static int proxyFileControl(sqlite3_file *id, int op, void *pArg){
29579: switch( op ){
29580: case SQLITE_GET_LOCKPROXYFILE: {
29581: unixFile *pFile = (unixFile*)id;
29582: if( pFile->pMethod == &proxyIoMethods ){
29583: proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext;
29584: proxyTakeConch(pFile);
29585: if( pCtx->lockProxyPath ){
29586: *(const char **)pArg = pCtx->lockProxyPath;
29587: }else{
29588: *(const char **)pArg = ":auto: (not held)";
29589: }
29590: } else {
29591: *(const char **)pArg = NULL;
29592: }
29593: return SQLITE_OK;
29594: }
29595: case SQLITE_SET_LOCKPROXYFILE: {
29596: unixFile *pFile = (unixFile*)id;
29597: int rc = SQLITE_OK;
29598: int isProxyStyle = (pFile->pMethod == &proxyIoMethods);
29599: if( pArg==NULL || (const char *)pArg==0 ){
29600: if( isProxyStyle ){
29601: /* turn off proxy locking - not supported */
29602: rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/;
29603: }else{
29604: /* turn off proxy locking - already off - NOOP */
29605: rc = SQLITE_OK;
29606: }
29607: }else{
29608: const char *proxyPath = (const char *)pArg;
29609: if( isProxyStyle ){
29610: proxyLockingContext *pCtx =
29611: (proxyLockingContext*)pFile->lockingContext;
29612: if( !strcmp(pArg, ":auto:")
29613: || (pCtx->lockProxyPath &&
29614: !strncmp(pCtx->lockProxyPath, proxyPath, MAXPATHLEN))
29615: ){
29616: rc = SQLITE_OK;
29617: }else{
29618: rc = switchLockProxyPath(pFile, proxyPath);
29619: }
29620: }else{
29621: /* turn on proxy file locking */
29622: rc = proxyTransformUnixFile(pFile, proxyPath);
29623: }
29624: }
29625: return rc;
29626: }
29627: default: {
29628: assert( 0 ); /* The call assures that only valid opcodes are sent */
29629: }
29630: }
29631: /*NOTREACHED*/
29632: return SQLITE_ERROR;
29633: }
29634:
29635: /*
29636: ** Within this division (the proxying locking implementation) the procedures
29637: ** above this point are all utilities. The lock-related methods of the
29638: ** proxy-locking sqlite3_io_method object follow.
29639: */
29640:
29641:
29642: /*
29643: ** This routine checks if there is a RESERVED lock held on the specified
29644: ** file by this or any other process. If such a lock is held, set *pResOut
29645: ** to a non-zero value otherwise *pResOut is set to zero. The return value
29646: ** is set to SQLITE_OK unless an I/O error occurs during lock checking.
29647: */
29648: static int proxyCheckReservedLock(sqlite3_file *id, int *pResOut) {
29649: unixFile *pFile = (unixFile*)id;
29650: int rc = proxyTakeConch(pFile);
29651: if( rc==SQLITE_OK ){
29652: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29653: if( pCtx->conchHeld>0 ){
29654: unixFile *proxy = pCtx->lockProxy;
29655: return proxy->pMethod->xCheckReservedLock((sqlite3_file*)proxy, pResOut);
29656: }else{ /* conchHeld < 0 is lockless */
29657: pResOut=0;
29658: }
29659: }
29660: return rc;
29661: }
29662:
29663: /*
29664: ** Lock the file with the lock specified by parameter eFileLock - one
29665: ** of the following:
29666: **
29667: ** (1) SHARED_LOCK
29668: ** (2) RESERVED_LOCK
29669: ** (3) PENDING_LOCK
29670: ** (4) EXCLUSIVE_LOCK
29671: **
29672: ** Sometimes when requesting one lock state, additional lock states
29673: ** are inserted in between. The locking might fail on one of the later
29674: ** transitions leaving the lock state different from what it started but
29675: ** still short of its goal. The following chart shows the allowed
29676: ** transitions and the inserted intermediate states:
29677: **
29678: ** UNLOCKED -> SHARED
29679: ** SHARED -> RESERVED
29680: ** SHARED -> (PENDING) -> EXCLUSIVE
29681: ** RESERVED -> (PENDING) -> EXCLUSIVE
29682: ** PENDING -> EXCLUSIVE
29683: **
29684: ** This routine will only increase a lock. Use the sqlite3OsUnlock()
29685: ** routine to lower a locking level.
29686: */
29687: static int proxyLock(sqlite3_file *id, int eFileLock) {
29688: unixFile *pFile = (unixFile*)id;
29689: int rc = proxyTakeConch(pFile);
29690: if( rc==SQLITE_OK ){
29691: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29692: if( pCtx->conchHeld>0 ){
29693: unixFile *proxy = pCtx->lockProxy;
29694: rc = proxy->pMethod->xLock((sqlite3_file*)proxy, eFileLock);
29695: pFile->eFileLock = proxy->eFileLock;
29696: }else{
29697: /* conchHeld < 0 is lockless */
29698: }
29699: }
29700: return rc;
29701: }
29702:
29703:
29704: /*
29705: ** Lower the locking level on file descriptor pFile to eFileLock. eFileLock
29706: ** must be either NO_LOCK or SHARED_LOCK.
29707: **
29708: ** If the locking level of the file descriptor is already at or below
29709: ** the requested locking level, this routine is a no-op.
29710: */
29711: static int proxyUnlock(sqlite3_file *id, int eFileLock) {
29712: unixFile *pFile = (unixFile*)id;
29713: int rc = proxyTakeConch(pFile);
29714: if( rc==SQLITE_OK ){
29715: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29716: if( pCtx->conchHeld>0 ){
29717: unixFile *proxy = pCtx->lockProxy;
29718: rc = proxy->pMethod->xUnlock((sqlite3_file*)proxy, eFileLock);
29719: pFile->eFileLock = proxy->eFileLock;
29720: }else{
29721: /* conchHeld < 0 is lockless */
29722: }
29723: }
29724: return rc;
29725: }
29726:
29727: /*
29728: ** Close a file that uses proxy locks.
29729: */
29730: static int proxyClose(sqlite3_file *id) {
29731: if( id ){
29732: unixFile *pFile = (unixFile*)id;
29733: proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext;
29734: unixFile *lockProxy = pCtx->lockProxy;
29735: unixFile *conchFile = pCtx->conchFile;
29736: int rc = SQLITE_OK;
29737:
29738: if( lockProxy ){
29739: rc = lockProxy->pMethod->xUnlock((sqlite3_file*)lockProxy, NO_LOCK);
29740: if( rc ) return rc;
29741: rc = lockProxy->pMethod->xClose((sqlite3_file*)lockProxy);
29742: if( rc ) return rc;
29743: sqlite3_free(lockProxy);
29744: pCtx->lockProxy = 0;
29745: }
29746: if( conchFile ){
29747: if( pCtx->conchHeld ){
29748: rc = proxyReleaseConch(pFile);
29749: if( rc ) return rc;
29750: }
29751: rc = conchFile->pMethod->xClose((sqlite3_file*)conchFile);
29752: if( rc ) return rc;
29753: sqlite3_free(conchFile);
29754: }
29755: sqlite3DbFree(0, pCtx->lockProxyPath);
29756: sqlite3_free(pCtx->conchFilePath);
29757: sqlite3DbFree(0, pCtx->dbPath);
29758: /* restore the original locking context and pMethod then close it */
29759: pFile->lockingContext = pCtx->oldLockingContext;
29760: pFile->pMethod = pCtx->pOldMethod;
29761: sqlite3_free(pCtx);
29762: return pFile->pMethod->xClose(id);
29763: }
29764: return SQLITE_OK;
29765: }
29766:
29767:
29768:
29769: #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */
29770: /*
29771: ** The proxy locking style is intended for use with AFP filesystems.
29772: ** And since AFP is only supported on MacOSX, the proxy locking is also
29773: ** restricted to MacOSX.
29774: **
29775: **
29776: ******************* End of the proxy lock implementation **********************
29777: ******************************************************************************/
29778:
29779: /*
29780: ** Initialize the operating system interface.
29781: **
29782: ** This routine registers all VFS implementations for unix-like operating
29783: ** systems. This routine, and the sqlite3_os_end() routine that follows,
29784: ** should be the only routines in this file that are visible from other
29785: ** files.
29786: **
29787: ** This routine is called once during SQLite initialization and by a
29788: ** single thread. The memory allocation and mutex subsystems have not
29789: ** necessarily been initialized when this routine is called, and so they
29790: ** should not be used.
29791: */
29792: SQLITE_API int sqlite3_os_init(void){
29793: /*
29794: ** The following macro defines an initializer for an sqlite3_vfs object.
29795: ** The name of the VFS is NAME. The pAppData is a pointer to a pointer
29796: ** to the "finder" function. (pAppData is a pointer to a pointer because
29797: ** silly C90 rules prohibit a void* from being cast to a function pointer
29798: ** and so we have to go through the intermediate pointer to avoid problems
29799: ** when compiling with -pedantic-errors on GCC.)
29800: **
29801: ** The FINDER parameter to this macro is the name of the pointer to the
29802: ** finder-function. The finder-function returns a pointer to the
29803: ** sqlite_io_methods object that implements the desired locking
29804: ** behaviors. See the division above that contains the IOMETHODS
29805: ** macro for addition information on finder-functions.
29806: **
29807: ** Most finders simply return a pointer to a fixed sqlite3_io_methods
29808: ** object. But the "autolockIoFinder" available on MacOSX does a little
29809: ** more than that; it looks at the filesystem type that hosts the
29810: ** database file and tries to choose an locking method appropriate for
29811: ** that filesystem time.
29812: */
29813: #define UNIXVFS(VFSNAME, FINDER) { \
29814: 3, /* iVersion */ \
29815: sizeof(unixFile), /* szOsFile */ \
29816: MAX_PATHNAME, /* mxPathname */ \
29817: 0, /* pNext */ \
29818: VFSNAME, /* zName */ \
29819: (void*)&FINDER, /* pAppData */ \
29820: unixOpen, /* xOpen */ \
29821: unixDelete, /* xDelete */ \
29822: unixAccess, /* xAccess */ \
29823: unixFullPathname, /* xFullPathname */ \
29824: unixDlOpen, /* xDlOpen */ \
29825: unixDlError, /* xDlError */ \
29826: unixDlSym, /* xDlSym */ \
29827: unixDlClose, /* xDlClose */ \
29828: unixRandomness, /* xRandomness */ \
29829: unixSleep, /* xSleep */ \
29830: unixCurrentTime, /* xCurrentTime */ \
29831: unixGetLastError, /* xGetLastError */ \
29832: unixCurrentTimeInt64, /* xCurrentTimeInt64 */ \
29833: unixSetSystemCall, /* xSetSystemCall */ \
29834: unixGetSystemCall, /* xGetSystemCall */ \
29835: unixNextSystemCall, /* xNextSystemCall */ \
29836: }
29837:
29838: /*
29839: ** All default VFSes for unix are contained in the following array.
29840: **
29841: ** Note that the sqlite3_vfs.pNext field of the VFS object is modified
29842: ** by the SQLite core when the VFS is registered. So the following
29843: ** array cannot be const.
29844: */
29845: static sqlite3_vfs aVfs[] = {
29846: #if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__))
29847: UNIXVFS("unix", autolockIoFinder ),
29848: #else
29849: UNIXVFS("unix", posixIoFinder ),
29850: #endif
29851: UNIXVFS("unix-none", nolockIoFinder ),
29852: UNIXVFS("unix-dotfile", dotlockIoFinder ),
29853: UNIXVFS("unix-excl", posixIoFinder ),
29854: #if OS_VXWORKS
29855: UNIXVFS("unix-namedsem", semIoFinder ),
29856: #endif
29857: #if SQLITE_ENABLE_LOCKING_STYLE
29858: UNIXVFS("unix-posix", posixIoFinder ),
29859: #if !OS_VXWORKS
29860: UNIXVFS("unix-flock", flockIoFinder ),
29861: #endif
29862: #endif
29863: #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
29864: UNIXVFS("unix-afp", afpIoFinder ),
29865: UNIXVFS("unix-nfs", nfsIoFinder ),
29866: UNIXVFS("unix-proxy", proxyIoFinder ),
29867: #endif
29868: };
29869: unsigned int i; /* Loop counter */
29870:
29871: /* Double-check that the aSyscall[] array has been constructed
29872: ** correctly. See ticket [bb3a86e890c8e96ab] */
1.2.2.1 ! misho 29873: assert( ArraySize(aSyscall)==22 );
1.2 misho 29874:
29875: /* Register all VFSes defined in the aVfs[] array */
29876: for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
29877: sqlite3_vfs_register(&aVfs[i], i==0);
29878: }
29879: return SQLITE_OK;
29880: }
29881:
29882: /*
29883: ** Shutdown the operating system interface.
29884: **
29885: ** Some operating systems might need to do some cleanup in this routine,
29886: ** to release dynamically allocated objects. But not on unix.
29887: ** This routine is a no-op for unix.
29888: */
29889: SQLITE_API int sqlite3_os_end(void){
29890: return SQLITE_OK;
29891: }
29892:
29893: #endif /* SQLITE_OS_UNIX */
29894:
29895: /************** End of os_unix.c *********************************************/
29896: /************** Begin file os_win.c ******************************************/
29897: /*
29898: ** 2004 May 22
29899: **
29900: ** The author disclaims copyright to this source code. In place of
29901: ** a legal notice, here is a blessing:
29902: **
29903: ** May you do good and not evil.
29904: ** May you find forgiveness for yourself and forgive others.
29905: ** May you share freely, never taking more than you give.
29906: **
29907: ******************************************************************************
29908: **
29909: ** This file contains code that is specific to Windows.
29910: */
29911: #if SQLITE_OS_WIN /* This file is used for Windows only */
29912:
29913: #ifdef __CYGWIN__
29914: # include <sys/cygwin.h>
29915: #endif
29916:
29917: /*
29918: ** Include code that is common to all os_*.c files
29919: */
29920: /************** Include os_common.h in the middle of os_win.c ****************/
29921: /************** Begin file os_common.h ***************************************/
29922: /*
29923: ** 2004 May 22
29924: **
29925: ** The author disclaims copyright to this source code. In place of
29926: ** a legal notice, here is a blessing:
29927: **
29928: ** May you do good and not evil.
29929: ** May you find forgiveness for yourself and forgive others.
29930: ** May you share freely, never taking more than you give.
29931: **
29932: ******************************************************************************
29933: **
29934: ** This file contains macros and a little bit of code that is common to
29935: ** all of the platform-specific files (os_*.c) and is #included into those
29936: ** files.
29937: **
29938: ** This file should be #included by the os_*.c files only. It is not a
29939: ** general purpose header file.
29940: */
29941: #ifndef _OS_COMMON_H_
29942: #define _OS_COMMON_H_
29943:
29944: /*
29945: ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
29946: ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
29947: ** switch. The following code should catch this problem at compile-time.
29948: */
29949: #ifdef MEMORY_DEBUG
29950: # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
29951: #endif
29952:
29953: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
29954: # ifndef SQLITE_DEBUG_OS_TRACE
29955: # define SQLITE_DEBUG_OS_TRACE 0
29956: # endif
29957: int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
29958: # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
29959: #else
29960: # define OSTRACE(X)
29961: #endif
29962:
29963: /*
29964: ** Macros for performance tracing. Normally turned off. Only works
29965: ** on i486 hardware.
29966: */
29967: #ifdef SQLITE_PERFORMANCE_TRACE
29968:
29969: /*
29970: ** hwtime.h contains inline assembler code for implementing
29971: ** high-performance timing routines.
29972: */
29973: /************** Include hwtime.h in the middle of os_common.h ****************/
29974: /************** Begin file hwtime.h ******************************************/
29975: /*
29976: ** 2008 May 27
29977: **
29978: ** The author disclaims copyright to this source code. In place of
29979: ** a legal notice, here is a blessing:
29980: **
29981: ** May you do good and not evil.
29982: ** May you find forgiveness for yourself and forgive others.
29983: ** May you share freely, never taking more than you give.
29984: **
29985: ******************************************************************************
29986: **
29987: ** This file contains inline asm code for retrieving "high-performance"
29988: ** counters for x86 class CPUs.
29989: */
29990: #ifndef _HWTIME_H_
29991: #define _HWTIME_H_
29992:
29993: /*
29994: ** The following routine only works on pentium-class (or newer) processors.
29995: ** It uses the RDTSC opcode to read the cycle count value out of the
29996: ** processor and returns that value. This can be used for high-res
29997: ** profiling.
29998: */
29999: #if (defined(__GNUC__) || defined(_MSC_VER)) && \
30000: (defined(i386) || defined(__i386__) || defined(_M_IX86))
30001:
30002: #if defined(__GNUC__)
30003:
30004: __inline__ sqlite_uint64 sqlite3Hwtime(void){
30005: unsigned int lo, hi;
30006: __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
30007: return (sqlite_uint64)hi << 32 | lo;
30008: }
30009:
30010: #elif defined(_MSC_VER)
30011:
30012: __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
30013: __asm {
30014: rdtsc
30015: ret ; return value at EDX:EAX
30016: }
30017: }
30018:
30019: #endif
30020:
30021: #elif (defined(__GNUC__) && defined(__x86_64__))
30022:
30023: __inline__ sqlite_uint64 sqlite3Hwtime(void){
30024: unsigned long val;
30025: __asm__ __volatile__ ("rdtsc" : "=A" (val));
30026: return val;
30027: }
30028:
30029: #elif (defined(__GNUC__) && defined(__ppc__))
30030:
30031: __inline__ sqlite_uint64 sqlite3Hwtime(void){
30032: unsigned long long retval;
30033: unsigned long junk;
30034: __asm__ __volatile__ ("\n\
30035: 1: mftbu %1\n\
30036: mftb %L0\n\
30037: mftbu %0\n\
30038: cmpw %0,%1\n\
30039: bne 1b"
30040: : "=r" (retval), "=r" (junk));
30041: return retval;
30042: }
30043:
30044: #else
30045:
30046: #error Need implementation of sqlite3Hwtime() for your platform.
30047:
30048: /*
30049: ** To compile without implementing sqlite3Hwtime() for your platform,
30050: ** you can remove the above #error and use the following
30051: ** stub function. You will lose timing support for many
30052: ** of the debugging and testing utilities, but it should at
30053: ** least compile and run.
30054: */
30055: SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
30056:
30057: #endif
30058:
30059: #endif /* !defined(_HWTIME_H_) */
30060:
30061: /************** End of hwtime.h **********************************************/
30062: /************** Continuing where we left off in os_common.h ******************/
30063:
30064: static sqlite_uint64 g_start;
30065: static sqlite_uint64 g_elapsed;
30066: #define TIMER_START g_start=sqlite3Hwtime()
30067: #define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
30068: #define TIMER_ELAPSED g_elapsed
30069: #else
30070: #define TIMER_START
30071: #define TIMER_END
30072: #define TIMER_ELAPSED ((sqlite_uint64)0)
30073: #endif
30074:
30075: /*
30076: ** If we compile with the SQLITE_TEST macro set, then the following block
30077: ** of code will give us the ability to simulate a disk I/O error. This
30078: ** is used for testing the I/O recovery logic.
30079: */
30080: #ifdef SQLITE_TEST
30081: SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */
30082: SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */
30083: SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */
30084: SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */
30085: SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */
30086: SQLITE_API int sqlite3_diskfull_pending = 0;
30087: SQLITE_API int sqlite3_diskfull = 0;
30088: #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
30089: #define SimulateIOError(CODE) \
30090: if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
30091: || sqlite3_io_error_pending-- == 1 ) \
30092: { local_ioerr(); CODE; }
30093: static void local_ioerr(){
30094: IOTRACE(("IOERR\n"));
30095: sqlite3_io_error_hit++;
30096: if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
30097: }
30098: #define SimulateDiskfullError(CODE) \
30099: if( sqlite3_diskfull_pending ){ \
30100: if( sqlite3_diskfull_pending == 1 ){ \
30101: local_ioerr(); \
30102: sqlite3_diskfull = 1; \
30103: sqlite3_io_error_hit = 1; \
30104: CODE; \
30105: }else{ \
30106: sqlite3_diskfull_pending--; \
30107: } \
30108: }
30109: #else
30110: #define SimulateIOErrorBenign(X)
30111: #define SimulateIOError(A)
30112: #define SimulateDiskfullError(A)
30113: #endif
30114:
30115: /*
30116: ** When testing, keep a count of the number of open files.
30117: */
30118: #ifdef SQLITE_TEST
30119: SQLITE_API int sqlite3_open_file_count = 0;
30120: #define OpenCounter(X) sqlite3_open_file_count+=(X)
30121: #else
30122: #define OpenCounter(X)
30123: #endif
30124:
30125: #endif /* !defined(_OS_COMMON_H_) */
30126:
30127: /************** End of os_common.h *******************************************/
30128: /************** Continuing where we left off in os_win.c *********************/
30129:
30130: /*
1.2.2.1 ! misho 30131: ** Compiling and using WAL mode requires several APIs that are only
! 30132: ** available in Windows platforms based on the NT kernel.
! 30133: */
! 30134: #if !SQLITE_OS_WINNT && !defined(SQLITE_OMIT_WAL)
! 30135: # error "WAL mode requires support from the Windows NT kernel, compile\
! 30136: with SQLITE_OMIT_WAL."
! 30137: #endif
! 30138:
! 30139: /*
! 30140: ** Are most of the Win32 ANSI APIs available (i.e. with certain exceptions
! 30141: ** based on the sub-platform)?
! 30142: */
! 30143: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
! 30144: # define SQLITE_WIN32_HAS_ANSI
! 30145: #endif
! 30146:
! 30147: /*
! 30148: ** Are most of the Win32 Unicode APIs available (i.e. with certain exceptions
! 30149: ** based on the sub-platform)?
! 30150: */
! 30151: #if SQLITE_OS_WINCE || SQLITE_OS_WINNT || SQLITE_OS_WINRT
! 30152: # define SQLITE_WIN32_HAS_WIDE
! 30153: #endif
! 30154:
! 30155: /*
! 30156: ** Do we need to manually define the Win32 file mapping APIs for use with WAL
! 30157: ** mode (e.g. these APIs are available in the Windows CE SDK; however, they
! 30158: ** are not present in the header file)?
! 30159: */
! 30160: #if SQLITE_WIN32_FILEMAPPING_API && !defined(SQLITE_OMIT_WAL)
! 30161: /*
! 30162: ** Two of the file mapping APIs are different under WinRT. Figure out which
! 30163: ** set we need.
! 30164: */
! 30165: #if SQLITE_OS_WINRT
! 30166: WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE, \
! 30167: LPSECURITY_ATTRIBUTES, ULONG, ULONG64, LPCWSTR);
! 30168:
! 30169: WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE, ULONG, ULONG64, SIZE_T);
! 30170: #else
! 30171: #if defined(SQLITE_WIN32_HAS_ANSI)
! 30172: WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE, LPSECURITY_ATTRIBUTES, \
! 30173: DWORD, DWORD, DWORD, LPCSTR);
! 30174: #endif /* defined(SQLITE_WIN32_HAS_ANSI) */
! 30175:
! 30176: #if defined(SQLITE_WIN32_HAS_WIDE)
! 30177: WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE, LPSECURITY_ATTRIBUTES, \
! 30178: DWORD, DWORD, DWORD, LPCWSTR);
! 30179: #endif /* defined(SQLITE_WIN32_HAS_WIDE) */
! 30180:
! 30181: WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T);
! 30182: #endif /* SQLITE_OS_WINRT */
! 30183:
! 30184: /*
! 30185: ** This file mapping API is common to both Win32 and WinRT.
! 30186: */
! 30187: WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID);
! 30188: #endif /* SQLITE_WIN32_FILEMAPPING_API && !defined(SQLITE_OMIT_WAL) */
! 30189:
! 30190: /*
! 30191: ** Macro to find the minimum of two numeric values.
! 30192: */
! 30193: #ifndef MIN
! 30194: # define MIN(x,y) ((x)<(y)?(x):(y))
! 30195: #endif
! 30196:
! 30197: /*
1.2 misho 30198: ** Some Microsoft compilers lack this definition.
30199: */
30200: #ifndef INVALID_FILE_ATTRIBUTES
30201: # define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
30202: #endif
30203:
1.2.2.1 ! misho 30204: #ifndef FILE_FLAG_MASK
! 30205: # define FILE_FLAG_MASK (0xFF3C0000)
! 30206: #endif
! 30207:
! 30208: #ifndef FILE_ATTRIBUTE_MASK
! 30209: # define FILE_ATTRIBUTE_MASK (0x0003FFF7)
! 30210: #endif
! 30211:
! 30212: #ifndef SQLITE_OMIT_WAL
1.2 misho 30213: /* Forward references */
30214: typedef struct winShm winShm; /* A connection to shared-memory */
30215: typedef struct winShmNode winShmNode; /* A region of shared-memory */
1.2.2.1 ! misho 30216: #endif
1.2 misho 30217:
30218: /*
30219: ** WinCE lacks native support for file locking so we have to fake it
30220: ** with some code of our own.
30221: */
30222: #if SQLITE_OS_WINCE
30223: typedef struct winceLock {
30224: int nReaders; /* Number of reader locks obtained */
30225: BOOL bPending; /* Indicates a pending lock has been obtained */
30226: BOOL bReserved; /* Indicates a reserved lock has been obtained */
30227: BOOL bExclusive; /* Indicates an exclusive lock has been obtained */
30228: } winceLock;
30229: #endif
30230:
30231: /*
30232: ** The winFile structure is a subclass of sqlite3_file* specific to the win32
30233: ** portability layer.
30234: */
30235: typedef struct winFile winFile;
30236: struct winFile {
30237: const sqlite3_io_methods *pMethod; /*** Must be first ***/
30238: sqlite3_vfs *pVfs; /* The VFS used to open this file */
30239: HANDLE h; /* Handle for accessing the file */
30240: u8 locktype; /* Type of lock currently held on this file */
30241: short sharedLockByte; /* Randomly chosen byte used as a shared lock */
30242: u8 ctrlFlags; /* Flags. See WINFILE_* below */
30243: DWORD lastErrno; /* The Windows errno from the last I/O error */
1.2.2.1 ! misho 30244: #ifndef SQLITE_OMIT_WAL
1.2 misho 30245: winShm *pShm; /* Instance of shared memory on this file */
1.2.2.1 ! misho 30246: #endif
1.2 misho 30247: const char *zPath; /* Full pathname of this file */
30248: int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */
30249: #if SQLITE_OS_WINCE
30250: LPWSTR zDeleteOnClose; /* Name of file to delete when closing */
30251: HANDLE hMutex; /* Mutex used to control access to shared lock */
30252: HANDLE hShared; /* Shared memory segment used for locking */
30253: winceLock local; /* Locks obtained by this instance of winFile */
30254: winceLock *shared; /* Global shared lock memory for the file */
30255: #endif
30256: };
30257:
30258: /*
30259: ** Allowed values for winFile.ctrlFlags
30260: */
30261: #define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */
30262: #define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */
30263:
30264: /*
1.2.2.1 ! misho 30265: * The size of the buffer used by sqlite3_win32_write_debug().
! 30266: */
! 30267: #ifndef SQLITE_WIN32_DBG_BUF_SIZE
! 30268: # define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD)))
! 30269: #endif
! 30270:
! 30271: /*
! 30272: * The value used with sqlite3_win32_set_directory() to specify that
! 30273: * the data directory should be changed.
! 30274: */
! 30275: #ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE
! 30276: # define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1)
! 30277: #endif
! 30278:
! 30279: /*
! 30280: * The value used with sqlite3_win32_set_directory() to specify that
! 30281: * the temporary directory should be changed.
! 30282: */
! 30283: #ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE
! 30284: # define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2)
! 30285: #endif
! 30286:
! 30287: /*
1.2 misho 30288: * If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the
30289: * various Win32 API heap functions instead of our own.
30290: */
30291: #ifdef SQLITE_WIN32_MALLOC
1.2.2.1 ! misho 30292:
! 30293: /*
! 30294: * If this is non-zero, an isolated heap will be created by the native Win32
! 30295: * allocator subsystem; otherwise, the default process heap will be used. This
! 30296: * setting has no effect when compiling for WinRT. By default, this is enabled
! 30297: * and an isolated heap will be created to store all allocated data.
! 30298: *
! 30299: ******************************************************************************
! 30300: * WARNING: It is important to note that when this setting is non-zero and the
! 30301: * winMemShutdown function is called (e.g. by the sqlite3_shutdown
! 30302: * function), all data that was allocated using the isolated heap will
! 30303: * be freed immediately and any attempt to access any of that freed
! 30304: * data will almost certainly result in an immediate access violation.
! 30305: ******************************************************************************
! 30306: */
! 30307: #ifndef SQLITE_WIN32_HEAP_CREATE
! 30308: # define SQLITE_WIN32_HEAP_CREATE (TRUE)
! 30309: #endif
! 30310:
1.2 misho 30311: /*
30312: * The initial size of the Win32-specific heap. This value may be zero.
30313: */
30314: #ifndef SQLITE_WIN32_HEAP_INIT_SIZE
30315: # define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_DEFAULT_CACHE_SIZE) * \
30316: (SQLITE_DEFAULT_PAGE_SIZE) + 4194304)
30317: #endif
30318:
30319: /*
30320: * The maximum size of the Win32-specific heap. This value may be zero.
30321: */
30322: #ifndef SQLITE_WIN32_HEAP_MAX_SIZE
30323: # define SQLITE_WIN32_HEAP_MAX_SIZE (0)
30324: #endif
30325:
30326: /*
30327: * The extra flags to use in calls to the Win32 heap APIs. This value may be
30328: * zero for the default behavior.
30329: */
30330: #ifndef SQLITE_WIN32_HEAP_FLAGS
30331: # define SQLITE_WIN32_HEAP_FLAGS (0)
30332: #endif
30333:
30334: /*
30335: ** The winMemData structure stores information required by the Win32-specific
30336: ** sqlite3_mem_methods implementation.
30337: */
30338: typedef struct winMemData winMemData;
30339: struct winMemData {
30340: #ifndef NDEBUG
30341: u32 magic; /* Magic number to detect structure corruption. */
30342: #endif
30343: HANDLE hHeap; /* The handle to our heap. */
30344: BOOL bOwned; /* Do we own the heap (i.e. destroy it on shutdown)? */
30345: };
30346:
30347: #ifndef NDEBUG
30348: #define WINMEM_MAGIC 0x42b2830b
30349: #endif
30350:
30351: static struct winMemData win_mem_data = {
30352: #ifndef NDEBUG
30353: WINMEM_MAGIC,
30354: #endif
30355: NULL, FALSE
30356: };
30357:
30358: #ifndef NDEBUG
30359: #define winMemAssertMagic() assert( win_mem_data.magic==WINMEM_MAGIC )
30360: #else
30361: #define winMemAssertMagic()
30362: #endif
30363:
30364: #define winMemGetHeap() win_mem_data.hHeap
30365:
30366: static void *winMemMalloc(int nBytes);
30367: static void winMemFree(void *pPrior);
30368: static void *winMemRealloc(void *pPrior, int nBytes);
30369: static int winMemSize(void *p);
30370: static int winMemRoundup(int n);
30371: static int winMemInit(void *pAppData);
30372: static void winMemShutdown(void *pAppData);
30373:
30374: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void);
30375: #endif /* SQLITE_WIN32_MALLOC */
30376:
30377: /*
30378: ** The following variable is (normally) set once and never changes
30379: ** thereafter. It records whether the operating system is Win9x
30380: ** or WinNT.
30381: **
30382: ** 0: Operating system unknown.
30383: ** 1: Operating system is Win9x.
30384: ** 2: Operating system is WinNT.
30385: **
30386: ** In order to facilitate testing on a WinNT system, the test fixture
30387: ** can manually set this value to 1 to emulate Win98 behavior.
30388: */
30389: #ifdef SQLITE_TEST
30390: SQLITE_API int sqlite3_os_type = 0;
30391: #else
30392: static int sqlite3_os_type = 0;
30393: #endif
30394:
30395: #ifndef SYSCALL
30396: # define SYSCALL sqlite3_syscall_ptr
30397: #endif
30398:
30399: /*
1.2.2.1 ! misho 30400: ** This function is not available on Windows CE or WinRT.
1.2 misho 30401: */
30402:
1.2.2.1 ! misho 30403: #if SQLITE_OS_WINCE || SQLITE_OS_WINRT
1.2 misho 30404: # define osAreFileApisANSI() 1
30405: #endif
30406:
1.2.2.1 ! misho 30407: /*
! 30408: ** Many system calls are accessed through pointer-to-functions so that
! 30409: ** they may be overridden at runtime to facilitate fault injection during
! 30410: ** testing and sandboxing. The following array holds the names and pointers
! 30411: ** to all overrideable system calls.
! 30412: */
1.2 misho 30413: static struct win_syscall {
30414: const char *zName; /* Name of the sytem call */
30415: sqlite3_syscall_ptr pCurrent; /* Current value of the system call */
30416: sqlite3_syscall_ptr pDefault; /* Default value */
30417: } aSyscall[] = {
1.2.2.1 ! misho 30418: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
1.2 misho 30419: { "AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0 },
30420: #else
30421: { "AreFileApisANSI", (SYSCALL)0, 0 },
30422: #endif
30423:
1.2.2.1 ! misho 30424: #ifndef osAreFileApisANSI
! 30425: #define osAreFileApisANSI ((BOOL(WINAPI*)(VOID))aSyscall[0].pCurrent)
! 30426: #endif
! 30427:
1.2 misho 30428: #if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE)
30429: { "CharLowerW", (SYSCALL)CharLowerW, 0 },
30430: #else
30431: { "CharLowerW", (SYSCALL)0, 0 },
30432: #endif
30433:
30434: #define osCharLowerW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[1].pCurrent)
30435:
30436: #if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE)
30437: { "CharUpperW", (SYSCALL)CharUpperW, 0 },
30438: #else
30439: { "CharUpperW", (SYSCALL)0, 0 },
30440: #endif
30441:
30442: #define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent)
30443:
30444: { "CloseHandle", (SYSCALL)CloseHandle, 0 },
30445:
30446: #define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent)
30447:
30448: #if defined(SQLITE_WIN32_HAS_ANSI)
30449: { "CreateFileA", (SYSCALL)CreateFileA, 0 },
30450: #else
30451: { "CreateFileA", (SYSCALL)0, 0 },
30452: #endif
30453:
30454: #define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \
30455: LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent)
30456:
1.2.2.1 ! misho 30457: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30458: { "CreateFileW", (SYSCALL)CreateFileW, 0 },
30459: #else
30460: { "CreateFileW", (SYSCALL)0, 0 },
30461: #endif
30462:
30463: #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \
30464: LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent)
30465:
1.2.2.1 ! misho 30466: #if (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \
! 30467: !defined(SQLITE_OMIT_WAL))
! 30468: { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 },
! 30469: #else
! 30470: { "CreateFileMappingA", (SYSCALL)0, 0 },
! 30471: #endif
1.2 misho 30472:
1.2.2.1 ! misho 30473: #define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \
! 30474: DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent)
1.2 misho 30475:
1.2.2.1 ! misho 30476: #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \
! 30477: !defined(SQLITE_OMIT_WAL))
1.2 misho 30478: { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 },
30479: #else
30480: { "CreateFileMappingW", (SYSCALL)0, 0 },
30481: #endif
30482:
30483: #define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \
30484: DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent)
30485:
1.2.2.1 ! misho 30486: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30487: { "CreateMutexW", (SYSCALL)CreateMutexW, 0 },
30488: #else
30489: { "CreateMutexW", (SYSCALL)0, 0 },
30490: #endif
30491:
30492: #define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \
30493: LPCWSTR))aSyscall[8].pCurrent)
30494:
30495: #if defined(SQLITE_WIN32_HAS_ANSI)
30496: { "DeleteFileA", (SYSCALL)DeleteFileA, 0 },
30497: #else
30498: { "DeleteFileA", (SYSCALL)0, 0 },
30499: #endif
30500:
30501: #define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent)
30502:
30503: #if defined(SQLITE_WIN32_HAS_WIDE)
30504: { "DeleteFileW", (SYSCALL)DeleteFileW, 0 },
30505: #else
30506: { "DeleteFileW", (SYSCALL)0, 0 },
30507: #endif
30508:
30509: #define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent)
30510:
30511: #if SQLITE_OS_WINCE
30512: { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 },
30513: #else
30514: { "FileTimeToLocalFileTime", (SYSCALL)0, 0 },
30515: #endif
30516:
30517: #define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \
30518: LPFILETIME))aSyscall[11].pCurrent)
30519:
30520: #if SQLITE_OS_WINCE
30521: { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 },
30522: #else
30523: { "FileTimeToSystemTime", (SYSCALL)0, 0 },
30524: #endif
30525:
30526: #define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \
30527: LPSYSTEMTIME))aSyscall[12].pCurrent)
30528:
30529: { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 },
30530:
30531: #define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent)
30532:
30533: #if defined(SQLITE_WIN32_HAS_ANSI)
30534: { "FormatMessageA", (SYSCALL)FormatMessageA, 0 },
30535: #else
30536: { "FormatMessageA", (SYSCALL)0, 0 },
30537: #endif
30538:
30539: #define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \
30540: DWORD,va_list*))aSyscall[14].pCurrent)
30541:
30542: #if defined(SQLITE_WIN32_HAS_WIDE)
30543: { "FormatMessageW", (SYSCALL)FormatMessageW, 0 },
30544: #else
30545: { "FormatMessageW", (SYSCALL)0, 0 },
30546: #endif
30547:
30548: #define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \
30549: DWORD,va_list*))aSyscall[15].pCurrent)
30550:
1.2.2.1 ! misho 30551: #if !defined(SQLITE_OMIT_LOAD_EXTENSION)
1.2 misho 30552: { "FreeLibrary", (SYSCALL)FreeLibrary, 0 },
1.2.2.1 ! misho 30553: #else
! 30554: { "FreeLibrary", (SYSCALL)0, 0 },
! 30555: #endif
1.2 misho 30556:
30557: #define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent)
30558:
30559: { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 },
30560:
30561: #define osGetCurrentProcessId ((DWORD(WINAPI*)(VOID))aSyscall[17].pCurrent)
30562:
30563: #if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI)
30564: { "GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0 },
30565: #else
30566: { "GetDiskFreeSpaceA", (SYSCALL)0, 0 },
30567: #endif
30568:
30569: #define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \
30570: LPDWORD))aSyscall[18].pCurrent)
30571:
1.2.2.1 ! misho 30572: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30573: { "GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0 },
30574: #else
30575: { "GetDiskFreeSpaceW", (SYSCALL)0, 0 },
30576: #endif
30577:
30578: #define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \
30579: LPDWORD))aSyscall[19].pCurrent)
30580:
30581: #if defined(SQLITE_WIN32_HAS_ANSI)
30582: { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 },
30583: #else
30584: { "GetFileAttributesA", (SYSCALL)0, 0 },
30585: #endif
30586:
30587: #define osGetFileAttributesA ((DWORD(WINAPI*)(LPCSTR))aSyscall[20].pCurrent)
30588:
1.2.2.1 ! misho 30589: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30590: { "GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0 },
30591: #else
30592: { "GetFileAttributesW", (SYSCALL)0, 0 },
30593: #endif
30594:
30595: #define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent)
30596:
30597: #if defined(SQLITE_WIN32_HAS_WIDE)
30598: { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 },
30599: #else
30600: { "GetFileAttributesExW", (SYSCALL)0, 0 },
30601: #endif
30602:
30603: #define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \
30604: LPVOID))aSyscall[22].pCurrent)
30605:
1.2.2.1 ! misho 30606: #if !SQLITE_OS_WINRT
1.2 misho 30607: { "GetFileSize", (SYSCALL)GetFileSize, 0 },
1.2.2.1 ! misho 30608: #else
! 30609: { "GetFileSize", (SYSCALL)0, 0 },
! 30610: #endif
1.2 misho 30611:
30612: #define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent)
30613:
30614: #if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI)
30615: { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 },
30616: #else
30617: { "GetFullPathNameA", (SYSCALL)0, 0 },
30618: #endif
30619:
30620: #define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \
30621: LPSTR*))aSyscall[24].pCurrent)
30622:
1.2.2.1 ! misho 30623: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30624: { "GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0 },
30625: #else
30626: { "GetFullPathNameW", (SYSCALL)0, 0 },
30627: #endif
30628:
30629: #define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \
30630: LPWSTR*))aSyscall[25].pCurrent)
30631:
30632: { "GetLastError", (SYSCALL)GetLastError, 0 },
30633:
30634: #define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent)
30635:
1.2.2.1 ! misho 30636: #if !defined(SQLITE_OMIT_LOAD_EXTENSION)
1.2 misho 30637: #if SQLITE_OS_WINCE
30638: /* The GetProcAddressA() routine is only available on Windows CE. */
30639: { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 },
30640: #else
30641: /* All other Windows platforms expect GetProcAddress() to take
30642: ** an ANSI string regardless of the _UNICODE setting */
30643: { "GetProcAddressA", (SYSCALL)GetProcAddress, 0 },
30644: #endif
1.2.2.1 ! misho 30645: #else
! 30646: { "GetProcAddressA", (SYSCALL)0, 0 },
! 30647: #endif
1.2 misho 30648:
30649: #define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \
30650: LPCSTR))aSyscall[27].pCurrent)
30651:
1.2.2.1 ! misho 30652: #if !SQLITE_OS_WINRT
1.2 misho 30653: { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 },
1.2.2.1 ! misho 30654: #else
! 30655: { "GetSystemInfo", (SYSCALL)0, 0 },
! 30656: #endif
1.2 misho 30657:
30658: #define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent)
30659:
30660: { "GetSystemTime", (SYSCALL)GetSystemTime, 0 },
30661:
30662: #define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent)
30663:
30664: #if !SQLITE_OS_WINCE
30665: { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 },
30666: #else
30667: { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 },
30668: #endif
30669:
30670: #define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \
30671: LPFILETIME))aSyscall[30].pCurrent)
30672:
30673: #if defined(SQLITE_WIN32_HAS_ANSI)
30674: { "GetTempPathA", (SYSCALL)GetTempPathA, 0 },
30675: #else
30676: { "GetTempPathA", (SYSCALL)0, 0 },
30677: #endif
30678:
30679: #define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent)
30680:
1.2.2.1 ! misho 30681: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
1.2 misho 30682: { "GetTempPathW", (SYSCALL)GetTempPathW, 0 },
30683: #else
30684: { "GetTempPathW", (SYSCALL)0, 0 },
30685: #endif
30686:
30687: #define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent)
30688:
1.2.2.1 ! misho 30689: #if !SQLITE_OS_WINRT
1.2 misho 30690: { "GetTickCount", (SYSCALL)GetTickCount, 0 },
1.2.2.1 ! misho 30691: #else
! 30692: { "GetTickCount", (SYSCALL)0, 0 },
! 30693: #endif
1.2 misho 30694:
30695: #define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent)
30696:
30697: #if defined(SQLITE_WIN32_HAS_ANSI)
30698: { "GetVersionExA", (SYSCALL)GetVersionExA, 0 },
30699: #else
30700: { "GetVersionExA", (SYSCALL)0, 0 },
30701: #endif
30702:
30703: #define osGetVersionExA ((BOOL(WINAPI*)( \
30704: LPOSVERSIONINFOA))aSyscall[34].pCurrent)
30705:
30706: { "HeapAlloc", (SYSCALL)HeapAlloc, 0 },
30707:
30708: #define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \
30709: SIZE_T))aSyscall[35].pCurrent)
30710:
1.2.2.1 ! misho 30711: #if !SQLITE_OS_WINRT
1.2 misho 30712: { "HeapCreate", (SYSCALL)HeapCreate, 0 },
1.2.2.1 ! misho 30713: #else
! 30714: { "HeapCreate", (SYSCALL)0, 0 },
! 30715: #endif
1.2 misho 30716:
30717: #define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \
30718: SIZE_T))aSyscall[36].pCurrent)
30719:
1.2.2.1 ! misho 30720: #if !SQLITE_OS_WINRT
1.2 misho 30721: { "HeapDestroy", (SYSCALL)HeapDestroy, 0 },
1.2.2.1 ! misho 30722: #else
! 30723: { "HeapDestroy", (SYSCALL)0, 0 },
! 30724: #endif
1.2 misho 30725:
30726: #define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[37].pCurrent)
30727:
30728: { "HeapFree", (SYSCALL)HeapFree, 0 },
30729:
30730: #define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[38].pCurrent)
30731:
30732: { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 },
30733:
30734: #define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \
30735: SIZE_T))aSyscall[39].pCurrent)
30736:
30737: { "HeapSize", (SYSCALL)HeapSize, 0 },
30738:
30739: #define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \
30740: LPCVOID))aSyscall[40].pCurrent)
30741:
1.2.2.1 ! misho 30742: #if !SQLITE_OS_WINRT
1.2 misho 30743: { "HeapValidate", (SYSCALL)HeapValidate, 0 },
1.2.2.1 ! misho 30744: #else
! 30745: { "HeapValidate", (SYSCALL)0, 0 },
! 30746: #endif
1.2 misho 30747:
30748: #define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \
30749: LPCVOID))aSyscall[41].pCurrent)
30750:
1.2.2.1 ! misho 30751: #if defined(SQLITE_WIN32_HAS_ANSI) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
1.2 misho 30752: { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 },
30753: #else
30754: { "LoadLibraryA", (SYSCALL)0, 0 },
30755: #endif
30756:
30757: #define osLoadLibraryA ((HMODULE(WINAPI*)(LPCSTR))aSyscall[42].pCurrent)
30758:
1.2.2.1 ! misho 30759: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \
! 30760: !defined(SQLITE_OMIT_LOAD_EXTENSION)
1.2 misho 30761: { "LoadLibraryW", (SYSCALL)LoadLibraryW, 0 },
30762: #else
30763: { "LoadLibraryW", (SYSCALL)0, 0 },
30764: #endif
30765:
30766: #define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[43].pCurrent)
30767:
1.2.2.1 ! misho 30768: #if !SQLITE_OS_WINRT
1.2 misho 30769: { "LocalFree", (SYSCALL)LocalFree, 0 },
1.2.2.1 ! misho 30770: #else
! 30771: { "LocalFree", (SYSCALL)0, 0 },
! 30772: #endif
1.2 misho 30773:
30774: #define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[44].pCurrent)
30775:
1.2.2.1 ! misho 30776: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
1.2 misho 30777: { "LockFile", (SYSCALL)LockFile, 0 },
1.2.2.1 ! misho 30778: #else
! 30779: { "LockFile", (SYSCALL)0, 0 },
! 30780: #endif
1.2 misho 30781:
1.2.2.1 ! misho 30782: #ifndef osLockFile
1.2 misho 30783: #define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
30784: DWORD))aSyscall[45].pCurrent)
30785: #endif
30786:
30787: #if !SQLITE_OS_WINCE
30788: { "LockFileEx", (SYSCALL)LockFileEx, 0 },
1.2.2.1 ! misho 30789: #else
! 30790: { "LockFileEx", (SYSCALL)0, 0 },
! 30791: #endif
1.2 misho 30792:
1.2.2.1 ! misho 30793: #ifndef osLockFileEx
1.2 misho 30794: #define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \
30795: LPOVERLAPPED))aSyscall[46].pCurrent)
30796: #endif
30797:
1.2.2.1 ! misho 30798: #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL))
1.2 misho 30799: { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 },
1.2.2.1 ! misho 30800: #else
! 30801: { "MapViewOfFile", (SYSCALL)0, 0 },
! 30802: #endif
1.2 misho 30803:
30804: #define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
30805: SIZE_T))aSyscall[47].pCurrent)
30806:
30807: { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 },
30808:
30809: #define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \
30810: int))aSyscall[48].pCurrent)
30811:
30812: { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 },
30813:
30814: #define osQueryPerformanceCounter ((BOOL(WINAPI*)( \
30815: LARGE_INTEGER*))aSyscall[49].pCurrent)
30816:
30817: { "ReadFile", (SYSCALL)ReadFile, 0 },
30818:
30819: #define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \
30820: LPOVERLAPPED))aSyscall[50].pCurrent)
30821:
30822: { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 },
30823:
30824: #define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[51].pCurrent)
30825:
1.2.2.1 ! misho 30826: #if !SQLITE_OS_WINRT
1.2 misho 30827: { "SetFilePointer", (SYSCALL)SetFilePointer, 0 },
1.2.2.1 ! misho 30828: #else
! 30829: { "SetFilePointer", (SYSCALL)0, 0 },
! 30830: #endif
1.2 misho 30831:
30832: #define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \
30833: DWORD))aSyscall[52].pCurrent)
30834:
1.2.2.1 ! misho 30835: #if !SQLITE_OS_WINRT
1.2 misho 30836: { "Sleep", (SYSCALL)Sleep, 0 },
1.2.2.1 ! misho 30837: #else
! 30838: { "Sleep", (SYSCALL)0, 0 },
! 30839: #endif
1.2 misho 30840:
30841: #define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[53].pCurrent)
30842:
30843: { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 },
30844:
30845: #define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \
30846: LPFILETIME))aSyscall[54].pCurrent)
30847:
1.2.2.1 ! misho 30848: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
1.2 misho 30849: { "UnlockFile", (SYSCALL)UnlockFile, 0 },
1.2.2.1 ! misho 30850: #else
! 30851: { "UnlockFile", (SYSCALL)0, 0 },
! 30852: #endif
1.2 misho 30853:
1.2.2.1 ! misho 30854: #ifndef osUnlockFile
1.2 misho 30855: #define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
30856: DWORD))aSyscall[55].pCurrent)
30857: #endif
30858:
30859: #if !SQLITE_OS_WINCE
30860: { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 },
30861: #else
30862: { "UnlockFileEx", (SYSCALL)0, 0 },
30863: #endif
30864:
1.2.2.1 ! misho 30865: #define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \
! 30866: LPOVERLAPPED))aSyscall[56].pCurrent)
! 30867:
! 30868: #if SQLITE_OS_WINCE || !defined(SQLITE_OMIT_WAL)
1.2 misho 30869: { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 },
1.2.2.1 ! misho 30870: #else
! 30871: { "UnmapViewOfFile", (SYSCALL)0, 0 },
! 30872: #endif
1.2 misho 30873:
30874: #define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[57].pCurrent)
30875:
30876: { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 },
30877:
30878: #define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \
30879: LPCSTR,LPBOOL))aSyscall[58].pCurrent)
30880:
30881: { "WriteFile", (SYSCALL)WriteFile, 0 },
30882:
30883: #define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \
30884: LPOVERLAPPED))aSyscall[59].pCurrent)
30885:
1.2.2.1 ! misho 30886: #if SQLITE_OS_WINRT
! 30887: { "CreateEventExW", (SYSCALL)CreateEventExW, 0 },
! 30888: #else
! 30889: { "CreateEventExW", (SYSCALL)0, 0 },
! 30890: #endif
! 30891:
! 30892: #define osCreateEventExW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,LPCWSTR, \
! 30893: DWORD,DWORD))aSyscall[60].pCurrent)
! 30894:
! 30895: #if !SQLITE_OS_WINRT
! 30896: { "WaitForSingleObject", (SYSCALL)WaitForSingleObject, 0 },
! 30897: #else
! 30898: { "WaitForSingleObject", (SYSCALL)0, 0 },
! 30899: #endif
! 30900:
! 30901: #define osWaitForSingleObject ((DWORD(WINAPI*)(HANDLE, \
! 30902: DWORD))aSyscall[61].pCurrent)
! 30903:
! 30904: #if SQLITE_OS_WINRT
! 30905: { "WaitForSingleObjectEx", (SYSCALL)WaitForSingleObjectEx, 0 },
! 30906: #else
! 30907: { "WaitForSingleObjectEx", (SYSCALL)0, 0 },
! 30908: #endif
! 30909:
! 30910: #define osWaitForSingleObjectEx ((DWORD(WINAPI*)(HANDLE,DWORD, \
! 30911: BOOL))aSyscall[62].pCurrent)
! 30912:
! 30913: #if SQLITE_OS_WINRT
! 30914: { "SetFilePointerEx", (SYSCALL)SetFilePointerEx, 0 },
! 30915: #else
! 30916: { "SetFilePointerEx", (SYSCALL)0, 0 },
! 30917: #endif
! 30918:
! 30919: #define osSetFilePointerEx ((BOOL(WINAPI*)(HANDLE,LARGE_INTEGER, \
! 30920: PLARGE_INTEGER,DWORD))aSyscall[63].pCurrent)
! 30921:
! 30922: #if SQLITE_OS_WINRT
! 30923: { "GetFileInformationByHandleEx", (SYSCALL)GetFileInformationByHandleEx, 0 },
! 30924: #else
! 30925: { "GetFileInformationByHandleEx", (SYSCALL)0, 0 },
! 30926: #endif
! 30927:
! 30928: #define osGetFileInformationByHandleEx ((BOOL(WINAPI*)(HANDLE, \
! 30929: FILE_INFO_BY_HANDLE_CLASS,LPVOID,DWORD))aSyscall[64].pCurrent)
! 30930:
! 30931: #if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL)
! 30932: { "MapViewOfFileFromApp", (SYSCALL)MapViewOfFileFromApp, 0 },
! 30933: #else
! 30934: { "MapViewOfFileFromApp", (SYSCALL)0, 0 },
! 30935: #endif
! 30936:
! 30937: #define osMapViewOfFileFromApp ((LPVOID(WINAPI*)(HANDLE,ULONG,ULONG64, \
! 30938: SIZE_T))aSyscall[65].pCurrent)
! 30939:
! 30940: #if SQLITE_OS_WINRT
! 30941: { "CreateFile2", (SYSCALL)CreateFile2, 0 },
! 30942: #else
! 30943: { "CreateFile2", (SYSCALL)0, 0 },
! 30944: #endif
! 30945:
! 30946: #define osCreateFile2 ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD,DWORD, \
! 30947: LPCREATEFILE2_EXTENDED_PARAMETERS))aSyscall[66].pCurrent)
! 30948:
! 30949: #if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_LOAD_EXTENSION)
! 30950: { "LoadPackagedLibrary", (SYSCALL)LoadPackagedLibrary, 0 },
! 30951: #else
! 30952: { "LoadPackagedLibrary", (SYSCALL)0, 0 },
! 30953: #endif
! 30954:
! 30955: #define osLoadPackagedLibrary ((HMODULE(WINAPI*)(LPCWSTR, \
! 30956: DWORD))aSyscall[67].pCurrent)
! 30957:
! 30958: #if SQLITE_OS_WINRT
! 30959: { "GetTickCount64", (SYSCALL)GetTickCount64, 0 },
! 30960: #else
! 30961: { "GetTickCount64", (SYSCALL)0, 0 },
! 30962: #endif
! 30963:
! 30964: #define osGetTickCount64 ((ULONGLONG(WINAPI*)(VOID))aSyscall[68].pCurrent)
! 30965:
! 30966: #if SQLITE_OS_WINRT
! 30967: { "GetNativeSystemInfo", (SYSCALL)GetNativeSystemInfo, 0 },
! 30968: #else
! 30969: { "GetNativeSystemInfo", (SYSCALL)0, 0 },
! 30970: #endif
! 30971:
! 30972: #define osGetNativeSystemInfo ((VOID(WINAPI*)( \
! 30973: LPSYSTEM_INFO))aSyscall[69].pCurrent)
! 30974:
! 30975: #if defined(SQLITE_WIN32_HAS_ANSI)
! 30976: { "OutputDebugStringA", (SYSCALL)OutputDebugStringA, 0 },
! 30977: #else
! 30978: { "OutputDebugStringA", (SYSCALL)0, 0 },
! 30979: #endif
! 30980:
! 30981: #define osOutputDebugStringA ((VOID(WINAPI*)(LPCSTR))aSyscall[70].pCurrent)
! 30982:
! 30983: #if defined(SQLITE_WIN32_HAS_WIDE)
! 30984: { "OutputDebugStringW", (SYSCALL)OutputDebugStringW, 0 },
! 30985: #else
! 30986: { "OutputDebugStringW", (SYSCALL)0, 0 },
! 30987: #endif
! 30988:
! 30989: #define osOutputDebugStringW ((VOID(WINAPI*)(LPCWSTR))aSyscall[71].pCurrent)
! 30990:
! 30991: { "GetProcessHeap", (SYSCALL)GetProcessHeap, 0 },
! 30992:
! 30993: #define osGetProcessHeap ((HANDLE(WINAPI*)(VOID))aSyscall[72].pCurrent)
! 30994:
! 30995: #if SQLITE_OS_WINRT && !defined(SQLITE_OMIT_WAL)
! 30996: { "CreateFileMappingFromApp", (SYSCALL)CreateFileMappingFromApp, 0 },
! 30997: #else
! 30998: { "CreateFileMappingFromApp", (SYSCALL)0, 0 },
! 30999: #endif
! 31000:
! 31001: #define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \
! 31002: LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[73].pCurrent)
! 31003:
1.2 misho 31004: }; /* End of the overrideable system calls */
31005:
31006: /*
31007: ** This is the xSetSystemCall() method of sqlite3_vfs for all of the
31008: ** "win32" VFSes. Return SQLITE_OK opon successfully updating the
31009: ** system call pointer, or SQLITE_NOTFOUND if there is no configurable
31010: ** system call named zName.
31011: */
31012: static int winSetSystemCall(
31013: sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */
31014: const char *zName, /* Name of system call to override */
31015: sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */
31016: ){
31017: unsigned int i;
31018: int rc = SQLITE_NOTFOUND;
31019:
31020: UNUSED_PARAMETER(pNotUsed);
31021: if( zName==0 ){
31022: /* If no zName is given, restore all system calls to their default
31023: ** settings and return NULL
31024: */
31025: rc = SQLITE_OK;
31026: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
31027: if( aSyscall[i].pDefault ){
31028: aSyscall[i].pCurrent = aSyscall[i].pDefault;
31029: }
31030: }
31031: }else{
31032: /* If zName is specified, operate on only the one system call
31033: ** specified.
31034: */
31035: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
31036: if( strcmp(zName, aSyscall[i].zName)==0 ){
31037: if( aSyscall[i].pDefault==0 ){
31038: aSyscall[i].pDefault = aSyscall[i].pCurrent;
31039: }
31040: rc = SQLITE_OK;
31041: if( pNewFunc==0 ) pNewFunc = aSyscall[i].pDefault;
31042: aSyscall[i].pCurrent = pNewFunc;
31043: break;
31044: }
31045: }
31046: }
31047: return rc;
31048: }
31049:
31050: /*
31051: ** Return the value of a system call. Return NULL if zName is not a
31052: ** recognized system call name. NULL is also returned if the system call
31053: ** is currently undefined.
31054: */
31055: static sqlite3_syscall_ptr winGetSystemCall(
31056: sqlite3_vfs *pNotUsed,
31057: const char *zName
31058: ){
31059: unsigned int i;
31060:
31061: UNUSED_PARAMETER(pNotUsed);
31062: for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){
31063: if( strcmp(zName, aSyscall[i].zName)==0 ) return aSyscall[i].pCurrent;
31064: }
31065: return 0;
31066: }
31067:
31068: /*
31069: ** Return the name of the first system call after zName. If zName==NULL
31070: ** then return the name of the first system call. Return NULL if zName
31071: ** is the last system call or if zName is not the name of a valid
31072: ** system call.
31073: */
31074: static const char *winNextSystemCall(sqlite3_vfs *p, const char *zName){
31075: int i = -1;
31076:
31077: UNUSED_PARAMETER(p);
31078: if( zName ){
31079: for(i=0; i<ArraySize(aSyscall)-1; i++){
31080: if( strcmp(zName, aSyscall[i].zName)==0 ) break;
31081: }
31082: }
31083: for(i++; i<ArraySize(aSyscall); i++){
31084: if( aSyscall[i].pCurrent!=0 ) return aSyscall[i].zName;
31085: }
31086: return 0;
31087: }
31088:
31089: /*
1.2.2.1 ! misho 31090: ** This function outputs the specified (ANSI) string to the Win32 debugger
! 31091: ** (if available).
! 31092: */
! 31093:
! 31094: SQLITE_API void sqlite3_win32_write_debug(char *zBuf, int nBuf){
! 31095: char zDbgBuf[SQLITE_WIN32_DBG_BUF_SIZE];
! 31096: int nMin = MIN(nBuf, (SQLITE_WIN32_DBG_BUF_SIZE - 1)); /* may be negative. */
! 31097: if( nMin<-1 ) nMin = -1; /* all negative values become -1. */
! 31098: assert( nMin==-1 || nMin==0 || nMin<SQLITE_WIN32_DBG_BUF_SIZE );
! 31099: #if defined(SQLITE_WIN32_HAS_ANSI)
! 31100: if( nMin>0 ){
! 31101: memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE);
! 31102: memcpy(zDbgBuf, zBuf, nMin);
! 31103: osOutputDebugStringA(zDbgBuf);
! 31104: }else{
! 31105: osOutputDebugStringA(zBuf);
! 31106: }
! 31107: #elif defined(SQLITE_WIN32_HAS_WIDE)
! 31108: memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE);
! 31109: if ( osMultiByteToWideChar(
! 31110: osAreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, zBuf,
! 31111: nMin, (LPWSTR)zDbgBuf, SQLITE_WIN32_DBG_BUF_SIZE/sizeof(WCHAR))<=0 ){
! 31112: return;
! 31113: }
! 31114: osOutputDebugStringW((LPCWSTR)zDbgBuf);
! 31115: #else
! 31116: if( nMin>0 ){
! 31117: memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE);
! 31118: memcpy(zDbgBuf, zBuf, nMin);
! 31119: fprintf(stderr, "%s", zDbgBuf);
! 31120: }else{
! 31121: fprintf(stderr, "%s", zBuf);
! 31122: }
! 31123: #endif
! 31124: }
! 31125:
! 31126: /*
! 31127: ** The following routine suspends the current thread for at least ms
! 31128: ** milliseconds. This is equivalent to the Win32 Sleep() interface.
! 31129: */
! 31130: #if SQLITE_OS_WINRT
! 31131: static HANDLE sleepObj = NULL;
! 31132: #endif
! 31133:
! 31134: SQLITE_API void sqlite3_win32_sleep(DWORD milliseconds){
! 31135: #if SQLITE_OS_WINRT
! 31136: if ( sleepObj==NULL ){
! 31137: sleepObj = osCreateEventExW(NULL, NULL, CREATE_EVENT_MANUAL_RESET,
! 31138: SYNCHRONIZE);
! 31139: }
! 31140: assert( sleepObj!=NULL );
! 31141: osWaitForSingleObjectEx(sleepObj, milliseconds, FALSE);
! 31142: #else
! 31143: osSleep(milliseconds);
! 31144: #endif
! 31145: }
! 31146:
! 31147: /*
1.2 misho 31148: ** Return true (non-zero) if we are running under WinNT, Win2K, WinXP,
31149: ** or WinCE. Return false (zero) for Win95, Win98, or WinME.
31150: **
31151: ** Here is an interesting observation: Win95, Win98, and WinME lack
31152: ** the LockFileEx() API. But we can still statically link against that
31153: ** API as long as we don't call it when running Win95/98/ME. A call to
31154: ** this routine is used to determine if the host is Win95/98/ME or
31155: ** WinNT/2K/XP so that we will know whether or not we can safely call
31156: ** the LockFileEx() API.
31157: */
1.2.2.1 ! misho 31158: #if SQLITE_OS_WINCE || SQLITE_OS_WINRT
1.2 misho 31159: # define isNT() (1)
1.2.2.1 ! misho 31160: #elif !defined(SQLITE_WIN32_HAS_WIDE)
! 31161: # define isNT() (0)
1.2 misho 31162: #else
31163: static int isNT(void){
31164: if( sqlite3_os_type==0 ){
31165: OSVERSIONINFOA sInfo;
31166: sInfo.dwOSVersionInfoSize = sizeof(sInfo);
31167: osGetVersionExA(&sInfo);
31168: sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1;
31169: }
31170: return sqlite3_os_type==2;
31171: }
1.2.2.1 ! misho 31172: #endif
1.2 misho 31173:
31174: #ifdef SQLITE_WIN32_MALLOC
31175: /*
31176: ** Allocate nBytes of memory.
31177: */
31178: static void *winMemMalloc(int nBytes){
31179: HANDLE hHeap;
31180: void *p;
31181:
31182: winMemAssertMagic();
31183: hHeap = winMemGetHeap();
31184: assert( hHeap!=0 );
31185: assert( hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31186: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31187: assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
31188: #endif
31189: assert( nBytes>=0 );
31190: p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes);
31191: if( !p ){
31192: sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%d), heap=%p",
31193: nBytes, osGetLastError(), (void*)hHeap);
31194: }
31195: return p;
31196: }
31197:
31198: /*
31199: ** Free memory.
31200: */
31201: static void winMemFree(void *pPrior){
31202: HANDLE hHeap;
31203:
31204: winMemAssertMagic();
31205: hHeap = winMemGetHeap();
31206: assert( hHeap!=0 );
31207: assert( hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31208: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31209: assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) );
31210: #endif
31211: if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */
31212: if( !osHeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){
31213: sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%d), heap=%p",
31214: pPrior, osGetLastError(), (void*)hHeap);
31215: }
31216: }
31217:
31218: /*
31219: ** Change the size of an existing memory allocation
31220: */
31221: static void *winMemRealloc(void *pPrior, int nBytes){
31222: HANDLE hHeap;
31223: void *p;
31224:
31225: winMemAssertMagic();
31226: hHeap = winMemGetHeap();
31227: assert( hHeap!=0 );
31228: assert( hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31229: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31230: assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) );
31231: #endif
31232: assert( nBytes>=0 );
31233: if( !pPrior ){
31234: p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes);
31235: }else{
31236: p = osHeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes);
31237: }
31238: if( !p ){
31239: sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%d), heap=%p",
31240: pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(),
31241: (void*)hHeap);
31242: }
31243: return p;
31244: }
31245:
31246: /*
31247: ** Return the size of an outstanding allocation, in bytes.
31248: */
31249: static int winMemSize(void *p){
31250: HANDLE hHeap;
31251: SIZE_T n;
31252:
31253: winMemAssertMagic();
31254: hHeap = winMemGetHeap();
31255: assert( hHeap!=0 );
31256: assert( hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31257: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31258: assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
31259: #endif
31260: if( !p ) return 0;
31261: n = osHeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p);
31262: if( n==(SIZE_T)-1 ){
31263: sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%d), heap=%p",
31264: p, osGetLastError(), (void*)hHeap);
31265: return 0;
31266: }
31267: return (int)n;
31268: }
31269:
31270: /*
31271: ** Round up a request size to the next valid allocation size.
31272: */
31273: static int winMemRoundup(int n){
31274: return n;
31275: }
31276:
31277: /*
31278: ** Initialize this module.
31279: */
31280: static int winMemInit(void *pAppData){
31281: winMemData *pWinMemData = (winMemData *)pAppData;
31282:
31283: if( !pWinMemData ) return SQLITE_ERROR;
31284: assert( pWinMemData->magic==WINMEM_MAGIC );
1.2.2.1 ! misho 31285:
! 31286: #if !SQLITE_OS_WINRT && SQLITE_WIN32_HEAP_CREATE
1.2 misho 31287: if( !pWinMemData->hHeap ){
31288: pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS,
31289: SQLITE_WIN32_HEAP_INIT_SIZE,
31290: SQLITE_WIN32_HEAP_MAX_SIZE);
31291: if( !pWinMemData->hHeap ){
31292: sqlite3_log(SQLITE_NOMEM,
31293: "failed to HeapCreate (%d), flags=%u, initSize=%u, maxSize=%u",
31294: osGetLastError(), SQLITE_WIN32_HEAP_FLAGS,
31295: SQLITE_WIN32_HEAP_INIT_SIZE, SQLITE_WIN32_HEAP_MAX_SIZE);
31296: return SQLITE_NOMEM;
31297: }
31298: pWinMemData->bOwned = TRUE;
1.2.2.1 ! misho 31299: assert( pWinMemData->bOwned );
! 31300: }
! 31301: #else
! 31302: pWinMemData->hHeap = osGetProcessHeap();
! 31303: if( !pWinMemData->hHeap ){
! 31304: sqlite3_log(SQLITE_NOMEM,
! 31305: "failed to GetProcessHeap (%d)", osGetLastError());
! 31306: return SQLITE_NOMEM;
1.2 misho 31307: }
1.2.2.1 ! misho 31308: pWinMemData->bOwned = FALSE;
! 31309: assert( !pWinMemData->bOwned );
! 31310: #endif
1.2 misho 31311: assert( pWinMemData->hHeap!=0 );
31312: assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31313: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31314: assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
31315: #endif
31316: return SQLITE_OK;
31317: }
31318:
31319: /*
31320: ** Deinitialize this module.
31321: */
31322: static void winMemShutdown(void *pAppData){
31323: winMemData *pWinMemData = (winMemData *)pAppData;
31324:
31325: if( !pWinMemData ) return;
31326: if( pWinMemData->hHeap ){
31327: assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE );
1.2.2.1 ! misho 31328: #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1.2 misho 31329: assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
31330: #endif
31331: if( pWinMemData->bOwned ){
31332: if( !osHeapDestroy(pWinMemData->hHeap) ){
31333: sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%d), heap=%p",
31334: osGetLastError(), (void*)pWinMemData->hHeap);
31335: }
31336: pWinMemData->bOwned = FALSE;
31337: }
31338: pWinMemData->hHeap = NULL;
31339: }
31340: }
31341:
31342: /*
31343: ** Populate the low-level memory allocation function pointers in
31344: ** sqlite3GlobalConfig.m with pointers to the routines in this file. The
31345: ** arguments specify the block of memory to manage.
31346: **
31347: ** This routine is only called by sqlite3_config(), and therefore
31348: ** is not required to be threadsafe (it is not).
31349: */
31350: SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){
31351: static const sqlite3_mem_methods winMemMethods = {
31352: winMemMalloc,
31353: winMemFree,
31354: winMemRealloc,
31355: winMemSize,
31356: winMemRoundup,
31357: winMemInit,
31358: winMemShutdown,
31359: &win_mem_data
31360: };
31361: return &winMemMethods;
31362: }
31363:
31364: SQLITE_PRIVATE void sqlite3MemSetDefault(void){
31365: sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32());
31366: }
31367: #endif /* SQLITE_WIN32_MALLOC */
31368:
31369: /*
31370: ** Convert a UTF-8 string to Microsoft Unicode (UTF-16?).
31371: **
31372: ** Space to hold the returned string is obtained from malloc.
31373: */
31374: static LPWSTR utf8ToUnicode(const char *zFilename){
31375: int nChar;
31376: LPWSTR zWideFilename;
31377:
31378: nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0);
31379: if( nChar==0 ){
31380: return 0;
31381: }
1.2.2.1 ! misho 31382: zWideFilename = sqlite3MallocZero( nChar*sizeof(zWideFilename[0]) );
1.2 misho 31383: if( zWideFilename==0 ){
31384: return 0;
31385: }
31386: nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename,
31387: nChar);
31388: if( nChar==0 ){
31389: sqlite3_free(zWideFilename);
31390: zWideFilename = 0;
31391: }
31392: return zWideFilename;
31393: }
31394:
31395: /*
31396: ** Convert Microsoft Unicode to UTF-8. Space to hold the returned string is
31397: ** obtained from sqlite3_malloc().
31398: */
31399: static char *unicodeToUtf8(LPCWSTR zWideFilename){
31400: int nByte;
31401: char *zFilename;
31402:
31403: nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0);
31404: if( nByte == 0 ){
31405: return 0;
31406: }
1.2.2.1 ! misho 31407: zFilename = sqlite3MallocZero( nByte );
1.2 misho 31408: if( zFilename==0 ){
31409: return 0;
31410: }
31411: nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte,
31412: 0, 0);
31413: if( nByte == 0 ){
31414: sqlite3_free(zFilename);
31415: zFilename = 0;
31416: }
31417: return zFilename;
31418: }
31419:
31420: /*
31421: ** Convert an ANSI string to Microsoft Unicode, based on the
31422: ** current codepage settings for file apis.
31423: **
31424: ** Space to hold the returned string is obtained
31425: ** from sqlite3_malloc.
31426: */
31427: static LPWSTR mbcsToUnicode(const char *zFilename){
31428: int nByte;
31429: LPWSTR zMbcsFilename;
31430: int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP;
31431:
31432: nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, NULL,
31433: 0)*sizeof(WCHAR);
31434: if( nByte==0 ){
31435: return 0;
31436: }
1.2.2.1 ! misho 31437: zMbcsFilename = sqlite3MallocZero( nByte*sizeof(zMbcsFilename[0]) );
1.2 misho 31438: if( zMbcsFilename==0 ){
31439: return 0;
31440: }
31441: nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename,
31442: nByte);
31443: if( nByte==0 ){
31444: sqlite3_free(zMbcsFilename);
31445: zMbcsFilename = 0;
31446: }
31447: return zMbcsFilename;
31448: }
31449:
31450: /*
31451: ** Convert Microsoft Unicode to multi-byte character string, based on the
31452: ** user's ANSI codepage.
31453: **
31454: ** Space to hold the returned string is obtained from
31455: ** sqlite3_malloc().
31456: */
31457: static char *unicodeToMbcs(LPCWSTR zWideFilename){
31458: int nByte;
31459: char *zFilename;
31460: int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP;
31461:
31462: nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0);
31463: if( nByte == 0 ){
31464: return 0;
31465: }
1.2.2.1 ! misho 31466: zFilename = sqlite3MallocZero( nByte );
1.2 misho 31467: if( zFilename==0 ){
31468: return 0;
31469: }
31470: nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename,
31471: nByte, 0, 0);
31472: if( nByte == 0 ){
31473: sqlite3_free(zFilename);
31474: zFilename = 0;
31475: }
31476: return zFilename;
31477: }
31478:
31479: /*
31480: ** Convert multibyte character string to UTF-8. Space to hold the
31481: ** returned string is obtained from sqlite3_malloc().
31482: */
31483: SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){
31484: char *zFilenameUtf8;
31485: LPWSTR zTmpWide;
31486:
31487: zTmpWide = mbcsToUnicode(zFilename);
31488: if( zTmpWide==0 ){
31489: return 0;
31490: }
31491: zFilenameUtf8 = unicodeToUtf8(zTmpWide);
31492: sqlite3_free(zTmpWide);
31493: return zFilenameUtf8;
31494: }
31495:
31496: /*
31497: ** Convert UTF-8 to multibyte character string. Space to hold the
31498: ** returned string is obtained from sqlite3_malloc().
31499: */
31500: SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){
31501: char *zFilenameMbcs;
31502: LPWSTR zTmpWide;
31503:
31504: zTmpWide = utf8ToUnicode(zFilename);
31505: if( zTmpWide==0 ){
31506: return 0;
31507: }
31508: zFilenameMbcs = unicodeToMbcs(zTmpWide);
31509: sqlite3_free(zTmpWide);
31510: return zFilenameMbcs;
31511: }
31512:
1.2.2.1 ! misho 31513: /*
! 31514: ** This function sets the data directory or the temporary directory based on
! 31515: ** the provided arguments. The type argument must be 1 in order to set the
! 31516: ** data directory or 2 in order to set the temporary directory. The zValue
! 31517: ** argument is the name of the directory to use. The return value will be
! 31518: ** SQLITE_OK if successful.
! 31519: */
! 31520: SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
! 31521: char **ppDirectory = 0;
! 31522: #ifndef SQLITE_OMIT_AUTOINIT
! 31523: int rc = sqlite3_initialize();
! 31524: if( rc ) return rc;
! 31525: #endif
! 31526: if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){
! 31527: ppDirectory = &sqlite3_data_directory;
! 31528: }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){
! 31529: ppDirectory = &sqlite3_temp_directory;
! 31530: }
! 31531: assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE
! 31532: || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE
! 31533: );
! 31534: assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) );
! 31535: if( ppDirectory ){
! 31536: char *zValueUtf8 = 0;
! 31537: if( zValue && zValue[0] ){
! 31538: zValueUtf8 = unicodeToUtf8(zValue);
! 31539: if ( zValueUtf8==0 ){
! 31540: return SQLITE_NOMEM;
! 31541: }
! 31542: }
! 31543: sqlite3_free(*ppDirectory);
! 31544: *ppDirectory = zValueUtf8;
! 31545: return SQLITE_OK;
! 31546: }
! 31547: return SQLITE_ERROR;
! 31548: }
1.2 misho 31549:
31550: /*
31551: ** The return value of getLastErrorMsg
31552: ** is zero if the error message fits in the buffer, or non-zero
31553: ** otherwise (if the message was truncated).
31554: */
31555: static int getLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){
31556: /* FormatMessage returns 0 on failure. Otherwise it
31557: ** returns the number of TCHARs written to the output
31558: ** buffer, excluding the terminating null char.
31559: */
31560: DWORD dwLen = 0;
31561: char *zOut = 0;
31562:
31563: if( isNT() ){
1.2.2.1 ! misho 31564: #if SQLITE_OS_WINRT
! 31565: WCHAR zTempWide[MAX_PATH+1]; /* NOTE: Somewhat arbitrary. */
! 31566: dwLen = osFormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM |
! 31567: FORMAT_MESSAGE_IGNORE_INSERTS,
! 31568: NULL,
! 31569: lastErrno,
! 31570: 0,
! 31571: zTempWide,
! 31572: MAX_PATH,
! 31573: 0);
! 31574: #else
1.2 misho 31575: LPWSTR zTempWide = NULL;
31576: dwLen = osFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
31577: FORMAT_MESSAGE_FROM_SYSTEM |
31578: FORMAT_MESSAGE_IGNORE_INSERTS,
31579: NULL,
31580: lastErrno,
31581: 0,
31582: (LPWSTR) &zTempWide,
31583: 0,
31584: 0);
1.2.2.1 ! misho 31585: #endif
1.2 misho 31586: if( dwLen > 0 ){
31587: /* allocate a buffer and convert to UTF8 */
31588: sqlite3BeginBenignMalloc();
31589: zOut = unicodeToUtf8(zTempWide);
31590: sqlite3EndBenignMalloc();
1.2.2.1 ! misho 31591: #if !SQLITE_OS_WINRT
1.2 misho 31592: /* free the system buffer allocated by FormatMessage */
31593: osLocalFree(zTempWide);
1.2.2.1 ! misho 31594: #endif
1.2 misho 31595: }
1.2.2.1 ! misho 31596: }
! 31597: #ifdef SQLITE_WIN32_HAS_ANSI
! 31598: else{
1.2 misho 31599: char *zTemp = NULL;
31600: dwLen = osFormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
31601: FORMAT_MESSAGE_FROM_SYSTEM |
31602: FORMAT_MESSAGE_IGNORE_INSERTS,
31603: NULL,
31604: lastErrno,
31605: 0,
31606: (LPSTR) &zTemp,
31607: 0,
31608: 0);
31609: if( dwLen > 0 ){
31610: /* allocate a buffer and convert to UTF8 */
31611: sqlite3BeginBenignMalloc();
31612: zOut = sqlite3_win32_mbcs_to_utf8(zTemp);
31613: sqlite3EndBenignMalloc();
31614: /* free the system buffer allocated by FormatMessage */
31615: osLocalFree(zTemp);
31616: }
31617: }
1.2.2.1 ! misho 31618: #endif
1.2 misho 31619: if( 0 == dwLen ){
31620: sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", lastErrno, lastErrno);
31621: }else{
31622: /* copy a maximum of nBuf chars to output buffer */
31623: sqlite3_snprintf(nBuf, zBuf, "%s", zOut);
31624: /* free the UTF8 buffer */
31625: sqlite3_free(zOut);
31626: }
31627: return 0;
31628: }
31629:
31630: /*
31631: **
31632: ** This function - winLogErrorAtLine() - is only ever called via the macro
31633: ** winLogError().
31634: **
31635: ** This routine is invoked after an error occurs in an OS function.
31636: ** It logs a message using sqlite3_log() containing the current value of
31637: ** error code and, if possible, the human-readable equivalent from
31638: ** FormatMessage.
31639: **
31640: ** The first argument passed to the macro should be the error code that
31641: ** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN).
31642: ** The two subsequent arguments should be the name of the OS function that
1.2.2.1 ! misho 31643: ** failed and the associated file-system path, if any.
1.2 misho 31644: */
31645: #define winLogError(a,b,c,d) winLogErrorAtLine(a,b,c,d,__LINE__)
31646: static int winLogErrorAtLine(
31647: int errcode, /* SQLite error code */
31648: DWORD lastErrno, /* Win32 last error */
31649: const char *zFunc, /* Name of OS function that failed */
31650: const char *zPath, /* File path associated with error */
31651: int iLine /* Source line number where error occurred */
31652: ){
31653: char zMsg[500]; /* Human readable error text */
31654: int i; /* Loop counter */
31655:
31656: zMsg[0] = 0;
31657: getLastErrorMsg(lastErrno, sizeof(zMsg), zMsg);
31658: assert( errcode!=SQLITE_OK );
31659: if( zPath==0 ) zPath = "";
31660: for(i=0; zMsg[i] && zMsg[i]!='\r' && zMsg[i]!='\n'; i++){}
31661: zMsg[i] = 0;
31662: sqlite3_log(errcode,
31663: "os_win.c:%d: (%d) %s(%s) - %s",
31664: iLine, lastErrno, zFunc, zPath, zMsg
31665: );
31666:
31667: return errcode;
31668: }
31669:
31670: /*
31671: ** The number of times that a ReadFile(), WriteFile(), and DeleteFile()
31672: ** will be retried following a locking error - probably caused by
31673: ** antivirus software. Also the initial delay before the first retry.
31674: ** The delay increases linearly with each retry.
31675: */
31676: #ifndef SQLITE_WIN32_IOERR_RETRY
31677: # define SQLITE_WIN32_IOERR_RETRY 10
31678: #endif
31679: #ifndef SQLITE_WIN32_IOERR_RETRY_DELAY
31680: # define SQLITE_WIN32_IOERR_RETRY_DELAY 25
31681: #endif
31682: static int win32IoerrRetry = SQLITE_WIN32_IOERR_RETRY;
31683: static int win32IoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY;
31684:
31685: /*
31686: ** If a ReadFile() or WriteFile() error occurs, invoke this routine
31687: ** to see if it should be retried. Return TRUE to retry. Return FALSE
31688: ** to give up with an error.
31689: */
31690: static int retryIoerr(int *pnRetry, DWORD *pError){
31691: DWORD e = osGetLastError();
31692: if( *pnRetry>=win32IoerrRetry ){
31693: if( pError ){
31694: *pError = e;
31695: }
31696: return 0;
31697: }
31698: if( e==ERROR_ACCESS_DENIED ||
31699: e==ERROR_LOCK_VIOLATION ||
31700: e==ERROR_SHARING_VIOLATION ){
1.2.2.1 ! misho 31701: sqlite3_win32_sleep(win32IoerrRetryDelay*(1+*pnRetry));
1.2 misho 31702: ++*pnRetry;
31703: return 1;
31704: }
31705: if( pError ){
31706: *pError = e;
31707: }
31708: return 0;
31709: }
31710:
31711: /*
31712: ** Log a I/O error retry episode.
31713: */
31714: static void logIoerr(int nRetry){
31715: if( nRetry ){
31716: sqlite3_log(SQLITE_IOERR,
31717: "delayed %dms for lock/sharing conflict",
31718: win32IoerrRetryDelay*nRetry*(nRetry+1)/2
31719: );
31720: }
31721: }
31722:
31723: #if SQLITE_OS_WINCE
31724: /*************************************************************************
31725: ** This section contains code for WinCE only.
31726: */
31727: /*
31728: ** Windows CE does not have a localtime() function. So create a
31729: ** substitute.
31730: */
31731: /* #include <time.h> */
31732: struct tm *__cdecl localtime(const time_t *t)
31733: {
31734: static struct tm y;
31735: FILETIME uTm, lTm;
31736: SYSTEMTIME pTm;
31737: sqlite3_int64 t64;
31738: t64 = *t;
31739: t64 = (t64 + 11644473600)*10000000;
31740: uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF);
31741: uTm.dwHighDateTime= (DWORD)(t64 >> 32);
31742: osFileTimeToLocalFileTime(&uTm,&lTm);
31743: osFileTimeToSystemTime(&lTm,&pTm);
31744: y.tm_year = pTm.wYear - 1900;
31745: y.tm_mon = pTm.wMonth - 1;
31746: y.tm_wday = pTm.wDayOfWeek;
31747: y.tm_mday = pTm.wDay;
31748: y.tm_hour = pTm.wHour;
31749: y.tm_min = pTm.wMinute;
31750: y.tm_sec = pTm.wSecond;
31751: return &y;
31752: }
31753:
31754: #define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)]
31755:
31756: /*
31757: ** Acquire a lock on the handle h
31758: */
31759: static void winceMutexAcquire(HANDLE h){
31760: DWORD dwErr;
31761: do {
1.2.2.1 ! misho 31762: dwErr = osWaitForSingleObject(h, INFINITE);
1.2 misho 31763: } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED);
31764: }
31765: /*
31766: ** Release a lock acquired by winceMutexAcquire()
31767: */
31768: #define winceMutexRelease(h) ReleaseMutex(h)
31769:
31770: /*
31771: ** Create the mutex and shared memory used for locking in the file
31772: ** descriptor pFile
31773: */
31774: static BOOL winceCreateLock(const char *zFilename, winFile *pFile){
31775: LPWSTR zTok;
31776: LPWSTR zName;
31777: BOOL bInit = TRUE;
31778:
31779: zName = utf8ToUnicode(zFilename);
31780: if( zName==0 ){
31781: /* out of memory */
31782: return FALSE;
31783: }
31784:
31785: /* Initialize the local lockdata */
31786: memset(&pFile->local, 0, sizeof(pFile->local));
31787:
31788: /* Replace the backslashes from the filename and lowercase it
31789: ** to derive a mutex name. */
31790: zTok = osCharLowerW(zName);
31791: for (;*zTok;zTok++){
31792: if (*zTok == '\\') *zTok = '_';
31793: }
31794:
31795: /* Create/open the named mutex */
31796: pFile->hMutex = osCreateMutexW(NULL, FALSE, zName);
31797: if (!pFile->hMutex){
31798: pFile->lastErrno = osGetLastError();
31799: winLogError(SQLITE_ERROR, pFile->lastErrno, "winceCreateLock1", zFilename);
31800: sqlite3_free(zName);
31801: return FALSE;
31802: }
31803:
31804: /* Acquire the mutex before continuing */
31805: winceMutexAcquire(pFile->hMutex);
31806:
31807: /* Since the names of named mutexes, semaphores, file mappings etc are
31808: ** case-sensitive, take advantage of that by uppercasing the mutex name
31809: ** and using that as the shared filemapping name.
31810: */
31811: osCharUpperW(zName);
31812: pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
31813: PAGE_READWRITE, 0, sizeof(winceLock),
31814: zName);
31815:
31816: /* Set a flag that indicates we're the first to create the memory so it
31817: ** must be zero-initialized */
31818: if (osGetLastError() == ERROR_ALREADY_EXISTS){
31819: bInit = FALSE;
31820: }
31821:
31822: sqlite3_free(zName);
31823:
31824: /* If we succeeded in making the shared memory handle, map it. */
31825: if (pFile->hShared){
31826: pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared,
31827: FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock));
31828: /* If mapping failed, close the shared memory handle and erase it */
31829: if (!pFile->shared){
31830: pFile->lastErrno = osGetLastError();
31831: winLogError(SQLITE_ERROR, pFile->lastErrno,
31832: "winceCreateLock2", zFilename);
31833: osCloseHandle(pFile->hShared);
31834: pFile->hShared = NULL;
31835: }
31836: }
31837:
31838: /* If shared memory could not be created, then close the mutex and fail */
31839: if (pFile->hShared == NULL){
31840: winceMutexRelease(pFile->hMutex);
31841: osCloseHandle(pFile->hMutex);
31842: pFile->hMutex = NULL;
31843: return FALSE;
31844: }
31845:
31846: /* Initialize the shared memory if we're supposed to */
31847: if (bInit) {
31848: memset(pFile->shared, 0, sizeof(winceLock));
31849: }
31850:
31851: winceMutexRelease(pFile->hMutex);
31852: return TRUE;
31853: }
31854:
31855: /*
31856: ** Destroy the part of winFile that deals with wince locks
31857: */
31858: static void winceDestroyLock(winFile *pFile){
31859: if (pFile->hMutex){
31860: /* Acquire the mutex */
31861: winceMutexAcquire(pFile->hMutex);
31862:
31863: /* The following blocks should probably assert in debug mode, but they
31864: are to cleanup in case any locks remained open */
31865: if (pFile->local.nReaders){
31866: pFile->shared->nReaders --;
31867: }
31868: if (pFile->local.bReserved){
31869: pFile->shared->bReserved = FALSE;
31870: }
31871: if (pFile->local.bPending){
31872: pFile->shared->bPending = FALSE;
31873: }
31874: if (pFile->local.bExclusive){
31875: pFile->shared->bExclusive = FALSE;
31876: }
31877:
31878: /* De-reference and close our copy of the shared memory handle */
31879: osUnmapViewOfFile(pFile->shared);
31880: osCloseHandle(pFile->hShared);
31881:
31882: /* Done with the mutex */
31883: winceMutexRelease(pFile->hMutex);
31884: osCloseHandle(pFile->hMutex);
31885: pFile->hMutex = NULL;
31886: }
31887: }
31888:
31889: /*
31890: ** An implementation of the LockFile() API of Windows for CE
31891: */
31892: static BOOL winceLockFile(
1.2.2.1 ! misho 31893: LPHANDLE phFile,
1.2 misho 31894: DWORD dwFileOffsetLow,
31895: DWORD dwFileOffsetHigh,
31896: DWORD nNumberOfBytesToLockLow,
31897: DWORD nNumberOfBytesToLockHigh
31898: ){
31899: winFile *pFile = HANDLE_TO_WINFILE(phFile);
31900: BOOL bReturn = FALSE;
31901:
31902: UNUSED_PARAMETER(dwFileOffsetHigh);
31903: UNUSED_PARAMETER(nNumberOfBytesToLockHigh);
31904:
31905: if (!pFile->hMutex) return TRUE;
31906: winceMutexAcquire(pFile->hMutex);
31907:
31908: /* Wanting an exclusive lock? */
31909: if (dwFileOffsetLow == (DWORD)SHARED_FIRST
31910: && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){
31911: if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){
31912: pFile->shared->bExclusive = TRUE;
31913: pFile->local.bExclusive = TRUE;
31914: bReturn = TRUE;
31915: }
31916: }
31917:
31918: /* Want a read-only lock? */
31919: else if (dwFileOffsetLow == (DWORD)SHARED_FIRST &&
31920: nNumberOfBytesToLockLow == 1){
31921: if (pFile->shared->bExclusive == 0){
31922: pFile->local.nReaders ++;
31923: if (pFile->local.nReaders == 1){
31924: pFile->shared->nReaders ++;
31925: }
31926: bReturn = TRUE;
31927: }
31928: }
31929:
31930: /* Want a pending lock? */
31931: else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToLockLow == 1){
31932: /* If no pending lock has been acquired, then acquire it */
31933: if (pFile->shared->bPending == 0) {
31934: pFile->shared->bPending = TRUE;
31935: pFile->local.bPending = TRUE;
31936: bReturn = TRUE;
31937: }
31938: }
31939:
31940: /* Want a reserved lock? */
31941: else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToLockLow == 1){
31942: if (pFile->shared->bReserved == 0) {
31943: pFile->shared->bReserved = TRUE;
31944: pFile->local.bReserved = TRUE;
31945: bReturn = TRUE;
31946: }
31947: }
31948:
31949: winceMutexRelease(pFile->hMutex);
31950: return bReturn;
31951: }
31952:
31953: /*
31954: ** An implementation of the UnlockFile API of Windows for CE
31955: */
31956: static BOOL winceUnlockFile(
1.2.2.1 ! misho 31957: LPHANDLE phFile,
1.2 misho 31958: DWORD dwFileOffsetLow,
31959: DWORD dwFileOffsetHigh,
31960: DWORD nNumberOfBytesToUnlockLow,
31961: DWORD nNumberOfBytesToUnlockHigh
31962: ){
31963: winFile *pFile = HANDLE_TO_WINFILE(phFile);
31964: BOOL bReturn = FALSE;
31965:
31966: UNUSED_PARAMETER(dwFileOffsetHigh);
31967: UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh);
31968:
31969: if (!pFile->hMutex) return TRUE;
31970: winceMutexAcquire(pFile->hMutex);
31971:
31972: /* Releasing a reader lock or an exclusive lock */
31973: if (dwFileOffsetLow == (DWORD)SHARED_FIRST){
31974: /* Did we have an exclusive lock? */
31975: if (pFile->local.bExclusive){
31976: assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE);
31977: pFile->local.bExclusive = FALSE;
31978: pFile->shared->bExclusive = FALSE;
31979: bReturn = TRUE;
31980: }
31981:
31982: /* Did we just have a reader lock? */
31983: else if (pFile->local.nReaders){
31984: assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE || nNumberOfBytesToUnlockLow == 1);
31985: pFile->local.nReaders --;
31986: if (pFile->local.nReaders == 0)
31987: {
31988: pFile->shared->nReaders --;
31989: }
31990: bReturn = TRUE;
31991: }
31992: }
31993:
31994: /* Releasing a pending lock */
31995: else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){
31996: if (pFile->local.bPending){
31997: pFile->local.bPending = FALSE;
31998: pFile->shared->bPending = FALSE;
31999: bReturn = TRUE;
32000: }
32001: }
32002: /* Releasing a reserved lock */
32003: else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){
32004: if (pFile->local.bReserved) {
32005: pFile->local.bReserved = FALSE;
32006: pFile->shared->bReserved = FALSE;
32007: bReturn = TRUE;
32008: }
32009: }
32010:
32011: winceMutexRelease(pFile->hMutex);
32012: return bReturn;
32013: }
1.2.2.1 ! misho 32014: /*
! 32015: ** End of the special code for wince
! 32016: *****************************************************************************/
! 32017: #endif /* SQLITE_OS_WINCE */
1.2 misho 32018:
32019: /*
1.2.2.1 ! misho 32020: ** Lock a file region.
1.2 misho 32021: */
1.2.2.1 ! misho 32022: static BOOL winLockFile(
! 32023: LPHANDLE phFile,
! 32024: DWORD flags,
! 32025: DWORD offsetLow,
! 32026: DWORD offsetHigh,
! 32027: DWORD numBytesLow,
! 32028: DWORD numBytesHigh
1.2 misho 32029: ){
1.2.2.1 ! misho 32030: #if SQLITE_OS_WINCE
! 32031: /*
! 32032: ** NOTE: Windows CE is handled differently here due its lack of the Win32
! 32033: ** API LockFile.
! 32034: */
! 32035: return winceLockFile(phFile, offsetLow, offsetHigh,
! 32036: numBytesLow, numBytesHigh);
! 32037: #else
! 32038: if( isNT() ){
! 32039: OVERLAPPED ovlp;
! 32040: memset(&ovlp, 0, sizeof(OVERLAPPED));
! 32041: ovlp.Offset = offsetLow;
! 32042: ovlp.OffsetHigh = offsetHigh;
! 32043: return osLockFileEx(*phFile, flags, 0, numBytesLow, numBytesHigh, &ovlp);
! 32044: }else{
! 32045: return osLockFile(*phFile, offsetLow, offsetHigh, numBytesLow,
! 32046: numBytesHigh);
1.2 misho 32047: }
1.2.2.1 ! misho 32048: #endif
1.2 misho 32049: }
1.2.2.1 ! misho 32050:
1.2 misho 32051: /*
1.2.2.1 ! misho 32052: ** Unlock a file region.
! 32053: */
! 32054: static BOOL winUnlockFile(
! 32055: LPHANDLE phFile,
! 32056: DWORD offsetLow,
! 32057: DWORD offsetHigh,
! 32058: DWORD numBytesLow,
! 32059: DWORD numBytesHigh
! 32060: ){
! 32061: #if SQLITE_OS_WINCE
! 32062: /*
! 32063: ** NOTE: Windows CE is handled differently here due its lack of the Win32
! 32064: ** API UnlockFile.
! 32065: */
! 32066: return winceUnlockFile(phFile, offsetLow, offsetHigh,
! 32067: numBytesLow, numBytesHigh);
! 32068: #else
! 32069: if( isNT() ){
! 32070: OVERLAPPED ovlp;
! 32071: memset(&ovlp, 0, sizeof(OVERLAPPED));
! 32072: ovlp.Offset = offsetLow;
! 32073: ovlp.OffsetHigh = offsetHigh;
! 32074: return osUnlockFileEx(*phFile, 0, numBytesLow, numBytesHigh, &ovlp);
! 32075: }else{
! 32076: return osUnlockFile(*phFile, offsetLow, offsetHigh, numBytesLow,
! 32077: numBytesHigh);
! 32078: }
! 32079: #endif
! 32080: }
1.2 misho 32081:
32082: /*****************************************************************************
32083: ** The next group of routines implement the I/O methods specified
32084: ** by the sqlite3_io_methods object.
32085: ******************************************************************************/
32086:
32087: /*
32088: ** Some Microsoft compilers lack this definition.
32089: */
32090: #ifndef INVALID_SET_FILE_POINTER
32091: # define INVALID_SET_FILE_POINTER ((DWORD)-1)
32092: #endif
32093:
32094: /*
32095: ** Move the current position of the file handle passed as the first
32096: ** argument to offset iOffset within the file. If successful, return 0.
32097: ** Otherwise, set pFile->lastErrno and return non-zero.
32098: */
32099: static int seekWinFile(winFile *pFile, sqlite3_int64 iOffset){
1.2.2.1 ! misho 32100: #if !SQLITE_OS_WINRT
1.2 misho 32101: LONG upperBits; /* Most sig. 32 bits of new offset */
32102: LONG lowerBits; /* Least sig. 32 bits of new offset */
32103: DWORD dwRet; /* Value returned by SetFilePointer() */
32104: DWORD lastErrno; /* Value returned by GetLastError() */
32105:
32106: upperBits = (LONG)((iOffset>>32) & 0x7fffffff);
32107: lowerBits = (LONG)(iOffset & 0xffffffff);
32108:
32109: /* API oddity: If successful, SetFilePointer() returns a dword
32110: ** containing the lower 32-bits of the new file-offset. Or, if it fails,
32111: ** it returns INVALID_SET_FILE_POINTER. However according to MSDN,
32112: ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine
32113: ** whether an error has actually occured, it is also necessary to call
32114: ** GetLastError().
32115: */
32116: dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
32117:
32118: if( (dwRet==INVALID_SET_FILE_POINTER
32119: && ((lastErrno = osGetLastError())!=NO_ERROR)) ){
32120: pFile->lastErrno = lastErrno;
32121: winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno,
32122: "seekWinFile", pFile->zPath);
32123: return 1;
32124: }
32125:
32126: return 0;
1.2.2.1 ! misho 32127: #else
! 32128: /*
! 32129: ** Same as above, except that this implementation works for WinRT.
! 32130: */
! 32131:
! 32132: LARGE_INTEGER x; /* The new offset */
! 32133: BOOL bRet; /* Value returned by SetFilePointerEx() */
! 32134:
! 32135: x.QuadPart = iOffset;
! 32136: bRet = osSetFilePointerEx(pFile->h, x, 0, FILE_BEGIN);
! 32137:
! 32138: if(!bRet){
! 32139: pFile->lastErrno = osGetLastError();
! 32140: winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno,
! 32141: "seekWinFile", pFile->zPath);
! 32142: return 1;
! 32143: }
! 32144:
! 32145: return 0;
! 32146: #endif
1.2 misho 32147: }
32148:
32149: /*
32150: ** Close a file.
32151: **
32152: ** It is reported that an attempt to close a handle might sometimes
32153: ** fail. This is a very unreasonable result, but Windows is notorious
32154: ** for being unreasonable so I do not doubt that it might happen. If
32155: ** the close fails, we pause for 100 milliseconds and try again. As
32156: ** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before
32157: ** giving up and returning an error.
32158: */
32159: #define MX_CLOSE_ATTEMPT 3
32160: static int winClose(sqlite3_file *id){
32161: int rc, cnt = 0;
32162: winFile *pFile = (winFile*)id;
32163:
32164: assert( id!=0 );
1.2.2.1 ! misho 32165: #ifndef SQLITE_OMIT_WAL
1.2 misho 32166: assert( pFile->pShm==0 );
1.2.2.1 ! misho 32167: #endif
1.2 misho 32168: OSTRACE(("CLOSE %d\n", pFile->h));
32169: do{
32170: rc = osCloseHandle(pFile->h);
32171: /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */
1.2.2.1 ! misho 32172: }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
1.2 misho 32173: #if SQLITE_OS_WINCE
32174: #define WINCE_DELETION_ATTEMPTS 3
32175: winceDestroyLock(pFile);
32176: if( pFile->zDeleteOnClose ){
32177: int cnt = 0;
32178: while(
32179: osDeleteFileW(pFile->zDeleteOnClose)==0
32180: && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff
32181: && cnt++ < WINCE_DELETION_ATTEMPTS
32182: ){
1.2.2.1 ! misho 32183: sqlite3_win32_sleep(100); /* Wait a little before trying again */
1.2 misho 32184: }
32185: sqlite3_free(pFile->zDeleteOnClose);
32186: }
32187: #endif
32188: OSTRACE(("CLOSE %d %s\n", pFile->h, rc ? "ok" : "failed"));
1.2.2.1 ! misho 32189: if( rc ){
! 32190: pFile->h = NULL;
! 32191: }
1.2 misho 32192: OpenCounter(-1);
32193: return rc ? SQLITE_OK
32194: : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(),
32195: "winClose", pFile->zPath);
32196: }
32197:
32198: /*
32199: ** Read data from a file into a buffer. Return SQLITE_OK if all
32200: ** bytes were read successfully and SQLITE_IOERR if anything goes
32201: ** wrong.
32202: */
32203: static int winRead(
32204: sqlite3_file *id, /* File to read from */
32205: void *pBuf, /* Write content into this buffer */
32206: int amt, /* Number of bytes to read */
32207: sqlite3_int64 offset /* Begin reading at this offset */
32208: ){
1.2.2.1 ! misho 32209: #if !SQLITE_OS_WINCE
! 32210: OVERLAPPED overlapped; /* The offset for ReadFile. */
! 32211: #endif
1.2 misho 32212: winFile *pFile = (winFile*)id; /* file handle */
32213: DWORD nRead; /* Number of bytes actually read from file */
32214: int nRetry = 0; /* Number of retrys */
32215:
32216: assert( id!=0 );
32217: SimulateIOError(return SQLITE_IOERR_READ);
32218: OSTRACE(("READ %d lock=%d\n", pFile->h, pFile->locktype));
32219:
1.2.2.1 ! misho 32220: #if SQLITE_OS_WINCE
1.2 misho 32221: if( seekWinFile(pFile, offset) ){
32222: return SQLITE_FULL;
32223: }
32224: while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){
1.2.2.1 ! misho 32225: #else
! 32226: memset(&overlapped, 0, sizeof(OVERLAPPED));
! 32227: overlapped.Offset = (LONG)(offset & 0xffffffff);
! 32228: overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
! 32229: while( !osReadFile(pFile->h, pBuf, amt, &nRead, &overlapped) &&
! 32230: osGetLastError()!=ERROR_HANDLE_EOF ){
! 32231: #endif
1.2 misho 32232: DWORD lastErrno;
32233: if( retryIoerr(&nRetry, &lastErrno) ) continue;
32234: pFile->lastErrno = lastErrno;
32235: return winLogError(SQLITE_IOERR_READ, pFile->lastErrno,
32236: "winRead", pFile->zPath);
32237: }
32238: logIoerr(nRetry);
32239: if( nRead<(DWORD)amt ){
32240: /* Unread parts of the buffer must be zero-filled */
32241: memset(&((char*)pBuf)[nRead], 0, amt-nRead);
32242: return SQLITE_IOERR_SHORT_READ;
32243: }
32244:
32245: return SQLITE_OK;
32246: }
32247:
32248: /*
32249: ** Write data from a buffer into a file. Return SQLITE_OK on success
32250: ** or some other error code on failure.
32251: */
32252: static int winWrite(
32253: sqlite3_file *id, /* File to write into */
32254: const void *pBuf, /* The bytes to be written */
32255: int amt, /* Number of bytes to write */
32256: sqlite3_int64 offset /* Offset into the file to begin writing at */
32257: ){
1.2.2.1 ! misho 32258: int rc = 0; /* True if error has occured, else false */
1.2 misho 32259: winFile *pFile = (winFile*)id; /* File handle */
32260: int nRetry = 0; /* Number of retries */
32261:
32262: assert( amt>0 );
32263: assert( pFile );
32264: SimulateIOError(return SQLITE_IOERR_WRITE);
32265: SimulateDiskfullError(return SQLITE_FULL);
32266:
32267: OSTRACE(("WRITE %d lock=%d\n", pFile->h, pFile->locktype));
32268:
1.2.2.1 ! misho 32269: #if SQLITE_OS_WINCE
1.2 misho 32270: rc = seekWinFile(pFile, offset);
32271: if( rc==0 ){
1.2.2.1 ! misho 32272: #else
! 32273: {
! 32274: #endif
! 32275: #if !SQLITE_OS_WINCE
! 32276: OVERLAPPED overlapped; /* The offset for WriteFile. */
! 32277: #endif
1.2 misho 32278: u8 *aRem = (u8 *)pBuf; /* Data yet to be written */
32279: int nRem = amt; /* Number of bytes yet to be written */
32280: DWORD nWrite; /* Bytes written by each WriteFile() call */
32281: DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */
32282:
1.2.2.1 ! misho 32283: #if !SQLITE_OS_WINCE
! 32284: memset(&overlapped, 0, sizeof(OVERLAPPED));
! 32285: overlapped.Offset = (LONG)(offset & 0xffffffff);
! 32286: overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
! 32287: #endif
! 32288:
1.2 misho 32289: while( nRem>0 ){
1.2.2.1 ! misho 32290: #if SQLITE_OS_WINCE
1.2 misho 32291: if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){
1.2.2.1 ! misho 32292: #else
! 32293: if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, &overlapped) ){
! 32294: #endif
1.2 misho 32295: if( retryIoerr(&nRetry, &lastErrno) ) continue;
32296: break;
32297: }
1.2.2.1 ! misho 32298: assert( nWrite==0 || nWrite<=(DWORD)nRem );
! 32299: if( nWrite==0 || nWrite>(DWORD)nRem ){
! 32300: lastErrno = osGetLastError();
! 32301: break;
! 32302: }
! 32303: #if !SQLITE_OS_WINCE
! 32304: offset += nWrite;
! 32305: overlapped.Offset = (LONG)(offset & 0xffffffff);
! 32306: overlapped.OffsetHigh = (LONG)((offset>>32) & 0x7fffffff);
! 32307: #endif
1.2 misho 32308: aRem += nWrite;
32309: nRem -= nWrite;
32310: }
32311: if( nRem>0 ){
32312: pFile->lastErrno = lastErrno;
32313: rc = 1;
32314: }
32315: }
32316:
32317: if( rc ){
32318: if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL )
32319: || ( pFile->lastErrno==ERROR_DISK_FULL )){
32320: return SQLITE_FULL;
32321: }
32322: return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno,
32323: "winWrite", pFile->zPath);
32324: }else{
32325: logIoerr(nRetry);
32326: }
32327: return SQLITE_OK;
32328: }
32329:
32330: /*
32331: ** Truncate an open file to a specified size
32332: */
32333: static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){
32334: winFile *pFile = (winFile*)id; /* File handle object */
32335: int rc = SQLITE_OK; /* Return code for this function */
32336:
32337: assert( pFile );
32338:
32339: OSTRACE(("TRUNCATE %d %lld\n", pFile->h, nByte));
32340: SimulateIOError(return SQLITE_IOERR_TRUNCATE);
32341:
32342: /* If the user has configured a chunk-size for this file, truncate the
32343: ** file so that it consists of an integer number of chunks (i.e. the
32344: ** actual file size after the operation may be larger than the requested
32345: ** size).
32346: */
32347: if( pFile->szChunk>0 ){
32348: nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk;
32349: }
32350:
32351: /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */
32352: if( seekWinFile(pFile, nByte) ){
32353: rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno,
32354: "winTruncate1", pFile->zPath);
32355: }else if( 0==osSetEndOfFile(pFile->h) ){
32356: pFile->lastErrno = osGetLastError();
32357: rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno,
32358: "winTruncate2", pFile->zPath);
32359: }
32360:
32361: OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc ? "failed" : "ok"));
32362: return rc;
32363: }
32364:
32365: #ifdef SQLITE_TEST
32366: /*
32367: ** Count the number of fullsyncs and normal syncs. This is used to test
32368: ** that syncs and fullsyncs are occuring at the right times.
32369: */
32370: SQLITE_API int sqlite3_sync_count = 0;
32371: SQLITE_API int sqlite3_fullsync_count = 0;
32372: #endif
32373:
32374: /*
32375: ** Make sure all writes to a particular file are committed to disk.
32376: */
32377: static int winSync(sqlite3_file *id, int flags){
32378: #ifndef SQLITE_NO_SYNC
32379: /*
32380: ** Used only when SQLITE_NO_SYNC is not defined.
32381: */
32382: BOOL rc;
32383: #endif
32384: #if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \
32385: (defined(SQLITE_TEST) && defined(SQLITE_DEBUG))
32386: /*
32387: ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or
32388: ** OSTRACE() macros.
32389: */
32390: winFile *pFile = (winFile*)id;
32391: #else
32392: UNUSED_PARAMETER(id);
32393: #endif
32394:
32395: assert( pFile );
32396: /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */
32397: assert((flags&0x0F)==SQLITE_SYNC_NORMAL
32398: || (flags&0x0F)==SQLITE_SYNC_FULL
32399: );
32400:
32401: OSTRACE(("SYNC %d lock=%d\n", pFile->h, pFile->locktype));
32402:
32403: /* Unix cannot, but some systems may return SQLITE_FULL from here. This
32404: ** line is to test that doing so does not cause any problems.
32405: */
32406: SimulateDiskfullError( return SQLITE_FULL );
32407:
32408: #ifndef SQLITE_TEST
32409: UNUSED_PARAMETER(flags);
32410: #else
32411: if( (flags&0x0F)==SQLITE_SYNC_FULL ){
32412: sqlite3_fullsync_count++;
32413: }
32414: sqlite3_sync_count++;
32415: #endif
32416:
32417: /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a
32418: ** no-op
32419: */
32420: #ifdef SQLITE_NO_SYNC
32421: return SQLITE_OK;
32422: #else
32423: rc = osFlushFileBuffers(pFile->h);
32424: SimulateIOError( rc=FALSE );
32425: if( rc ){
32426: return SQLITE_OK;
32427: }else{
32428: pFile->lastErrno = osGetLastError();
32429: return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno,
32430: "winSync", pFile->zPath);
32431: }
32432: #endif
32433: }
32434:
32435: /*
32436: ** Determine the current size of a file in bytes
32437: */
32438: static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){
32439: winFile *pFile = (winFile*)id;
1.2.2.1 ! misho 32440: int rc = SQLITE_OK;
1.2 misho 32441:
32442: assert( id!=0 );
32443: SimulateIOError(return SQLITE_IOERR_FSTAT);
1.2.2.1 ! misho 32444: #if SQLITE_OS_WINRT
1.2 misho 32445: {
1.2.2.1 ! misho 32446: FILE_STANDARD_INFO info;
! 32447: if( osGetFileInformationByHandleEx(pFile->h, FileStandardInfo,
! 32448: &info, sizeof(info)) ){
! 32449: *pSize = info.EndOfFile.QuadPart;
! 32450: }else{
! 32451: pFile->lastErrno = osGetLastError();
! 32452: rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno,
! 32453: "winFileSize", pFile->zPath);
! 32454: }
! 32455: }
! 32456: #else
! 32457: {
! 32458: DWORD upperBits;
! 32459: DWORD lowerBits;
! 32460: DWORD lastErrno;
! 32461:
! 32462: lowerBits = osGetFileSize(pFile->h, &upperBits);
! 32463: *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits;
! 32464: if( (lowerBits == INVALID_FILE_SIZE)
! 32465: && ((lastErrno = osGetLastError())!=NO_ERROR) ){
! 32466: pFile->lastErrno = lastErrno;
! 32467: rc = winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno,
1.2 misho 32468: "winFileSize", pFile->zPath);
1.2.2.1 ! misho 32469: }
1.2 misho 32470: }
1.2.2.1 ! misho 32471: #endif
! 32472: return rc;
1.2 misho 32473: }
32474:
32475: /*
32476: ** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems.
32477: */
32478: #ifndef LOCKFILE_FAIL_IMMEDIATELY
32479: # define LOCKFILE_FAIL_IMMEDIATELY 1
32480: #endif
32481:
1.2.2.1 ! misho 32482: #ifndef LOCKFILE_EXCLUSIVE_LOCK
! 32483: # define LOCKFILE_EXCLUSIVE_LOCK 2
! 32484: #endif
! 32485:
! 32486: /*
! 32487: ** Historically, SQLite has used both the LockFile and LockFileEx functions.
! 32488: ** When the LockFile function was used, it was always expected to fail
! 32489: ** immediately if the lock could not be obtained. Also, it always expected to
! 32490: ** obtain an exclusive lock. These flags are used with the LockFileEx function
! 32491: ** and reflect those expectations; therefore, they should not be changed.
! 32492: */
! 32493: #ifndef SQLITE_LOCKFILE_FLAGS
! 32494: # define SQLITE_LOCKFILE_FLAGS (LOCKFILE_FAIL_IMMEDIATELY | \
! 32495: LOCKFILE_EXCLUSIVE_LOCK)
! 32496: #endif
! 32497:
! 32498: /*
! 32499: ** Currently, SQLite never calls the LockFileEx function without wanting the
! 32500: ** call to fail immediately if the lock cannot be obtained.
! 32501: */
! 32502: #ifndef SQLITE_LOCKFILEEX_FLAGS
! 32503: # define SQLITE_LOCKFILEEX_FLAGS (LOCKFILE_FAIL_IMMEDIATELY)
! 32504: #endif
! 32505:
1.2 misho 32506: /*
32507: ** Acquire a reader lock.
32508: ** Different API routines are called depending on whether or not this
32509: ** is Win9x or WinNT.
32510: */
32511: static int getReadLock(winFile *pFile){
32512: int res;
32513: if( isNT() ){
1.2.2.1 ! misho 32514: #if SQLITE_OS_WINCE
! 32515: /*
! 32516: ** NOTE: Windows CE is handled differently here due its lack of the Win32
! 32517: ** API LockFileEx.
! 32518: */
! 32519: res = winceLockFile(&pFile->h, SHARED_FIRST, 0, 1, 0);
! 32520: #else
! 32521: res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS, SHARED_FIRST, 0,
! 32522: SHARED_SIZE, 0);
! 32523: #endif
! 32524: }
! 32525: #ifdef SQLITE_WIN32_HAS_ANSI
! 32526: else{
1.2 misho 32527: int lk;
32528: sqlite3_randomness(sizeof(lk), &lk);
32529: pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1));
1.2.2.1 ! misho 32530: res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS,
! 32531: SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0);
1.2 misho 32532: }
1.2.2.1 ! misho 32533: #endif
1.2 misho 32534: if( res == 0 ){
32535: pFile->lastErrno = osGetLastError();
32536: /* No need to log a failure to lock */
32537: }
32538: return res;
32539: }
32540:
32541: /*
32542: ** Undo a readlock
32543: */
32544: static int unlockReadLock(winFile *pFile){
32545: int res;
32546: DWORD lastErrno;
32547: if( isNT() ){
1.2.2.1 ! misho 32548: res = winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0);
! 32549: }
! 32550: #ifdef SQLITE_WIN32_HAS_ANSI
! 32551: else{
! 32552: res = winUnlockFile(&pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0);
1.2 misho 32553: }
1.2.2.1 ! misho 32554: #endif
1.2 misho 32555: if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){
32556: pFile->lastErrno = lastErrno;
32557: winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno,
32558: "unlockReadLock", pFile->zPath);
32559: }
32560: return res;
32561: }
32562:
32563: /*
32564: ** Lock the file with the lock specified by parameter locktype - one
32565: ** of the following:
32566: **
32567: ** (1) SHARED_LOCK
32568: ** (2) RESERVED_LOCK
32569: ** (3) PENDING_LOCK
32570: ** (4) EXCLUSIVE_LOCK
32571: **
32572: ** Sometimes when requesting one lock state, additional lock states
32573: ** are inserted in between. The locking might fail on one of the later
32574: ** transitions leaving the lock state different from what it started but
32575: ** still short of its goal. The following chart shows the allowed
32576: ** transitions and the inserted intermediate states:
32577: **
32578: ** UNLOCKED -> SHARED
32579: ** SHARED -> RESERVED
32580: ** SHARED -> (PENDING) -> EXCLUSIVE
32581: ** RESERVED -> (PENDING) -> EXCLUSIVE
32582: ** PENDING -> EXCLUSIVE
32583: **
32584: ** This routine will only increase a lock. The winUnlock() routine
32585: ** erases all locks at once and returns us immediately to locking level 0.
32586: ** It is not possible to lower the locking level one step at a time. You
32587: ** must go straight to locking level 0.
32588: */
32589: static int winLock(sqlite3_file *id, int locktype){
32590: int rc = SQLITE_OK; /* Return code from subroutines */
32591: int res = 1; /* Result of a Windows lock call */
32592: int newLocktype; /* Set pFile->locktype to this value before exiting */
32593: int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */
32594: winFile *pFile = (winFile*)id;
32595: DWORD lastErrno = NO_ERROR;
32596:
32597: assert( id!=0 );
32598: OSTRACE(("LOCK %d %d was %d(%d)\n",
32599: pFile->h, locktype, pFile->locktype, pFile->sharedLockByte));
32600:
32601: /* If there is already a lock of this type or more restrictive on the
32602: ** OsFile, do nothing. Don't use the end_lock: exit path, as
32603: ** sqlite3OsEnterMutex() hasn't been called yet.
32604: */
32605: if( pFile->locktype>=locktype ){
32606: return SQLITE_OK;
32607: }
32608:
32609: /* Make sure the locking sequence is correct
32610: */
32611: assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
32612: assert( locktype!=PENDING_LOCK );
32613: assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
32614:
32615: /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or
32616: ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of
32617: ** the PENDING_LOCK byte is temporary.
32618: */
32619: newLocktype = pFile->locktype;
32620: if( (pFile->locktype==NO_LOCK)
32621: || ( (locktype==EXCLUSIVE_LOCK)
32622: && (pFile->locktype==RESERVED_LOCK))
32623: ){
32624: int cnt = 3;
1.2.2.1 ! misho 32625: while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS,
! 32626: PENDING_BYTE, 0, 1, 0))==0 ){
1.2 misho 32627: /* Try 3 times to get the pending lock. This is needed to work
32628: ** around problems caused by indexing and/or anti-virus software on
32629: ** Windows systems.
32630: ** If you are using this code as a model for alternative VFSes, do not
32631: ** copy this retry logic. It is a hack intended for Windows only.
32632: */
32633: OSTRACE(("could not get a PENDING lock. cnt=%d\n", cnt));
1.2.2.1 ! misho 32634: if( cnt ) sqlite3_win32_sleep(1);
1.2 misho 32635: }
32636: gotPendingLock = res;
32637: if( !res ){
32638: lastErrno = osGetLastError();
32639: }
32640: }
32641:
32642: /* Acquire a shared lock
32643: */
32644: if( locktype==SHARED_LOCK && res ){
32645: assert( pFile->locktype==NO_LOCK );
32646: res = getReadLock(pFile);
32647: if( res ){
32648: newLocktype = SHARED_LOCK;
32649: }else{
32650: lastErrno = osGetLastError();
32651: }
32652: }
32653:
32654: /* Acquire a RESERVED lock
32655: */
32656: if( locktype==RESERVED_LOCK && res ){
32657: assert( pFile->locktype==SHARED_LOCK );
1.2.2.1 ! misho 32658: res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, RESERVED_BYTE, 0, 1, 0);
1.2 misho 32659: if( res ){
32660: newLocktype = RESERVED_LOCK;
32661: }else{
32662: lastErrno = osGetLastError();
32663: }
32664: }
32665:
32666: /* Acquire a PENDING lock
32667: */
32668: if( locktype==EXCLUSIVE_LOCK && res ){
32669: newLocktype = PENDING_LOCK;
32670: gotPendingLock = 0;
32671: }
32672:
32673: /* Acquire an EXCLUSIVE lock
32674: */
32675: if( locktype==EXCLUSIVE_LOCK && res ){
32676: assert( pFile->locktype>=SHARED_LOCK );
32677: res = unlockReadLock(pFile);
32678: OSTRACE(("unreadlock = %d\n", res));
1.2.2.1 ! misho 32679: res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, SHARED_FIRST, 0,
! 32680: SHARED_SIZE, 0);
1.2 misho 32681: if( res ){
32682: newLocktype = EXCLUSIVE_LOCK;
32683: }else{
32684: lastErrno = osGetLastError();
32685: OSTRACE(("error-code = %d\n", lastErrno));
32686: getReadLock(pFile);
32687: }
32688: }
32689:
32690: /* If we are holding a PENDING lock that ought to be released, then
32691: ** release it now.
32692: */
32693: if( gotPendingLock && locktype==SHARED_LOCK ){
1.2.2.1 ! misho 32694: winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0);
1.2 misho 32695: }
32696:
32697: /* Update the state of the lock has held in the file descriptor then
32698: ** return the appropriate result code.
32699: */
32700: if( res ){
32701: rc = SQLITE_OK;
32702: }else{
32703: OSTRACE(("LOCK FAILED %d trying for %d but got %d\n", pFile->h,
32704: locktype, newLocktype));
32705: pFile->lastErrno = lastErrno;
32706: rc = SQLITE_BUSY;
32707: }
32708: pFile->locktype = (u8)newLocktype;
32709: return rc;
32710: }
32711:
32712: /*
32713: ** This routine checks if there is a RESERVED lock held on the specified
32714: ** file by this or any other process. If such a lock is held, return
32715: ** non-zero, otherwise zero.
32716: */
32717: static int winCheckReservedLock(sqlite3_file *id, int *pResOut){
32718: int rc;
32719: winFile *pFile = (winFile*)id;
32720:
32721: SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; );
32722:
32723: assert( id!=0 );
32724: if( pFile->locktype>=RESERVED_LOCK ){
32725: rc = 1;
32726: OSTRACE(("TEST WR-LOCK %d %d (local)\n", pFile->h, rc));
32727: }else{
1.2.2.1 ! misho 32728: rc = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, RESERVED_BYTE, 0, 1, 0);
1.2 misho 32729: if( rc ){
1.2.2.1 ! misho 32730: winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0);
1.2 misho 32731: }
32732: rc = !rc;
32733: OSTRACE(("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc));
32734: }
32735: *pResOut = rc;
32736: return SQLITE_OK;
32737: }
32738:
32739: /*
32740: ** Lower the locking level on file descriptor id to locktype. locktype
32741: ** must be either NO_LOCK or SHARED_LOCK.
32742: **
32743: ** If the locking level of the file descriptor is already at or below
32744: ** the requested locking level, this routine is a no-op.
32745: **
32746: ** It is not possible for this routine to fail if the second argument
32747: ** is NO_LOCK. If the second argument is SHARED_LOCK then this routine
32748: ** might return SQLITE_IOERR;
32749: */
32750: static int winUnlock(sqlite3_file *id, int locktype){
32751: int type;
32752: winFile *pFile = (winFile*)id;
32753: int rc = SQLITE_OK;
32754: assert( pFile!=0 );
32755: assert( locktype<=SHARED_LOCK );
32756: OSTRACE(("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype,
32757: pFile->locktype, pFile->sharedLockByte));
32758: type = pFile->locktype;
32759: if( type>=EXCLUSIVE_LOCK ){
1.2.2.1 ! misho 32760: winUnlockFile(&pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0);
1.2 misho 32761: if( locktype==SHARED_LOCK && !getReadLock(pFile) ){
32762: /* This should never happen. We should always be able to
32763: ** reacquire the read lock */
32764: rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(),
32765: "winUnlock", pFile->zPath);
32766: }
32767: }
32768: if( type>=RESERVED_LOCK ){
1.2.2.1 ! misho 32769: winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0);
1.2 misho 32770: }
32771: if( locktype==NO_LOCK && type>=SHARED_LOCK ){
32772: unlockReadLock(pFile);
32773: }
32774: if( type>=PENDING_LOCK ){
1.2.2.1 ! misho 32775: winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0);
1.2 misho 32776: }
32777: pFile->locktype = (u8)locktype;
32778: return rc;
32779: }
32780:
32781: /*
32782: ** If *pArg is inititially negative then this is a query. Set *pArg to
32783: ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
32784: **
32785: ** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags.
32786: */
32787: static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){
32788: if( *pArg<0 ){
32789: *pArg = (pFile->ctrlFlags & mask)!=0;
32790: }else if( (*pArg)==0 ){
32791: pFile->ctrlFlags &= ~mask;
32792: }else{
32793: pFile->ctrlFlags |= mask;
32794: }
32795: }
32796:
1.2.2.1 ! misho 32797: /* Forward declaration */
! 32798: static int getTempname(int nBuf, char *zBuf);
! 32799:
1.2 misho 32800: /*
32801: ** Control and query of the open file handle.
32802: */
32803: static int winFileControl(sqlite3_file *id, int op, void *pArg){
32804: winFile *pFile = (winFile*)id;
32805: switch( op ){
32806: case SQLITE_FCNTL_LOCKSTATE: {
32807: *(int*)pArg = pFile->locktype;
32808: return SQLITE_OK;
32809: }
32810: case SQLITE_LAST_ERRNO: {
32811: *(int*)pArg = (int)pFile->lastErrno;
32812: return SQLITE_OK;
32813: }
32814: case SQLITE_FCNTL_CHUNK_SIZE: {
32815: pFile->szChunk = *(int *)pArg;
32816: return SQLITE_OK;
32817: }
32818: case SQLITE_FCNTL_SIZE_HINT: {
32819: if( pFile->szChunk>0 ){
32820: sqlite3_int64 oldSz;
32821: int rc = winFileSize(id, &oldSz);
32822: if( rc==SQLITE_OK ){
32823: sqlite3_int64 newSz = *(sqlite3_int64*)pArg;
32824: if( newSz>oldSz ){
32825: SimulateIOErrorBenign(1);
32826: rc = winTruncate(id, newSz);
32827: SimulateIOErrorBenign(0);
32828: }
32829: }
32830: return rc;
32831: }
32832: return SQLITE_OK;
32833: }
32834: case SQLITE_FCNTL_PERSIST_WAL: {
32835: winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg);
32836: return SQLITE_OK;
32837: }
32838: case SQLITE_FCNTL_POWERSAFE_OVERWRITE: {
32839: winModeBit(pFile, WINFILE_PSOW, (int*)pArg);
32840: return SQLITE_OK;
32841: }
32842: case SQLITE_FCNTL_VFSNAME: {
32843: *(char**)pArg = sqlite3_mprintf("win32");
32844: return SQLITE_OK;
32845: }
32846: case SQLITE_FCNTL_WIN32_AV_RETRY: {
32847: int *a = (int*)pArg;
32848: if( a[0]>0 ){
32849: win32IoerrRetry = a[0];
32850: }else{
32851: a[0] = win32IoerrRetry;
32852: }
32853: if( a[1]>0 ){
32854: win32IoerrRetryDelay = a[1];
32855: }else{
32856: a[1] = win32IoerrRetryDelay;
32857: }
32858: return SQLITE_OK;
32859: }
1.2.2.1 ! misho 32860: case SQLITE_FCNTL_TEMPFILENAME: {
! 32861: char *zTFile = sqlite3_malloc( pFile->pVfs->mxPathname );
! 32862: if( zTFile ){
! 32863: getTempname(pFile->pVfs->mxPathname, zTFile);
! 32864: *(char**)pArg = zTFile;
! 32865: }
! 32866: return SQLITE_OK;
! 32867: }
1.2 misho 32868: }
32869: return SQLITE_NOTFOUND;
32870: }
32871:
32872: /*
32873: ** Return the sector size in bytes of the underlying block device for
32874: ** the specified file. This is almost always 512 bytes, but may be
32875: ** larger for some devices.
32876: **
32877: ** SQLite code assumes this function cannot fail. It also assumes that
32878: ** if two files are created in the same file-system directory (i.e.
32879: ** a database and its journal file) that the sector size will be the
32880: ** same for both.
32881: */
32882: static int winSectorSize(sqlite3_file *id){
32883: (void)id;
32884: return SQLITE_DEFAULT_SECTOR_SIZE;
32885: }
32886:
32887: /*
32888: ** Return a vector of device characteristics.
32889: */
32890: static int winDeviceCharacteristics(sqlite3_file *id){
32891: winFile *p = (winFile*)id;
32892: return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN |
32893: ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0);
32894: }
32895:
32896: #ifndef SQLITE_OMIT_WAL
32897:
32898: /*
32899: ** Windows will only let you create file view mappings
32900: ** on allocation size granularity boundaries.
32901: ** During sqlite3_os_init() we do a GetSystemInfo()
32902: ** to get the granularity size.
32903: */
32904: SYSTEM_INFO winSysInfo;
32905:
32906: /*
32907: ** Helper functions to obtain and relinquish the global mutex. The
32908: ** global mutex is used to protect the winLockInfo objects used by
32909: ** this file, all of which may be shared by multiple threads.
32910: **
32911: ** Function winShmMutexHeld() is used to assert() that the global mutex
32912: ** is held when required. This function is only used as part of assert()
32913: ** statements. e.g.
32914: **
32915: ** winShmEnterMutex()
32916: ** assert( winShmMutexHeld() );
32917: ** winShmLeaveMutex()
32918: */
32919: static void winShmEnterMutex(void){
32920: sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
32921: }
32922: static void winShmLeaveMutex(void){
32923: sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
32924: }
32925: #ifdef SQLITE_DEBUG
32926: static int winShmMutexHeld(void) {
32927: return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
32928: }
32929: #endif
32930:
32931: /*
32932: ** Object used to represent a single file opened and mmapped to provide
32933: ** shared memory. When multiple threads all reference the same
32934: ** log-summary, each thread has its own winFile object, but they all
32935: ** point to a single instance of this object. In other words, each
32936: ** log-summary is opened only once per process.
32937: **
32938: ** winShmMutexHeld() must be true when creating or destroying
32939: ** this object or while reading or writing the following fields:
32940: **
32941: ** nRef
32942: ** pNext
32943: **
32944: ** The following fields are read-only after the object is created:
32945: **
32946: ** fid
32947: ** zFilename
32948: **
32949: ** Either winShmNode.mutex must be held or winShmNode.nRef==0 and
32950: ** winShmMutexHeld() is true when reading or writing any other field
32951: ** in this structure.
32952: **
32953: */
32954: struct winShmNode {
32955: sqlite3_mutex *mutex; /* Mutex to access this object */
32956: char *zFilename; /* Name of the file */
32957: winFile hFile; /* File handle from winOpen */
32958:
32959: int szRegion; /* Size of shared-memory regions */
32960: int nRegion; /* Size of array apRegion */
32961: struct ShmRegion {
32962: HANDLE hMap; /* File handle from CreateFileMapping */
32963: void *pMap;
32964: } *aRegion;
32965: DWORD lastErrno; /* The Windows errno from the last I/O error */
32966:
32967: int nRef; /* Number of winShm objects pointing to this */
32968: winShm *pFirst; /* All winShm objects pointing to this */
32969: winShmNode *pNext; /* Next in list of all winShmNode objects */
32970: #ifdef SQLITE_DEBUG
32971: u8 nextShmId; /* Next available winShm.id value */
32972: #endif
32973: };
32974:
32975: /*
32976: ** A global array of all winShmNode objects.
32977: **
32978: ** The winShmMutexHeld() must be true while reading or writing this list.
32979: */
32980: static winShmNode *winShmNodeList = 0;
32981:
32982: /*
32983: ** Structure used internally by this VFS to record the state of an
32984: ** open shared memory connection.
32985: **
32986: ** The following fields are initialized when this object is created and
32987: ** are read-only thereafter:
32988: **
32989: ** winShm.pShmNode
32990: ** winShm.id
32991: **
32992: ** All other fields are read/write. The winShm.pShmNode->mutex must be held
32993: ** while accessing any read/write fields.
32994: */
32995: struct winShm {
32996: winShmNode *pShmNode; /* The underlying winShmNode object */
32997: winShm *pNext; /* Next winShm with the same winShmNode */
32998: u8 hasMutex; /* True if holding the winShmNode mutex */
32999: u16 sharedMask; /* Mask of shared locks held */
33000: u16 exclMask; /* Mask of exclusive locks held */
33001: #ifdef SQLITE_DEBUG
33002: u8 id; /* Id of this connection with its winShmNode */
33003: #endif
33004: };
33005:
33006: /*
33007: ** Constants used for locking
33008: */
33009: #define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */
33010: #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
33011:
33012: /*
33013: ** Apply advisory locks for all n bytes beginning at ofst.
33014: */
33015: #define _SHM_UNLCK 1
33016: #define _SHM_RDLCK 2
33017: #define _SHM_WRLCK 3
33018: static int winShmSystemLock(
33019: winShmNode *pFile, /* Apply locks to this open shared-memory segment */
33020: int lockType, /* _SHM_UNLCK, _SHM_RDLCK, or _SHM_WRLCK */
33021: int ofst, /* Offset to first byte to be locked/unlocked */
33022: int nByte /* Number of bytes to lock or unlock */
33023: ){
33024: int rc = 0; /* Result code form Lock/UnlockFileEx() */
33025:
33026: /* Access to the winShmNode object is serialized by the caller */
33027: assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 );
33028:
33029: /* Release/Acquire the system-level lock */
33030: if( lockType==_SHM_UNLCK ){
1.2.2.1 ! misho 33031: rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0);
1.2 misho 33032: }else{
1.2.2.1 ! misho 33033: /* Initialize the locking parameters */
! 33034: DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY;
! 33035: if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
! 33036: rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0);
1.2 misho 33037: }
33038:
33039: if( rc!= 0 ){
33040: rc = SQLITE_OK;
33041: }else{
33042: pFile->lastErrno = osGetLastError();
33043: rc = SQLITE_BUSY;
33044: }
33045:
33046: OSTRACE(("SHM-LOCK %d %s %s 0x%08lx\n",
33047: pFile->hFile.h,
33048: rc==SQLITE_OK ? "ok" : "failed",
33049: lockType==_SHM_UNLCK ? "UnlockFileEx" : "LockFileEx",
33050: pFile->lastErrno));
33051:
33052: return rc;
33053: }
33054:
33055: /* Forward references to VFS methods */
33056: static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*);
33057: static int winDelete(sqlite3_vfs *,const char*,int);
33058:
33059: /*
33060: ** Purge the winShmNodeList list of all entries with winShmNode.nRef==0.
33061: **
33062: ** This is not a VFS shared-memory method; it is a utility function called
33063: ** by VFS shared-memory methods.
33064: */
33065: static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){
33066: winShmNode **pp;
33067: winShmNode *p;
33068: BOOL bRc;
33069: assert( winShmMutexHeld() );
33070: pp = &winShmNodeList;
33071: while( (p = *pp)!=0 ){
33072: if( p->nRef==0 ){
33073: int i;
33074: if( p->mutex ) sqlite3_mutex_free(p->mutex);
33075: for(i=0; i<p->nRegion; i++){
33076: bRc = osUnmapViewOfFile(p->aRegion[i].pMap);
33077: OSTRACE(("SHM-PURGE pid-%d unmap region=%d %s\n",
33078: (int)osGetCurrentProcessId(), i,
33079: bRc ? "ok" : "failed"));
33080: bRc = osCloseHandle(p->aRegion[i].hMap);
33081: OSTRACE(("SHM-PURGE pid-%d close region=%d %s\n",
33082: (int)osGetCurrentProcessId(), i,
33083: bRc ? "ok" : "failed"));
33084: }
33085: if( p->hFile.h != INVALID_HANDLE_VALUE ){
33086: SimulateIOErrorBenign(1);
33087: winClose((sqlite3_file *)&p->hFile);
33088: SimulateIOErrorBenign(0);
33089: }
33090: if( deleteFlag ){
33091: SimulateIOErrorBenign(1);
33092: sqlite3BeginBenignMalloc();
33093: winDelete(pVfs, p->zFilename, 0);
33094: sqlite3EndBenignMalloc();
33095: SimulateIOErrorBenign(0);
33096: }
33097: *pp = p->pNext;
33098: sqlite3_free(p->aRegion);
33099: sqlite3_free(p);
33100: }else{
33101: pp = &p->pNext;
33102: }
33103: }
33104: }
33105:
33106: /*
33107: ** Open the shared-memory area associated with database file pDbFd.
33108: **
33109: ** When opening a new shared-memory file, if no other instances of that
33110: ** file are currently open, in this process or in other processes, then
33111: ** the file must be truncated to zero length or have its header cleared.
33112: */
33113: static int winOpenSharedMemory(winFile *pDbFd){
33114: struct winShm *p; /* The connection to be opened */
33115: struct winShmNode *pShmNode = 0; /* The underlying mmapped file */
33116: int rc; /* Result code */
33117: struct winShmNode *pNew; /* Newly allocated winShmNode */
33118: int nName; /* Size of zName in bytes */
33119:
33120: assert( pDbFd->pShm==0 ); /* Not previously opened */
33121:
33122: /* Allocate space for the new sqlite3_shm object. Also speculatively
33123: ** allocate space for a new winShmNode and filename.
33124: */
1.2.2.1 ! misho 33125: p = sqlite3MallocZero( sizeof(*p) );
1.2 misho 33126: if( p==0 ) return SQLITE_IOERR_NOMEM;
33127: nName = sqlite3Strlen30(pDbFd->zPath);
1.2.2.1 ! misho 33128: pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 );
1.2 misho 33129: if( pNew==0 ){
33130: sqlite3_free(p);
33131: return SQLITE_IOERR_NOMEM;
33132: }
33133: pNew->zFilename = (char*)&pNew[1];
33134: sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath);
33135: sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename);
33136:
33137: /* Look to see if there is an existing winShmNode that can be used.
33138: ** If no matching winShmNode currently exists, create a new one.
33139: */
33140: winShmEnterMutex();
33141: for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){
33142: /* TBD need to come up with better match here. Perhaps
33143: ** use FILE_ID_BOTH_DIR_INFO Structure.
33144: */
33145: if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break;
33146: }
33147: if( pShmNode ){
33148: sqlite3_free(pNew);
33149: }else{
33150: pShmNode = pNew;
33151: pNew = 0;
33152: ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
33153: pShmNode->pNext = winShmNodeList;
33154: winShmNodeList = pShmNode;
33155:
33156: pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
33157: if( pShmNode->mutex==0 ){
33158: rc = SQLITE_IOERR_NOMEM;
33159: goto shm_open_err;
33160: }
33161:
33162: rc = winOpen(pDbFd->pVfs,
33163: pShmNode->zFilename, /* Name of the file (UTF-8) */
33164: (sqlite3_file*)&pShmNode->hFile, /* File handle here */
33165: SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, /* Mode flags */
33166: 0);
33167: if( SQLITE_OK!=rc ){
33168: goto shm_open_err;
33169: }
33170:
33171: /* Check to see if another process is holding the dead-man switch.
33172: ** If not, truncate the file to zero length.
33173: */
33174: if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
33175: rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
33176: if( rc!=SQLITE_OK ){
33177: rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
33178: "winOpenShm", pDbFd->zPath);
33179: }
33180: }
33181: if( rc==SQLITE_OK ){
33182: winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1);
33183: rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1);
33184: }
33185: if( rc ) goto shm_open_err;
33186: }
33187:
33188: /* Make the new connection a child of the winShmNode */
33189: p->pShmNode = pShmNode;
33190: #ifdef SQLITE_DEBUG
33191: p->id = pShmNode->nextShmId++;
33192: #endif
33193: pShmNode->nRef++;
33194: pDbFd->pShm = p;
33195: winShmLeaveMutex();
33196:
33197: /* The reference count on pShmNode has already been incremented under
33198: ** the cover of the winShmEnterMutex() mutex and the pointer from the
33199: ** new (struct winShm) object to the pShmNode has been set. All that is
33200: ** left to do is to link the new object into the linked list starting
33201: ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
33202: ** mutex.
33203: */
33204: sqlite3_mutex_enter(pShmNode->mutex);
33205: p->pNext = pShmNode->pFirst;
33206: pShmNode->pFirst = p;
33207: sqlite3_mutex_leave(pShmNode->mutex);
33208: return SQLITE_OK;
33209:
33210: /* Jump here on any error */
33211: shm_open_err:
33212: winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1);
33213: winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */
33214: sqlite3_free(p);
33215: sqlite3_free(pNew);
33216: winShmLeaveMutex();
33217: return rc;
33218: }
33219:
33220: /*
33221: ** Close a connection to shared-memory. Delete the underlying
33222: ** storage if deleteFlag is true.
33223: */
33224: static int winShmUnmap(
33225: sqlite3_file *fd, /* Database holding shared memory */
33226: int deleteFlag /* Delete after closing if true */
33227: ){
33228: winFile *pDbFd; /* Database holding shared-memory */
33229: winShm *p; /* The connection to be closed */
33230: winShmNode *pShmNode; /* The underlying shared-memory file */
33231: winShm **pp; /* For looping over sibling connections */
33232:
33233: pDbFd = (winFile*)fd;
33234: p = pDbFd->pShm;
33235: if( p==0 ) return SQLITE_OK;
33236: pShmNode = p->pShmNode;
33237:
33238: /* Remove connection p from the set of connections associated
33239: ** with pShmNode */
33240: sqlite3_mutex_enter(pShmNode->mutex);
33241: for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){}
33242: *pp = p->pNext;
33243:
33244: /* Free the connection p */
33245: sqlite3_free(p);
33246: pDbFd->pShm = 0;
33247: sqlite3_mutex_leave(pShmNode->mutex);
33248:
33249: /* If pShmNode->nRef has reached 0, then close the underlying
33250: ** shared-memory file, too */
33251: winShmEnterMutex();
33252: assert( pShmNode->nRef>0 );
33253: pShmNode->nRef--;
33254: if( pShmNode->nRef==0 ){
33255: winShmPurge(pDbFd->pVfs, deleteFlag);
33256: }
33257: winShmLeaveMutex();
33258:
33259: return SQLITE_OK;
33260: }
33261:
33262: /*
33263: ** Change the lock state for a shared-memory segment.
33264: */
33265: static int winShmLock(
33266: sqlite3_file *fd, /* Database file holding the shared memory */
33267: int ofst, /* First lock to acquire or release */
33268: int n, /* Number of locks to acquire or release */
33269: int flags /* What to do with the lock */
33270: ){
33271: winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */
33272: winShm *p = pDbFd->pShm; /* The shared memory being locked */
33273: winShm *pX; /* For looping over all siblings */
33274: winShmNode *pShmNode = p->pShmNode;
33275: int rc = SQLITE_OK; /* Result code */
33276: u16 mask; /* Mask of locks to take or release */
33277:
33278: assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK );
33279: assert( n>=1 );
33280: assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED)
33281: || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE)
33282: || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED)
33283: || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) );
33284: assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 );
33285:
33286: mask = (u16)((1U<<(ofst+n)) - (1U<<ofst));
33287: assert( n>1 || mask==(1<<ofst) );
33288: sqlite3_mutex_enter(pShmNode->mutex);
33289: if( flags & SQLITE_SHM_UNLOCK ){
33290: u16 allMask = 0; /* Mask of locks held by siblings */
33291:
33292: /* See if any siblings hold this same lock */
33293: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
33294: if( pX==p ) continue;
33295: assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 );
33296: allMask |= pX->sharedMask;
33297: }
33298:
33299: /* Unlock the system-level locks */
33300: if( (mask & allMask)==0 ){
33301: rc = winShmSystemLock(pShmNode, _SHM_UNLCK, ofst+WIN_SHM_BASE, n);
33302: }else{
33303: rc = SQLITE_OK;
33304: }
33305:
33306: /* Undo the local locks */
33307: if( rc==SQLITE_OK ){
33308: p->exclMask &= ~mask;
33309: p->sharedMask &= ~mask;
33310: }
33311: }else if( flags & SQLITE_SHM_SHARED ){
33312: u16 allShared = 0; /* Union of locks held by connections other than "p" */
33313:
33314: /* Find out which shared locks are already held by sibling connections.
33315: ** If any sibling already holds an exclusive lock, go ahead and return
33316: ** SQLITE_BUSY.
33317: */
33318: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
33319: if( (pX->exclMask & mask)!=0 ){
33320: rc = SQLITE_BUSY;
33321: break;
33322: }
33323: allShared |= pX->sharedMask;
33324: }
33325:
33326: /* Get shared locks at the system level, if necessary */
33327: if( rc==SQLITE_OK ){
33328: if( (allShared & mask)==0 ){
33329: rc = winShmSystemLock(pShmNode, _SHM_RDLCK, ofst+WIN_SHM_BASE, n);
33330: }else{
33331: rc = SQLITE_OK;
33332: }
33333: }
33334:
33335: /* Get the local shared locks */
33336: if( rc==SQLITE_OK ){
33337: p->sharedMask |= mask;
33338: }
33339: }else{
33340: /* Make sure no sibling connections hold locks that will block this
33341: ** lock. If any do, return SQLITE_BUSY right away.
33342: */
33343: for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
33344: if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){
33345: rc = SQLITE_BUSY;
33346: break;
33347: }
33348: }
33349:
33350: /* Get the exclusive locks at the system level. Then if successful
33351: ** also mark the local connection as being locked.
33352: */
33353: if( rc==SQLITE_OK ){
33354: rc = winShmSystemLock(pShmNode, _SHM_WRLCK, ofst+WIN_SHM_BASE, n);
33355: if( rc==SQLITE_OK ){
33356: assert( (p->sharedMask & mask)==0 );
33357: p->exclMask |= mask;
33358: }
33359: }
33360: }
33361: sqlite3_mutex_leave(pShmNode->mutex);
33362: OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x %s\n",
33363: p->id, (int)osGetCurrentProcessId(), p->sharedMask, p->exclMask,
33364: rc ? "failed" : "ok"));
33365: return rc;
33366: }
33367:
33368: /*
33369: ** Implement a memory barrier or memory fence on shared memory.
33370: **
33371: ** All loads and stores begun before the barrier must complete before
33372: ** any load or store begun after the barrier.
33373: */
33374: static void winShmBarrier(
33375: sqlite3_file *fd /* Database holding the shared memory */
33376: ){
33377: UNUSED_PARAMETER(fd);
33378: /* MemoryBarrier(); // does not work -- do not know why not */
33379: winShmEnterMutex();
33380: winShmLeaveMutex();
33381: }
33382:
33383: /*
33384: ** This function is called to obtain a pointer to region iRegion of the
33385: ** shared-memory associated with the database file fd. Shared-memory regions
33386: ** are numbered starting from zero. Each shared-memory region is szRegion
33387: ** bytes in size.
33388: **
33389: ** If an error occurs, an error code is returned and *pp is set to NULL.
33390: **
33391: ** Otherwise, if the isWrite parameter is 0 and the requested shared-memory
33392: ** region has not been allocated (by any client, including one running in a
33393: ** separate process), then *pp is set to NULL and SQLITE_OK returned. If
33394: ** isWrite is non-zero and the requested shared-memory region has not yet
33395: ** been allocated, it is allocated by this function.
33396: **
33397: ** If the shared-memory region has already been allocated or is allocated by
33398: ** this call as described above, then it is mapped into this processes
33399: ** address space (if it is not already), *pp is set to point to the mapped
33400: ** memory and SQLITE_OK returned.
33401: */
33402: static int winShmMap(
33403: sqlite3_file *fd, /* Handle open on database file */
33404: int iRegion, /* Region to retrieve */
33405: int szRegion, /* Size of regions */
33406: int isWrite, /* True to extend file if necessary */
33407: void volatile **pp /* OUT: Mapped memory */
33408: ){
33409: winFile *pDbFd = (winFile*)fd;
33410: winShm *p = pDbFd->pShm;
33411: winShmNode *pShmNode;
33412: int rc = SQLITE_OK;
33413:
33414: if( !p ){
33415: rc = winOpenSharedMemory(pDbFd);
33416: if( rc!=SQLITE_OK ) return rc;
33417: p = pDbFd->pShm;
33418: }
33419: pShmNode = p->pShmNode;
33420:
33421: sqlite3_mutex_enter(pShmNode->mutex);
33422: assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 );
33423:
33424: if( pShmNode->nRegion<=iRegion ){
33425: struct ShmRegion *apNew; /* New aRegion[] array */
33426: int nByte = (iRegion+1)*szRegion; /* Minimum required file size */
33427: sqlite3_int64 sz; /* Current size of wal-index file */
33428:
33429: pShmNode->szRegion = szRegion;
33430:
33431: /* The requested region is not mapped into this processes address space.
33432: ** Check to see if it has been allocated (i.e. if the wal-index file is
33433: ** large enough to contain the requested region).
33434: */
33435: rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz);
33436: if( rc!=SQLITE_OK ){
33437: rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(),
33438: "winShmMap1", pDbFd->zPath);
33439: goto shmpage_out;
33440: }
33441:
33442: if( sz<nByte ){
33443: /* The requested memory region does not exist. If isWrite is set to
33444: ** zero, exit early. *pp will be set to NULL and SQLITE_OK returned.
33445: **
33446: ** Alternatively, if isWrite is non-zero, use ftruncate() to allocate
33447: ** the requested memory region.
33448: */
33449: if( !isWrite ) goto shmpage_out;
33450: rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte);
33451: if( rc!=SQLITE_OK ){
33452: rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(),
33453: "winShmMap2", pDbFd->zPath);
33454: goto shmpage_out;
33455: }
33456: }
33457:
33458: /* Map the requested memory region into this processes address space. */
33459: apNew = (struct ShmRegion *)sqlite3_realloc(
33460: pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0])
33461: );
33462: if( !apNew ){
33463: rc = SQLITE_IOERR_NOMEM;
33464: goto shmpage_out;
33465: }
33466: pShmNode->aRegion = apNew;
33467:
33468: while( pShmNode->nRegion<=iRegion ){
1.2.2.1 ! misho 33469: HANDLE hMap = NULL; /* file-mapping handle */
1.2 misho 33470: void *pMap = 0; /* Mapped memory region */
33471:
1.2.2.1 ! misho 33472: #if SQLITE_OS_WINRT
! 33473: hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
! 33474: NULL, PAGE_READWRITE, nByte, NULL
! 33475: );
! 33476: #elif defined(SQLITE_WIN32_HAS_WIDE)
! 33477: hMap = osCreateFileMappingW(pShmNode->hFile.h,
! 33478: NULL, PAGE_READWRITE, 0, nByte, NULL
! 33479: );
! 33480: #elif defined(SQLITE_WIN32_HAS_ANSI)
! 33481: hMap = osCreateFileMappingA(pShmNode->hFile.h,
1.2 misho 33482: NULL, PAGE_READWRITE, 0, nByte, NULL
33483: );
1.2.2.1 ! misho 33484: #endif
1.2 misho 33485: OSTRACE(("SHM-MAP pid-%d create region=%d nbyte=%d %s\n",
33486: (int)osGetCurrentProcessId(), pShmNode->nRegion, nByte,
33487: hMap ? "ok" : "failed"));
33488: if( hMap ){
33489: int iOffset = pShmNode->nRegion*szRegion;
33490: int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
1.2.2.1 ! misho 33491: #if SQLITE_OS_WINRT
! 33492: pMap = osMapViewOfFileFromApp(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
! 33493: iOffset - iOffsetShift, szRegion + iOffsetShift
! 33494: );
! 33495: #else
1.2 misho 33496: pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ,
33497: 0, iOffset - iOffsetShift, szRegion + iOffsetShift
33498: );
1.2.2.1 ! misho 33499: #endif
1.2 misho 33500: OSTRACE(("SHM-MAP pid-%d map region=%d offset=%d size=%d %s\n",
33501: (int)osGetCurrentProcessId(), pShmNode->nRegion, iOffset,
33502: szRegion, pMap ? "ok" : "failed"));
33503: }
33504: if( !pMap ){
33505: pShmNode->lastErrno = osGetLastError();
33506: rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno,
33507: "winShmMap3", pDbFd->zPath);
33508: if( hMap ) osCloseHandle(hMap);
33509: goto shmpage_out;
33510: }
33511:
33512: pShmNode->aRegion[pShmNode->nRegion].pMap = pMap;
33513: pShmNode->aRegion[pShmNode->nRegion].hMap = hMap;
33514: pShmNode->nRegion++;
33515: }
33516: }
33517:
33518: shmpage_out:
33519: if( pShmNode->nRegion>iRegion ){
33520: int iOffset = iRegion*szRegion;
33521: int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
33522: char *p = (char *)pShmNode->aRegion[iRegion].pMap;
33523: *pp = (void *)&p[iOffsetShift];
33524: }else{
33525: *pp = 0;
33526: }
33527: sqlite3_mutex_leave(pShmNode->mutex);
33528: return rc;
33529: }
33530:
33531: #else
33532: # define winShmMap 0
33533: # define winShmLock 0
33534: # define winShmBarrier 0
33535: # define winShmUnmap 0
33536: #endif /* #ifndef SQLITE_OMIT_WAL */
33537:
33538: /*
33539: ** Here ends the implementation of all sqlite3_file methods.
33540: **
33541: ********************** End sqlite3_file Methods *******************************
33542: ******************************************************************************/
33543:
33544: /*
33545: ** This vector defines all the methods that can operate on an
33546: ** sqlite3_file for win32.
33547: */
33548: static const sqlite3_io_methods winIoMethod = {
33549: 2, /* iVersion */
33550: winClose, /* xClose */
33551: winRead, /* xRead */
33552: winWrite, /* xWrite */
33553: winTruncate, /* xTruncate */
33554: winSync, /* xSync */
33555: winFileSize, /* xFileSize */
33556: winLock, /* xLock */
33557: winUnlock, /* xUnlock */
33558: winCheckReservedLock, /* xCheckReservedLock */
33559: winFileControl, /* xFileControl */
33560: winSectorSize, /* xSectorSize */
33561: winDeviceCharacteristics, /* xDeviceCharacteristics */
33562: winShmMap, /* xShmMap */
33563: winShmLock, /* xShmLock */
33564: winShmBarrier, /* xShmBarrier */
33565: winShmUnmap /* xShmUnmap */
33566: };
33567:
33568: /****************************************************************************
33569: **************************** sqlite3_vfs methods ****************************
33570: **
33571: ** This division contains the implementation of methods on the
33572: ** sqlite3_vfs object.
33573: */
33574:
33575: /*
33576: ** Convert a UTF-8 filename into whatever form the underlying
33577: ** operating system wants filenames in. Space to hold the result
33578: ** is obtained from malloc and must be freed by the calling
33579: ** function.
33580: */
33581: static void *convertUtf8Filename(const char *zFilename){
33582: void *zConverted = 0;
33583: if( isNT() ){
33584: zConverted = utf8ToUnicode(zFilename);
1.2.2.1 ! misho 33585: }
! 33586: #ifdef SQLITE_WIN32_HAS_ANSI
! 33587: else{
1.2 misho 33588: zConverted = sqlite3_win32_utf8_to_mbcs(zFilename);
33589: }
1.2.2.1 ! misho 33590: #endif
1.2 misho 33591: /* caller will handle out of memory */
33592: return zConverted;
33593: }
33594:
33595: /*
33596: ** Create a temporary file name in zBuf. zBuf must be big enough to
33597: ** hold at pVfs->mxPathname characters.
33598: */
33599: static int getTempname(int nBuf, char *zBuf){
33600: static char zChars[] =
33601: "abcdefghijklmnopqrstuvwxyz"
33602: "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
33603: "0123456789";
33604: size_t i, j;
1.2.2.1 ! misho 33605: int nTempPath;
1.2 misho 33606: char zTempPath[MAX_PATH+2];
33607:
33608: /* It's odd to simulate an io-error here, but really this is just
33609: ** using the io-error infrastructure to test that SQLite handles this
33610: ** function failing.
33611: */
33612: SimulateIOError( return SQLITE_IOERR );
33613:
1.2.2.1 ! misho 33614: memset(zTempPath, 0, MAX_PATH+2);
! 33615:
1.2 misho 33616: if( sqlite3_temp_directory ){
33617: sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory);
1.2.2.1 ! misho 33618: }
! 33619: #if !SQLITE_OS_WINRT
! 33620: else if( isNT() ){
1.2 misho 33621: char *zMulti;
33622: WCHAR zWidePath[MAX_PATH];
33623: osGetTempPathW(MAX_PATH-30, zWidePath);
33624: zMulti = unicodeToUtf8(zWidePath);
33625: if( zMulti ){
33626: sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti);
33627: sqlite3_free(zMulti);
33628: }else{
33629: return SQLITE_IOERR_NOMEM;
33630: }
1.2.2.1 ! misho 33631: }
! 33632: #ifdef SQLITE_WIN32_HAS_ANSI
! 33633: else{
1.2 misho 33634: char *zUtf8;
33635: char zMbcsPath[MAX_PATH];
33636: osGetTempPathA(MAX_PATH-30, zMbcsPath);
33637: zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath);
33638: if( zUtf8 ){
33639: sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8);
33640: sqlite3_free(zUtf8);
33641: }else{
33642: return SQLITE_IOERR_NOMEM;
33643: }
33644: }
1.2.2.1 ! misho 33645: #endif
! 33646: #endif
1.2 misho 33647:
33648: /* Check that the output buffer is large enough for the temporary file
33649: ** name. If it is not, return SQLITE_ERROR.
33650: */
1.2.2.1 ! misho 33651: nTempPath = sqlite3Strlen30(zTempPath);
! 33652:
! 33653: if( (nTempPath + sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX) + 18) >= nBuf ){
1.2 misho 33654: return SQLITE_ERROR;
33655: }
33656:
1.2.2.1 ! misho 33657: for(i=nTempPath; i>0 && zTempPath[i-1]=='\\'; i--){}
1.2 misho 33658: zTempPath[i] = 0;
33659:
1.2.2.1 ! misho 33660: sqlite3_snprintf(nBuf-18, zBuf, (nTempPath > 0) ?
! 33661: "%s\\"SQLITE_TEMP_FILE_PREFIX : SQLITE_TEMP_FILE_PREFIX,
! 33662: zTempPath);
1.2 misho 33663: j = sqlite3Strlen30(zBuf);
33664: sqlite3_randomness(15, &zBuf[j]);
33665: for(i=0; i<15; i++, j++){
33666: zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
33667: }
33668: zBuf[j] = 0;
33669: zBuf[j+1] = 0;
33670:
33671: OSTRACE(("TEMP FILENAME: %s\n", zBuf));
33672: return SQLITE_OK;
33673: }
33674:
33675: /*
1.2.2.1 ! misho 33676: ** Return TRUE if the named file is really a directory. Return false if
! 33677: ** it is something other than a directory, or if there is any kind of memory
! 33678: ** allocation failure.
! 33679: */
! 33680: static int winIsDir(const void *zConverted){
! 33681: DWORD attr;
! 33682: int rc = 0;
! 33683: DWORD lastErrno;
! 33684:
! 33685: if( isNT() ){
! 33686: int cnt = 0;
! 33687: WIN32_FILE_ATTRIBUTE_DATA sAttrData;
! 33688: memset(&sAttrData, 0, sizeof(sAttrData));
! 33689: while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted,
! 33690: GetFileExInfoStandard,
! 33691: &sAttrData)) && retryIoerr(&cnt, &lastErrno) ){}
! 33692: if( !rc ){
! 33693: return 0; /* Invalid name? */
! 33694: }
! 33695: attr = sAttrData.dwFileAttributes;
! 33696: #if SQLITE_OS_WINCE==0
! 33697: }else{
! 33698: attr = osGetFileAttributesA((char*)zConverted);
! 33699: #endif
! 33700: }
! 33701: return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY);
! 33702: }
! 33703:
! 33704: /*
1.2 misho 33705: ** Open a file.
33706: */
33707: static int winOpen(
33708: sqlite3_vfs *pVfs, /* Not used */
33709: const char *zName, /* Name of the file (UTF-8) */
33710: sqlite3_file *id, /* Write the SQLite file handle here */
33711: int flags, /* Open mode flags */
33712: int *pOutFlags /* Status return flags */
33713: ){
33714: HANDLE h;
33715: DWORD lastErrno;
33716: DWORD dwDesiredAccess;
33717: DWORD dwShareMode;
33718: DWORD dwCreationDisposition;
33719: DWORD dwFlagsAndAttributes = 0;
33720: #if SQLITE_OS_WINCE
33721: int isTemp = 0;
33722: #endif
33723: winFile *pFile = (winFile*)id;
33724: void *zConverted; /* Filename in OS encoding */
33725: const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
33726: int cnt = 0;
33727:
33728: /* If argument zPath is a NULL pointer, this function is required to open
33729: ** a temporary file. Use this buffer to store the file name in.
33730: */
33731: char zTmpname[MAX_PATH+2]; /* Buffer used to create temp filename */
33732:
33733: int rc = SQLITE_OK; /* Function Return Code */
33734: #if !defined(NDEBUG) || SQLITE_OS_WINCE
33735: int eType = flags&0xFFFFFF00; /* Type of file to open */
33736: #endif
33737:
33738: int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
33739: int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE);
33740: int isCreate = (flags & SQLITE_OPEN_CREATE);
33741: #ifndef NDEBUG
33742: int isReadonly = (flags & SQLITE_OPEN_READONLY);
33743: #endif
33744: int isReadWrite = (flags & SQLITE_OPEN_READWRITE);
33745:
33746: #ifndef NDEBUG
33747: int isOpenJournal = (isCreate && (
33748: eType==SQLITE_OPEN_MASTER_JOURNAL
33749: || eType==SQLITE_OPEN_MAIN_JOURNAL
33750: || eType==SQLITE_OPEN_WAL
33751: ));
33752: #endif
33753:
33754: /* Check the following statements are true:
33755: **
33756: ** (a) Exactly one of the READWRITE and READONLY flags must be set, and
33757: ** (b) if CREATE is set, then READWRITE must also be set, and
33758: ** (c) if EXCLUSIVE is set, then CREATE must also be set.
33759: ** (d) if DELETEONCLOSE is set, then CREATE must also be set.
33760: */
33761: assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly));
33762: assert(isCreate==0 || isReadWrite);
33763: assert(isExclusive==0 || isCreate);
33764: assert(isDelete==0 || isCreate);
33765:
33766: /* The main DB, main journal, WAL file and master journal are never
33767: ** automatically deleted. Nor are they ever temporary files. */
33768: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB );
33769: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL );
33770: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL );
33771: assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL );
33772:
33773: /* Assert that the upper layer has set one of the "file-type" flags. */
33774: assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
33775: || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL
33776: || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL
33777: || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL
33778: );
33779:
33780: assert( id!=0 );
33781: UNUSED_PARAMETER(pVfs);
33782:
1.2.2.1 ! misho 33783: #if SQLITE_OS_WINRT
! 33784: if( !sqlite3_temp_directory ){
! 33785: sqlite3_log(SQLITE_ERROR,
! 33786: "sqlite3_temp_directory variable should be set for WinRT");
! 33787: }
! 33788: #endif
! 33789:
1.2 misho 33790: pFile->h = INVALID_HANDLE_VALUE;
33791:
33792: /* If the second argument to this function is NULL, generate a
33793: ** temporary file name to use
33794: */
33795: if( !zUtf8Name ){
33796: assert(isDelete && !isOpenJournal);
33797: rc = getTempname(MAX_PATH+2, zTmpname);
33798: if( rc!=SQLITE_OK ){
33799: return rc;
33800: }
33801: zUtf8Name = zTmpname;
33802: }
33803:
33804: /* Database filenames are double-zero terminated if they are not
33805: ** URIs with parameters. Hence, they can always be passed into
33806: ** sqlite3_uri_parameter().
33807: */
33808: assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) ||
33809: zUtf8Name[strlen(zUtf8Name)+1]==0 );
33810:
33811: /* Convert the filename to the system encoding. */
33812: zConverted = convertUtf8Filename(zUtf8Name);
33813: if( zConverted==0 ){
33814: return SQLITE_IOERR_NOMEM;
33815: }
33816:
1.2.2.1 ! misho 33817: if( winIsDir(zConverted) ){
! 33818: sqlite3_free(zConverted);
! 33819: return SQLITE_CANTOPEN_ISDIR;
! 33820: }
! 33821:
1.2 misho 33822: if( isReadWrite ){
33823: dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
33824: }else{
33825: dwDesiredAccess = GENERIC_READ;
33826: }
33827:
33828: /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is
33829: ** created. SQLite doesn't use it to indicate "exclusive access"
33830: ** as it is usually understood.
33831: */
33832: if( isExclusive ){
33833: /* Creates a new file, only if it does not already exist. */
33834: /* If the file exists, it fails. */
33835: dwCreationDisposition = CREATE_NEW;
33836: }else if( isCreate ){
33837: /* Open existing file, or create if it doesn't exist */
33838: dwCreationDisposition = OPEN_ALWAYS;
33839: }else{
33840: /* Opens a file, only if it exists. */
33841: dwCreationDisposition = OPEN_EXISTING;
33842: }
33843:
33844: dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
33845:
33846: if( isDelete ){
33847: #if SQLITE_OS_WINCE
33848: dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN;
33849: isTemp = 1;
33850: #else
33851: dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY
33852: | FILE_ATTRIBUTE_HIDDEN
33853: | FILE_FLAG_DELETE_ON_CLOSE;
33854: #endif
33855: }else{
33856: dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
33857: }
33858: /* Reports from the internet are that performance is always
33859: ** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */
33860: #if SQLITE_OS_WINCE
33861: dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;
33862: #endif
33863:
33864: if( isNT() ){
1.2.2.1 ! misho 33865: #if SQLITE_OS_WINRT
! 33866: CREATEFILE2_EXTENDED_PARAMETERS extendedParameters;
! 33867: extendedParameters.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
! 33868: extendedParameters.dwFileAttributes =
! 33869: dwFlagsAndAttributes & FILE_ATTRIBUTE_MASK;
! 33870: extendedParameters.dwFileFlags = dwFlagsAndAttributes & FILE_FLAG_MASK;
! 33871: extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS;
! 33872: extendedParameters.lpSecurityAttributes = NULL;
! 33873: extendedParameters.hTemplateFile = NULL;
! 33874: while( (h = osCreateFile2((LPCWSTR)zConverted,
! 33875: dwDesiredAccess,
! 33876: dwShareMode,
! 33877: dwCreationDisposition,
! 33878: &extendedParameters))==INVALID_HANDLE_VALUE &&
! 33879: retryIoerr(&cnt, &lastErrno) ){
! 33880: /* Noop */
! 33881: }
! 33882: #else
1.2 misho 33883: while( (h = osCreateFileW((LPCWSTR)zConverted,
33884: dwDesiredAccess,
33885: dwShareMode, NULL,
33886: dwCreationDisposition,
33887: dwFlagsAndAttributes,
33888: NULL))==INVALID_HANDLE_VALUE &&
1.2.2.1 ! misho 33889: retryIoerr(&cnt, &lastErrno) ){
! 33890: /* Noop */
! 33891: }
! 33892: #endif
! 33893: }
! 33894: #ifdef SQLITE_WIN32_HAS_ANSI
! 33895: else{
1.2 misho 33896: while( (h = osCreateFileA((LPCSTR)zConverted,
33897: dwDesiredAccess,
33898: dwShareMode, NULL,
33899: dwCreationDisposition,
33900: dwFlagsAndAttributes,
33901: NULL))==INVALID_HANDLE_VALUE &&
1.2.2.1 ! misho 33902: retryIoerr(&cnt, &lastErrno) ){
! 33903: /* Noop */
! 33904: }
1.2 misho 33905: }
1.2.2.1 ! misho 33906: #endif
1.2 misho 33907: logIoerr(cnt);
33908:
33909: OSTRACE(("OPEN %d %s 0x%lx %s\n",
33910: h, zName, dwDesiredAccess,
33911: h==INVALID_HANDLE_VALUE ? "failed" : "ok"));
33912:
33913: if( h==INVALID_HANDLE_VALUE ){
33914: pFile->lastErrno = lastErrno;
33915: winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name);
33916: sqlite3_free(zConverted);
33917: if( isReadWrite && !isExclusive ){
33918: return winOpen(pVfs, zName, id,
33919: ((flags|SQLITE_OPEN_READONLY)&~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), pOutFlags);
33920: }else{
33921: return SQLITE_CANTOPEN_BKPT;
33922: }
33923: }
33924:
33925: if( pOutFlags ){
33926: if( isReadWrite ){
33927: *pOutFlags = SQLITE_OPEN_READWRITE;
33928: }else{
33929: *pOutFlags = SQLITE_OPEN_READONLY;
33930: }
33931: }
33932:
33933: memset(pFile, 0, sizeof(*pFile));
33934: pFile->pMethod = &winIoMethod;
33935: pFile->h = h;
33936: pFile->lastErrno = NO_ERROR;
33937: pFile->pVfs = pVfs;
1.2.2.1 ! misho 33938: #ifndef SQLITE_OMIT_WAL
1.2 misho 33939: pFile->pShm = 0;
1.2.2.1 ! misho 33940: #endif
1.2 misho 33941: pFile->zPath = zName;
33942: if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){
33943: pFile->ctrlFlags |= WINFILE_PSOW;
33944: }
33945:
33946: #if SQLITE_OS_WINCE
33947: if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
33948: && !winceCreateLock(zName, pFile)
33949: ){
33950: osCloseHandle(h);
33951: sqlite3_free(zConverted);
33952: return SQLITE_CANTOPEN_BKPT;
33953: }
33954: if( isTemp ){
33955: pFile->zDeleteOnClose = zConverted;
33956: }else
33957: #endif
33958: {
33959: sqlite3_free(zConverted);
33960: }
33961:
33962: OpenCounter(+1);
33963: return rc;
33964: }
33965:
33966: /*
33967: ** Delete the named file.
33968: **
33969: ** Note that Windows does not allow a file to be deleted if some other
33970: ** process has it open. Sometimes a virus scanner or indexing program
33971: ** will open a journal file shortly after it is created in order to do
33972: ** whatever it does. While this other process is holding the
33973: ** file open, we will be unable to delete it. To work around this
33974: ** problem, we delay 100 milliseconds and try to delete again. Up
33975: ** to MX_DELETION_ATTEMPTs deletion attempts are run before giving
33976: ** up and returning an error.
33977: */
33978: static int winDelete(
33979: sqlite3_vfs *pVfs, /* Not used on win32 */
33980: const char *zFilename, /* Name of file to delete */
33981: int syncDir /* Not used on win32 */
33982: ){
33983: int cnt = 0;
33984: int rc;
1.2.2.1 ! misho 33985: DWORD attr;
1.2 misho 33986: DWORD lastErrno;
33987: void *zConverted;
33988: UNUSED_PARAMETER(pVfs);
33989: UNUSED_PARAMETER(syncDir);
33990:
33991: SimulateIOError(return SQLITE_IOERR_DELETE);
33992: zConverted = convertUtf8Filename(zFilename);
33993: if( zConverted==0 ){
33994: return SQLITE_IOERR_NOMEM;
33995: }
33996: if( isNT() ){
1.2.2.1 ! misho 33997: do {
! 33998: #if SQLITE_OS_WINRT
! 33999: WIN32_FILE_ATTRIBUTE_DATA sAttrData;
! 34000: memset(&sAttrData, 0, sizeof(sAttrData));
! 34001: if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard,
! 34002: &sAttrData) ){
! 34003: attr = sAttrData.dwFileAttributes;
! 34004: }else{
! 34005: lastErrno = osGetLastError();
! 34006: if( lastErrno==ERROR_FILE_NOT_FOUND || lastErrno==ERROR_PATH_NOT_FOUND ){
! 34007: rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */
! 34008: }else{
! 34009: rc = SQLITE_ERROR;
! 34010: }
! 34011: break;
! 34012: }
! 34013: #else
! 34014: attr = osGetFileAttributesW(zConverted);
1.2 misho 34015: #endif
1.2.2.1 ! misho 34016: if ( attr==INVALID_FILE_ATTRIBUTES ){
! 34017: lastErrno = osGetLastError();
! 34018: if( lastErrno==ERROR_FILE_NOT_FOUND || lastErrno==ERROR_PATH_NOT_FOUND ){
! 34019: rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */
! 34020: }else{
! 34021: rc = SQLITE_ERROR;
! 34022: }
! 34023: break;
! 34024: }
! 34025: if ( attr&FILE_ATTRIBUTE_DIRECTORY ){
! 34026: rc = SQLITE_ERROR; /* Files only. */
! 34027: break;
! 34028: }
! 34029: if ( osDeleteFileW(zConverted) ){
! 34030: rc = SQLITE_OK; /* Deleted OK. */
! 34031: break;
! 34032: }
! 34033: if ( !retryIoerr(&cnt, &lastErrno) ){
! 34034: rc = SQLITE_ERROR; /* No more retries. */
! 34035: break;
! 34036: }
! 34037: } while(1);
1.2 misho 34038: }
1.2.2.1 ! misho 34039: #ifdef SQLITE_WIN32_HAS_ANSI
! 34040: else{
! 34041: do {
! 34042: attr = osGetFileAttributesA(zConverted);
! 34043: if ( attr==INVALID_FILE_ATTRIBUTES ){
! 34044: lastErrno = osGetLastError();
! 34045: if( lastErrno==ERROR_FILE_NOT_FOUND || lastErrno==ERROR_PATH_NOT_FOUND ){
! 34046: rc = SQLITE_IOERR_DELETE_NOENT; /* Already gone? */
! 34047: }else{
! 34048: rc = SQLITE_ERROR;
! 34049: }
! 34050: break;
! 34051: }
! 34052: if ( attr&FILE_ATTRIBUTE_DIRECTORY ){
! 34053: rc = SQLITE_ERROR; /* Files only. */
! 34054: break;
! 34055: }
! 34056: if ( osDeleteFileA(zConverted) ){
! 34057: rc = SQLITE_OK; /* Deleted OK. */
! 34058: break;
! 34059: }
! 34060: if ( !retryIoerr(&cnt, &lastErrno) ){
! 34061: rc = SQLITE_ERROR; /* No more retries. */
! 34062: break;
! 34063: }
! 34064: } while(1);
! 34065: }
! 34066: #endif
! 34067: if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){
1.2 misho 34068: rc = winLogError(SQLITE_IOERR_DELETE, lastErrno,
34069: "winDelete", zFilename);
34070: }else{
34071: logIoerr(cnt);
34072: }
34073: sqlite3_free(zConverted);
34074: OSTRACE(("DELETE \"%s\" %s\n", zFilename, (rc ? "failed" : "ok" )));
34075: return rc;
34076: }
34077:
34078: /*
34079: ** Check the existance and status of a file.
34080: */
34081: static int winAccess(
34082: sqlite3_vfs *pVfs, /* Not used on win32 */
34083: const char *zFilename, /* Name of file to check */
34084: int flags, /* Type of test to make on this file */
34085: int *pResOut /* OUT: Result */
34086: ){
34087: DWORD attr;
34088: int rc = 0;
34089: DWORD lastErrno;
34090: void *zConverted;
34091: UNUSED_PARAMETER(pVfs);
34092:
34093: SimulateIOError( return SQLITE_IOERR_ACCESS; );
34094: zConverted = convertUtf8Filename(zFilename);
34095: if( zConverted==0 ){
34096: return SQLITE_IOERR_NOMEM;
34097: }
34098: if( isNT() ){
34099: int cnt = 0;
34100: WIN32_FILE_ATTRIBUTE_DATA sAttrData;
34101: memset(&sAttrData, 0, sizeof(sAttrData));
34102: while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted,
34103: GetFileExInfoStandard,
34104: &sAttrData)) && retryIoerr(&cnt, &lastErrno) ){}
34105: if( rc ){
34106: /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file
34107: ** as if it does not exist.
34108: */
34109: if( flags==SQLITE_ACCESS_EXISTS
34110: && sAttrData.nFileSizeHigh==0
34111: && sAttrData.nFileSizeLow==0 ){
34112: attr = INVALID_FILE_ATTRIBUTES;
34113: }else{
34114: attr = sAttrData.dwFileAttributes;
34115: }
34116: }else{
34117: logIoerr(cnt);
1.2.2.1 ! misho 34118: if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){
1.2 misho 34119: winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", zFilename);
34120: sqlite3_free(zConverted);
34121: return SQLITE_IOERR_ACCESS;
34122: }else{
34123: attr = INVALID_FILE_ATTRIBUTES;
34124: }
34125: }
1.2.2.1 ! misho 34126: }
! 34127: #ifdef SQLITE_WIN32_HAS_ANSI
! 34128: else{
1.2 misho 34129: attr = osGetFileAttributesA((char*)zConverted);
34130: }
1.2.2.1 ! misho 34131: #endif
1.2 misho 34132: sqlite3_free(zConverted);
34133: switch( flags ){
34134: case SQLITE_ACCESS_READ:
34135: case SQLITE_ACCESS_EXISTS:
34136: rc = attr!=INVALID_FILE_ATTRIBUTES;
34137: break;
34138: case SQLITE_ACCESS_READWRITE:
34139: rc = attr!=INVALID_FILE_ATTRIBUTES &&
34140: (attr & FILE_ATTRIBUTE_READONLY)==0;
34141: break;
34142: default:
34143: assert(!"Invalid flags argument");
34144: }
34145: *pResOut = rc;
34146: return SQLITE_OK;
34147: }
34148:
34149:
34150: /*
1.2.2.1 ! misho 34151: ** Returns non-zero if the specified path name should be used verbatim. If
! 34152: ** non-zero is returned from this function, the calling function must simply
! 34153: ** use the provided path name verbatim -OR- resolve it into a full path name
! 34154: ** using the GetFullPathName Win32 API function (if available).
! 34155: */
! 34156: static BOOL winIsVerbatimPathname(
! 34157: const char *zPathname
! 34158: ){
! 34159: /*
! 34160: ** If the path name starts with a forward slash or a backslash, it is either
! 34161: ** a legal UNC name, a volume relative path, or an absolute path name in the
! 34162: ** "Unix" format on Windows. There is no easy way to differentiate between
! 34163: ** the final two cases; therefore, we return the safer return value of TRUE
! 34164: ** so that callers of this function will simply use it verbatim.
! 34165: */
! 34166: if ( zPathname[0]=='/' || zPathname[0]=='\\' ){
! 34167: return TRUE;
! 34168: }
! 34169:
! 34170: /*
! 34171: ** If the path name starts with a letter and a colon it is either a volume
! 34172: ** relative path or an absolute path. Callers of this function must not
! 34173: ** attempt to treat it as a relative path name (i.e. they should simply use
! 34174: ** it verbatim).
! 34175: */
! 34176: if ( sqlite3Isalpha(zPathname[0]) && zPathname[1]==':' ){
! 34177: return TRUE;
! 34178: }
! 34179:
! 34180: /*
! 34181: ** If we get to this point, the path name should almost certainly be a purely
! 34182: ** relative one (i.e. not a UNC name, not absolute, and not volume relative).
! 34183: */
! 34184: return FALSE;
! 34185: }
! 34186:
! 34187: /*
1.2 misho 34188: ** Turn a relative pathname into a full pathname. Write the full
34189: ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname
34190: ** bytes in size.
34191: */
34192: static int winFullPathname(
34193: sqlite3_vfs *pVfs, /* Pointer to vfs object */
34194: const char *zRelative, /* Possibly relative input path */
34195: int nFull, /* Size of output buffer in bytes */
34196: char *zFull /* Output buffer */
34197: ){
34198:
34199: #if defined(__CYGWIN__)
34200: SimulateIOError( return SQLITE_ERROR );
34201: UNUSED_PARAMETER(nFull);
1.2.2.1 ! misho 34202: assert( pVfs->mxPathname>=MAX_PATH );
! 34203: assert( nFull>=pVfs->mxPathname );
! 34204: if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
! 34205: /*
! 34206: ** NOTE: We are dealing with a relative path name and the data
! 34207: ** directory has been set. Therefore, use it as the basis
! 34208: ** for converting the relative path name to an absolute
! 34209: ** one by prepending the data directory and a slash.
! 34210: */
! 34211: char zOut[MAX_PATH+1];
! 34212: memset(zOut, 0, MAX_PATH+1);
! 34213: cygwin_conv_to_win32_path(zRelative, zOut); /* POSIX to Win32 */
! 34214: sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s\\%s",
! 34215: sqlite3_data_directory, zOut);
! 34216: }else{
! 34217: /*
! 34218: ** NOTE: The Cygwin docs state that the maximum length needed
! 34219: ** for the buffer passed to cygwin_conv_to_full_win32_path
! 34220: ** is MAX_PATH.
! 34221: */
! 34222: cygwin_conv_to_full_win32_path(zRelative, zFull);
! 34223: }
1.2 misho 34224: return SQLITE_OK;
34225: #endif
34226:
1.2.2.1 ! misho 34227: #if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__)
1.2 misho 34228: SimulateIOError( return SQLITE_ERROR );
34229: /* WinCE has no concept of a relative pathname, or so I am told. */
1.2.2.1 ! misho 34230: /* WinRT has no way to convert a relative path to an absolute one. */
! 34231: if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
! 34232: /*
! 34233: ** NOTE: We are dealing with a relative path name and the data
! 34234: ** directory has been set. Therefore, use it as the basis
! 34235: ** for converting the relative path name to an absolute
! 34236: ** one by prepending the data directory and a backslash.
! 34237: */
! 34238: sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s\\%s",
! 34239: sqlite3_data_directory, zRelative);
! 34240: }else{
! 34241: sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative);
! 34242: }
1.2 misho 34243: return SQLITE_OK;
34244: #endif
34245:
1.2.2.1 ! misho 34246: #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__)
! 34247: DWORD nByte;
1.2 misho 34248: void *zConverted;
34249: char *zOut;
34250:
34251: /* If this path name begins with "/X:", where "X" is any alphabetic
34252: ** character, discard the initial "/" from the pathname.
34253: */
34254: if( zRelative[0]=='/' && sqlite3Isalpha(zRelative[1]) && zRelative[2]==':' ){
34255: zRelative++;
34256: }
34257:
34258: /* It's odd to simulate an io-error here, but really this is just
34259: ** using the io-error infrastructure to test that SQLite handles this
34260: ** function failing. This function could fail if, for example, the
34261: ** current working directory has been unlinked.
34262: */
34263: SimulateIOError( return SQLITE_ERROR );
1.2.2.1 ! misho 34264: if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
! 34265: /*
! 34266: ** NOTE: We are dealing with a relative path name and the data
! 34267: ** directory has been set. Therefore, use it as the basis
! 34268: ** for converting the relative path name to an absolute
! 34269: ** one by prepending the data directory and a backslash.
! 34270: */
! 34271: sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s\\%s",
! 34272: sqlite3_data_directory, zRelative);
! 34273: return SQLITE_OK;
! 34274: }
1.2 misho 34275: zConverted = convertUtf8Filename(zRelative);
34276: if( zConverted==0 ){
34277: return SQLITE_IOERR_NOMEM;
34278: }
34279: if( isNT() ){
34280: LPWSTR zTemp;
1.2.2.1 ! misho 34281: nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0);
! 34282: if( nByte==0 ){
! 34283: winLogError(SQLITE_ERROR, osGetLastError(),
! 34284: "GetFullPathNameW1", zConverted);
! 34285: sqlite3_free(zConverted);
! 34286: return SQLITE_CANTOPEN_FULLPATH;
! 34287: }
! 34288: nByte += 3;
! 34289: zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
1.2 misho 34290: if( zTemp==0 ){
34291: sqlite3_free(zConverted);
34292: return SQLITE_IOERR_NOMEM;
34293: }
1.2.2.1 ! misho 34294: nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0);
! 34295: if( nByte==0 ){
! 34296: winLogError(SQLITE_ERROR, osGetLastError(),
! 34297: "GetFullPathNameW2", zConverted);
! 34298: sqlite3_free(zConverted);
! 34299: sqlite3_free(zTemp);
! 34300: return SQLITE_CANTOPEN_FULLPATH;
! 34301: }
1.2 misho 34302: sqlite3_free(zConverted);
34303: zOut = unicodeToUtf8(zTemp);
34304: sqlite3_free(zTemp);
1.2.2.1 ! misho 34305: }
! 34306: #ifdef SQLITE_WIN32_HAS_ANSI
! 34307: else{
1.2 misho 34308: char *zTemp;
1.2.2.1 ! misho 34309: nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0);
! 34310: if( nByte==0 ){
! 34311: winLogError(SQLITE_ERROR, osGetLastError(),
! 34312: "GetFullPathNameA1", zConverted);
! 34313: sqlite3_free(zConverted);
! 34314: return SQLITE_CANTOPEN_FULLPATH;
! 34315: }
! 34316: nByte += 3;
! 34317: zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
1.2 misho 34318: if( zTemp==0 ){
34319: sqlite3_free(zConverted);
34320: return SQLITE_IOERR_NOMEM;
34321: }
1.2.2.1 ! misho 34322: nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0);
! 34323: if( nByte==0 ){
! 34324: winLogError(SQLITE_ERROR, osGetLastError(),
! 34325: "GetFullPathNameA2", zConverted);
! 34326: sqlite3_free(zConverted);
! 34327: sqlite3_free(zTemp);
! 34328: return SQLITE_CANTOPEN_FULLPATH;
! 34329: }
1.2 misho 34330: sqlite3_free(zConverted);
34331: zOut = sqlite3_win32_mbcs_to_utf8(zTemp);
34332: sqlite3_free(zTemp);
34333: }
1.2.2.1 ! misho 34334: #endif
1.2 misho 34335: if( zOut ){
1.2.2.1 ! misho 34336: sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut);
1.2 misho 34337: sqlite3_free(zOut);
34338: return SQLITE_OK;
34339: }else{
34340: return SQLITE_IOERR_NOMEM;
34341: }
34342: #endif
34343: }
34344:
34345: #ifndef SQLITE_OMIT_LOAD_EXTENSION
34346: /*
34347: ** Interfaces for opening a shared library, finding entry points
34348: ** within the shared library, and closing the shared library.
34349: */
34350: /*
34351: ** Interfaces for opening a shared library, finding entry points
34352: ** within the shared library, and closing the shared library.
34353: */
34354: static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
34355: HANDLE h;
34356: void *zConverted = convertUtf8Filename(zFilename);
34357: UNUSED_PARAMETER(pVfs);
34358: if( zConverted==0 ){
34359: return 0;
34360: }
34361: if( isNT() ){
1.2.2.1 ! misho 34362: #if SQLITE_OS_WINRT
! 34363: h = osLoadPackagedLibrary((LPCWSTR)zConverted, 0);
! 34364: #else
1.2 misho 34365: h = osLoadLibraryW((LPCWSTR)zConverted);
34366: #endif
34367: }
1.2.2.1 ! misho 34368: #ifdef SQLITE_WIN32_HAS_ANSI
! 34369: else{
! 34370: h = osLoadLibraryA((char*)zConverted);
! 34371: }
! 34372: #endif
1.2 misho 34373: sqlite3_free(zConverted);
34374: return (void*)h;
34375: }
34376: static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){
34377: UNUSED_PARAMETER(pVfs);
34378: getLastErrorMsg(osGetLastError(), nBuf, zBufOut);
34379: }
34380: static void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){
34381: UNUSED_PARAMETER(pVfs);
34382: return (void(*)(void))osGetProcAddressA((HANDLE)pHandle, zSymbol);
34383: }
34384: static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){
34385: UNUSED_PARAMETER(pVfs);
34386: osFreeLibrary((HANDLE)pHandle);
34387: }
34388: #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
34389: #define winDlOpen 0
34390: #define winDlError 0
34391: #define winDlSym 0
34392: #define winDlClose 0
34393: #endif
34394:
34395:
34396: /*
34397: ** Write up to nBuf bytes of randomness into zBuf.
34398: */
34399: static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
34400: int n = 0;
34401: UNUSED_PARAMETER(pVfs);
34402: #if defined(SQLITE_TEST)
34403: n = nBuf;
34404: memset(zBuf, 0, nBuf);
34405: #else
34406: if( sizeof(SYSTEMTIME)<=nBuf-n ){
34407: SYSTEMTIME x;
34408: osGetSystemTime(&x);
34409: memcpy(&zBuf[n], &x, sizeof(x));
34410: n += sizeof(x);
34411: }
34412: if( sizeof(DWORD)<=nBuf-n ){
34413: DWORD pid = osGetCurrentProcessId();
34414: memcpy(&zBuf[n], &pid, sizeof(pid));
34415: n += sizeof(pid);
34416: }
1.2.2.1 ! misho 34417: #if SQLITE_OS_WINRT
! 34418: if( sizeof(ULONGLONG)<=nBuf-n ){
! 34419: ULONGLONG cnt = osGetTickCount64();
! 34420: memcpy(&zBuf[n], &cnt, sizeof(cnt));
! 34421: n += sizeof(cnt);
! 34422: }
! 34423: #else
1.2 misho 34424: if( sizeof(DWORD)<=nBuf-n ){
34425: DWORD cnt = osGetTickCount();
34426: memcpy(&zBuf[n], &cnt, sizeof(cnt));
34427: n += sizeof(cnt);
34428: }
1.2.2.1 ! misho 34429: #endif
1.2 misho 34430: if( sizeof(LARGE_INTEGER)<=nBuf-n ){
34431: LARGE_INTEGER i;
34432: osQueryPerformanceCounter(&i);
34433: memcpy(&zBuf[n], &i, sizeof(i));
34434: n += sizeof(i);
34435: }
34436: #endif
34437: return n;
34438: }
34439:
34440:
34441: /*
34442: ** Sleep for a little while. Return the amount of time slept.
34443: */
34444: static int winSleep(sqlite3_vfs *pVfs, int microsec){
1.2.2.1 ! misho 34445: sqlite3_win32_sleep((microsec+999)/1000);
1.2 misho 34446: UNUSED_PARAMETER(pVfs);
34447: return ((microsec+999)/1000)*1000;
34448: }
34449:
34450: /*
34451: ** The following variable, if set to a non-zero value, is interpreted as
34452: ** the number of seconds since 1970 and is used to set the result of
34453: ** sqlite3OsCurrentTime() during testing.
34454: */
34455: #ifdef SQLITE_TEST
34456: SQLITE_API int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
34457: #endif
34458:
34459: /*
34460: ** Find the current time (in Universal Coordinated Time). Write into *piNow
34461: ** the current time and date as a Julian Day number times 86_400_000. In
34462: ** other words, write into *piNow the number of milliseconds since the Julian
34463: ** epoch of noon in Greenwich on November 24, 4714 B.C according to the
34464: ** proleptic Gregorian calendar.
34465: **
34466: ** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
34467: ** cannot be found.
34468: */
34469: static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
34470: /* FILETIME structure is a 64-bit value representing the number of
34471: 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
34472: */
34473: FILETIME ft;
34474: static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000;
34475: #ifdef SQLITE_TEST
34476: static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
34477: #endif
34478: /* 2^32 - to avoid use of LL and warnings in gcc */
34479: static const sqlite3_int64 max32BitValue =
34480: (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + (sqlite3_int64)294967296;
34481:
34482: #if SQLITE_OS_WINCE
34483: SYSTEMTIME time;
34484: osGetSystemTime(&time);
34485: /* if SystemTimeToFileTime() fails, it returns zero. */
34486: if (!osSystemTimeToFileTime(&time,&ft)){
34487: return SQLITE_ERROR;
34488: }
34489: #else
34490: osGetSystemTimeAsFileTime( &ft );
34491: #endif
34492:
34493: *piNow = winFiletimeEpoch +
34494: ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) +
34495: (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000;
34496:
34497: #ifdef SQLITE_TEST
34498: if( sqlite3_current_time ){
34499: *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch;
34500: }
34501: #endif
34502: UNUSED_PARAMETER(pVfs);
34503: return SQLITE_OK;
34504: }
34505:
34506: /*
34507: ** Find the current time (in Universal Coordinated Time). Write the
34508: ** current time and date as a Julian Day number into *prNow and
34509: ** return 0. Return 1 if the time and date cannot be found.
34510: */
34511: static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){
34512: int rc;
34513: sqlite3_int64 i;
34514: rc = winCurrentTimeInt64(pVfs, &i);
34515: if( !rc ){
34516: *prNow = i/86400000.0;
34517: }
34518: return rc;
34519: }
34520:
34521: /*
34522: ** The idea is that this function works like a combination of
34523: ** GetLastError() and FormatMessage() on Windows (or errno and
34524: ** strerror_r() on Unix). After an error is returned by an OS
34525: ** function, SQLite calls this function with zBuf pointing to
34526: ** a buffer of nBuf bytes. The OS layer should populate the
34527: ** buffer with a nul-terminated UTF-8 encoded error message
34528: ** describing the last IO error to have occurred within the calling
34529: ** thread.
34530: **
34531: ** If the error message is too large for the supplied buffer,
34532: ** it should be truncated. The return value of xGetLastError
34533: ** is zero if the error message fits in the buffer, or non-zero
34534: ** otherwise (if the message was truncated). If non-zero is returned,
34535: ** then it is not necessary to include the nul-terminator character
34536: ** in the output buffer.
34537: **
34538: ** Not supplying an error message will have no adverse effect
34539: ** on SQLite. It is fine to have an implementation that never
34540: ** returns an error message:
34541: **
34542: ** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
34543: ** assert(zBuf[0]=='\0');
34544: ** return 0;
34545: ** }
34546: **
34547: ** However if an error message is supplied, it will be incorporated
34548: ** by sqlite into the error message available to the user using
34549: ** sqlite3_errmsg(), possibly making IO errors easier to debug.
34550: */
34551: static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
34552: UNUSED_PARAMETER(pVfs);
34553: return getLastErrorMsg(osGetLastError(), nBuf, zBuf);
34554: }
34555:
34556: /*
34557: ** Initialize and deinitialize the operating system interface.
34558: */
34559: SQLITE_API int sqlite3_os_init(void){
34560: static sqlite3_vfs winVfs = {
34561: 3, /* iVersion */
34562: sizeof(winFile), /* szOsFile */
34563: MAX_PATH, /* mxPathname */
34564: 0, /* pNext */
34565: "win32", /* zName */
34566: 0, /* pAppData */
34567: winOpen, /* xOpen */
34568: winDelete, /* xDelete */
34569: winAccess, /* xAccess */
34570: winFullPathname, /* xFullPathname */
34571: winDlOpen, /* xDlOpen */
34572: winDlError, /* xDlError */
34573: winDlSym, /* xDlSym */
34574: winDlClose, /* xDlClose */
34575: winRandomness, /* xRandomness */
34576: winSleep, /* xSleep */
34577: winCurrentTime, /* xCurrentTime */
34578: winGetLastError, /* xGetLastError */
34579: winCurrentTimeInt64, /* xCurrentTimeInt64 */
34580: winSetSystemCall, /* xSetSystemCall */
34581: winGetSystemCall, /* xGetSystemCall */
34582: winNextSystemCall, /* xNextSystemCall */
34583: };
34584:
34585: /* Double-check that the aSyscall[] array has been constructed
34586: ** correctly. See ticket [bb3a86e890c8e96ab] */
1.2.2.1 ! misho 34587: assert( ArraySize(aSyscall)==74 );
1.2 misho 34588:
34589: #ifndef SQLITE_OMIT_WAL
34590: /* get memory map allocation granularity */
34591: memset(&winSysInfo, 0, sizeof(SYSTEM_INFO));
1.2.2.1 ! misho 34592: #if SQLITE_OS_WINRT
! 34593: osGetNativeSystemInfo(&winSysInfo);
! 34594: #else
1.2 misho 34595: osGetSystemInfo(&winSysInfo);
1.2.2.1 ! misho 34596: #endif
1.2 misho 34597: assert(winSysInfo.dwAllocationGranularity > 0);
34598: #endif
34599:
34600: sqlite3_vfs_register(&winVfs, 1);
34601: return SQLITE_OK;
34602: }
34603:
34604: SQLITE_API int sqlite3_os_end(void){
1.2.2.1 ! misho 34605: #if SQLITE_OS_WINRT
! 34606: if( sleepObj!=NULL ){
! 34607: osCloseHandle(sleepObj);
! 34608: sleepObj = NULL;
! 34609: }
! 34610: #endif
1.2 misho 34611: return SQLITE_OK;
34612: }
34613:
34614: #endif /* SQLITE_OS_WIN */
34615:
34616: /************** End of os_win.c **********************************************/
34617: /************** Begin file bitvec.c ******************************************/
34618: /*
34619: ** 2008 February 16
34620: **
34621: ** The author disclaims copyright to this source code. In place of
34622: ** a legal notice, here is a blessing:
34623: **
34624: ** May you do good and not evil.
34625: ** May you find forgiveness for yourself and forgive others.
34626: ** May you share freely, never taking more than you give.
34627: **
34628: *************************************************************************
34629: ** This file implements an object that represents a fixed-length
34630: ** bitmap. Bits are numbered starting with 1.
34631: **
34632: ** A bitmap is used to record which pages of a database file have been
34633: ** journalled during a transaction, or which pages have the "dont-write"
34634: ** property. Usually only a few pages are meet either condition.
34635: ** So the bitmap is usually sparse and has low cardinality.
34636: ** But sometimes (for example when during a DROP of a large table) most
34637: ** or all of the pages in a database can get journalled. In those cases,
34638: ** the bitmap becomes dense with high cardinality. The algorithm needs
34639: ** to handle both cases well.
34640: **
34641: ** The size of the bitmap is fixed when the object is created.
34642: **
34643: ** All bits are clear when the bitmap is created. Individual bits
34644: ** may be set or cleared one at a time.
34645: **
34646: ** Test operations are about 100 times more common that set operations.
34647: ** Clear operations are exceedingly rare. There are usually between
34648: ** 5 and 500 set operations per Bitvec object, though the number of sets can
34649: ** sometimes grow into tens of thousands or larger. The size of the
34650: ** Bitvec object is the number of pages in the database file at the
34651: ** start of a transaction, and is thus usually less than a few thousand,
34652: ** but can be as large as 2 billion for a really big database.
34653: */
34654:
34655: /* Size of the Bitvec structure in bytes. */
34656: #define BITVEC_SZ 512
34657:
34658: /* Round the union size down to the nearest pointer boundary, since that's how
34659: ** it will be aligned within the Bitvec struct. */
34660: #define BITVEC_USIZE (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*))
34661:
34662: /* Type of the array "element" for the bitmap representation.
34663: ** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE.
34664: ** Setting this to the "natural word" size of your CPU may improve
34665: ** performance. */
34666: #define BITVEC_TELEM u8
34667: /* Size, in bits, of the bitmap element. */
34668: #define BITVEC_SZELEM 8
34669: /* Number of elements in a bitmap array. */
34670: #define BITVEC_NELEM (BITVEC_USIZE/sizeof(BITVEC_TELEM))
34671: /* Number of bits in the bitmap array. */
34672: #define BITVEC_NBIT (BITVEC_NELEM*BITVEC_SZELEM)
34673:
34674: /* Number of u32 values in hash table. */
34675: #define BITVEC_NINT (BITVEC_USIZE/sizeof(u32))
34676: /* Maximum number of entries in hash table before
34677: ** sub-dividing and re-hashing. */
34678: #define BITVEC_MXHASH (BITVEC_NINT/2)
34679: /* Hashing function for the aHash representation.
34680: ** Empirical testing showed that the *37 multiplier
34681: ** (an arbitrary prime)in the hash function provided
34682: ** no fewer collisions than the no-op *1. */
34683: #define BITVEC_HASH(X) (((X)*1)%BITVEC_NINT)
34684:
34685: #define BITVEC_NPTR (BITVEC_USIZE/sizeof(Bitvec *))
34686:
34687:
34688: /*
34689: ** A bitmap is an instance of the following structure.
34690: **
34691: ** This bitmap records the existance of zero or more bits
34692: ** with values between 1 and iSize, inclusive.
34693: **
34694: ** There are three possible representations of the bitmap.
34695: ** If iSize<=BITVEC_NBIT, then Bitvec.u.aBitmap[] is a straight
34696: ** bitmap. The least significant bit is bit 1.
34697: **
34698: ** If iSize>BITVEC_NBIT and iDivisor==0 then Bitvec.u.aHash[] is
34699: ** a hash table that will hold up to BITVEC_MXHASH distinct values.
34700: **
34701: ** Otherwise, the value i is redirected into one of BITVEC_NPTR
34702: ** sub-bitmaps pointed to by Bitvec.u.apSub[]. Each subbitmap
34703: ** handles up to iDivisor separate values of i. apSub[0] holds
34704: ** values between 1 and iDivisor. apSub[1] holds values between
34705: ** iDivisor+1 and 2*iDivisor. apSub[N] holds values between
34706: ** N*iDivisor+1 and (N+1)*iDivisor. Each subbitmap is normalized
34707: ** to hold deal with values between 1 and iDivisor.
34708: */
34709: struct Bitvec {
34710: u32 iSize; /* Maximum bit index. Max iSize is 4,294,967,296. */
34711: u32 nSet; /* Number of bits that are set - only valid for aHash
34712: ** element. Max is BITVEC_NINT. For BITVEC_SZ of 512,
34713: ** this would be 125. */
34714: u32 iDivisor; /* Number of bits handled by each apSub[] entry. */
34715: /* Should >=0 for apSub element. */
34716: /* Max iDivisor is max(u32) / BITVEC_NPTR + 1. */
34717: /* For a BITVEC_SZ of 512, this would be 34,359,739. */
34718: union {
34719: BITVEC_TELEM aBitmap[BITVEC_NELEM]; /* Bitmap representation */
34720: u32 aHash[BITVEC_NINT]; /* Hash table representation */
34721: Bitvec *apSub[BITVEC_NPTR]; /* Recursive representation */
34722: } u;
34723: };
34724:
34725: /*
34726: ** Create a new bitmap object able to handle bits between 0 and iSize,
34727: ** inclusive. Return a pointer to the new object. Return NULL if
34728: ** malloc fails.
34729: */
34730: SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){
34731: Bitvec *p;
34732: assert( sizeof(*p)==BITVEC_SZ );
34733: p = sqlite3MallocZero( sizeof(*p) );
34734: if( p ){
34735: p->iSize = iSize;
34736: }
34737: return p;
34738: }
34739:
34740: /*
34741: ** Check to see if the i-th bit is set. Return true or false.
34742: ** If p is NULL (if the bitmap has not been created) or if
34743: ** i is out of range, then return false.
34744: */
34745: SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){
34746: if( p==0 ) return 0;
34747: if( i>p->iSize || i==0 ) return 0;
34748: i--;
34749: while( p->iDivisor ){
34750: u32 bin = i/p->iDivisor;
34751: i = i%p->iDivisor;
34752: p = p->u.apSub[bin];
34753: if (!p) {
34754: return 0;
34755: }
34756: }
34757: if( p->iSize<=BITVEC_NBIT ){
34758: return (p->u.aBitmap[i/BITVEC_SZELEM] & (1<<(i&(BITVEC_SZELEM-1))))!=0;
34759: } else{
34760: u32 h = BITVEC_HASH(i++);
34761: while( p->u.aHash[h] ){
34762: if( p->u.aHash[h]==i ) return 1;
34763: h = (h+1) % BITVEC_NINT;
34764: }
34765: return 0;
34766: }
34767: }
34768:
34769: /*
34770: ** Set the i-th bit. Return 0 on success and an error code if
34771: ** anything goes wrong.
34772: **
34773: ** This routine might cause sub-bitmaps to be allocated. Failing
34774: ** to get the memory needed to hold the sub-bitmap is the only
34775: ** that can go wrong with an insert, assuming p and i are valid.
34776: **
34777: ** The calling function must ensure that p is a valid Bitvec object
34778: ** and that the value for "i" is within range of the Bitvec object.
34779: ** Otherwise the behavior is undefined.
34780: */
34781: SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){
34782: u32 h;
34783: if( p==0 ) return SQLITE_OK;
34784: assert( i>0 );
34785: assert( i<=p->iSize );
34786: i--;
34787: while((p->iSize > BITVEC_NBIT) && p->iDivisor) {
34788: u32 bin = i/p->iDivisor;
34789: i = i%p->iDivisor;
34790: if( p->u.apSub[bin]==0 ){
34791: p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor );
34792: if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM;
34793: }
34794: p = p->u.apSub[bin];
34795: }
34796: if( p->iSize<=BITVEC_NBIT ){
34797: p->u.aBitmap[i/BITVEC_SZELEM] |= 1 << (i&(BITVEC_SZELEM-1));
34798: return SQLITE_OK;
34799: }
34800: h = BITVEC_HASH(i++);
34801: /* if there wasn't a hash collision, and this doesn't */
34802: /* completely fill the hash, then just add it without */
34803: /* worring about sub-dividing and re-hashing. */
34804: if( !p->u.aHash[h] ){
34805: if (p->nSet<(BITVEC_NINT-1)) {
34806: goto bitvec_set_end;
34807: } else {
34808: goto bitvec_set_rehash;
34809: }
34810: }
34811: /* there was a collision, check to see if it's already */
34812: /* in hash, if not, try to find a spot for it */
34813: do {
34814: if( p->u.aHash[h]==i ) return SQLITE_OK;
34815: h++;
34816: if( h>=BITVEC_NINT ) h = 0;
34817: } while( p->u.aHash[h] );
34818: /* we didn't find it in the hash. h points to the first */
34819: /* available free spot. check to see if this is going to */
34820: /* make our hash too "full". */
34821: bitvec_set_rehash:
34822: if( p->nSet>=BITVEC_MXHASH ){
34823: unsigned int j;
34824: int rc;
34825: u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash));
34826: if( aiValues==0 ){
34827: return SQLITE_NOMEM;
34828: }else{
34829: memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
34830: memset(p->u.apSub, 0, sizeof(p->u.apSub));
34831: p->iDivisor = (p->iSize + BITVEC_NPTR - 1)/BITVEC_NPTR;
34832: rc = sqlite3BitvecSet(p, i);
34833: for(j=0; j<BITVEC_NINT; j++){
34834: if( aiValues[j] ) rc |= sqlite3BitvecSet(p, aiValues[j]);
34835: }
34836: sqlite3StackFree(0, aiValues);
34837: return rc;
34838: }
34839: }
34840: bitvec_set_end:
34841: p->nSet++;
34842: p->u.aHash[h] = i;
34843: return SQLITE_OK;
34844: }
34845:
34846: /*
34847: ** Clear the i-th bit.
34848: **
34849: ** pBuf must be a pointer to at least BITVEC_SZ bytes of temporary storage
34850: ** that BitvecClear can use to rebuilt its hash table.
34851: */
34852: SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec *p, u32 i, void *pBuf){
34853: if( p==0 ) return;
34854: assert( i>0 );
34855: i--;
34856: while( p->iDivisor ){
34857: u32 bin = i/p->iDivisor;
34858: i = i%p->iDivisor;
34859: p = p->u.apSub[bin];
34860: if (!p) {
34861: return;
34862: }
34863: }
34864: if( p->iSize<=BITVEC_NBIT ){
34865: p->u.aBitmap[i/BITVEC_SZELEM] &= ~(1 << (i&(BITVEC_SZELEM-1)));
34866: }else{
34867: unsigned int j;
34868: u32 *aiValues = pBuf;
34869: memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash));
34870: memset(p->u.aHash, 0, sizeof(p->u.aHash));
34871: p->nSet = 0;
34872: for(j=0; j<BITVEC_NINT; j++){
34873: if( aiValues[j] && aiValues[j]!=(i+1) ){
34874: u32 h = BITVEC_HASH(aiValues[j]-1);
34875: p->nSet++;
34876: while( p->u.aHash[h] ){
34877: h++;
34878: if( h>=BITVEC_NINT ) h = 0;
34879: }
34880: p->u.aHash[h] = aiValues[j];
34881: }
34882: }
34883: }
34884: }
34885:
34886: /*
34887: ** Destroy a bitmap object. Reclaim all memory used.
34888: */
34889: SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec *p){
34890: if( p==0 ) return;
34891: if( p->iDivisor ){
34892: unsigned int i;
34893: for(i=0; i<BITVEC_NPTR; i++){
34894: sqlite3BitvecDestroy(p->u.apSub[i]);
34895: }
34896: }
34897: sqlite3_free(p);
34898: }
34899:
34900: /*
34901: ** Return the value of the iSize parameter specified when Bitvec *p
34902: ** was created.
34903: */
34904: SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){
34905: return p->iSize;
34906: }
34907:
34908: #ifndef SQLITE_OMIT_BUILTIN_TEST
34909: /*
34910: ** Let V[] be an array of unsigned characters sufficient to hold
34911: ** up to N bits. Let I be an integer between 0 and N. 0<=I<N.
34912: ** Then the following macros can be used to set, clear, or test
34913: ** individual bits within V.
34914: */
34915: #define SETBIT(V,I) V[I>>3] |= (1<<(I&7))
34916: #define CLEARBIT(V,I) V[I>>3] &= ~(1<<(I&7))
34917: #define TESTBIT(V,I) (V[I>>3]&(1<<(I&7)))!=0
34918:
34919: /*
34920: ** This routine runs an extensive test of the Bitvec code.
34921: **
34922: ** The input is an array of integers that acts as a program
34923: ** to test the Bitvec. The integers are opcodes followed
34924: ** by 0, 1, or 3 operands, depending on the opcode. Another
34925: ** opcode follows immediately after the last operand.
34926: **
34927: ** There are 6 opcodes numbered from 0 through 5. 0 is the
34928: ** "halt" opcode and causes the test to end.
34929: **
34930: ** 0 Halt and return the number of errors
34931: ** 1 N S X Set N bits beginning with S and incrementing by X
34932: ** 2 N S X Clear N bits beginning with S and incrementing by X
34933: ** 3 N Set N randomly chosen bits
34934: ** 4 N Clear N randomly chosen bits
34935: ** 5 N S X Set N bits from S increment X in array only, not in bitvec
34936: **
34937: ** The opcodes 1 through 4 perform set and clear operations are performed
34938: ** on both a Bitvec object and on a linear array of bits obtained from malloc.
34939: ** Opcode 5 works on the linear array only, not on the Bitvec.
34940: ** Opcode 5 is used to deliberately induce a fault in order to
34941: ** confirm that error detection works.
34942: **
34943: ** At the conclusion of the test the linear array is compared
34944: ** against the Bitvec object. If there are any differences,
34945: ** an error is returned. If they are the same, zero is returned.
34946: **
34947: ** If a memory allocation error occurs, return -1.
34948: */
34949: SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){
34950: Bitvec *pBitvec = 0;
34951: unsigned char *pV = 0;
34952: int rc = -1;
34953: int i, nx, pc, op;
34954: void *pTmpSpace;
34955:
34956: /* Allocate the Bitvec to be tested and a linear array of
34957: ** bits to act as the reference */
34958: pBitvec = sqlite3BitvecCreate( sz );
1.2.2.1 ! misho 34959: pV = sqlite3MallocZero( (sz+7)/8 + 1 );
1.2 misho 34960: pTmpSpace = sqlite3_malloc(BITVEC_SZ);
34961: if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end;
34962:
34963: /* NULL pBitvec tests */
34964: sqlite3BitvecSet(0, 1);
34965: sqlite3BitvecClear(0, 1, pTmpSpace);
34966:
34967: /* Run the program */
34968: pc = 0;
34969: while( (op = aOp[pc])!=0 ){
34970: switch( op ){
34971: case 1:
34972: case 2:
34973: case 5: {
34974: nx = 4;
34975: i = aOp[pc+2] - 1;
34976: aOp[pc+2] += aOp[pc+3];
34977: break;
34978: }
34979: case 3:
34980: case 4:
34981: default: {
34982: nx = 2;
34983: sqlite3_randomness(sizeof(i), &i);
34984: break;
34985: }
34986: }
34987: if( (--aOp[pc+1]) > 0 ) nx = 0;
34988: pc += nx;
34989: i = (i & 0x7fffffff)%sz;
34990: if( (op & 1)!=0 ){
34991: SETBIT(pV, (i+1));
34992: if( op!=5 ){
34993: if( sqlite3BitvecSet(pBitvec, i+1) ) goto bitvec_end;
34994: }
34995: }else{
34996: CLEARBIT(pV, (i+1));
34997: sqlite3BitvecClear(pBitvec, i+1, pTmpSpace);
34998: }
34999: }
35000:
35001: /* Test to make sure the linear array exactly matches the
35002: ** Bitvec object. Start with the assumption that they do
35003: ** match (rc==0). Change rc to non-zero if a discrepancy
35004: ** is found.
35005: */
35006: rc = sqlite3BitvecTest(0,0) + sqlite3BitvecTest(pBitvec, sz+1)
35007: + sqlite3BitvecTest(pBitvec, 0)
35008: + (sqlite3BitvecSize(pBitvec) - sz);
35009: for(i=1; i<=sz; i++){
35010: if( (TESTBIT(pV,i))!=sqlite3BitvecTest(pBitvec,i) ){
35011: rc = i;
35012: break;
35013: }
35014: }
35015:
35016: /* Free allocated structure */
35017: bitvec_end:
35018: sqlite3_free(pTmpSpace);
35019: sqlite3_free(pV);
35020: sqlite3BitvecDestroy(pBitvec);
35021: return rc;
35022: }
35023: #endif /* SQLITE_OMIT_BUILTIN_TEST */
35024:
35025: /************** End of bitvec.c **********************************************/
35026: /************** Begin file pcache.c ******************************************/
35027: /*
35028: ** 2008 August 05
35029: **
35030: ** The author disclaims copyright to this source code. In place of
35031: ** a legal notice, here is a blessing:
35032: **
35033: ** May you do good and not evil.
35034: ** May you find forgiveness for yourself and forgive others.
35035: ** May you share freely, never taking more than you give.
35036: **
35037: *************************************************************************
35038: ** This file implements that page cache.
35039: */
35040:
35041: /*
35042: ** A complete page cache is an instance of this structure.
35043: */
35044: struct PCache {
35045: PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */
35046: PgHdr *pSynced; /* Last synced page in dirty page list */
35047: int nRef; /* Number of referenced pages */
35048: int szCache; /* Configured cache size */
35049: int szPage; /* Size of every page in this cache */
35050: int szExtra; /* Size of extra space for each page */
35051: int bPurgeable; /* True if pages are on backing store */
35052: int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */
35053: void *pStress; /* Argument to xStress */
35054: sqlite3_pcache *pCache; /* Pluggable cache module */
35055: PgHdr *pPage1; /* Reference to page 1 */
35056: };
35057:
35058: /*
35059: ** Some of the assert() macros in this code are too expensive to run
35060: ** even during normal debugging. Use them only rarely on long-running
35061: ** tests. Enable the expensive asserts using the
35062: ** -DSQLITE_ENABLE_EXPENSIVE_ASSERT=1 compile-time option.
35063: */
35064: #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
35065: # define expensive_assert(X) assert(X)
35066: #else
35067: # define expensive_assert(X)
35068: #endif
35069:
35070: /********************************** Linked List Management ********************/
35071:
35072: #if !defined(NDEBUG) && defined(SQLITE_ENABLE_EXPENSIVE_ASSERT)
35073: /*
35074: ** Check that the pCache->pSynced variable is set correctly. If it
35075: ** is not, either fail an assert or return zero. Otherwise, return
35076: ** non-zero. This is only used in debugging builds, as follows:
35077: **
35078: ** expensive_assert( pcacheCheckSynced(pCache) );
35079: */
35080: static int pcacheCheckSynced(PCache *pCache){
35081: PgHdr *p;
35082: for(p=pCache->pDirtyTail; p!=pCache->pSynced; p=p->pDirtyPrev){
35083: assert( p->nRef || (p->flags&PGHDR_NEED_SYNC) );
35084: }
35085: return (p==0 || p->nRef || (p->flags&PGHDR_NEED_SYNC)==0);
35086: }
35087: #endif /* !NDEBUG && SQLITE_ENABLE_EXPENSIVE_ASSERT */
35088:
35089: /*
35090: ** Remove page pPage from the list of dirty pages.
35091: */
35092: static void pcacheRemoveFromDirtyList(PgHdr *pPage){
35093: PCache *p = pPage->pCache;
35094:
35095: assert( pPage->pDirtyNext || pPage==p->pDirtyTail );
35096: assert( pPage->pDirtyPrev || pPage==p->pDirty );
35097:
35098: /* Update the PCache1.pSynced variable if necessary. */
35099: if( p->pSynced==pPage ){
35100: PgHdr *pSynced = pPage->pDirtyPrev;
35101: while( pSynced && (pSynced->flags&PGHDR_NEED_SYNC) ){
35102: pSynced = pSynced->pDirtyPrev;
35103: }
35104: p->pSynced = pSynced;
35105: }
35106:
35107: if( pPage->pDirtyNext ){
35108: pPage->pDirtyNext->pDirtyPrev = pPage->pDirtyPrev;
35109: }else{
35110: assert( pPage==p->pDirtyTail );
35111: p->pDirtyTail = pPage->pDirtyPrev;
35112: }
35113: if( pPage->pDirtyPrev ){
35114: pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext;
35115: }else{
35116: assert( pPage==p->pDirty );
35117: p->pDirty = pPage->pDirtyNext;
35118: }
35119: pPage->pDirtyNext = 0;
35120: pPage->pDirtyPrev = 0;
35121:
35122: expensive_assert( pcacheCheckSynced(p) );
35123: }
35124:
35125: /*
35126: ** Add page pPage to the head of the dirty list (PCache1.pDirty is set to
35127: ** pPage).
35128: */
35129: static void pcacheAddToDirtyList(PgHdr *pPage){
35130: PCache *p = pPage->pCache;
35131:
35132: assert( pPage->pDirtyNext==0 && pPage->pDirtyPrev==0 && p->pDirty!=pPage );
35133:
35134: pPage->pDirtyNext = p->pDirty;
35135: if( pPage->pDirtyNext ){
35136: assert( pPage->pDirtyNext->pDirtyPrev==0 );
35137: pPage->pDirtyNext->pDirtyPrev = pPage;
35138: }
35139: p->pDirty = pPage;
35140: if( !p->pDirtyTail ){
35141: p->pDirtyTail = pPage;
35142: }
35143: if( !p->pSynced && 0==(pPage->flags&PGHDR_NEED_SYNC) ){
35144: p->pSynced = pPage;
35145: }
35146: expensive_assert( pcacheCheckSynced(p) );
35147: }
35148:
35149: /*
35150: ** Wrapper around the pluggable caches xUnpin method. If the cache is
35151: ** being used for an in-memory database, this function is a no-op.
35152: */
35153: static void pcacheUnpin(PgHdr *p){
35154: PCache *pCache = p->pCache;
35155: if( pCache->bPurgeable ){
35156: if( p->pgno==1 ){
35157: pCache->pPage1 = 0;
35158: }
35159: sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, p->pPage, 0);
35160: }
35161: }
35162:
35163: /*************************************************** General Interfaces ******
35164: **
35165: ** Initialize and shutdown the page cache subsystem. Neither of these
35166: ** functions are threadsafe.
35167: */
35168: SQLITE_PRIVATE int sqlite3PcacheInitialize(void){
35169: if( sqlite3GlobalConfig.pcache2.xInit==0 ){
35170: /* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the
35171: ** built-in default page cache is used instead of the application defined
35172: ** page cache. */
35173: sqlite3PCacheSetDefault();
35174: }
35175: return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg);
35176: }
35177: SQLITE_PRIVATE void sqlite3PcacheShutdown(void){
35178: if( sqlite3GlobalConfig.pcache2.xShutdown ){
35179: /* IMPLEMENTATION-OF: R-26000-56589 The xShutdown() method may be NULL. */
35180: sqlite3GlobalConfig.pcache2.xShutdown(sqlite3GlobalConfig.pcache2.pArg);
35181: }
35182: }
35183:
35184: /*
35185: ** Return the size in bytes of a PCache object.
35186: */
35187: SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); }
35188:
35189: /*
35190: ** Create a new PCache object. Storage space to hold the object
35191: ** has already been allocated and is passed in as the p pointer.
35192: ** The caller discovers how much space needs to be allocated by
35193: ** calling sqlite3PcacheSize().
35194: */
35195: SQLITE_PRIVATE void sqlite3PcacheOpen(
35196: int szPage, /* Size of every page */
35197: int szExtra, /* Extra space associated with each page */
35198: int bPurgeable, /* True if pages are on backing store */
35199: int (*xStress)(void*,PgHdr*),/* Call to try to make pages clean */
35200: void *pStress, /* Argument to xStress */
35201: PCache *p /* Preallocated space for the PCache */
35202: ){
35203: memset(p, 0, sizeof(PCache));
35204: p->szPage = szPage;
35205: p->szExtra = szExtra;
35206: p->bPurgeable = bPurgeable;
35207: p->xStress = xStress;
35208: p->pStress = pStress;
35209: p->szCache = 100;
35210: }
35211:
35212: /*
35213: ** Change the page size for PCache object. The caller must ensure that there
35214: ** are no outstanding page references when this function is called.
35215: */
35216: SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *pCache, int szPage){
35217: assert( pCache->nRef==0 && pCache->pDirty==0 );
35218: if( pCache->pCache ){
35219: sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache);
35220: pCache->pCache = 0;
35221: pCache->pPage1 = 0;
35222: }
35223: pCache->szPage = szPage;
35224: }
35225:
35226: /*
35227: ** Compute the number of pages of cache requested.
35228: */
35229: static int numberOfCachePages(PCache *p){
35230: if( p->szCache>=0 ){
35231: return p->szCache;
35232: }else{
35233: return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra));
35234: }
35235: }
35236:
35237: /*
35238: ** Try to obtain a page from the cache.
35239: */
35240: SQLITE_PRIVATE int sqlite3PcacheFetch(
35241: PCache *pCache, /* Obtain the page from this cache */
35242: Pgno pgno, /* Page number to obtain */
35243: int createFlag, /* If true, create page if it does not exist already */
35244: PgHdr **ppPage /* Write the page here */
35245: ){
35246: sqlite3_pcache_page *pPage = 0;
35247: PgHdr *pPgHdr = 0;
35248: int eCreate;
35249:
35250: assert( pCache!=0 );
35251: assert( createFlag==1 || createFlag==0 );
35252: assert( pgno>0 );
35253:
35254: /* If the pluggable cache (sqlite3_pcache*) has not been allocated,
35255: ** allocate it now.
35256: */
35257: if( !pCache->pCache && createFlag ){
35258: sqlite3_pcache *p;
35259: p = sqlite3GlobalConfig.pcache2.xCreate(
35260: pCache->szPage, pCache->szExtra + sizeof(PgHdr), pCache->bPurgeable
35261: );
35262: if( !p ){
35263: return SQLITE_NOMEM;
35264: }
35265: sqlite3GlobalConfig.pcache2.xCachesize(p, numberOfCachePages(pCache));
35266: pCache->pCache = p;
35267: }
35268:
35269: eCreate = createFlag * (1 + (!pCache->bPurgeable || !pCache->pDirty));
35270: if( pCache->pCache ){
35271: pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate);
35272: }
35273:
35274: if( !pPage && eCreate==1 ){
35275: PgHdr *pPg;
35276:
35277: /* Find a dirty page to write-out and recycle. First try to find a
35278: ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC
35279: ** cleared), but if that is not possible settle for any other
35280: ** unreferenced dirty page.
35281: */
35282: expensive_assert( pcacheCheckSynced(pCache) );
35283: for(pPg=pCache->pSynced;
35284: pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC));
35285: pPg=pPg->pDirtyPrev
35286: );
35287: pCache->pSynced = pPg;
35288: if( !pPg ){
35289: for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev);
35290: }
35291: if( pPg ){
35292: int rc;
35293: #ifdef SQLITE_LOG_CACHE_SPILL
35294: sqlite3_log(SQLITE_FULL,
35295: "spill page %d making room for %d - cache used: %d/%d",
35296: pPg->pgno, pgno,
35297: sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache),
35298: numberOfCachePages(pCache));
35299: #endif
35300: rc = pCache->xStress(pCache->pStress, pPg);
35301: if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){
35302: return rc;
35303: }
35304: }
35305:
35306: pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2);
35307: }
35308:
35309: if( pPage ){
35310: pPgHdr = (PgHdr *)pPage->pExtra;
35311:
35312: if( !pPgHdr->pPage ){
35313: memset(pPgHdr, 0, sizeof(PgHdr));
35314: pPgHdr->pPage = pPage;
35315: pPgHdr->pData = pPage->pBuf;
35316: pPgHdr->pExtra = (void *)&pPgHdr[1];
35317: memset(pPgHdr->pExtra, 0, pCache->szExtra);
35318: pPgHdr->pCache = pCache;
35319: pPgHdr->pgno = pgno;
35320: }
35321: assert( pPgHdr->pCache==pCache );
35322: assert( pPgHdr->pgno==pgno );
35323: assert( pPgHdr->pData==pPage->pBuf );
35324: assert( pPgHdr->pExtra==(void *)&pPgHdr[1] );
35325:
35326: if( 0==pPgHdr->nRef ){
35327: pCache->nRef++;
35328: }
35329: pPgHdr->nRef++;
35330: if( pgno==1 ){
35331: pCache->pPage1 = pPgHdr;
35332: }
35333: }
35334: *ppPage = pPgHdr;
35335: return (pPgHdr==0 && eCreate) ? SQLITE_NOMEM : SQLITE_OK;
35336: }
35337:
35338: /*
35339: ** Decrement the reference count on a page. If the page is clean and the
35340: ** reference count drops to 0, then it is made elible for recycling.
35341: */
35342: SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr *p){
35343: assert( p->nRef>0 );
35344: p->nRef--;
35345: if( p->nRef==0 ){
35346: PCache *pCache = p->pCache;
35347: pCache->nRef--;
35348: if( (p->flags&PGHDR_DIRTY)==0 ){
35349: pcacheUnpin(p);
35350: }else{
35351: /* Move the page to the head of the dirty list. */
35352: pcacheRemoveFromDirtyList(p);
35353: pcacheAddToDirtyList(p);
35354: }
35355: }
35356: }
35357:
35358: /*
35359: ** Increase the reference count of a supplied page by 1.
35360: */
35361: SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){
35362: assert(p->nRef>0);
35363: p->nRef++;
35364: }
35365:
35366: /*
35367: ** Drop a page from the cache. There must be exactly one reference to the
35368: ** page. This function deletes that reference, so after it returns the
35369: ** page pointed to by p is invalid.
35370: */
35371: SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){
35372: PCache *pCache;
35373: assert( p->nRef==1 );
35374: if( p->flags&PGHDR_DIRTY ){
35375: pcacheRemoveFromDirtyList(p);
35376: }
35377: pCache = p->pCache;
35378: pCache->nRef--;
35379: if( p->pgno==1 ){
35380: pCache->pPage1 = 0;
35381: }
35382: sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, p->pPage, 1);
35383: }
35384:
35385: /*
35386: ** Make sure the page is marked as dirty. If it isn't dirty already,
35387: ** make it so.
35388: */
35389: SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
35390: p->flags &= ~PGHDR_DONT_WRITE;
35391: assert( p->nRef>0 );
35392: if( 0==(p->flags & PGHDR_DIRTY) ){
35393: p->flags |= PGHDR_DIRTY;
35394: pcacheAddToDirtyList( p);
35395: }
35396: }
35397:
35398: /*
35399: ** Make sure the page is marked as clean. If it isn't clean already,
35400: ** make it so.
35401: */
35402: SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){
35403: if( (p->flags & PGHDR_DIRTY) ){
35404: pcacheRemoveFromDirtyList(p);
35405: p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC);
35406: if( p->nRef==0 ){
35407: pcacheUnpin(p);
35408: }
35409: }
35410: }
35411:
35412: /*
35413: ** Make every page in the cache clean.
35414: */
35415: SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){
35416: PgHdr *p;
35417: while( (p = pCache->pDirty)!=0 ){
35418: sqlite3PcacheMakeClean(p);
35419: }
35420: }
35421:
35422: /*
35423: ** Clear the PGHDR_NEED_SYNC flag from all dirty pages.
35424: */
35425: SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){
35426: PgHdr *p;
35427: for(p=pCache->pDirty; p; p=p->pDirtyNext){
35428: p->flags &= ~PGHDR_NEED_SYNC;
35429: }
35430: pCache->pSynced = pCache->pDirtyTail;
35431: }
35432:
35433: /*
35434: ** Change the page number of page p to newPgno.
35435: */
35436: SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){
35437: PCache *pCache = p->pCache;
35438: assert( p->nRef>0 );
35439: assert( newPgno>0 );
35440: sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno);
35441: p->pgno = newPgno;
35442: if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){
35443: pcacheRemoveFromDirtyList(p);
35444: pcacheAddToDirtyList(p);
35445: }
35446: }
35447:
35448: /*
35449: ** Drop every cache entry whose page number is greater than "pgno". The
35450: ** caller must ensure that there are no outstanding references to any pages
35451: ** other than page 1 with a page number greater than pgno.
35452: **
35453: ** If there is a reference to page 1 and the pgno parameter passed to this
35454: ** function is 0, then the data area associated with page 1 is zeroed, but
35455: ** the page object is not dropped.
35456: */
35457: SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){
35458: if( pCache->pCache ){
35459: PgHdr *p;
35460: PgHdr *pNext;
35461: for(p=pCache->pDirty; p; p=pNext){
35462: pNext = p->pDirtyNext;
35463: /* This routine never gets call with a positive pgno except right
35464: ** after sqlite3PcacheCleanAll(). So if there are dirty pages,
35465: ** it must be that pgno==0.
35466: */
35467: assert( p->pgno>0 );
35468: if( ALWAYS(p->pgno>pgno) ){
35469: assert( p->flags&PGHDR_DIRTY );
35470: sqlite3PcacheMakeClean(p);
35471: }
35472: }
35473: if( pgno==0 && pCache->pPage1 ){
35474: memset(pCache->pPage1->pData, 0, pCache->szPage);
35475: pgno = 1;
35476: }
35477: sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1);
35478: }
35479: }
35480:
35481: /*
35482: ** Close a cache.
35483: */
35484: SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){
35485: if( pCache->pCache ){
35486: sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache);
35487: }
35488: }
35489:
35490: /*
35491: ** Discard the contents of the cache.
35492: */
35493: SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){
35494: sqlite3PcacheTruncate(pCache, 0);
35495: }
35496:
35497: /*
35498: ** Merge two lists of pages connected by pDirty and in pgno order.
35499: ** Do not both fixing the pDirtyPrev pointers.
35500: */
35501: static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){
35502: PgHdr result, *pTail;
35503: pTail = &result;
35504: while( pA && pB ){
35505: if( pA->pgno<pB->pgno ){
35506: pTail->pDirty = pA;
35507: pTail = pA;
35508: pA = pA->pDirty;
35509: }else{
35510: pTail->pDirty = pB;
35511: pTail = pB;
35512: pB = pB->pDirty;
35513: }
35514: }
35515: if( pA ){
35516: pTail->pDirty = pA;
35517: }else if( pB ){
35518: pTail->pDirty = pB;
35519: }else{
35520: pTail->pDirty = 0;
35521: }
35522: return result.pDirty;
35523: }
35524:
35525: /*
35526: ** Sort the list of pages in accending order by pgno. Pages are
35527: ** connected by pDirty pointers. The pDirtyPrev pointers are
35528: ** corrupted by this sort.
35529: **
35530: ** Since there cannot be more than 2^31 distinct pages in a database,
35531: ** there cannot be more than 31 buckets required by the merge sorter.
35532: ** One extra bucket is added to catch overflow in case something
35533: ** ever changes to make the previous sentence incorrect.
35534: */
35535: #define N_SORT_BUCKET 32
35536: static PgHdr *pcacheSortDirtyList(PgHdr *pIn){
35537: PgHdr *a[N_SORT_BUCKET], *p;
35538: int i;
35539: memset(a, 0, sizeof(a));
35540: while( pIn ){
35541: p = pIn;
35542: pIn = p->pDirty;
35543: p->pDirty = 0;
35544: for(i=0; ALWAYS(i<N_SORT_BUCKET-1); i++){
35545: if( a[i]==0 ){
35546: a[i] = p;
35547: break;
35548: }else{
35549: p = pcacheMergeDirtyList(a[i], p);
35550: a[i] = 0;
35551: }
35552: }
35553: if( NEVER(i==N_SORT_BUCKET-1) ){
35554: /* To get here, there need to be 2^(N_SORT_BUCKET) elements in
35555: ** the input list. But that is impossible.
35556: */
35557: a[i] = pcacheMergeDirtyList(a[i], p);
35558: }
35559: }
35560: p = a[0];
35561: for(i=1; i<N_SORT_BUCKET; i++){
35562: p = pcacheMergeDirtyList(p, a[i]);
35563: }
35564: return p;
35565: }
35566:
35567: /*
35568: ** Return a list of all dirty pages in the cache, sorted by page number.
35569: */
35570: SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){
35571: PgHdr *p;
35572: for(p=pCache->pDirty; p; p=p->pDirtyNext){
35573: p->pDirty = p->pDirtyNext;
35574: }
35575: return pcacheSortDirtyList(pCache->pDirty);
35576: }
35577:
35578: /*
35579: ** Return the total number of referenced pages held by the cache.
35580: */
35581: SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){
35582: return pCache->nRef;
35583: }
35584:
35585: /*
35586: ** Return the number of references to the page supplied as an argument.
35587: */
35588: SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr *p){
35589: return p->nRef;
35590: }
35591:
35592: /*
35593: ** Return the total number of pages in the cache.
35594: */
35595: SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){
35596: int nPage = 0;
35597: if( pCache->pCache ){
35598: nPage = sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache);
35599: }
35600: return nPage;
35601: }
35602:
35603: #ifdef SQLITE_TEST
35604: /*
35605: ** Get the suggested cache-size value.
35606: */
35607: SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){
35608: return numberOfCachePages(pCache);
35609: }
35610: #endif
35611:
35612: /*
35613: ** Set the suggested cache-size value.
35614: */
35615: SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){
35616: pCache->szCache = mxPage;
35617: if( pCache->pCache ){
35618: sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache,
35619: numberOfCachePages(pCache));
35620: }
35621: }
35622:
35623: /*
35624: ** Free up as much memory as possible from the page cache.
35625: */
35626: SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){
35627: if( pCache->pCache ){
35628: sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache);
35629: }
35630: }
35631:
35632: #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG)
35633: /*
35634: ** For all dirty pages currently in the cache, invoke the specified
35635: ** callback. This is only used if the SQLITE_CHECK_PAGES macro is
35636: ** defined.
35637: */
35638: SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)){
35639: PgHdr *pDirty;
35640: for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext){
35641: xIter(pDirty);
35642: }
35643: }
35644: #endif
35645:
35646: /************** End of pcache.c **********************************************/
35647: /************** Begin file pcache1.c *****************************************/
35648: /*
35649: ** 2008 November 05
35650: **
35651: ** The author disclaims copyright to this source code. In place of
35652: ** a legal notice, here is a blessing:
35653: **
35654: ** May you do good and not evil.
35655: ** May you find forgiveness for yourself and forgive others.
35656: ** May you share freely, never taking more than you give.
35657: **
35658: *************************************************************************
35659: **
35660: ** This file implements the default page cache implementation (the
35661: ** sqlite3_pcache interface). It also contains part of the implementation
35662: ** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features.
35663: ** If the default page cache implementation is overriden, then neither of
35664: ** these two features are available.
35665: */
35666:
35667:
35668: typedef struct PCache1 PCache1;
35669: typedef struct PgHdr1 PgHdr1;
35670: typedef struct PgFreeslot PgFreeslot;
35671: typedef struct PGroup PGroup;
35672:
35673: /* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set
35674: ** of one or more PCaches that are able to recycle each others unpinned
35675: ** pages when they are under memory pressure. A PGroup is an instance of
35676: ** the following object.
35677: **
35678: ** This page cache implementation works in one of two modes:
35679: **
35680: ** (1) Every PCache is the sole member of its own PGroup. There is
35681: ** one PGroup per PCache.
35682: **
35683: ** (2) There is a single global PGroup that all PCaches are a member
35684: ** of.
35685: **
35686: ** Mode 1 uses more memory (since PCache instances are not able to rob
35687: ** unused pages from other PCaches) but it also operates without a mutex,
35688: ** and is therefore often faster. Mode 2 requires a mutex in order to be
35689: ** threadsafe, but recycles pages more efficiently.
35690: **
35691: ** For mode (1), PGroup.mutex is NULL. For mode (2) there is only a single
35692: ** PGroup which is the pcache1.grp global variable and its mutex is
35693: ** SQLITE_MUTEX_STATIC_LRU.
35694: */
35695: struct PGroup {
35696: sqlite3_mutex *mutex; /* MUTEX_STATIC_LRU or NULL */
35697: unsigned int nMaxPage; /* Sum of nMax for purgeable caches */
35698: unsigned int nMinPage; /* Sum of nMin for purgeable caches */
35699: unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */
35700: unsigned int nCurrentPage; /* Number of purgeable pages allocated */
35701: PgHdr1 *pLruHead, *pLruTail; /* LRU list of unpinned pages */
35702: };
35703:
35704: /* Each page cache is an instance of the following object. Every
35705: ** open database file (including each in-memory database and each
35706: ** temporary or transient database) has a single page cache which
35707: ** is an instance of this object.
35708: **
35709: ** Pointers to structures of this type are cast and returned as
35710: ** opaque sqlite3_pcache* handles.
35711: */
35712: struct PCache1 {
35713: /* Cache configuration parameters. Page size (szPage) and the purgeable
35714: ** flag (bPurgeable) are set when the cache is created. nMax may be
35715: ** modified at any time by a call to the pcache1Cachesize() method.
35716: ** The PGroup mutex must be held when accessing nMax.
35717: */
35718: PGroup *pGroup; /* PGroup this cache belongs to */
35719: int szPage; /* Size of allocated pages in bytes */
35720: int szExtra; /* Size of extra space in bytes */
35721: int bPurgeable; /* True if cache is purgeable */
35722: unsigned int nMin; /* Minimum number of pages reserved */
35723: unsigned int nMax; /* Configured "cache_size" value */
35724: unsigned int n90pct; /* nMax*9/10 */
1.2.2.1 ! misho 35725: unsigned int iMaxKey; /* Largest key seen since xTruncate() */
1.2 misho 35726:
35727: /* Hash table of all pages. The following variables may only be accessed
35728: ** when the accessor is holding the PGroup mutex.
35729: */
35730: unsigned int nRecyclable; /* Number of pages in the LRU list */
35731: unsigned int nPage; /* Total number of pages in apHash */
35732: unsigned int nHash; /* Number of slots in apHash[] */
35733: PgHdr1 **apHash; /* Hash table for fast lookup by key */
35734: };
35735:
35736: /*
35737: ** Each cache entry is represented by an instance of the following
35738: ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of
35739: ** PgHdr1.pCache->szPage bytes is allocated directly before this structure
35740: ** in memory.
35741: */
35742: struct PgHdr1 {
35743: sqlite3_pcache_page page;
35744: unsigned int iKey; /* Key value (page number) */
35745: PgHdr1 *pNext; /* Next in hash table chain */
35746: PCache1 *pCache; /* Cache that currently owns this page */
35747: PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */
35748: PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */
35749: };
35750:
35751: /*
35752: ** Free slots in the allocator used to divide up the buffer provided using
35753: ** the SQLITE_CONFIG_PAGECACHE mechanism.
35754: */
35755: struct PgFreeslot {
35756: PgFreeslot *pNext; /* Next free slot */
35757: };
35758:
35759: /*
35760: ** Global data used by this cache.
35761: */
35762: static SQLITE_WSD struct PCacheGlobal {
35763: PGroup grp; /* The global PGroup for mode (2) */
35764:
35765: /* Variables related to SQLITE_CONFIG_PAGECACHE settings. The
35766: ** szSlot, nSlot, pStart, pEnd, nReserve, and isInit values are all
35767: ** fixed at sqlite3_initialize() time and do not require mutex protection.
35768: ** The nFreeSlot and pFree values do require mutex protection.
35769: */
35770: int isInit; /* True if initialized */
35771: int szSlot; /* Size of each free slot */
35772: int nSlot; /* The number of pcache slots */
35773: int nReserve; /* Try to keep nFreeSlot above this */
35774: void *pStart, *pEnd; /* Bounds of pagecache malloc range */
35775: /* Above requires no mutex. Use mutex below for variable that follow. */
35776: sqlite3_mutex *mutex; /* Mutex for accessing the following: */
35777: PgFreeslot *pFree; /* Free page blocks */
1.2.2.1 ! misho 35778: int nFreeSlot; /* Number of unused pcache slots */
1.2 misho 35779: /* The following value requires a mutex to change. We skip the mutex on
35780: ** reading because (1) most platforms read a 32-bit integer atomically and
35781: ** (2) even if an incorrect value is read, no great harm is done since this
35782: ** is really just an optimization. */
35783: int bUnderPressure; /* True if low on PAGECACHE memory */
35784: } pcache1_g;
35785:
35786: /*
35787: ** All code in this file should access the global structure above via the
35788: ** alias "pcache1". This ensures that the WSD emulation is used when
35789: ** compiling for systems that do not support real WSD.
35790: */
35791: #define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g))
35792:
35793: /*
35794: ** Macros to enter and leave the PCache LRU mutex.
35795: */
35796: #define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex)
35797: #define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex)
35798:
35799: /******************************************************************************/
35800: /******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/
35801:
35802: /*
35803: ** This function is called during initialization if a static buffer is
35804: ** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE
35805: ** verb to sqlite3_config(). Parameter pBuf points to an allocation large
35806: ** enough to contain 'n' buffers of 'sz' bytes each.
35807: **
35808: ** This routine is called from sqlite3_initialize() and so it is guaranteed
35809: ** to be serialized already. There is no need for further mutexing.
35810: */
35811: SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){
35812: if( pcache1.isInit ){
35813: PgFreeslot *p;
35814: sz = ROUNDDOWN8(sz);
35815: pcache1.szSlot = sz;
35816: pcache1.nSlot = pcache1.nFreeSlot = n;
35817: pcache1.nReserve = n>90 ? 10 : (n/10 + 1);
35818: pcache1.pStart = pBuf;
35819: pcache1.pFree = 0;
35820: pcache1.bUnderPressure = 0;
35821: while( n-- ){
35822: p = (PgFreeslot*)pBuf;
35823: p->pNext = pcache1.pFree;
35824: pcache1.pFree = p;
35825: pBuf = (void*)&((char*)pBuf)[sz];
35826: }
35827: pcache1.pEnd = pBuf;
35828: }
35829: }
35830:
35831: /*
35832: ** Malloc function used within this file to allocate space from the buffer
35833: ** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no
35834: ** such buffer exists or there is no space left in it, this function falls
35835: ** back to sqlite3Malloc().
35836: **
35837: ** Multiple threads can run this routine at the same time. Global variables
35838: ** in pcache1 need to be protected via mutex.
35839: */
35840: static void *pcache1Alloc(int nByte){
35841: void *p = 0;
35842: assert( sqlite3_mutex_notheld(pcache1.grp.mutex) );
35843: sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte);
35844: if( nByte<=pcache1.szSlot ){
35845: sqlite3_mutex_enter(pcache1.mutex);
35846: p = (PgHdr1 *)pcache1.pFree;
35847: if( p ){
35848: pcache1.pFree = pcache1.pFree->pNext;
35849: pcache1.nFreeSlot--;
35850: pcache1.bUnderPressure = pcache1.nFreeSlot<pcache1.nReserve;
35851: assert( pcache1.nFreeSlot>=0 );
35852: sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, 1);
35853: }
35854: sqlite3_mutex_leave(pcache1.mutex);
35855: }
35856: if( p==0 ){
35857: /* Memory is not available in the SQLITE_CONFIG_PAGECACHE pool. Get
35858: ** it from sqlite3Malloc instead.
35859: */
35860: p = sqlite3Malloc(nByte);
1.2.2.1 ! misho 35861: #ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
1.2 misho 35862: if( p ){
35863: int sz = sqlite3MallocSize(p);
35864: sqlite3_mutex_enter(pcache1.mutex);
35865: sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz);
35866: sqlite3_mutex_leave(pcache1.mutex);
35867: }
1.2.2.1 ! misho 35868: #endif
1.2 misho 35869: sqlite3MemdebugSetType(p, MEMTYPE_PCACHE);
35870: }
35871: return p;
35872: }
35873:
35874: /*
35875: ** Free an allocated buffer obtained from pcache1Alloc().
35876: */
35877: static int pcache1Free(void *p){
35878: int nFreed = 0;
35879: if( p==0 ) return 0;
35880: if( p>=pcache1.pStart && p<pcache1.pEnd ){
35881: PgFreeslot *pSlot;
35882: sqlite3_mutex_enter(pcache1.mutex);
35883: sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, -1);
35884: pSlot = (PgFreeslot*)p;
35885: pSlot->pNext = pcache1.pFree;
35886: pcache1.pFree = pSlot;
35887: pcache1.nFreeSlot++;
35888: pcache1.bUnderPressure = pcache1.nFreeSlot<pcache1.nReserve;
35889: assert( pcache1.nFreeSlot<=pcache1.nSlot );
35890: sqlite3_mutex_leave(pcache1.mutex);
35891: }else{
35892: assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) );
35893: sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
35894: nFreed = sqlite3MallocSize(p);
1.2.2.1 ! misho 35895: #ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS
1.2 misho 35896: sqlite3_mutex_enter(pcache1.mutex);
35897: sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, -nFreed);
35898: sqlite3_mutex_leave(pcache1.mutex);
1.2.2.1 ! misho 35899: #endif
1.2 misho 35900: sqlite3_free(p);
35901: }
35902: return nFreed;
35903: }
35904:
35905: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
35906: /*
35907: ** Return the size of a pcache allocation
35908: */
35909: static int pcache1MemSize(void *p){
35910: if( p>=pcache1.pStart && p<pcache1.pEnd ){
35911: return pcache1.szSlot;
35912: }else{
35913: int iSize;
35914: assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) );
35915: sqlite3MemdebugSetType(p, MEMTYPE_HEAP);
35916: iSize = sqlite3MallocSize(p);
35917: sqlite3MemdebugSetType(p, MEMTYPE_PCACHE);
35918: return iSize;
35919: }
35920: }
35921: #endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
35922:
35923: /*
35924: ** Allocate a new page object initially associated with cache pCache.
35925: */
35926: static PgHdr1 *pcache1AllocPage(PCache1 *pCache){
35927: PgHdr1 *p = 0;
35928: void *pPg;
35929:
35930: /* The group mutex must be released before pcache1Alloc() is called. This
35931: ** is because it may call sqlite3_release_memory(), which assumes that
35932: ** this mutex is not held. */
35933: assert( sqlite3_mutex_held(pCache->pGroup->mutex) );
35934: pcache1LeaveMutex(pCache->pGroup);
35935: #ifdef SQLITE_PCACHE_SEPARATE_HEADER
35936: pPg = pcache1Alloc(pCache->szPage);
35937: p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra);
35938: if( !pPg || !p ){
35939: pcache1Free(pPg);
35940: sqlite3_free(p);
35941: pPg = 0;
35942: }
35943: #else
35944: pPg = pcache1Alloc(sizeof(PgHdr1) + pCache->szPage + pCache->szExtra);
35945: p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage];
35946: #endif
35947: pcache1EnterMutex(pCache->pGroup);
35948:
35949: if( pPg ){
35950: p->page.pBuf = pPg;
35951: p->page.pExtra = &p[1];
35952: if( pCache->bPurgeable ){
35953: pCache->pGroup->nCurrentPage++;
35954: }
35955: return p;
35956: }
35957: return 0;
35958: }
35959:
35960: /*
35961: ** Free a page object allocated by pcache1AllocPage().
35962: **
35963: ** The pointer is allowed to be NULL, which is prudent. But it turns out
35964: ** that the current implementation happens to never call this routine
35965: ** with a NULL pointer, so we mark the NULL test with ALWAYS().
35966: */
35967: static void pcache1FreePage(PgHdr1 *p){
35968: if( ALWAYS(p) ){
35969: PCache1 *pCache = p->pCache;
35970: assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) );
35971: pcache1Free(p->page.pBuf);
35972: #ifdef SQLITE_PCACHE_SEPARATE_HEADER
35973: sqlite3_free(p);
35974: #endif
35975: if( pCache->bPurgeable ){
35976: pCache->pGroup->nCurrentPage--;
35977: }
35978: }
35979: }
35980:
35981: /*
35982: ** Malloc function used by SQLite to obtain space from the buffer configured
35983: ** using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no such buffer
35984: ** exists, this function falls back to sqlite3Malloc().
35985: */
35986: SQLITE_PRIVATE void *sqlite3PageMalloc(int sz){
35987: return pcache1Alloc(sz);
35988: }
35989:
35990: /*
35991: ** Free an allocated buffer obtained from sqlite3PageMalloc().
35992: */
35993: SQLITE_PRIVATE void sqlite3PageFree(void *p){
35994: pcache1Free(p);
35995: }
35996:
35997:
35998: /*
35999: ** Return true if it desirable to avoid allocating a new page cache
36000: ** entry.
36001: **
36002: ** If memory was allocated specifically to the page cache using
36003: ** SQLITE_CONFIG_PAGECACHE but that memory has all been used, then
36004: ** it is desirable to avoid allocating a new page cache entry because
36005: ** presumably SQLITE_CONFIG_PAGECACHE was suppose to be sufficient
36006: ** for all page cache needs and we should not need to spill the
36007: ** allocation onto the heap.
36008: **
36009: ** Or, the heap is used for all page cache memory but the heap is
36010: ** under memory pressure, then again it is desirable to avoid
36011: ** allocating a new page cache entry in order to avoid stressing
36012: ** the heap even further.
36013: */
36014: static int pcache1UnderMemoryPressure(PCache1 *pCache){
36015: if( pcache1.nSlot && (pCache->szPage+pCache->szExtra)<=pcache1.szSlot ){
36016: return pcache1.bUnderPressure;
36017: }else{
36018: return sqlite3HeapNearlyFull();
36019: }
36020: }
36021:
36022: /******************************************************************************/
36023: /******** General Implementation Functions ************************************/
36024:
36025: /*
36026: ** This function is used to resize the hash table used by the cache passed
36027: ** as the first argument.
36028: **
36029: ** The PCache mutex must be held when this function is called.
36030: */
36031: static int pcache1ResizeHash(PCache1 *p){
36032: PgHdr1 **apNew;
36033: unsigned int nNew;
36034: unsigned int i;
36035:
36036: assert( sqlite3_mutex_held(p->pGroup->mutex) );
36037:
36038: nNew = p->nHash*2;
36039: if( nNew<256 ){
36040: nNew = 256;
36041: }
36042:
36043: pcache1LeaveMutex(p->pGroup);
36044: if( p->nHash ){ sqlite3BeginBenignMalloc(); }
1.2.2.1 ! misho 36045: apNew = (PgHdr1 **)sqlite3MallocZero(sizeof(PgHdr1 *)*nNew);
1.2 misho 36046: if( p->nHash ){ sqlite3EndBenignMalloc(); }
36047: pcache1EnterMutex(p->pGroup);
36048: if( apNew ){
36049: for(i=0; i<p->nHash; i++){
36050: PgHdr1 *pPage;
36051: PgHdr1 *pNext = p->apHash[i];
36052: while( (pPage = pNext)!=0 ){
36053: unsigned int h = pPage->iKey % nNew;
36054: pNext = pPage->pNext;
36055: pPage->pNext = apNew[h];
36056: apNew[h] = pPage;
36057: }
36058: }
36059: sqlite3_free(p->apHash);
36060: p->apHash = apNew;
36061: p->nHash = nNew;
36062: }
36063:
36064: return (p->apHash ? SQLITE_OK : SQLITE_NOMEM);
36065: }
36066:
36067: /*
36068: ** This function is used internally to remove the page pPage from the
36069: ** PGroup LRU list, if is part of it. If pPage is not part of the PGroup
36070: ** LRU list, then this function is a no-op.
36071: **
36072: ** The PGroup mutex must be held when this function is called.
36073: **
36074: ** If pPage is NULL then this routine is a no-op.
36075: */
36076: static void pcache1PinPage(PgHdr1 *pPage){
36077: PCache1 *pCache;
36078: PGroup *pGroup;
36079:
36080: if( pPage==0 ) return;
36081: pCache = pPage->pCache;
36082: pGroup = pCache->pGroup;
36083: assert( sqlite3_mutex_held(pGroup->mutex) );
36084: if( pPage->pLruNext || pPage==pGroup->pLruTail ){
36085: if( pPage->pLruPrev ){
36086: pPage->pLruPrev->pLruNext = pPage->pLruNext;
36087: }
36088: if( pPage->pLruNext ){
36089: pPage->pLruNext->pLruPrev = pPage->pLruPrev;
36090: }
36091: if( pGroup->pLruHead==pPage ){
36092: pGroup->pLruHead = pPage->pLruNext;
36093: }
36094: if( pGroup->pLruTail==pPage ){
36095: pGroup->pLruTail = pPage->pLruPrev;
36096: }
36097: pPage->pLruNext = 0;
36098: pPage->pLruPrev = 0;
36099: pPage->pCache->nRecyclable--;
36100: }
36101: }
36102:
36103:
36104: /*
36105: ** Remove the page supplied as an argument from the hash table
36106: ** (PCache1.apHash structure) that it is currently stored in.
36107: **
36108: ** The PGroup mutex must be held when this function is called.
36109: */
36110: static void pcache1RemoveFromHash(PgHdr1 *pPage){
36111: unsigned int h;
36112: PCache1 *pCache = pPage->pCache;
36113: PgHdr1 **pp;
36114:
36115: assert( sqlite3_mutex_held(pCache->pGroup->mutex) );
36116: h = pPage->iKey % pCache->nHash;
36117: for(pp=&pCache->apHash[h]; (*pp)!=pPage; pp=&(*pp)->pNext);
36118: *pp = (*pp)->pNext;
36119:
36120: pCache->nPage--;
36121: }
36122:
36123: /*
36124: ** If there are currently more than nMaxPage pages allocated, try
36125: ** to recycle pages to reduce the number allocated to nMaxPage.
36126: */
36127: static void pcache1EnforceMaxPage(PGroup *pGroup){
36128: assert( sqlite3_mutex_held(pGroup->mutex) );
36129: while( pGroup->nCurrentPage>pGroup->nMaxPage && pGroup->pLruTail ){
36130: PgHdr1 *p = pGroup->pLruTail;
36131: assert( p->pCache->pGroup==pGroup );
36132: pcache1PinPage(p);
36133: pcache1RemoveFromHash(p);
36134: pcache1FreePage(p);
36135: }
36136: }
36137:
36138: /*
36139: ** Discard all pages from cache pCache with a page number (key value)
36140: ** greater than or equal to iLimit. Any pinned pages that meet this
36141: ** criteria are unpinned before they are discarded.
36142: **
36143: ** The PCache mutex must be held when this function is called.
36144: */
36145: static void pcache1TruncateUnsafe(
36146: PCache1 *pCache, /* The cache to truncate */
36147: unsigned int iLimit /* Drop pages with this pgno or larger */
36148: ){
36149: TESTONLY( unsigned int nPage = 0; ) /* To assert pCache->nPage is correct */
36150: unsigned int h;
36151: assert( sqlite3_mutex_held(pCache->pGroup->mutex) );
36152: for(h=0; h<pCache->nHash; h++){
36153: PgHdr1 **pp = &pCache->apHash[h];
36154: PgHdr1 *pPage;
36155: while( (pPage = *pp)!=0 ){
36156: if( pPage->iKey>=iLimit ){
36157: pCache->nPage--;
36158: *pp = pPage->pNext;
36159: pcache1PinPage(pPage);
36160: pcache1FreePage(pPage);
36161: }else{
36162: pp = &pPage->pNext;
36163: TESTONLY( nPage++; )
36164: }
36165: }
36166: }
36167: assert( pCache->nPage==nPage );
36168: }
36169:
36170: /******************************************************************************/
36171: /******** sqlite3_pcache Methods **********************************************/
36172:
36173: /*
36174: ** Implementation of the sqlite3_pcache.xInit method.
36175: */
36176: static int pcache1Init(void *NotUsed){
36177: UNUSED_PARAMETER(NotUsed);
36178: assert( pcache1.isInit==0 );
36179: memset(&pcache1, 0, sizeof(pcache1));
36180: if( sqlite3GlobalConfig.bCoreMutex ){
36181: pcache1.grp.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU);
36182: pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PMEM);
36183: }
36184: pcache1.grp.mxPinned = 10;
36185: pcache1.isInit = 1;
36186: return SQLITE_OK;
36187: }
36188:
36189: /*
36190: ** Implementation of the sqlite3_pcache.xShutdown method.
36191: ** Note that the static mutex allocated in xInit does
36192: ** not need to be freed.
36193: */
36194: static void pcache1Shutdown(void *NotUsed){
36195: UNUSED_PARAMETER(NotUsed);
36196: assert( pcache1.isInit!=0 );
36197: memset(&pcache1, 0, sizeof(pcache1));
36198: }
36199:
36200: /*
36201: ** Implementation of the sqlite3_pcache.xCreate method.
36202: **
36203: ** Allocate a new cache.
36204: */
36205: static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){
36206: PCache1 *pCache; /* The newly created page cache */
36207: PGroup *pGroup; /* The group the new page cache will belong to */
36208: int sz; /* Bytes of memory required to allocate the new cache */
36209:
36210: /*
36211: ** The seperateCache variable is true if each PCache has its own private
36212: ** PGroup. In other words, separateCache is true for mode (1) where no
36213: ** mutexing is required.
36214: **
36215: ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT
36216: **
36217: ** * Always use a unified cache in single-threaded applications
36218: **
36219: ** * Otherwise (if multi-threaded and ENABLE_MEMORY_MANAGEMENT is off)
36220: ** use separate caches (mode-1)
36221: */
36222: #if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0
36223: const int separateCache = 0;
36224: #else
36225: int separateCache = sqlite3GlobalConfig.bCoreMutex>0;
36226: #endif
36227:
36228: assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 );
36229: assert( szExtra < 300 );
36230:
36231: sz = sizeof(PCache1) + sizeof(PGroup)*separateCache;
1.2.2.1 ! misho 36232: pCache = (PCache1 *)sqlite3MallocZero(sz);
1.2 misho 36233: if( pCache ){
36234: if( separateCache ){
36235: pGroup = (PGroup*)&pCache[1];
36236: pGroup->mxPinned = 10;
36237: }else{
36238: pGroup = &pcache1.grp;
36239: }
36240: pCache->pGroup = pGroup;
36241: pCache->szPage = szPage;
36242: pCache->szExtra = szExtra;
36243: pCache->bPurgeable = (bPurgeable ? 1 : 0);
36244: if( bPurgeable ){
36245: pCache->nMin = 10;
36246: pcache1EnterMutex(pGroup);
36247: pGroup->nMinPage += pCache->nMin;
36248: pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage;
36249: pcache1LeaveMutex(pGroup);
36250: }
36251: }
36252: return (sqlite3_pcache *)pCache;
36253: }
36254:
36255: /*
36256: ** Implementation of the sqlite3_pcache.xCachesize method.
36257: **
36258: ** Configure the cache_size limit for a cache.
36259: */
36260: static void pcache1Cachesize(sqlite3_pcache *p, int nMax){
36261: PCache1 *pCache = (PCache1 *)p;
36262: if( pCache->bPurgeable ){
36263: PGroup *pGroup = pCache->pGroup;
36264: pcache1EnterMutex(pGroup);
36265: pGroup->nMaxPage += (nMax - pCache->nMax);
36266: pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage;
36267: pCache->nMax = nMax;
36268: pCache->n90pct = pCache->nMax*9/10;
36269: pcache1EnforceMaxPage(pGroup);
36270: pcache1LeaveMutex(pGroup);
36271: }
36272: }
36273:
36274: /*
36275: ** Implementation of the sqlite3_pcache.xShrink method.
36276: **
36277: ** Free up as much memory as possible.
36278: */
36279: static void pcache1Shrink(sqlite3_pcache *p){
36280: PCache1 *pCache = (PCache1*)p;
36281: if( pCache->bPurgeable ){
36282: PGroup *pGroup = pCache->pGroup;
36283: int savedMaxPage;
36284: pcache1EnterMutex(pGroup);
36285: savedMaxPage = pGroup->nMaxPage;
36286: pGroup->nMaxPage = 0;
36287: pcache1EnforceMaxPage(pGroup);
36288: pGroup->nMaxPage = savedMaxPage;
36289: pcache1LeaveMutex(pGroup);
36290: }
36291: }
36292:
36293: /*
36294: ** Implementation of the sqlite3_pcache.xPagecount method.
36295: */
36296: static int pcache1Pagecount(sqlite3_pcache *p){
36297: int n;
36298: PCache1 *pCache = (PCache1*)p;
36299: pcache1EnterMutex(pCache->pGroup);
36300: n = pCache->nPage;
36301: pcache1LeaveMutex(pCache->pGroup);
36302: return n;
36303: }
36304:
36305: /*
36306: ** Implementation of the sqlite3_pcache.xFetch method.
36307: **
36308: ** Fetch a page by key value.
36309: **
36310: ** Whether or not a new page may be allocated by this function depends on
36311: ** the value of the createFlag argument. 0 means do not allocate a new
36312: ** page. 1 means allocate a new page if space is easily available. 2
36313: ** means to try really hard to allocate a new page.
36314: **
36315: ** For a non-purgeable cache (a cache used as the storage for an in-memory
36316: ** database) there is really no difference between createFlag 1 and 2. So
36317: ** the calling function (pcache.c) will never have a createFlag of 1 on
36318: ** a non-purgeable cache.
36319: **
36320: ** There are three different approaches to obtaining space for a page,
36321: ** depending on the value of parameter createFlag (which may be 0, 1 or 2).
36322: **
36323: ** 1. Regardless of the value of createFlag, the cache is searched for a
36324: ** copy of the requested page. If one is found, it is returned.
36325: **
36326: ** 2. If createFlag==0 and the page is not already in the cache, NULL is
36327: ** returned.
36328: **
36329: ** 3. If createFlag is 1, and the page is not already in the cache, then
36330: ** return NULL (do not allocate a new page) if any of the following
36331: ** conditions are true:
36332: **
36333: ** (a) the number of pages pinned by the cache is greater than
36334: ** PCache1.nMax, or
36335: **
36336: ** (b) the number of pages pinned by the cache is greater than
36337: ** the sum of nMax for all purgeable caches, less the sum of
36338: ** nMin for all other purgeable caches, or
36339: **
36340: ** 4. If none of the first three conditions apply and the cache is marked
36341: ** as purgeable, and if one of the following is true:
36342: **
36343: ** (a) The number of pages allocated for the cache is already
36344: ** PCache1.nMax, or
36345: **
36346: ** (b) The number of pages allocated for all purgeable caches is
36347: ** already equal to or greater than the sum of nMax for all
36348: ** purgeable caches,
36349: **
36350: ** (c) The system is under memory pressure and wants to avoid
36351: ** unnecessary pages cache entry allocations
36352: **
36353: ** then attempt to recycle a page from the LRU list. If it is the right
36354: ** size, return the recycled buffer. Otherwise, free the buffer and
36355: ** proceed to step 5.
36356: **
36357: ** 5. Otherwise, allocate and return a new page buffer.
36358: */
36359: static sqlite3_pcache_page *pcache1Fetch(
36360: sqlite3_pcache *p,
36361: unsigned int iKey,
36362: int createFlag
36363: ){
36364: unsigned int nPinned;
36365: PCache1 *pCache = (PCache1 *)p;
36366: PGroup *pGroup;
36367: PgHdr1 *pPage = 0;
36368:
36369: assert( pCache->bPurgeable || createFlag!=1 );
36370: assert( pCache->bPurgeable || pCache->nMin==0 );
36371: assert( pCache->bPurgeable==0 || pCache->nMin==10 );
36372: assert( pCache->nMin==0 || pCache->bPurgeable );
36373: pcache1EnterMutex(pGroup = pCache->pGroup);
36374:
36375: /* Step 1: Search the hash table for an existing entry. */
36376: if( pCache->nHash>0 ){
36377: unsigned int h = iKey % pCache->nHash;
36378: for(pPage=pCache->apHash[h]; pPage&&pPage->iKey!=iKey; pPage=pPage->pNext);
36379: }
36380:
36381: /* Step 2: Abort if no existing page is found and createFlag is 0 */
36382: if( pPage || createFlag==0 ){
36383: pcache1PinPage(pPage);
36384: goto fetch_out;
36385: }
36386:
36387: /* The pGroup local variable will normally be initialized by the
36388: ** pcache1EnterMutex() macro above. But if SQLITE_MUTEX_OMIT is defined,
36389: ** then pcache1EnterMutex() is a no-op, so we have to initialize the
36390: ** local variable here. Delaying the initialization of pGroup is an
36391: ** optimization: The common case is to exit the module before reaching
36392: ** this point.
36393: */
36394: #ifdef SQLITE_MUTEX_OMIT
36395: pGroup = pCache->pGroup;
36396: #endif
36397:
36398: /* Step 3: Abort if createFlag is 1 but the cache is nearly full */
36399: assert( pCache->nPage >= pCache->nRecyclable );
36400: nPinned = pCache->nPage - pCache->nRecyclable;
36401: assert( pGroup->mxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage );
36402: assert( pCache->n90pct == pCache->nMax*9/10 );
36403: if( createFlag==1 && (
36404: nPinned>=pGroup->mxPinned
36405: || nPinned>=pCache->n90pct
36406: || pcache1UnderMemoryPressure(pCache)
36407: )){
36408: goto fetch_out;
36409: }
36410:
36411: if( pCache->nPage>=pCache->nHash && pcache1ResizeHash(pCache) ){
36412: goto fetch_out;
36413: }
36414:
36415: /* Step 4. Try to recycle a page. */
36416: if( pCache->bPurgeable && pGroup->pLruTail && (
36417: (pCache->nPage+1>=pCache->nMax)
36418: || pGroup->nCurrentPage>=pGroup->nMaxPage
36419: || pcache1UnderMemoryPressure(pCache)
36420: )){
36421: PCache1 *pOther;
36422: pPage = pGroup->pLruTail;
36423: pcache1RemoveFromHash(pPage);
36424: pcache1PinPage(pPage);
36425: pOther = pPage->pCache;
36426:
36427: /* We want to verify that szPage and szExtra are the same for pOther
36428: ** and pCache. Assert that we can verify this by comparing sums. */
36429: assert( (pCache->szPage & (pCache->szPage-1))==0 && pCache->szPage>=512 );
36430: assert( pCache->szExtra<512 );
36431: assert( (pOther->szPage & (pOther->szPage-1))==0 && pOther->szPage>=512 );
36432: assert( pOther->szExtra<512 );
36433:
36434: if( pOther->szPage+pOther->szExtra != pCache->szPage+pCache->szExtra ){
36435: pcache1FreePage(pPage);
36436: pPage = 0;
36437: }else{
36438: pGroup->nCurrentPage -= (pOther->bPurgeable - pCache->bPurgeable);
36439: }
36440: }
36441:
36442: /* Step 5. If a usable page buffer has still not been found,
36443: ** attempt to allocate a new one.
36444: */
36445: if( !pPage ){
36446: if( createFlag==1 ) sqlite3BeginBenignMalloc();
36447: pPage = pcache1AllocPage(pCache);
36448: if( createFlag==1 ) sqlite3EndBenignMalloc();
36449: }
36450:
36451: if( pPage ){
36452: unsigned int h = iKey % pCache->nHash;
36453: pCache->nPage++;
36454: pPage->iKey = iKey;
36455: pPage->pNext = pCache->apHash[h];
36456: pPage->pCache = pCache;
36457: pPage->pLruPrev = 0;
36458: pPage->pLruNext = 0;
36459: *(void **)pPage->page.pExtra = 0;
36460: pCache->apHash[h] = pPage;
36461: }
36462:
36463: fetch_out:
36464: if( pPage && iKey>pCache->iMaxKey ){
36465: pCache->iMaxKey = iKey;
36466: }
36467: pcache1LeaveMutex(pGroup);
36468: return &pPage->page;
36469: }
36470:
36471:
36472: /*
36473: ** Implementation of the sqlite3_pcache.xUnpin method.
36474: **
36475: ** Mark a page as unpinned (eligible for asynchronous recycling).
36476: */
36477: static void pcache1Unpin(
36478: sqlite3_pcache *p,
36479: sqlite3_pcache_page *pPg,
36480: int reuseUnlikely
36481: ){
36482: PCache1 *pCache = (PCache1 *)p;
36483: PgHdr1 *pPage = (PgHdr1 *)pPg;
36484: PGroup *pGroup = pCache->pGroup;
36485:
36486: assert( pPage->pCache==pCache );
36487: pcache1EnterMutex(pGroup);
36488:
36489: /* It is an error to call this function if the page is already
36490: ** part of the PGroup LRU list.
36491: */
36492: assert( pPage->pLruPrev==0 && pPage->pLruNext==0 );
36493: assert( pGroup->pLruHead!=pPage && pGroup->pLruTail!=pPage );
36494:
36495: if( reuseUnlikely || pGroup->nCurrentPage>pGroup->nMaxPage ){
36496: pcache1RemoveFromHash(pPage);
36497: pcache1FreePage(pPage);
36498: }else{
36499: /* Add the page to the PGroup LRU list. */
36500: if( pGroup->pLruHead ){
36501: pGroup->pLruHead->pLruPrev = pPage;
36502: pPage->pLruNext = pGroup->pLruHead;
36503: pGroup->pLruHead = pPage;
36504: }else{
36505: pGroup->pLruTail = pPage;
36506: pGroup->pLruHead = pPage;
36507: }
36508: pCache->nRecyclable++;
36509: }
36510:
36511: pcache1LeaveMutex(pCache->pGroup);
36512: }
36513:
36514: /*
36515: ** Implementation of the sqlite3_pcache.xRekey method.
36516: */
36517: static void pcache1Rekey(
36518: sqlite3_pcache *p,
36519: sqlite3_pcache_page *pPg,
36520: unsigned int iOld,
36521: unsigned int iNew
36522: ){
36523: PCache1 *pCache = (PCache1 *)p;
36524: PgHdr1 *pPage = (PgHdr1 *)pPg;
36525: PgHdr1 **pp;
36526: unsigned int h;
36527: assert( pPage->iKey==iOld );
36528: assert( pPage->pCache==pCache );
36529:
36530: pcache1EnterMutex(pCache->pGroup);
36531:
36532: h = iOld%pCache->nHash;
36533: pp = &pCache->apHash[h];
36534: while( (*pp)!=pPage ){
36535: pp = &(*pp)->pNext;
36536: }
36537: *pp = pPage->pNext;
36538:
36539: h = iNew%pCache->nHash;
36540: pPage->iKey = iNew;
36541: pPage->pNext = pCache->apHash[h];
36542: pCache->apHash[h] = pPage;
36543: if( iNew>pCache->iMaxKey ){
36544: pCache->iMaxKey = iNew;
36545: }
36546:
36547: pcache1LeaveMutex(pCache->pGroup);
36548: }
36549:
36550: /*
36551: ** Implementation of the sqlite3_pcache.xTruncate method.
36552: **
36553: ** Discard all unpinned pages in the cache with a page number equal to
36554: ** or greater than parameter iLimit. Any pinned pages with a page number
36555: ** equal to or greater than iLimit are implicitly unpinned.
36556: */
36557: static void pcache1Truncate(sqlite3_pcache *p, unsigned int iLimit){
36558: PCache1 *pCache = (PCache1 *)p;
36559: pcache1EnterMutex(pCache->pGroup);
36560: if( iLimit<=pCache->iMaxKey ){
36561: pcache1TruncateUnsafe(pCache, iLimit);
36562: pCache->iMaxKey = iLimit-1;
36563: }
36564: pcache1LeaveMutex(pCache->pGroup);
36565: }
36566:
36567: /*
36568: ** Implementation of the sqlite3_pcache.xDestroy method.
36569: **
36570: ** Destroy a cache allocated using pcache1Create().
36571: */
36572: static void pcache1Destroy(sqlite3_pcache *p){
36573: PCache1 *pCache = (PCache1 *)p;
36574: PGroup *pGroup = pCache->pGroup;
36575: assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) );
36576: pcache1EnterMutex(pGroup);
36577: pcache1TruncateUnsafe(pCache, 0);
36578: assert( pGroup->nMaxPage >= pCache->nMax );
36579: pGroup->nMaxPage -= pCache->nMax;
36580: assert( pGroup->nMinPage >= pCache->nMin );
36581: pGroup->nMinPage -= pCache->nMin;
36582: pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage;
36583: pcache1EnforceMaxPage(pGroup);
36584: pcache1LeaveMutex(pGroup);
36585: sqlite3_free(pCache->apHash);
36586: sqlite3_free(pCache);
36587: }
36588:
36589: /*
36590: ** This function is called during initialization (sqlite3_initialize()) to
36591: ** install the default pluggable cache module, assuming the user has not
36592: ** already provided an alternative.
36593: */
36594: SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){
36595: static const sqlite3_pcache_methods2 defaultMethods = {
36596: 1, /* iVersion */
36597: 0, /* pArg */
36598: pcache1Init, /* xInit */
36599: pcache1Shutdown, /* xShutdown */
36600: pcache1Create, /* xCreate */
36601: pcache1Cachesize, /* xCachesize */
36602: pcache1Pagecount, /* xPagecount */
36603: pcache1Fetch, /* xFetch */
36604: pcache1Unpin, /* xUnpin */
36605: pcache1Rekey, /* xRekey */
36606: pcache1Truncate, /* xTruncate */
36607: pcache1Destroy, /* xDestroy */
36608: pcache1Shrink /* xShrink */
36609: };
36610: sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultMethods);
36611: }
36612:
36613: #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
36614: /*
36615: ** This function is called to free superfluous dynamically allocated memory
36616: ** held by the pager system. Memory in use by any SQLite pager allocated
36617: ** by the current thread may be sqlite3_free()ed.
36618: **
36619: ** nReq is the number of bytes of memory required. Once this much has
36620: ** been released, the function returns. The return value is the total number
36621: ** of bytes of memory released.
36622: */
36623: SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){
36624: int nFree = 0;
36625: assert( sqlite3_mutex_notheld(pcache1.grp.mutex) );
36626: assert( sqlite3_mutex_notheld(pcache1.mutex) );
36627: if( pcache1.pStart==0 ){
36628: PgHdr1 *p;
36629: pcache1EnterMutex(&pcache1.grp);
36630: while( (nReq<0 || nFree<nReq) && ((p=pcache1.grp.pLruTail)!=0) ){
36631: nFree += pcache1MemSize(p->page.pBuf);
36632: #ifdef SQLITE_PCACHE_SEPARATE_HEADER
36633: nFree += sqlite3MemSize(p);
36634: #endif
36635: pcache1PinPage(p);
36636: pcache1RemoveFromHash(p);
36637: pcache1FreePage(p);
36638: }
36639: pcache1LeaveMutex(&pcache1.grp);
36640: }
36641: return nFree;
36642: }
36643: #endif /* SQLITE_ENABLE_MEMORY_MANAGEMENT */
36644:
36645: #ifdef SQLITE_TEST
36646: /*
36647: ** This function is used by test procedures to inspect the internal state
36648: ** of the global cache.
36649: */
36650: SQLITE_PRIVATE void sqlite3PcacheStats(
36651: int *pnCurrent, /* OUT: Total number of pages cached */
36652: int *pnMax, /* OUT: Global maximum cache size */
36653: int *pnMin, /* OUT: Sum of PCache1.nMin for purgeable caches */
36654: int *pnRecyclable /* OUT: Total number of pages available for recycling */
36655: ){
36656: PgHdr1 *p;
36657: int nRecyclable = 0;
36658: for(p=pcache1.grp.pLruHead; p; p=p->pLruNext){
36659: nRecyclable++;
36660: }
36661: *pnCurrent = pcache1.grp.nCurrentPage;
36662: *pnMax = (int)pcache1.grp.nMaxPage;
36663: *pnMin = (int)pcache1.grp.nMinPage;
36664: *pnRecyclable = nRecyclable;
36665: }
36666: #endif
36667:
36668: /************** End of pcache1.c *********************************************/
36669: /************** Begin file rowset.c ******************************************/
36670: /*
36671: ** 2008 December 3
36672: **
36673: ** The author disclaims copyright to this source code. In place of
36674: ** a legal notice, here is a blessing:
36675: **
36676: ** May you do good and not evil.
36677: ** May you find forgiveness for yourself and forgive others.
36678: ** May you share freely, never taking more than you give.
36679: **
36680: *************************************************************************
36681: **
36682: ** This module implements an object we call a "RowSet".
36683: **
36684: ** The RowSet object is a collection of rowids. Rowids
36685: ** are inserted into the RowSet in an arbitrary order. Inserts
36686: ** can be intermixed with tests to see if a given rowid has been
36687: ** previously inserted into the RowSet.
36688: **
36689: ** After all inserts are finished, it is possible to extract the
36690: ** elements of the RowSet in sorted order. Once this extraction
36691: ** process has started, no new elements may be inserted.
36692: **
36693: ** Hence, the primitive operations for a RowSet are:
36694: **
36695: ** CREATE
36696: ** INSERT
36697: ** TEST
36698: ** SMALLEST
36699: ** DESTROY
36700: **
36701: ** The CREATE and DESTROY primitives are the constructor and destructor,
36702: ** obviously. The INSERT primitive adds a new element to the RowSet.
36703: ** TEST checks to see if an element is already in the RowSet. SMALLEST
36704: ** extracts the least value from the RowSet.
36705: **
36706: ** The INSERT primitive might allocate additional memory. Memory is
36707: ** allocated in chunks so most INSERTs do no allocation. There is an
36708: ** upper bound on the size of allocated memory. No memory is freed
36709: ** until DESTROY.
36710: **
36711: ** The TEST primitive includes a "batch" number. The TEST primitive
36712: ** will only see elements that were inserted before the last change
36713: ** in the batch number. In other words, if an INSERT occurs between
36714: ** two TESTs where the TESTs have the same batch nubmer, then the
36715: ** value added by the INSERT will not be visible to the second TEST.
36716: ** The initial batch number is zero, so if the very first TEST contains
36717: ** a non-zero batch number, it will see all prior INSERTs.
36718: **
36719: ** No INSERTs may occurs after a SMALLEST. An assertion will fail if
36720: ** that is attempted.
36721: **
36722: ** The cost of an INSERT is roughly constant. (Sometime new memory
36723: ** has to be allocated on an INSERT.) The cost of a TEST with a new
36724: ** batch number is O(NlogN) where N is the number of elements in the RowSet.
36725: ** The cost of a TEST using the same batch number is O(logN). The cost
36726: ** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST
36727: ** primitives are constant time. The cost of DESTROY is O(N).
36728: **
36729: ** There is an added cost of O(N) when switching between TEST and
36730: ** SMALLEST primitives.
36731: */
36732:
36733:
36734: /*
36735: ** Target size for allocation chunks.
36736: */
36737: #define ROWSET_ALLOCATION_SIZE 1024
36738:
36739: /*
36740: ** The number of rowset entries per allocation chunk.
36741: */
36742: #define ROWSET_ENTRY_PER_CHUNK \
36743: ((ROWSET_ALLOCATION_SIZE-8)/sizeof(struct RowSetEntry))
36744:
36745: /*
36746: ** Each entry in a RowSet is an instance of the following object.
1.2.2.1 ! misho 36747: **
! 36748: ** This same object is reused to store a linked list of trees of RowSetEntry
! 36749: ** objects. In that alternative use, pRight points to the next entry
! 36750: ** in the list, pLeft points to the tree, and v is unused. The
! 36751: ** RowSet.pForest value points to the head of this forest list.
1.2 misho 36752: */
36753: struct RowSetEntry {
36754: i64 v; /* ROWID value for this entry */
36755: struct RowSetEntry *pRight; /* Right subtree (larger entries) or list */
36756: struct RowSetEntry *pLeft; /* Left subtree (smaller entries) */
36757: };
36758:
36759: /*
36760: ** RowSetEntry objects are allocated in large chunks (instances of the
36761: ** following structure) to reduce memory allocation overhead. The
36762: ** chunks are kept on a linked list so that they can be deallocated
36763: ** when the RowSet is destroyed.
36764: */
36765: struct RowSetChunk {
36766: struct RowSetChunk *pNextChunk; /* Next chunk on list of them all */
36767: struct RowSetEntry aEntry[ROWSET_ENTRY_PER_CHUNK]; /* Allocated entries */
36768: };
36769:
36770: /*
36771: ** A RowSet in an instance of the following structure.
36772: **
36773: ** A typedef of this structure if found in sqliteInt.h.
36774: */
36775: struct RowSet {
36776: struct RowSetChunk *pChunk; /* List of all chunk allocations */
36777: sqlite3 *db; /* The database connection */
36778: struct RowSetEntry *pEntry; /* List of entries using pRight */
36779: struct RowSetEntry *pLast; /* Last entry on the pEntry list */
36780: struct RowSetEntry *pFresh; /* Source of new entry objects */
1.2.2.1 ! misho 36781: struct RowSetEntry *pForest; /* List of binary trees of entries */
1.2 misho 36782: u16 nFresh; /* Number of objects on pFresh */
1.2.2.1 ! misho 36783: u8 rsFlags; /* Various flags */
1.2 misho 36784: u8 iBatch; /* Current insert batch */
36785: };
36786:
36787: /*
1.2.2.1 ! misho 36788: ** Allowed values for RowSet.rsFlags
! 36789: */
! 36790: #define ROWSET_SORTED 0x01 /* True if RowSet.pEntry is sorted */
! 36791: #define ROWSET_NEXT 0x02 /* True if sqlite3RowSetNext() has been called */
! 36792:
! 36793: /*
1.2 misho 36794: ** Turn bulk memory into a RowSet object. N bytes of memory
36795: ** are available at pSpace. The db pointer is used as a memory context
36796: ** for any subsequent allocations that need to occur.
36797: ** Return a pointer to the new RowSet object.
36798: **
36799: ** It must be the case that N is sufficient to make a Rowset. If not
36800: ** an assertion fault occurs.
36801: **
36802: ** If N is larger than the minimum, use the surplus as an initial
36803: ** allocation of entries available to be filled.
36804: */
36805: SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3 *db, void *pSpace, unsigned int N){
36806: RowSet *p;
36807: assert( N >= ROUND8(sizeof(*p)) );
36808: p = pSpace;
36809: p->pChunk = 0;
36810: p->db = db;
36811: p->pEntry = 0;
36812: p->pLast = 0;
1.2.2.1 ! misho 36813: p->pForest = 0;
1.2 misho 36814: p->pFresh = (struct RowSetEntry*)(ROUND8(sizeof(*p)) + (char*)p);
36815: p->nFresh = (u16)((N - ROUND8(sizeof(*p)))/sizeof(struct RowSetEntry));
1.2.2.1 ! misho 36816: p->rsFlags = ROWSET_SORTED;
1.2 misho 36817: p->iBatch = 0;
36818: return p;
36819: }
36820:
36821: /*
36822: ** Deallocate all chunks from a RowSet. This frees all memory that
36823: ** the RowSet has allocated over its lifetime. This routine is
36824: ** the destructor for the RowSet.
36825: */
36826: SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){
36827: struct RowSetChunk *pChunk, *pNextChunk;
36828: for(pChunk=p->pChunk; pChunk; pChunk = pNextChunk){
36829: pNextChunk = pChunk->pNextChunk;
36830: sqlite3DbFree(p->db, pChunk);
36831: }
36832: p->pChunk = 0;
36833: p->nFresh = 0;
36834: p->pEntry = 0;
36835: p->pLast = 0;
1.2.2.1 ! misho 36836: p->pForest = 0;
! 36837: p->rsFlags = ROWSET_SORTED;
1.2 misho 36838: }
36839:
36840: /*
1.2.2.1 ! misho 36841: ** Allocate a new RowSetEntry object that is associated with the
! 36842: ** given RowSet. Return a pointer to the new and completely uninitialized
! 36843: ** objected.
1.2 misho 36844: **
1.2.2.1 ! misho 36845: ** In an OOM situation, the RowSet.db->mallocFailed flag is set and this
! 36846: ** routine returns NULL.
1.2 misho 36847: */
1.2.2.1 ! misho 36848: static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){
1.2 misho 36849: assert( p!=0 );
36850: if( p->nFresh==0 ){
36851: struct RowSetChunk *pNew;
36852: pNew = sqlite3DbMallocRaw(p->db, sizeof(*pNew));
36853: if( pNew==0 ){
1.2.2.1 ! misho 36854: return 0;
1.2 misho 36855: }
36856: pNew->pNextChunk = p->pChunk;
36857: p->pChunk = pNew;
36858: p->pFresh = pNew->aEntry;
36859: p->nFresh = ROWSET_ENTRY_PER_CHUNK;
36860: }
36861: p->nFresh--;
1.2.2.1 ! misho 36862: return p->pFresh++;
! 36863: }
! 36864:
! 36865: /*
! 36866: ** Insert a new value into a RowSet.
! 36867: **
! 36868: ** The mallocFailed flag of the database connection is set if a
! 36869: ** memory allocation fails.
! 36870: */
! 36871: SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){
! 36872: struct RowSetEntry *pEntry; /* The new entry */
! 36873: struct RowSetEntry *pLast; /* The last prior entry */
! 36874:
! 36875: /* This routine is never called after sqlite3RowSetNext() */
! 36876: assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 );
! 36877:
! 36878: pEntry = rowSetEntryAlloc(p);
! 36879: if( pEntry==0 ) return;
1.2 misho 36880: pEntry->v = rowid;
36881: pEntry->pRight = 0;
36882: pLast = p->pLast;
36883: if( pLast ){
1.2.2.1 ! misho 36884: if( (p->rsFlags & ROWSET_SORTED)!=0 && rowid<=pLast->v ){
! 36885: p->rsFlags &= ~ROWSET_SORTED;
1.2 misho 36886: }
36887: pLast->pRight = pEntry;
36888: }else{
36889: p->pEntry = pEntry;
36890: }
36891: p->pLast = pEntry;
36892: }
36893:
36894: /*
36895: ** Merge two lists of RowSetEntry objects. Remove duplicates.
36896: **
36897: ** The input lists are connected via pRight pointers and are
36898: ** assumed to each already be in sorted order.
36899: */
1.2.2.1 ! misho 36900: static struct RowSetEntry *rowSetEntryMerge(
1.2 misho 36901: struct RowSetEntry *pA, /* First sorted list to be merged */
36902: struct RowSetEntry *pB /* Second sorted list to be merged */
36903: ){
36904: struct RowSetEntry head;
36905: struct RowSetEntry *pTail;
36906:
36907: pTail = &head;
36908: while( pA && pB ){
36909: assert( pA->pRight==0 || pA->v<=pA->pRight->v );
36910: assert( pB->pRight==0 || pB->v<=pB->pRight->v );
36911: if( pA->v<pB->v ){
36912: pTail->pRight = pA;
36913: pA = pA->pRight;
36914: pTail = pTail->pRight;
36915: }else if( pB->v<pA->v ){
36916: pTail->pRight = pB;
36917: pB = pB->pRight;
36918: pTail = pTail->pRight;
36919: }else{
36920: pA = pA->pRight;
36921: }
36922: }
36923: if( pA ){
36924: assert( pA->pRight==0 || pA->v<=pA->pRight->v );
36925: pTail->pRight = pA;
36926: }else{
36927: assert( pB==0 || pB->pRight==0 || pB->v<=pB->pRight->v );
36928: pTail->pRight = pB;
36929: }
36930: return head.pRight;
36931: }
36932:
36933: /*
1.2.2.1 ! misho 36934: ** Sort all elements on the list of RowSetEntry objects into order of
! 36935: ** increasing v.
1.2 misho 36936: */
1.2.2.1 ! misho 36937: static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){
1.2 misho 36938: unsigned int i;
1.2.2.1 ! misho 36939: struct RowSetEntry *pNext, *aBucket[40];
1.2 misho 36940:
36941: memset(aBucket, 0, sizeof(aBucket));
1.2.2.1 ! misho 36942: while( pIn ){
! 36943: pNext = pIn->pRight;
! 36944: pIn->pRight = 0;
1.2 misho 36945: for(i=0; aBucket[i]; i++){
1.2.2.1 ! misho 36946: pIn = rowSetEntryMerge(aBucket[i], pIn);
1.2 misho 36947: aBucket[i] = 0;
36948: }
1.2.2.1 ! misho 36949: aBucket[i] = pIn;
! 36950: pIn = pNext;
1.2 misho 36951: }
1.2.2.1 ! misho 36952: pIn = 0;
1.2 misho 36953: for(i=0; i<sizeof(aBucket)/sizeof(aBucket[0]); i++){
1.2.2.1 ! misho 36954: pIn = rowSetEntryMerge(pIn, aBucket[i]);
1.2 misho 36955: }
1.2.2.1 ! misho 36956: return pIn;
1.2 misho 36957: }
36958:
36959:
36960: /*
36961: ** The input, pIn, is a binary tree (or subtree) of RowSetEntry objects.
36962: ** Convert this tree into a linked list connected by the pRight pointers
36963: ** and return pointers to the first and last elements of the new list.
36964: */
36965: static void rowSetTreeToList(
36966: struct RowSetEntry *pIn, /* Root of the input tree */
36967: struct RowSetEntry **ppFirst, /* Write head of the output list here */
36968: struct RowSetEntry **ppLast /* Write tail of the output list here */
36969: ){
36970: assert( pIn!=0 );
36971: if( pIn->pLeft ){
36972: struct RowSetEntry *p;
36973: rowSetTreeToList(pIn->pLeft, ppFirst, &p);
36974: p->pRight = pIn;
36975: }else{
36976: *ppFirst = pIn;
36977: }
36978: if( pIn->pRight ){
36979: rowSetTreeToList(pIn->pRight, &pIn->pRight, ppLast);
36980: }else{
36981: *ppLast = pIn;
36982: }
36983: assert( (*ppLast)->pRight==0 );
36984: }
36985:
36986:
36987: /*
36988: ** Convert a sorted list of elements (connected by pRight) into a binary
36989: ** tree with depth of iDepth. A depth of 1 means the tree contains a single
36990: ** node taken from the head of *ppList. A depth of 2 means a tree with
36991: ** three nodes. And so forth.
36992: **
36993: ** Use as many entries from the input list as required and update the
36994: ** *ppList to point to the unused elements of the list. If the input
36995: ** list contains too few elements, then construct an incomplete tree
36996: ** and leave *ppList set to NULL.
36997: **
36998: ** Return a pointer to the root of the constructed binary tree.
36999: */
37000: static struct RowSetEntry *rowSetNDeepTree(
37001: struct RowSetEntry **ppList,
37002: int iDepth
37003: ){
37004: struct RowSetEntry *p; /* Root of the new tree */
37005: struct RowSetEntry *pLeft; /* Left subtree */
37006: if( *ppList==0 ){
37007: return 0;
37008: }
37009: if( iDepth==1 ){
37010: p = *ppList;
37011: *ppList = p->pRight;
37012: p->pLeft = p->pRight = 0;
37013: return p;
37014: }
37015: pLeft = rowSetNDeepTree(ppList, iDepth-1);
37016: p = *ppList;
37017: if( p==0 ){
37018: return pLeft;
37019: }
37020: p->pLeft = pLeft;
37021: *ppList = p->pRight;
37022: p->pRight = rowSetNDeepTree(ppList, iDepth-1);
37023: return p;
37024: }
37025:
37026: /*
37027: ** Convert a sorted list of elements into a binary tree. Make the tree
37028: ** as deep as it needs to be in order to contain the entire list.
37029: */
37030: static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){
37031: int iDepth; /* Depth of the tree so far */
37032: struct RowSetEntry *p; /* Current tree root */
37033: struct RowSetEntry *pLeft; /* Left subtree */
37034:
37035: assert( pList!=0 );
37036: p = pList;
37037: pList = p->pRight;
37038: p->pLeft = p->pRight = 0;
37039: for(iDepth=1; pList; iDepth++){
37040: pLeft = p;
37041: p = pList;
37042: pList = p->pRight;
37043: p->pLeft = pLeft;
37044: p->pRight = rowSetNDeepTree(&pList, iDepth);
37045: }
37046: return p;
37047: }
37048:
37049: /*
1.2.2.1 ! misho 37050: ** Take all the entries on p->pEntry and on the trees in p->pForest and
! 37051: ** sort them all together into one big ordered list on p->pEntry.
! 37052: **
! 37053: ** This routine should only be called once in the life of a RowSet.
1.2 misho 37054: */
37055: static void rowSetToList(RowSet *p){
1.2.2.1 ! misho 37056:
! 37057: /* This routine is called only once */
! 37058: assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 );
! 37059:
! 37060: if( (p->rsFlags & ROWSET_SORTED)==0 ){
! 37061: p->pEntry = rowSetEntrySort(p->pEntry);
1.2 misho 37062: }
1.2.2.1 ! misho 37063:
! 37064: /* While this module could theoretically support it, sqlite3RowSetNext()
! 37065: ** is never called after sqlite3RowSetText() for the same RowSet. So
! 37066: ** there is never a forest to deal with. Should this change, simply
! 37067: ** remove the assert() and the #if 0. */
! 37068: assert( p->pForest==0 );
! 37069: #if 0
! 37070: while( p->pForest ){
! 37071: struct RowSetEntry *pTree = p->pForest->pLeft;
! 37072: if( pTree ){
! 37073: struct RowSetEntry *pHead, *pTail;
! 37074: rowSetTreeToList(pTree, &pHead, &pTail);
! 37075: p->pEntry = rowSetEntryMerge(p->pEntry, pHead);
! 37076: }
! 37077: p->pForest = p->pForest->pRight;
1.2 misho 37078: }
1.2.2.1 ! misho 37079: #endif
! 37080: p->rsFlags |= ROWSET_NEXT; /* Verify this routine is never called again */
1.2 misho 37081: }
37082:
37083: /*
37084: ** Extract the smallest element from the RowSet.
37085: ** Write the element into *pRowid. Return 1 on success. Return
37086: ** 0 if the RowSet is already empty.
37087: **
37088: ** After this routine has been called, the sqlite3RowSetInsert()
37089: ** routine may not be called again.
37090: */
37091: SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){
1.2.2.1 ! misho 37092: assert( p!=0 );
! 37093:
! 37094: /* Merge the forest into a single sorted list on first call */
! 37095: if( (p->rsFlags & ROWSET_NEXT)==0 ) rowSetToList(p);
! 37096:
! 37097: /* Return the next entry on the list */
1.2 misho 37098: if( p->pEntry ){
37099: *pRowid = p->pEntry->v;
37100: p->pEntry = p->pEntry->pRight;
37101: if( p->pEntry==0 ){
37102: sqlite3RowSetClear(p);
37103: }
37104: return 1;
37105: }else{
37106: return 0;
37107: }
37108: }
37109:
37110: /*
1.2.2.1 ! misho 37111: ** Check to see if element iRowid was inserted into the rowset as
1.2 misho 37112: ** part of any insert batch prior to iBatch. Return 1 or 0.
1.2.2.1 ! misho 37113: **
! 37114: ** If this is the first test of a new batch and if there exist entires
! 37115: ** on pRowSet->pEntry, then sort those entires into the forest at
! 37116: ** pRowSet->pForest so that they can be tested.
1.2 misho 37117: */
37118: SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, u8 iBatch, sqlite3_int64 iRowid){
1.2.2.1 ! misho 37119: struct RowSetEntry *p, *pTree;
! 37120:
! 37121: /* This routine is never called after sqlite3RowSetNext() */
! 37122: assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 );
! 37123:
! 37124: /* Sort entries into the forest on the first test of a new batch
! 37125: */
1.2 misho 37126: if( iBatch!=pRowSet->iBatch ){
1.2.2.1 ! misho 37127: p = pRowSet->pEntry;
! 37128: if( p ){
! 37129: struct RowSetEntry **ppPrevTree = &pRowSet->pForest;
! 37130: if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){
! 37131: p = rowSetEntrySort(p);
! 37132: }
! 37133: for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){
! 37134: ppPrevTree = &pTree->pRight;
! 37135: if( pTree->pLeft==0 ){
! 37136: pTree->pLeft = rowSetListToTree(p);
! 37137: break;
! 37138: }else{
! 37139: struct RowSetEntry *pAux, *pTail;
! 37140: rowSetTreeToList(pTree->pLeft, &pAux, &pTail);
! 37141: pTree->pLeft = 0;
! 37142: p = rowSetEntryMerge(pAux, p);
! 37143: }
! 37144: }
! 37145: if( pTree==0 ){
! 37146: *ppPrevTree = pTree = rowSetEntryAlloc(pRowSet);
! 37147: if( pTree ){
! 37148: pTree->v = 0;
! 37149: pTree->pRight = 0;
! 37150: pTree->pLeft = rowSetListToTree(p);
! 37151: }
! 37152: }
1.2 misho 37153: pRowSet->pEntry = 0;
37154: pRowSet->pLast = 0;
1.2.2.1 ! misho 37155: pRowSet->rsFlags |= ROWSET_SORTED;
1.2 misho 37156: }
37157: pRowSet->iBatch = iBatch;
37158: }
1.2.2.1 ! misho 37159:
! 37160: /* Test to see if the iRowid value appears anywhere in the forest.
! 37161: ** Return 1 if it does and 0 if not.
! 37162: */
! 37163: for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){
! 37164: p = pTree->pLeft;
! 37165: while( p ){
! 37166: if( p->v<iRowid ){
! 37167: p = p->pRight;
! 37168: }else if( p->v>iRowid ){
! 37169: p = p->pLeft;
! 37170: }else{
! 37171: return 1;
! 37172: }
1.2 misho 37173: }
37174: }
37175: return 0;
37176: }
37177:
37178: /************** End of rowset.c **********************************************/
37179: /************** Begin file pager.c *******************************************/
37180: /*
37181: ** 2001 September 15
37182: **
37183: ** The author disclaims copyright to this source code. In place of
37184: ** a legal notice, here is a blessing:
37185: **
37186: ** May you do good and not evil.
37187: ** May you find forgiveness for yourself and forgive others.
37188: ** May you share freely, never taking more than you give.
37189: **
37190: *************************************************************************
37191: ** This is the implementation of the page cache subsystem or "pager".
37192: **
37193: ** The pager is used to access a database disk file. It implements
37194: ** atomic commit and rollback through the use of a journal file that
37195: ** is separate from the database file. The pager also implements file
37196: ** locking to prevent two processes from writing the same database
37197: ** file simultaneously, or one process from reading the database while
37198: ** another is writing.
37199: */
37200: #ifndef SQLITE_OMIT_DISKIO
37201: /************** Include wal.h in the middle of pager.c ***********************/
37202: /************** Begin file wal.h *********************************************/
37203: /*
37204: ** 2010 February 1
37205: **
37206: ** The author disclaims copyright to this source code. In place of
37207: ** a legal notice, here is a blessing:
37208: **
37209: ** May you do good and not evil.
37210: ** May you find forgiveness for yourself and forgive others.
37211: ** May you share freely, never taking more than you give.
37212: **
37213: *************************************************************************
37214: ** This header file defines the interface to the write-ahead logging
37215: ** system. Refer to the comments below and the header comment attached to
37216: ** the implementation of each function in log.c for further details.
37217: */
37218:
37219: #ifndef _WAL_H_
37220: #define _WAL_H_
37221:
37222:
37223: /* Additional values that can be added to the sync_flags argument of
37224: ** sqlite3WalFrames():
37225: */
37226: #define WAL_SYNC_TRANSACTIONS 0x20 /* Sync at the end of each transaction */
37227: #define SQLITE_SYNC_MASK 0x13 /* Mask off the SQLITE_SYNC_* values */
37228:
37229: #ifdef SQLITE_OMIT_WAL
37230: # define sqlite3WalOpen(x,y,z) 0
37231: # define sqlite3WalLimit(x,y)
37232: # define sqlite3WalClose(w,x,y,z) 0
37233: # define sqlite3WalBeginReadTransaction(y,z) 0
37234: # define sqlite3WalEndReadTransaction(z)
37235: # define sqlite3WalRead(v,w,x,y,z) 0
37236: # define sqlite3WalDbsize(y) 0
37237: # define sqlite3WalBeginWriteTransaction(y) 0
37238: # define sqlite3WalEndWriteTransaction(x) 0
37239: # define sqlite3WalUndo(x,y,z) 0
37240: # define sqlite3WalSavepoint(y,z)
37241: # define sqlite3WalSavepointUndo(y,z) 0
37242: # define sqlite3WalFrames(u,v,w,x,y,z) 0
37243: # define sqlite3WalCheckpoint(r,s,t,u,v,w,x,y,z) 0
37244: # define sqlite3WalCallback(z) 0
37245: # define sqlite3WalExclusiveMode(y,z) 0
37246: # define sqlite3WalHeapMemory(z) 0
1.2.2.1 ! misho 37247: # define sqlite3WalFramesize(z) 0
1.2 misho 37248: #else
37249:
37250: #define WAL_SAVEPOINT_NDATA 4
37251:
37252: /* Connection to a write-ahead log (WAL) file.
37253: ** There is one object of this type for each pager.
37254: */
37255: typedef struct Wal Wal;
37256:
37257: /* Open and close a connection to a write-ahead log. */
37258: SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**);
37259: SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *);
37260:
37261: /* Set the limiting size of a WAL file. */
37262: SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64);
37263:
37264: /* Used by readers to open (lock) and close (unlock) a snapshot. A
37265: ** snapshot is like a read-transaction. It is the state of the database
37266: ** at an instant in time. sqlite3WalOpenSnapshot gets a read lock and
37267: ** preserves the current state even if the other threads or processes
37268: ** write to or checkpoint the WAL. sqlite3WalCloseSnapshot() closes the
37269: ** transaction and releases the lock.
37270: */
37271: SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *);
37272: SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal);
37273:
37274: /* Read a page from the write-ahead log, if it is present. */
37275: SQLITE_PRIVATE int sqlite3WalRead(Wal *pWal, Pgno pgno, int *pInWal, int nOut, u8 *pOut);
37276:
37277: /* If the WAL is not empty, return the size of the database. */
37278: SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal);
37279:
37280: /* Obtain or release the WRITER lock. */
37281: SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal);
37282: SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal);
37283:
37284: /* Undo any frames written (but not committed) to the log */
37285: SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx);
37286:
37287: /* Return an integer that records the current (uncommitted) write
37288: ** position in the WAL */
37289: SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData);
37290:
37291: /* Move the write position of the WAL back to iFrame. Called in
37292: ** response to a ROLLBACK TO command. */
37293: SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData);
37294:
37295: /* Write a frame or frames to the log. */
37296: SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int);
37297:
37298: /* Copy pages from the log to the database file */
37299: SQLITE_PRIVATE int sqlite3WalCheckpoint(
37300: Wal *pWal, /* Write-ahead log connection */
37301: int eMode, /* One of PASSIVE, FULL and RESTART */
37302: int (*xBusy)(void*), /* Function to call when busy */
37303: void *pBusyArg, /* Context argument for xBusyHandler */
37304: int sync_flags, /* Flags to sync db file with (or 0) */
37305: int nBuf, /* Size of buffer nBuf */
37306: u8 *zBuf, /* Temporary buffer to use */
37307: int *pnLog, /* OUT: Number of frames in WAL */
37308: int *pnCkpt /* OUT: Number of backfilled frames in WAL */
37309: );
37310:
37311: /* Return the value to pass to a sqlite3_wal_hook callback, the
37312: ** number of frames in the WAL at the point of the last commit since
37313: ** sqlite3WalCallback() was called. If no commits have occurred since
37314: ** the last call, then return 0.
37315: */
37316: SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal);
37317:
37318: /* Tell the wal layer that an EXCLUSIVE lock has been obtained (or released)
37319: ** by the pager layer on the database file.
37320: */
37321: SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op);
37322:
37323: /* Return true if the argument is non-NULL and the WAL module is using
37324: ** heap-memory for the wal-index. Otherwise, if the argument is NULL or the
37325: ** WAL module is using shared-memory, return false.
37326: */
37327: SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal);
37328:
1.2.2.1 ! misho 37329: #ifdef SQLITE_ENABLE_ZIPVFS
! 37330: /* If the WAL file is not empty, return the number of bytes of content
! 37331: ** stored in each frame (i.e. the db page-size when the WAL was created).
! 37332: */
! 37333: SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal);
! 37334: #endif
! 37335:
1.2 misho 37336: #endif /* ifndef SQLITE_OMIT_WAL */
37337: #endif /* _WAL_H_ */
37338:
37339: /************** End of wal.h *************************************************/
37340: /************** Continuing where we left off in pager.c **********************/
37341:
37342:
37343: /******************* NOTES ON THE DESIGN OF THE PAGER ************************
37344: **
37345: ** This comment block describes invariants that hold when using a rollback
37346: ** journal. These invariants do not apply for journal_mode=WAL,
37347: ** journal_mode=MEMORY, or journal_mode=OFF.
37348: **
37349: ** Within this comment block, a page is deemed to have been synced
37350: ** automatically as soon as it is written when PRAGMA synchronous=OFF.
37351: ** Otherwise, the page is not synced until the xSync method of the VFS
37352: ** is called successfully on the file containing the page.
37353: **
37354: ** Definition: A page of the database file is said to be "overwriteable" if
37355: ** one or more of the following are true about the page:
37356: **
37357: ** (a) The original content of the page as it was at the beginning of
37358: ** the transaction has been written into the rollback journal and
37359: ** synced.
37360: **
37361: ** (b) The page was a freelist leaf page at the start of the transaction.
37362: **
37363: ** (c) The page number is greater than the largest page that existed in
37364: ** the database file at the start of the transaction.
37365: **
37366: ** (1) A page of the database file is never overwritten unless one of the
37367: ** following are true:
37368: **
37369: ** (a) The page and all other pages on the same sector are overwriteable.
37370: **
37371: ** (b) The atomic page write optimization is enabled, and the entire
37372: ** transaction other than the update of the transaction sequence
37373: ** number consists of a single page change.
37374: **
37375: ** (2) The content of a page written into the rollback journal exactly matches
37376: ** both the content in the database when the rollback journal was written
37377: ** and the content in the database at the beginning of the current
37378: ** transaction.
37379: **
37380: ** (3) Writes to the database file are an integer multiple of the page size
37381: ** in length and are aligned on a page boundary.
37382: **
37383: ** (4) Reads from the database file are either aligned on a page boundary and
37384: ** an integer multiple of the page size in length or are taken from the
37385: ** first 100 bytes of the database file.
37386: **
37387: ** (5) All writes to the database file are synced prior to the rollback journal
37388: ** being deleted, truncated, or zeroed.
37389: **
37390: ** (6) If a master journal file is used, then all writes to the database file
37391: ** are synced prior to the master journal being deleted.
37392: **
37393: ** Definition: Two databases (or the same database at two points it time)
37394: ** are said to be "logically equivalent" if they give the same answer to
1.2.2.1 ! misho 37395: ** all queries. Note in particular the content of freelist leaf
1.2 misho 37396: ** pages can be changed arbitarily without effecting the logical equivalence
37397: ** of the database.
37398: **
37399: ** (7) At any time, if any subset, including the empty set and the total set,
37400: ** of the unsynced changes to a rollback journal are removed and the
37401: ** journal is rolled back, the resulting database file will be logical
37402: ** equivalent to the database file at the beginning of the transaction.
37403: **
37404: ** (8) When a transaction is rolled back, the xTruncate method of the VFS
37405: ** is called to restore the database file to the same size it was at
37406: ** the beginning of the transaction. (In some VFSes, the xTruncate
37407: ** method is a no-op, but that does not change the fact the SQLite will
37408: ** invoke it.)
37409: **
37410: ** (9) Whenever the database file is modified, at least one bit in the range
37411: ** of bytes from 24 through 39 inclusive will be changed prior to releasing
37412: ** the EXCLUSIVE lock, thus signaling other connections on the same
37413: ** database to flush their caches.
37414: **
37415: ** (10) The pattern of bits in bytes 24 through 39 shall not repeat in less
37416: ** than one billion transactions.
37417: **
37418: ** (11) A database file is well-formed at the beginning and at the conclusion
37419: ** of every transaction.
37420: **
37421: ** (12) An EXCLUSIVE lock is held on the database file when writing to
37422: ** the database file.
37423: **
37424: ** (13) A SHARED lock is held on the database file while reading any
37425: ** content out of the database file.
37426: **
37427: ******************************************************************************/
37428:
37429: /*
37430: ** Macros for troubleshooting. Normally turned off
37431: */
37432: #if 0
37433: int sqlite3PagerTrace=1; /* True to enable tracing */
37434: #define sqlite3DebugPrintf printf
37435: #define PAGERTRACE(X) if( sqlite3PagerTrace ){ sqlite3DebugPrintf X; }
37436: #else
37437: #define PAGERTRACE(X)
37438: #endif
37439:
37440: /*
37441: ** The following two macros are used within the PAGERTRACE() macros above
37442: ** to print out file-descriptors.
37443: **
37444: ** PAGERID() takes a pointer to a Pager struct as its argument. The
37445: ** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file
37446: ** struct as its argument.
37447: */
37448: #define PAGERID(p) ((int)(p->fd))
37449: #define FILEHANDLEID(fd) ((int)fd)
37450:
37451: /*
37452: ** The Pager.eState variable stores the current 'state' of a pager. A
37453: ** pager may be in any one of the seven states shown in the following
37454: ** state diagram.
37455: **
37456: ** OPEN <------+------+
37457: ** | | |
37458: ** V | |
37459: ** +---------> READER-------+ |
37460: ** | | |
37461: ** | V |
37462: ** |<-------WRITER_LOCKED------> ERROR
37463: ** | | ^
37464: ** | V |
37465: ** |<------WRITER_CACHEMOD-------->|
37466: ** | | |
37467: ** | V |
37468: ** |<-------WRITER_DBMOD---------->|
37469: ** | | |
37470: ** | V |
37471: ** +<------WRITER_FINISHED-------->+
37472: **
37473: **
37474: ** List of state transitions and the C [function] that performs each:
37475: **
37476: ** OPEN -> READER [sqlite3PagerSharedLock]
37477: ** READER -> OPEN [pager_unlock]
37478: **
37479: ** READER -> WRITER_LOCKED [sqlite3PagerBegin]
37480: ** WRITER_LOCKED -> WRITER_CACHEMOD [pager_open_journal]
37481: ** WRITER_CACHEMOD -> WRITER_DBMOD [syncJournal]
37482: ** WRITER_DBMOD -> WRITER_FINISHED [sqlite3PagerCommitPhaseOne]
37483: ** WRITER_*** -> READER [pager_end_transaction]
37484: **
37485: ** WRITER_*** -> ERROR [pager_error]
37486: ** ERROR -> OPEN [pager_unlock]
37487: **
37488: **
37489: ** OPEN:
37490: **
37491: ** The pager starts up in this state. Nothing is guaranteed in this
37492: ** state - the file may or may not be locked and the database size is
37493: ** unknown. The database may not be read or written.
37494: **
37495: ** * No read or write transaction is active.
37496: ** * Any lock, or no lock at all, may be held on the database file.
37497: ** * The dbSize, dbOrigSize and dbFileSize variables may not be trusted.
37498: **
37499: ** READER:
37500: **
37501: ** In this state all the requirements for reading the database in
37502: ** rollback (non-WAL) mode are met. Unless the pager is (or recently
37503: ** was) in exclusive-locking mode, a user-level read transaction is
37504: ** open. The database size is known in this state.
37505: **
37506: ** A connection running with locking_mode=normal enters this state when
37507: ** it opens a read-transaction on the database and returns to state
37508: ** OPEN after the read-transaction is completed. However a connection
37509: ** running in locking_mode=exclusive (including temp databases) remains in
37510: ** this state even after the read-transaction is closed. The only way
37511: ** a locking_mode=exclusive connection can transition from READER to OPEN
37512: ** is via the ERROR state (see below).
37513: **
37514: ** * A read transaction may be active (but a write-transaction cannot).
37515: ** * A SHARED or greater lock is held on the database file.
37516: ** * The dbSize variable may be trusted (even if a user-level read
37517: ** transaction is not active). The dbOrigSize and dbFileSize variables
37518: ** may not be trusted at this point.
37519: ** * If the database is a WAL database, then the WAL connection is open.
37520: ** * Even if a read-transaction is not open, it is guaranteed that
37521: ** there is no hot-journal in the file-system.
37522: **
37523: ** WRITER_LOCKED:
37524: **
37525: ** The pager moves to this state from READER when a write-transaction
37526: ** is first opened on the database. In WRITER_LOCKED state, all locks
37527: ** required to start a write-transaction are held, but no actual
37528: ** modifications to the cache or database have taken place.
37529: **
37530: ** In rollback mode, a RESERVED or (if the transaction was opened with
37531: ** BEGIN EXCLUSIVE) EXCLUSIVE lock is obtained on the database file when
37532: ** moving to this state, but the journal file is not written to or opened
37533: ** to in this state. If the transaction is committed or rolled back while
37534: ** in WRITER_LOCKED state, all that is required is to unlock the database
37535: ** file.
37536: **
37537: ** IN WAL mode, WalBeginWriteTransaction() is called to lock the log file.
37538: ** If the connection is running with locking_mode=exclusive, an attempt
37539: ** is made to obtain an EXCLUSIVE lock on the database file.
37540: **
37541: ** * A write transaction is active.
37542: ** * If the connection is open in rollback-mode, a RESERVED or greater
37543: ** lock is held on the database file.
37544: ** * If the connection is open in WAL-mode, a WAL write transaction
37545: ** is open (i.e. sqlite3WalBeginWriteTransaction() has been successfully
37546: ** called).
37547: ** * The dbSize, dbOrigSize and dbFileSize variables are all valid.
37548: ** * The contents of the pager cache have not been modified.
37549: ** * The journal file may or may not be open.
37550: ** * Nothing (not even the first header) has been written to the journal.
37551: **
37552: ** WRITER_CACHEMOD:
37553: **
37554: ** A pager moves from WRITER_LOCKED state to this state when a page is
37555: ** first modified by the upper layer. In rollback mode the journal file
37556: ** is opened (if it is not already open) and a header written to the
37557: ** start of it. The database file on disk has not been modified.
37558: **
37559: ** * A write transaction is active.
37560: ** * A RESERVED or greater lock is held on the database file.
37561: ** * The journal file is open and the first header has been written
37562: ** to it, but the header has not been synced to disk.
37563: ** * The contents of the page cache have been modified.
37564: **
37565: ** WRITER_DBMOD:
37566: **
37567: ** The pager transitions from WRITER_CACHEMOD into WRITER_DBMOD state
37568: ** when it modifies the contents of the database file. WAL connections
37569: ** never enter this state (since they do not modify the database file,
37570: ** just the log file).
37571: **
37572: ** * A write transaction is active.
37573: ** * An EXCLUSIVE or greater lock is held on the database file.
37574: ** * The journal file is open and the first header has been written
37575: ** and synced to disk.
37576: ** * The contents of the page cache have been modified (and possibly
37577: ** written to disk).
37578: **
37579: ** WRITER_FINISHED:
37580: **
37581: ** It is not possible for a WAL connection to enter this state.
37582: **
37583: ** A rollback-mode pager changes to WRITER_FINISHED state from WRITER_DBMOD
37584: ** state after the entire transaction has been successfully written into the
37585: ** database file. In this state the transaction may be committed simply
37586: ** by finalizing the journal file. Once in WRITER_FINISHED state, it is
37587: ** not possible to modify the database further. At this point, the upper
37588: ** layer must either commit or rollback the transaction.
37589: **
37590: ** * A write transaction is active.
37591: ** * An EXCLUSIVE or greater lock is held on the database file.
37592: ** * All writing and syncing of journal and database data has finished.
37593: ** If no error occured, all that remains is to finalize the journal to
37594: ** commit the transaction. If an error did occur, the caller will need
37595: ** to rollback the transaction.
37596: **
37597: ** ERROR:
37598: **
37599: ** The ERROR state is entered when an IO or disk-full error (including
37600: ** SQLITE_IOERR_NOMEM) occurs at a point in the code that makes it
37601: ** difficult to be sure that the in-memory pager state (cache contents,
37602: ** db size etc.) are consistent with the contents of the file-system.
37603: **
37604: ** Temporary pager files may enter the ERROR state, but in-memory pagers
37605: ** cannot.
37606: **
37607: ** For example, if an IO error occurs while performing a rollback,
37608: ** the contents of the page-cache may be left in an inconsistent state.
37609: ** At this point it would be dangerous to change back to READER state
37610: ** (as usually happens after a rollback). Any subsequent readers might
37611: ** report database corruption (due to the inconsistent cache), and if
37612: ** they upgrade to writers, they may inadvertently corrupt the database
37613: ** file. To avoid this hazard, the pager switches into the ERROR state
37614: ** instead of READER following such an error.
37615: **
37616: ** Once it has entered the ERROR state, any attempt to use the pager
37617: ** to read or write data returns an error. Eventually, once all
37618: ** outstanding transactions have been abandoned, the pager is able to
37619: ** transition back to OPEN state, discarding the contents of the
37620: ** page-cache and any other in-memory state at the same time. Everything
37621: ** is reloaded from disk (and, if necessary, hot-journal rollback peformed)
37622: ** when a read-transaction is next opened on the pager (transitioning
37623: ** the pager into READER state). At that point the system has recovered
37624: ** from the error.
37625: **
37626: ** Specifically, the pager jumps into the ERROR state if:
37627: **
37628: ** 1. An error occurs while attempting a rollback. This happens in
37629: ** function sqlite3PagerRollback().
37630: **
37631: ** 2. An error occurs while attempting to finalize a journal file
37632: ** following a commit in function sqlite3PagerCommitPhaseTwo().
37633: **
37634: ** 3. An error occurs while attempting to write to the journal or
37635: ** database file in function pagerStress() in order to free up
37636: ** memory.
37637: **
37638: ** In other cases, the error is returned to the b-tree layer. The b-tree
37639: ** layer then attempts a rollback operation. If the error condition
37640: ** persists, the pager enters the ERROR state via condition (1) above.
37641: **
37642: ** Condition (3) is necessary because it can be triggered by a read-only
37643: ** statement executed within a transaction. In this case, if the error
37644: ** code were simply returned to the user, the b-tree layer would not
37645: ** automatically attempt a rollback, as it assumes that an error in a
37646: ** read-only statement cannot leave the pager in an internally inconsistent
37647: ** state.
37648: **
37649: ** * The Pager.errCode variable is set to something other than SQLITE_OK.
37650: ** * There are one or more outstanding references to pages (after the
37651: ** last reference is dropped the pager should move back to OPEN state).
37652: ** * The pager is not an in-memory pager.
37653: **
37654: **
37655: ** Notes:
37656: **
37657: ** * A pager is never in WRITER_DBMOD or WRITER_FINISHED state if the
37658: ** connection is open in WAL mode. A WAL connection is always in one
37659: ** of the first four states.
37660: **
37661: ** * Normally, a connection open in exclusive mode is never in PAGER_OPEN
37662: ** state. There are two exceptions: immediately after exclusive-mode has
37663: ** been turned on (and before any read or write transactions are
37664: ** executed), and when the pager is leaving the "error state".
37665: **
37666: ** * See also: assert_pager_state().
37667: */
37668: #define PAGER_OPEN 0
37669: #define PAGER_READER 1
37670: #define PAGER_WRITER_LOCKED 2
37671: #define PAGER_WRITER_CACHEMOD 3
37672: #define PAGER_WRITER_DBMOD 4
37673: #define PAGER_WRITER_FINISHED 5
37674: #define PAGER_ERROR 6
37675:
37676: /*
37677: ** The Pager.eLock variable is almost always set to one of the
37678: ** following locking-states, according to the lock currently held on
37679: ** the database file: NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
37680: ** This variable is kept up to date as locks are taken and released by
37681: ** the pagerLockDb() and pagerUnlockDb() wrappers.
37682: **
37683: ** If the VFS xLock() or xUnlock() returns an error other than SQLITE_BUSY
37684: ** (i.e. one of the SQLITE_IOERR subtypes), it is not clear whether or not
37685: ** the operation was successful. In these circumstances pagerLockDb() and
37686: ** pagerUnlockDb() take a conservative approach - eLock is always updated
37687: ** when unlocking the file, and only updated when locking the file if the
37688: ** VFS call is successful. This way, the Pager.eLock variable may be set
37689: ** to a less exclusive (lower) value than the lock that is actually held
37690: ** at the system level, but it is never set to a more exclusive value.
37691: **
37692: ** This is usually safe. If an xUnlock fails or appears to fail, there may
37693: ** be a few redundant xLock() calls or a lock may be held for longer than
37694: ** required, but nothing really goes wrong.
37695: **
37696: ** The exception is when the database file is unlocked as the pager moves
37697: ** from ERROR to OPEN state. At this point there may be a hot-journal file
37698: ** in the file-system that needs to be rolled back (as part of a OPEN->SHARED
37699: ** transition, by the same pager or any other). If the call to xUnlock()
37700: ** fails at this point and the pager is left holding an EXCLUSIVE lock, this
37701: ** can confuse the call to xCheckReservedLock() call made later as part
37702: ** of hot-journal detection.
37703: **
37704: ** xCheckReservedLock() is defined as returning true "if there is a RESERVED
37705: ** lock held by this process or any others". So xCheckReservedLock may
37706: ** return true because the caller itself is holding an EXCLUSIVE lock (but
37707: ** doesn't know it because of a previous error in xUnlock). If this happens
37708: ** a hot-journal may be mistaken for a journal being created by an active
37709: ** transaction in another process, causing SQLite to read from the database
37710: ** without rolling it back.
37711: **
37712: ** To work around this, if a call to xUnlock() fails when unlocking the
37713: ** database in the ERROR state, Pager.eLock is set to UNKNOWN_LOCK. It
37714: ** is only changed back to a real locking state after a successful call
37715: ** to xLock(EXCLUSIVE). Also, the code to do the OPEN->SHARED state transition
37716: ** omits the check for a hot-journal if Pager.eLock is set to UNKNOWN_LOCK
37717: ** lock. Instead, it assumes a hot-journal exists and obtains an EXCLUSIVE
37718: ** lock on the database file before attempting to roll it back. See function
37719: ** PagerSharedLock() for more detail.
37720: **
37721: ** Pager.eLock may only be set to UNKNOWN_LOCK when the pager is in
37722: ** PAGER_OPEN state.
37723: */
37724: #define UNKNOWN_LOCK (EXCLUSIVE_LOCK+1)
37725:
37726: /*
37727: ** A macro used for invoking the codec if there is one
37728: */
37729: #ifdef SQLITE_HAS_CODEC
37730: # define CODEC1(P,D,N,X,E) \
37731: if( P->xCodec && P->xCodec(P->pCodec,D,N,X)==0 ){ E; }
37732: # define CODEC2(P,D,N,X,E,O) \
37733: if( P->xCodec==0 ){ O=(char*)D; }else \
37734: if( (O=(char*)(P->xCodec(P->pCodec,D,N,X)))==0 ){ E; }
37735: #else
37736: # define CODEC1(P,D,N,X,E) /* NO-OP */
37737: # define CODEC2(P,D,N,X,E,O) O=(char*)D
37738: #endif
37739:
37740: /*
37741: ** The maximum allowed sector size. 64KiB. If the xSectorsize() method
37742: ** returns a value larger than this, then MAX_SECTOR_SIZE is used instead.
37743: ** This could conceivably cause corruption following a power failure on
37744: ** such a system. This is currently an undocumented limit.
37745: */
37746: #define MAX_SECTOR_SIZE 0x10000
37747:
37748: /*
37749: ** An instance of the following structure is allocated for each active
37750: ** savepoint and statement transaction in the system. All such structures
37751: ** are stored in the Pager.aSavepoint[] array, which is allocated and
37752: ** resized using sqlite3Realloc().
37753: **
37754: ** When a savepoint is created, the PagerSavepoint.iHdrOffset field is
37755: ** set to 0. If a journal-header is written into the main journal while
37756: ** the savepoint is active, then iHdrOffset is set to the byte offset
37757: ** immediately following the last journal record written into the main
37758: ** journal before the journal-header. This is required during savepoint
37759: ** rollback (see pagerPlaybackSavepoint()).
37760: */
37761: typedef struct PagerSavepoint PagerSavepoint;
37762: struct PagerSavepoint {
37763: i64 iOffset; /* Starting offset in main journal */
37764: i64 iHdrOffset; /* See above */
37765: Bitvec *pInSavepoint; /* Set of pages in this savepoint */
37766: Pgno nOrig; /* Original number of pages in file */
37767: Pgno iSubRec; /* Index of first record in sub-journal */
37768: #ifndef SQLITE_OMIT_WAL
37769: u32 aWalData[WAL_SAVEPOINT_NDATA]; /* WAL savepoint context */
37770: #endif
37771: };
37772:
37773: /*
37774: ** A open page cache is an instance of struct Pager. A description of
37775: ** some of the more important member variables follows:
37776: **
37777: ** eState
37778: **
37779: ** The current 'state' of the pager object. See the comment and state
37780: ** diagram above for a description of the pager state.
37781: **
37782: ** eLock
37783: **
37784: ** For a real on-disk database, the current lock held on the database file -
37785: ** NO_LOCK, SHARED_LOCK, RESERVED_LOCK or EXCLUSIVE_LOCK.
37786: **
37787: ** For a temporary or in-memory database (neither of which require any
37788: ** locks), this variable is always set to EXCLUSIVE_LOCK. Since such
37789: ** databases always have Pager.exclusiveMode==1, this tricks the pager
37790: ** logic into thinking that it already has all the locks it will ever
37791: ** need (and no reason to release them).
37792: **
37793: ** In some (obscure) circumstances, this variable may also be set to
37794: ** UNKNOWN_LOCK. See the comment above the #define of UNKNOWN_LOCK for
37795: ** details.
37796: **
37797: ** changeCountDone
37798: **
37799: ** This boolean variable is used to make sure that the change-counter
37800: ** (the 4-byte header field at byte offset 24 of the database file) is
37801: ** not updated more often than necessary.
37802: **
37803: ** It is set to true when the change-counter field is updated, which
37804: ** can only happen if an exclusive lock is held on the database file.
37805: ** It is cleared (set to false) whenever an exclusive lock is
37806: ** relinquished on the database file. Each time a transaction is committed,
37807: ** The changeCountDone flag is inspected. If it is true, the work of
37808: ** updating the change-counter is omitted for the current transaction.
37809: **
37810: ** This mechanism means that when running in exclusive mode, a connection
37811: ** need only update the change-counter once, for the first transaction
37812: ** committed.
37813: **
37814: ** setMaster
37815: **
37816: ** When PagerCommitPhaseOne() is called to commit a transaction, it may
37817: ** (or may not) specify a master-journal name to be written into the
37818: ** journal file before it is synced to disk.
37819: **
37820: ** Whether or not a journal file contains a master-journal pointer affects
37821: ** the way in which the journal file is finalized after the transaction is
37822: ** committed or rolled back when running in "journal_mode=PERSIST" mode.
37823: ** If a journal file does not contain a master-journal pointer, it is
37824: ** finalized by overwriting the first journal header with zeroes. If
37825: ** it does contain a master-journal pointer the journal file is finalized
37826: ** by truncating it to zero bytes, just as if the connection were
37827: ** running in "journal_mode=truncate" mode.
37828: **
37829: ** Journal files that contain master journal pointers cannot be finalized
37830: ** simply by overwriting the first journal-header with zeroes, as the
37831: ** master journal pointer could interfere with hot-journal rollback of any
37832: ** subsequently interrupted transaction that reuses the journal file.
37833: **
37834: ** The flag is cleared as soon as the journal file is finalized (either
37835: ** by PagerCommitPhaseTwo or PagerRollback). If an IO error prevents the
37836: ** journal file from being successfully finalized, the setMaster flag
37837: ** is cleared anyway (and the pager will move to ERROR state).
37838: **
37839: ** doNotSpill, doNotSyncSpill
37840: **
37841: ** These two boolean variables control the behaviour of cache-spills
37842: ** (calls made by the pcache module to the pagerStress() routine to
37843: ** write cached data to the file-system in order to free up memory).
37844: **
37845: ** When doNotSpill is non-zero, writing to the database from pagerStress()
37846: ** is disabled altogether. This is done in a very obscure case that
37847: ** comes up during savepoint rollback that requires the pcache module
37848: ** to allocate a new page to prevent the journal file from being written
37849: ** while it is being traversed by code in pager_playback().
37850: **
37851: ** If doNotSyncSpill is non-zero, writing to the database from pagerStress()
37852: ** is permitted, but syncing the journal file is not. This flag is set
37853: ** by sqlite3PagerWrite() when the file-system sector-size is larger than
37854: ** the database page-size in order to prevent a journal sync from happening
37855: ** in between the journalling of two pages on the same sector.
37856: **
37857: ** subjInMemory
37858: **
37859: ** This is a boolean variable. If true, then any required sub-journal
37860: ** is opened as an in-memory journal file. If false, then in-memory
37861: ** sub-journals are only used for in-memory pager files.
37862: **
37863: ** This variable is updated by the upper layer each time a new
37864: ** write-transaction is opened.
37865: **
37866: ** dbSize, dbOrigSize, dbFileSize
37867: **
37868: ** Variable dbSize is set to the number of pages in the database file.
37869: ** It is valid in PAGER_READER and higher states (all states except for
37870: ** OPEN and ERROR).
37871: **
37872: ** dbSize is set based on the size of the database file, which may be
37873: ** larger than the size of the database (the value stored at offset
37874: ** 28 of the database header by the btree). If the size of the file
37875: ** is not an integer multiple of the page-size, the value stored in
37876: ** dbSize is rounded down (i.e. a 5KB file with 2K page-size has dbSize==2).
37877: ** Except, any file that is greater than 0 bytes in size is considered
37878: ** to have at least one page. (i.e. a 1KB file with 2K page-size leads
37879: ** to dbSize==1).
37880: **
37881: ** During a write-transaction, if pages with page-numbers greater than
37882: ** dbSize are modified in the cache, dbSize is updated accordingly.
37883: ** Similarly, if the database is truncated using PagerTruncateImage(),
37884: ** dbSize is updated.
37885: **
37886: ** Variables dbOrigSize and dbFileSize are valid in states
37887: ** PAGER_WRITER_LOCKED and higher. dbOrigSize is a copy of the dbSize
37888: ** variable at the start of the transaction. It is used during rollback,
37889: ** and to determine whether or not pages need to be journalled before
37890: ** being modified.
37891: **
37892: ** Throughout a write-transaction, dbFileSize contains the size of
37893: ** the file on disk in pages. It is set to a copy of dbSize when the
37894: ** write-transaction is first opened, and updated when VFS calls are made
37895: ** to write or truncate the database file on disk.
37896: **
37897: ** The only reason the dbFileSize variable is required is to suppress
37898: ** unnecessary calls to xTruncate() after committing a transaction. If,
37899: ** when a transaction is committed, the dbFileSize variable indicates
37900: ** that the database file is larger than the database image (Pager.dbSize),
37901: ** pager_truncate() is called. The pager_truncate() call uses xFilesize()
37902: ** to measure the database file on disk, and then truncates it if required.
37903: ** dbFileSize is not used when rolling back a transaction. In this case
37904: ** pager_truncate() is called unconditionally (which means there may be
37905: ** a call to xFilesize() that is not strictly required). In either case,
37906: ** pager_truncate() may cause the file to become smaller or larger.
37907: **
37908: ** dbHintSize
37909: **
37910: ** The dbHintSize variable is used to limit the number of calls made to
37911: ** the VFS xFileControl(FCNTL_SIZE_HINT) method.
37912: **
37913: ** dbHintSize is set to a copy of the dbSize variable when a
37914: ** write-transaction is opened (at the same time as dbFileSize and
37915: ** dbOrigSize). If the xFileControl(FCNTL_SIZE_HINT) method is called,
37916: ** dbHintSize is increased to the number of pages that correspond to the
37917: ** size-hint passed to the method call. See pager_write_pagelist() for
37918: ** details.
37919: **
37920: ** errCode
37921: **
37922: ** The Pager.errCode variable is only ever used in PAGER_ERROR state. It
37923: ** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode
37924: ** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX
37925: ** sub-codes.
37926: */
37927: struct Pager {
37928: sqlite3_vfs *pVfs; /* OS functions to use for IO */
37929: u8 exclusiveMode; /* Boolean. True if locking_mode==EXCLUSIVE */
37930: u8 journalMode; /* One of the PAGER_JOURNALMODE_* values */
37931: u8 useJournal; /* Use a rollback journal on this file */
37932: u8 noSync; /* Do not sync the journal if true */
37933: u8 fullSync; /* Do extra syncs of the journal for robustness */
37934: u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */
37935: u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */
37936: u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */
37937: u8 tempFile; /* zFilename is a temporary file */
37938: u8 readOnly; /* True for a read-only database */
37939: u8 memDb; /* True to inhibit all file I/O */
37940:
37941: /**************************************************************************
37942: ** The following block contains those class members that change during
37943: ** routine opertion. Class members not in this block are either fixed
37944: ** when the pager is first created or else only change when there is a
37945: ** significant mode change (such as changing the page_size, locking_mode,
37946: ** or the journal_mode). From another view, these class members describe
37947: ** the "state" of the pager, while other class members describe the
37948: ** "configuration" of the pager.
37949: */
37950: u8 eState; /* Pager state (OPEN, READER, WRITER_LOCKED..) */
37951: u8 eLock; /* Current lock held on database file */
37952: u8 changeCountDone; /* Set after incrementing the change-counter */
37953: u8 setMaster; /* True if a m-j name has been written to jrnl */
37954: u8 doNotSpill; /* Do not spill the cache when non-zero */
37955: u8 doNotSyncSpill; /* Do not do a spill that requires jrnl sync */
37956: u8 subjInMemory; /* True to use in-memory sub-journals */
37957: Pgno dbSize; /* Number of pages in the database */
37958: Pgno dbOrigSize; /* dbSize before the current transaction */
37959: Pgno dbFileSize; /* Number of pages in the database file */
37960: Pgno dbHintSize; /* Value passed to FCNTL_SIZE_HINT call */
37961: int errCode; /* One of several kinds of errors */
37962: int nRec; /* Pages journalled since last j-header written */
37963: u32 cksumInit; /* Quasi-random value added to every checksum */
37964: u32 nSubRec; /* Number of records written to sub-journal */
37965: Bitvec *pInJournal; /* One bit for each page in the database file */
37966: sqlite3_file *fd; /* File descriptor for database */
37967: sqlite3_file *jfd; /* File descriptor for main journal */
37968: sqlite3_file *sjfd; /* File descriptor for sub-journal */
37969: i64 journalOff; /* Current write offset in the journal file */
37970: i64 journalHdr; /* Byte offset to previous journal header */
37971: sqlite3_backup *pBackup; /* Pointer to list of ongoing backup processes */
37972: PagerSavepoint *aSavepoint; /* Array of active savepoints */
37973: int nSavepoint; /* Number of elements in aSavepoint[] */
37974: char dbFileVers[16]; /* Changes whenever database file changes */
37975: /*
37976: ** End of the routinely-changing class members
37977: ***************************************************************************/
37978:
37979: u16 nExtra; /* Add this many bytes to each in-memory page */
37980: i16 nReserve; /* Number of unused bytes at end of each page */
37981: u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */
37982: u32 sectorSize; /* Assumed sector size during rollback */
37983: int pageSize; /* Number of bytes in a page */
37984: Pgno mxPgno; /* Maximum allowed size of the database */
37985: i64 journalSizeLimit; /* Size limit for persistent journal files */
37986: char *zFilename; /* Name of the database file */
37987: char *zJournal; /* Name of the journal file */
37988: int (*xBusyHandler)(void*); /* Function to call when busy */
37989: void *pBusyHandlerArg; /* Context argument for xBusyHandler */
1.2.2.1 ! misho 37990: int aStat[3]; /* Total cache hits, misses and writes */
1.2 misho 37991: #ifdef SQLITE_TEST
1.2.2.1 ! misho 37992: int nRead; /* Database pages read */
1.2 misho 37993: #endif
37994: void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */
37995: #ifdef SQLITE_HAS_CODEC
37996: void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */
37997: void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */
37998: void (*xCodecFree)(void*); /* Destructor for the codec */
37999: void *pCodec; /* First argument to xCodec... methods */
38000: #endif
38001: char *pTmpSpace; /* Pager.pageSize bytes of space for tmp use */
38002: PCache *pPCache; /* Pointer to page cache object */
38003: #ifndef SQLITE_OMIT_WAL
38004: Wal *pWal; /* Write-ahead log used by "journal_mode=wal" */
38005: char *zWal; /* File name for write-ahead log */
38006: #endif
38007: };
38008:
38009: /*
1.2.2.1 ! misho 38010: ** Indexes for use with Pager.aStat[]. The Pager.aStat[] array contains
! 38011: ** the values accessed by passing SQLITE_DBSTATUS_CACHE_HIT, CACHE_MISS
! 38012: ** or CACHE_WRITE to sqlite3_db_status().
! 38013: */
! 38014: #define PAGER_STAT_HIT 0
! 38015: #define PAGER_STAT_MISS 1
! 38016: #define PAGER_STAT_WRITE 2
! 38017:
! 38018: /*
1.2 misho 38019: ** The following global variables hold counters used for
38020: ** testing purposes only. These variables do not exist in
38021: ** a non-testing build. These variables are not thread-safe.
38022: */
38023: #ifdef SQLITE_TEST
38024: SQLITE_API int sqlite3_pager_readdb_count = 0; /* Number of full pages read from DB */
38025: SQLITE_API int sqlite3_pager_writedb_count = 0; /* Number of full pages written to DB */
38026: SQLITE_API int sqlite3_pager_writej_count = 0; /* Number of pages written to journal */
38027: # define PAGER_INCR(v) v++
38028: #else
38029: # define PAGER_INCR(v)
38030: #endif
38031:
38032:
38033:
38034: /*
38035: ** Journal files begin with the following magic string. The data
38036: ** was obtained from /dev/random. It is used only as a sanity check.
38037: **
38038: ** Since version 2.8.0, the journal format contains additional sanity
38039: ** checking information. If the power fails while the journal is being
38040: ** written, semi-random garbage data might appear in the journal
38041: ** file after power is restored. If an attempt is then made
38042: ** to roll the journal back, the database could be corrupted. The additional
38043: ** sanity checking data is an attempt to discover the garbage in the
38044: ** journal and ignore it.
38045: **
38046: ** The sanity checking information for the new journal format consists
38047: ** of a 32-bit checksum on each page of data. The checksum covers both
38048: ** the page number and the pPager->pageSize bytes of data for the page.
38049: ** This cksum is initialized to a 32-bit random value that appears in the
38050: ** journal file right after the header. The random initializer is important,
38051: ** because garbage data that appears at the end of a journal is likely
38052: ** data that was once in other files that have now been deleted. If the
38053: ** garbage data came from an obsolete journal file, the checksums might
38054: ** be correct. But by initializing the checksum to random value which
38055: ** is different for every journal, we minimize that risk.
38056: */
38057: static const unsigned char aJournalMagic[] = {
38058: 0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7,
38059: };
38060:
38061: /*
38062: ** The size of the of each page record in the journal is given by
38063: ** the following macro.
38064: */
38065: #define JOURNAL_PG_SZ(pPager) ((pPager->pageSize) + 8)
38066:
38067: /*
38068: ** The journal header size for this pager. This is usually the same
38069: ** size as a single disk sector. See also setSectorSize().
38070: */
38071: #define JOURNAL_HDR_SZ(pPager) (pPager->sectorSize)
38072:
38073: /*
38074: ** The macro MEMDB is true if we are dealing with an in-memory database.
38075: ** We do this as a macro so that if the SQLITE_OMIT_MEMORYDB macro is set,
38076: ** the value of MEMDB will be a constant and the compiler will optimize
38077: ** out code that would never execute.
38078: */
38079: #ifdef SQLITE_OMIT_MEMORYDB
38080: # define MEMDB 0
38081: #else
38082: # define MEMDB pPager->memDb
38083: #endif
38084:
38085: /*
38086: ** The maximum legal page number is (2^31 - 1).
38087: */
38088: #define PAGER_MAX_PGNO 2147483647
38089:
38090: /*
38091: ** The argument to this macro is a file descriptor (type sqlite3_file*).
38092: ** Return 0 if it is not open, or non-zero (but not 1) if it is.
38093: **
38094: ** This is so that expressions can be written as:
38095: **
38096: ** if( isOpen(pPager->jfd) ){ ...
38097: **
38098: ** instead of
38099: **
38100: ** if( pPager->jfd->pMethods ){ ...
38101: */
38102: #define isOpen(pFd) ((pFd)->pMethods)
38103:
38104: /*
38105: ** Return true if this pager uses a write-ahead log instead of the usual
38106: ** rollback journal. Otherwise false.
38107: */
38108: #ifndef SQLITE_OMIT_WAL
38109: static int pagerUseWal(Pager *pPager){
38110: return (pPager->pWal!=0);
38111: }
38112: #else
38113: # define pagerUseWal(x) 0
38114: # define pagerRollbackWal(x) 0
38115: # define pagerWalFrames(v,w,x,y) 0
38116: # define pagerOpenWalIfPresent(z) SQLITE_OK
38117: # define pagerBeginReadTransaction(z) SQLITE_OK
38118: #endif
38119:
38120: #ifndef NDEBUG
38121: /*
38122: ** Usage:
38123: **
38124: ** assert( assert_pager_state(pPager) );
38125: **
38126: ** This function runs many asserts to try to find inconsistencies in
38127: ** the internal state of the Pager object.
38128: */
38129: static int assert_pager_state(Pager *p){
38130: Pager *pPager = p;
38131:
38132: /* State must be valid. */
38133: assert( p->eState==PAGER_OPEN
38134: || p->eState==PAGER_READER
38135: || p->eState==PAGER_WRITER_LOCKED
38136: || p->eState==PAGER_WRITER_CACHEMOD
38137: || p->eState==PAGER_WRITER_DBMOD
38138: || p->eState==PAGER_WRITER_FINISHED
38139: || p->eState==PAGER_ERROR
38140: );
38141:
38142: /* Regardless of the current state, a temp-file connection always behaves
38143: ** as if it has an exclusive lock on the database file. It never updates
38144: ** the change-counter field, so the changeCountDone flag is always set.
38145: */
38146: assert( p->tempFile==0 || p->eLock==EXCLUSIVE_LOCK );
38147: assert( p->tempFile==0 || pPager->changeCountDone );
38148:
38149: /* If the useJournal flag is clear, the journal-mode must be "OFF".
38150: ** And if the journal-mode is "OFF", the journal file must not be open.
38151: */
38152: assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->useJournal );
38153: assert( p->journalMode!=PAGER_JOURNALMODE_OFF || !isOpen(p->jfd) );
38154:
38155: /* Check that MEMDB implies noSync. And an in-memory journal. Since
38156: ** this means an in-memory pager performs no IO at all, it cannot encounter
38157: ** either SQLITE_IOERR or SQLITE_FULL during rollback or while finalizing
38158: ** a journal file. (although the in-memory journal implementation may
38159: ** return SQLITE_IOERR_NOMEM while the journal file is being written). It
38160: ** is therefore not possible for an in-memory pager to enter the ERROR
38161: ** state.
38162: */
38163: if( MEMDB ){
38164: assert( p->noSync );
38165: assert( p->journalMode==PAGER_JOURNALMODE_OFF
38166: || p->journalMode==PAGER_JOURNALMODE_MEMORY
38167: );
38168: assert( p->eState!=PAGER_ERROR && p->eState!=PAGER_OPEN );
38169: assert( pagerUseWal(p)==0 );
38170: }
38171:
38172: /* If changeCountDone is set, a RESERVED lock or greater must be held
38173: ** on the file.
38174: */
38175: assert( pPager->changeCountDone==0 || pPager->eLock>=RESERVED_LOCK );
38176: assert( p->eLock!=PENDING_LOCK );
38177:
38178: switch( p->eState ){
38179: case PAGER_OPEN:
38180: assert( !MEMDB );
38181: assert( pPager->errCode==SQLITE_OK );
38182: assert( sqlite3PcacheRefCount(pPager->pPCache)==0 || pPager->tempFile );
38183: break;
38184:
38185: case PAGER_READER:
38186: assert( pPager->errCode==SQLITE_OK );
38187: assert( p->eLock!=UNKNOWN_LOCK );
1.2.2.1 ! misho 38188: assert( p->eLock>=SHARED_LOCK );
1.2 misho 38189: break;
38190:
38191: case PAGER_WRITER_LOCKED:
38192: assert( p->eLock!=UNKNOWN_LOCK );
38193: assert( pPager->errCode==SQLITE_OK );
38194: if( !pagerUseWal(pPager) ){
38195: assert( p->eLock>=RESERVED_LOCK );
38196: }
38197: assert( pPager->dbSize==pPager->dbOrigSize );
38198: assert( pPager->dbOrigSize==pPager->dbFileSize );
38199: assert( pPager->dbOrigSize==pPager->dbHintSize );
38200: assert( pPager->setMaster==0 );
38201: break;
38202:
38203: case PAGER_WRITER_CACHEMOD:
38204: assert( p->eLock!=UNKNOWN_LOCK );
38205: assert( pPager->errCode==SQLITE_OK );
38206: if( !pagerUseWal(pPager) ){
38207: /* It is possible that if journal_mode=wal here that neither the
38208: ** journal file nor the WAL file are open. This happens during
38209: ** a rollback transaction that switches from journal_mode=off
38210: ** to journal_mode=wal.
38211: */
38212: assert( p->eLock>=RESERVED_LOCK );
38213: assert( isOpen(p->jfd)
38214: || p->journalMode==PAGER_JOURNALMODE_OFF
38215: || p->journalMode==PAGER_JOURNALMODE_WAL
38216: );
38217: }
38218: assert( pPager->dbOrigSize==pPager->dbFileSize );
38219: assert( pPager->dbOrigSize==pPager->dbHintSize );
38220: break;
38221:
38222: case PAGER_WRITER_DBMOD:
38223: assert( p->eLock==EXCLUSIVE_LOCK );
38224: assert( pPager->errCode==SQLITE_OK );
38225: assert( !pagerUseWal(pPager) );
38226: assert( p->eLock>=EXCLUSIVE_LOCK );
38227: assert( isOpen(p->jfd)
38228: || p->journalMode==PAGER_JOURNALMODE_OFF
38229: || p->journalMode==PAGER_JOURNALMODE_WAL
38230: );
38231: assert( pPager->dbOrigSize<=pPager->dbHintSize );
38232: break;
38233:
38234: case PAGER_WRITER_FINISHED:
38235: assert( p->eLock==EXCLUSIVE_LOCK );
38236: assert( pPager->errCode==SQLITE_OK );
38237: assert( !pagerUseWal(pPager) );
38238: assert( isOpen(p->jfd)
38239: || p->journalMode==PAGER_JOURNALMODE_OFF
38240: || p->journalMode==PAGER_JOURNALMODE_WAL
38241: );
38242: break;
38243:
38244: case PAGER_ERROR:
38245: /* There must be at least one outstanding reference to the pager if
38246: ** in ERROR state. Otherwise the pager should have already dropped
38247: ** back to OPEN state.
38248: */
38249: assert( pPager->errCode!=SQLITE_OK );
38250: assert( sqlite3PcacheRefCount(pPager->pPCache)>0 );
38251: break;
38252: }
38253:
38254: return 1;
38255: }
38256: #endif /* ifndef NDEBUG */
38257:
38258: #ifdef SQLITE_DEBUG
38259: /*
38260: ** Return a pointer to a human readable string in a static buffer
38261: ** containing the state of the Pager object passed as an argument. This
38262: ** is intended to be used within debuggers. For example, as an alternative
38263: ** to "print *pPager" in gdb:
38264: **
38265: ** (gdb) printf "%s", print_pager_state(pPager)
38266: */
38267: static char *print_pager_state(Pager *p){
38268: static char zRet[1024];
38269:
38270: sqlite3_snprintf(1024, zRet,
38271: "Filename: %s\n"
38272: "State: %s errCode=%d\n"
38273: "Lock: %s\n"
38274: "Locking mode: locking_mode=%s\n"
38275: "Journal mode: journal_mode=%s\n"
38276: "Backing store: tempFile=%d memDb=%d useJournal=%d\n"
38277: "Journal: journalOff=%lld journalHdr=%lld\n"
38278: "Size: dbsize=%d dbOrigSize=%d dbFileSize=%d\n"
38279: , p->zFilename
38280: , p->eState==PAGER_OPEN ? "OPEN" :
38281: p->eState==PAGER_READER ? "READER" :
38282: p->eState==PAGER_WRITER_LOCKED ? "WRITER_LOCKED" :
38283: p->eState==PAGER_WRITER_CACHEMOD ? "WRITER_CACHEMOD" :
38284: p->eState==PAGER_WRITER_DBMOD ? "WRITER_DBMOD" :
38285: p->eState==PAGER_WRITER_FINISHED ? "WRITER_FINISHED" :
38286: p->eState==PAGER_ERROR ? "ERROR" : "?error?"
38287: , (int)p->errCode
38288: , p->eLock==NO_LOCK ? "NO_LOCK" :
38289: p->eLock==RESERVED_LOCK ? "RESERVED" :
38290: p->eLock==EXCLUSIVE_LOCK ? "EXCLUSIVE" :
38291: p->eLock==SHARED_LOCK ? "SHARED" :
38292: p->eLock==UNKNOWN_LOCK ? "UNKNOWN" : "?error?"
38293: , p->exclusiveMode ? "exclusive" : "normal"
38294: , p->journalMode==PAGER_JOURNALMODE_MEMORY ? "memory" :
38295: p->journalMode==PAGER_JOURNALMODE_OFF ? "off" :
38296: p->journalMode==PAGER_JOURNALMODE_DELETE ? "delete" :
38297: p->journalMode==PAGER_JOURNALMODE_PERSIST ? "persist" :
38298: p->journalMode==PAGER_JOURNALMODE_TRUNCATE ? "truncate" :
38299: p->journalMode==PAGER_JOURNALMODE_WAL ? "wal" : "?error?"
38300: , (int)p->tempFile, (int)p->memDb, (int)p->useJournal
38301: , p->journalOff, p->journalHdr
38302: , (int)p->dbSize, (int)p->dbOrigSize, (int)p->dbFileSize
38303: );
38304:
38305: return zRet;
38306: }
38307: #endif
38308:
38309: /*
38310: ** Return true if it is necessary to write page *pPg into the sub-journal.
38311: ** A page needs to be written into the sub-journal if there exists one
38312: ** or more open savepoints for which:
38313: **
38314: ** * The page-number is less than or equal to PagerSavepoint.nOrig, and
38315: ** * The bit corresponding to the page-number is not set in
38316: ** PagerSavepoint.pInSavepoint.
38317: */
38318: static int subjRequiresPage(PgHdr *pPg){
38319: Pgno pgno = pPg->pgno;
38320: Pager *pPager = pPg->pPager;
38321: int i;
38322: for(i=0; i<pPager->nSavepoint; i++){
38323: PagerSavepoint *p = &pPager->aSavepoint[i];
38324: if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){
38325: return 1;
38326: }
38327: }
38328: return 0;
38329: }
38330:
38331: /*
38332: ** Return true if the page is already in the journal file.
38333: */
38334: static int pageInJournal(PgHdr *pPg){
38335: return sqlite3BitvecTest(pPg->pPager->pInJournal, pPg->pgno);
38336: }
38337:
38338: /*
38339: ** Read a 32-bit integer from the given file descriptor. Store the integer
38340: ** that is read in *pRes. Return SQLITE_OK if everything worked, or an
38341: ** error code is something goes wrong.
38342: **
38343: ** All values are stored on disk as big-endian.
38344: */
38345: static int read32bits(sqlite3_file *fd, i64 offset, u32 *pRes){
38346: unsigned char ac[4];
38347: int rc = sqlite3OsRead(fd, ac, sizeof(ac), offset);
38348: if( rc==SQLITE_OK ){
38349: *pRes = sqlite3Get4byte(ac);
38350: }
38351: return rc;
38352: }
38353:
38354: /*
38355: ** Write a 32-bit integer into a string buffer in big-endian byte order.
38356: */
38357: #define put32bits(A,B) sqlite3Put4byte((u8*)A,B)
38358:
38359:
38360: /*
38361: ** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK
38362: ** on success or an error code is something goes wrong.
38363: */
38364: static int write32bits(sqlite3_file *fd, i64 offset, u32 val){
38365: char ac[4];
38366: put32bits(ac, val);
38367: return sqlite3OsWrite(fd, ac, 4, offset);
38368: }
38369:
38370: /*
38371: ** Unlock the database file to level eLock, which must be either NO_LOCK
38372: ** or SHARED_LOCK. Regardless of whether or not the call to xUnlock()
38373: ** succeeds, set the Pager.eLock variable to match the (attempted) new lock.
38374: **
38375: ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is
38376: ** called, do not modify it. See the comment above the #define of
38377: ** UNKNOWN_LOCK for an explanation of this.
38378: */
38379: static int pagerUnlockDb(Pager *pPager, int eLock){
38380: int rc = SQLITE_OK;
38381:
38382: assert( !pPager->exclusiveMode || pPager->eLock==eLock );
38383: assert( eLock==NO_LOCK || eLock==SHARED_LOCK );
38384: assert( eLock!=NO_LOCK || pagerUseWal(pPager)==0 );
38385: if( isOpen(pPager->fd) ){
38386: assert( pPager->eLock>=eLock );
38387: rc = sqlite3OsUnlock(pPager->fd, eLock);
38388: if( pPager->eLock!=UNKNOWN_LOCK ){
38389: pPager->eLock = (u8)eLock;
38390: }
38391: IOTRACE(("UNLOCK %p %d\n", pPager, eLock))
38392: }
38393: return rc;
38394: }
38395:
38396: /*
38397: ** Lock the database file to level eLock, which must be either SHARED_LOCK,
38398: ** RESERVED_LOCK or EXCLUSIVE_LOCK. If the caller is successful, set the
38399: ** Pager.eLock variable to the new locking state.
38400: **
38401: ** Except, if Pager.eLock is set to UNKNOWN_LOCK when this function is
38402: ** called, do not modify it unless the new locking state is EXCLUSIVE_LOCK.
38403: ** See the comment above the #define of UNKNOWN_LOCK for an explanation
38404: ** of this.
38405: */
38406: static int pagerLockDb(Pager *pPager, int eLock){
38407: int rc = SQLITE_OK;
38408:
38409: assert( eLock==SHARED_LOCK || eLock==RESERVED_LOCK || eLock==EXCLUSIVE_LOCK );
38410: if( pPager->eLock<eLock || pPager->eLock==UNKNOWN_LOCK ){
38411: rc = sqlite3OsLock(pPager->fd, eLock);
38412: if( rc==SQLITE_OK && (pPager->eLock!=UNKNOWN_LOCK||eLock==EXCLUSIVE_LOCK) ){
38413: pPager->eLock = (u8)eLock;
38414: IOTRACE(("LOCK %p %d\n", pPager, eLock))
38415: }
38416: }
38417: return rc;
38418: }
38419:
38420: /*
38421: ** This function determines whether or not the atomic-write optimization
38422: ** can be used with this pager. The optimization can be used if:
38423: **
38424: ** (a) the value returned by OsDeviceCharacteristics() indicates that
38425: ** a database page may be written atomically, and
38426: ** (b) the value returned by OsSectorSize() is less than or equal
38427: ** to the page size.
38428: **
38429: ** The optimization is also always enabled for temporary files. It is
38430: ** an error to call this function if pPager is opened on an in-memory
38431: ** database.
38432: **
38433: ** If the optimization cannot be used, 0 is returned. If it can be used,
38434: ** then the value returned is the size of the journal file when it
38435: ** contains rollback data for exactly one page.
38436: */
38437: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
38438: static int jrnlBufferSize(Pager *pPager){
38439: assert( !MEMDB );
38440: if( !pPager->tempFile ){
38441: int dc; /* Device characteristics */
38442: int nSector; /* Sector size */
38443: int szPage; /* Page size */
38444:
38445: assert( isOpen(pPager->fd) );
38446: dc = sqlite3OsDeviceCharacteristics(pPager->fd);
38447: nSector = pPager->sectorSize;
38448: szPage = pPager->pageSize;
38449:
38450: assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
38451: assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
38452: if( 0==(dc&(SQLITE_IOCAP_ATOMIC|(szPage>>8)) || nSector>szPage) ){
38453: return 0;
38454: }
38455: }
38456:
38457: return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
38458: }
38459: #endif
38460:
38461: /*
38462: ** If SQLITE_CHECK_PAGES is defined then we do some sanity checking
38463: ** on the cache using a hash function. This is used for testing
38464: ** and debugging only.
38465: */
38466: #ifdef SQLITE_CHECK_PAGES
38467: /*
38468: ** Return a 32-bit hash of the page data for pPage.
38469: */
38470: static u32 pager_datahash(int nByte, unsigned char *pData){
38471: u32 hash = 0;
38472: int i;
38473: for(i=0; i<nByte; i++){
38474: hash = (hash*1039) + pData[i];
38475: }
38476: return hash;
38477: }
38478: static u32 pager_pagehash(PgHdr *pPage){
38479: return pager_datahash(pPage->pPager->pageSize, (unsigned char *)pPage->pData);
38480: }
38481: static void pager_set_pagehash(PgHdr *pPage){
38482: pPage->pageHash = pager_pagehash(pPage);
38483: }
38484:
38485: /*
38486: ** The CHECK_PAGE macro takes a PgHdr* as an argument. If SQLITE_CHECK_PAGES
38487: ** is defined, and NDEBUG is not defined, an assert() statement checks
38488: ** that the page is either dirty or still matches the calculated page-hash.
38489: */
38490: #define CHECK_PAGE(x) checkPage(x)
38491: static void checkPage(PgHdr *pPg){
38492: Pager *pPager = pPg->pPager;
38493: assert( pPager->eState!=PAGER_ERROR );
38494: assert( (pPg->flags&PGHDR_DIRTY) || pPg->pageHash==pager_pagehash(pPg) );
38495: }
38496:
38497: #else
38498: #define pager_datahash(X,Y) 0
38499: #define pager_pagehash(X) 0
38500: #define pager_set_pagehash(X)
38501: #define CHECK_PAGE(x)
38502: #endif /* SQLITE_CHECK_PAGES */
38503:
38504: /*
38505: ** When this is called the journal file for pager pPager must be open.
38506: ** This function attempts to read a master journal file name from the
38507: ** end of the file and, if successful, copies it into memory supplied
38508: ** by the caller. See comments above writeMasterJournal() for the format
38509: ** used to store a master journal file name at the end of a journal file.
38510: **
38511: ** zMaster must point to a buffer of at least nMaster bytes allocated by
38512: ** the caller. This should be sqlite3_vfs.mxPathname+1 (to ensure there is
38513: ** enough space to write the master journal name). If the master journal
38514: ** name in the journal is longer than nMaster bytes (including a
38515: ** nul-terminator), then this is handled as if no master journal name
38516: ** were present in the journal.
38517: **
38518: ** If a master journal file name is present at the end of the journal
38519: ** file, then it is copied into the buffer pointed to by zMaster. A
38520: ** nul-terminator byte is appended to the buffer following the master
38521: ** journal file name.
38522: **
38523: ** If it is determined that no master journal file name is present
38524: ** zMaster[0] is set to 0 and SQLITE_OK returned.
38525: **
38526: ** If an error occurs while reading from the journal file, an SQLite
38527: ** error code is returned.
38528: */
38529: static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){
38530: int rc; /* Return code */
38531: u32 len; /* Length in bytes of master journal name */
38532: i64 szJ; /* Total size in bytes of journal file pJrnl */
38533: u32 cksum; /* MJ checksum value read from journal */
38534: u32 u; /* Unsigned loop counter */
38535: unsigned char aMagic[8]; /* A buffer to hold the magic header */
38536: zMaster[0] = '\0';
38537:
38538: if( SQLITE_OK!=(rc = sqlite3OsFileSize(pJrnl, &szJ))
38539: || szJ<16
38540: || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len))
38541: || len>=nMaster
38542: || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum))
38543: || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8))
38544: || memcmp(aMagic, aJournalMagic, 8)
38545: || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, zMaster, len, szJ-16-len))
38546: ){
38547: return rc;
38548: }
38549:
38550: /* See if the checksum matches the master journal name */
38551: for(u=0; u<len; u++){
38552: cksum -= zMaster[u];
38553: }
38554: if( cksum ){
38555: /* If the checksum doesn't add up, then one or more of the disk sectors
38556: ** containing the master journal filename is corrupted. This means
38557: ** definitely roll back, so just return SQLITE_OK and report a (nul)
38558: ** master-journal filename.
38559: */
38560: len = 0;
38561: }
38562: zMaster[len] = '\0';
38563:
38564: return SQLITE_OK;
38565: }
38566:
38567: /*
38568: ** Return the offset of the sector boundary at or immediately
38569: ** following the value in pPager->journalOff, assuming a sector
38570: ** size of pPager->sectorSize bytes.
38571: **
38572: ** i.e for a sector size of 512:
38573: **
38574: ** Pager.journalOff Return value
38575: ** ---------------------------------------
38576: ** 0 0
38577: ** 512 512
38578: ** 100 512
38579: ** 2000 2048
38580: **
38581: */
38582: static i64 journalHdrOffset(Pager *pPager){
38583: i64 offset = 0;
38584: i64 c = pPager->journalOff;
38585: if( c ){
38586: offset = ((c-1)/JOURNAL_HDR_SZ(pPager) + 1) * JOURNAL_HDR_SZ(pPager);
38587: }
38588: assert( offset%JOURNAL_HDR_SZ(pPager)==0 );
38589: assert( offset>=c );
38590: assert( (offset-c)<JOURNAL_HDR_SZ(pPager) );
38591: return offset;
38592: }
38593:
38594: /*
38595: ** The journal file must be open when this function is called.
38596: **
38597: ** This function is a no-op if the journal file has not been written to
38598: ** within the current transaction (i.e. if Pager.journalOff==0).
38599: **
38600: ** If doTruncate is non-zero or the Pager.journalSizeLimit variable is
38601: ** set to 0, then truncate the journal file to zero bytes in size. Otherwise,
38602: ** zero the 28-byte header at the start of the journal file. In either case,
38603: ** if the pager is not in no-sync mode, sync the journal file immediately
38604: ** after writing or truncating it.
38605: **
38606: ** If Pager.journalSizeLimit is set to a positive, non-zero value, and
38607: ** following the truncation or zeroing described above the size of the
38608: ** journal file in bytes is larger than this value, then truncate the
38609: ** journal file to Pager.journalSizeLimit bytes. The journal file does
38610: ** not need to be synced following this operation.
38611: **
38612: ** If an IO error occurs, abandon processing and return the IO error code.
38613: ** Otherwise, return SQLITE_OK.
38614: */
38615: static int zeroJournalHdr(Pager *pPager, int doTruncate){
38616: int rc = SQLITE_OK; /* Return code */
38617: assert( isOpen(pPager->jfd) );
38618: if( pPager->journalOff ){
38619: const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */
38620:
38621: IOTRACE(("JZEROHDR %p\n", pPager))
38622: if( doTruncate || iLimit==0 ){
38623: rc = sqlite3OsTruncate(pPager->jfd, 0);
38624: }else{
38625: static const char zeroHdr[28] = {0};
38626: rc = sqlite3OsWrite(pPager->jfd, zeroHdr, sizeof(zeroHdr), 0);
38627: }
38628: if( rc==SQLITE_OK && !pPager->noSync ){
38629: rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_DATAONLY|pPager->syncFlags);
38630: }
38631:
38632: /* At this point the transaction is committed but the write lock
38633: ** is still held on the file. If there is a size limit configured for
38634: ** the persistent journal and the journal file currently consumes more
38635: ** space than that limit allows for, truncate it now. There is no need
38636: ** to sync the file following this operation.
38637: */
38638: if( rc==SQLITE_OK && iLimit>0 ){
38639: i64 sz;
38640: rc = sqlite3OsFileSize(pPager->jfd, &sz);
38641: if( rc==SQLITE_OK && sz>iLimit ){
38642: rc = sqlite3OsTruncate(pPager->jfd, iLimit);
38643: }
38644: }
38645: }
38646: return rc;
38647: }
38648:
38649: /*
38650: ** The journal file must be open when this routine is called. A journal
38651: ** header (JOURNAL_HDR_SZ bytes) is written into the journal file at the
38652: ** current location.
38653: **
38654: ** The format for the journal header is as follows:
38655: ** - 8 bytes: Magic identifying journal format.
38656: ** - 4 bytes: Number of records in journal, or -1 no-sync mode is on.
38657: ** - 4 bytes: Random number used for page hash.
38658: ** - 4 bytes: Initial database page count.
38659: ** - 4 bytes: Sector size used by the process that wrote this journal.
38660: ** - 4 bytes: Database page size.
38661: **
38662: ** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space.
38663: */
38664: static int writeJournalHdr(Pager *pPager){
38665: int rc = SQLITE_OK; /* Return code */
38666: char *zHeader = pPager->pTmpSpace; /* Temporary space used to build header */
38667: u32 nHeader = (u32)pPager->pageSize;/* Size of buffer pointed to by zHeader */
38668: u32 nWrite; /* Bytes of header sector written */
38669: int ii; /* Loop counter */
38670:
38671: assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
38672:
38673: if( nHeader>JOURNAL_HDR_SZ(pPager) ){
38674: nHeader = JOURNAL_HDR_SZ(pPager);
38675: }
38676:
38677: /* If there are active savepoints and any of them were created
38678: ** since the most recent journal header was written, update the
38679: ** PagerSavepoint.iHdrOffset fields now.
38680: */
38681: for(ii=0; ii<pPager->nSavepoint; ii++){
38682: if( pPager->aSavepoint[ii].iHdrOffset==0 ){
38683: pPager->aSavepoint[ii].iHdrOffset = pPager->journalOff;
38684: }
38685: }
38686:
38687: pPager->journalHdr = pPager->journalOff = journalHdrOffset(pPager);
38688:
38689: /*
38690: ** Write the nRec Field - the number of page records that follow this
38691: ** journal header. Normally, zero is written to this value at this time.
38692: ** After the records are added to the journal (and the journal synced,
38693: ** if in full-sync mode), the zero is overwritten with the true number
38694: ** of records (see syncJournal()).
38695: **
38696: ** A faster alternative is to write 0xFFFFFFFF to the nRec field. When
38697: ** reading the journal this value tells SQLite to assume that the
38698: ** rest of the journal file contains valid page records. This assumption
38699: ** is dangerous, as if a failure occurred whilst writing to the journal
38700: ** file it may contain some garbage data. There are two scenarios
38701: ** where this risk can be ignored:
38702: **
38703: ** * When the pager is in no-sync mode. Corruption can follow a
38704: ** power failure in this case anyway.
38705: **
38706: ** * When the SQLITE_IOCAP_SAFE_APPEND flag is set. This guarantees
38707: ** that garbage data is never appended to the journal file.
38708: */
38709: assert( isOpen(pPager->fd) || pPager->noSync );
38710: if( pPager->noSync || (pPager->journalMode==PAGER_JOURNALMODE_MEMORY)
38711: || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_SAFE_APPEND)
38712: ){
38713: memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
38714: put32bits(&zHeader[sizeof(aJournalMagic)], 0xffffffff);
38715: }else{
38716: memset(zHeader, 0, sizeof(aJournalMagic)+4);
38717: }
38718:
38719: /* The random check-hash initialiser */
38720: sqlite3_randomness(sizeof(pPager->cksumInit), &pPager->cksumInit);
38721: put32bits(&zHeader[sizeof(aJournalMagic)+4], pPager->cksumInit);
38722: /* The initial database size */
38723: put32bits(&zHeader[sizeof(aJournalMagic)+8], pPager->dbOrigSize);
38724: /* The assumed sector size for this process */
38725: put32bits(&zHeader[sizeof(aJournalMagic)+12], pPager->sectorSize);
38726:
38727: /* The page size */
38728: put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
38729:
38730: /* Initializing the tail of the buffer is not necessary. Everything
38731: ** works find if the following memset() is omitted. But initializing
38732: ** the memory prevents valgrind from complaining, so we are willing to
38733: ** take the performance hit.
38734: */
38735: memset(&zHeader[sizeof(aJournalMagic)+20], 0,
38736: nHeader-(sizeof(aJournalMagic)+20));
38737:
38738: /* In theory, it is only necessary to write the 28 bytes that the
38739: ** journal header consumes to the journal file here. Then increment the
38740: ** Pager.journalOff variable by JOURNAL_HDR_SZ so that the next
38741: ** record is written to the following sector (leaving a gap in the file
38742: ** that will be implicitly filled in by the OS).
38743: **
38744: ** However it has been discovered that on some systems this pattern can
38745: ** be significantly slower than contiguously writing data to the file,
38746: ** even if that means explicitly writing data to the block of
38747: ** (JOURNAL_HDR_SZ - 28) bytes that will not be used. So that is what
38748: ** is done.
38749: **
38750: ** The loop is required here in case the sector-size is larger than the
38751: ** database page size. Since the zHeader buffer is only Pager.pageSize
38752: ** bytes in size, more than one call to sqlite3OsWrite() may be required
38753: ** to populate the entire journal header sector.
38754: */
38755: for(nWrite=0; rc==SQLITE_OK&&nWrite<JOURNAL_HDR_SZ(pPager); nWrite+=nHeader){
38756: IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, nHeader))
38757: rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff);
38758: assert( pPager->journalHdr <= pPager->journalOff );
38759: pPager->journalOff += nHeader;
38760: }
38761:
38762: return rc;
38763: }
38764:
38765: /*
38766: ** The journal file must be open when this is called. A journal header file
38767: ** (JOURNAL_HDR_SZ bytes) is read from the current location in the journal
38768: ** file. The current location in the journal file is given by
38769: ** pPager->journalOff. See comments above function writeJournalHdr() for
38770: ** a description of the journal header format.
38771: **
38772: ** If the header is read successfully, *pNRec is set to the number of
38773: ** page records following this header and *pDbSize is set to the size of the
38774: ** database before the transaction began, in pages. Also, pPager->cksumInit
38775: ** is set to the value read from the journal header. SQLITE_OK is returned
38776: ** in this case.
38777: **
38778: ** If the journal header file appears to be corrupted, SQLITE_DONE is
38779: ** returned and *pNRec and *PDbSize are undefined. If JOURNAL_HDR_SZ bytes
38780: ** cannot be read from the journal file an error code is returned.
38781: */
38782: static int readJournalHdr(
38783: Pager *pPager, /* Pager object */
38784: int isHot,
38785: i64 journalSize, /* Size of the open journal file in bytes */
38786: u32 *pNRec, /* OUT: Value read from the nRec field */
38787: u32 *pDbSize /* OUT: Value of original database size field */
38788: ){
38789: int rc; /* Return code */
38790: unsigned char aMagic[8]; /* A buffer to hold the magic header */
38791: i64 iHdrOff; /* Offset of journal header being read */
38792:
38793: assert( isOpen(pPager->jfd) ); /* Journal file must be open. */
38794:
38795: /* Advance Pager.journalOff to the start of the next sector. If the
38796: ** journal file is too small for there to be a header stored at this
38797: ** point, return SQLITE_DONE.
38798: */
38799: pPager->journalOff = journalHdrOffset(pPager);
38800: if( pPager->journalOff+JOURNAL_HDR_SZ(pPager) > journalSize ){
38801: return SQLITE_DONE;
38802: }
38803: iHdrOff = pPager->journalOff;
38804:
38805: /* Read in the first 8 bytes of the journal header. If they do not match
38806: ** the magic string found at the start of each journal header, return
38807: ** SQLITE_DONE. If an IO error occurs, return an error code. Otherwise,
38808: ** proceed.
38809: */
38810: if( isHot || iHdrOff!=pPager->journalHdr ){
38811: rc = sqlite3OsRead(pPager->jfd, aMagic, sizeof(aMagic), iHdrOff);
38812: if( rc ){
38813: return rc;
38814: }
38815: if( memcmp(aMagic, aJournalMagic, sizeof(aMagic))!=0 ){
38816: return SQLITE_DONE;
38817: }
38818: }
38819:
38820: /* Read the first three 32-bit fields of the journal header: The nRec
38821: ** field, the checksum-initializer and the database size at the start
38822: ** of the transaction. Return an error code if anything goes wrong.
38823: */
38824: if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+8, pNRec))
38825: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+12, &pPager->cksumInit))
38826: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+16, pDbSize))
38827: ){
38828: return rc;
38829: }
38830:
38831: if( pPager->journalOff==0 ){
38832: u32 iPageSize; /* Page-size field of journal header */
38833: u32 iSectorSize; /* Sector-size field of journal header */
38834:
38835: /* Read the page-size and sector-size journal header fields. */
38836: if( SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+20, &iSectorSize))
38837: || SQLITE_OK!=(rc = read32bits(pPager->jfd, iHdrOff+24, &iPageSize))
38838: ){
38839: return rc;
38840: }
38841:
38842: /* Versions of SQLite prior to 3.5.8 set the page-size field of the
38843: ** journal header to zero. In this case, assume that the Pager.pageSize
38844: ** variable is already set to the correct page size.
38845: */
38846: if( iPageSize==0 ){
38847: iPageSize = pPager->pageSize;
38848: }
38849:
38850: /* Check that the values read from the page-size and sector-size fields
38851: ** are within range. To be 'in range', both values need to be a power
38852: ** of two greater than or equal to 512 or 32, and not greater than their
38853: ** respective compile time maximum limits.
38854: */
38855: if( iPageSize<512 || iSectorSize<32
38856: || iPageSize>SQLITE_MAX_PAGE_SIZE || iSectorSize>MAX_SECTOR_SIZE
38857: || ((iPageSize-1)&iPageSize)!=0 || ((iSectorSize-1)&iSectorSize)!=0
38858: ){
38859: /* If the either the page-size or sector-size in the journal-header is
38860: ** invalid, then the process that wrote the journal-header must have
38861: ** crashed before the header was synced. In this case stop reading
38862: ** the journal file here.
38863: */
38864: return SQLITE_DONE;
38865: }
38866:
38867: /* Update the page-size to match the value read from the journal.
38868: ** Use a testcase() macro to make sure that malloc failure within
38869: ** PagerSetPagesize() is tested.
38870: */
38871: rc = sqlite3PagerSetPagesize(pPager, &iPageSize, -1);
38872: testcase( rc!=SQLITE_OK );
38873:
38874: /* Update the assumed sector-size to match the value used by
38875: ** the process that created this journal. If this journal was
38876: ** created by a process other than this one, then this routine
38877: ** is being called from within pager_playback(). The local value
38878: ** of Pager.sectorSize is restored at the end of that routine.
38879: */
38880: pPager->sectorSize = iSectorSize;
38881: }
38882:
38883: pPager->journalOff += JOURNAL_HDR_SZ(pPager);
38884: return rc;
38885: }
38886:
38887:
38888: /*
38889: ** Write the supplied master journal name into the journal file for pager
38890: ** pPager at the current location. The master journal name must be the last
38891: ** thing written to a journal file. If the pager is in full-sync mode, the
38892: ** journal file descriptor is advanced to the next sector boundary before
38893: ** anything is written. The format is:
38894: **
38895: ** + 4 bytes: PAGER_MJ_PGNO.
38896: ** + N bytes: Master journal filename in utf-8.
38897: ** + 4 bytes: N (length of master journal name in bytes, no nul-terminator).
38898: ** + 4 bytes: Master journal name checksum.
38899: ** + 8 bytes: aJournalMagic[].
38900: **
38901: ** The master journal page checksum is the sum of the bytes in the master
38902: ** journal name, where each byte is interpreted as a signed 8-bit integer.
38903: **
38904: ** If zMaster is a NULL pointer (occurs for a single database transaction),
38905: ** this call is a no-op.
38906: */
38907: static int writeMasterJournal(Pager *pPager, const char *zMaster){
38908: int rc; /* Return code */
38909: int nMaster; /* Length of string zMaster */
38910: i64 iHdrOff; /* Offset of header in journal file */
38911: i64 jrnlSize; /* Size of journal file on disk */
38912: u32 cksum = 0; /* Checksum of string zMaster */
38913:
38914: assert( pPager->setMaster==0 );
38915: assert( !pagerUseWal(pPager) );
38916:
38917: if( !zMaster
38918: || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
38919: || pPager->journalMode==PAGER_JOURNALMODE_OFF
38920: ){
38921: return SQLITE_OK;
38922: }
38923: pPager->setMaster = 1;
38924: assert( isOpen(pPager->jfd) );
38925: assert( pPager->journalHdr <= pPager->journalOff );
38926:
38927: /* Calculate the length in bytes and the checksum of zMaster */
38928: for(nMaster=0; zMaster[nMaster]; nMaster++){
38929: cksum += zMaster[nMaster];
38930: }
38931:
38932: /* If in full-sync mode, advance to the next disk sector before writing
38933: ** the master journal name. This is in case the previous page written to
38934: ** the journal has already been synced.
38935: */
38936: if( pPager->fullSync ){
38937: pPager->journalOff = journalHdrOffset(pPager);
38938: }
38939: iHdrOff = pPager->journalOff;
38940:
38941: /* Write the master journal data to the end of the journal file. If
38942: ** an error occurs, return the error code to the caller.
38943: */
38944: if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager))))
38945: || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4)))
38946: || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster)))
38947: || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum)))
38948: || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, iHdrOff+4+nMaster+8)))
38949: ){
38950: return rc;
38951: }
38952: pPager->journalOff += (nMaster+20);
38953:
38954: /* If the pager is in peristent-journal mode, then the physical
38955: ** journal-file may extend past the end of the master-journal name
38956: ** and 8 bytes of magic data just written to the file. This is
38957: ** dangerous because the code to rollback a hot-journal file
38958: ** will not be able to find the master-journal name to determine
38959: ** whether or not the journal is hot.
38960: **
38961: ** Easiest thing to do in this scenario is to truncate the journal
38962: ** file to the required size.
38963: */
38964: if( SQLITE_OK==(rc = sqlite3OsFileSize(pPager->jfd, &jrnlSize))
38965: && jrnlSize>pPager->journalOff
38966: ){
38967: rc = sqlite3OsTruncate(pPager->jfd, pPager->journalOff);
38968: }
38969: return rc;
38970: }
38971:
38972: /*
38973: ** Find a page in the hash table given its page number. Return
38974: ** a pointer to the page or NULL if the requested page is not
38975: ** already in memory.
38976: */
38977: static PgHdr *pager_lookup(Pager *pPager, Pgno pgno){
38978: PgHdr *p; /* Return value */
38979:
38980: /* It is not possible for a call to PcacheFetch() with createFlag==0 to
38981: ** fail, since no attempt to allocate dynamic memory will be made.
38982: */
38983: (void)sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &p);
38984: return p;
38985: }
38986:
38987: /*
38988: ** Discard the entire contents of the in-memory page-cache.
38989: */
38990: static void pager_reset(Pager *pPager){
38991: sqlite3BackupRestart(pPager->pBackup);
38992: sqlite3PcacheClear(pPager->pPCache);
38993: }
38994:
38995: /*
38996: ** Free all structures in the Pager.aSavepoint[] array and set both
38997: ** Pager.aSavepoint and Pager.nSavepoint to zero. Close the sub-journal
38998: ** if it is open and the pager is not in exclusive mode.
38999: */
39000: static void releaseAllSavepoints(Pager *pPager){
39001: int ii; /* Iterator for looping through Pager.aSavepoint */
39002: for(ii=0; ii<pPager->nSavepoint; ii++){
39003: sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
39004: }
39005: if( !pPager->exclusiveMode || sqlite3IsMemJournal(pPager->sjfd) ){
39006: sqlite3OsClose(pPager->sjfd);
39007: }
39008: sqlite3_free(pPager->aSavepoint);
39009: pPager->aSavepoint = 0;
39010: pPager->nSavepoint = 0;
39011: pPager->nSubRec = 0;
39012: }
39013:
39014: /*
39015: ** Set the bit number pgno in the PagerSavepoint.pInSavepoint
39016: ** bitvecs of all open savepoints. Return SQLITE_OK if successful
39017: ** or SQLITE_NOMEM if a malloc failure occurs.
39018: */
39019: static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){
39020: int ii; /* Loop counter */
39021: int rc = SQLITE_OK; /* Result code */
39022:
39023: for(ii=0; ii<pPager->nSavepoint; ii++){
39024: PagerSavepoint *p = &pPager->aSavepoint[ii];
39025: if( pgno<=p->nOrig ){
39026: rc |= sqlite3BitvecSet(p->pInSavepoint, pgno);
39027: testcase( rc==SQLITE_NOMEM );
39028: assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
39029: }
39030: }
39031: return rc;
39032: }
39033:
39034: /*
39035: ** This function is a no-op if the pager is in exclusive mode and not
39036: ** in the ERROR state. Otherwise, it switches the pager to PAGER_OPEN
39037: ** state.
39038: **
39039: ** If the pager is not in exclusive-access mode, the database file is
39040: ** completely unlocked. If the file is unlocked and the file-system does
39041: ** not exhibit the UNDELETABLE_WHEN_OPEN property, the journal file is
39042: ** closed (if it is open).
39043: **
39044: ** If the pager is in ERROR state when this function is called, the
39045: ** contents of the pager cache are discarded before switching back to
39046: ** the OPEN state. Regardless of whether the pager is in exclusive-mode
39047: ** or not, any journal file left in the file-system will be treated
39048: ** as a hot-journal and rolled back the next time a read-transaction
39049: ** is opened (by this or by any other connection).
39050: */
39051: static void pager_unlock(Pager *pPager){
39052:
39053: assert( pPager->eState==PAGER_READER
39054: || pPager->eState==PAGER_OPEN
39055: || pPager->eState==PAGER_ERROR
39056: );
39057:
39058: sqlite3BitvecDestroy(pPager->pInJournal);
39059: pPager->pInJournal = 0;
39060: releaseAllSavepoints(pPager);
39061:
39062: if( pagerUseWal(pPager) ){
39063: assert( !isOpen(pPager->jfd) );
39064: sqlite3WalEndReadTransaction(pPager->pWal);
39065: pPager->eState = PAGER_OPEN;
39066: }else if( !pPager->exclusiveMode ){
39067: int rc; /* Error code returned by pagerUnlockDb() */
39068: int iDc = isOpen(pPager->fd)?sqlite3OsDeviceCharacteristics(pPager->fd):0;
39069:
39070: /* If the operating system support deletion of open files, then
39071: ** close the journal file when dropping the database lock. Otherwise
39072: ** another connection with journal_mode=delete might delete the file
39073: ** out from under us.
39074: */
39075: assert( (PAGER_JOURNALMODE_MEMORY & 5)!=1 );
39076: assert( (PAGER_JOURNALMODE_OFF & 5)!=1 );
39077: assert( (PAGER_JOURNALMODE_WAL & 5)!=1 );
39078: assert( (PAGER_JOURNALMODE_DELETE & 5)!=1 );
39079: assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
39080: assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 );
39081: if( 0==(iDc & SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN)
39082: || 1!=(pPager->journalMode & 5)
39083: ){
39084: sqlite3OsClose(pPager->jfd);
39085: }
39086:
39087: /* If the pager is in the ERROR state and the call to unlock the database
39088: ** file fails, set the current lock to UNKNOWN_LOCK. See the comment
39089: ** above the #define for UNKNOWN_LOCK for an explanation of why this
39090: ** is necessary.
39091: */
39092: rc = pagerUnlockDb(pPager, NO_LOCK);
39093: if( rc!=SQLITE_OK && pPager->eState==PAGER_ERROR ){
39094: pPager->eLock = UNKNOWN_LOCK;
39095: }
39096:
39097: /* The pager state may be changed from PAGER_ERROR to PAGER_OPEN here
39098: ** without clearing the error code. This is intentional - the error
39099: ** code is cleared and the cache reset in the block below.
39100: */
39101: assert( pPager->errCode || pPager->eState!=PAGER_ERROR );
39102: pPager->changeCountDone = 0;
39103: pPager->eState = PAGER_OPEN;
39104: }
39105:
39106: /* If Pager.errCode is set, the contents of the pager cache cannot be
39107: ** trusted. Now that there are no outstanding references to the pager,
39108: ** it can safely move back to PAGER_OPEN state. This happens in both
39109: ** normal and exclusive-locking mode.
39110: */
39111: if( pPager->errCode ){
39112: assert( !MEMDB );
39113: pager_reset(pPager);
39114: pPager->changeCountDone = pPager->tempFile;
39115: pPager->eState = PAGER_OPEN;
39116: pPager->errCode = SQLITE_OK;
39117: }
39118:
39119: pPager->journalOff = 0;
39120: pPager->journalHdr = 0;
39121: pPager->setMaster = 0;
39122: }
39123:
39124: /*
39125: ** This function is called whenever an IOERR or FULL error that requires
39126: ** the pager to transition into the ERROR state may ahve occurred.
39127: ** The first argument is a pointer to the pager structure, the second
39128: ** the error-code about to be returned by a pager API function. The
39129: ** value returned is a copy of the second argument to this function.
39130: **
39131: ** If the second argument is SQLITE_FULL, SQLITE_IOERR or one of the
39132: ** IOERR sub-codes, the pager enters the ERROR state and the error code
39133: ** is stored in Pager.errCode. While the pager remains in the ERROR state,
39134: ** all major API calls on the Pager will immediately return Pager.errCode.
39135: **
39136: ** The ERROR state indicates that the contents of the pager-cache
39137: ** cannot be trusted. This state can be cleared by completely discarding
39138: ** the contents of the pager-cache. If a transaction was active when
39139: ** the persistent error occurred, then the rollback journal may need
39140: ** to be replayed to restore the contents of the database file (as if
39141: ** it were a hot-journal).
39142: */
39143: static int pager_error(Pager *pPager, int rc){
39144: int rc2 = rc & 0xff;
39145: assert( rc==SQLITE_OK || !MEMDB );
39146: assert(
39147: pPager->errCode==SQLITE_FULL ||
39148: pPager->errCode==SQLITE_OK ||
39149: (pPager->errCode & 0xff)==SQLITE_IOERR
39150: );
39151: if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){
39152: pPager->errCode = rc;
39153: pPager->eState = PAGER_ERROR;
39154: }
39155: return rc;
39156: }
39157:
39158: /*
39159: ** This routine ends a transaction. A transaction is usually ended by
39160: ** either a COMMIT or a ROLLBACK operation. This routine may be called
39161: ** after rollback of a hot-journal, or if an error occurs while opening
39162: ** the journal file or writing the very first journal-header of a
39163: ** database transaction.
39164: **
39165: ** This routine is never called in PAGER_ERROR state. If it is called
39166: ** in PAGER_NONE or PAGER_SHARED state and the lock held is less
39167: ** exclusive than a RESERVED lock, it is a no-op.
39168: **
39169: ** Otherwise, any active savepoints are released.
39170: **
39171: ** If the journal file is open, then it is "finalized". Once a journal
39172: ** file has been finalized it is not possible to use it to roll back a
39173: ** transaction. Nor will it be considered to be a hot-journal by this
39174: ** or any other database connection. Exactly how a journal is finalized
39175: ** depends on whether or not the pager is running in exclusive mode and
39176: ** the current journal-mode (Pager.journalMode value), as follows:
39177: **
39178: ** journalMode==MEMORY
39179: ** Journal file descriptor is simply closed. This destroys an
39180: ** in-memory journal.
39181: **
39182: ** journalMode==TRUNCATE
39183: ** Journal file is truncated to zero bytes in size.
39184: **
39185: ** journalMode==PERSIST
39186: ** The first 28 bytes of the journal file are zeroed. This invalidates
39187: ** the first journal header in the file, and hence the entire journal
39188: ** file. An invalid journal file cannot be rolled back.
39189: **
39190: ** journalMode==DELETE
39191: ** The journal file is closed and deleted using sqlite3OsDelete().
39192: **
39193: ** If the pager is running in exclusive mode, this method of finalizing
39194: ** the journal file is never used. Instead, if the journalMode is
39195: ** DELETE and the pager is in exclusive mode, the method described under
39196: ** journalMode==PERSIST is used instead.
39197: **
39198: ** After the journal is finalized, the pager moves to PAGER_READER state.
39199: ** If running in non-exclusive rollback mode, the lock on the file is
39200: ** downgraded to a SHARED_LOCK.
39201: **
39202: ** SQLITE_OK is returned if no error occurs. If an error occurs during
39203: ** any of the IO operations to finalize the journal file or unlock the
39204: ** database then the IO error code is returned to the user. If the
39205: ** operation to finalize the journal file fails, then the code still
39206: ** tries to unlock the database file if not in exclusive mode. If the
39207: ** unlock operation fails as well, then the first error code related
39208: ** to the first error encountered (the journal finalization one) is
39209: ** returned.
39210: */
39211: static int pager_end_transaction(Pager *pPager, int hasMaster){
39212: int rc = SQLITE_OK; /* Error code from journal finalization operation */
39213: int rc2 = SQLITE_OK; /* Error code from db file unlock operation */
39214:
39215: /* Do nothing if the pager does not have an open write transaction
39216: ** or at least a RESERVED lock. This function may be called when there
39217: ** is no write-transaction active but a RESERVED or greater lock is
39218: ** held under two circumstances:
39219: **
39220: ** 1. After a successful hot-journal rollback, it is called with
39221: ** eState==PAGER_NONE and eLock==EXCLUSIVE_LOCK.
39222: **
39223: ** 2. If a connection with locking_mode=exclusive holding an EXCLUSIVE
39224: ** lock switches back to locking_mode=normal and then executes a
39225: ** read-transaction, this function is called with eState==PAGER_READER
39226: ** and eLock==EXCLUSIVE_LOCK when the read-transaction is closed.
39227: */
39228: assert( assert_pager_state(pPager) );
39229: assert( pPager->eState!=PAGER_ERROR );
39230: if( pPager->eState<PAGER_WRITER_LOCKED && pPager->eLock<RESERVED_LOCK ){
39231: return SQLITE_OK;
39232: }
39233:
39234: releaseAllSavepoints(pPager);
39235: assert( isOpen(pPager->jfd) || pPager->pInJournal==0 );
39236: if( isOpen(pPager->jfd) ){
39237: assert( !pagerUseWal(pPager) );
39238:
39239: /* Finalize the journal file. */
39240: if( sqlite3IsMemJournal(pPager->jfd) ){
39241: assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY );
39242: sqlite3OsClose(pPager->jfd);
39243: }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){
39244: if( pPager->journalOff==0 ){
39245: rc = SQLITE_OK;
39246: }else{
39247: rc = sqlite3OsTruncate(pPager->jfd, 0);
39248: }
39249: pPager->journalOff = 0;
39250: }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST
39251: || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL)
39252: ){
39253: rc = zeroJournalHdr(pPager, hasMaster);
39254: pPager->journalOff = 0;
39255: }else{
39256: /* This branch may be executed with Pager.journalMode==MEMORY if
39257: ** a hot-journal was just rolled back. In this case the journal
39258: ** file should be closed and deleted. If this connection writes to
39259: ** the database file, it will do so using an in-memory journal.
39260: */
1.2.2.1 ! misho 39261: int bDelete = (!pPager->tempFile && sqlite3JournalExists(pPager->jfd));
1.2 misho 39262: assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE
39263: || pPager->journalMode==PAGER_JOURNALMODE_MEMORY
39264: || pPager->journalMode==PAGER_JOURNALMODE_WAL
39265: );
39266: sqlite3OsClose(pPager->jfd);
1.2.2.1 ! misho 39267: if( bDelete ){
1.2 misho 39268: rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
39269: }
39270: }
39271: }
39272:
39273: #ifdef SQLITE_CHECK_PAGES
39274: sqlite3PcacheIterateDirty(pPager->pPCache, pager_set_pagehash);
39275: if( pPager->dbSize==0 && sqlite3PcacheRefCount(pPager->pPCache)>0 ){
39276: PgHdr *p = pager_lookup(pPager, 1);
39277: if( p ){
39278: p->pageHash = 0;
39279: sqlite3PagerUnref(p);
39280: }
39281: }
39282: #endif
39283:
39284: sqlite3BitvecDestroy(pPager->pInJournal);
39285: pPager->pInJournal = 0;
39286: pPager->nRec = 0;
39287: sqlite3PcacheCleanAll(pPager->pPCache);
39288: sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize);
39289:
39290: if( pagerUseWal(pPager) ){
39291: /* Drop the WAL write-lock, if any. Also, if the connection was in
39292: ** locking_mode=exclusive mode but is no longer, drop the EXCLUSIVE
39293: ** lock held on the database file.
39294: */
39295: rc2 = sqlite3WalEndWriteTransaction(pPager->pWal);
39296: assert( rc2==SQLITE_OK );
39297: }
39298: if( !pPager->exclusiveMode
39299: && (!pagerUseWal(pPager) || sqlite3WalExclusiveMode(pPager->pWal, 0))
39300: ){
39301: rc2 = pagerUnlockDb(pPager, SHARED_LOCK);
39302: pPager->changeCountDone = 0;
39303: }
39304: pPager->eState = PAGER_READER;
39305: pPager->setMaster = 0;
39306:
39307: return (rc==SQLITE_OK?rc2:rc);
39308: }
39309:
39310: /*
39311: ** Execute a rollback if a transaction is active and unlock the
39312: ** database file.
39313: **
39314: ** If the pager has already entered the ERROR state, do not attempt
39315: ** the rollback at this time. Instead, pager_unlock() is called. The
39316: ** call to pager_unlock() will discard all in-memory pages, unlock
39317: ** the database file and move the pager back to OPEN state. If this
39318: ** means that there is a hot-journal left in the file-system, the next
39319: ** connection to obtain a shared lock on the pager (which may be this one)
39320: ** will roll it back.
39321: **
39322: ** If the pager has not already entered the ERROR state, but an IO or
39323: ** malloc error occurs during a rollback, then this will itself cause
39324: ** the pager to enter the ERROR state. Which will be cleared by the
39325: ** call to pager_unlock(), as described above.
39326: */
39327: static void pagerUnlockAndRollback(Pager *pPager){
39328: if( pPager->eState!=PAGER_ERROR && pPager->eState!=PAGER_OPEN ){
39329: assert( assert_pager_state(pPager) );
39330: if( pPager->eState>=PAGER_WRITER_LOCKED ){
39331: sqlite3BeginBenignMalloc();
39332: sqlite3PagerRollback(pPager);
39333: sqlite3EndBenignMalloc();
39334: }else if( !pPager->exclusiveMode ){
39335: assert( pPager->eState==PAGER_READER );
39336: pager_end_transaction(pPager, 0);
39337: }
39338: }
39339: pager_unlock(pPager);
39340: }
39341:
39342: /*
39343: ** Parameter aData must point to a buffer of pPager->pageSize bytes
39344: ** of data. Compute and return a checksum based ont the contents of the
39345: ** page of data and the current value of pPager->cksumInit.
39346: **
39347: ** This is not a real checksum. It is really just the sum of the
39348: ** random initial value (pPager->cksumInit) and every 200th byte
39349: ** of the page data, starting with byte offset (pPager->pageSize%200).
39350: ** Each byte is interpreted as an 8-bit unsigned integer.
39351: **
39352: ** Changing the formula used to compute this checksum results in an
39353: ** incompatible journal file format.
39354: **
39355: ** If journal corruption occurs due to a power failure, the most likely
39356: ** scenario is that one end or the other of the record will be changed.
39357: ** It is much less likely that the two ends of the journal record will be
39358: ** correct and the middle be corrupt. Thus, this "checksum" scheme,
39359: ** though fast and simple, catches the mostly likely kind of corruption.
39360: */
39361: static u32 pager_cksum(Pager *pPager, const u8 *aData){
39362: u32 cksum = pPager->cksumInit; /* Checksum value to return */
39363: int i = pPager->pageSize-200; /* Loop counter */
39364: while( i>0 ){
39365: cksum += aData[i];
39366: i -= 200;
39367: }
39368: return cksum;
39369: }
39370:
39371: /*
39372: ** Report the current page size and number of reserved bytes back
39373: ** to the codec.
39374: */
39375: #ifdef SQLITE_HAS_CODEC
39376: static void pagerReportSize(Pager *pPager){
39377: if( pPager->xCodecSizeChng ){
39378: pPager->xCodecSizeChng(pPager->pCodec, pPager->pageSize,
39379: (int)pPager->nReserve);
39380: }
39381: }
39382: #else
39383: # define pagerReportSize(X) /* No-op if we do not support a codec */
39384: #endif
39385:
39386: /*
39387: ** Read a single page from either the journal file (if isMainJrnl==1) or
39388: ** from the sub-journal (if isMainJrnl==0) and playback that page.
39389: ** The page begins at offset *pOffset into the file. The *pOffset
39390: ** value is increased to the start of the next page in the journal.
39391: **
39392: ** The main rollback journal uses checksums - the statement journal does
39393: ** not.
39394: **
39395: ** If the page number of the page record read from the (sub-)journal file
39396: ** is greater than the current value of Pager.dbSize, then playback is
39397: ** skipped and SQLITE_OK is returned.
39398: **
39399: ** If pDone is not NULL, then it is a record of pages that have already
39400: ** been played back. If the page at *pOffset has already been played back
39401: ** (if the corresponding pDone bit is set) then skip the playback.
39402: ** Make sure the pDone bit corresponding to the *pOffset page is set
39403: ** prior to returning.
39404: **
39405: ** If the page record is successfully read from the (sub-)journal file
39406: ** and played back, then SQLITE_OK is returned. If an IO error occurs
39407: ** while reading the record from the (sub-)journal file or while writing
39408: ** to the database file, then the IO error code is returned. If data
39409: ** is successfully read from the (sub-)journal file but appears to be
39410: ** corrupted, SQLITE_DONE is returned. Data is considered corrupted in
39411: ** two circumstances:
39412: **
39413: ** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or
39414: ** * If the record is being rolled back from the main journal file
39415: ** and the checksum field does not match the record content.
39416: **
39417: ** Neither of these two scenarios are possible during a savepoint rollback.
39418: **
39419: ** If this is a savepoint rollback, then memory may have to be dynamically
39420: ** allocated by this function. If this is the case and an allocation fails,
39421: ** SQLITE_NOMEM is returned.
39422: */
39423: static int pager_playback_one_page(
39424: Pager *pPager, /* The pager being played back */
39425: i64 *pOffset, /* Offset of record to playback */
39426: Bitvec *pDone, /* Bitvec of pages already played back */
39427: int isMainJrnl, /* 1 -> main journal. 0 -> sub-journal. */
39428: int isSavepnt /* True for a savepoint rollback */
39429: ){
39430: int rc;
39431: PgHdr *pPg; /* An existing page in the cache */
39432: Pgno pgno; /* The page number of a page in journal */
39433: u32 cksum; /* Checksum used for sanity checking */
39434: char *aData; /* Temporary storage for the page */
39435: sqlite3_file *jfd; /* The file descriptor for the journal file */
39436: int isSynced; /* True if journal page is synced */
39437:
39438: assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */
39439: assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */
39440: assert( isMainJrnl || pDone ); /* pDone always used on sub-journals */
39441: assert( isSavepnt || pDone==0 ); /* pDone never used on non-savepoint */
39442:
39443: aData = pPager->pTmpSpace;
39444: assert( aData ); /* Temp storage must have already been allocated */
39445: assert( pagerUseWal(pPager)==0 || (!isMainJrnl && isSavepnt) );
39446:
39447: /* Either the state is greater than PAGER_WRITER_CACHEMOD (a transaction
39448: ** or savepoint rollback done at the request of the caller) or this is
39449: ** a hot-journal rollback. If it is a hot-journal rollback, the pager
39450: ** is in state OPEN and holds an EXCLUSIVE lock. Hot-journal rollback
39451: ** only reads from the main journal, not the sub-journal.
39452: */
39453: assert( pPager->eState>=PAGER_WRITER_CACHEMOD
39454: || (pPager->eState==PAGER_OPEN && pPager->eLock==EXCLUSIVE_LOCK)
39455: );
39456: assert( pPager->eState>=PAGER_WRITER_CACHEMOD || isMainJrnl );
39457:
39458: /* Read the page number and page data from the journal or sub-journal
39459: ** file. Return an error code to the caller if an IO error occurs.
39460: */
39461: jfd = isMainJrnl ? pPager->jfd : pPager->sjfd;
39462: rc = read32bits(jfd, *pOffset, &pgno);
39463: if( rc!=SQLITE_OK ) return rc;
39464: rc = sqlite3OsRead(jfd, (u8*)aData, pPager->pageSize, (*pOffset)+4);
39465: if( rc!=SQLITE_OK ) return rc;
39466: *pOffset += pPager->pageSize + 4 + isMainJrnl*4;
39467:
39468: /* Sanity checking on the page. This is more important that I originally
39469: ** thought. If a power failure occurs while the journal is being written,
39470: ** it could cause invalid data to be written into the journal. We need to
39471: ** detect this invalid data (with high probability) and ignore it.
39472: */
39473: if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){
39474: assert( !isSavepnt );
39475: return SQLITE_DONE;
39476: }
39477: if( pgno>(Pgno)pPager->dbSize || sqlite3BitvecTest(pDone, pgno) ){
39478: return SQLITE_OK;
39479: }
39480: if( isMainJrnl ){
39481: rc = read32bits(jfd, (*pOffset)-4, &cksum);
39482: if( rc ) return rc;
39483: if( !isSavepnt && pager_cksum(pPager, (u8*)aData)!=cksum ){
39484: return SQLITE_DONE;
39485: }
39486: }
39487:
39488: /* If this page has already been played by before during the current
39489: ** rollback, then don't bother to play it back again.
39490: */
39491: if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){
39492: return rc;
39493: }
39494:
39495: /* When playing back page 1, restore the nReserve setting
39496: */
39497: if( pgno==1 && pPager->nReserve!=((u8*)aData)[20] ){
39498: pPager->nReserve = ((u8*)aData)[20];
39499: pagerReportSize(pPager);
39500: }
39501:
39502: /* If the pager is in CACHEMOD state, then there must be a copy of this
39503: ** page in the pager cache. In this case just update the pager cache,
39504: ** not the database file. The page is left marked dirty in this case.
39505: **
39506: ** An exception to the above rule: If the database is in no-sync mode
39507: ** and a page is moved during an incremental vacuum then the page may
39508: ** not be in the pager cache. Later: if a malloc() or IO error occurs
39509: ** during a Movepage() call, then the page may not be in the cache
39510: ** either. So the condition described in the above paragraph is not
39511: ** assert()able.
39512: **
39513: ** If in WRITER_DBMOD, WRITER_FINISHED or OPEN state, then we update the
39514: ** pager cache if it exists and the main file. The page is then marked
39515: ** not dirty. Since this code is only executed in PAGER_OPEN state for
39516: ** a hot-journal rollback, it is guaranteed that the page-cache is empty
39517: ** if the pager is in OPEN state.
39518: **
39519: ** Ticket #1171: The statement journal might contain page content that is
39520: ** different from the page content at the start of the transaction.
39521: ** This occurs when a page is changed prior to the start of a statement
39522: ** then changed again within the statement. When rolling back such a
39523: ** statement we must not write to the original database unless we know
39524: ** for certain that original page contents are synced into the main rollback
39525: ** journal. Otherwise, a power loss might leave modified data in the
39526: ** database file without an entry in the rollback journal that can
39527: ** restore the database to its original form. Two conditions must be
39528: ** met before writing to the database files. (1) the database must be
39529: ** locked. (2) we know that the original page content is fully synced
39530: ** in the main journal either because the page is not in cache or else
39531: ** the page is marked as needSync==0.
39532: **
39533: ** 2008-04-14: When attempting to vacuum a corrupt database file, it
39534: ** is possible to fail a statement on a database that does not yet exist.
39535: ** Do not attempt to write if database file has never been opened.
39536: */
39537: if( pagerUseWal(pPager) ){
39538: pPg = 0;
39539: }else{
39540: pPg = pager_lookup(pPager, pgno);
39541: }
39542: assert( pPg || !MEMDB );
39543: assert( pPager->eState!=PAGER_OPEN || pPg==0 );
39544: PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n",
39545: PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData),
39546: (isMainJrnl?"main-journal":"sub-journal")
39547: ));
39548: if( isMainJrnl ){
39549: isSynced = pPager->noSync || (*pOffset <= pPager->journalHdr);
39550: }else{
39551: isSynced = (pPg==0 || 0==(pPg->flags & PGHDR_NEED_SYNC));
39552: }
39553: if( isOpen(pPager->fd)
39554: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
39555: && isSynced
39556: ){
39557: i64 ofst = (pgno-1)*(i64)pPager->pageSize;
39558: testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 );
39559: assert( !pagerUseWal(pPager) );
39560: rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst);
39561: if( pgno>pPager->dbFileSize ){
39562: pPager->dbFileSize = pgno;
39563: }
39564: if( pPager->pBackup ){
39565: CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM);
39566: sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData);
39567: CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData);
39568: }
39569: }else if( !isMainJrnl && pPg==0 ){
39570: /* If this is a rollback of a savepoint and data was not written to
39571: ** the database and the page is not in-memory, there is a potential
39572: ** problem. When the page is next fetched by the b-tree layer, it
39573: ** will be read from the database file, which may or may not be
39574: ** current.
39575: **
39576: ** There are a couple of different ways this can happen. All are quite
39577: ** obscure. When running in synchronous mode, this can only happen
39578: ** if the page is on the free-list at the start of the transaction, then
39579: ** populated, then moved using sqlite3PagerMovepage().
39580: **
39581: ** The solution is to add an in-memory page to the cache containing
39582: ** the data just read from the sub-journal. Mark the page as dirty
39583: ** and if the pager requires a journal-sync, then mark the page as
39584: ** requiring a journal-sync before it is written.
39585: */
39586: assert( isSavepnt );
39587: assert( pPager->doNotSpill==0 );
39588: pPager->doNotSpill++;
39589: rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1);
39590: assert( pPager->doNotSpill==1 );
39591: pPager->doNotSpill--;
39592: if( rc!=SQLITE_OK ) return rc;
39593: pPg->flags &= ~PGHDR_NEED_READ;
39594: sqlite3PcacheMakeDirty(pPg);
39595: }
39596: if( pPg ){
39597: /* No page should ever be explicitly rolled back that is in use, except
39598: ** for page 1 which is held in use in order to keep the lock on the
39599: ** database active. However such a page may be rolled back as a result
39600: ** of an internal error resulting in an automatic call to
39601: ** sqlite3PagerRollback().
39602: */
39603: void *pData;
39604: pData = pPg->pData;
39605: memcpy(pData, (u8*)aData, pPager->pageSize);
39606: pPager->xReiniter(pPg);
39607: if( isMainJrnl && (!isSavepnt || *pOffset<=pPager->journalHdr) ){
39608: /* If the contents of this page were just restored from the main
39609: ** journal file, then its content must be as they were when the
39610: ** transaction was first opened. In this case we can mark the page
39611: ** as clean, since there will be no need to write it out to the
39612: ** database.
39613: **
39614: ** There is one exception to this rule. If the page is being rolled
39615: ** back as part of a savepoint (or statement) rollback from an
39616: ** unsynced portion of the main journal file, then it is not safe
39617: ** to mark the page as clean. This is because marking the page as
39618: ** clean will clear the PGHDR_NEED_SYNC flag. Since the page is
39619: ** already in the journal file (recorded in Pager.pInJournal) and
39620: ** the PGHDR_NEED_SYNC flag is cleared, if the page is written to
39621: ** again within this transaction, it will be marked as dirty but
39622: ** the PGHDR_NEED_SYNC flag will not be set. It could then potentially
39623: ** be written out into the database file before its journal file
39624: ** segment is synced. If a crash occurs during or following this,
39625: ** database corruption may ensue.
39626: */
39627: assert( !pagerUseWal(pPager) );
39628: sqlite3PcacheMakeClean(pPg);
39629: }
39630: pager_set_pagehash(pPg);
39631:
39632: /* If this was page 1, then restore the value of Pager.dbFileVers.
39633: ** Do this before any decoding. */
39634: if( pgno==1 ){
39635: memcpy(&pPager->dbFileVers, &((u8*)pData)[24],sizeof(pPager->dbFileVers));
39636: }
39637:
39638: /* Decode the page just read from disk */
39639: CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM);
39640: sqlite3PcacheRelease(pPg);
39641: }
39642: return rc;
39643: }
39644:
39645: /*
39646: ** Parameter zMaster is the name of a master journal file. A single journal
39647: ** file that referred to the master journal file has just been rolled back.
39648: ** This routine checks if it is possible to delete the master journal file,
39649: ** and does so if it is.
39650: **
39651: ** Argument zMaster may point to Pager.pTmpSpace. So that buffer is not
39652: ** available for use within this function.
39653: **
39654: ** When a master journal file is created, it is populated with the names
39655: ** of all of its child journals, one after another, formatted as utf-8
39656: ** encoded text. The end of each child journal file is marked with a
39657: ** nul-terminator byte (0x00). i.e. the entire contents of a master journal
39658: ** file for a transaction involving two databases might be:
39659: **
39660: ** "/home/bill/a.db-journal\x00/home/bill/b.db-journal\x00"
39661: **
39662: ** A master journal file may only be deleted once all of its child
39663: ** journals have been rolled back.
39664: **
39665: ** This function reads the contents of the master-journal file into
39666: ** memory and loops through each of the child journal names. For
39667: ** each child journal, it checks if:
39668: **
39669: ** * if the child journal exists, and if so
39670: ** * if the child journal contains a reference to master journal
39671: ** file zMaster
39672: **
39673: ** If a child journal can be found that matches both of the criteria
39674: ** above, this function returns without doing anything. Otherwise, if
39675: ** no such child journal can be found, file zMaster is deleted from
39676: ** the file-system using sqlite3OsDelete().
39677: **
39678: ** If an IO error within this function, an error code is returned. This
39679: ** function allocates memory by calling sqlite3Malloc(). If an allocation
39680: ** fails, SQLITE_NOMEM is returned. Otherwise, if no IO or malloc errors
39681: ** occur, SQLITE_OK is returned.
39682: **
39683: ** TODO: This function allocates a single block of memory to load
39684: ** the entire contents of the master journal file. This could be
39685: ** a couple of kilobytes or so - potentially larger than the page
39686: ** size.
39687: */
39688: static int pager_delmaster(Pager *pPager, const char *zMaster){
39689: sqlite3_vfs *pVfs = pPager->pVfs;
39690: int rc; /* Return code */
39691: sqlite3_file *pMaster; /* Malloc'd master-journal file descriptor */
39692: sqlite3_file *pJournal; /* Malloc'd child-journal file descriptor */
39693: char *zMasterJournal = 0; /* Contents of master journal file */
39694: i64 nMasterJournal; /* Size of master journal file */
39695: char *zJournal; /* Pointer to one journal within MJ file */
39696: char *zMasterPtr; /* Space to hold MJ filename from a journal file */
39697: int nMasterPtr; /* Amount of space allocated to zMasterPtr[] */
39698:
39699: /* Allocate space for both the pJournal and pMaster file descriptors.
39700: ** If successful, open the master journal file for reading.
39701: */
39702: pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2);
39703: pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile);
39704: if( !pMaster ){
39705: rc = SQLITE_NOMEM;
39706: }else{
39707: const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL);
39708: rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0);
39709: }
39710: if( rc!=SQLITE_OK ) goto delmaster_out;
39711:
39712: /* Load the entire master journal file into space obtained from
39713: ** sqlite3_malloc() and pointed to by zMasterJournal. Also obtain
39714: ** sufficient space (in zMasterPtr) to hold the names of master
39715: ** journal files extracted from regular rollback-journals.
39716: */
39717: rc = sqlite3OsFileSize(pMaster, &nMasterJournal);
39718: if( rc!=SQLITE_OK ) goto delmaster_out;
39719: nMasterPtr = pVfs->mxPathname+1;
39720: zMasterJournal = sqlite3Malloc((int)nMasterJournal + nMasterPtr + 1);
39721: if( !zMasterJournal ){
39722: rc = SQLITE_NOMEM;
39723: goto delmaster_out;
39724: }
39725: zMasterPtr = &zMasterJournal[nMasterJournal+1];
39726: rc = sqlite3OsRead(pMaster, zMasterJournal, (int)nMasterJournal, 0);
39727: if( rc!=SQLITE_OK ) goto delmaster_out;
39728: zMasterJournal[nMasterJournal] = 0;
39729:
39730: zJournal = zMasterJournal;
39731: while( (zJournal-zMasterJournal)<nMasterJournal ){
39732: int exists;
39733: rc = sqlite3OsAccess(pVfs, zJournal, SQLITE_ACCESS_EXISTS, &exists);
39734: if( rc!=SQLITE_OK ){
39735: goto delmaster_out;
39736: }
39737: if( exists ){
39738: /* One of the journals pointed to by the master journal exists.
39739: ** Open it and check if it points at the master journal. If
39740: ** so, return without deleting the master journal file.
39741: */
39742: int c;
39743: int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL);
39744: rc = sqlite3OsOpen(pVfs, zJournal, pJournal, flags, 0);
39745: if( rc!=SQLITE_OK ){
39746: goto delmaster_out;
39747: }
39748:
39749: rc = readMasterJournal(pJournal, zMasterPtr, nMasterPtr);
39750: sqlite3OsClose(pJournal);
39751: if( rc!=SQLITE_OK ){
39752: goto delmaster_out;
39753: }
39754:
39755: c = zMasterPtr[0]!=0 && strcmp(zMasterPtr, zMaster)==0;
39756: if( c ){
39757: /* We have a match. Do not delete the master journal file. */
39758: goto delmaster_out;
39759: }
39760: }
39761: zJournal += (sqlite3Strlen30(zJournal)+1);
39762: }
39763:
39764: sqlite3OsClose(pMaster);
39765: rc = sqlite3OsDelete(pVfs, zMaster, 0);
39766:
39767: delmaster_out:
39768: sqlite3_free(zMasterJournal);
39769: if( pMaster ){
39770: sqlite3OsClose(pMaster);
39771: assert( !isOpen(pJournal) );
39772: sqlite3_free(pMaster);
39773: }
39774: return rc;
39775: }
39776:
39777:
39778: /*
39779: ** This function is used to change the actual size of the database
39780: ** file in the file-system. This only happens when committing a transaction,
39781: ** or rolling back a transaction (including rolling back a hot-journal).
39782: **
39783: ** If the main database file is not open, or the pager is not in either
39784: ** DBMOD or OPEN state, this function is a no-op. Otherwise, the size
39785: ** of the file is changed to nPage pages (nPage*pPager->pageSize bytes).
39786: ** If the file on disk is currently larger than nPage pages, then use the VFS
39787: ** xTruncate() method to truncate it.
39788: **
39789: ** Or, it might might be the case that the file on disk is smaller than
39790: ** nPage pages. Some operating system implementations can get confused if
39791: ** you try to truncate a file to some size that is larger than it
39792: ** currently is, so detect this case and write a single zero byte to
39793: ** the end of the new file instead.
39794: **
39795: ** If successful, return SQLITE_OK. If an IO error occurs while modifying
39796: ** the database file, return the error code to the caller.
39797: */
39798: static int pager_truncate(Pager *pPager, Pgno nPage){
39799: int rc = SQLITE_OK;
39800: assert( pPager->eState!=PAGER_ERROR );
39801: assert( pPager->eState!=PAGER_READER );
39802:
39803: if( isOpen(pPager->fd)
39804: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
39805: ){
39806: i64 currentSize, newSize;
39807: int szPage = pPager->pageSize;
39808: assert( pPager->eLock==EXCLUSIVE_LOCK );
39809: /* TODO: Is it safe to use Pager.dbFileSize here? */
39810: rc = sqlite3OsFileSize(pPager->fd, ¤tSize);
39811: newSize = szPage*(i64)nPage;
39812: if( rc==SQLITE_OK && currentSize!=newSize ){
39813: if( currentSize>newSize ){
39814: rc = sqlite3OsTruncate(pPager->fd, newSize);
39815: }else if( (currentSize+szPage)<=newSize ){
39816: char *pTmp = pPager->pTmpSpace;
39817: memset(pTmp, 0, szPage);
39818: testcase( (newSize-szPage) == currentSize );
39819: testcase( (newSize-szPage) > currentSize );
39820: rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage);
39821: }
39822: if( rc==SQLITE_OK ){
39823: pPager->dbFileSize = nPage;
39824: }
39825: }
39826: }
39827: return rc;
39828: }
39829:
39830: /*
1.2.2.1 ! misho 39831: ** Return a sanitized version of the sector-size of OS file pFile. The
! 39832: ** return value is guaranteed to lie between 32 and MAX_SECTOR_SIZE.
! 39833: */
! 39834: SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *pFile){
! 39835: int iRet = sqlite3OsSectorSize(pFile);
! 39836: if( iRet<32 ){
! 39837: iRet = 512;
! 39838: }else if( iRet>MAX_SECTOR_SIZE ){
! 39839: assert( MAX_SECTOR_SIZE>=512 );
! 39840: iRet = MAX_SECTOR_SIZE;
! 39841: }
! 39842: return iRet;
! 39843: }
! 39844:
! 39845: /*
1.2 misho 39846: ** Set the value of the Pager.sectorSize variable for the given
39847: ** pager based on the value returned by the xSectorSize method
39848: ** of the open database file. The sector size will be used used
39849: ** to determine the size and alignment of journal header and
39850: ** master journal pointers within created journal files.
39851: **
39852: ** For temporary files the effective sector size is always 512 bytes.
39853: **
39854: ** Otherwise, for non-temporary files, the effective sector size is
39855: ** the value returned by the xSectorSize() method rounded up to 32 if
39856: ** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it
39857: ** is greater than MAX_SECTOR_SIZE.
39858: **
39859: ** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set
39860: ** the effective sector size to its minimum value (512). The purpose of
39861: ** pPager->sectorSize is to define the "blast radius" of bytes that
39862: ** might change if a crash occurs while writing to a single byte in
39863: ** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero
39864: ** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector
39865: ** size. For backwards compatibility of the rollback journal file format,
39866: ** we cannot reduce the effective sector size below 512.
39867: */
39868: static void setSectorSize(Pager *pPager){
39869: assert( isOpen(pPager->fd) || pPager->tempFile );
39870:
39871: if( pPager->tempFile
39872: || (sqlite3OsDeviceCharacteristics(pPager->fd) &
39873: SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0
39874: ){
39875: /* Sector size doesn't matter for temporary files. Also, the file
39876: ** may not have been opened yet, in which case the OsSectorSize()
39877: ** call will segfault. */
39878: pPager->sectorSize = 512;
39879: }else{
1.2.2.1 ! misho 39880: pPager->sectorSize = sqlite3SectorSize(pPager->fd);
1.2 misho 39881: }
39882: }
39883:
39884: /*
39885: ** Playback the journal and thus restore the database file to
39886: ** the state it was in before we started making changes.
39887: **
39888: ** The journal file format is as follows:
39889: **
39890: ** (1) 8 byte prefix. A copy of aJournalMagic[].
39891: ** (2) 4 byte big-endian integer which is the number of valid page records
39892: ** in the journal. If this value is 0xffffffff, then compute the
39893: ** number of page records from the journal size.
39894: ** (3) 4 byte big-endian integer which is the initial value for the
39895: ** sanity checksum.
39896: ** (4) 4 byte integer which is the number of pages to truncate the
39897: ** database to during a rollback.
39898: ** (5) 4 byte big-endian integer which is the sector size. The header
39899: ** is this many bytes in size.
39900: ** (6) 4 byte big-endian integer which is the page size.
39901: ** (7) zero padding out to the next sector size.
39902: ** (8) Zero or more pages instances, each as follows:
39903: ** + 4 byte page number.
39904: ** + pPager->pageSize bytes of data.
39905: ** + 4 byte checksum
39906: **
39907: ** When we speak of the journal header, we mean the first 7 items above.
39908: ** Each entry in the journal is an instance of the 8th item.
39909: **
39910: ** Call the value from the second bullet "nRec". nRec is the number of
39911: ** valid page entries in the journal. In most cases, you can compute the
39912: ** value of nRec from the size of the journal file. But if a power
39913: ** failure occurred while the journal was being written, it could be the
39914: ** case that the size of the journal file had already been increased but
39915: ** the extra entries had not yet made it safely to disk. In such a case,
39916: ** the value of nRec computed from the file size would be too large. For
39917: ** that reason, we always use the nRec value in the header.
39918: **
39919: ** If the nRec value is 0xffffffff it means that nRec should be computed
39920: ** from the file size. This value is used when the user selects the
39921: ** no-sync option for the journal. A power failure could lead to corruption
39922: ** in this case. But for things like temporary table (which will be
39923: ** deleted when the power is restored) we don't care.
39924: **
39925: ** If the file opened as the journal file is not a well-formed
39926: ** journal file then all pages up to the first corrupted page are rolled
39927: ** back (or no pages if the journal header is corrupted). The journal file
39928: ** is then deleted and SQLITE_OK returned, just as if no corruption had
39929: ** been encountered.
39930: **
39931: ** If an I/O or malloc() error occurs, the journal-file is not deleted
39932: ** and an error code is returned.
39933: **
39934: ** The isHot parameter indicates that we are trying to rollback a journal
39935: ** that might be a hot journal. Or, it could be that the journal is
39936: ** preserved because of JOURNALMODE_PERSIST or JOURNALMODE_TRUNCATE.
39937: ** If the journal really is hot, reset the pager cache prior rolling
39938: ** back any content. If the journal is merely persistent, no reset is
39939: ** needed.
39940: */
39941: static int pager_playback(Pager *pPager, int isHot){
39942: sqlite3_vfs *pVfs = pPager->pVfs;
39943: i64 szJ; /* Size of the journal file in bytes */
39944: u32 nRec; /* Number of Records in the journal */
39945: u32 u; /* Unsigned loop counter */
39946: Pgno mxPg = 0; /* Size of the original file in pages */
39947: int rc; /* Result code of a subroutine */
39948: int res = 1; /* Value returned by sqlite3OsAccess() */
39949: char *zMaster = 0; /* Name of master journal file if any */
39950: int needPagerReset; /* True to reset page prior to first page rollback */
39951:
39952: /* Figure out how many records are in the journal. Abort early if
39953: ** the journal is empty.
39954: */
39955: assert( isOpen(pPager->jfd) );
39956: rc = sqlite3OsFileSize(pPager->jfd, &szJ);
39957: if( rc!=SQLITE_OK ){
39958: goto end_playback;
39959: }
39960:
39961: /* Read the master journal name from the journal, if it is present.
39962: ** If a master journal file name is specified, but the file is not
39963: ** present on disk, then the journal is not hot and does not need to be
39964: ** played back.
39965: **
39966: ** TODO: Technically the following is an error because it assumes that
39967: ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that
39968: ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c,
39969: ** mxPathname is 512, which is the same as the minimum allowable value
39970: ** for pageSize.
39971: */
39972: zMaster = pPager->pTmpSpace;
39973: rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
39974: if( rc==SQLITE_OK && zMaster[0] ){
39975: rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res);
39976: }
39977: zMaster = 0;
39978: if( rc!=SQLITE_OK || !res ){
39979: goto end_playback;
39980: }
39981: pPager->journalOff = 0;
39982: needPagerReset = isHot;
39983:
39984: /* This loop terminates either when a readJournalHdr() or
39985: ** pager_playback_one_page() call returns SQLITE_DONE or an IO error
39986: ** occurs.
39987: */
39988: while( 1 ){
39989: /* Read the next journal header from the journal file. If there are
39990: ** not enough bytes left in the journal file for a complete header, or
39991: ** it is corrupted, then a process must have failed while writing it.
39992: ** This indicates nothing more needs to be rolled back.
39993: */
39994: rc = readJournalHdr(pPager, isHot, szJ, &nRec, &mxPg);
39995: if( rc!=SQLITE_OK ){
39996: if( rc==SQLITE_DONE ){
39997: rc = SQLITE_OK;
39998: }
39999: goto end_playback;
40000: }
40001:
40002: /* If nRec is 0xffffffff, then this journal was created by a process
40003: ** working in no-sync mode. This means that the rest of the journal
40004: ** file consists of pages, there are no more journal headers. Compute
40005: ** the value of nRec based on this assumption.
40006: */
40007: if( nRec==0xffffffff ){
40008: assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) );
40009: nRec = (int)((szJ - JOURNAL_HDR_SZ(pPager))/JOURNAL_PG_SZ(pPager));
40010: }
40011:
40012: /* If nRec is 0 and this rollback is of a transaction created by this
40013: ** process and if this is the final header in the journal, then it means
40014: ** that this part of the journal was being filled but has not yet been
40015: ** synced to disk. Compute the number of pages based on the remaining
40016: ** size of the file.
40017: **
40018: ** The third term of the test was added to fix ticket #2565.
40019: ** When rolling back a hot journal, nRec==0 always means that the next
40020: ** chunk of the journal contains zero pages to be rolled back. But
40021: ** when doing a ROLLBACK and the nRec==0 chunk is the last chunk in
40022: ** the journal, it means that the journal might contain additional
40023: ** pages that need to be rolled back and that the number of pages
40024: ** should be computed based on the journal file size.
40025: */
40026: if( nRec==0 && !isHot &&
40027: pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff ){
40028: nRec = (int)((szJ - pPager->journalOff) / JOURNAL_PG_SZ(pPager));
40029: }
40030:
40031: /* If this is the first header read from the journal, truncate the
40032: ** database file back to its original size.
40033: */
40034: if( pPager->journalOff==JOURNAL_HDR_SZ(pPager) ){
40035: rc = pager_truncate(pPager, mxPg);
40036: if( rc!=SQLITE_OK ){
40037: goto end_playback;
40038: }
40039: pPager->dbSize = mxPg;
40040: }
40041:
40042: /* Copy original pages out of the journal and back into the
40043: ** database file and/or page cache.
40044: */
40045: for(u=0; u<nRec; u++){
40046: if( needPagerReset ){
40047: pager_reset(pPager);
40048: needPagerReset = 0;
40049: }
40050: rc = pager_playback_one_page(pPager,&pPager->journalOff,0,1,0);
40051: if( rc!=SQLITE_OK ){
40052: if( rc==SQLITE_DONE ){
40053: pPager->journalOff = szJ;
40054: break;
40055: }else if( rc==SQLITE_IOERR_SHORT_READ ){
40056: /* If the journal has been truncated, simply stop reading and
40057: ** processing the journal. This might happen if the journal was
40058: ** not completely written and synced prior to a crash. In that
40059: ** case, the database should have never been written in the
40060: ** first place so it is OK to simply abandon the rollback. */
40061: rc = SQLITE_OK;
40062: goto end_playback;
40063: }else{
40064: /* If we are unable to rollback, quit and return the error
40065: ** code. This will cause the pager to enter the error state
40066: ** so that no further harm will be done. Perhaps the next
40067: ** process to come along will be able to rollback the database.
40068: */
40069: goto end_playback;
40070: }
40071: }
40072: }
40073: }
40074: /*NOTREACHED*/
40075: assert( 0 );
40076:
40077: end_playback:
40078: /* Following a rollback, the database file should be back in its original
40079: ** state prior to the start of the transaction, so invoke the
40080: ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the
40081: ** assertion that the transaction counter was modified.
40082: */
40083: #ifdef SQLITE_DEBUG
40084: if( pPager->fd->pMethods ){
40085: sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0);
40086: }
40087: #endif
40088:
40089: /* If this playback is happening automatically as a result of an IO or
40090: ** malloc error that occurred after the change-counter was updated but
40091: ** before the transaction was committed, then the change-counter
40092: ** modification may just have been reverted. If this happens in exclusive
40093: ** mode, then subsequent transactions performed by the connection will not
40094: ** update the change-counter at all. This may lead to cache inconsistency
40095: ** problems for other processes at some point in the future. So, just
40096: ** in case this has happened, clear the changeCountDone flag now.
40097: */
40098: pPager->changeCountDone = pPager->tempFile;
40099:
40100: if( rc==SQLITE_OK ){
40101: zMaster = pPager->pTmpSpace;
40102: rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
40103: testcase( rc!=SQLITE_OK );
40104: }
40105: if( rc==SQLITE_OK
40106: && (pPager->eState>=PAGER_WRITER_DBMOD || pPager->eState==PAGER_OPEN)
40107: ){
40108: rc = sqlite3PagerSync(pPager);
40109: }
40110: if( rc==SQLITE_OK ){
40111: rc = pager_end_transaction(pPager, zMaster[0]!='\0');
40112: testcase( rc!=SQLITE_OK );
40113: }
40114: if( rc==SQLITE_OK && zMaster[0] && res ){
40115: /* If there was a master journal and this routine will return success,
40116: ** see if it is possible to delete the master journal.
40117: */
40118: rc = pager_delmaster(pPager, zMaster);
40119: testcase( rc!=SQLITE_OK );
40120: }
40121:
40122: /* The Pager.sectorSize variable may have been updated while rolling
40123: ** back a journal created by a process with a different sector size
40124: ** value. Reset it to the correct value for this process.
40125: */
40126: setSectorSize(pPager);
40127: return rc;
40128: }
40129:
40130:
40131: /*
40132: ** Read the content for page pPg out of the database file and into
40133: ** pPg->pData. A shared lock or greater must be held on the database
40134: ** file before this function is called.
40135: **
40136: ** If page 1 is read, then the value of Pager.dbFileVers[] is set to
40137: ** the value read from the database file.
40138: **
40139: ** If an IO error occurs, then the IO error is returned to the caller.
40140: ** Otherwise, SQLITE_OK is returned.
40141: */
40142: static int readDbPage(PgHdr *pPg){
40143: Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */
40144: Pgno pgno = pPg->pgno; /* Page number to read */
40145: int rc = SQLITE_OK; /* Return code */
40146: int isInWal = 0; /* True if page is in log file */
40147: int pgsz = pPager->pageSize; /* Number of bytes to read */
40148:
40149: assert( pPager->eState>=PAGER_READER && !MEMDB );
40150: assert( isOpen(pPager->fd) );
40151:
40152: if( NEVER(!isOpen(pPager->fd)) ){
40153: assert( pPager->tempFile );
40154: memset(pPg->pData, 0, pPager->pageSize);
40155: return SQLITE_OK;
40156: }
40157:
40158: if( pagerUseWal(pPager) ){
40159: /* Try to pull the page from the write-ahead log. */
40160: rc = sqlite3WalRead(pPager->pWal, pgno, &isInWal, pgsz, pPg->pData);
40161: }
40162: if( rc==SQLITE_OK && !isInWal ){
40163: i64 iOffset = (pgno-1)*(i64)pPager->pageSize;
40164: rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset);
40165: if( rc==SQLITE_IOERR_SHORT_READ ){
40166: rc = SQLITE_OK;
40167: }
40168: }
40169:
40170: if( pgno==1 ){
40171: if( rc ){
40172: /* If the read is unsuccessful, set the dbFileVers[] to something
40173: ** that will never be a valid file version. dbFileVers[] is a copy
40174: ** of bytes 24..39 of the database. Bytes 28..31 should always be
40175: ** zero or the size of the database in page. Bytes 32..35 and 35..39
40176: ** should be page numbers which are never 0xffffffff. So filling
40177: ** pPager->dbFileVers[] with all 0xff bytes should suffice.
40178: **
40179: ** For an encrypted database, the situation is more complex: bytes
40180: ** 24..39 of the database are white noise. But the probability of
40181: ** white noising equaling 16 bytes of 0xff is vanishingly small so
40182: ** we should still be ok.
40183: */
40184: memset(pPager->dbFileVers, 0xff, sizeof(pPager->dbFileVers));
40185: }else{
40186: u8 *dbFileVers = &((u8*)pPg->pData)[24];
40187: memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers));
40188: }
40189: }
40190: CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM);
40191:
40192: PAGER_INCR(sqlite3_pager_readdb_count);
40193: PAGER_INCR(pPager->nRead);
40194: IOTRACE(("PGIN %p %d\n", pPager, pgno));
40195: PAGERTRACE(("FETCH %d page %d hash(%08x)\n",
40196: PAGERID(pPager), pgno, pager_pagehash(pPg)));
40197:
40198: return rc;
40199: }
40200:
40201: /*
40202: ** Update the value of the change-counter at offsets 24 and 92 in
40203: ** the header and the sqlite version number at offset 96.
40204: **
40205: ** This is an unconditional update. See also the pager_incr_changecounter()
40206: ** routine which only updates the change-counter if the update is actually
40207: ** needed, as determined by the pPager->changeCountDone state variable.
40208: */
40209: static void pager_write_changecounter(PgHdr *pPg){
40210: u32 change_counter;
40211:
40212: /* Increment the value just read and write it back to byte 24. */
40213: change_counter = sqlite3Get4byte((u8*)pPg->pPager->dbFileVers)+1;
40214: put32bits(((char*)pPg->pData)+24, change_counter);
40215:
40216: /* Also store the SQLite version number in bytes 96..99 and in
40217: ** bytes 92..95 store the change counter for which the version number
40218: ** is valid. */
40219: put32bits(((char*)pPg->pData)+92, change_counter);
40220: put32bits(((char*)pPg->pData)+96, SQLITE_VERSION_NUMBER);
40221: }
40222:
40223: #ifndef SQLITE_OMIT_WAL
40224: /*
40225: ** This function is invoked once for each page that has already been
40226: ** written into the log file when a WAL transaction is rolled back.
40227: ** Parameter iPg is the page number of said page. The pCtx argument
40228: ** is actually a pointer to the Pager structure.
40229: **
40230: ** If page iPg is present in the cache, and has no outstanding references,
40231: ** it is discarded. Otherwise, if there are one or more outstanding
40232: ** references, the page content is reloaded from the database. If the
40233: ** attempt to reload content from the database is required and fails,
40234: ** return an SQLite error code. Otherwise, SQLITE_OK.
40235: */
40236: static int pagerUndoCallback(void *pCtx, Pgno iPg){
40237: int rc = SQLITE_OK;
40238: Pager *pPager = (Pager *)pCtx;
40239: PgHdr *pPg;
40240:
40241: pPg = sqlite3PagerLookup(pPager, iPg);
40242: if( pPg ){
40243: if( sqlite3PcachePageRefcount(pPg)==1 ){
40244: sqlite3PcacheDrop(pPg);
40245: }else{
40246: rc = readDbPage(pPg);
40247: if( rc==SQLITE_OK ){
40248: pPager->xReiniter(pPg);
40249: }
40250: sqlite3PagerUnref(pPg);
40251: }
40252: }
40253:
40254: /* Normally, if a transaction is rolled back, any backup processes are
40255: ** updated as data is copied out of the rollback journal and into the
40256: ** database. This is not generally possible with a WAL database, as
40257: ** rollback involves simply truncating the log file. Therefore, if one
40258: ** or more frames have already been written to the log (and therefore
40259: ** also copied into the backup databases) as part of this transaction,
40260: ** the backups must be restarted.
40261: */
40262: sqlite3BackupRestart(pPager->pBackup);
40263:
40264: return rc;
40265: }
40266:
40267: /*
40268: ** This function is called to rollback a transaction on a WAL database.
40269: */
40270: static int pagerRollbackWal(Pager *pPager){
40271: int rc; /* Return Code */
40272: PgHdr *pList; /* List of dirty pages to revert */
40273:
40274: /* For all pages in the cache that are currently dirty or have already
40275: ** been written (but not committed) to the log file, do one of the
40276: ** following:
40277: **
40278: ** + Discard the cached page (if refcount==0), or
40279: ** + Reload page content from the database (if refcount>0).
40280: */
40281: pPager->dbSize = pPager->dbOrigSize;
40282: rc = sqlite3WalUndo(pPager->pWal, pagerUndoCallback, (void *)pPager);
40283: pList = sqlite3PcacheDirtyList(pPager->pPCache);
40284: while( pList && rc==SQLITE_OK ){
40285: PgHdr *pNext = pList->pDirty;
40286: rc = pagerUndoCallback((void *)pPager, pList->pgno);
40287: pList = pNext;
40288: }
40289:
40290: return rc;
40291: }
40292:
40293: /*
40294: ** This function is a wrapper around sqlite3WalFrames(). As well as logging
40295: ** the contents of the list of pages headed by pList (connected by pDirty),
40296: ** this function notifies any active backup processes that the pages have
40297: ** changed.
40298: **
40299: ** The list of pages passed into this routine is always sorted by page number.
40300: ** Hence, if page 1 appears anywhere on the list, it will be the first page.
40301: */
40302: static int pagerWalFrames(
40303: Pager *pPager, /* Pager object */
40304: PgHdr *pList, /* List of frames to log */
40305: Pgno nTruncate, /* Database size after this commit */
40306: int isCommit /* True if this is a commit */
40307: ){
40308: int rc; /* Return code */
1.2.2.1 ! misho 40309: int nList; /* Number of pages in pList */
1.2 misho 40310: #if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES)
40311: PgHdr *p; /* For looping over pages */
40312: #endif
40313:
40314: assert( pPager->pWal );
40315: assert( pList );
40316: #ifdef SQLITE_DEBUG
40317: /* Verify that the page list is in accending order */
40318: for(p=pList; p && p->pDirty; p=p->pDirty){
40319: assert( p->pgno < p->pDirty->pgno );
40320: }
40321: #endif
40322:
1.2.2.1 ! misho 40323: assert( pList->pDirty==0 || isCommit );
1.2 misho 40324: if( isCommit ){
40325: /* If a WAL transaction is being committed, there is no point in writing
40326: ** any pages with page numbers greater than nTruncate into the WAL file.
40327: ** They will never be read by any client. So remove them from the pDirty
40328: ** list here. */
40329: PgHdr *p;
40330: PgHdr **ppNext = &pList;
1.2.2.1 ! misho 40331: nList = 0;
! 40332: for(p=pList; (*ppNext = p)!=0; p=p->pDirty){
! 40333: if( p->pgno<=nTruncate ){
! 40334: ppNext = &p->pDirty;
! 40335: nList++;
! 40336: }
1.2 misho 40337: }
40338: assert( pList );
1.2.2.1 ! misho 40339: }else{
! 40340: nList = 1;
1.2 misho 40341: }
1.2.2.1 ! misho 40342: pPager->aStat[PAGER_STAT_WRITE] += nList;
1.2 misho 40343:
40344: if( pList->pgno==1 ) pager_write_changecounter(pList);
40345: rc = sqlite3WalFrames(pPager->pWal,
40346: pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags
40347: );
40348: if( rc==SQLITE_OK && pPager->pBackup ){
40349: PgHdr *p;
40350: for(p=pList; p; p=p->pDirty){
40351: sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData);
40352: }
40353: }
40354:
40355: #ifdef SQLITE_CHECK_PAGES
40356: pList = sqlite3PcacheDirtyList(pPager->pPCache);
40357: for(p=pList; p; p=p->pDirty){
40358: pager_set_pagehash(p);
40359: }
40360: #endif
40361:
40362: return rc;
40363: }
40364:
40365: /*
40366: ** Begin a read transaction on the WAL.
40367: **
40368: ** This routine used to be called "pagerOpenSnapshot()" because it essentially
40369: ** makes a snapshot of the database at the current point in time and preserves
40370: ** that snapshot for use by the reader in spite of concurrently changes by
40371: ** other writers or checkpointers.
40372: */
40373: static int pagerBeginReadTransaction(Pager *pPager){
40374: int rc; /* Return code */
40375: int changed = 0; /* True if cache must be reset */
40376:
40377: assert( pagerUseWal(pPager) );
40378: assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
40379:
40380: /* sqlite3WalEndReadTransaction() was not called for the previous
40381: ** transaction in locking_mode=EXCLUSIVE. So call it now. If we
40382: ** are in locking_mode=NORMAL and EndRead() was previously called,
40383: ** the duplicate call is harmless.
40384: */
40385: sqlite3WalEndReadTransaction(pPager->pWal);
40386:
40387: rc = sqlite3WalBeginReadTransaction(pPager->pWal, &changed);
40388: if( rc!=SQLITE_OK || changed ){
40389: pager_reset(pPager);
40390: }
40391:
40392: return rc;
40393: }
40394: #endif
40395:
40396: /*
40397: ** This function is called as part of the transition from PAGER_OPEN
40398: ** to PAGER_READER state to determine the size of the database file
40399: ** in pages (assuming the page size currently stored in Pager.pageSize).
40400: **
40401: ** If no error occurs, SQLITE_OK is returned and the size of the database
40402: ** in pages is stored in *pnPage. Otherwise, an error code (perhaps
40403: ** SQLITE_IOERR_FSTAT) is returned and *pnPage is left unmodified.
40404: */
40405: static int pagerPagecount(Pager *pPager, Pgno *pnPage){
40406: Pgno nPage; /* Value to return via *pnPage */
40407:
40408: /* Query the WAL sub-system for the database size. The WalDbsize()
40409: ** function returns zero if the WAL is not open (i.e. Pager.pWal==0), or
40410: ** if the database size is not available. The database size is not
40411: ** available from the WAL sub-system if the log file is empty or
40412: ** contains no valid committed transactions.
40413: */
40414: assert( pPager->eState==PAGER_OPEN );
1.2.2.1 ! misho 40415: assert( pPager->eLock>=SHARED_LOCK );
1.2 misho 40416: nPage = sqlite3WalDbsize(pPager->pWal);
40417:
40418: /* If the database size was not available from the WAL sub-system,
40419: ** determine it based on the size of the database file. If the size
40420: ** of the database file is not an integer multiple of the page-size,
40421: ** round down to the nearest page. Except, any file larger than 0
40422: ** bytes in size is considered to contain at least one page.
40423: */
40424: if( nPage==0 ){
40425: i64 n = 0; /* Size of db file in bytes */
40426: assert( isOpen(pPager->fd) || pPager->tempFile );
40427: if( isOpen(pPager->fd) ){
40428: int rc = sqlite3OsFileSize(pPager->fd, &n);
40429: if( rc!=SQLITE_OK ){
40430: return rc;
40431: }
40432: }
40433: nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize);
40434: }
40435:
40436: /* If the current number of pages in the file is greater than the
40437: ** configured maximum pager number, increase the allowed limit so
40438: ** that the file can be read.
40439: */
40440: if( nPage>pPager->mxPgno ){
40441: pPager->mxPgno = (Pgno)nPage;
40442: }
40443:
40444: *pnPage = nPage;
40445: return SQLITE_OK;
40446: }
40447:
40448: #ifndef SQLITE_OMIT_WAL
40449: /*
40450: ** Check if the *-wal file that corresponds to the database opened by pPager
40451: ** exists if the database is not empy, or verify that the *-wal file does
40452: ** not exist (by deleting it) if the database file is empty.
40453: **
40454: ** If the database is not empty and the *-wal file exists, open the pager
40455: ** in WAL mode. If the database is empty or if no *-wal file exists and
40456: ** if no error occurs, make sure Pager.journalMode is not set to
40457: ** PAGER_JOURNALMODE_WAL.
40458: **
40459: ** Return SQLITE_OK or an error code.
40460: **
40461: ** The caller must hold a SHARED lock on the database file to call this
40462: ** function. Because an EXCLUSIVE lock on the db file is required to delete
40463: ** a WAL on a none-empty database, this ensures there is no race condition
40464: ** between the xAccess() below and an xDelete() being executed by some
40465: ** other connection.
40466: */
40467: static int pagerOpenWalIfPresent(Pager *pPager){
40468: int rc = SQLITE_OK;
40469: assert( pPager->eState==PAGER_OPEN );
1.2.2.1 ! misho 40470: assert( pPager->eLock>=SHARED_LOCK );
1.2 misho 40471:
40472: if( !pPager->tempFile ){
40473: int isWal; /* True if WAL file exists */
40474: Pgno nPage; /* Size of the database file */
40475:
40476: rc = pagerPagecount(pPager, &nPage);
40477: if( rc ) return rc;
40478: if( nPage==0 ){
40479: rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0);
1.2.2.1 ! misho 40480: if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK;
1.2 misho 40481: isWal = 0;
40482: }else{
40483: rc = sqlite3OsAccess(
40484: pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal
40485: );
40486: }
40487: if( rc==SQLITE_OK ){
40488: if( isWal ){
40489: testcase( sqlite3PcachePagecount(pPager->pPCache)==0 );
40490: rc = sqlite3PagerOpenWal(pPager, 0);
40491: }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){
40492: pPager->journalMode = PAGER_JOURNALMODE_DELETE;
40493: }
40494: }
40495: }
40496: return rc;
40497: }
40498: #endif
40499:
40500: /*
40501: ** Playback savepoint pSavepoint. Or, if pSavepoint==NULL, then playback
40502: ** the entire master journal file. The case pSavepoint==NULL occurs when
40503: ** a ROLLBACK TO command is invoked on a SAVEPOINT that is a transaction
40504: ** savepoint.
40505: **
40506: ** When pSavepoint is not NULL (meaning a non-transaction savepoint is
40507: ** being rolled back), then the rollback consists of up to three stages,
40508: ** performed in the order specified:
40509: **
40510: ** * Pages are played back from the main journal starting at byte
40511: ** offset PagerSavepoint.iOffset and continuing to
40512: ** PagerSavepoint.iHdrOffset, or to the end of the main journal
40513: ** file if PagerSavepoint.iHdrOffset is zero.
40514: **
40515: ** * If PagerSavepoint.iHdrOffset is not zero, then pages are played
40516: ** back starting from the journal header immediately following
40517: ** PagerSavepoint.iHdrOffset to the end of the main journal file.
40518: **
40519: ** * Pages are then played back from the sub-journal file, starting
40520: ** with the PagerSavepoint.iSubRec and continuing to the end of
40521: ** the journal file.
40522: **
40523: ** Throughout the rollback process, each time a page is rolled back, the
40524: ** corresponding bit is set in a bitvec structure (variable pDone in the
40525: ** implementation below). This is used to ensure that a page is only
40526: ** rolled back the first time it is encountered in either journal.
40527: **
40528: ** If pSavepoint is NULL, then pages are only played back from the main
40529: ** journal file. There is no need for a bitvec in this case.
40530: **
40531: ** In either case, before playback commences the Pager.dbSize variable
40532: ** is reset to the value that it held at the start of the savepoint
40533: ** (or transaction). No page with a page-number greater than this value
40534: ** is played back. If one is encountered it is simply skipped.
40535: */
40536: static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){
40537: i64 szJ; /* Effective size of the main journal */
40538: i64 iHdrOff; /* End of first segment of main-journal records */
40539: int rc = SQLITE_OK; /* Return code */
40540: Bitvec *pDone = 0; /* Bitvec to ensure pages played back only once */
40541:
40542: assert( pPager->eState!=PAGER_ERROR );
40543: assert( pPager->eState>=PAGER_WRITER_LOCKED );
40544:
40545: /* Allocate a bitvec to use to store the set of pages rolled back */
40546: if( pSavepoint ){
40547: pDone = sqlite3BitvecCreate(pSavepoint->nOrig);
40548: if( !pDone ){
40549: return SQLITE_NOMEM;
40550: }
40551: }
40552:
40553: /* Set the database size back to the value it was before the savepoint
40554: ** being reverted was opened.
40555: */
40556: pPager->dbSize = pSavepoint ? pSavepoint->nOrig : pPager->dbOrigSize;
40557: pPager->changeCountDone = pPager->tempFile;
40558:
40559: if( !pSavepoint && pagerUseWal(pPager) ){
40560: return pagerRollbackWal(pPager);
40561: }
40562:
40563: /* Use pPager->journalOff as the effective size of the main rollback
40564: ** journal. The actual file might be larger than this in
40565: ** PAGER_JOURNALMODE_TRUNCATE or PAGER_JOURNALMODE_PERSIST. But anything
40566: ** past pPager->journalOff is off-limits to us.
40567: */
40568: szJ = pPager->journalOff;
40569: assert( pagerUseWal(pPager)==0 || szJ==0 );
40570:
40571: /* Begin by rolling back records from the main journal starting at
40572: ** PagerSavepoint.iOffset and continuing to the next journal header.
40573: ** There might be records in the main journal that have a page number
40574: ** greater than the current database size (pPager->dbSize) but those
40575: ** will be skipped automatically. Pages are added to pDone as they
40576: ** are played back.
40577: */
40578: if( pSavepoint && !pagerUseWal(pPager) ){
40579: iHdrOff = pSavepoint->iHdrOffset ? pSavepoint->iHdrOffset : szJ;
40580: pPager->journalOff = pSavepoint->iOffset;
40581: while( rc==SQLITE_OK && pPager->journalOff<iHdrOff ){
40582: rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1);
40583: }
40584: assert( rc!=SQLITE_DONE );
40585: }else{
40586: pPager->journalOff = 0;
40587: }
40588:
40589: /* Continue rolling back records out of the main journal starting at
40590: ** the first journal header seen and continuing until the effective end
40591: ** of the main journal file. Continue to skip out-of-range pages and
40592: ** continue adding pages rolled back to pDone.
40593: */
40594: while( rc==SQLITE_OK && pPager->journalOff<szJ ){
40595: u32 ii; /* Loop counter */
40596: u32 nJRec = 0; /* Number of Journal Records */
40597: u32 dummy;
40598: rc = readJournalHdr(pPager, 0, szJ, &nJRec, &dummy);
40599: assert( rc!=SQLITE_DONE );
40600:
40601: /*
40602: ** The "pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff"
40603: ** test is related to ticket #2565. See the discussion in the
40604: ** pager_playback() function for additional information.
40605: */
40606: if( nJRec==0
40607: && pPager->journalHdr+JOURNAL_HDR_SZ(pPager)==pPager->journalOff
40608: ){
40609: nJRec = (u32)((szJ - pPager->journalOff)/JOURNAL_PG_SZ(pPager));
40610: }
40611: for(ii=0; rc==SQLITE_OK && ii<nJRec && pPager->journalOff<szJ; ii++){
40612: rc = pager_playback_one_page(pPager, &pPager->journalOff, pDone, 1, 1);
40613: }
40614: assert( rc!=SQLITE_DONE );
40615: }
40616: assert( rc!=SQLITE_OK || pPager->journalOff>=szJ );
40617:
40618: /* Finally, rollback pages from the sub-journal. Page that were
40619: ** previously rolled back out of the main journal (and are hence in pDone)
40620: ** will be skipped. Out-of-range pages are also skipped.
40621: */
40622: if( pSavepoint ){
40623: u32 ii; /* Loop counter */
40624: i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize);
40625:
40626: if( pagerUseWal(pPager) ){
40627: rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData);
40628: }
40629: for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){
40630: assert( offset==(i64)ii*(4+pPager->pageSize) );
40631: rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1);
40632: }
40633: assert( rc!=SQLITE_DONE );
40634: }
40635:
40636: sqlite3BitvecDestroy(pDone);
40637: if( rc==SQLITE_OK ){
40638: pPager->journalOff = szJ;
40639: }
40640:
40641: return rc;
40642: }
40643:
40644: /*
40645: ** Change the maximum number of in-memory pages that are allowed.
40646: */
40647: SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){
40648: sqlite3PcacheSetCachesize(pPager->pPCache, mxPage);
40649: }
40650:
40651: /*
40652: ** Free as much memory as possible from the pager.
40653: */
40654: SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){
40655: sqlite3PcacheShrink(pPager->pPCache);
40656: }
40657:
40658: /*
40659: ** Adjust the robustness of the database to damage due to OS crashes
40660: ** or power failures by changing the number of syncs()s when writing
40661: ** the rollback journal. There are three levels:
40662: **
40663: ** OFF sqlite3OsSync() is never called. This is the default
40664: ** for temporary and transient files.
40665: **
40666: ** NORMAL The journal is synced once before writes begin on the
40667: ** database. This is normally adequate protection, but
40668: ** it is theoretically possible, though very unlikely,
40669: ** that an inopertune power failure could leave the journal
40670: ** in a state which would cause damage to the database
40671: ** when it is rolled back.
40672: **
40673: ** FULL The journal is synced twice before writes begin on the
40674: ** database (with some additional information - the nRec field
40675: ** of the journal header - being written in between the two
40676: ** syncs). If we assume that writing a
40677: ** single disk sector is atomic, then this mode provides
40678: ** assurance that the journal will not be corrupted to the
40679: ** point of causing damage to the database during rollback.
40680: **
40681: ** The above is for a rollback-journal mode. For WAL mode, OFF continues
40682: ** to mean that no syncs ever occur. NORMAL means that the WAL is synced
40683: ** prior to the start of checkpoint and that the database file is synced
40684: ** at the conclusion of the checkpoint if the entire content of the WAL
40685: ** was written back into the database. But no sync operations occur for
40686: ** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL
40687: ** file is synced following each commit operation, in addition to the
40688: ** syncs associated with NORMAL.
40689: **
40690: ** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The
40691: ** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync
40692: ** using fcntl(F_FULLFSYNC). SQLITE_SYNC_NORMAL means to do an
40693: ** ordinary fsync() call. There is no difference between SQLITE_SYNC_FULL
40694: ** and SQLITE_SYNC_NORMAL on platforms other than MacOSX. But the
40695: ** synchronous=FULL versus synchronous=NORMAL setting determines when
40696: ** the xSync primitive is called and is relevant to all platforms.
40697: **
40698: ** Numeric values associated with these states are OFF==1, NORMAL=2,
40699: ** and FULL=3.
40700: */
40701: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
40702: SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(
40703: Pager *pPager, /* The pager to set safety level for */
40704: int level, /* PRAGMA synchronous. 1=OFF, 2=NORMAL, 3=FULL */
40705: int bFullFsync, /* PRAGMA fullfsync */
40706: int bCkptFullFsync /* PRAGMA checkpoint_fullfsync */
40707: ){
40708: assert( level>=1 && level<=3 );
40709: pPager->noSync = (level==1 || pPager->tempFile) ?1:0;
40710: pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0;
40711: if( pPager->noSync ){
40712: pPager->syncFlags = 0;
40713: pPager->ckptSyncFlags = 0;
40714: }else if( bFullFsync ){
40715: pPager->syncFlags = SQLITE_SYNC_FULL;
40716: pPager->ckptSyncFlags = SQLITE_SYNC_FULL;
40717: }else if( bCkptFullFsync ){
40718: pPager->syncFlags = SQLITE_SYNC_NORMAL;
40719: pPager->ckptSyncFlags = SQLITE_SYNC_FULL;
40720: }else{
40721: pPager->syncFlags = SQLITE_SYNC_NORMAL;
40722: pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL;
40723: }
40724: pPager->walSyncFlags = pPager->syncFlags;
40725: if( pPager->fullSync ){
40726: pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS;
40727: }
40728: }
40729: #endif
40730:
40731: /*
40732: ** The following global variable is incremented whenever the library
40733: ** attempts to open a temporary file. This information is used for
40734: ** testing and analysis only.
40735: */
40736: #ifdef SQLITE_TEST
40737: SQLITE_API int sqlite3_opentemp_count = 0;
40738: #endif
40739:
40740: /*
40741: ** Open a temporary file.
40742: **
40743: ** Write the file descriptor into *pFile. Return SQLITE_OK on success
40744: ** or some other error code if we fail. The OS will automatically
40745: ** delete the temporary file when it is closed.
40746: **
40747: ** The flags passed to the VFS layer xOpen() call are those specified
40748: ** by parameter vfsFlags ORed with the following:
40749: **
40750: ** SQLITE_OPEN_READWRITE
40751: ** SQLITE_OPEN_CREATE
40752: ** SQLITE_OPEN_EXCLUSIVE
40753: ** SQLITE_OPEN_DELETEONCLOSE
40754: */
40755: static int pagerOpentemp(
40756: Pager *pPager, /* The pager object */
40757: sqlite3_file *pFile, /* Write the file descriptor here */
40758: int vfsFlags /* Flags passed through to the VFS */
40759: ){
40760: int rc; /* Return code */
40761:
40762: #ifdef SQLITE_TEST
40763: sqlite3_opentemp_count++; /* Used for testing and analysis only */
40764: #endif
40765:
40766: vfsFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
40767: SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE;
40768: rc = sqlite3OsOpen(pPager->pVfs, 0, pFile, vfsFlags, 0);
40769: assert( rc!=SQLITE_OK || isOpen(pFile) );
40770: return rc;
40771: }
40772:
40773: /*
40774: ** Set the busy handler function.
40775: **
40776: ** The pager invokes the busy-handler if sqlite3OsLock() returns
40777: ** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock,
40778: ** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE
40779: ** lock. It does *not* invoke the busy handler when upgrading from
40780: ** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE
40781: ** (which occurs during hot-journal rollback). Summary:
40782: **
40783: ** Transition | Invokes xBusyHandler
40784: ** --------------------------------------------------------
40785: ** NO_LOCK -> SHARED_LOCK | Yes
40786: ** SHARED_LOCK -> RESERVED_LOCK | No
40787: ** SHARED_LOCK -> EXCLUSIVE_LOCK | No
40788: ** RESERVED_LOCK -> EXCLUSIVE_LOCK | Yes
40789: **
40790: ** If the busy-handler callback returns non-zero, the lock is
40791: ** retried. If it returns zero, then the SQLITE_BUSY error is
40792: ** returned to the caller of the pager API function.
40793: */
40794: SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(
40795: Pager *pPager, /* Pager object */
40796: int (*xBusyHandler)(void *), /* Pointer to busy-handler function */
40797: void *pBusyHandlerArg /* Argument to pass to xBusyHandler */
1.2.2.1 ! misho 40798: ){
1.2 misho 40799: pPager->xBusyHandler = xBusyHandler;
40800: pPager->pBusyHandlerArg = pBusyHandlerArg;
1.2.2.1 ! misho 40801:
! 40802: if( isOpen(pPager->fd) ){
! 40803: void **ap = (void **)&pPager->xBusyHandler;
! 40804: assert( ((int(*)(void *))(ap[0]))==xBusyHandler );
! 40805: assert( ap[1]==pBusyHandlerArg );
! 40806: sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap);
! 40807: }
1.2 misho 40808: }
40809:
40810: /*
40811: ** Change the page size used by the Pager object. The new page size
40812: ** is passed in *pPageSize.
40813: **
40814: ** If the pager is in the error state when this function is called, it
40815: ** is a no-op. The value returned is the error state error code (i.e.
40816: ** one of SQLITE_IOERR, an SQLITE_IOERR_xxx sub-code or SQLITE_FULL).
40817: **
40818: ** Otherwise, if all of the following are true:
40819: **
40820: ** * the new page size (value of *pPageSize) is valid (a power
40821: ** of two between 512 and SQLITE_MAX_PAGE_SIZE, inclusive), and
40822: **
40823: ** * there are no outstanding page references, and
40824: **
40825: ** * the database is either not an in-memory database or it is
40826: ** an in-memory database that currently consists of zero pages.
40827: **
40828: ** then the pager object page size is set to *pPageSize.
40829: **
40830: ** If the page size is changed, then this function uses sqlite3PagerMalloc()
40831: ** to obtain a new Pager.pTmpSpace buffer. If this allocation attempt
40832: ** fails, SQLITE_NOMEM is returned and the page size remains unchanged.
40833: ** In all other cases, SQLITE_OK is returned.
40834: **
40835: ** If the page size is not changed, either because one of the enumerated
40836: ** conditions above is not true, the pager was in error state when this
40837: ** function was called, or because the memory allocation attempt failed,
40838: ** then *pPageSize is set to the old, retained page size before returning.
40839: */
40840: SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nReserve){
40841: int rc = SQLITE_OK;
40842:
40843: /* It is not possible to do a full assert_pager_state() here, as this
40844: ** function may be called from within PagerOpen(), before the state
40845: ** of the Pager object is internally consistent.
40846: **
40847: ** At one point this function returned an error if the pager was in
40848: ** PAGER_ERROR state. But since PAGER_ERROR state guarantees that
40849: ** there is at least one outstanding page reference, this function
40850: ** is a no-op for that case anyhow.
40851: */
40852:
40853: u32 pageSize = *pPageSize;
40854: assert( pageSize==0 || (pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE) );
40855: if( (pPager->memDb==0 || pPager->dbSize==0)
40856: && sqlite3PcacheRefCount(pPager->pPCache)==0
40857: && pageSize && pageSize!=(u32)pPager->pageSize
40858: ){
40859: char *pNew = NULL; /* New temp space */
40860: i64 nByte = 0;
40861:
40862: if( pPager->eState>PAGER_OPEN && isOpen(pPager->fd) ){
40863: rc = sqlite3OsFileSize(pPager->fd, &nByte);
40864: }
40865: if( rc==SQLITE_OK ){
40866: pNew = (char *)sqlite3PageMalloc(pageSize);
40867: if( !pNew ) rc = SQLITE_NOMEM;
40868: }
40869:
40870: if( rc==SQLITE_OK ){
40871: pager_reset(pPager);
40872: pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize);
40873: pPager->pageSize = pageSize;
40874: sqlite3PageFree(pPager->pTmpSpace);
40875: pPager->pTmpSpace = pNew;
40876: sqlite3PcacheSetPageSize(pPager->pPCache, pageSize);
40877: }
40878: }
40879:
40880: *pPageSize = pPager->pageSize;
40881: if( rc==SQLITE_OK ){
40882: if( nReserve<0 ) nReserve = pPager->nReserve;
40883: assert( nReserve>=0 && nReserve<1000 );
40884: pPager->nReserve = (i16)nReserve;
40885: pagerReportSize(pPager);
40886: }
40887: return rc;
40888: }
40889:
40890: /*
40891: ** Return a pointer to the "temporary page" buffer held internally
40892: ** by the pager. This is a buffer that is big enough to hold the
40893: ** entire content of a database page. This buffer is used internally
40894: ** during rollback and will be overwritten whenever a rollback
40895: ** occurs. But other modules are free to use it too, as long as
40896: ** no rollbacks are happening.
40897: */
40898: SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager *pPager){
40899: return pPager->pTmpSpace;
40900: }
40901:
40902: /*
40903: ** Attempt to set the maximum database page count if mxPage is positive.
40904: ** Make no changes if mxPage is zero or negative. And never reduce the
40905: ** maximum page count below the current size of the database.
40906: **
40907: ** Regardless of mxPage, return the current maximum page count.
40908: */
40909: SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){
40910: if( mxPage>0 ){
40911: pPager->mxPgno = mxPage;
40912: }
40913: assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */
40914: assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */
40915: return pPager->mxPgno;
40916: }
40917:
40918: /*
40919: ** The following set of routines are used to disable the simulated
40920: ** I/O error mechanism. These routines are used to avoid simulated
40921: ** errors in places where we do not care about errors.
40922: **
40923: ** Unless -DSQLITE_TEST=1 is used, these routines are all no-ops
40924: ** and generate no code.
40925: */
40926: #ifdef SQLITE_TEST
40927: SQLITE_API extern int sqlite3_io_error_pending;
40928: SQLITE_API extern int sqlite3_io_error_hit;
40929: static int saved_cnt;
40930: void disable_simulated_io_errors(void){
40931: saved_cnt = sqlite3_io_error_pending;
40932: sqlite3_io_error_pending = -1;
40933: }
40934: void enable_simulated_io_errors(void){
40935: sqlite3_io_error_pending = saved_cnt;
40936: }
40937: #else
40938: # define disable_simulated_io_errors()
40939: # define enable_simulated_io_errors()
40940: #endif
40941:
40942: /*
40943: ** Read the first N bytes from the beginning of the file into memory
40944: ** that pDest points to.
40945: **
40946: ** If the pager was opened on a transient file (zFilename==""), or
40947: ** opened on a file less than N bytes in size, the output buffer is
40948: ** zeroed and SQLITE_OK returned. The rationale for this is that this
40949: ** function is used to read database headers, and a new transient or
40950: ** zero sized database has a header than consists entirely of zeroes.
40951: **
40952: ** If any IO error apart from SQLITE_IOERR_SHORT_READ is encountered,
40953: ** the error code is returned to the caller and the contents of the
40954: ** output buffer undefined.
40955: */
40956: SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager *pPager, int N, unsigned char *pDest){
40957: int rc = SQLITE_OK;
40958: memset(pDest, 0, N);
40959: assert( isOpen(pPager->fd) || pPager->tempFile );
40960:
40961: /* This routine is only called by btree immediately after creating
40962: ** the Pager object. There has not been an opportunity to transition
40963: ** to WAL mode yet.
40964: */
40965: assert( !pagerUseWal(pPager) );
40966:
40967: if( isOpen(pPager->fd) ){
40968: IOTRACE(("DBHDR %p 0 %d\n", pPager, N))
40969: rc = sqlite3OsRead(pPager->fd, pDest, N, 0);
40970: if( rc==SQLITE_IOERR_SHORT_READ ){
40971: rc = SQLITE_OK;
40972: }
40973: }
40974: return rc;
40975: }
40976:
40977: /*
40978: ** This function may only be called when a read-transaction is open on
40979: ** the pager. It returns the total number of pages in the database.
40980: **
40981: ** However, if the file is between 1 and <page-size> bytes in size, then
40982: ** this is considered a 1 page file.
40983: */
40984: SQLITE_PRIVATE void sqlite3PagerPagecount(Pager *pPager, int *pnPage){
40985: assert( pPager->eState>=PAGER_READER );
40986: assert( pPager->eState!=PAGER_WRITER_FINISHED );
40987: *pnPage = (int)pPager->dbSize;
40988: }
40989:
40990:
40991: /*
40992: ** Try to obtain a lock of type locktype on the database file. If
40993: ** a similar or greater lock is already held, this function is a no-op
40994: ** (returning SQLITE_OK immediately).
40995: **
40996: ** Otherwise, attempt to obtain the lock using sqlite3OsLock(). Invoke
40997: ** the busy callback if the lock is currently not available. Repeat
40998: ** until the busy callback returns false or until the attempt to
40999: ** obtain the lock succeeds.
41000: **
41001: ** Return SQLITE_OK on success and an error code if we cannot obtain
41002: ** the lock. If the lock is obtained successfully, set the Pager.state
41003: ** variable to locktype before returning.
41004: */
41005: static int pager_wait_on_lock(Pager *pPager, int locktype){
41006: int rc; /* Return code */
41007:
41008: /* Check that this is either a no-op (because the requested lock is
41009: ** already held, or one of the transistions that the busy-handler
41010: ** may be invoked during, according to the comment above
41011: ** sqlite3PagerSetBusyhandler().
41012: */
41013: assert( (pPager->eLock>=locktype)
41014: || (pPager->eLock==NO_LOCK && locktype==SHARED_LOCK)
41015: || (pPager->eLock==RESERVED_LOCK && locktype==EXCLUSIVE_LOCK)
41016: );
41017:
41018: do {
41019: rc = pagerLockDb(pPager, locktype);
41020: }while( rc==SQLITE_BUSY && pPager->xBusyHandler(pPager->pBusyHandlerArg) );
41021: return rc;
41022: }
41023:
41024: /*
41025: ** Function assertTruncateConstraint(pPager) checks that one of the
41026: ** following is true for all dirty pages currently in the page-cache:
41027: **
41028: ** a) The page number is less than or equal to the size of the
41029: ** current database image, in pages, OR
41030: **
41031: ** b) if the page content were written at this time, it would not
41032: ** be necessary to write the current content out to the sub-journal
41033: ** (as determined by function subjRequiresPage()).
41034: **
41035: ** If the condition asserted by this function were not true, and the
41036: ** dirty page were to be discarded from the cache via the pagerStress()
41037: ** routine, pagerStress() would not write the current page content to
41038: ** the database file. If a savepoint transaction were rolled back after
41039: ** this happened, the correct behaviour would be to restore the current
41040: ** content of the page. However, since this content is not present in either
41041: ** the database file or the portion of the rollback journal and
41042: ** sub-journal rolled back the content could not be restored and the
41043: ** database image would become corrupt. It is therefore fortunate that
41044: ** this circumstance cannot arise.
41045: */
41046: #if defined(SQLITE_DEBUG)
41047: static void assertTruncateConstraintCb(PgHdr *pPg){
41048: assert( pPg->flags&PGHDR_DIRTY );
41049: assert( !subjRequiresPage(pPg) || pPg->pgno<=pPg->pPager->dbSize );
41050: }
41051: static void assertTruncateConstraint(Pager *pPager){
41052: sqlite3PcacheIterateDirty(pPager->pPCache, assertTruncateConstraintCb);
41053: }
41054: #else
41055: # define assertTruncateConstraint(pPager)
41056: #endif
41057:
41058: /*
41059: ** Truncate the in-memory database file image to nPage pages. This
41060: ** function does not actually modify the database file on disk. It
41061: ** just sets the internal state of the pager object so that the
41062: ** truncation will be done when the current transaction is committed.
41063: */
41064: SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager *pPager, Pgno nPage){
41065: assert( pPager->dbSize>=nPage );
41066: assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
41067: pPager->dbSize = nPage;
41068: assertTruncateConstraint(pPager);
41069: }
41070:
41071:
41072: /*
41073: ** This function is called before attempting a hot-journal rollback. It
41074: ** syncs the journal file to disk, then sets pPager->journalHdr to the
41075: ** size of the journal file so that the pager_playback() routine knows
41076: ** that the entire journal file has been synced.
41077: **
41078: ** Syncing a hot-journal to disk before attempting to roll it back ensures
41079: ** that if a power-failure occurs during the rollback, the process that
41080: ** attempts rollback following system recovery sees the same journal
41081: ** content as this process.
41082: **
41083: ** If everything goes as planned, SQLITE_OK is returned. Otherwise,
41084: ** an SQLite error code.
41085: */
41086: static int pagerSyncHotJournal(Pager *pPager){
41087: int rc = SQLITE_OK;
41088: if( !pPager->noSync ){
41089: rc = sqlite3OsSync(pPager->jfd, SQLITE_SYNC_NORMAL);
41090: }
41091: if( rc==SQLITE_OK ){
41092: rc = sqlite3OsFileSize(pPager->jfd, &pPager->journalHdr);
41093: }
41094: return rc;
41095: }
41096:
41097: /*
41098: ** Shutdown the page cache. Free all memory and close all files.
41099: **
41100: ** If a transaction was in progress when this routine is called, that
41101: ** transaction is rolled back. All outstanding pages are invalidated
41102: ** and their memory is freed. Any attempt to use a page associated
41103: ** with this page cache after this function returns will likely
41104: ** result in a coredump.
41105: **
41106: ** This function always succeeds. If a transaction is active an attempt
41107: ** is made to roll it back. If an error occurs during the rollback
41108: ** a hot journal may be left in the filesystem but no error is returned
41109: ** to the caller.
41110: */
41111: SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){
41112: u8 *pTmp = (u8 *)pPager->pTmpSpace;
41113:
41114: assert( assert_pager_state(pPager) );
41115: disable_simulated_io_errors();
41116: sqlite3BeginBenignMalloc();
41117: /* pPager->errCode = 0; */
41118: pPager->exclusiveMode = 0;
41119: #ifndef SQLITE_OMIT_WAL
41120: sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp);
41121: pPager->pWal = 0;
41122: #endif
41123: pager_reset(pPager);
41124: if( MEMDB ){
41125: pager_unlock(pPager);
41126: }else{
41127: /* If it is open, sync the journal file before calling UnlockAndRollback.
41128: ** If this is not done, then an unsynced portion of the open journal
41129: ** file may be played back into the database. If a power failure occurs
41130: ** while this is happening, the database could become corrupt.
41131: **
41132: ** If an error occurs while trying to sync the journal, shift the pager
41133: ** into the ERROR state. This causes UnlockAndRollback to unlock the
41134: ** database and close the journal file without attempting to roll it
41135: ** back or finalize it. The next database user will have to do hot-journal
41136: ** rollback before accessing the database file.
41137: */
41138: if( isOpen(pPager->jfd) ){
41139: pager_error(pPager, pagerSyncHotJournal(pPager));
41140: }
41141: pagerUnlockAndRollback(pPager);
41142: }
41143: sqlite3EndBenignMalloc();
41144: enable_simulated_io_errors();
41145: PAGERTRACE(("CLOSE %d\n", PAGERID(pPager)));
41146: IOTRACE(("CLOSE %p\n", pPager))
41147: sqlite3OsClose(pPager->jfd);
41148: sqlite3OsClose(pPager->fd);
41149: sqlite3PageFree(pTmp);
41150: sqlite3PcacheClose(pPager->pPCache);
41151:
41152: #ifdef SQLITE_HAS_CODEC
41153: if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
41154: #endif
41155:
41156: assert( !pPager->aSavepoint && !pPager->pInJournal );
41157: assert( !isOpen(pPager->jfd) && !isOpen(pPager->sjfd) );
41158:
41159: sqlite3_free(pPager);
41160: return SQLITE_OK;
41161: }
41162:
41163: #if !defined(NDEBUG) || defined(SQLITE_TEST)
41164: /*
41165: ** Return the page number for page pPg.
41166: */
41167: SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage *pPg){
41168: return pPg->pgno;
41169: }
41170: #endif
41171:
41172: /*
41173: ** Increment the reference count for page pPg.
41174: */
41175: SQLITE_PRIVATE void sqlite3PagerRef(DbPage *pPg){
41176: sqlite3PcacheRef(pPg);
41177: }
41178:
41179: /*
41180: ** Sync the journal. In other words, make sure all the pages that have
41181: ** been written to the journal have actually reached the surface of the
41182: ** disk and can be restored in the event of a hot-journal rollback.
41183: **
41184: ** If the Pager.noSync flag is set, then this function is a no-op.
41185: ** Otherwise, the actions required depend on the journal-mode and the
1.2.2.1 ! misho 41186: ** device characteristics of the file-system, as follows:
1.2 misho 41187: **
41188: ** * If the journal file is an in-memory journal file, no action need
41189: ** be taken.
41190: **
41191: ** * Otherwise, if the device does not support the SAFE_APPEND property,
41192: ** then the nRec field of the most recently written journal header
41193: ** is updated to contain the number of journal records that have
41194: ** been written following it. If the pager is operating in full-sync
41195: ** mode, then the journal file is synced before this field is updated.
41196: **
41197: ** * If the device does not support the SEQUENTIAL property, then
41198: ** journal file is synced.
41199: **
41200: ** Or, in pseudo-code:
41201: **
41202: ** if( NOT <in-memory journal> ){
41203: ** if( NOT SAFE_APPEND ){
41204: ** if( <full-sync mode> ) xSync(<journal file>);
41205: ** <update nRec field>
41206: ** }
41207: ** if( NOT SEQUENTIAL ) xSync(<journal file>);
41208: ** }
41209: **
41210: ** If successful, this routine clears the PGHDR_NEED_SYNC flag of every
41211: ** page currently held in memory before returning SQLITE_OK. If an IO
41212: ** error is encountered, then the IO error code is returned to the caller.
41213: */
41214: static int syncJournal(Pager *pPager, int newHdr){
41215: int rc; /* Return code */
41216:
41217: assert( pPager->eState==PAGER_WRITER_CACHEMOD
41218: || pPager->eState==PAGER_WRITER_DBMOD
41219: );
41220: assert( assert_pager_state(pPager) );
41221: assert( !pagerUseWal(pPager) );
41222:
41223: rc = sqlite3PagerExclusiveLock(pPager);
41224: if( rc!=SQLITE_OK ) return rc;
41225:
41226: if( !pPager->noSync ){
41227: assert( !pPager->tempFile );
41228: if( isOpen(pPager->jfd) && pPager->journalMode!=PAGER_JOURNALMODE_MEMORY ){
41229: const int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
41230: assert( isOpen(pPager->jfd) );
41231:
41232: if( 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
41233: /* This block deals with an obscure problem. If the last connection
41234: ** that wrote to this database was operating in persistent-journal
41235: ** mode, then the journal file may at this point actually be larger
41236: ** than Pager.journalOff bytes. If the next thing in the journal
41237: ** file happens to be a journal-header (written as part of the
41238: ** previous connection's transaction), and a crash or power-failure
41239: ** occurs after nRec is updated but before this connection writes
41240: ** anything else to the journal file (or commits/rolls back its
41241: ** transaction), then SQLite may become confused when doing the
41242: ** hot-journal rollback following recovery. It may roll back all
41243: ** of this connections data, then proceed to rolling back the old,
41244: ** out-of-date data that follows it. Database corruption.
41245: **
41246: ** To work around this, if the journal file does appear to contain
41247: ** a valid header following Pager.journalOff, then write a 0x00
41248: ** byte to the start of it to prevent it from being recognized.
41249: **
41250: ** Variable iNextHdrOffset is set to the offset at which this
41251: ** problematic header will occur, if it exists. aMagic is used
41252: ** as a temporary buffer to inspect the first couple of bytes of
41253: ** the potential journal header.
41254: */
41255: i64 iNextHdrOffset;
41256: u8 aMagic[8];
41257: u8 zHeader[sizeof(aJournalMagic)+4];
41258:
41259: memcpy(zHeader, aJournalMagic, sizeof(aJournalMagic));
41260: put32bits(&zHeader[sizeof(aJournalMagic)], pPager->nRec);
41261:
41262: iNextHdrOffset = journalHdrOffset(pPager);
41263: rc = sqlite3OsRead(pPager->jfd, aMagic, 8, iNextHdrOffset);
41264: if( rc==SQLITE_OK && 0==memcmp(aMagic, aJournalMagic, 8) ){
41265: static const u8 zerobyte = 0;
41266: rc = sqlite3OsWrite(pPager->jfd, &zerobyte, 1, iNextHdrOffset);
41267: }
41268: if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
41269: return rc;
41270: }
41271:
41272: /* Write the nRec value into the journal file header. If in
41273: ** full-synchronous mode, sync the journal first. This ensures that
41274: ** all data has really hit the disk before nRec is updated to mark
41275: ** it as a candidate for rollback.
41276: **
41277: ** This is not required if the persistent media supports the
41278: ** SAFE_APPEND property. Because in this case it is not possible
41279: ** for garbage data to be appended to the file, the nRec field
41280: ** is populated with 0xFFFFFFFF when the journal header is written
41281: ** and never needs to be updated.
41282: */
41283: if( pPager->fullSync && 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
41284: PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
41285: IOTRACE(("JSYNC %p\n", pPager))
41286: rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags);
41287: if( rc!=SQLITE_OK ) return rc;
41288: }
41289: IOTRACE(("JHDR %p %lld\n", pPager, pPager->journalHdr));
41290: rc = sqlite3OsWrite(
41291: pPager->jfd, zHeader, sizeof(zHeader), pPager->journalHdr
41292: );
41293: if( rc!=SQLITE_OK ) return rc;
41294: }
41295: if( 0==(iDc&SQLITE_IOCAP_SEQUENTIAL) ){
41296: PAGERTRACE(("SYNC journal of %d\n", PAGERID(pPager)));
41297: IOTRACE(("JSYNC %p\n", pPager))
41298: rc = sqlite3OsSync(pPager->jfd, pPager->syncFlags|
41299: (pPager->syncFlags==SQLITE_SYNC_FULL?SQLITE_SYNC_DATAONLY:0)
41300: );
41301: if( rc!=SQLITE_OK ) return rc;
41302: }
41303:
41304: pPager->journalHdr = pPager->journalOff;
41305: if( newHdr && 0==(iDc&SQLITE_IOCAP_SAFE_APPEND) ){
41306: pPager->nRec = 0;
41307: rc = writeJournalHdr(pPager);
41308: if( rc!=SQLITE_OK ) return rc;
41309: }
41310: }else{
41311: pPager->journalHdr = pPager->journalOff;
41312: }
41313: }
41314:
41315: /* Unless the pager is in noSync mode, the journal file was just
41316: ** successfully synced. Either way, clear the PGHDR_NEED_SYNC flag on
41317: ** all pages.
41318: */
41319: sqlite3PcacheClearSyncFlags(pPager->pPCache);
41320: pPager->eState = PAGER_WRITER_DBMOD;
41321: assert( assert_pager_state(pPager) );
41322: return SQLITE_OK;
41323: }
41324:
41325: /*
41326: ** The argument is the first in a linked list of dirty pages connected
41327: ** by the PgHdr.pDirty pointer. This function writes each one of the
41328: ** in-memory pages in the list to the database file. The argument may
41329: ** be NULL, representing an empty list. In this case this function is
41330: ** a no-op.
41331: **
41332: ** The pager must hold at least a RESERVED lock when this function
41333: ** is called. Before writing anything to the database file, this lock
41334: ** is upgraded to an EXCLUSIVE lock. If the lock cannot be obtained,
41335: ** SQLITE_BUSY is returned and no data is written to the database file.
41336: **
41337: ** If the pager is a temp-file pager and the actual file-system file
41338: ** is not yet open, it is created and opened before any data is
41339: ** written out.
41340: **
41341: ** Once the lock has been upgraded and, if necessary, the file opened,
41342: ** the pages are written out to the database file in list order. Writing
41343: ** a page is skipped if it meets either of the following criteria:
41344: **
41345: ** * The page number is greater than Pager.dbSize, or
41346: ** * The PGHDR_DONT_WRITE flag is set on the page.
41347: **
41348: ** If writing out a page causes the database file to grow, Pager.dbFileSize
41349: ** is updated accordingly. If page 1 is written out, then the value cached
41350: ** in Pager.dbFileVers[] is updated to match the new value stored in
41351: ** the database file.
41352: **
41353: ** If everything is successful, SQLITE_OK is returned. If an IO error
41354: ** occurs, an IO error code is returned. Or, if the EXCLUSIVE lock cannot
41355: ** be obtained, SQLITE_BUSY is returned.
41356: */
41357: static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
41358: int rc = SQLITE_OK; /* Return code */
41359:
41360: /* This function is only called for rollback pagers in WRITER_DBMOD state. */
41361: assert( !pagerUseWal(pPager) );
41362: assert( pPager->eState==PAGER_WRITER_DBMOD );
41363: assert( pPager->eLock==EXCLUSIVE_LOCK );
41364:
41365: /* If the file is a temp-file has not yet been opened, open it now. It
41366: ** is not possible for rc to be other than SQLITE_OK if this branch
41367: ** is taken, as pager_wait_on_lock() is a no-op for temp-files.
41368: */
41369: if( !isOpen(pPager->fd) ){
41370: assert( pPager->tempFile && rc==SQLITE_OK );
41371: rc = pagerOpentemp(pPager, pPager->fd, pPager->vfsFlags);
41372: }
41373:
41374: /* Before the first write, give the VFS a hint of what the final
41375: ** file size will be.
41376: */
41377: assert( rc!=SQLITE_OK || isOpen(pPager->fd) );
41378: if( rc==SQLITE_OK && pPager->dbSize>pPager->dbHintSize ){
41379: sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize;
41380: sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile);
41381: pPager->dbHintSize = pPager->dbSize;
41382: }
41383:
41384: while( rc==SQLITE_OK && pList ){
41385: Pgno pgno = pList->pgno;
41386:
41387: /* If there are dirty pages in the page cache with page numbers greater
41388: ** than Pager.dbSize, this means sqlite3PagerTruncateImage() was called to
41389: ** make the file smaller (presumably by auto-vacuum code). Do not write
41390: ** any such pages to the file.
41391: **
41392: ** Also, do not write out any page that has the PGHDR_DONT_WRITE flag
41393: ** set (set by sqlite3PagerDontWrite()).
41394: */
41395: if( pgno<=pPager->dbSize && 0==(pList->flags&PGHDR_DONT_WRITE) ){
41396: i64 offset = (pgno-1)*(i64)pPager->pageSize; /* Offset to write */
41397: char *pData; /* Data to write */
41398:
41399: assert( (pList->flags&PGHDR_NEED_SYNC)==0 );
41400: if( pList->pgno==1 ) pager_write_changecounter(pList);
41401:
41402: /* Encode the database */
41403: CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData);
41404:
41405: /* Write out the page data. */
41406: rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset);
41407:
41408: /* If page 1 was just written, update Pager.dbFileVers to match
41409: ** the value now stored in the database file. If writing this
41410: ** page caused the database file to grow, update dbFileSize.
41411: */
41412: if( pgno==1 ){
41413: memcpy(&pPager->dbFileVers, &pData[24], sizeof(pPager->dbFileVers));
41414: }
41415: if( pgno>pPager->dbFileSize ){
41416: pPager->dbFileSize = pgno;
41417: }
1.2.2.1 ! misho 41418: pPager->aStat[PAGER_STAT_WRITE]++;
1.2 misho 41419:
41420: /* Update any backup objects copying the contents of this pager. */
41421: sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)pList->pData);
41422:
41423: PAGERTRACE(("STORE %d page %d hash(%08x)\n",
41424: PAGERID(pPager), pgno, pager_pagehash(pList)));
41425: IOTRACE(("PGOUT %p %d\n", pPager, pgno));
41426: PAGER_INCR(sqlite3_pager_writedb_count);
41427: }else{
41428: PAGERTRACE(("NOSTORE %d page %d\n", PAGERID(pPager), pgno));
41429: }
41430: pager_set_pagehash(pList);
41431: pList = pList->pDirty;
41432: }
41433:
41434: return rc;
41435: }
41436:
41437: /*
41438: ** Ensure that the sub-journal file is open. If it is already open, this
41439: ** function is a no-op.
41440: **
41441: ** SQLITE_OK is returned if everything goes according to plan. An
41442: ** SQLITE_IOERR_XXX error code is returned if a call to sqlite3OsOpen()
41443: ** fails.
41444: */
41445: static int openSubJournal(Pager *pPager){
41446: int rc = SQLITE_OK;
41447: if( !isOpen(pPager->sjfd) ){
41448: if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){
41449: sqlite3MemJournalOpen(pPager->sjfd);
41450: }else{
41451: rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL);
41452: }
41453: }
41454: return rc;
41455: }
41456:
41457: /*
41458: ** Append a record of the current state of page pPg to the sub-journal.
41459: ** It is the callers responsibility to use subjRequiresPage() to check
41460: ** that it is really required before calling this function.
41461: **
41462: ** If successful, set the bit corresponding to pPg->pgno in the bitvecs
41463: ** for all open savepoints before returning.
41464: **
41465: ** This function returns SQLITE_OK if everything is successful, an IO
41466: ** error code if the attempt to write to the sub-journal fails, or
41467: ** SQLITE_NOMEM if a malloc fails while setting a bit in a savepoint
41468: ** bitvec.
41469: */
41470: static int subjournalPage(PgHdr *pPg){
41471: int rc = SQLITE_OK;
41472: Pager *pPager = pPg->pPager;
41473: if( pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
41474:
41475: /* Open the sub-journal, if it has not already been opened */
41476: assert( pPager->useJournal );
41477: assert( isOpen(pPager->jfd) || pagerUseWal(pPager) );
41478: assert( isOpen(pPager->sjfd) || pPager->nSubRec==0 );
41479: assert( pagerUseWal(pPager)
41480: || pageInJournal(pPg)
41481: || pPg->pgno>pPager->dbOrigSize
41482: );
41483: rc = openSubJournal(pPager);
41484:
41485: /* If the sub-journal was opened successfully (or was already open),
41486: ** write the journal record into the file. */
41487: if( rc==SQLITE_OK ){
41488: void *pData = pPg->pData;
41489: i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize);
41490: char *pData2;
41491:
41492: CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
41493: PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno));
41494: rc = write32bits(pPager->sjfd, offset, pPg->pgno);
41495: if( rc==SQLITE_OK ){
41496: rc = sqlite3OsWrite(pPager->sjfd, pData2, pPager->pageSize, offset+4);
41497: }
41498: }
41499: }
41500: if( rc==SQLITE_OK ){
41501: pPager->nSubRec++;
41502: assert( pPager->nSavepoint>0 );
41503: rc = addToSavepointBitvecs(pPager, pPg->pgno);
41504: }
41505: return rc;
41506: }
41507:
41508: /*
41509: ** This function is called by the pcache layer when it has reached some
41510: ** soft memory limit. The first argument is a pointer to a Pager object
41511: ** (cast as a void*). The pager is always 'purgeable' (not an in-memory
41512: ** database). The second argument is a reference to a page that is
41513: ** currently dirty but has no outstanding references. The page
41514: ** is always associated with the Pager object passed as the first
41515: ** argument.
41516: **
41517: ** The job of this function is to make pPg clean by writing its contents
41518: ** out to the database file, if possible. This may involve syncing the
41519: ** journal file.
41520: **
41521: ** If successful, sqlite3PcacheMakeClean() is called on the page and
41522: ** SQLITE_OK returned. If an IO error occurs while trying to make the
41523: ** page clean, the IO error code is returned. If the page cannot be
41524: ** made clean for some other reason, but no error occurs, then SQLITE_OK
41525: ** is returned by sqlite3PcacheMakeClean() is not called.
41526: */
41527: static int pagerStress(void *p, PgHdr *pPg){
41528: Pager *pPager = (Pager *)p;
41529: int rc = SQLITE_OK;
41530:
41531: assert( pPg->pPager==pPager );
41532: assert( pPg->flags&PGHDR_DIRTY );
41533:
41534: /* The doNotSyncSpill flag is set during times when doing a sync of
41535: ** journal (and adding a new header) is not allowed. This occurs
41536: ** during calls to sqlite3PagerWrite() while trying to journal multiple
41537: ** pages belonging to the same sector.
41538: **
41539: ** The doNotSpill flag inhibits all cache spilling regardless of whether
41540: ** or not a sync is required. This is set during a rollback.
41541: **
41542: ** Spilling is also prohibited when in an error state since that could
41543: ** lead to database corruption. In the current implementaton it
41544: ** is impossible for sqlite3PcacheFetch() to be called with createFlag==1
41545: ** while in the error state, hence it is impossible for this routine to
41546: ** be called in the error state. Nevertheless, we include a NEVER()
41547: ** test for the error state as a safeguard against future changes.
41548: */
41549: if( NEVER(pPager->errCode) ) return SQLITE_OK;
41550: if( pPager->doNotSpill ) return SQLITE_OK;
41551: if( pPager->doNotSyncSpill && (pPg->flags & PGHDR_NEED_SYNC)!=0 ){
41552: return SQLITE_OK;
41553: }
41554:
41555: pPg->pDirty = 0;
41556: if( pagerUseWal(pPager) ){
41557: /* Write a single frame for this page to the log. */
41558: if( subjRequiresPage(pPg) ){
41559: rc = subjournalPage(pPg);
41560: }
41561: if( rc==SQLITE_OK ){
41562: rc = pagerWalFrames(pPager, pPg, 0, 0);
41563: }
41564: }else{
41565:
41566: /* Sync the journal file if required. */
41567: if( pPg->flags&PGHDR_NEED_SYNC
41568: || pPager->eState==PAGER_WRITER_CACHEMOD
41569: ){
41570: rc = syncJournal(pPager, 1);
41571: }
41572:
41573: /* If the page number of this page is larger than the current size of
41574: ** the database image, it may need to be written to the sub-journal.
41575: ** This is because the call to pager_write_pagelist() below will not
41576: ** actually write data to the file in this case.
41577: **
41578: ** Consider the following sequence of events:
41579: **
41580: ** BEGIN;
41581: ** <journal page X>
41582: ** <modify page X>
41583: ** SAVEPOINT sp;
41584: ** <shrink database file to Y pages>
41585: ** pagerStress(page X)
41586: ** ROLLBACK TO sp;
41587: **
41588: ** If (X>Y), then when pagerStress is called page X will not be written
41589: ** out to the database file, but will be dropped from the cache. Then,
41590: ** following the "ROLLBACK TO sp" statement, reading page X will read
41591: ** data from the database file. This will be the copy of page X as it
41592: ** was when the transaction started, not as it was when "SAVEPOINT sp"
41593: ** was executed.
41594: **
41595: ** The solution is to write the current data for page X into the
41596: ** sub-journal file now (if it is not already there), so that it will
41597: ** be restored to its current value when the "ROLLBACK TO sp" is
41598: ** executed.
41599: */
41600: if( NEVER(
41601: rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg)
41602: ) ){
41603: rc = subjournalPage(pPg);
41604: }
41605:
41606: /* Write the contents of the page out to the database file. */
41607: if( rc==SQLITE_OK ){
41608: assert( (pPg->flags&PGHDR_NEED_SYNC)==0 );
41609: rc = pager_write_pagelist(pPager, pPg);
41610: }
41611: }
41612:
41613: /* Mark the page as clean. */
41614: if( rc==SQLITE_OK ){
41615: PAGERTRACE(("STRESS %d page %d\n", PAGERID(pPager), pPg->pgno));
41616: sqlite3PcacheMakeClean(pPg);
41617: }
41618:
41619: return pager_error(pPager, rc);
41620: }
41621:
41622:
41623: /*
41624: ** Allocate and initialize a new Pager object and put a pointer to it
41625: ** in *ppPager. The pager should eventually be freed by passing it
41626: ** to sqlite3PagerClose().
41627: **
41628: ** The zFilename argument is the path to the database file to open.
41629: ** If zFilename is NULL then a randomly-named temporary file is created
41630: ** and used as the file to be cached. Temporary files are be deleted
41631: ** automatically when they are closed. If zFilename is ":memory:" then
41632: ** all information is held in cache. It is never written to disk.
41633: ** This can be used to implement an in-memory database.
41634: **
41635: ** The nExtra parameter specifies the number of bytes of space allocated
41636: ** along with each page reference. This space is available to the user
41637: ** via the sqlite3PagerGetExtra() API.
41638: **
41639: ** The flags argument is used to specify properties that affect the
41640: ** operation of the pager. It should be passed some bitwise combination
1.2.2.1 ! misho 41641: ** of the PAGER_* flags.
1.2 misho 41642: **
41643: ** The vfsFlags parameter is a bitmask to pass to the flags parameter
41644: ** of the xOpen() method of the supplied VFS when opening files.
41645: **
41646: ** If the pager object is allocated and the specified file opened
41647: ** successfully, SQLITE_OK is returned and *ppPager set to point to
41648: ** the new pager object. If an error occurs, *ppPager is set to NULL
41649: ** and error code returned. This function may return SQLITE_NOMEM
41650: ** (sqlite3Malloc() is used to allocate memory), SQLITE_CANTOPEN or
41651: ** various SQLITE_IO_XXX errors.
41652: */
41653: SQLITE_PRIVATE int sqlite3PagerOpen(
41654: sqlite3_vfs *pVfs, /* The virtual file system to use */
41655: Pager **ppPager, /* OUT: Return the Pager structure here */
41656: const char *zFilename, /* Name of the database file to open */
41657: int nExtra, /* Extra bytes append to each in-memory page */
41658: int flags, /* flags controlling this file */
41659: int vfsFlags, /* flags passed through to sqlite3_vfs.xOpen() */
41660: void (*xReinit)(DbPage*) /* Function to reinitialize pages */
41661: ){
41662: u8 *pPtr;
41663: Pager *pPager = 0; /* Pager object to allocate and return */
41664: int rc = SQLITE_OK; /* Return code */
41665: int tempFile = 0; /* True for temp files (incl. in-memory files) */
41666: int memDb = 0; /* True if this is an in-memory file */
41667: int readOnly = 0; /* True if this is a read-only file */
41668: int journalFileSize; /* Bytes to allocate for each journal fd */
41669: char *zPathname = 0; /* Full path to database file */
41670: int nPathname = 0; /* Number of bytes in zPathname */
41671: int useJournal = (flags & PAGER_OMIT_JOURNAL)==0; /* False to omit journal */
41672: int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */
41673: u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */
41674: const char *zUri = 0; /* URI args to copy */
41675: int nUri = 0; /* Number of bytes of URI args at *zUri */
41676:
41677: /* Figure out how much space is required for each journal file-handle
41678: ** (there are two of them, the main journal and the sub-journal). This
41679: ** is the maximum space required for an in-memory journal file handle
41680: ** and a regular journal file-handle. Note that a "regular journal-handle"
41681: ** may be a wrapper capable of caching the first portion of the journal
41682: ** file in memory to implement the atomic-write optimization (see
41683: ** source file journal.c).
41684: */
41685: if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){
41686: journalFileSize = ROUND8(sqlite3JournalSize(pVfs));
41687: }else{
41688: journalFileSize = ROUND8(sqlite3MemJournalSize());
41689: }
41690:
41691: /* Set the output variable to NULL in case an error occurs. */
41692: *ppPager = 0;
41693:
41694: #ifndef SQLITE_OMIT_MEMORYDB
41695: if( flags & PAGER_MEMORY ){
41696: memDb = 1;
1.2.2.1 ! misho 41697: if( zFilename && zFilename[0] ){
! 41698: zPathname = sqlite3DbStrDup(0, zFilename);
! 41699: if( zPathname==0 ) return SQLITE_NOMEM;
! 41700: nPathname = sqlite3Strlen30(zPathname);
! 41701: zFilename = 0;
! 41702: }
1.2 misho 41703: }
41704: #endif
41705:
41706: /* Compute and store the full pathname in an allocated buffer pointed
41707: ** to by zPathname, length nPathname. Or, if this is a temporary file,
41708: ** leave both nPathname and zPathname set to 0.
41709: */
41710: if( zFilename && zFilename[0] ){
41711: const char *z;
41712: nPathname = pVfs->mxPathname+1;
1.2.2.1 ! misho 41713: zPathname = sqlite3DbMallocRaw(0, nPathname*2);
1.2 misho 41714: if( zPathname==0 ){
41715: return SQLITE_NOMEM;
41716: }
41717: zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */
41718: rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname);
41719: nPathname = sqlite3Strlen30(zPathname);
41720: z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1];
41721: while( *z ){
41722: z += sqlite3Strlen30(z)+1;
41723: z += sqlite3Strlen30(z)+1;
41724: }
41725: nUri = (int)(&z[1] - zUri);
41726: assert( nUri>=0 );
41727: if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){
41728: /* This branch is taken when the journal path required by
41729: ** the database being opened will be more than pVfs->mxPathname
41730: ** bytes in length. This means the database cannot be opened,
41731: ** as it will not be possible to open the journal file or even
41732: ** check for a hot-journal before reading.
41733: */
41734: rc = SQLITE_CANTOPEN_BKPT;
41735: }
41736: if( rc!=SQLITE_OK ){
1.2.2.1 ! misho 41737: sqlite3DbFree(0, zPathname);
1.2 misho 41738: return rc;
41739: }
41740: }
41741:
41742: /* Allocate memory for the Pager structure, PCache object, the
41743: ** three file descriptors, the database file name and the journal
41744: ** file name. The layout in memory is as follows:
41745: **
41746: ** Pager object (sizeof(Pager) bytes)
41747: ** PCache object (sqlite3PcacheSize() bytes)
41748: ** Database file handle (pVfs->szOsFile bytes)
41749: ** Sub-journal file handle (journalFileSize bytes)
41750: ** Main journal file handle (journalFileSize bytes)
41751: ** Database file name (nPathname+1 bytes)
41752: ** Journal file name (nPathname+8+1 bytes)
41753: */
41754: pPtr = (u8 *)sqlite3MallocZero(
41755: ROUND8(sizeof(*pPager)) + /* Pager structure */
41756: ROUND8(pcacheSize) + /* PCache object */
41757: ROUND8(pVfs->szOsFile) + /* The main db file */
41758: journalFileSize * 2 + /* The two journal files */
41759: nPathname + 1 + nUri + /* zFilename */
41760: nPathname + 8 + 2 /* zJournal */
41761: #ifndef SQLITE_OMIT_WAL
41762: + nPathname + 4 + 2 /* zWal */
41763: #endif
41764: );
41765: assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) );
41766: if( !pPtr ){
1.2.2.1 ! misho 41767: sqlite3DbFree(0, zPathname);
1.2 misho 41768: return SQLITE_NOMEM;
41769: }
41770: pPager = (Pager*)(pPtr);
41771: pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager)));
41772: pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize));
41773: pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile));
41774: pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize);
41775: pPager->zFilename = (char*)(pPtr += journalFileSize);
41776: assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) );
41777:
41778: /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */
41779: if( zPathname ){
41780: assert( nPathname>0 );
41781: pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri);
41782: memcpy(pPager->zFilename, zPathname, nPathname);
1.2.2.1 ! misho 41783: if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUri);
1.2 misho 41784: memcpy(pPager->zJournal, zPathname, nPathname);
1.2.2.1 ! misho 41785: memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+2);
1.2 misho 41786: sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal);
41787: #ifndef SQLITE_OMIT_WAL
41788: pPager->zWal = &pPager->zJournal[nPathname+8+1];
41789: memcpy(pPager->zWal, zPathname, nPathname);
41790: memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1);
41791: sqlite3FileSuffix3(pPager->zFilename, pPager->zWal);
41792: #endif
1.2.2.1 ! misho 41793: sqlite3DbFree(0, zPathname);
1.2 misho 41794: }
41795: pPager->pVfs = pVfs;
41796: pPager->vfsFlags = vfsFlags;
41797:
41798: /* Open the pager file.
41799: */
41800: if( zFilename && zFilename[0] ){
41801: int fout = 0; /* VFS flags returned by xOpen() */
41802: rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout);
41803: assert( !memDb );
41804: readOnly = (fout&SQLITE_OPEN_READONLY);
41805:
41806: /* If the file was successfully opened for read/write access,
41807: ** choose a default page size in case we have to create the
41808: ** database file. The default page size is the maximum of:
41809: **
41810: ** + SQLITE_DEFAULT_PAGE_SIZE,
41811: ** + The value returned by sqlite3OsSectorSize()
41812: ** + The largest page size that can be written atomically.
41813: */
41814: if( rc==SQLITE_OK && !readOnly ){
41815: setSectorSize(pPager);
41816: assert(SQLITE_DEFAULT_PAGE_SIZE<=SQLITE_MAX_DEFAULT_PAGE_SIZE);
41817: if( szPageDflt<pPager->sectorSize ){
41818: if( pPager->sectorSize>SQLITE_MAX_DEFAULT_PAGE_SIZE ){
41819: szPageDflt = SQLITE_MAX_DEFAULT_PAGE_SIZE;
41820: }else{
41821: szPageDflt = (u32)pPager->sectorSize;
41822: }
41823: }
41824: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
41825: {
41826: int iDc = sqlite3OsDeviceCharacteristics(pPager->fd);
41827: int ii;
41828: assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
41829: assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
41830: assert(SQLITE_MAX_DEFAULT_PAGE_SIZE<=65536);
41831: for(ii=szPageDflt; ii<=SQLITE_MAX_DEFAULT_PAGE_SIZE; ii=ii*2){
41832: if( iDc&(SQLITE_IOCAP_ATOMIC|(ii>>8)) ){
41833: szPageDflt = ii;
41834: }
41835: }
41836: }
41837: #endif
41838: }
41839: }else{
41840: /* If a temporary file is requested, it is not opened immediately.
41841: ** In this case we accept the default page size and delay actually
41842: ** opening the file until the first call to OsWrite().
41843: **
41844: ** This branch is also run for an in-memory database. An in-memory
41845: ** database is the same as a temp-file that is never written out to
41846: ** disk and uses an in-memory rollback journal.
41847: */
41848: tempFile = 1;
41849: pPager->eState = PAGER_READER;
41850: pPager->eLock = EXCLUSIVE_LOCK;
41851: readOnly = (vfsFlags&SQLITE_OPEN_READONLY);
41852: }
41853:
41854: /* The following call to PagerSetPagesize() serves to set the value of
41855: ** Pager.pageSize and to allocate the Pager.pTmpSpace buffer.
41856: */
41857: if( rc==SQLITE_OK ){
41858: assert( pPager->memDb==0 );
41859: rc = sqlite3PagerSetPagesize(pPager, &szPageDflt, -1);
41860: testcase( rc!=SQLITE_OK );
41861: }
41862:
41863: /* If an error occurred in either of the blocks above, free the
41864: ** Pager structure and close the file.
41865: */
41866: if( rc!=SQLITE_OK ){
41867: assert( !pPager->pTmpSpace );
41868: sqlite3OsClose(pPager->fd);
41869: sqlite3_free(pPager);
41870: return rc;
41871: }
41872:
41873: /* Initialize the PCache object. */
41874: assert( nExtra<1000 );
41875: nExtra = ROUND8(nExtra);
41876: sqlite3PcacheOpen(szPageDflt, nExtra, !memDb,
41877: !memDb?pagerStress:0, (void *)pPager, pPager->pPCache);
41878:
41879: PAGERTRACE(("OPEN %d %s\n", FILEHANDLEID(pPager->fd), pPager->zFilename));
41880: IOTRACE(("OPEN %p %s\n", pPager, pPager->zFilename))
41881:
41882: pPager->useJournal = (u8)useJournal;
41883: /* pPager->stmtOpen = 0; */
41884: /* pPager->stmtInUse = 0; */
41885: /* pPager->nRef = 0; */
41886: /* pPager->stmtSize = 0; */
41887: /* pPager->stmtJSize = 0; */
41888: /* pPager->nPage = 0; */
41889: pPager->mxPgno = SQLITE_MAX_PAGE_COUNT;
41890: /* pPager->state = PAGER_UNLOCK; */
41891: #if 0
41892: assert( pPager->state == (tempFile ? PAGER_EXCLUSIVE : PAGER_UNLOCK) );
41893: #endif
41894: /* pPager->errMask = 0; */
41895: pPager->tempFile = (u8)tempFile;
41896: assert( tempFile==PAGER_LOCKINGMODE_NORMAL
41897: || tempFile==PAGER_LOCKINGMODE_EXCLUSIVE );
41898: assert( PAGER_LOCKINGMODE_EXCLUSIVE==1 );
41899: pPager->exclusiveMode = (u8)tempFile;
41900: pPager->changeCountDone = pPager->tempFile;
41901: pPager->memDb = (u8)memDb;
41902: pPager->readOnly = (u8)readOnly;
41903: assert( useJournal || pPager->tempFile );
41904: pPager->noSync = pPager->tempFile;
41905: if( pPager->noSync ){
41906: assert( pPager->fullSync==0 );
41907: assert( pPager->syncFlags==0 );
41908: assert( pPager->walSyncFlags==0 );
41909: assert( pPager->ckptSyncFlags==0 );
41910: }else{
41911: pPager->fullSync = 1;
41912: pPager->syncFlags = SQLITE_SYNC_NORMAL;
41913: pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS;
41914: pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL;
41915: }
41916: /* pPager->pFirst = 0; */
41917: /* pPager->pFirstSynced = 0; */
41918: /* pPager->pLast = 0; */
41919: pPager->nExtra = (u16)nExtra;
41920: pPager->journalSizeLimit = SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT;
41921: assert( isOpen(pPager->fd) || tempFile );
41922: setSectorSize(pPager);
41923: if( !useJournal ){
41924: pPager->journalMode = PAGER_JOURNALMODE_OFF;
41925: }else if( memDb ){
41926: pPager->journalMode = PAGER_JOURNALMODE_MEMORY;
41927: }
41928: /* pPager->xBusyHandler = 0; */
41929: /* pPager->pBusyHandlerArg = 0; */
41930: pPager->xReiniter = xReinit;
41931: /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */
41932:
41933: *ppPager = pPager;
41934: return SQLITE_OK;
41935: }
41936:
41937:
41938:
41939: /*
41940: ** This function is called after transitioning from PAGER_UNLOCK to
41941: ** PAGER_SHARED state. It tests if there is a hot journal present in
41942: ** the file-system for the given pager. A hot journal is one that
41943: ** needs to be played back. According to this function, a hot-journal
41944: ** file exists if the following criteria are met:
41945: **
41946: ** * The journal file exists in the file system, and
41947: ** * No process holds a RESERVED or greater lock on the database file, and
41948: ** * The database file itself is greater than 0 bytes in size, and
41949: ** * The first byte of the journal file exists and is not 0x00.
41950: **
41951: ** If the current size of the database file is 0 but a journal file
41952: ** exists, that is probably an old journal left over from a prior
41953: ** database with the same name. In this case the journal file is
41954: ** just deleted using OsDelete, *pExists is set to 0 and SQLITE_OK
41955: ** is returned.
41956: **
41957: ** This routine does not check if there is a master journal filename
41958: ** at the end of the file. If there is, and that master journal file
41959: ** does not exist, then the journal file is not really hot. In this
41960: ** case this routine will return a false-positive. The pager_playback()
41961: ** routine will discover that the journal file is not really hot and
41962: ** will not roll it back.
41963: **
41964: ** If a hot-journal file is found to exist, *pExists is set to 1 and
41965: ** SQLITE_OK returned. If no hot-journal file is present, *pExists is
41966: ** set to 0 and SQLITE_OK returned. If an IO error occurs while trying
41967: ** to determine whether or not a hot-journal file exists, the IO error
41968: ** code is returned and the value of *pExists is undefined.
41969: */
41970: static int hasHotJournal(Pager *pPager, int *pExists){
41971: sqlite3_vfs * const pVfs = pPager->pVfs;
41972: int rc = SQLITE_OK; /* Return code */
41973: int exists = 1; /* True if a journal file is present */
41974: int jrnlOpen = !!isOpen(pPager->jfd);
41975:
41976: assert( pPager->useJournal );
41977: assert( isOpen(pPager->fd) );
41978: assert( pPager->eState==PAGER_OPEN );
41979:
41980: assert( jrnlOpen==0 || ( sqlite3OsDeviceCharacteristics(pPager->jfd) &
41981: SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
41982: ));
41983:
41984: *pExists = 0;
41985: if( !jrnlOpen ){
41986: rc = sqlite3OsAccess(pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &exists);
41987: }
41988: if( rc==SQLITE_OK && exists ){
41989: int locked = 0; /* True if some process holds a RESERVED lock */
41990:
41991: /* Race condition here: Another process might have been holding the
41992: ** the RESERVED lock and have a journal open at the sqlite3OsAccess()
41993: ** call above, but then delete the journal and drop the lock before
41994: ** we get to the following sqlite3OsCheckReservedLock() call. If that
41995: ** is the case, this routine might think there is a hot journal when
41996: ** in fact there is none. This results in a false-positive which will
41997: ** be dealt with by the playback routine. Ticket #3883.
41998: */
41999: rc = sqlite3OsCheckReservedLock(pPager->fd, &locked);
42000: if( rc==SQLITE_OK && !locked ){
42001: Pgno nPage; /* Number of pages in database file */
42002:
42003: /* Check the size of the database file. If it consists of 0 pages,
42004: ** then delete the journal file. See the header comment above for
42005: ** the reasoning here. Delete the obsolete journal file under
42006: ** a RESERVED lock to avoid race conditions and to avoid violating
42007: ** [H33020].
42008: */
42009: rc = pagerPagecount(pPager, &nPage);
42010: if( rc==SQLITE_OK ){
42011: if( nPage==0 ){
42012: sqlite3BeginBenignMalloc();
42013: if( pagerLockDb(pPager, RESERVED_LOCK)==SQLITE_OK ){
42014: sqlite3OsDelete(pVfs, pPager->zJournal, 0);
42015: if( !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK);
42016: }
42017: sqlite3EndBenignMalloc();
42018: }else{
42019: /* The journal file exists and no other connection has a reserved
42020: ** or greater lock on the database file. Now check that there is
42021: ** at least one non-zero bytes at the start of the journal file.
42022: ** If there is, then we consider this journal to be hot. If not,
42023: ** it can be ignored.
42024: */
42025: if( !jrnlOpen ){
42026: int f = SQLITE_OPEN_READONLY|SQLITE_OPEN_MAIN_JOURNAL;
42027: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &f);
42028: }
42029: if( rc==SQLITE_OK ){
42030: u8 first = 0;
42031: rc = sqlite3OsRead(pPager->jfd, (void *)&first, 1, 0);
42032: if( rc==SQLITE_IOERR_SHORT_READ ){
42033: rc = SQLITE_OK;
42034: }
42035: if( !jrnlOpen ){
42036: sqlite3OsClose(pPager->jfd);
42037: }
42038: *pExists = (first!=0);
42039: }else if( rc==SQLITE_CANTOPEN ){
42040: /* If we cannot open the rollback journal file in order to see if
42041: ** its has a zero header, that might be due to an I/O error, or
42042: ** it might be due to the race condition described above and in
42043: ** ticket #3883. Either way, assume that the journal is hot.
42044: ** This might be a false positive. But if it is, then the
42045: ** automatic journal playback and recovery mechanism will deal
42046: ** with it under an EXCLUSIVE lock where we do not need to
42047: ** worry so much with race conditions.
42048: */
42049: *pExists = 1;
42050: rc = SQLITE_OK;
42051: }
42052: }
42053: }
42054: }
42055: }
42056:
42057: return rc;
42058: }
42059:
42060: /*
42061: ** This function is called to obtain a shared lock on the database file.
42062: ** It is illegal to call sqlite3PagerAcquire() until after this function
42063: ** has been successfully called. If a shared-lock is already held when
42064: ** this function is called, it is a no-op.
42065: **
42066: ** The following operations are also performed by this function.
42067: **
42068: ** 1) If the pager is currently in PAGER_OPEN state (no lock held
42069: ** on the database file), then an attempt is made to obtain a
42070: ** SHARED lock on the database file. Immediately after obtaining
42071: ** the SHARED lock, the file-system is checked for a hot-journal,
42072: ** which is played back if present. Following any hot-journal
42073: ** rollback, the contents of the cache are validated by checking
42074: ** the 'change-counter' field of the database file header and
42075: ** discarded if they are found to be invalid.
42076: **
42077: ** 2) If the pager is running in exclusive-mode, and there are currently
42078: ** no outstanding references to any pages, and is in the error state,
42079: ** then an attempt is made to clear the error state by discarding
42080: ** the contents of the page cache and rolling back any open journal
42081: ** file.
42082: **
42083: ** If everything is successful, SQLITE_OK is returned. If an IO error
42084: ** occurs while locking the database, checking for a hot-journal file or
42085: ** rolling back a journal file, the IO error code is returned.
42086: */
42087: SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){
42088: int rc = SQLITE_OK; /* Return code */
42089:
42090: /* This routine is only called from b-tree and only when there are no
42091: ** outstanding pages. This implies that the pager state should either
42092: ** be OPEN or READER. READER is only possible if the pager is or was in
42093: ** exclusive access mode.
42094: */
42095: assert( sqlite3PcacheRefCount(pPager->pPCache)==0 );
42096: assert( assert_pager_state(pPager) );
42097: assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER );
42098: if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; }
42099:
42100: if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){
42101: int bHotJournal = 1; /* True if there exists a hot journal-file */
42102:
42103: assert( !MEMDB );
42104:
1.2.2.1 ! misho 42105: rc = pager_wait_on_lock(pPager, SHARED_LOCK);
! 42106: if( rc!=SQLITE_OK ){
! 42107: assert( pPager->eLock==NO_LOCK || pPager->eLock==UNKNOWN_LOCK );
! 42108: goto failed;
1.2 misho 42109: }
42110:
42111: /* If a journal file exists, and there is no RESERVED lock on the
42112: ** database file, then it either needs to be played back or deleted.
42113: */
42114: if( pPager->eLock<=SHARED_LOCK ){
42115: rc = hasHotJournal(pPager, &bHotJournal);
42116: }
42117: if( rc!=SQLITE_OK ){
42118: goto failed;
42119: }
42120: if( bHotJournal ){
42121: /* Get an EXCLUSIVE lock on the database file. At this point it is
42122: ** important that a RESERVED lock is not obtained on the way to the
42123: ** EXCLUSIVE lock. If it were, another process might open the
42124: ** database file, detect the RESERVED lock, and conclude that the
42125: ** database is safe to read while this process is still rolling the
42126: ** hot-journal back.
42127: **
42128: ** Because the intermediate RESERVED lock is not requested, any
42129: ** other process attempting to access the database file will get to
42130: ** this point in the code and fail to obtain its own EXCLUSIVE lock
42131: ** on the database file.
42132: **
42133: ** Unless the pager is in locking_mode=exclusive mode, the lock is
42134: ** downgraded to SHARED_LOCK before this function returns.
42135: */
42136: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
42137: if( rc!=SQLITE_OK ){
42138: goto failed;
42139: }
42140:
42141: /* If it is not already open and the file exists on disk, open the
42142: ** journal for read/write access. Write access is required because
42143: ** in exclusive-access mode the file descriptor will be kept open
42144: ** and possibly used for a transaction later on. Also, write-access
42145: ** is usually required to finalize the journal in journal_mode=persist
42146: ** mode (and also for journal_mode=truncate on some systems).
42147: **
42148: ** If the journal does not exist, it usually means that some
42149: ** other connection managed to get in and roll it back before
42150: ** this connection obtained the exclusive lock above. Or, it
42151: ** may mean that the pager was in the error-state when this
42152: ** function was called and the journal file does not exist.
42153: */
42154: if( !isOpen(pPager->jfd) ){
42155: sqlite3_vfs * const pVfs = pPager->pVfs;
42156: int bExists; /* True if journal file exists */
42157: rc = sqlite3OsAccess(
42158: pVfs, pPager->zJournal, SQLITE_ACCESS_EXISTS, &bExists);
42159: if( rc==SQLITE_OK && bExists ){
42160: int fout = 0;
42161: int f = SQLITE_OPEN_READWRITE|SQLITE_OPEN_MAIN_JOURNAL;
42162: assert( !pPager->tempFile );
42163: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, f, &fout);
42164: assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
42165: if( rc==SQLITE_OK && fout&SQLITE_OPEN_READONLY ){
42166: rc = SQLITE_CANTOPEN_BKPT;
42167: sqlite3OsClose(pPager->jfd);
42168: }
42169: }
42170: }
42171:
42172: /* Playback and delete the journal. Drop the database write
42173: ** lock and reacquire the read lock. Purge the cache before
42174: ** playing back the hot-journal so that we don't end up with
42175: ** an inconsistent cache. Sync the hot journal before playing
42176: ** it back since the process that crashed and left the hot journal
42177: ** probably did not sync it and we are required to always sync
42178: ** the journal before playing it back.
42179: */
42180: if( isOpen(pPager->jfd) ){
42181: assert( rc==SQLITE_OK );
42182: rc = pagerSyncHotJournal(pPager);
42183: if( rc==SQLITE_OK ){
42184: rc = pager_playback(pPager, 1);
42185: pPager->eState = PAGER_OPEN;
42186: }
42187: }else if( !pPager->exclusiveMode ){
42188: pagerUnlockDb(pPager, SHARED_LOCK);
42189: }
42190:
42191: if( rc!=SQLITE_OK ){
42192: /* This branch is taken if an error occurs while trying to open
42193: ** or roll back a hot-journal while holding an EXCLUSIVE lock. The
42194: ** pager_unlock() routine will be called before returning to unlock
42195: ** the file. If the unlock attempt fails, then Pager.eLock must be
42196: ** set to UNKNOWN_LOCK (see the comment above the #define for
42197: ** UNKNOWN_LOCK above for an explanation).
42198: **
42199: ** In order to get pager_unlock() to do this, set Pager.eState to
42200: ** PAGER_ERROR now. This is not actually counted as a transition
42201: ** to ERROR state in the state diagram at the top of this file,
42202: ** since we know that the same call to pager_unlock() will very
42203: ** shortly transition the pager object to the OPEN state. Calling
42204: ** assert_pager_state() would fail now, as it should not be possible
42205: ** to be in ERROR state when there are zero outstanding page
42206: ** references.
42207: */
42208: pager_error(pPager, rc);
42209: goto failed;
42210: }
42211:
42212: assert( pPager->eState==PAGER_OPEN );
42213: assert( (pPager->eLock==SHARED_LOCK)
42214: || (pPager->exclusiveMode && pPager->eLock>SHARED_LOCK)
42215: );
42216: }
42217:
42218: if( !pPager->tempFile
42219: && (pPager->pBackup || sqlite3PcachePagecount(pPager->pPCache)>0)
42220: ){
42221: /* The shared-lock has just been acquired on the database file
42222: ** and there are already pages in the cache (from a previous
42223: ** read or write transaction). Check to see if the database
42224: ** has been modified. If the database has changed, flush the
42225: ** cache.
42226: **
42227: ** Database changes is detected by looking at 15 bytes beginning
42228: ** at offset 24 into the file. The first 4 of these 16 bytes are
42229: ** a 32-bit counter that is incremented with each change. The
42230: ** other bytes change randomly with each file change when
42231: ** a codec is in use.
42232: **
42233: ** There is a vanishingly small chance that a change will not be
42234: ** detected. The chance of an undetected change is so small that
42235: ** it can be neglected.
42236: */
42237: Pgno nPage = 0;
42238: char dbFileVers[sizeof(pPager->dbFileVers)];
42239:
42240: rc = pagerPagecount(pPager, &nPage);
42241: if( rc ) goto failed;
42242:
42243: if( nPage>0 ){
42244: IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers)));
42245: rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24);
42246: if( rc!=SQLITE_OK ){
42247: goto failed;
42248: }
42249: }else{
42250: memset(dbFileVers, 0, sizeof(dbFileVers));
42251: }
42252:
42253: if( memcmp(pPager->dbFileVers, dbFileVers, sizeof(dbFileVers))!=0 ){
42254: pager_reset(pPager);
42255: }
42256: }
42257:
42258: /* If there is a WAL file in the file-system, open this database in WAL
42259: ** mode. Otherwise, the following function call is a no-op.
42260: */
42261: rc = pagerOpenWalIfPresent(pPager);
42262: #ifndef SQLITE_OMIT_WAL
42263: assert( pPager->pWal==0 || rc==SQLITE_OK );
42264: #endif
42265: }
42266:
42267: if( pagerUseWal(pPager) ){
42268: assert( rc==SQLITE_OK );
42269: rc = pagerBeginReadTransaction(pPager);
42270: }
42271:
42272: if( pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){
42273: rc = pagerPagecount(pPager, &pPager->dbSize);
42274: }
42275:
42276: failed:
42277: if( rc!=SQLITE_OK ){
42278: assert( !MEMDB );
42279: pager_unlock(pPager);
42280: assert( pPager->eState==PAGER_OPEN );
42281: }else{
42282: pPager->eState = PAGER_READER;
42283: }
42284: return rc;
42285: }
42286:
42287: /*
42288: ** If the reference count has reached zero, rollback any active
42289: ** transaction and unlock the pager.
42290: **
42291: ** Except, in locking_mode=EXCLUSIVE when there is nothing to in
42292: ** the rollback journal, the unlock is not performed and there is
42293: ** nothing to rollback, so this routine is a no-op.
42294: */
42295: static void pagerUnlockIfUnused(Pager *pPager){
42296: if( (sqlite3PcacheRefCount(pPager->pPCache)==0) ){
42297: pagerUnlockAndRollback(pPager);
42298: }
42299: }
42300:
42301: /*
42302: ** Acquire a reference to page number pgno in pager pPager (a page
42303: ** reference has type DbPage*). If the requested reference is
42304: ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned.
42305: **
42306: ** If the requested page is already in the cache, it is returned.
42307: ** Otherwise, a new page object is allocated and populated with data
42308: ** read from the database file. In some cases, the pcache module may
42309: ** choose not to allocate a new page object and may reuse an existing
42310: ** object with no outstanding references.
42311: **
42312: ** The extra data appended to a page is always initialized to zeros the
42313: ** first time a page is loaded into memory. If the page requested is
42314: ** already in the cache when this function is called, then the extra
42315: ** data is left as it was when the page object was last used.
42316: **
42317: ** If the database image is smaller than the requested page or if a
42318: ** non-zero value is passed as the noContent parameter and the
42319: ** requested page is not already stored in the cache, then no
42320: ** actual disk read occurs. In this case the memory image of the
42321: ** page is initialized to all zeros.
42322: **
42323: ** If noContent is true, it means that we do not care about the contents
42324: ** of the page. This occurs in two seperate scenarios:
42325: **
42326: ** a) When reading a free-list leaf page from the database, and
42327: **
42328: ** b) When a savepoint is being rolled back and we need to load
42329: ** a new page into the cache to be filled with the data read
42330: ** from the savepoint journal.
42331: **
42332: ** If noContent is true, then the data returned is zeroed instead of
42333: ** being read from the database. Additionally, the bits corresponding
42334: ** to pgno in Pager.pInJournal (bitvec of pages already written to the
42335: ** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open
42336: ** savepoints are set. This means if the page is made writable at any
42337: ** point in the future, using a call to sqlite3PagerWrite(), its contents
42338: ** will not be journaled. This saves IO.
42339: **
42340: ** The acquisition might fail for several reasons. In all cases,
42341: ** an appropriate error code is returned and *ppPage is set to NULL.
42342: **
42343: ** See also sqlite3PagerLookup(). Both this routine and Lookup() attempt
42344: ** to find a page in the in-memory cache first. If the page is not already
42345: ** in memory, this routine goes to disk to read it in whereas Lookup()
42346: ** just returns 0. This routine acquires a read-lock the first time it
42347: ** has to go to disk, and could also playback an old journal if necessary.
42348: ** Since Lookup() never goes to disk, it never has to deal with locks
42349: ** or journal files.
42350: */
42351: SQLITE_PRIVATE int sqlite3PagerAcquire(
42352: Pager *pPager, /* The pager open on the database file */
42353: Pgno pgno, /* Page number to fetch */
42354: DbPage **ppPage, /* Write a pointer to the page here */
42355: int noContent /* Do not bother reading content from disk if true */
42356: ){
42357: int rc;
42358: PgHdr *pPg;
42359:
42360: assert( pPager->eState>=PAGER_READER );
42361: assert( assert_pager_state(pPager) );
42362:
42363: if( pgno==0 ){
42364: return SQLITE_CORRUPT_BKPT;
42365: }
42366:
42367: /* If the pager is in the error state, return an error immediately.
42368: ** Otherwise, request the page from the PCache layer. */
42369: if( pPager->errCode!=SQLITE_OK ){
42370: rc = pPager->errCode;
42371: }else{
42372: rc = sqlite3PcacheFetch(pPager->pPCache, pgno, 1, ppPage);
42373: }
42374:
42375: if( rc!=SQLITE_OK ){
42376: /* Either the call to sqlite3PcacheFetch() returned an error or the
42377: ** pager was already in the error-state when this function was called.
42378: ** Set pPg to 0 and jump to the exception handler. */
42379: pPg = 0;
42380: goto pager_acquire_err;
42381: }
42382: assert( (*ppPage)->pgno==pgno );
42383: assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 );
42384:
42385: if( (*ppPage)->pPager && !noContent ){
42386: /* In this case the pcache already contains an initialized copy of
42387: ** the page. Return without further ado. */
42388: assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) );
1.2.2.1 ! misho 42389: pPager->aStat[PAGER_STAT_HIT]++;
1.2 misho 42390: return SQLITE_OK;
42391:
42392: }else{
42393: /* The pager cache has created a new page. Its content needs to
42394: ** be initialized. */
42395:
42396: pPg = *ppPage;
42397: pPg->pPager = pPager;
42398:
42399: /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page
42400: ** number greater than this, or the unused locking-page, is requested. */
42401: if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){
42402: rc = SQLITE_CORRUPT_BKPT;
42403: goto pager_acquire_err;
42404: }
42405:
42406: if( MEMDB || pPager->dbSize<pgno || noContent || !isOpen(pPager->fd) ){
42407: if( pgno>pPager->mxPgno ){
42408: rc = SQLITE_FULL;
42409: goto pager_acquire_err;
42410: }
42411: if( noContent ){
42412: /* Failure to set the bits in the InJournal bit-vectors is benign.
42413: ** It merely means that we might do some extra work to journal a
42414: ** page that does not need to be journaled. Nevertheless, be sure
42415: ** to test the case where a malloc error occurs while trying to set
42416: ** a bit in a bit vector.
42417: */
42418: sqlite3BeginBenignMalloc();
42419: if( pgno<=pPager->dbOrigSize ){
42420: TESTONLY( rc = ) sqlite3BitvecSet(pPager->pInJournal, pgno);
42421: testcase( rc==SQLITE_NOMEM );
42422: }
42423: TESTONLY( rc = ) addToSavepointBitvecs(pPager, pgno);
42424: testcase( rc==SQLITE_NOMEM );
42425: sqlite3EndBenignMalloc();
42426: }
42427: memset(pPg->pData, 0, pPager->pageSize);
42428: IOTRACE(("ZERO %p %d\n", pPager, pgno));
42429: }else{
42430: assert( pPg->pPager==pPager );
1.2.2.1 ! misho 42431: pPager->aStat[PAGER_STAT_MISS]++;
1.2 misho 42432: rc = readDbPage(pPg);
42433: if( rc!=SQLITE_OK ){
42434: goto pager_acquire_err;
42435: }
42436: }
42437: pager_set_pagehash(pPg);
42438: }
42439:
42440: return SQLITE_OK;
42441:
42442: pager_acquire_err:
42443: assert( rc!=SQLITE_OK );
42444: if( pPg ){
42445: sqlite3PcacheDrop(pPg);
42446: }
42447: pagerUnlockIfUnused(pPager);
42448:
42449: *ppPage = 0;
42450: return rc;
42451: }
42452:
42453: /*
42454: ** Acquire a page if it is already in the in-memory cache. Do
42455: ** not read the page from disk. Return a pointer to the page,
42456: ** or 0 if the page is not in cache.
42457: **
42458: ** See also sqlite3PagerGet(). The difference between this routine
42459: ** and sqlite3PagerGet() is that _get() will go to the disk and read
42460: ** in the page if the page is not already in cache. This routine
42461: ** returns NULL if the page is not in cache or if a disk I/O error
42462: ** has ever happened.
42463: */
42464: SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){
42465: PgHdr *pPg = 0;
42466: assert( pPager!=0 );
42467: assert( pgno!=0 );
42468: assert( pPager->pPCache!=0 );
42469: assert( pPager->eState>=PAGER_READER && pPager->eState!=PAGER_ERROR );
42470: sqlite3PcacheFetch(pPager->pPCache, pgno, 0, &pPg);
42471: return pPg;
42472: }
42473:
42474: /*
42475: ** Release a page reference.
42476: **
42477: ** If the number of references to the page drop to zero, then the
42478: ** page is added to the LRU list. When all references to all pages
42479: ** are released, a rollback occurs and the lock on the database is
42480: ** removed.
42481: */
42482: SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){
42483: if( pPg ){
42484: Pager *pPager = pPg->pPager;
42485: sqlite3PcacheRelease(pPg);
42486: pagerUnlockIfUnused(pPager);
42487: }
42488: }
42489:
42490: /*
42491: ** This function is called at the start of every write transaction.
42492: ** There must already be a RESERVED or EXCLUSIVE lock on the database
42493: ** file when this routine is called.
42494: **
42495: ** Open the journal file for pager pPager and write a journal header
42496: ** to the start of it. If there are active savepoints, open the sub-journal
42497: ** as well. This function is only used when the journal file is being
42498: ** opened to write a rollback log for a transaction. It is not used
42499: ** when opening a hot journal file to roll it back.
42500: **
42501: ** If the journal file is already open (as it may be in exclusive mode),
42502: ** then this function just writes a journal header to the start of the
42503: ** already open file.
42504: **
42505: ** Whether or not the journal file is opened by this function, the
42506: ** Pager.pInJournal bitvec structure is allocated.
42507: **
42508: ** Return SQLITE_OK if everything is successful. Otherwise, return
42509: ** SQLITE_NOMEM if the attempt to allocate Pager.pInJournal fails, or
42510: ** an IO error code if opening or writing the journal file fails.
42511: */
42512: static int pager_open_journal(Pager *pPager){
42513: int rc = SQLITE_OK; /* Return code */
42514: sqlite3_vfs * const pVfs = pPager->pVfs; /* Local cache of vfs pointer */
42515:
42516: assert( pPager->eState==PAGER_WRITER_LOCKED );
42517: assert( assert_pager_state(pPager) );
42518: assert( pPager->pInJournal==0 );
42519:
42520: /* If already in the error state, this function is a no-op. But on
42521: ** the other hand, this routine is never called if we are already in
42522: ** an error state. */
42523: if( NEVER(pPager->errCode) ) return pPager->errCode;
42524:
42525: if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){
42526: pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize);
42527: if( pPager->pInJournal==0 ){
42528: return SQLITE_NOMEM;
42529: }
42530:
42531: /* Open the journal file if it is not already open. */
42532: if( !isOpen(pPager->jfd) ){
42533: if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){
42534: sqlite3MemJournalOpen(pPager->jfd);
42535: }else{
42536: const int flags = /* VFS flags to open journal file */
42537: SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
42538: (pPager->tempFile ?
42539: (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL):
42540: (SQLITE_OPEN_MAIN_JOURNAL)
42541: );
42542: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
42543: rc = sqlite3JournalOpen(
42544: pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager)
42545: );
42546: #else
42547: rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0);
42548: #endif
42549: }
42550: assert( rc!=SQLITE_OK || isOpen(pPager->jfd) );
42551: }
42552:
42553:
42554: /* Write the first journal header to the journal file and open
42555: ** the sub-journal if necessary.
42556: */
42557: if( rc==SQLITE_OK ){
42558: /* TODO: Check if all of these are really required. */
42559: pPager->nRec = 0;
42560: pPager->journalOff = 0;
42561: pPager->setMaster = 0;
42562: pPager->journalHdr = 0;
42563: rc = writeJournalHdr(pPager);
42564: }
42565: }
42566:
42567: if( rc!=SQLITE_OK ){
42568: sqlite3BitvecDestroy(pPager->pInJournal);
42569: pPager->pInJournal = 0;
42570: }else{
42571: assert( pPager->eState==PAGER_WRITER_LOCKED );
42572: pPager->eState = PAGER_WRITER_CACHEMOD;
42573: }
42574:
42575: return rc;
42576: }
42577:
42578: /*
42579: ** Begin a write-transaction on the specified pager object. If a
42580: ** write-transaction has already been opened, this function is a no-op.
42581: **
42582: ** If the exFlag argument is false, then acquire at least a RESERVED
42583: ** lock on the database file. If exFlag is true, then acquire at least
42584: ** an EXCLUSIVE lock. If such a lock is already held, no locking
42585: ** functions need be called.
42586: **
42587: ** If the subjInMemory argument is non-zero, then any sub-journal opened
42588: ** within this transaction will be opened as an in-memory file. This
42589: ** has no effect if the sub-journal is already opened (as it may be when
42590: ** running in exclusive mode) or if the transaction does not require a
42591: ** sub-journal. If the subjInMemory argument is zero, then any required
42592: ** sub-journal is implemented in-memory if pPager is an in-memory database,
42593: ** or using a temporary file otherwise.
42594: */
42595: SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory){
42596: int rc = SQLITE_OK;
42597:
42598: if( pPager->errCode ) return pPager->errCode;
42599: assert( pPager->eState>=PAGER_READER && pPager->eState<PAGER_ERROR );
42600: pPager->subjInMemory = (u8)subjInMemory;
42601:
42602: if( ALWAYS(pPager->eState==PAGER_READER) ){
42603: assert( pPager->pInJournal==0 );
42604:
42605: if( pagerUseWal(pPager) ){
42606: /* If the pager is configured to use locking_mode=exclusive, and an
42607: ** exclusive lock on the database is not already held, obtain it now.
42608: */
42609: if( pPager->exclusiveMode && sqlite3WalExclusiveMode(pPager->pWal, -1) ){
42610: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
42611: if( rc!=SQLITE_OK ){
42612: return rc;
42613: }
42614: sqlite3WalExclusiveMode(pPager->pWal, 1);
42615: }
42616:
42617: /* Grab the write lock on the log file. If successful, upgrade to
42618: ** PAGER_RESERVED state. Otherwise, return an error code to the caller.
42619: ** The busy-handler is not invoked if another connection already
42620: ** holds the write-lock. If possible, the upper layer will call it.
42621: */
42622: rc = sqlite3WalBeginWriteTransaction(pPager->pWal);
42623: }else{
42624: /* Obtain a RESERVED lock on the database file. If the exFlag parameter
42625: ** is true, then immediately upgrade this to an EXCLUSIVE lock. The
42626: ** busy-handler callback can be used when upgrading to the EXCLUSIVE
42627: ** lock, but not when obtaining the RESERVED lock.
42628: */
42629: rc = pagerLockDb(pPager, RESERVED_LOCK);
42630: if( rc==SQLITE_OK && exFlag ){
42631: rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
42632: }
42633: }
42634:
42635: if( rc==SQLITE_OK ){
42636: /* Change to WRITER_LOCKED state.
42637: **
42638: ** WAL mode sets Pager.eState to PAGER_WRITER_LOCKED or CACHEMOD
42639: ** when it has an open transaction, but never to DBMOD or FINISHED.
42640: ** This is because in those states the code to roll back savepoint
42641: ** transactions may copy data from the sub-journal into the database
42642: ** file as well as into the page cache. Which would be incorrect in
42643: ** WAL mode.
42644: */
42645: pPager->eState = PAGER_WRITER_LOCKED;
42646: pPager->dbHintSize = pPager->dbSize;
42647: pPager->dbFileSize = pPager->dbSize;
42648: pPager->dbOrigSize = pPager->dbSize;
42649: pPager->journalOff = 0;
42650: }
42651:
42652: assert( rc==SQLITE_OK || pPager->eState==PAGER_READER );
42653: assert( rc!=SQLITE_OK || pPager->eState==PAGER_WRITER_LOCKED );
42654: assert( assert_pager_state(pPager) );
42655: }
42656:
42657: PAGERTRACE(("TRANSACTION %d\n", PAGERID(pPager)));
42658: return rc;
42659: }
42660:
42661: /*
42662: ** Mark a single data page as writeable. The page is written into the
42663: ** main journal or sub-journal as required. If the page is written into
42664: ** one of the journals, the corresponding bit is set in the
42665: ** Pager.pInJournal bitvec and the PagerSavepoint.pInSavepoint bitvecs
42666: ** of any open savepoints as appropriate.
42667: */
42668: static int pager_write(PgHdr *pPg){
42669: void *pData = pPg->pData;
42670: Pager *pPager = pPg->pPager;
42671: int rc = SQLITE_OK;
42672:
42673: /* This routine is not called unless a write-transaction has already
42674: ** been started. The journal file may or may not be open at this point.
42675: ** It is never called in the ERROR state.
42676: */
42677: assert( pPager->eState==PAGER_WRITER_LOCKED
42678: || pPager->eState==PAGER_WRITER_CACHEMOD
42679: || pPager->eState==PAGER_WRITER_DBMOD
42680: );
42681: assert( assert_pager_state(pPager) );
42682:
42683: /* If an error has been previously detected, report the same error
42684: ** again. This should not happen, but the check provides robustness. */
42685: if( NEVER(pPager->errCode) ) return pPager->errCode;
42686:
42687: /* Higher-level routines never call this function if database is not
42688: ** writable. But check anyway, just for robustness. */
42689: if( NEVER(pPager->readOnly) ) return SQLITE_PERM;
42690:
42691: CHECK_PAGE(pPg);
42692:
42693: /* The journal file needs to be opened. Higher level routines have already
42694: ** obtained the necessary locks to begin the write-transaction, but the
42695: ** rollback journal might not yet be open. Open it now if this is the case.
42696: **
42697: ** This is done before calling sqlite3PcacheMakeDirty() on the page.
42698: ** Otherwise, if it were done after calling sqlite3PcacheMakeDirty(), then
42699: ** an error might occur and the pager would end up in WRITER_LOCKED state
42700: ** with pages marked as dirty in the cache.
42701: */
42702: if( pPager->eState==PAGER_WRITER_LOCKED ){
42703: rc = pager_open_journal(pPager);
42704: if( rc!=SQLITE_OK ) return rc;
42705: }
42706: assert( pPager->eState>=PAGER_WRITER_CACHEMOD );
42707: assert( assert_pager_state(pPager) );
42708:
42709: /* Mark the page as dirty. If the page has already been written
42710: ** to the journal then we can return right away.
42711: */
42712: sqlite3PcacheMakeDirty(pPg);
42713: if( pageInJournal(pPg) && !subjRequiresPage(pPg) ){
42714: assert( !pagerUseWal(pPager) );
42715: }else{
42716:
42717: /* The transaction journal now exists and we have a RESERVED or an
42718: ** EXCLUSIVE lock on the main database file. Write the current page to
42719: ** the transaction journal if it is not there already.
42720: */
42721: if( !pageInJournal(pPg) && !pagerUseWal(pPager) ){
42722: assert( pagerUseWal(pPager)==0 );
42723: if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){
42724: u32 cksum;
42725: char *pData2;
42726: i64 iOff = pPager->journalOff;
42727:
42728: /* We should never write to the journal file the page that
42729: ** contains the database locks. The following assert verifies
42730: ** that we do not. */
42731: assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) );
42732:
42733: assert( pPager->journalHdr<=pPager->journalOff );
42734: CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2);
42735: cksum = pager_cksum(pPager, (u8*)pData2);
42736:
42737: /* Even if an IO or diskfull error occurs while journalling the
42738: ** page in the block above, set the need-sync flag for the page.
42739: ** Otherwise, when the transaction is rolled back, the logic in
42740: ** playback_one_page() will think that the page needs to be restored
42741: ** in the database file. And if an IO error occurs while doing so,
42742: ** then corruption may follow.
42743: */
42744: pPg->flags |= PGHDR_NEED_SYNC;
42745:
42746: rc = write32bits(pPager->jfd, iOff, pPg->pgno);
42747: if( rc!=SQLITE_OK ) return rc;
42748: rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4);
42749: if( rc!=SQLITE_OK ) return rc;
42750: rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum);
42751: if( rc!=SQLITE_OK ) return rc;
42752:
42753: IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno,
42754: pPager->journalOff, pPager->pageSize));
42755: PAGER_INCR(sqlite3_pager_writej_count);
42756: PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n",
42757: PAGERID(pPager), pPg->pgno,
42758: ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg)));
42759:
42760: pPager->journalOff += 8 + pPager->pageSize;
42761: pPager->nRec++;
42762: assert( pPager->pInJournal!=0 );
42763: rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno);
42764: testcase( rc==SQLITE_NOMEM );
42765: assert( rc==SQLITE_OK || rc==SQLITE_NOMEM );
42766: rc |= addToSavepointBitvecs(pPager, pPg->pgno);
42767: if( rc!=SQLITE_OK ){
42768: assert( rc==SQLITE_NOMEM );
42769: return rc;
42770: }
42771: }else{
42772: if( pPager->eState!=PAGER_WRITER_DBMOD ){
42773: pPg->flags |= PGHDR_NEED_SYNC;
42774: }
42775: PAGERTRACE(("APPEND %d page %d needSync=%d\n",
42776: PAGERID(pPager), pPg->pgno,
42777: ((pPg->flags&PGHDR_NEED_SYNC)?1:0)));
42778: }
42779: }
42780:
42781: /* If the statement journal is open and the page is not in it,
42782: ** then write the current page to the statement journal. Note that
42783: ** the statement journal format differs from the standard journal format
42784: ** in that it omits the checksums and the header.
42785: */
42786: if( subjRequiresPage(pPg) ){
42787: rc = subjournalPage(pPg);
42788: }
42789: }
42790:
42791: /* Update the database size and return.
42792: */
42793: if( pPager->dbSize<pPg->pgno ){
42794: pPager->dbSize = pPg->pgno;
42795: }
42796: return rc;
42797: }
42798:
42799: /*
42800: ** Mark a data page as writeable. This routine must be called before
42801: ** making changes to a page. The caller must check the return value
42802: ** of this function and be careful not to change any page data unless
42803: ** this routine returns SQLITE_OK.
42804: **
42805: ** The difference between this function and pager_write() is that this
42806: ** function also deals with the special case where 2 or more pages
42807: ** fit on a single disk sector. In this case all co-resident pages
42808: ** must have been written to the journal file before returning.
42809: **
42810: ** If an error occurs, SQLITE_NOMEM or an IO error code is returned
42811: ** as appropriate. Otherwise, SQLITE_OK.
42812: */
42813: SQLITE_PRIVATE int sqlite3PagerWrite(DbPage *pDbPage){
42814: int rc = SQLITE_OK;
42815:
42816: PgHdr *pPg = pDbPage;
42817: Pager *pPager = pPg->pPager;
42818: Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize);
42819:
42820: assert( pPager->eState>=PAGER_WRITER_LOCKED );
42821: assert( pPager->eState!=PAGER_ERROR );
42822: assert( assert_pager_state(pPager) );
42823:
42824: if( nPagePerSector>1 ){
42825: Pgno nPageCount; /* Total number of pages in database file */
42826: Pgno pg1; /* First page of the sector pPg is located on. */
42827: int nPage = 0; /* Number of pages starting at pg1 to journal */
42828: int ii; /* Loop counter */
42829: int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */
42830:
42831: /* Set the doNotSyncSpill flag to 1. This is because we cannot allow
42832: ** a journal header to be written between the pages journaled by
42833: ** this function.
42834: */
42835: assert( !MEMDB );
42836: assert( pPager->doNotSyncSpill==0 );
42837: pPager->doNotSyncSpill++;
42838:
42839: /* This trick assumes that both the page-size and sector-size are
42840: ** an integer power of 2. It sets variable pg1 to the identifier
42841: ** of the first page of the sector pPg is located on.
42842: */
42843: pg1 = ((pPg->pgno-1) & ~(nPagePerSector-1)) + 1;
42844:
42845: nPageCount = pPager->dbSize;
42846: if( pPg->pgno>nPageCount ){
42847: nPage = (pPg->pgno - pg1)+1;
42848: }else if( (pg1+nPagePerSector-1)>nPageCount ){
42849: nPage = nPageCount+1-pg1;
42850: }else{
42851: nPage = nPagePerSector;
42852: }
42853: assert(nPage>0);
42854: assert(pg1<=pPg->pgno);
42855: assert((pg1+nPage)>pPg->pgno);
42856:
42857: for(ii=0; ii<nPage && rc==SQLITE_OK; ii++){
42858: Pgno pg = pg1+ii;
42859: PgHdr *pPage;
42860: if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){
42861: if( pg!=PAGER_MJ_PGNO(pPager) ){
42862: rc = sqlite3PagerGet(pPager, pg, &pPage);
42863: if( rc==SQLITE_OK ){
42864: rc = pager_write(pPage);
42865: if( pPage->flags&PGHDR_NEED_SYNC ){
42866: needSync = 1;
42867: }
42868: sqlite3PagerUnref(pPage);
42869: }
42870: }
42871: }else if( (pPage = pager_lookup(pPager, pg))!=0 ){
42872: if( pPage->flags&PGHDR_NEED_SYNC ){
42873: needSync = 1;
42874: }
42875: sqlite3PagerUnref(pPage);
42876: }
42877: }
42878:
42879: /* If the PGHDR_NEED_SYNC flag is set for any of the nPage pages
42880: ** starting at pg1, then it needs to be set for all of them. Because
42881: ** writing to any of these nPage pages may damage the others, the
42882: ** journal file must contain sync()ed copies of all of them
42883: ** before any of them can be written out to the database file.
42884: */
42885: if( rc==SQLITE_OK && needSync ){
42886: assert( !MEMDB );
42887: for(ii=0; ii<nPage; ii++){
42888: PgHdr *pPage = pager_lookup(pPager, pg1+ii);
42889: if( pPage ){
42890: pPage->flags |= PGHDR_NEED_SYNC;
42891: sqlite3PagerUnref(pPage);
42892: }
42893: }
42894: }
42895:
42896: assert( pPager->doNotSyncSpill==1 );
42897: pPager->doNotSyncSpill--;
42898: }else{
42899: rc = pager_write(pDbPage);
42900: }
42901: return rc;
42902: }
42903:
42904: /*
42905: ** Return TRUE if the page given in the argument was previously passed
42906: ** to sqlite3PagerWrite(). In other words, return TRUE if it is ok
42907: ** to change the content of the page.
42908: */
42909: #ifndef NDEBUG
42910: SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){
42911: return pPg->flags&PGHDR_DIRTY;
42912: }
42913: #endif
42914:
42915: /*
42916: ** A call to this routine tells the pager that it is not necessary to
42917: ** write the information on page pPg back to the disk, even though
42918: ** that page might be marked as dirty. This happens, for example, when
42919: ** the page has been added as a leaf of the freelist and so its
42920: ** content no longer matters.
42921: **
42922: ** The overlying software layer calls this routine when all of the data
42923: ** on the given page is unused. The pager marks the page as clean so
42924: ** that it does not get written to disk.
42925: **
42926: ** Tests show that this optimization can quadruple the speed of large
42927: ** DELETE operations.
42928: */
42929: SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){
42930: Pager *pPager = pPg->pPager;
42931: if( (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){
42932: PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager)));
42933: IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno))
42934: pPg->flags |= PGHDR_DONT_WRITE;
42935: pager_set_pagehash(pPg);
42936: }
42937: }
42938:
42939: /*
42940: ** This routine is called to increment the value of the database file
42941: ** change-counter, stored as a 4-byte big-endian integer starting at
42942: ** byte offset 24 of the pager file. The secondary change counter at
42943: ** 92 is also updated, as is the SQLite version number at offset 96.
42944: **
42945: ** But this only happens if the pPager->changeCountDone flag is false.
42946: ** To avoid excess churning of page 1, the update only happens once.
42947: ** See also the pager_write_changecounter() routine that does an
42948: ** unconditional update of the change counters.
42949: **
42950: ** If the isDirectMode flag is zero, then this is done by calling
42951: ** sqlite3PagerWrite() on page 1, then modifying the contents of the
42952: ** page data. In this case the file will be updated when the current
42953: ** transaction is committed.
42954: **
42955: ** The isDirectMode flag may only be non-zero if the library was compiled
42956: ** with the SQLITE_ENABLE_ATOMIC_WRITE macro defined. In this case,
42957: ** if isDirect is non-zero, then the database file is updated directly
42958: ** by writing an updated version of page 1 using a call to the
42959: ** sqlite3OsWrite() function.
42960: */
42961: static int pager_incr_changecounter(Pager *pPager, int isDirectMode){
42962: int rc = SQLITE_OK;
42963:
42964: assert( pPager->eState==PAGER_WRITER_CACHEMOD
42965: || pPager->eState==PAGER_WRITER_DBMOD
42966: );
42967: assert( assert_pager_state(pPager) );
42968:
42969: /* Declare and initialize constant integer 'isDirect'. If the
42970: ** atomic-write optimization is enabled in this build, then isDirect
42971: ** is initialized to the value passed as the isDirectMode parameter
42972: ** to this function. Otherwise, it is always set to zero.
42973: **
42974: ** The idea is that if the atomic-write optimization is not
42975: ** enabled at compile time, the compiler can omit the tests of
42976: ** 'isDirect' below, as well as the block enclosed in the
42977: ** "if( isDirect )" condition.
42978: */
42979: #ifndef SQLITE_ENABLE_ATOMIC_WRITE
42980: # define DIRECT_MODE 0
42981: assert( isDirectMode==0 );
42982: UNUSED_PARAMETER(isDirectMode);
42983: #else
42984: # define DIRECT_MODE isDirectMode
42985: #endif
42986:
1.2.2.1 ! misho 42987: if( !pPager->changeCountDone && ALWAYS(pPager->dbSize>0) ){
1.2 misho 42988: PgHdr *pPgHdr; /* Reference to page 1 */
42989:
42990: assert( !pPager->tempFile && isOpen(pPager->fd) );
42991:
42992: /* Open page 1 of the file for writing. */
42993: rc = sqlite3PagerGet(pPager, 1, &pPgHdr);
42994: assert( pPgHdr==0 || rc==SQLITE_OK );
42995:
42996: /* If page one was fetched successfully, and this function is not
42997: ** operating in direct-mode, make page 1 writable. When not in
42998: ** direct mode, page 1 is always held in cache and hence the PagerGet()
42999: ** above is always successful - hence the ALWAYS on rc==SQLITE_OK.
43000: */
43001: if( !DIRECT_MODE && ALWAYS(rc==SQLITE_OK) ){
43002: rc = sqlite3PagerWrite(pPgHdr);
43003: }
43004:
43005: if( rc==SQLITE_OK ){
43006: /* Actually do the update of the change counter */
43007: pager_write_changecounter(pPgHdr);
43008:
43009: /* If running in direct mode, write the contents of page 1 to the file. */
43010: if( DIRECT_MODE ){
43011: const void *zBuf;
43012: assert( pPager->dbFileSize>0 );
43013: CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf);
43014: if( rc==SQLITE_OK ){
43015: rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0);
1.2.2.1 ! misho 43016: pPager->aStat[PAGER_STAT_WRITE]++;
1.2 misho 43017: }
43018: if( rc==SQLITE_OK ){
43019: pPager->changeCountDone = 1;
43020: }
43021: }else{
43022: pPager->changeCountDone = 1;
43023: }
43024: }
43025:
43026: /* Release the page reference. */
43027: sqlite3PagerUnref(pPgHdr);
43028: }
43029: return rc;
43030: }
43031:
43032: /*
43033: ** Sync the database file to disk. This is a no-op for in-memory databases
43034: ** or pages with the Pager.noSync flag set.
43035: **
43036: ** If successful, or if called on a pager for which it is a no-op, this
43037: ** function returns SQLITE_OK. Otherwise, an IO error code is returned.
43038: */
43039: SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager){
43040: int rc = SQLITE_OK;
43041: if( !pPager->noSync ){
43042: assert( !MEMDB );
43043: rc = sqlite3OsSync(pPager->fd, pPager->syncFlags);
43044: }else if( isOpen(pPager->fd) ){
43045: assert( !MEMDB );
43046: rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0);
43047: if( rc==SQLITE_NOTFOUND ){
43048: rc = SQLITE_OK;
43049: }
43050: }
43051: return rc;
43052: }
43053:
43054: /*
43055: ** This function may only be called while a write-transaction is active in
43056: ** rollback. If the connection is in WAL mode, this call is a no-op.
43057: ** Otherwise, if the connection does not already have an EXCLUSIVE lock on
43058: ** the database file, an attempt is made to obtain one.
43059: **
43060: ** If the EXCLUSIVE lock is already held or the attempt to obtain it is
43061: ** successful, or the connection is in WAL mode, SQLITE_OK is returned.
43062: ** Otherwise, either SQLITE_BUSY or an SQLITE_IOERR_XXX error code is
43063: ** returned.
43064: */
43065: SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){
43066: int rc = SQLITE_OK;
43067: assert( pPager->eState==PAGER_WRITER_CACHEMOD
43068: || pPager->eState==PAGER_WRITER_DBMOD
43069: || pPager->eState==PAGER_WRITER_LOCKED
43070: );
43071: assert( assert_pager_state(pPager) );
43072: if( 0==pagerUseWal(pPager) ){
43073: rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK);
43074: }
43075: return rc;
43076: }
43077:
43078: /*
43079: ** Sync the database file for the pager pPager. zMaster points to the name
43080: ** of a master journal file that should be written into the individual
43081: ** journal file. zMaster may be NULL, which is interpreted as no master
43082: ** journal (a single database transaction).
43083: **
43084: ** This routine ensures that:
43085: **
43086: ** * The database file change-counter is updated,
43087: ** * the journal is synced (unless the atomic-write optimization is used),
43088: ** * all dirty pages are written to the database file,
43089: ** * the database file is truncated (if required), and
43090: ** * the database file synced.
43091: **
43092: ** The only thing that remains to commit the transaction is to finalize
43093: ** (delete, truncate or zero the first part of) the journal file (or
43094: ** delete the master journal file if specified).
43095: **
43096: ** Note that if zMaster==NULL, this does not overwrite a previous value
43097: ** passed to an sqlite3PagerCommitPhaseOne() call.
43098: **
43099: ** If the final parameter - noSync - is true, then the database file itself
43100: ** is not synced. The caller must call sqlite3PagerSync() directly to
43101: ** sync the database file before calling CommitPhaseTwo() to delete the
43102: ** journal file in this case.
43103: */
43104: SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(
43105: Pager *pPager, /* Pager object */
43106: const char *zMaster, /* If not NULL, the master journal name */
43107: int noSync /* True to omit the xSync on the db file */
43108: ){
43109: int rc = SQLITE_OK; /* Return code */
43110:
43111: assert( pPager->eState==PAGER_WRITER_LOCKED
43112: || pPager->eState==PAGER_WRITER_CACHEMOD
43113: || pPager->eState==PAGER_WRITER_DBMOD
43114: || pPager->eState==PAGER_ERROR
43115: );
43116: assert( assert_pager_state(pPager) );
43117:
43118: /* If a prior error occurred, report that error again. */
43119: if( NEVER(pPager->errCode) ) return pPager->errCode;
43120:
43121: PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n",
43122: pPager->zFilename, zMaster, pPager->dbSize));
43123:
43124: /* If no database changes have been made, return early. */
43125: if( pPager->eState<PAGER_WRITER_CACHEMOD ) return SQLITE_OK;
43126:
43127: if( MEMDB ){
43128: /* If this is an in-memory db, or no pages have been written to, or this
43129: ** function has already been called, it is mostly a no-op. However, any
43130: ** backup in progress needs to be restarted.
43131: */
43132: sqlite3BackupRestart(pPager->pBackup);
43133: }else{
43134: if( pagerUseWal(pPager) ){
43135: PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache);
43136: PgHdr *pPageOne = 0;
43137: if( pList==0 ){
43138: /* Must have at least one page for the WAL commit flag.
43139: ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */
43140: rc = sqlite3PagerGet(pPager, 1, &pPageOne);
43141: pList = pPageOne;
43142: pList->pDirty = 0;
43143: }
43144: assert( rc==SQLITE_OK );
43145: if( ALWAYS(pList) ){
43146: rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1);
43147: }
43148: sqlite3PagerUnref(pPageOne);
43149: if( rc==SQLITE_OK ){
43150: sqlite3PcacheCleanAll(pPager->pPCache);
43151: }
43152: }else{
43153: /* The following block updates the change-counter. Exactly how it
43154: ** does this depends on whether or not the atomic-update optimization
43155: ** was enabled at compile time, and if this transaction meets the
43156: ** runtime criteria to use the operation:
43157: **
43158: ** * The file-system supports the atomic-write property for
43159: ** blocks of size page-size, and
43160: ** * This commit is not part of a multi-file transaction, and
43161: ** * Exactly one page has been modified and store in the journal file.
43162: **
43163: ** If the optimization was not enabled at compile time, then the
43164: ** pager_incr_changecounter() function is called to update the change
43165: ** counter in 'indirect-mode'. If the optimization is compiled in but
43166: ** is not applicable to this transaction, call sqlite3JournalCreate()
43167: ** to make sure the journal file has actually been created, then call
43168: ** pager_incr_changecounter() to update the change-counter in indirect
43169: ** mode.
43170: **
43171: ** Otherwise, if the optimization is both enabled and applicable,
43172: ** then call pager_incr_changecounter() to update the change-counter
43173: ** in 'direct' mode. In this case the journal file will never be
43174: ** created for this transaction.
43175: */
43176: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
43177: PgHdr *pPg;
43178: assert( isOpen(pPager->jfd)
43179: || pPager->journalMode==PAGER_JOURNALMODE_OFF
43180: || pPager->journalMode==PAGER_JOURNALMODE_WAL
43181: );
43182: if( !zMaster && isOpen(pPager->jfd)
43183: && pPager->journalOff==jrnlBufferSize(pPager)
43184: && pPager->dbSize>=pPager->dbOrigSize
43185: && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty)
43186: ){
43187: /* Update the db file change counter via the direct-write method. The
43188: ** following call will modify the in-memory representation of page 1
43189: ** to include the updated change counter and then write page 1
43190: ** directly to the database file. Because of the atomic-write
43191: ** property of the host file-system, this is safe.
43192: */
43193: rc = pager_incr_changecounter(pPager, 1);
43194: }else{
43195: rc = sqlite3JournalCreate(pPager->jfd);
43196: if( rc==SQLITE_OK ){
43197: rc = pager_incr_changecounter(pPager, 0);
43198: }
43199: }
43200: #else
43201: rc = pager_incr_changecounter(pPager, 0);
43202: #endif
43203: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43204:
43205: /* If this transaction has made the database smaller, then all pages
43206: ** being discarded by the truncation must be written to the journal
1.2.2.1 ! misho 43207: ** file.
1.2 misho 43208: **
43209: ** Before reading the pages with page numbers larger than the
43210: ** current value of Pager.dbSize, set dbSize back to the value
43211: ** that it took at the start of the transaction. Otherwise, the
43212: ** calls to sqlite3PagerGet() return zeroed pages instead of
43213: ** reading data from the database file.
43214: */
43215: if( pPager->dbSize<pPager->dbOrigSize
43216: && pPager->journalMode!=PAGER_JOURNALMODE_OFF
43217: ){
43218: Pgno i; /* Iterator variable */
43219: const Pgno iSkip = PAGER_MJ_PGNO(pPager); /* Pending lock page */
43220: const Pgno dbSize = pPager->dbSize; /* Database image size */
43221: pPager->dbSize = pPager->dbOrigSize;
43222: for( i=dbSize+1; i<=pPager->dbOrigSize; i++ ){
43223: if( !sqlite3BitvecTest(pPager->pInJournal, i) && i!=iSkip ){
43224: PgHdr *pPage; /* Page to journal */
43225: rc = sqlite3PagerGet(pPager, i, &pPage);
43226: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43227: rc = sqlite3PagerWrite(pPage);
43228: sqlite3PagerUnref(pPage);
43229: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43230: }
43231: }
43232: pPager->dbSize = dbSize;
43233: }
43234:
43235: /* Write the master journal name into the journal file. If a master
43236: ** journal file name has already been written to the journal file,
43237: ** or if zMaster is NULL (no master journal), then this call is a no-op.
43238: */
43239: rc = writeMasterJournal(pPager, zMaster);
43240: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43241:
43242: /* Sync the journal file and write all dirty pages to the database.
43243: ** If the atomic-update optimization is being used, this sync will not
43244: ** create the journal file or perform any real IO.
43245: **
43246: ** Because the change-counter page was just modified, unless the
43247: ** atomic-update optimization is used it is almost certain that the
43248: ** journal requires a sync here. However, in locking_mode=exclusive
43249: ** on a system under memory pressure it is just possible that this is
43250: ** not the case. In this case it is likely enough that the redundant
43251: ** xSync() call will be changed to a no-op by the OS anyhow.
43252: */
43253: rc = syncJournal(pPager, 0);
43254: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43255:
43256: rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache));
43257: if( rc!=SQLITE_OK ){
43258: assert( rc!=SQLITE_IOERR_BLOCKED );
43259: goto commit_phase_one_exit;
43260: }
43261: sqlite3PcacheCleanAll(pPager->pPCache);
43262:
43263: /* If the file on disk is not the same size as the database image,
43264: ** then use pager_truncate to grow or shrink the file here.
43265: */
43266: if( pPager->dbSize!=pPager->dbFileSize ){
43267: Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager));
43268: assert( pPager->eState==PAGER_WRITER_DBMOD );
43269: rc = pager_truncate(pPager, nNew);
43270: if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
43271: }
43272:
43273: /* Finally, sync the database file. */
43274: if( !noSync ){
43275: rc = sqlite3PagerSync(pPager);
43276: }
43277: IOTRACE(("DBSYNC %p\n", pPager))
43278: }
43279: }
43280:
43281: commit_phase_one_exit:
43282: if( rc==SQLITE_OK && !pagerUseWal(pPager) ){
43283: pPager->eState = PAGER_WRITER_FINISHED;
43284: }
43285: return rc;
43286: }
43287:
43288:
43289: /*
43290: ** When this function is called, the database file has been completely
43291: ** updated to reflect the changes made by the current transaction and
43292: ** synced to disk. The journal file still exists in the file-system
43293: ** though, and if a failure occurs at this point it will eventually
43294: ** be used as a hot-journal and the current transaction rolled back.
43295: **
43296: ** This function finalizes the journal file, either by deleting,
43297: ** truncating or partially zeroing it, so that it cannot be used
43298: ** for hot-journal rollback. Once this is done the transaction is
43299: ** irrevocably committed.
43300: **
43301: ** If an error occurs, an IO error code is returned and the pager
43302: ** moves into the error state. Otherwise, SQLITE_OK is returned.
43303: */
43304: SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager *pPager){
43305: int rc = SQLITE_OK; /* Return code */
43306:
43307: /* This routine should not be called if a prior error has occurred.
43308: ** But if (due to a coding error elsewhere in the system) it does get
43309: ** called, just return the same error code without doing anything. */
43310: if( NEVER(pPager->errCode) ) return pPager->errCode;
43311:
43312: assert( pPager->eState==PAGER_WRITER_LOCKED
43313: || pPager->eState==PAGER_WRITER_FINISHED
43314: || (pagerUseWal(pPager) && pPager->eState==PAGER_WRITER_CACHEMOD)
43315: );
43316: assert( assert_pager_state(pPager) );
43317:
43318: /* An optimization. If the database was not actually modified during
43319: ** this transaction, the pager is running in exclusive-mode and is
43320: ** using persistent journals, then this function is a no-op.
43321: **
43322: ** The start of the journal file currently contains a single journal
43323: ** header with the nRec field set to 0. If such a journal is used as
43324: ** a hot-journal during hot-journal rollback, 0 changes will be made
43325: ** to the database file. So there is no need to zero the journal
43326: ** header. Since the pager is in exclusive mode, there is no need
43327: ** to drop any locks either.
43328: */
43329: if( pPager->eState==PAGER_WRITER_LOCKED
43330: && pPager->exclusiveMode
43331: && pPager->journalMode==PAGER_JOURNALMODE_PERSIST
43332: ){
43333: assert( pPager->journalOff==JOURNAL_HDR_SZ(pPager) || !pPager->journalOff );
43334: pPager->eState = PAGER_READER;
43335: return SQLITE_OK;
43336: }
43337:
43338: PAGERTRACE(("COMMIT %d\n", PAGERID(pPager)));
43339: rc = pager_end_transaction(pPager, pPager->setMaster);
43340: return pager_error(pPager, rc);
43341: }
43342:
43343: /*
43344: ** If a write transaction is open, then all changes made within the
43345: ** transaction are reverted and the current write-transaction is closed.
43346: ** The pager falls back to PAGER_READER state if successful, or PAGER_ERROR
43347: ** state if an error occurs.
43348: **
43349: ** If the pager is already in PAGER_ERROR state when this function is called,
43350: ** it returns Pager.errCode immediately. No work is performed in this case.
43351: **
43352: ** Otherwise, in rollback mode, this function performs two functions:
43353: **
43354: ** 1) It rolls back the journal file, restoring all database file and
43355: ** in-memory cache pages to the state they were in when the transaction
43356: ** was opened, and
43357: **
43358: ** 2) It finalizes the journal file, so that it is not used for hot
43359: ** rollback at any point in the future.
43360: **
43361: ** Finalization of the journal file (task 2) is only performed if the
43362: ** rollback is successful.
43363: **
43364: ** In WAL mode, all cache-entries containing data modified within the
43365: ** current transaction are either expelled from the cache or reverted to
43366: ** their pre-transaction state by re-reading data from the database or
43367: ** WAL files. The WAL transaction is then closed.
43368: */
43369: SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){
43370: int rc = SQLITE_OK; /* Return code */
43371: PAGERTRACE(("ROLLBACK %d\n", PAGERID(pPager)));
43372:
43373: /* PagerRollback() is a no-op if called in READER or OPEN state. If
43374: ** the pager is already in the ERROR state, the rollback is not
43375: ** attempted here. Instead, the error code is returned to the caller.
43376: */
43377: assert( assert_pager_state(pPager) );
43378: if( pPager->eState==PAGER_ERROR ) return pPager->errCode;
43379: if( pPager->eState<=PAGER_READER ) return SQLITE_OK;
43380:
43381: if( pagerUseWal(pPager) ){
43382: int rc2;
43383: rc = sqlite3PagerSavepoint(pPager, SAVEPOINT_ROLLBACK, -1);
43384: rc2 = pager_end_transaction(pPager, pPager->setMaster);
43385: if( rc==SQLITE_OK ) rc = rc2;
43386: }else if( !isOpen(pPager->jfd) || pPager->eState==PAGER_WRITER_LOCKED ){
43387: int eState = pPager->eState;
43388: rc = pager_end_transaction(pPager, 0);
43389: if( !MEMDB && eState>PAGER_WRITER_LOCKED ){
43390: /* This can happen using journal_mode=off. Move the pager to the error
43391: ** state to indicate that the contents of the cache may not be trusted.
43392: ** Any active readers will get SQLITE_ABORT.
43393: */
43394: pPager->errCode = SQLITE_ABORT;
43395: pPager->eState = PAGER_ERROR;
43396: return rc;
43397: }
43398: }else{
43399: rc = pager_playback(pPager, 0);
43400: }
43401:
43402: assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK );
43403: assert( rc==SQLITE_OK || rc==SQLITE_FULL
43404: || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR );
43405:
43406: /* If an error occurs during a ROLLBACK, we can no longer trust the pager
43407: ** cache. So call pager_error() on the way out to make any error persistent.
43408: */
43409: return pager_error(pPager, rc);
43410: }
43411:
43412: /*
43413: ** Return TRUE if the database file is opened read-only. Return FALSE
43414: ** if the database is (in theory) writable.
43415: */
43416: SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){
43417: return pPager->readOnly;
43418: }
43419:
43420: /*
43421: ** Return the number of references to the pager.
43422: */
43423: SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){
43424: return sqlite3PcacheRefCount(pPager->pPCache);
43425: }
43426:
43427: /*
43428: ** Return the approximate number of bytes of memory currently
43429: ** used by the pager and its associated cache.
43430: */
43431: SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager *pPager){
43432: int perPageSize = pPager->pageSize + pPager->nExtra + sizeof(PgHdr)
43433: + 5*sizeof(void*);
43434: return perPageSize*sqlite3PcachePagecount(pPager->pPCache)
43435: + sqlite3MallocSize(pPager)
43436: + pPager->pageSize;
43437: }
43438:
43439: /*
43440: ** Return the number of references to the specified page.
43441: */
43442: SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage *pPage){
43443: return sqlite3PcachePageRefcount(pPage);
43444: }
43445:
43446: #ifdef SQLITE_TEST
43447: /*
43448: ** This routine is used for testing and analysis only.
43449: */
43450: SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){
43451: static int a[11];
43452: a[0] = sqlite3PcacheRefCount(pPager->pPCache);
43453: a[1] = sqlite3PcachePagecount(pPager->pPCache);
43454: a[2] = sqlite3PcacheGetCachesize(pPager->pPCache);
43455: a[3] = pPager->eState==PAGER_OPEN ? -1 : (int) pPager->dbSize;
43456: a[4] = pPager->eState;
43457: a[5] = pPager->errCode;
1.2.2.1 ! misho 43458: a[6] = pPager->aStat[PAGER_STAT_HIT];
! 43459: a[7] = pPager->aStat[PAGER_STAT_MISS];
1.2 misho 43460: a[8] = 0; /* Used to be pPager->nOvfl */
43461: a[9] = pPager->nRead;
1.2.2.1 ! misho 43462: a[10] = pPager->aStat[PAGER_STAT_WRITE];
1.2 misho 43463: return a;
43464: }
43465: #endif
43466:
43467: /*
43468: ** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or
43469: ** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the
43470: ** current cache hit or miss count, according to the value of eStat. If the
43471: ** reset parameter is non-zero, the cache hit or miss count is zeroed before
43472: ** returning.
43473: */
43474: SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, int *pnVal){
43475:
43476: assert( eStat==SQLITE_DBSTATUS_CACHE_HIT
43477: || eStat==SQLITE_DBSTATUS_CACHE_MISS
1.2.2.1 ! misho 43478: || eStat==SQLITE_DBSTATUS_CACHE_WRITE
1.2 misho 43479: );
43480:
1.2.2.1 ! misho 43481: assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS );
! 43482: assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE );
! 43483: assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 );
! 43484:
! 43485: *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT];
1.2 misho 43486: if( reset ){
1.2.2.1 ! misho 43487: pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0;
1.2 misho 43488: }
43489: }
43490:
43491: /*
43492: ** Return true if this is an in-memory pager.
43493: */
43494: SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){
43495: return MEMDB;
43496: }
43497:
43498: /*
43499: ** Check that there are at least nSavepoint savepoints open. If there are
43500: ** currently less than nSavepoints open, then open one or more savepoints
43501: ** to make up the difference. If the number of savepoints is already
43502: ** equal to nSavepoint, then this function is a no-op.
43503: **
43504: ** If a memory allocation fails, SQLITE_NOMEM is returned. If an error
43505: ** occurs while opening the sub-journal file, then an IO error code is
43506: ** returned. Otherwise, SQLITE_OK.
43507: */
43508: SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){
43509: int rc = SQLITE_OK; /* Return code */
43510: int nCurrent = pPager->nSavepoint; /* Current number of savepoints */
43511:
43512: assert( pPager->eState>=PAGER_WRITER_LOCKED );
43513: assert( assert_pager_state(pPager) );
43514:
43515: if( nSavepoint>nCurrent && pPager->useJournal ){
43516: int ii; /* Iterator variable */
43517: PagerSavepoint *aNew; /* New Pager.aSavepoint array */
43518:
43519: /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM
43520: ** if the allocation fails. Otherwise, zero the new portion in case a
43521: ** malloc failure occurs while populating it in the for(...) loop below.
43522: */
43523: aNew = (PagerSavepoint *)sqlite3Realloc(
43524: pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint
43525: );
43526: if( !aNew ){
43527: return SQLITE_NOMEM;
43528: }
43529: memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint));
43530: pPager->aSavepoint = aNew;
43531:
43532: /* Populate the PagerSavepoint structures just allocated. */
43533: for(ii=nCurrent; ii<nSavepoint; ii++){
43534: aNew[ii].nOrig = pPager->dbSize;
43535: if( isOpen(pPager->jfd) && pPager->journalOff>0 ){
43536: aNew[ii].iOffset = pPager->journalOff;
43537: }else{
43538: aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager);
43539: }
43540: aNew[ii].iSubRec = pPager->nSubRec;
43541: aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize);
43542: if( !aNew[ii].pInSavepoint ){
43543: return SQLITE_NOMEM;
43544: }
43545: if( pagerUseWal(pPager) ){
43546: sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData);
43547: }
43548: pPager->nSavepoint = ii+1;
43549: }
43550: assert( pPager->nSavepoint==nSavepoint );
43551: assertTruncateConstraint(pPager);
43552: }
43553:
43554: return rc;
43555: }
43556:
43557: /*
43558: ** This function is called to rollback or release (commit) a savepoint.
43559: ** The savepoint to release or rollback need not be the most recently
43560: ** created savepoint.
43561: **
43562: ** Parameter op is always either SAVEPOINT_ROLLBACK or SAVEPOINT_RELEASE.
43563: ** If it is SAVEPOINT_RELEASE, then release and destroy the savepoint with
43564: ** index iSavepoint. If it is SAVEPOINT_ROLLBACK, then rollback all changes
43565: ** that have occurred since the specified savepoint was created.
43566: **
43567: ** The savepoint to rollback or release is identified by parameter
43568: ** iSavepoint. A value of 0 means to operate on the outermost savepoint
43569: ** (the first created). A value of (Pager.nSavepoint-1) means operate
43570: ** on the most recently created savepoint. If iSavepoint is greater than
43571: ** (Pager.nSavepoint-1), then this function is a no-op.
43572: **
43573: ** If a negative value is passed to this function, then the current
43574: ** transaction is rolled back. This is different to calling
43575: ** sqlite3PagerRollback() because this function does not terminate
43576: ** the transaction or unlock the database, it just restores the
43577: ** contents of the database to its original state.
43578: **
43579: ** In any case, all savepoints with an index greater than iSavepoint
43580: ** are destroyed. If this is a release operation (op==SAVEPOINT_RELEASE),
43581: ** then savepoint iSavepoint is also destroyed.
43582: **
43583: ** This function may return SQLITE_NOMEM if a memory allocation fails,
43584: ** or an IO error code if an IO error occurs while rolling back a
43585: ** savepoint. If no errors occur, SQLITE_OK is returned.
43586: */
43587: SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){
43588: int rc = pPager->errCode; /* Return code */
43589:
43590: assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
43591: assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK );
43592:
43593: if( rc==SQLITE_OK && iSavepoint<pPager->nSavepoint ){
43594: int ii; /* Iterator variable */
43595: int nNew; /* Number of remaining savepoints after this op. */
43596:
43597: /* Figure out how many savepoints will still be active after this
43598: ** operation. Store this value in nNew. Then free resources associated
43599: ** with any savepoints that are destroyed by this operation.
43600: */
43601: nNew = iSavepoint + (( op==SAVEPOINT_RELEASE ) ? 0 : 1);
43602: for(ii=nNew; ii<pPager->nSavepoint; ii++){
43603: sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint);
43604: }
43605: pPager->nSavepoint = nNew;
43606:
43607: /* If this is a release of the outermost savepoint, truncate
43608: ** the sub-journal to zero bytes in size. */
43609: if( op==SAVEPOINT_RELEASE ){
43610: if( nNew==0 && isOpen(pPager->sjfd) ){
43611: /* Only truncate if it is an in-memory sub-journal. */
43612: if( sqlite3IsMemJournal(pPager->sjfd) ){
43613: rc = sqlite3OsTruncate(pPager->sjfd, 0);
43614: assert( rc==SQLITE_OK );
43615: }
43616: pPager->nSubRec = 0;
43617: }
43618: }
43619: /* Else this is a rollback operation, playback the specified savepoint.
43620: ** If this is a temp-file, it is possible that the journal file has
43621: ** not yet been opened. In this case there have been no changes to
43622: ** the database file, so the playback operation can be skipped.
43623: */
43624: else if( pagerUseWal(pPager) || isOpen(pPager->jfd) ){
43625: PagerSavepoint *pSavepoint = (nNew==0)?0:&pPager->aSavepoint[nNew-1];
43626: rc = pagerPlaybackSavepoint(pPager, pSavepoint);
43627: assert(rc!=SQLITE_DONE);
43628: }
43629: }
43630:
43631: return rc;
43632: }
43633:
43634: /*
43635: ** Return the full pathname of the database file.
1.2.2.1 ! misho 43636: **
! 43637: ** Except, if the pager is in-memory only, then return an empty string if
! 43638: ** nullIfMemDb is true. This routine is called with nullIfMemDb==1 when
! 43639: ** used to report the filename to the user, for compatibility with legacy
! 43640: ** behavior. But when the Btree needs to know the filename for matching to
! 43641: ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can
! 43642: ** participate in shared-cache.
1.2 misho 43643: */
1.2.2.1 ! misho 43644: SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){
! 43645: return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename;
1.2 misho 43646: }
43647:
43648: /*
43649: ** Return the VFS structure for the pager.
43650: */
43651: SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){
43652: return pPager->pVfs;
43653: }
43654:
43655: /*
43656: ** Return the file handle for the database file associated
43657: ** with the pager. This might return NULL if the file has
43658: ** not yet been opened.
43659: */
43660: SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){
43661: return pPager->fd;
43662: }
43663:
43664: /*
43665: ** Return the full pathname of the journal file.
43666: */
43667: SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){
43668: return pPager->zJournal;
43669: }
43670:
43671: /*
43672: ** Return true if fsync() calls are disabled for this pager. Return FALSE
43673: ** if fsync()s are executed normally.
43674: */
43675: SQLITE_PRIVATE int sqlite3PagerNosync(Pager *pPager){
43676: return pPager->noSync;
43677: }
43678:
43679: #ifdef SQLITE_HAS_CODEC
43680: /*
43681: ** Set or retrieve the codec for this pager
43682: */
43683: SQLITE_PRIVATE void sqlite3PagerSetCodec(
43684: Pager *pPager,
43685: void *(*xCodec)(void*,void*,Pgno,int),
43686: void (*xCodecSizeChng)(void*,int,int),
43687: void (*xCodecFree)(void*),
43688: void *pCodec
43689: ){
43690: if( pPager->xCodecFree ) pPager->xCodecFree(pPager->pCodec);
43691: pPager->xCodec = pPager->memDb ? 0 : xCodec;
43692: pPager->xCodecSizeChng = xCodecSizeChng;
43693: pPager->xCodecFree = xCodecFree;
43694: pPager->pCodec = pCodec;
43695: pagerReportSize(pPager);
43696: }
43697: SQLITE_PRIVATE void *sqlite3PagerGetCodec(Pager *pPager){
43698: return pPager->pCodec;
43699: }
43700: #endif
43701:
43702: #ifndef SQLITE_OMIT_AUTOVACUUM
43703: /*
43704: ** Move the page pPg to location pgno in the file.
43705: **
43706: ** There must be no references to the page previously located at
43707: ** pgno (which we call pPgOld) though that page is allowed to be
43708: ** in cache. If the page previously located at pgno is not already
43709: ** in the rollback journal, it is not put there by by this routine.
43710: **
43711: ** References to the page pPg remain valid. Updating any
43712: ** meta-data associated with pPg (i.e. data stored in the nExtra bytes
43713: ** allocated along with the page) is the responsibility of the caller.
43714: **
43715: ** A transaction must be active when this routine is called. It used to be
43716: ** required that a statement transaction was not active, but this restriction
43717: ** has been removed (CREATE INDEX needs to move a page when a statement
43718: ** transaction is active).
43719: **
43720: ** If the fourth argument, isCommit, is non-zero, then this page is being
43721: ** moved as part of a database reorganization just before the transaction
43722: ** is being committed. In this case, it is guaranteed that the database page
43723: ** pPg refers to will not be written to again within this transaction.
43724: **
43725: ** This function may return SQLITE_NOMEM or an IO error code if an error
43726: ** occurs. Otherwise, it returns SQLITE_OK.
43727: */
43728: SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, int isCommit){
43729: PgHdr *pPgOld; /* The page being overwritten. */
43730: Pgno needSyncPgno = 0; /* Old value of pPg->pgno, if sync is required */
43731: int rc; /* Return code */
43732: Pgno origPgno; /* The original page number */
43733:
43734: assert( pPg->nRef>0 );
43735: assert( pPager->eState==PAGER_WRITER_CACHEMOD
43736: || pPager->eState==PAGER_WRITER_DBMOD
43737: );
43738: assert( assert_pager_state(pPager) );
43739:
43740: /* In order to be able to rollback, an in-memory database must journal
43741: ** the page we are moving from.
43742: */
43743: if( MEMDB ){
43744: rc = sqlite3PagerWrite(pPg);
43745: if( rc ) return rc;
43746: }
43747:
43748: /* If the page being moved is dirty and has not been saved by the latest
43749: ** savepoint, then save the current contents of the page into the
43750: ** sub-journal now. This is required to handle the following scenario:
43751: **
43752: ** BEGIN;
43753: ** <journal page X, then modify it in memory>
43754: ** SAVEPOINT one;
43755: ** <Move page X to location Y>
43756: ** ROLLBACK TO one;
43757: **
43758: ** If page X were not written to the sub-journal here, it would not
43759: ** be possible to restore its contents when the "ROLLBACK TO one"
43760: ** statement were is processed.
43761: **
43762: ** subjournalPage() may need to allocate space to store pPg->pgno into
43763: ** one or more savepoint bitvecs. This is the reason this function
43764: ** may return SQLITE_NOMEM.
43765: */
43766: if( pPg->flags&PGHDR_DIRTY
43767: && subjRequiresPage(pPg)
43768: && SQLITE_OK!=(rc = subjournalPage(pPg))
43769: ){
43770: return rc;
43771: }
43772:
43773: PAGERTRACE(("MOVE %d page %d (needSync=%d) moves to %d\n",
43774: PAGERID(pPager), pPg->pgno, (pPg->flags&PGHDR_NEED_SYNC)?1:0, pgno));
43775: IOTRACE(("MOVE %p %d %d\n", pPager, pPg->pgno, pgno))
43776:
43777: /* If the journal needs to be sync()ed before page pPg->pgno can
43778: ** be written to, store pPg->pgno in local variable needSyncPgno.
43779: **
43780: ** If the isCommit flag is set, there is no need to remember that
43781: ** the journal needs to be sync()ed before database page pPg->pgno
43782: ** can be written to. The caller has already promised not to write to it.
43783: */
43784: if( (pPg->flags&PGHDR_NEED_SYNC) && !isCommit ){
43785: needSyncPgno = pPg->pgno;
43786: assert( pageInJournal(pPg) || pPg->pgno>pPager->dbOrigSize );
43787: assert( pPg->flags&PGHDR_DIRTY );
43788: }
43789:
43790: /* If the cache contains a page with page-number pgno, remove it
43791: ** from its hash chain. Also, if the PGHDR_NEED_SYNC flag was set for
43792: ** page pgno before the 'move' operation, it needs to be retained
43793: ** for the page moved there.
43794: */
43795: pPg->flags &= ~PGHDR_NEED_SYNC;
43796: pPgOld = pager_lookup(pPager, pgno);
43797: assert( !pPgOld || pPgOld->nRef==1 );
43798: if( pPgOld ){
43799: pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC);
43800: if( MEMDB ){
43801: /* Do not discard pages from an in-memory database since we might
43802: ** need to rollback later. Just move the page out of the way. */
43803: sqlite3PcacheMove(pPgOld, pPager->dbSize+1);
43804: }else{
43805: sqlite3PcacheDrop(pPgOld);
43806: }
43807: }
43808:
43809: origPgno = pPg->pgno;
43810: sqlite3PcacheMove(pPg, pgno);
43811: sqlite3PcacheMakeDirty(pPg);
43812:
43813: /* For an in-memory database, make sure the original page continues
43814: ** to exist, in case the transaction needs to roll back. Use pPgOld
43815: ** as the original page since it has already been allocated.
43816: */
43817: if( MEMDB ){
43818: assert( pPgOld );
43819: sqlite3PcacheMove(pPgOld, origPgno);
43820: sqlite3PagerUnref(pPgOld);
43821: }
43822:
43823: if( needSyncPgno ){
43824: /* If needSyncPgno is non-zero, then the journal file needs to be
43825: ** sync()ed before any data is written to database file page needSyncPgno.
43826: ** Currently, no such page exists in the page-cache and the
43827: ** "is journaled" bitvec flag has been set. This needs to be remedied by
43828: ** loading the page into the pager-cache and setting the PGHDR_NEED_SYNC
43829: ** flag.
43830: **
43831: ** If the attempt to load the page into the page-cache fails, (due
43832: ** to a malloc() or IO failure), clear the bit in the pInJournal[]
43833: ** array. Otherwise, if the page is loaded and written again in
43834: ** this transaction, it may be written to the database file before
43835: ** it is synced into the journal file. This way, it may end up in
43836: ** the journal file twice, but that is not a problem.
43837: */
43838: PgHdr *pPgHdr;
43839: rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr);
43840: if( rc!=SQLITE_OK ){
43841: if( needSyncPgno<=pPager->dbOrigSize ){
43842: assert( pPager->pTmpSpace!=0 );
43843: sqlite3BitvecClear(pPager->pInJournal, needSyncPgno, pPager->pTmpSpace);
43844: }
43845: return rc;
43846: }
43847: pPgHdr->flags |= PGHDR_NEED_SYNC;
43848: sqlite3PcacheMakeDirty(pPgHdr);
43849: sqlite3PagerUnref(pPgHdr);
43850: }
43851:
43852: return SQLITE_OK;
43853: }
43854: #endif
43855:
43856: /*
43857: ** Return a pointer to the data for the specified page.
43858: */
43859: SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *pPg){
43860: assert( pPg->nRef>0 || pPg->pPager->memDb );
43861: return pPg->pData;
43862: }
43863:
43864: /*
43865: ** Return a pointer to the Pager.nExtra bytes of "extra" space
43866: ** allocated along with the specified page.
43867: */
43868: SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *pPg){
43869: return pPg->pExtra;
43870: }
43871:
43872: /*
43873: ** Get/set the locking-mode for this pager. Parameter eMode must be one
43874: ** of PAGER_LOCKINGMODE_QUERY, PAGER_LOCKINGMODE_NORMAL or
43875: ** PAGER_LOCKINGMODE_EXCLUSIVE. If the parameter is not _QUERY, then
43876: ** the locking-mode is set to the value specified.
43877: **
43878: ** The returned value is either PAGER_LOCKINGMODE_NORMAL or
43879: ** PAGER_LOCKINGMODE_EXCLUSIVE, indicating the current (possibly updated)
43880: ** locking-mode.
43881: */
43882: SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *pPager, int eMode){
43883: assert( eMode==PAGER_LOCKINGMODE_QUERY
43884: || eMode==PAGER_LOCKINGMODE_NORMAL
43885: || eMode==PAGER_LOCKINGMODE_EXCLUSIVE );
43886: assert( PAGER_LOCKINGMODE_QUERY<0 );
43887: assert( PAGER_LOCKINGMODE_NORMAL>=0 && PAGER_LOCKINGMODE_EXCLUSIVE>=0 );
43888: assert( pPager->exclusiveMode || 0==sqlite3WalHeapMemory(pPager->pWal) );
43889: if( eMode>=0 && !pPager->tempFile && !sqlite3WalHeapMemory(pPager->pWal) ){
43890: pPager->exclusiveMode = (u8)eMode;
43891: }
43892: return (int)pPager->exclusiveMode;
43893: }
43894:
43895: /*
43896: ** Set the journal-mode for this pager. Parameter eMode must be one of:
43897: **
43898: ** PAGER_JOURNALMODE_DELETE
43899: ** PAGER_JOURNALMODE_TRUNCATE
43900: ** PAGER_JOURNALMODE_PERSIST
43901: ** PAGER_JOURNALMODE_OFF
43902: ** PAGER_JOURNALMODE_MEMORY
43903: ** PAGER_JOURNALMODE_WAL
43904: **
43905: ** The journalmode is set to the value specified if the change is allowed.
43906: ** The change may be disallowed for the following reasons:
43907: **
43908: ** * An in-memory database can only have its journal_mode set to _OFF
43909: ** or _MEMORY.
43910: **
43911: ** * Temporary databases cannot have _WAL journalmode.
43912: **
43913: ** The returned indicate the current (possibly updated) journal-mode.
43914: */
43915: SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){
43916: u8 eOld = pPager->journalMode; /* Prior journalmode */
43917:
43918: #ifdef SQLITE_DEBUG
43919: /* The print_pager_state() routine is intended to be used by the debugger
43920: ** only. We invoke it once here to suppress a compiler warning. */
43921: print_pager_state(pPager);
43922: #endif
43923:
43924:
43925: /* The eMode parameter is always valid */
43926: assert( eMode==PAGER_JOURNALMODE_DELETE
43927: || eMode==PAGER_JOURNALMODE_TRUNCATE
43928: || eMode==PAGER_JOURNALMODE_PERSIST
43929: || eMode==PAGER_JOURNALMODE_OFF
43930: || eMode==PAGER_JOURNALMODE_WAL
43931: || eMode==PAGER_JOURNALMODE_MEMORY );
43932:
43933: /* This routine is only called from the OP_JournalMode opcode, and
43934: ** the logic there will never allow a temporary file to be changed
43935: ** to WAL mode.
43936: */
43937: assert( pPager->tempFile==0 || eMode!=PAGER_JOURNALMODE_WAL );
43938:
43939: /* Do allow the journalmode of an in-memory database to be set to
43940: ** anything other than MEMORY or OFF
43941: */
43942: if( MEMDB ){
43943: assert( eOld==PAGER_JOURNALMODE_MEMORY || eOld==PAGER_JOURNALMODE_OFF );
43944: if( eMode!=PAGER_JOURNALMODE_MEMORY && eMode!=PAGER_JOURNALMODE_OFF ){
43945: eMode = eOld;
43946: }
43947: }
43948:
43949: if( eMode!=eOld ){
43950:
43951: /* Change the journal mode. */
43952: assert( pPager->eState!=PAGER_ERROR );
43953: pPager->journalMode = (u8)eMode;
43954:
43955: /* When transistioning from TRUNCATE or PERSIST to any other journal
43956: ** mode except WAL, unless the pager is in locking_mode=exclusive mode,
43957: ** delete the journal file.
43958: */
43959: assert( (PAGER_JOURNALMODE_TRUNCATE & 5)==1 );
43960: assert( (PAGER_JOURNALMODE_PERSIST & 5)==1 );
43961: assert( (PAGER_JOURNALMODE_DELETE & 5)==0 );
43962: assert( (PAGER_JOURNALMODE_MEMORY & 5)==4 );
43963: assert( (PAGER_JOURNALMODE_OFF & 5)==0 );
43964: assert( (PAGER_JOURNALMODE_WAL & 5)==5 );
43965:
43966: assert( isOpen(pPager->fd) || pPager->exclusiveMode );
43967: if( !pPager->exclusiveMode && (eOld & 5)==1 && (eMode & 1)==0 ){
43968:
43969: /* In this case we would like to delete the journal file. If it is
43970: ** not possible, then that is not a problem. Deleting the journal file
43971: ** here is an optimization only.
43972: **
43973: ** Before deleting the journal file, obtain a RESERVED lock on the
43974: ** database file. This ensures that the journal file is not deleted
43975: ** while it is in use by some other client.
43976: */
43977: sqlite3OsClose(pPager->jfd);
43978: if( pPager->eLock>=RESERVED_LOCK ){
43979: sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
43980: }else{
43981: int rc = SQLITE_OK;
43982: int state = pPager->eState;
43983: assert( state==PAGER_OPEN || state==PAGER_READER );
43984: if( state==PAGER_OPEN ){
43985: rc = sqlite3PagerSharedLock(pPager);
43986: }
43987: if( pPager->eState==PAGER_READER ){
43988: assert( rc==SQLITE_OK );
43989: rc = pagerLockDb(pPager, RESERVED_LOCK);
43990: }
43991: if( rc==SQLITE_OK ){
43992: sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0);
43993: }
43994: if( rc==SQLITE_OK && state==PAGER_READER ){
43995: pagerUnlockDb(pPager, SHARED_LOCK);
43996: }else if( state==PAGER_OPEN ){
43997: pager_unlock(pPager);
43998: }
43999: assert( state==pPager->eState );
44000: }
44001: }
44002: }
44003:
44004: /* Return the new journal mode */
44005: return (int)pPager->journalMode;
44006: }
44007:
44008: /*
44009: ** Return the current journal mode.
44010: */
44011: SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){
44012: return (int)pPager->journalMode;
44013: }
44014:
44015: /*
44016: ** Return TRUE if the pager is in a state where it is OK to change the
44017: ** journalmode. Journalmode changes can only happen when the database
44018: ** is unmodified.
44019: */
44020: SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){
44021: assert( assert_pager_state(pPager) );
44022: if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0;
44023: if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0;
44024: return 1;
44025: }
44026:
44027: /*
44028: ** Get/set the size-limit used for persistent journal files.
44029: **
44030: ** Setting the size limit to -1 means no limit is enforced.
44031: ** An attempt to set a limit smaller than -1 is a no-op.
44032: */
44033: SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *pPager, i64 iLimit){
44034: if( iLimit>=-1 ){
44035: pPager->journalSizeLimit = iLimit;
44036: sqlite3WalLimit(pPager->pWal, iLimit);
44037: }
44038: return pPager->journalSizeLimit;
44039: }
44040:
44041: /*
44042: ** Return a pointer to the pPager->pBackup variable. The backup module
44043: ** in backup.c maintains the content of this variable. This module
44044: ** uses it opaquely as an argument to sqlite3BackupRestart() and
44045: ** sqlite3BackupUpdate() only.
44046: */
44047: SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){
44048: return &pPager->pBackup;
44049: }
44050:
44051: #ifndef SQLITE_OMIT_VACUUM
44052: /*
44053: ** Unless this is an in-memory or temporary database, clear the pager cache.
44054: */
44055: SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){
44056: if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager);
44057: }
44058: #endif
44059:
44060: #ifndef SQLITE_OMIT_WAL
44061: /*
44062: ** This function is called when the user invokes "PRAGMA wal_checkpoint",
44063: ** "PRAGMA wal_blocking_checkpoint" or calls the sqlite3_wal_checkpoint()
44064: ** or wal_blocking_checkpoint() API functions.
44065: **
44066: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
44067: */
44068: SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){
44069: int rc = SQLITE_OK;
44070: if( pPager->pWal ){
44071: rc = sqlite3WalCheckpoint(pPager->pWal, eMode,
44072: pPager->xBusyHandler, pPager->pBusyHandlerArg,
44073: pPager->ckptSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace,
44074: pnLog, pnCkpt
44075: );
44076: }
44077: return rc;
44078: }
44079:
44080: SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){
44081: return sqlite3WalCallback(pPager->pWal);
44082: }
44083:
44084: /*
44085: ** Return true if the underlying VFS for the given pager supports the
44086: ** primitives necessary for write-ahead logging.
44087: */
44088: SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){
44089: const sqlite3_io_methods *pMethods = pPager->fd->pMethods;
44090: return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap);
44091: }
44092:
44093: /*
44094: ** Attempt to take an exclusive lock on the database file. If a PENDING lock
44095: ** is obtained instead, immediately release it.
44096: */
44097: static int pagerExclusiveLock(Pager *pPager){
44098: int rc; /* Return code */
44099:
44100: assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK );
44101: rc = pagerLockDb(pPager, EXCLUSIVE_LOCK);
44102: if( rc!=SQLITE_OK ){
44103: /* If the attempt to grab the exclusive lock failed, release the
44104: ** pending lock that may have been obtained instead. */
44105: pagerUnlockDb(pPager, SHARED_LOCK);
44106: }
44107:
44108: return rc;
44109: }
44110:
44111: /*
44112: ** Call sqlite3WalOpen() to open the WAL handle. If the pager is in
44113: ** exclusive-locking mode when this function is called, take an EXCLUSIVE
44114: ** lock on the database file and use heap-memory to store the wal-index
44115: ** in. Otherwise, use the normal shared-memory.
44116: */
44117: static int pagerOpenWal(Pager *pPager){
44118: int rc = SQLITE_OK;
44119:
44120: assert( pPager->pWal==0 && pPager->tempFile==0 );
1.2.2.1 ! misho 44121: assert( pPager->eLock==SHARED_LOCK || pPager->eLock==EXCLUSIVE_LOCK );
1.2 misho 44122:
44123: /* If the pager is already in exclusive-mode, the WAL module will use
44124: ** heap-memory for the wal-index instead of the VFS shared-memory
44125: ** implementation. Take the exclusive lock now, before opening the WAL
44126: ** file, to make sure this is safe.
44127: */
44128: if( pPager->exclusiveMode ){
44129: rc = pagerExclusiveLock(pPager);
44130: }
44131:
44132: /* Open the connection to the log file. If this operation fails,
44133: ** (e.g. due to malloc() failure), return an error code.
44134: */
44135: if( rc==SQLITE_OK ){
44136: rc = sqlite3WalOpen(pPager->pVfs,
44137: pPager->fd, pPager->zWal, pPager->exclusiveMode,
44138: pPager->journalSizeLimit, &pPager->pWal
44139: );
44140: }
44141:
44142: return rc;
44143: }
44144:
44145:
44146: /*
44147: ** The caller must be holding a SHARED lock on the database file to call
44148: ** this function.
44149: **
44150: ** If the pager passed as the first argument is open on a real database
44151: ** file (not a temp file or an in-memory database), and the WAL file
44152: ** is not already open, make an attempt to open it now. If successful,
44153: ** return SQLITE_OK. If an error occurs or the VFS used by the pager does
44154: ** not support the xShmXXX() methods, return an error code. *pbOpen is
44155: ** not modified in either case.
44156: **
44157: ** If the pager is open on a temp-file (or in-memory database), or if
44158: ** the WAL file is already open, set *pbOpen to 1 and return SQLITE_OK
44159: ** without doing anything.
44160: */
44161: SQLITE_PRIVATE int sqlite3PagerOpenWal(
44162: Pager *pPager, /* Pager object */
44163: int *pbOpen /* OUT: Set to true if call is a no-op */
44164: ){
44165: int rc = SQLITE_OK; /* Return code */
44166:
44167: assert( assert_pager_state(pPager) );
44168: assert( pPager->eState==PAGER_OPEN || pbOpen );
44169: assert( pPager->eState==PAGER_READER || !pbOpen );
44170: assert( pbOpen==0 || *pbOpen==0 );
44171: assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) );
44172:
44173: if( !pPager->tempFile && !pPager->pWal ){
44174: if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN;
44175:
44176: /* Close any rollback journal previously open */
44177: sqlite3OsClose(pPager->jfd);
44178:
44179: rc = pagerOpenWal(pPager);
44180: if( rc==SQLITE_OK ){
44181: pPager->journalMode = PAGER_JOURNALMODE_WAL;
44182: pPager->eState = PAGER_OPEN;
44183: }
44184: }else{
44185: *pbOpen = 1;
44186: }
44187:
44188: return rc;
44189: }
44190:
44191: /*
44192: ** This function is called to close the connection to the log file prior
44193: ** to switching from WAL to rollback mode.
44194: **
44195: ** Before closing the log file, this function attempts to take an
44196: ** EXCLUSIVE lock on the database file. If this cannot be obtained, an
44197: ** error (SQLITE_BUSY) is returned and the log connection is not closed.
44198: ** If successful, the EXCLUSIVE lock is not released before returning.
44199: */
44200: SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){
44201: int rc = SQLITE_OK;
44202:
44203: assert( pPager->journalMode==PAGER_JOURNALMODE_WAL );
44204:
44205: /* If the log file is not already open, but does exist in the file-system,
44206: ** it may need to be checkpointed before the connection can switch to
44207: ** rollback mode. Open it now so this can happen.
44208: */
44209: if( !pPager->pWal ){
44210: int logexists = 0;
44211: rc = pagerLockDb(pPager, SHARED_LOCK);
44212: if( rc==SQLITE_OK ){
44213: rc = sqlite3OsAccess(
44214: pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &logexists
44215: );
44216: }
44217: if( rc==SQLITE_OK && logexists ){
44218: rc = pagerOpenWal(pPager);
44219: }
44220: }
44221:
44222: /* Checkpoint and close the log. Because an EXCLUSIVE lock is held on
44223: ** the database file, the log and log-summary files will be deleted.
44224: */
44225: if( rc==SQLITE_OK && pPager->pWal ){
44226: rc = pagerExclusiveLock(pPager);
44227: if( rc==SQLITE_OK ){
44228: rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags,
44229: pPager->pageSize, (u8*)pPager->pTmpSpace);
44230: pPager->pWal = 0;
44231: }
44232: }
44233: return rc;
44234: }
44235:
1.2.2.1 ! misho 44236: #endif /* !SQLITE_OMIT_WAL */
! 44237:
! 44238: #ifdef SQLITE_ENABLE_ZIPVFS
! 44239: /*
! 44240: ** A read-lock must be held on the pager when this function is called. If
! 44241: ** the pager is in WAL mode and the WAL file currently contains one or more
! 44242: ** frames, return the size in bytes of the page images stored within the
! 44243: ** WAL frames. Otherwise, if this is not a WAL database or the WAL file
! 44244: ** is empty, return 0.
! 44245: */
! 44246: SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){
! 44247: assert( pPager->eState==PAGER_READER );
! 44248: return sqlite3WalFramesize(pPager->pWal);
! 44249: }
! 44250: #endif
! 44251:
1.2 misho 44252: #ifdef SQLITE_HAS_CODEC
44253: /*
44254: ** This function is called by the wal module when writing page content
44255: ** into the log file.
44256: **
44257: ** This function returns a pointer to a buffer containing the encrypted
44258: ** page content. If a malloc fails, this function may return NULL.
44259: */
44260: SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
44261: void *aData = 0;
44262: CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
44263: return aData;
44264: }
44265: #endif /* SQLITE_HAS_CODEC */
44266:
44267: #endif /* SQLITE_OMIT_DISKIO */
44268:
44269: /************** End of pager.c ***********************************************/
44270: /************** Begin file wal.c *********************************************/
44271: /*
44272: ** 2010 February 1
44273: **
44274: ** The author disclaims copyright to this source code. In place of
44275: ** a legal notice, here is a blessing:
44276: **
44277: ** May you do good and not evil.
44278: ** May you find forgiveness for yourself and forgive others.
44279: ** May you share freely, never taking more than you give.
44280: **
44281: *************************************************************************
44282: **
44283: ** This file contains the implementation of a write-ahead log (WAL) used in
44284: ** "journal_mode=WAL" mode.
44285: **
44286: ** WRITE-AHEAD LOG (WAL) FILE FORMAT
44287: **
44288: ** A WAL file consists of a header followed by zero or more "frames".
44289: ** Each frame records the revised content of a single page from the
44290: ** database file. All changes to the database are recorded by writing
44291: ** frames into the WAL. Transactions commit when a frame is written that
44292: ** contains a commit marker. A single WAL can and usually does record
44293: ** multiple transactions. Periodically, the content of the WAL is
44294: ** transferred back into the database file in an operation called a
44295: ** "checkpoint".
44296: **
44297: ** A single WAL file can be used multiple times. In other words, the
44298: ** WAL can fill up with frames and then be checkpointed and then new
44299: ** frames can overwrite the old ones. A WAL always grows from beginning
44300: ** toward the end. Checksums and counters attached to each frame are
44301: ** used to determine which frames within the WAL are valid and which
44302: ** are leftovers from prior checkpoints.
44303: **
44304: ** The WAL header is 32 bytes in size and consists of the following eight
44305: ** big-endian 32-bit unsigned integer values:
44306: **
44307: ** 0: Magic number. 0x377f0682 or 0x377f0683
44308: ** 4: File format version. Currently 3007000
44309: ** 8: Database page size. Example: 1024
44310: ** 12: Checkpoint sequence number
44311: ** 16: Salt-1, random integer incremented with each checkpoint
44312: ** 20: Salt-2, a different random integer changing with each ckpt
44313: ** 24: Checksum-1 (first part of checksum for first 24 bytes of header).
44314: ** 28: Checksum-2 (second part of checksum for first 24 bytes of header).
44315: **
44316: ** Immediately following the wal-header are zero or more frames. Each
44317: ** frame consists of a 24-byte frame-header followed by a <page-size> bytes
44318: ** of page data. The frame-header is six big-endian 32-bit unsigned
44319: ** integer values, as follows:
44320: **
44321: ** 0: Page number.
44322: ** 4: For commit records, the size of the database image in pages
44323: ** after the commit. For all other records, zero.
44324: ** 8: Salt-1 (copied from the header)
44325: ** 12: Salt-2 (copied from the header)
44326: ** 16: Checksum-1.
44327: ** 20: Checksum-2.
44328: **
44329: ** A frame is considered valid if and only if the following conditions are
44330: ** true:
44331: **
44332: ** (1) The salt-1 and salt-2 values in the frame-header match
44333: ** salt values in the wal-header
44334: **
44335: ** (2) The checksum values in the final 8 bytes of the frame-header
44336: ** exactly match the checksum computed consecutively on the
44337: ** WAL header and the first 8 bytes and the content of all frames
44338: ** up to and including the current frame.
44339: **
44340: ** The checksum is computed using 32-bit big-endian integers if the
44341: ** magic number in the first 4 bytes of the WAL is 0x377f0683 and it
44342: ** is computed using little-endian if the magic number is 0x377f0682.
44343: ** The checksum values are always stored in the frame header in a
44344: ** big-endian format regardless of which byte order is used to compute
44345: ** the checksum. The checksum is computed by interpreting the input as
44346: ** an even number of unsigned 32-bit integers: x[0] through x[N]. The
44347: ** algorithm used for the checksum is as follows:
44348: **
44349: ** for i from 0 to n-1 step 2:
44350: ** s0 += x[i] + s1;
44351: ** s1 += x[i+1] + s0;
44352: ** endfor
44353: **
44354: ** Note that s0 and s1 are both weighted checksums using fibonacci weights
44355: ** in reverse order (the largest fibonacci weight occurs on the first element
44356: ** of the sequence being summed.) The s1 value spans all 32-bit
44357: ** terms of the sequence whereas s0 omits the final term.
44358: **
44359: ** On a checkpoint, the WAL is first VFS.xSync-ed, then valid content of the
44360: ** WAL is transferred into the database, then the database is VFS.xSync-ed.
44361: ** The VFS.xSync operations serve as write barriers - all writes launched
44362: ** before the xSync must complete before any write that launches after the
44363: ** xSync begins.
44364: **
44365: ** After each checkpoint, the salt-1 value is incremented and the salt-2
44366: ** value is randomized. This prevents old and new frames in the WAL from
44367: ** being considered valid at the same time and being checkpointing together
44368: ** following a crash.
44369: **
44370: ** READER ALGORITHM
44371: **
44372: ** To read a page from the database (call it page number P), a reader
44373: ** first checks the WAL to see if it contains page P. If so, then the
44374: ** last valid instance of page P that is a followed by a commit frame
44375: ** or is a commit frame itself becomes the value read. If the WAL
44376: ** contains no copies of page P that are valid and which are a commit
44377: ** frame or are followed by a commit frame, then page P is read from
44378: ** the database file.
44379: **
44380: ** To start a read transaction, the reader records the index of the last
44381: ** valid frame in the WAL. The reader uses this recorded "mxFrame" value
44382: ** for all subsequent read operations. New transactions can be appended
44383: ** to the WAL, but as long as the reader uses its original mxFrame value
44384: ** and ignores the newly appended content, it will see a consistent snapshot
44385: ** of the database from a single point in time. This technique allows
44386: ** multiple concurrent readers to view different versions of the database
44387: ** content simultaneously.
44388: **
44389: ** The reader algorithm in the previous paragraphs works correctly, but
44390: ** because frames for page P can appear anywhere within the WAL, the
44391: ** reader has to scan the entire WAL looking for page P frames. If the
44392: ** WAL is large (multiple megabytes is typical) that scan can be slow,
44393: ** and read performance suffers. To overcome this problem, a separate
44394: ** data structure called the wal-index is maintained to expedite the
44395: ** search for frames of a particular page.
44396: **
44397: ** WAL-INDEX FORMAT
44398: **
44399: ** Conceptually, the wal-index is shared memory, though VFS implementations
44400: ** might choose to implement the wal-index using a mmapped file. Because
44401: ** the wal-index is shared memory, SQLite does not support journal_mode=WAL
44402: ** on a network filesystem. All users of the database must be able to
44403: ** share memory.
44404: **
44405: ** The wal-index is transient. After a crash, the wal-index can (and should
44406: ** be) reconstructed from the original WAL file. In fact, the VFS is required
44407: ** to either truncate or zero the header of the wal-index when the last
44408: ** connection to it closes. Because the wal-index is transient, it can
44409: ** use an architecture-specific format; it does not have to be cross-platform.
44410: ** Hence, unlike the database and WAL file formats which store all values
44411: ** as big endian, the wal-index can store multi-byte values in the native
44412: ** byte order of the host computer.
44413: **
44414: ** The purpose of the wal-index is to answer this question quickly: Given
1.2.2.1 ! misho 44415: ** a page number P and a maximum frame index M, return the index of the
! 44416: ** last frame in the wal before frame M for page P in the WAL, or return
! 44417: ** NULL if there are no frames for page P in the WAL prior to M.
1.2 misho 44418: **
44419: ** The wal-index consists of a header region, followed by an one or
44420: ** more index blocks.
44421: **
44422: ** The wal-index header contains the total number of frames within the WAL
1.2.2.1 ! misho 44423: ** in the mxFrame field.
1.2 misho 44424: **
44425: ** Each index block except for the first contains information on
44426: ** HASHTABLE_NPAGE frames. The first index block contains information on
44427: ** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and
44428: ** HASHTABLE_NPAGE are selected so that together the wal-index header and
44429: ** first index block are the same size as all other index blocks in the
44430: ** wal-index.
44431: **
44432: ** Each index block contains two sections, a page-mapping that contains the
44433: ** database page number associated with each wal frame, and a hash-table
44434: ** that allows readers to query an index block for a specific page number.
44435: ** The page-mapping is an array of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE
44436: ** for the first index block) 32-bit page numbers. The first entry in the
44437: ** first index-block contains the database page number corresponding to the
44438: ** first frame in the WAL file. The first entry in the second index block
44439: ** in the WAL file corresponds to the (HASHTABLE_NPAGE_ONE+1)th frame in
44440: ** the log, and so on.
44441: **
44442: ** The last index block in a wal-index usually contains less than the full
44443: ** complement of HASHTABLE_NPAGE (or HASHTABLE_NPAGE_ONE) page-numbers,
44444: ** depending on the contents of the WAL file. This does not change the
44445: ** allocated size of the page-mapping array - the page-mapping array merely
44446: ** contains unused entries.
44447: **
44448: ** Even without using the hash table, the last frame for page P
44449: ** can be found by scanning the page-mapping sections of each index block
44450: ** starting with the last index block and moving toward the first, and
44451: ** within each index block, starting at the end and moving toward the
44452: ** beginning. The first entry that equals P corresponds to the frame
44453: ** holding the content for that page.
44454: **
44455: ** The hash table consists of HASHTABLE_NSLOT 16-bit unsigned integers.
44456: ** HASHTABLE_NSLOT = 2*HASHTABLE_NPAGE, and there is one entry in the
44457: ** hash table for each page number in the mapping section, so the hash
44458: ** table is never more than half full. The expected number of collisions
44459: ** prior to finding a match is 1. Each entry of the hash table is an
44460: ** 1-based index of an entry in the mapping section of the same
44461: ** index block. Let K be the 1-based index of the largest entry in
44462: ** the mapping section. (For index blocks other than the last, K will
44463: ** always be exactly HASHTABLE_NPAGE (4096) and for the last index block
44464: ** K will be (mxFrame%HASHTABLE_NPAGE).) Unused slots of the hash table
44465: ** contain a value of 0.
44466: **
44467: ** To look for page P in the hash table, first compute a hash iKey on
44468: ** P as follows:
44469: **
44470: ** iKey = (P * 383) % HASHTABLE_NSLOT
44471: **
44472: ** Then start scanning entries of the hash table, starting with iKey
44473: ** (wrapping around to the beginning when the end of the hash table is
44474: ** reached) until an unused hash slot is found. Let the first unused slot
44475: ** be at index iUnused. (iUnused might be less than iKey if there was
44476: ** wrap-around.) Because the hash table is never more than half full,
44477: ** the search is guaranteed to eventually hit an unused entry. Let
44478: ** iMax be the value between iKey and iUnused, closest to iUnused,
44479: ** where aHash[iMax]==P. If there is no iMax entry (if there exists
44480: ** no hash slot such that aHash[i]==p) then page P is not in the
44481: ** current index block. Otherwise the iMax-th mapping entry of the
44482: ** current index block corresponds to the last entry that references
44483: ** page P.
44484: **
44485: ** A hash search begins with the last index block and moves toward the
44486: ** first index block, looking for entries corresponding to page P. On
44487: ** average, only two or three slots in each index block need to be
44488: ** examined in order to either find the last entry for page P, or to
44489: ** establish that no such entry exists in the block. Each index block
44490: ** holds over 4000 entries. So two or three index blocks are sufficient
44491: ** to cover a typical 10 megabyte WAL file, assuming 1K pages. 8 or 10
44492: ** comparisons (on average) suffice to either locate a frame in the
44493: ** WAL or to establish that the frame does not exist in the WAL. This
44494: ** is much faster than scanning the entire 10MB WAL.
44495: **
44496: ** Note that entries are added in order of increasing K. Hence, one
44497: ** reader might be using some value K0 and a second reader that started
44498: ** at a later time (after additional transactions were added to the WAL
44499: ** and to the wal-index) might be using a different value K1, where K1>K0.
44500: ** Both readers can use the same hash table and mapping section to get
44501: ** the correct result. There may be entries in the hash table with
44502: ** K>K0 but to the first reader, those entries will appear to be unused
44503: ** slots in the hash table and so the first reader will get an answer as
44504: ** if no values greater than K0 had ever been inserted into the hash table
44505: ** in the first place - which is what reader one wants. Meanwhile, the
44506: ** second reader using K1 will see additional values that were inserted
44507: ** later, which is exactly what reader two wants.
44508: **
44509: ** When a rollback occurs, the value of K is decreased. Hash table entries
44510: ** that correspond to frames greater than the new K value are removed
44511: ** from the hash table at this point.
44512: */
44513: #ifndef SQLITE_OMIT_WAL
44514:
44515:
44516: /*
44517: ** Trace output macros
44518: */
44519: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
44520: SQLITE_PRIVATE int sqlite3WalTrace = 0;
44521: # define WALTRACE(X) if(sqlite3WalTrace) sqlite3DebugPrintf X
44522: #else
44523: # define WALTRACE(X)
44524: #endif
44525:
44526: /*
44527: ** The maximum (and only) versions of the wal and wal-index formats
44528: ** that may be interpreted by this version of SQLite.
44529: **
44530: ** If a client begins recovering a WAL file and finds that (a) the checksum
44531: ** values in the wal-header are correct and (b) the version field is not
44532: ** WAL_MAX_VERSION, recovery fails and SQLite returns SQLITE_CANTOPEN.
44533: **
44534: ** Similarly, if a client successfully reads a wal-index header (i.e. the
44535: ** checksum test is successful) and finds that the version field is not
44536: ** WALINDEX_MAX_VERSION, then no read-transaction is opened and SQLite
44537: ** returns SQLITE_CANTOPEN.
44538: */
44539: #define WAL_MAX_VERSION 3007000
44540: #define WALINDEX_MAX_VERSION 3007000
44541:
44542: /*
44543: ** Indices of various locking bytes. WAL_NREADER is the number
44544: ** of available reader locks and should be at least 3.
44545: */
44546: #define WAL_WRITE_LOCK 0
44547: #define WAL_ALL_BUT_WRITE 1
44548: #define WAL_CKPT_LOCK 1
44549: #define WAL_RECOVER_LOCK 2
44550: #define WAL_READ_LOCK(I) (3+(I))
44551: #define WAL_NREADER (SQLITE_SHM_NLOCK-3)
44552:
44553:
44554: /* Object declarations */
44555: typedef struct WalIndexHdr WalIndexHdr;
44556: typedef struct WalIterator WalIterator;
44557: typedef struct WalCkptInfo WalCkptInfo;
44558:
44559:
44560: /*
44561: ** The following object holds a copy of the wal-index header content.
44562: **
44563: ** The actual header in the wal-index consists of two copies of this
44564: ** object.
44565: **
44566: ** The szPage value can be any power of 2 between 512 and 32768, inclusive.
44567: ** Or it can be 1 to represent a 65536-byte page. The latter case was
44568: ** added in 3.7.1 when support for 64K pages was added.
44569: */
44570: struct WalIndexHdr {
44571: u32 iVersion; /* Wal-index version */
44572: u32 unused; /* Unused (padding) field */
44573: u32 iChange; /* Counter incremented each transaction */
44574: u8 isInit; /* 1 when initialized */
44575: u8 bigEndCksum; /* True if checksums in WAL are big-endian */
44576: u16 szPage; /* Database page size in bytes. 1==64K */
44577: u32 mxFrame; /* Index of last valid frame in the WAL */
44578: u32 nPage; /* Size of database in pages */
44579: u32 aFrameCksum[2]; /* Checksum of last frame in log */
44580: u32 aSalt[2]; /* Two salt values copied from WAL header */
44581: u32 aCksum[2]; /* Checksum over all prior fields */
44582: };
44583:
44584: /*
44585: ** A copy of the following object occurs in the wal-index immediately
44586: ** following the second copy of the WalIndexHdr. This object stores
44587: ** information used by checkpoint.
44588: **
44589: ** nBackfill is the number of frames in the WAL that have been written
44590: ** back into the database. (We call the act of moving content from WAL to
44591: ** database "backfilling".) The nBackfill number is never greater than
44592: ** WalIndexHdr.mxFrame. nBackfill can only be increased by threads
44593: ** holding the WAL_CKPT_LOCK lock (which includes a recovery thread).
44594: ** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from
44595: ** mxFrame back to zero when the WAL is reset.
44596: **
44597: ** There is one entry in aReadMark[] for each reader lock. If a reader
44598: ** holds read-lock K, then the value in aReadMark[K] is no greater than
44599: ** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff)
44600: ** for any aReadMark[] means that entry is unused. aReadMark[0] is
44601: ** a special case; its value is never used and it exists as a place-holder
44602: ** to avoid having to offset aReadMark[] indexs by one. Readers holding
44603: ** WAL_READ_LOCK(0) always ignore the entire WAL and read all content
44604: ** directly from the database.
44605: **
44606: ** The value of aReadMark[K] may only be changed by a thread that
44607: ** is holding an exclusive lock on WAL_READ_LOCK(K). Thus, the value of
44608: ** aReadMark[K] cannot changed while there is a reader is using that mark
44609: ** since the reader will be holding a shared lock on WAL_READ_LOCK(K).
44610: **
44611: ** The checkpointer may only transfer frames from WAL to database where
44612: ** the frame numbers are less than or equal to every aReadMark[] that is
44613: ** in use (that is, every aReadMark[j] for which there is a corresponding
44614: ** WAL_READ_LOCK(j)). New readers (usually) pick the aReadMark[] with the
44615: ** largest value and will increase an unused aReadMark[] to mxFrame if there
44616: ** is not already an aReadMark[] equal to mxFrame. The exception to the
44617: ** previous sentence is when nBackfill equals mxFrame (meaning that everything
44618: ** in the WAL has been backfilled into the database) then new readers
44619: ** will choose aReadMark[0] which has value 0 and hence such reader will
44620: ** get all their all content directly from the database file and ignore
44621: ** the WAL.
44622: **
44623: ** Writers normally append new frames to the end of the WAL. However,
44624: ** if nBackfill equals mxFrame (meaning that all WAL content has been
44625: ** written back into the database) and if no readers are using the WAL
44626: ** (in other words, if there are no WAL_READ_LOCK(i) where i>0) then
44627: ** the writer will first "reset" the WAL back to the beginning and start
44628: ** writing new content beginning at frame 1.
44629: **
44630: ** We assume that 32-bit loads are atomic and so no locks are needed in
44631: ** order to read from any aReadMark[] entries.
44632: */
44633: struct WalCkptInfo {
44634: u32 nBackfill; /* Number of WAL frames backfilled into DB */
44635: u32 aReadMark[WAL_NREADER]; /* Reader marks */
44636: };
44637: #define READMARK_NOT_USED 0xffffffff
44638:
44639:
44640: /* A block of WALINDEX_LOCK_RESERVED bytes beginning at
44641: ** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems
44642: ** only support mandatory file-locks, we do not read or write data
44643: ** from the region of the file on which locks are applied.
44644: */
44645: #define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2 + sizeof(WalCkptInfo))
44646: #define WALINDEX_LOCK_RESERVED 16
44647: #define WALINDEX_HDR_SIZE (WALINDEX_LOCK_OFFSET+WALINDEX_LOCK_RESERVED)
44648:
44649: /* Size of header before each frame in wal */
44650: #define WAL_FRAME_HDRSIZE 24
44651:
44652: /* Size of write ahead log header, including checksum. */
44653: /* #define WAL_HDRSIZE 24 */
44654: #define WAL_HDRSIZE 32
44655:
44656: /* WAL magic value. Either this value, or the same value with the least
44657: ** significant bit also set (WAL_MAGIC | 0x00000001) is stored in 32-bit
44658: ** big-endian format in the first 4 bytes of a WAL file.
44659: **
44660: ** If the LSB is set, then the checksums for each frame within the WAL
44661: ** file are calculated by treating all data as an array of 32-bit
44662: ** big-endian words. Otherwise, they are calculated by interpreting
44663: ** all data as 32-bit little-endian words.
44664: */
44665: #define WAL_MAGIC 0x377f0682
44666:
44667: /*
44668: ** Return the offset of frame iFrame in the write-ahead log file,
44669: ** assuming a database page size of szPage bytes. The offset returned
44670: ** is to the start of the write-ahead log frame-header.
44671: */
44672: #define walFrameOffset(iFrame, szPage) ( \
44673: WAL_HDRSIZE + ((iFrame)-1)*(i64)((szPage)+WAL_FRAME_HDRSIZE) \
44674: )
44675:
44676: /*
44677: ** An open write-ahead log file is represented by an instance of the
44678: ** following object.
44679: */
44680: struct Wal {
44681: sqlite3_vfs *pVfs; /* The VFS used to create pDbFd */
44682: sqlite3_file *pDbFd; /* File handle for the database file */
44683: sqlite3_file *pWalFd; /* File handle for WAL file */
44684: u32 iCallback; /* Value to pass to log callback (or 0) */
44685: i64 mxWalSize; /* Truncate WAL to this size upon reset */
44686: int nWiData; /* Size of array apWiData */
44687: int szFirstBlock; /* Size of first block written to WAL file */
44688: volatile u32 **apWiData; /* Pointer to wal-index content in memory */
44689: u32 szPage; /* Database page size */
44690: i16 readLock; /* Which read lock is being held. -1 for none */
44691: u8 syncFlags; /* Flags to use to sync header writes */
44692: u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */
44693: u8 writeLock; /* True if in a write transaction */
44694: u8 ckptLock; /* True if holding a checkpoint lock */
44695: u8 readOnly; /* WAL_RDWR, WAL_RDONLY, or WAL_SHM_RDONLY */
44696: u8 truncateOnCommit; /* True to truncate WAL file on commit */
44697: u8 syncHeader; /* Fsync the WAL header if true */
44698: u8 padToSectorBoundary; /* Pad transactions out to the next sector */
44699: WalIndexHdr hdr; /* Wal-index header for current transaction */
44700: const char *zWalName; /* Name of WAL file */
44701: u32 nCkpt; /* Checkpoint sequence counter in the wal-header */
44702: #ifdef SQLITE_DEBUG
44703: u8 lockError; /* True if a locking error has occurred */
44704: #endif
44705: };
44706:
44707: /*
44708: ** Candidate values for Wal.exclusiveMode.
44709: */
44710: #define WAL_NORMAL_MODE 0
44711: #define WAL_EXCLUSIVE_MODE 1
44712: #define WAL_HEAPMEMORY_MODE 2
44713:
44714: /*
44715: ** Possible values for WAL.readOnly
44716: */
44717: #define WAL_RDWR 0 /* Normal read/write connection */
44718: #define WAL_RDONLY 1 /* The WAL file is readonly */
44719: #define WAL_SHM_RDONLY 2 /* The SHM file is readonly */
44720:
44721: /*
44722: ** Each page of the wal-index mapping contains a hash-table made up of
44723: ** an array of HASHTABLE_NSLOT elements of the following type.
44724: */
44725: typedef u16 ht_slot;
44726:
44727: /*
44728: ** This structure is used to implement an iterator that loops through
44729: ** all frames in the WAL in database page order. Where two or more frames
44730: ** correspond to the same database page, the iterator visits only the
44731: ** frame most recently written to the WAL (in other words, the frame with
44732: ** the largest index).
44733: **
44734: ** The internals of this structure are only accessed by:
44735: **
44736: ** walIteratorInit() - Create a new iterator,
44737: ** walIteratorNext() - Step an iterator,
44738: ** walIteratorFree() - Free an iterator.
44739: **
44740: ** This functionality is used by the checkpoint code (see walCheckpoint()).
44741: */
44742: struct WalIterator {
44743: int iPrior; /* Last result returned from the iterator */
44744: int nSegment; /* Number of entries in aSegment[] */
44745: struct WalSegment {
44746: int iNext; /* Next slot in aIndex[] not yet returned */
44747: ht_slot *aIndex; /* i0, i1, i2... such that aPgno[iN] ascend */
44748: u32 *aPgno; /* Array of page numbers. */
44749: int nEntry; /* Nr. of entries in aPgno[] and aIndex[] */
44750: int iZero; /* Frame number associated with aPgno[0] */
44751: } aSegment[1]; /* One for every 32KB page in the wal-index */
44752: };
44753:
44754: /*
44755: ** Define the parameters of the hash tables in the wal-index file. There
44756: ** is a hash-table following every HASHTABLE_NPAGE page numbers in the
44757: ** wal-index.
44758: **
44759: ** Changing any of these constants will alter the wal-index format and
44760: ** create incompatibilities.
44761: */
44762: #define HASHTABLE_NPAGE 4096 /* Must be power of 2 */
44763: #define HASHTABLE_HASH_1 383 /* Should be prime */
44764: #define HASHTABLE_NSLOT (HASHTABLE_NPAGE*2) /* Must be a power of 2 */
44765:
44766: /*
44767: ** The block of page numbers associated with the first hash-table in a
44768: ** wal-index is smaller than usual. This is so that there is a complete
44769: ** hash-table on each aligned 32KB page of the wal-index.
44770: */
44771: #define HASHTABLE_NPAGE_ONE (HASHTABLE_NPAGE - (WALINDEX_HDR_SIZE/sizeof(u32)))
44772:
44773: /* The wal-index is divided into pages of WALINDEX_PGSZ bytes each. */
44774: #define WALINDEX_PGSZ ( \
44775: sizeof(ht_slot)*HASHTABLE_NSLOT + HASHTABLE_NPAGE*sizeof(u32) \
44776: )
44777:
44778: /*
44779: ** Obtain a pointer to the iPage'th page of the wal-index. The wal-index
44780: ** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are
44781: ** numbered from zero.
44782: **
44783: ** If this call is successful, *ppPage is set to point to the wal-index
44784: ** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs,
44785: ** then an SQLite error code is returned and *ppPage is set to 0.
44786: */
44787: static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){
44788: int rc = SQLITE_OK;
44789:
44790: /* Enlarge the pWal->apWiData[] array if required */
44791: if( pWal->nWiData<=iPage ){
44792: int nByte = sizeof(u32*)*(iPage+1);
44793: volatile u32 **apNew;
44794: apNew = (volatile u32 **)sqlite3_realloc((void *)pWal->apWiData, nByte);
44795: if( !apNew ){
44796: *ppPage = 0;
44797: return SQLITE_NOMEM;
44798: }
44799: memset((void*)&apNew[pWal->nWiData], 0,
44800: sizeof(u32*)*(iPage+1-pWal->nWiData));
44801: pWal->apWiData = apNew;
44802: pWal->nWiData = iPage+1;
44803: }
44804:
44805: /* Request a pointer to the required page from the VFS */
44806: if( pWal->apWiData[iPage]==0 ){
44807: if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
44808: pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ);
44809: if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM;
44810: }else{
44811: rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ,
44812: pWal->writeLock, (void volatile **)&pWal->apWiData[iPage]
44813: );
44814: if( rc==SQLITE_READONLY ){
44815: pWal->readOnly |= WAL_SHM_RDONLY;
44816: rc = SQLITE_OK;
44817: }
44818: }
44819: }
44820:
44821: *ppPage = pWal->apWiData[iPage];
44822: assert( iPage==0 || *ppPage || rc!=SQLITE_OK );
44823: return rc;
44824: }
44825:
44826: /*
44827: ** Return a pointer to the WalCkptInfo structure in the wal-index.
44828: */
44829: static volatile WalCkptInfo *walCkptInfo(Wal *pWal){
44830: assert( pWal->nWiData>0 && pWal->apWiData[0] );
44831: return (volatile WalCkptInfo*)&(pWal->apWiData[0][sizeof(WalIndexHdr)/2]);
44832: }
44833:
44834: /*
44835: ** Return a pointer to the WalIndexHdr structure in the wal-index.
44836: */
44837: static volatile WalIndexHdr *walIndexHdr(Wal *pWal){
44838: assert( pWal->nWiData>0 && pWal->apWiData[0] );
44839: return (volatile WalIndexHdr*)pWal->apWiData[0];
44840: }
44841:
44842: /*
44843: ** The argument to this macro must be of type u32. On a little-endian
44844: ** architecture, it returns the u32 value that results from interpreting
44845: ** the 4 bytes as a big-endian value. On a big-endian architecture, it
44846: ** returns the value that would be produced by intepreting the 4 bytes
44847: ** of the input value as a little-endian integer.
44848: */
44849: #define BYTESWAP32(x) ( \
44850: (((x)&0x000000FF)<<24) + (((x)&0x0000FF00)<<8) \
44851: + (((x)&0x00FF0000)>>8) + (((x)&0xFF000000)>>24) \
44852: )
44853:
44854: /*
44855: ** Generate or extend an 8 byte checksum based on the data in
44856: ** array aByte[] and the initial values of aIn[0] and aIn[1] (or
44857: ** initial values of 0 and 0 if aIn==NULL).
44858: **
44859: ** The checksum is written back into aOut[] before returning.
44860: **
44861: ** nByte must be a positive multiple of 8.
44862: */
44863: static void walChecksumBytes(
44864: int nativeCksum, /* True for native byte-order, false for non-native */
44865: u8 *a, /* Content to be checksummed */
44866: int nByte, /* Bytes of content in a[]. Must be a multiple of 8. */
44867: const u32 *aIn, /* Initial checksum value input */
44868: u32 *aOut /* OUT: Final checksum value output */
44869: ){
44870: u32 s1, s2;
44871: u32 *aData = (u32 *)a;
44872: u32 *aEnd = (u32 *)&a[nByte];
44873:
44874: if( aIn ){
44875: s1 = aIn[0];
44876: s2 = aIn[1];
44877: }else{
44878: s1 = s2 = 0;
44879: }
44880:
44881: assert( nByte>=8 );
44882: assert( (nByte&0x00000007)==0 );
44883:
44884: if( nativeCksum ){
44885: do {
44886: s1 += *aData++ + s2;
44887: s2 += *aData++ + s1;
44888: }while( aData<aEnd );
44889: }else{
44890: do {
44891: s1 += BYTESWAP32(aData[0]) + s2;
44892: s2 += BYTESWAP32(aData[1]) + s1;
44893: aData += 2;
44894: }while( aData<aEnd );
44895: }
44896:
44897: aOut[0] = s1;
44898: aOut[1] = s2;
44899: }
44900:
44901: static void walShmBarrier(Wal *pWal){
44902: if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){
44903: sqlite3OsShmBarrier(pWal->pDbFd);
44904: }
44905: }
44906:
44907: /*
44908: ** Write the header information in pWal->hdr into the wal-index.
44909: **
44910: ** The checksum on pWal->hdr is updated before it is written.
44911: */
44912: static void walIndexWriteHdr(Wal *pWal){
44913: volatile WalIndexHdr *aHdr = walIndexHdr(pWal);
44914: const int nCksum = offsetof(WalIndexHdr, aCksum);
44915:
44916: assert( pWal->writeLock );
44917: pWal->hdr.isInit = 1;
44918: pWal->hdr.iVersion = WALINDEX_MAX_VERSION;
44919: walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum);
44920: memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr));
44921: walShmBarrier(pWal);
44922: memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr));
44923: }
44924:
44925: /*
44926: ** This function encodes a single frame header and writes it to a buffer
44927: ** supplied by the caller. A frame-header is made up of a series of
44928: ** 4-byte big-endian integers, as follows:
44929: **
44930: ** 0: Page number.
44931: ** 4: For commit records, the size of the database image in pages
44932: ** after the commit. For all other records, zero.
44933: ** 8: Salt-1 (copied from the wal-header)
44934: ** 12: Salt-2 (copied from the wal-header)
44935: ** 16: Checksum-1.
44936: ** 20: Checksum-2.
44937: */
44938: static void walEncodeFrame(
44939: Wal *pWal, /* The write-ahead log */
44940: u32 iPage, /* Database page number for frame */
44941: u32 nTruncate, /* New db size (or 0 for non-commit frames) */
44942: u8 *aData, /* Pointer to page data */
44943: u8 *aFrame /* OUT: Write encoded frame here */
44944: ){
44945: int nativeCksum; /* True for native byte-order checksums */
44946: u32 *aCksum = pWal->hdr.aFrameCksum;
44947: assert( WAL_FRAME_HDRSIZE==24 );
44948: sqlite3Put4byte(&aFrame[0], iPage);
44949: sqlite3Put4byte(&aFrame[4], nTruncate);
44950: memcpy(&aFrame[8], pWal->hdr.aSalt, 8);
44951:
44952: nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
44953: walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
44954: walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
44955:
44956: sqlite3Put4byte(&aFrame[16], aCksum[0]);
44957: sqlite3Put4byte(&aFrame[20], aCksum[1]);
44958: }
44959:
44960: /*
44961: ** Check to see if the frame with header in aFrame[] and content
44962: ** in aData[] is valid. If it is a valid frame, fill *piPage and
44963: ** *pnTruncate and return true. Return if the frame is not valid.
44964: */
44965: static int walDecodeFrame(
44966: Wal *pWal, /* The write-ahead log */
44967: u32 *piPage, /* OUT: Database page number for frame */
44968: u32 *pnTruncate, /* OUT: New db size (or 0 if not commit) */
44969: u8 *aData, /* Pointer to page data (for checksum) */
44970: u8 *aFrame /* Frame data */
44971: ){
44972: int nativeCksum; /* True for native byte-order checksums */
44973: u32 *aCksum = pWal->hdr.aFrameCksum;
44974: u32 pgno; /* Page number of the frame */
44975: assert( WAL_FRAME_HDRSIZE==24 );
44976:
44977: /* A frame is only valid if the salt values in the frame-header
44978: ** match the salt values in the wal-header.
44979: */
44980: if( memcmp(&pWal->hdr.aSalt, &aFrame[8], 8)!=0 ){
44981: return 0;
44982: }
44983:
44984: /* A frame is only valid if the page number is creater than zero.
44985: */
44986: pgno = sqlite3Get4byte(&aFrame[0]);
44987: if( pgno==0 ){
44988: return 0;
44989: }
44990:
44991: /* A frame is only valid if a checksum of the WAL header,
44992: ** all prior frams, the first 16 bytes of this frame-header,
44993: ** and the frame-data matches the checksum in the last 8
44994: ** bytes of this frame-header.
44995: */
44996: nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN);
44997: walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum);
44998: walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum);
44999: if( aCksum[0]!=sqlite3Get4byte(&aFrame[16])
45000: || aCksum[1]!=sqlite3Get4byte(&aFrame[20])
45001: ){
45002: /* Checksum failed. */
45003: return 0;
45004: }
45005:
45006: /* If we reach this point, the frame is valid. Return the page number
45007: ** and the new database size.
45008: */
45009: *piPage = pgno;
45010: *pnTruncate = sqlite3Get4byte(&aFrame[4]);
45011: return 1;
45012: }
45013:
45014:
45015: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
45016: /*
45017: ** Names of locks. This routine is used to provide debugging output and is not
45018: ** a part of an ordinary build.
45019: */
45020: static const char *walLockName(int lockIdx){
45021: if( lockIdx==WAL_WRITE_LOCK ){
45022: return "WRITE-LOCK";
45023: }else if( lockIdx==WAL_CKPT_LOCK ){
45024: return "CKPT-LOCK";
45025: }else if( lockIdx==WAL_RECOVER_LOCK ){
45026: return "RECOVER-LOCK";
45027: }else{
45028: static char zName[15];
45029: sqlite3_snprintf(sizeof(zName), zName, "READ-LOCK[%d]",
45030: lockIdx-WAL_READ_LOCK(0));
45031: return zName;
45032: }
45033: }
45034: #endif /*defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */
45035:
45036:
45037: /*
45038: ** Set or release locks on the WAL. Locks are either shared or exclusive.
45039: ** A lock cannot be moved directly between shared and exclusive - it must go
45040: ** through the unlocked state first.
45041: **
45042: ** In locking_mode=EXCLUSIVE, all of these routines become no-ops.
45043: */
45044: static int walLockShared(Wal *pWal, int lockIdx){
45045: int rc;
45046: if( pWal->exclusiveMode ) return SQLITE_OK;
45047: rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1,
45048: SQLITE_SHM_LOCK | SQLITE_SHM_SHARED);
45049: WALTRACE(("WAL%p: acquire SHARED-%s %s\n", pWal,
45050: walLockName(lockIdx), rc ? "failed" : "ok"));
45051: VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); )
45052: return rc;
45053: }
45054: static void walUnlockShared(Wal *pWal, int lockIdx){
45055: if( pWal->exclusiveMode ) return;
45056: (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, 1,
45057: SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED);
45058: WALTRACE(("WAL%p: release SHARED-%s\n", pWal, walLockName(lockIdx)));
45059: }
45060: static int walLockExclusive(Wal *pWal, int lockIdx, int n){
45061: int rc;
45062: if( pWal->exclusiveMode ) return SQLITE_OK;
45063: rc = sqlite3OsShmLock(pWal->pDbFd, lockIdx, n,
45064: SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE);
45065: WALTRACE(("WAL%p: acquire EXCLUSIVE-%s cnt=%d %s\n", pWal,
45066: walLockName(lockIdx), n, rc ? "failed" : "ok"));
45067: VVA_ONLY( pWal->lockError = (u8)(rc!=SQLITE_OK && rc!=SQLITE_BUSY); )
45068: return rc;
45069: }
45070: static void walUnlockExclusive(Wal *pWal, int lockIdx, int n){
45071: if( pWal->exclusiveMode ) return;
45072: (void)sqlite3OsShmLock(pWal->pDbFd, lockIdx, n,
45073: SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE);
45074: WALTRACE(("WAL%p: release EXCLUSIVE-%s cnt=%d\n", pWal,
45075: walLockName(lockIdx), n));
45076: }
45077:
45078: /*
45079: ** Compute a hash on a page number. The resulting hash value must land
45080: ** between 0 and (HASHTABLE_NSLOT-1). The walHashNext() function advances
45081: ** the hash to the next value in the event of a collision.
45082: */
45083: static int walHash(u32 iPage){
45084: assert( iPage>0 );
45085: assert( (HASHTABLE_NSLOT & (HASHTABLE_NSLOT-1))==0 );
45086: return (iPage*HASHTABLE_HASH_1) & (HASHTABLE_NSLOT-1);
45087: }
45088: static int walNextHash(int iPriorHash){
45089: return (iPriorHash+1)&(HASHTABLE_NSLOT-1);
45090: }
45091:
45092: /*
45093: ** Return pointers to the hash table and page number array stored on
45094: ** page iHash of the wal-index. The wal-index is broken into 32KB pages
45095: ** numbered starting from 0.
45096: **
45097: ** Set output variable *paHash to point to the start of the hash table
45098: ** in the wal-index file. Set *piZero to one less than the frame
45099: ** number of the first frame indexed by this hash table. If a
45100: ** slot in the hash table is set to N, it refers to frame number
45101: ** (*piZero+N) in the log.
45102: **
45103: ** Finally, set *paPgno so that *paPgno[1] is the page number of the
45104: ** first frame indexed by the hash table, frame (*piZero+1).
45105: */
45106: static int walHashGet(
45107: Wal *pWal, /* WAL handle */
45108: int iHash, /* Find the iHash'th table */
45109: volatile ht_slot **paHash, /* OUT: Pointer to hash index */
45110: volatile u32 **paPgno, /* OUT: Pointer to page number array */
45111: u32 *piZero /* OUT: Frame associated with *paPgno[0] */
45112: ){
45113: int rc; /* Return code */
45114: volatile u32 *aPgno;
45115:
45116: rc = walIndexPage(pWal, iHash, &aPgno);
45117: assert( rc==SQLITE_OK || iHash>0 );
45118:
45119: if( rc==SQLITE_OK ){
45120: u32 iZero;
45121: volatile ht_slot *aHash;
45122:
45123: aHash = (volatile ht_slot *)&aPgno[HASHTABLE_NPAGE];
45124: if( iHash==0 ){
45125: aPgno = &aPgno[WALINDEX_HDR_SIZE/sizeof(u32)];
45126: iZero = 0;
45127: }else{
45128: iZero = HASHTABLE_NPAGE_ONE + (iHash-1)*HASHTABLE_NPAGE;
45129: }
45130:
45131: *paPgno = &aPgno[-1];
45132: *paHash = aHash;
45133: *piZero = iZero;
45134: }
45135: return rc;
45136: }
45137:
45138: /*
45139: ** Return the number of the wal-index page that contains the hash-table
45140: ** and page-number array that contain entries corresponding to WAL frame
45141: ** iFrame. The wal-index is broken up into 32KB pages. Wal-index pages
45142: ** are numbered starting from 0.
45143: */
45144: static int walFramePage(u32 iFrame){
45145: int iHash = (iFrame+HASHTABLE_NPAGE-HASHTABLE_NPAGE_ONE-1) / HASHTABLE_NPAGE;
45146: assert( (iHash==0 || iFrame>HASHTABLE_NPAGE_ONE)
45147: && (iHash>=1 || iFrame<=HASHTABLE_NPAGE_ONE)
45148: && (iHash<=1 || iFrame>(HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE))
45149: && (iHash>=2 || iFrame<=HASHTABLE_NPAGE_ONE+HASHTABLE_NPAGE)
45150: && (iHash<=2 || iFrame>(HASHTABLE_NPAGE_ONE+2*HASHTABLE_NPAGE))
45151: );
45152: return iHash;
45153: }
45154:
45155: /*
45156: ** Return the page number associated with frame iFrame in this WAL.
45157: */
45158: static u32 walFramePgno(Wal *pWal, u32 iFrame){
45159: int iHash = walFramePage(iFrame);
45160: if( iHash==0 ){
45161: return pWal->apWiData[0][WALINDEX_HDR_SIZE/sizeof(u32) + iFrame - 1];
45162: }
45163: return pWal->apWiData[iHash][(iFrame-1-HASHTABLE_NPAGE_ONE)%HASHTABLE_NPAGE];
45164: }
45165:
45166: /*
45167: ** Remove entries from the hash table that point to WAL slots greater
45168: ** than pWal->hdr.mxFrame.
45169: **
45170: ** This function is called whenever pWal->hdr.mxFrame is decreased due
45171: ** to a rollback or savepoint.
45172: **
45173: ** At most only the hash table containing pWal->hdr.mxFrame needs to be
45174: ** updated. Any later hash tables will be automatically cleared when
45175: ** pWal->hdr.mxFrame advances to the point where those hash tables are
45176: ** actually needed.
45177: */
45178: static void walCleanupHash(Wal *pWal){
45179: volatile ht_slot *aHash = 0; /* Pointer to hash table to clear */
45180: volatile u32 *aPgno = 0; /* Page number array for hash table */
45181: u32 iZero = 0; /* frame == (aHash[x]+iZero) */
45182: int iLimit = 0; /* Zero values greater than this */
45183: int nByte; /* Number of bytes to zero in aPgno[] */
45184: int i; /* Used to iterate through aHash[] */
45185:
45186: assert( pWal->writeLock );
45187: testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE-1 );
45188: testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE );
45189: testcase( pWal->hdr.mxFrame==HASHTABLE_NPAGE_ONE+1 );
45190:
45191: if( pWal->hdr.mxFrame==0 ) return;
45192:
45193: /* Obtain pointers to the hash-table and page-number array containing
45194: ** the entry that corresponds to frame pWal->hdr.mxFrame. It is guaranteed
45195: ** that the page said hash-table and array reside on is already mapped.
45196: */
45197: assert( pWal->nWiData>walFramePage(pWal->hdr.mxFrame) );
45198: assert( pWal->apWiData[walFramePage(pWal->hdr.mxFrame)] );
45199: walHashGet(pWal, walFramePage(pWal->hdr.mxFrame), &aHash, &aPgno, &iZero);
45200:
45201: /* Zero all hash-table entries that correspond to frame numbers greater
45202: ** than pWal->hdr.mxFrame.
45203: */
45204: iLimit = pWal->hdr.mxFrame - iZero;
45205: assert( iLimit>0 );
45206: for(i=0; i<HASHTABLE_NSLOT; i++){
45207: if( aHash[i]>iLimit ){
45208: aHash[i] = 0;
45209: }
45210: }
45211:
45212: /* Zero the entries in the aPgno array that correspond to frames with
45213: ** frame numbers greater than pWal->hdr.mxFrame.
45214: */
45215: nByte = (int)((char *)aHash - (char *)&aPgno[iLimit+1]);
45216: memset((void *)&aPgno[iLimit+1], 0, nByte);
45217:
45218: #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
45219: /* Verify that the every entry in the mapping region is still reachable
45220: ** via the hash table even after the cleanup.
45221: */
45222: if( iLimit ){
45223: int i; /* Loop counter */
45224: int iKey; /* Hash key */
45225: for(i=1; i<=iLimit; i++){
45226: for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){
45227: if( aHash[iKey]==i ) break;
45228: }
45229: assert( aHash[iKey]==i );
45230: }
45231: }
45232: #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
45233: }
45234:
45235:
45236: /*
45237: ** Set an entry in the wal-index that will map database page number
45238: ** pPage into WAL frame iFrame.
45239: */
45240: static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){
45241: int rc; /* Return code */
45242: u32 iZero = 0; /* One less than frame number of aPgno[1] */
45243: volatile u32 *aPgno = 0; /* Page number array */
45244: volatile ht_slot *aHash = 0; /* Hash table */
45245:
45246: rc = walHashGet(pWal, walFramePage(iFrame), &aHash, &aPgno, &iZero);
45247:
45248: /* Assuming the wal-index file was successfully mapped, populate the
45249: ** page number array and hash table entry.
45250: */
45251: if( rc==SQLITE_OK ){
45252: int iKey; /* Hash table key */
45253: int idx; /* Value to write to hash-table slot */
45254: int nCollide; /* Number of hash collisions */
45255:
45256: idx = iFrame - iZero;
45257: assert( idx <= HASHTABLE_NSLOT/2 + 1 );
45258:
45259: /* If this is the first entry to be added to this hash-table, zero the
45260: ** entire hash table and aPgno[] array before proceding.
45261: */
45262: if( idx==1 ){
45263: int nByte = (int)((u8 *)&aHash[HASHTABLE_NSLOT] - (u8 *)&aPgno[1]);
45264: memset((void*)&aPgno[1], 0, nByte);
45265: }
45266:
45267: /* If the entry in aPgno[] is already set, then the previous writer
45268: ** must have exited unexpectedly in the middle of a transaction (after
45269: ** writing one or more dirty pages to the WAL to free up memory).
45270: ** Remove the remnants of that writers uncommitted transaction from
45271: ** the hash-table before writing any new entries.
45272: */
45273: if( aPgno[idx] ){
45274: walCleanupHash(pWal);
45275: assert( !aPgno[idx] );
45276: }
45277:
45278: /* Write the aPgno[] array entry and the hash-table slot. */
45279: nCollide = idx;
45280: for(iKey=walHash(iPage); aHash[iKey]; iKey=walNextHash(iKey)){
45281: if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT;
45282: }
45283: aPgno[idx] = iPage;
45284: aHash[iKey] = (ht_slot)idx;
45285:
45286: #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
45287: /* Verify that the number of entries in the hash table exactly equals
45288: ** the number of entries in the mapping region.
45289: */
45290: {
45291: int i; /* Loop counter */
45292: int nEntry = 0; /* Number of entries in the hash table */
45293: for(i=0; i<HASHTABLE_NSLOT; i++){ if( aHash[i] ) nEntry++; }
45294: assert( nEntry==idx );
45295: }
45296:
45297: /* Verify that the every entry in the mapping region is reachable
45298: ** via the hash table. This turns out to be a really, really expensive
45299: ** thing to check, so only do this occasionally - not on every
45300: ** iteration.
45301: */
45302: if( (idx&0x3ff)==0 ){
45303: int i; /* Loop counter */
45304: for(i=1; i<=idx; i++){
45305: for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){
45306: if( aHash[iKey]==i ) break;
45307: }
45308: assert( aHash[iKey]==i );
45309: }
45310: }
45311: #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */
45312: }
45313:
45314:
45315: return rc;
45316: }
45317:
45318:
45319: /*
45320: ** Recover the wal-index by reading the write-ahead log file.
45321: **
45322: ** This routine first tries to establish an exclusive lock on the
45323: ** wal-index to prevent other threads/processes from doing anything
45324: ** with the WAL or wal-index while recovery is running. The
45325: ** WAL_RECOVER_LOCK is also held so that other threads will know
45326: ** that this thread is running recovery. If unable to establish
45327: ** the necessary locks, this routine returns SQLITE_BUSY.
45328: */
45329: static int walIndexRecover(Wal *pWal){
45330: int rc; /* Return Code */
45331: i64 nSize; /* Size of log file */
45332: u32 aFrameCksum[2] = {0, 0};
45333: int iLock; /* Lock offset to lock for checkpoint */
45334: int nLock; /* Number of locks to hold */
45335:
45336: /* Obtain an exclusive lock on all byte in the locking range not already
45337: ** locked by the caller. The caller is guaranteed to have locked the
45338: ** WAL_WRITE_LOCK byte, and may have also locked the WAL_CKPT_LOCK byte.
45339: ** If successful, the same bytes that are locked here are unlocked before
45340: ** this function returns.
45341: */
45342: assert( pWal->ckptLock==1 || pWal->ckptLock==0 );
45343: assert( WAL_ALL_BUT_WRITE==WAL_WRITE_LOCK+1 );
45344: assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE );
45345: assert( pWal->writeLock );
45346: iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock;
45347: nLock = SQLITE_SHM_NLOCK - iLock;
45348: rc = walLockExclusive(pWal, iLock, nLock);
45349: if( rc ){
45350: return rc;
45351: }
45352: WALTRACE(("WAL%p: recovery begin...\n", pWal));
45353:
45354: memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
45355:
45356: rc = sqlite3OsFileSize(pWal->pWalFd, &nSize);
45357: if( rc!=SQLITE_OK ){
45358: goto recovery_error;
45359: }
45360:
45361: if( nSize>WAL_HDRSIZE ){
45362: u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */
45363: u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */
45364: int szFrame; /* Number of bytes in buffer aFrame[] */
45365: u8 *aData; /* Pointer to data part of aFrame buffer */
45366: int iFrame; /* Index of last frame read */
45367: i64 iOffset; /* Next offset to read from log file */
45368: int szPage; /* Page size according to the log */
45369: u32 magic; /* Magic value read from WAL header */
45370: u32 version; /* Magic value read from WAL header */
45371: int isValid; /* True if this frame is valid */
45372:
45373: /* Read in the WAL header. */
45374: rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0);
45375: if( rc!=SQLITE_OK ){
45376: goto recovery_error;
45377: }
45378:
45379: /* If the database page size is not a power of two, or is greater than
45380: ** SQLITE_MAX_PAGE_SIZE, conclude that the WAL file contains no valid
45381: ** data. Similarly, if the 'magic' value is invalid, ignore the whole
45382: ** WAL file.
45383: */
45384: magic = sqlite3Get4byte(&aBuf[0]);
45385: szPage = sqlite3Get4byte(&aBuf[8]);
45386: if( (magic&0xFFFFFFFE)!=WAL_MAGIC
45387: || szPage&(szPage-1)
45388: || szPage>SQLITE_MAX_PAGE_SIZE
45389: || szPage<512
45390: ){
45391: goto finished;
45392: }
45393: pWal->hdr.bigEndCksum = (u8)(magic&0x00000001);
45394: pWal->szPage = szPage;
45395: pWal->nCkpt = sqlite3Get4byte(&aBuf[12]);
45396: memcpy(&pWal->hdr.aSalt, &aBuf[16], 8);
45397:
45398: /* Verify that the WAL header checksum is correct */
45399: walChecksumBytes(pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN,
45400: aBuf, WAL_HDRSIZE-2*4, 0, pWal->hdr.aFrameCksum
45401: );
45402: if( pWal->hdr.aFrameCksum[0]!=sqlite3Get4byte(&aBuf[24])
45403: || pWal->hdr.aFrameCksum[1]!=sqlite3Get4byte(&aBuf[28])
45404: ){
45405: goto finished;
45406: }
45407:
45408: /* Verify that the version number on the WAL format is one that
45409: ** are able to understand */
45410: version = sqlite3Get4byte(&aBuf[4]);
45411: if( version!=WAL_MAX_VERSION ){
45412: rc = SQLITE_CANTOPEN_BKPT;
45413: goto finished;
45414: }
45415:
45416: /* Malloc a buffer to read frames into. */
45417: szFrame = szPage + WAL_FRAME_HDRSIZE;
45418: aFrame = (u8 *)sqlite3_malloc(szFrame);
45419: if( !aFrame ){
45420: rc = SQLITE_NOMEM;
45421: goto recovery_error;
45422: }
45423: aData = &aFrame[WAL_FRAME_HDRSIZE];
45424:
45425: /* Read all frames from the log file. */
45426: iFrame = 0;
45427: for(iOffset=WAL_HDRSIZE; (iOffset+szFrame)<=nSize; iOffset+=szFrame){
45428: u32 pgno; /* Database page number for frame */
45429: u32 nTruncate; /* dbsize field from frame header */
45430:
45431: /* Read and decode the next log frame. */
45432: iFrame++;
45433: rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset);
45434: if( rc!=SQLITE_OK ) break;
45435: isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame);
45436: if( !isValid ) break;
45437: rc = walIndexAppend(pWal, iFrame, pgno);
45438: if( rc!=SQLITE_OK ) break;
45439:
45440: /* If nTruncate is non-zero, this is a commit record. */
45441: if( nTruncate ){
45442: pWal->hdr.mxFrame = iFrame;
45443: pWal->hdr.nPage = nTruncate;
45444: pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16));
45445: testcase( szPage<=32768 );
45446: testcase( szPage>=65536 );
45447: aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
45448: aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
45449: }
45450: }
45451:
45452: sqlite3_free(aFrame);
45453: }
45454:
45455: finished:
45456: if( rc==SQLITE_OK ){
45457: volatile WalCkptInfo *pInfo;
45458: int i;
45459: pWal->hdr.aFrameCksum[0] = aFrameCksum[0];
45460: pWal->hdr.aFrameCksum[1] = aFrameCksum[1];
45461: walIndexWriteHdr(pWal);
45462:
45463: /* Reset the checkpoint-header. This is safe because this thread is
45464: ** currently holding locks that exclude all other readers, writers and
45465: ** checkpointers.
45466: */
45467: pInfo = walCkptInfo(pWal);
45468: pInfo->nBackfill = 0;
45469: pInfo->aReadMark[0] = 0;
45470: for(i=1; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
1.2.2.1 ! misho 45471: if( pWal->hdr.mxFrame ) pInfo->aReadMark[1] = pWal->hdr.mxFrame;
1.2 misho 45472:
45473: /* If more than one frame was recovered from the log file, report an
45474: ** event via sqlite3_log(). This is to help with identifying performance
45475: ** problems caused by applications routinely shutting down without
45476: ** checkpointing the log file.
45477: */
45478: if( pWal->hdr.nPage ){
45479: sqlite3_log(SQLITE_OK, "Recovered %d frames from WAL file %s",
45480: pWal->hdr.nPage, pWal->zWalName
45481: );
45482: }
45483: }
45484:
45485: recovery_error:
45486: WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok"));
45487: walUnlockExclusive(pWal, iLock, nLock);
45488: return rc;
45489: }
45490:
45491: /*
45492: ** Close an open wal-index.
45493: */
45494: static void walIndexClose(Wal *pWal, int isDelete){
45495: if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){
45496: int i;
45497: for(i=0; i<pWal->nWiData; i++){
45498: sqlite3_free((void *)pWal->apWiData[i]);
45499: pWal->apWiData[i] = 0;
45500: }
45501: }else{
45502: sqlite3OsShmUnmap(pWal->pDbFd, isDelete);
45503: }
45504: }
45505:
45506: /*
45507: ** Open a connection to the WAL file zWalName. The database file must
45508: ** already be opened on connection pDbFd. The buffer that zWalName points
45509: ** to must remain valid for the lifetime of the returned Wal* handle.
45510: **
45511: ** A SHARED lock should be held on the database file when this function
45512: ** is called. The purpose of this SHARED lock is to prevent any other
45513: ** client from unlinking the WAL or wal-index file. If another process
45514: ** were to do this just after this client opened one of these files, the
45515: ** system would be badly broken.
45516: **
45517: ** If the log file is successfully opened, SQLITE_OK is returned and
45518: ** *ppWal is set to point to a new WAL handle. If an error occurs,
45519: ** an SQLite error code is returned and *ppWal is left unmodified.
45520: */
45521: SQLITE_PRIVATE int sqlite3WalOpen(
45522: sqlite3_vfs *pVfs, /* vfs module to open wal and wal-index */
45523: sqlite3_file *pDbFd, /* The open database file */
45524: const char *zWalName, /* Name of the WAL file */
45525: int bNoShm, /* True to run in heap-memory mode */
45526: i64 mxWalSize, /* Truncate WAL to this size on reset */
45527: Wal **ppWal /* OUT: Allocated Wal handle */
45528: ){
45529: int rc; /* Return Code */
45530: Wal *pRet; /* Object to allocate and return */
45531: int flags; /* Flags passed to OsOpen() */
45532:
45533: assert( zWalName && zWalName[0] );
45534: assert( pDbFd );
45535:
45536: /* In the amalgamation, the os_unix.c and os_win.c source files come before
45537: ** this source file. Verify that the #defines of the locking byte offsets
45538: ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value.
45539: */
45540: #ifdef WIN_SHM_BASE
45541: assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET );
45542: #endif
45543: #ifdef UNIX_SHM_BASE
45544: assert( UNIX_SHM_BASE==WALINDEX_LOCK_OFFSET );
45545: #endif
45546:
45547:
45548: /* Allocate an instance of struct Wal to return. */
45549: *ppWal = 0;
45550: pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile);
45551: if( !pRet ){
45552: return SQLITE_NOMEM;
45553: }
45554:
45555: pRet->pVfs = pVfs;
45556: pRet->pWalFd = (sqlite3_file *)&pRet[1];
45557: pRet->pDbFd = pDbFd;
45558: pRet->readLock = -1;
45559: pRet->mxWalSize = mxWalSize;
45560: pRet->zWalName = zWalName;
45561: pRet->syncHeader = 1;
45562: pRet->padToSectorBoundary = 1;
45563: pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE);
45564:
45565: /* Open file handle on the write-ahead log file. */
45566: flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_WAL);
45567: rc = sqlite3OsOpen(pVfs, zWalName, pRet->pWalFd, flags, &flags);
45568: if( rc==SQLITE_OK && flags&SQLITE_OPEN_READONLY ){
45569: pRet->readOnly = WAL_RDONLY;
45570: }
45571:
45572: if( rc!=SQLITE_OK ){
45573: walIndexClose(pRet, 0);
45574: sqlite3OsClose(pRet->pWalFd);
45575: sqlite3_free(pRet);
45576: }else{
45577: int iDC = sqlite3OsDeviceCharacteristics(pRet->pWalFd);
45578: if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; }
45579: if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){
45580: pRet->padToSectorBoundary = 0;
45581: }
45582: *ppWal = pRet;
45583: WALTRACE(("WAL%d: opened\n", pRet));
45584: }
45585: return rc;
45586: }
45587:
45588: /*
45589: ** Change the size to which the WAL file is trucated on each reset.
45590: */
45591: SQLITE_PRIVATE void sqlite3WalLimit(Wal *pWal, i64 iLimit){
45592: if( pWal ) pWal->mxWalSize = iLimit;
45593: }
45594:
45595: /*
45596: ** Find the smallest page number out of all pages held in the WAL that
45597: ** has not been returned by any prior invocation of this method on the
45598: ** same WalIterator object. Write into *piFrame the frame index where
45599: ** that page was last written into the WAL. Write into *piPage the page
45600: ** number.
45601: **
45602: ** Return 0 on success. If there are no pages in the WAL with a page
45603: ** number larger than *piPage, then return 1.
45604: */
45605: static int walIteratorNext(
45606: WalIterator *p, /* Iterator */
45607: u32 *piPage, /* OUT: The page number of the next page */
45608: u32 *piFrame /* OUT: Wal frame index of next page */
45609: ){
45610: u32 iMin; /* Result pgno must be greater than iMin */
45611: u32 iRet = 0xFFFFFFFF; /* 0xffffffff is never a valid page number */
45612: int i; /* For looping through segments */
45613:
45614: iMin = p->iPrior;
45615: assert( iMin<0xffffffff );
45616: for(i=p->nSegment-1; i>=0; i--){
45617: struct WalSegment *pSegment = &p->aSegment[i];
45618: while( pSegment->iNext<pSegment->nEntry ){
45619: u32 iPg = pSegment->aPgno[pSegment->aIndex[pSegment->iNext]];
45620: if( iPg>iMin ){
45621: if( iPg<iRet ){
45622: iRet = iPg;
45623: *piFrame = pSegment->iZero + pSegment->aIndex[pSegment->iNext];
45624: }
45625: break;
45626: }
45627: pSegment->iNext++;
45628: }
45629: }
45630:
45631: *piPage = p->iPrior = iRet;
45632: return (iRet==0xFFFFFFFF);
45633: }
45634:
45635: /*
45636: ** This function merges two sorted lists into a single sorted list.
45637: **
45638: ** aLeft[] and aRight[] are arrays of indices. The sort key is
45639: ** aContent[aLeft[]] and aContent[aRight[]]. Upon entry, the following
45640: ** is guaranteed for all J<K:
45641: **
45642: ** aContent[aLeft[J]] < aContent[aLeft[K]]
45643: ** aContent[aRight[J]] < aContent[aRight[K]]
45644: **
45645: ** This routine overwrites aRight[] with a new (probably longer) sequence
45646: ** of indices such that the aRight[] contains every index that appears in
45647: ** either aLeft[] or the old aRight[] and such that the second condition
45648: ** above is still met.
45649: **
45650: ** The aContent[aLeft[X]] values will be unique for all X. And the
45651: ** aContent[aRight[X]] values will be unique too. But there might be
45652: ** one or more combinations of X and Y such that
45653: **
45654: ** aLeft[X]!=aRight[Y] && aContent[aLeft[X]] == aContent[aRight[Y]]
45655: **
45656: ** When that happens, omit the aLeft[X] and use the aRight[Y] index.
45657: */
45658: static void walMerge(
45659: const u32 *aContent, /* Pages in wal - keys for the sort */
45660: ht_slot *aLeft, /* IN: Left hand input list */
45661: int nLeft, /* IN: Elements in array *paLeft */
45662: ht_slot **paRight, /* IN/OUT: Right hand input list */
45663: int *pnRight, /* IN/OUT: Elements in *paRight */
45664: ht_slot *aTmp /* Temporary buffer */
45665: ){
45666: int iLeft = 0; /* Current index in aLeft */
45667: int iRight = 0; /* Current index in aRight */
45668: int iOut = 0; /* Current index in output buffer */
45669: int nRight = *pnRight;
45670: ht_slot *aRight = *paRight;
45671:
45672: assert( nLeft>0 && nRight>0 );
45673: while( iRight<nRight || iLeft<nLeft ){
45674: ht_slot logpage;
45675: Pgno dbpage;
45676:
45677: if( (iLeft<nLeft)
45678: && (iRight>=nRight || aContent[aLeft[iLeft]]<aContent[aRight[iRight]])
45679: ){
45680: logpage = aLeft[iLeft++];
45681: }else{
45682: logpage = aRight[iRight++];
45683: }
45684: dbpage = aContent[logpage];
45685:
45686: aTmp[iOut++] = logpage;
45687: if( iLeft<nLeft && aContent[aLeft[iLeft]]==dbpage ) iLeft++;
45688:
45689: assert( iLeft>=nLeft || aContent[aLeft[iLeft]]>dbpage );
45690: assert( iRight>=nRight || aContent[aRight[iRight]]>dbpage );
45691: }
45692:
45693: *paRight = aLeft;
45694: *pnRight = iOut;
45695: memcpy(aLeft, aTmp, sizeof(aTmp[0])*iOut);
45696: }
45697:
45698: /*
45699: ** Sort the elements in list aList using aContent[] as the sort key.
45700: ** Remove elements with duplicate keys, preferring to keep the
45701: ** larger aList[] values.
45702: **
45703: ** The aList[] entries are indices into aContent[]. The values in
45704: ** aList[] are to be sorted so that for all J<K:
45705: **
45706: ** aContent[aList[J]] < aContent[aList[K]]
45707: **
45708: ** For any X and Y such that
45709: **
45710: ** aContent[aList[X]] == aContent[aList[Y]]
45711: **
45712: ** Keep the larger of the two values aList[X] and aList[Y] and discard
45713: ** the smaller.
45714: */
45715: static void walMergesort(
45716: const u32 *aContent, /* Pages in wal */
45717: ht_slot *aBuffer, /* Buffer of at least *pnList items to use */
45718: ht_slot *aList, /* IN/OUT: List to sort */
45719: int *pnList /* IN/OUT: Number of elements in aList[] */
45720: ){
45721: struct Sublist {
45722: int nList; /* Number of elements in aList */
45723: ht_slot *aList; /* Pointer to sub-list content */
45724: };
45725:
45726: const int nList = *pnList; /* Size of input list */
45727: int nMerge = 0; /* Number of elements in list aMerge */
45728: ht_slot *aMerge = 0; /* List to be merged */
45729: int iList; /* Index into input list */
45730: int iSub = 0; /* Index into aSub array */
45731: struct Sublist aSub[13]; /* Array of sub-lists */
45732:
45733: memset(aSub, 0, sizeof(aSub));
45734: assert( nList<=HASHTABLE_NPAGE && nList>0 );
45735: assert( HASHTABLE_NPAGE==(1<<(ArraySize(aSub)-1)) );
45736:
45737: for(iList=0; iList<nList; iList++){
45738: nMerge = 1;
45739: aMerge = &aList[iList];
45740: for(iSub=0; iList & (1<<iSub); iSub++){
45741: struct Sublist *p = &aSub[iSub];
45742: assert( p->aList && p->nList<=(1<<iSub) );
45743: assert( p->aList==&aList[iList&~((2<<iSub)-1)] );
45744: walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer);
45745: }
45746: aSub[iSub].aList = aMerge;
45747: aSub[iSub].nList = nMerge;
45748: }
45749:
45750: for(iSub++; iSub<ArraySize(aSub); iSub++){
45751: if( nList & (1<<iSub) ){
45752: struct Sublist *p = &aSub[iSub];
45753: assert( p->nList<=(1<<iSub) );
45754: assert( p->aList==&aList[nList&~((2<<iSub)-1)] );
45755: walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer);
45756: }
45757: }
45758: assert( aMerge==aList );
45759: *pnList = nMerge;
45760:
45761: #ifdef SQLITE_DEBUG
45762: {
45763: int i;
45764: for(i=1; i<*pnList; i++){
45765: assert( aContent[aList[i]] > aContent[aList[i-1]] );
45766: }
45767: }
45768: #endif
45769: }
45770:
45771: /*
45772: ** Free an iterator allocated by walIteratorInit().
45773: */
45774: static void walIteratorFree(WalIterator *p){
45775: sqlite3ScratchFree(p);
45776: }
45777:
45778: /*
45779: ** Construct a WalInterator object that can be used to loop over all
45780: ** pages in the WAL in ascending order. The caller must hold the checkpoint
45781: ** lock.
45782: **
45783: ** On success, make *pp point to the newly allocated WalInterator object
45784: ** return SQLITE_OK. Otherwise, return an error code. If this routine
45785: ** returns an error, the value of *pp is undefined.
45786: **
45787: ** The calling routine should invoke walIteratorFree() to destroy the
45788: ** WalIterator object when it has finished with it.
45789: */
45790: static int walIteratorInit(Wal *pWal, WalIterator **pp){
45791: WalIterator *p; /* Return value */
45792: int nSegment; /* Number of segments to merge */
45793: u32 iLast; /* Last frame in log */
45794: int nByte; /* Number of bytes to allocate */
45795: int i; /* Iterator variable */
45796: ht_slot *aTmp; /* Temp space used by merge-sort */
45797: int rc = SQLITE_OK; /* Return Code */
45798:
45799: /* This routine only runs while holding the checkpoint lock. And
45800: ** it only runs if there is actually content in the log (mxFrame>0).
45801: */
45802: assert( pWal->ckptLock && pWal->hdr.mxFrame>0 );
45803: iLast = pWal->hdr.mxFrame;
45804:
45805: /* Allocate space for the WalIterator object. */
45806: nSegment = walFramePage(iLast) + 1;
45807: nByte = sizeof(WalIterator)
45808: + (nSegment-1)*sizeof(struct WalSegment)
45809: + iLast*sizeof(ht_slot);
45810: p = (WalIterator *)sqlite3ScratchMalloc(nByte);
45811: if( !p ){
45812: return SQLITE_NOMEM;
45813: }
45814: memset(p, 0, nByte);
45815: p->nSegment = nSegment;
45816:
45817: /* Allocate temporary space used by the merge-sort routine. This block
45818: ** of memory will be freed before this function returns.
45819: */
45820: aTmp = (ht_slot *)sqlite3ScratchMalloc(
45821: sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast)
45822: );
45823: if( !aTmp ){
45824: rc = SQLITE_NOMEM;
45825: }
45826:
45827: for(i=0; rc==SQLITE_OK && i<nSegment; i++){
45828: volatile ht_slot *aHash;
45829: u32 iZero;
45830: volatile u32 *aPgno;
45831:
45832: rc = walHashGet(pWal, i, &aHash, &aPgno, &iZero);
45833: if( rc==SQLITE_OK ){
45834: int j; /* Counter variable */
45835: int nEntry; /* Number of entries in this segment */
45836: ht_slot *aIndex; /* Sorted index for this segment */
45837:
45838: aPgno++;
45839: if( (i+1)==nSegment ){
45840: nEntry = (int)(iLast - iZero);
45841: }else{
45842: nEntry = (int)((u32*)aHash - (u32*)aPgno);
45843: }
45844: aIndex = &((ht_slot *)&p->aSegment[p->nSegment])[iZero];
45845: iZero++;
45846:
45847: for(j=0; j<nEntry; j++){
45848: aIndex[j] = (ht_slot)j;
45849: }
45850: walMergesort((u32 *)aPgno, aTmp, aIndex, &nEntry);
45851: p->aSegment[i].iZero = iZero;
45852: p->aSegment[i].nEntry = nEntry;
45853: p->aSegment[i].aIndex = aIndex;
45854: p->aSegment[i].aPgno = (u32 *)aPgno;
45855: }
45856: }
45857: sqlite3ScratchFree(aTmp);
45858:
45859: if( rc!=SQLITE_OK ){
45860: walIteratorFree(p);
45861: }
45862: *pp = p;
45863: return rc;
45864: }
45865:
45866: /*
45867: ** Attempt to obtain the exclusive WAL lock defined by parameters lockIdx and
45868: ** n. If the attempt fails and parameter xBusy is not NULL, then it is a
45869: ** busy-handler function. Invoke it and retry the lock until either the
45870: ** lock is successfully obtained or the busy-handler returns 0.
45871: */
45872: static int walBusyLock(
45873: Wal *pWal, /* WAL connection */
45874: int (*xBusy)(void*), /* Function to call when busy */
45875: void *pBusyArg, /* Context argument for xBusyHandler */
45876: int lockIdx, /* Offset of first byte to lock */
45877: int n /* Number of bytes to lock */
45878: ){
45879: int rc;
45880: do {
45881: rc = walLockExclusive(pWal, lockIdx, n);
45882: }while( xBusy && rc==SQLITE_BUSY && xBusy(pBusyArg) );
45883: return rc;
45884: }
45885:
45886: /*
45887: ** The cache of the wal-index header must be valid to call this function.
45888: ** Return the page-size in bytes used by the database.
45889: */
45890: static int walPagesize(Wal *pWal){
45891: return (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
45892: }
45893:
45894: /*
45895: ** Copy as much content as we can from the WAL back into the database file
45896: ** in response to an sqlite3_wal_checkpoint() request or the equivalent.
45897: **
45898: ** The amount of information copies from WAL to database might be limited
45899: ** by active readers. This routine will never overwrite a database page
45900: ** that a concurrent reader might be using.
45901: **
45902: ** All I/O barrier operations (a.k.a fsyncs) occur in this routine when
45903: ** SQLite is in WAL-mode in synchronous=NORMAL. That means that if
45904: ** checkpoints are always run by a background thread or background
45905: ** process, foreground threads will never block on a lengthy fsync call.
45906: **
45907: ** Fsync is called on the WAL before writing content out of the WAL and
45908: ** into the database. This ensures that if the new content is persistent
45909: ** in the WAL and can be recovered following a power-loss or hard reset.
45910: **
45911: ** Fsync is also called on the database file if (and only if) the entire
45912: ** WAL content is copied into the database file. This second fsync makes
45913: ** it safe to delete the WAL since the new content will persist in the
45914: ** database file.
45915: **
45916: ** This routine uses and updates the nBackfill field of the wal-index header.
45917: ** This is the only routine tha will increase the value of nBackfill.
45918: ** (A WAL reset or recovery will revert nBackfill to zero, but not increase
45919: ** its value.)
45920: **
45921: ** The caller must be holding sufficient locks to ensure that no other
45922: ** checkpoint is running (in any other thread or process) at the same
45923: ** time.
45924: */
45925: static int walCheckpoint(
45926: Wal *pWal, /* Wal connection */
45927: int eMode, /* One of PASSIVE, FULL or RESTART */
45928: int (*xBusyCall)(void*), /* Function to call when busy */
45929: void *pBusyArg, /* Context argument for xBusyHandler */
45930: int sync_flags, /* Flags for OsSync() (or 0) */
45931: u8 *zBuf /* Temporary buffer to use */
45932: ){
45933: int rc; /* Return code */
45934: int szPage; /* Database page-size */
45935: WalIterator *pIter = 0; /* Wal iterator context */
45936: u32 iDbpage = 0; /* Next database page to write */
45937: u32 iFrame = 0; /* Wal frame containing data for iDbpage */
45938: u32 mxSafeFrame; /* Max frame that can be backfilled */
45939: u32 mxPage; /* Max database page to write */
45940: int i; /* Loop counter */
45941: volatile WalCkptInfo *pInfo; /* The checkpoint status information */
45942: int (*xBusy)(void*) = 0; /* Function to call when waiting for locks */
45943:
45944: szPage = walPagesize(pWal);
45945: testcase( szPage<=32768 );
45946: testcase( szPage>=65536 );
45947: pInfo = walCkptInfo(pWal);
45948: if( pInfo->nBackfill>=pWal->hdr.mxFrame ) return SQLITE_OK;
45949:
45950: /* Allocate the iterator */
45951: rc = walIteratorInit(pWal, &pIter);
45952: if( rc!=SQLITE_OK ){
45953: return rc;
45954: }
45955: assert( pIter );
45956:
45957: if( eMode!=SQLITE_CHECKPOINT_PASSIVE ) xBusy = xBusyCall;
45958:
45959: /* Compute in mxSafeFrame the index of the last frame of the WAL that is
45960: ** safe to write into the database. Frames beyond mxSafeFrame might
45961: ** overwrite database pages that are in use by active readers and thus
45962: ** cannot be backfilled from the WAL.
45963: */
45964: mxSafeFrame = pWal->hdr.mxFrame;
45965: mxPage = pWal->hdr.nPage;
45966: for(i=1; i<WAL_NREADER; i++){
45967: u32 y = pInfo->aReadMark[i];
45968: if( mxSafeFrame>y ){
45969: assert( y<=pWal->hdr.mxFrame );
45970: rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(i), 1);
45971: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 45972: pInfo->aReadMark[i] = (i==1 ? mxSafeFrame : READMARK_NOT_USED);
1.2 misho 45973: walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1);
45974: }else if( rc==SQLITE_BUSY ){
45975: mxSafeFrame = y;
45976: xBusy = 0;
45977: }else{
45978: goto walcheckpoint_out;
45979: }
45980: }
45981: }
45982:
45983: if( pInfo->nBackfill<mxSafeFrame
45984: && (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0), 1))==SQLITE_OK
45985: ){
45986: i64 nSize; /* Current size of database file */
45987: u32 nBackfill = pInfo->nBackfill;
45988:
45989: /* Sync the WAL to disk */
45990: if( sync_flags ){
45991: rc = sqlite3OsSync(pWal->pWalFd, sync_flags);
45992: }
45993:
45994: /* If the database file may grow as a result of this checkpoint, hint
45995: ** about the eventual size of the db file to the VFS layer.
45996: */
45997: if( rc==SQLITE_OK ){
45998: i64 nReq = ((i64)mxPage * szPage);
45999: rc = sqlite3OsFileSize(pWal->pDbFd, &nSize);
46000: if( rc==SQLITE_OK && nSize<nReq ){
46001: sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq);
46002: }
46003: }
46004:
46005: /* Iterate through the contents of the WAL, copying data to the db file. */
46006: while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){
46007: i64 iOffset;
46008: assert( walFramePgno(pWal, iFrame)==iDbpage );
46009: if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ) continue;
46010: iOffset = walFrameOffset(iFrame, szPage) + WAL_FRAME_HDRSIZE;
46011: /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL file */
46012: rc = sqlite3OsRead(pWal->pWalFd, zBuf, szPage, iOffset);
46013: if( rc!=SQLITE_OK ) break;
46014: iOffset = (iDbpage-1)*(i64)szPage;
46015: testcase( IS_BIG_INT(iOffset) );
46016: rc = sqlite3OsWrite(pWal->pDbFd, zBuf, szPage, iOffset);
46017: if( rc!=SQLITE_OK ) break;
46018: }
46019:
46020: /* If work was actually accomplished... */
46021: if( rc==SQLITE_OK ){
46022: if( mxSafeFrame==walIndexHdr(pWal)->mxFrame ){
46023: i64 szDb = pWal->hdr.nPage*(i64)szPage;
46024: testcase( IS_BIG_INT(szDb) );
46025: rc = sqlite3OsTruncate(pWal->pDbFd, szDb);
46026: if( rc==SQLITE_OK && sync_flags ){
46027: rc = sqlite3OsSync(pWal->pDbFd, sync_flags);
46028: }
46029: }
46030: if( rc==SQLITE_OK ){
46031: pInfo->nBackfill = mxSafeFrame;
46032: }
46033: }
46034:
46035: /* Release the reader lock held while backfilling */
46036: walUnlockExclusive(pWal, WAL_READ_LOCK(0), 1);
46037: }
46038:
46039: if( rc==SQLITE_BUSY ){
46040: /* Reset the return code so as not to report a checkpoint failure
46041: ** just because there are active readers. */
46042: rc = SQLITE_OK;
46043: }
46044:
46045: /* If this is an SQLITE_CHECKPOINT_RESTART operation, and the entire wal
46046: ** file has been copied into the database file, then block until all
46047: ** readers have finished using the wal file. This ensures that the next
46048: ** process to write to the database restarts the wal file.
46049: */
46050: if( rc==SQLITE_OK && eMode!=SQLITE_CHECKPOINT_PASSIVE ){
46051: assert( pWal->writeLock );
46052: if( pInfo->nBackfill<pWal->hdr.mxFrame ){
46053: rc = SQLITE_BUSY;
46054: }else if( eMode==SQLITE_CHECKPOINT_RESTART ){
46055: assert( mxSafeFrame==pWal->hdr.mxFrame );
46056: rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(1), WAL_NREADER-1);
46057: if( rc==SQLITE_OK ){
46058: walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
46059: }
46060: }
46061: }
46062:
46063: walcheckpoint_out:
46064: walIteratorFree(pIter);
46065: return rc;
46066: }
46067:
46068: /*
46069: ** If the WAL file is currently larger than nMax bytes in size, truncate
46070: ** it to exactly nMax bytes. If an error occurs while doing so, ignore it.
46071: */
46072: static void walLimitSize(Wal *pWal, i64 nMax){
46073: i64 sz;
46074: int rx;
46075: sqlite3BeginBenignMalloc();
46076: rx = sqlite3OsFileSize(pWal->pWalFd, &sz);
46077: if( rx==SQLITE_OK && (sz > nMax ) ){
46078: rx = sqlite3OsTruncate(pWal->pWalFd, nMax);
46079: }
46080: sqlite3EndBenignMalloc();
46081: if( rx ){
46082: sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName);
46083: }
46084: }
46085:
46086: /*
46087: ** Close a connection to a log file.
46088: */
46089: SQLITE_PRIVATE int sqlite3WalClose(
46090: Wal *pWal, /* Wal to close */
46091: int sync_flags, /* Flags to pass to OsSync() (or 0) */
46092: int nBuf,
46093: u8 *zBuf /* Buffer of at least nBuf bytes */
46094: ){
46095: int rc = SQLITE_OK;
46096: if( pWal ){
46097: int isDelete = 0; /* True to unlink wal and wal-index files */
46098:
46099: /* If an EXCLUSIVE lock can be obtained on the database file (using the
46100: ** ordinary, rollback-mode locking methods, this guarantees that the
46101: ** connection associated with this log file is the only connection to
46102: ** the database. In this case checkpoint the database and unlink both
46103: ** the wal and wal-index files.
46104: **
46105: ** The EXCLUSIVE lock is not released before returning.
46106: */
46107: rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE);
46108: if( rc==SQLITE_OK ){
46109: if( pWal->exclusiveMode==WAL_NORMAL_MODE ){
46110: pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
46111: }
46112: rc = sqlite3WalCheckpoint(
46113: pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0
46114: );
46115: if( rc==SQLITE_OK ){
46116: int bPersist = -1;
46117: sqlite3OsFileControlHint(
46118: pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist
46119: );
46120: if( bPersist!=1 ){
46121: /* Try to delete the WAL file if the checkpoint completed and
46122: ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal
46123: ** mode (!bPersist) */
46124: isDelete = 1;
46125: }else if( pWal->mxWalSize>=0 ){
46126: /* Try to truncate the WAL file to zero bytes if the checkpoint
46127: ** completed and fsynced (rc==SQLITE_OK) and we are in persistent
46128: ** WAL mode (bPersist) and if the PRAGMA journal_size_limit is a
46129: ** non-negative value (pWal->mxWalSize>=0). Note that we truncate
46130: ** to zero bytes as truncating to the journal_size_limit might
46131: ** leave a corrupt WAL file on disk. */
46132: walLimitSize(pWal, 0);
46133: }
46134: }
46135: }
46136:
46137: walIndexClose(pWal, isDelete);
46138: sqlite3OsClose(pWal->pWalFd);
46139: if( isDelete ){
46140: sqlite3BeginBenignMalloc();
46141: sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0);
46142: sqlite3EndBenignMalloc();
46143: }
46144: WALTRACE(("WAL%p: closed\n", pWal));
46145: sqlite3_free((void *)pWal->apWiData);
46146: sqlite3_free(pWal);
46147: }
46148: return rc;
46149: }
46150:
46151: /*
46152: ** Try to read the wal-index header. Return 0 on success and 1 if
46153: ** there is a problem.
46154: **
46155: ** The wal-index is in shared memory. Another thread or process might
46156: ** be writing the header at the same time this procedure is trying to
46157: ** read it, which might result in inconsistency. A dirty read is detected
46158: ** by verifying that both copies of the header are the same and also by
46159: ** a checksum on the header.
46160: **
46161: ** If and only if the read is consistent and the header is different from
46162: ** pWal->hdr, then pWal->hdr is updated to the content of the new header
46163: ** and *pChanged is set to 1.
46164: **
46165: ** If the checksum cannot be verified return non-zero. If the header
46166: ** is read successfully and the checksum verified, return zero.
46167: */
46168: static int walIndexTryHdr(Wal *pWal, int *pChanged){
46169: u32 aCksum[2]; /* Checksum on the header content */
46170: WalIndexHdr h1, h2; /* Two copies of the header content */
46171: WalIndexHdr volatile *aHdr; /* Header in shared memory */
46172:
46173: /* The first page of the wal-index must be mapped at this point. */
46174: assert( pWal->nWiData>0 && pWal->apWiData[0] );
46175:
46176: /* Read the header. This might happen concurrently with a write to the
46177: ** same area of shared memory on a different CPU in a SMP,
46178: ** meaning it is possible that an inconsistent snapshot is read
46179: ** from the file. If this happens, return non-zero.
46180: **
46181: ** There are two copies of the header at the beginning of the wal-index.
46182: ** When reading, read [0] first then [1]. Writes are in the reverse order.
46183: ** Memory barriers are used to prevent the compiler or the hardware from
46184: ** reordering the reads and writes.
46185: */
46186: aHdr = walIndexHdr(pWal);
46187: memcpy(&h1, (void *)&aHdr[0], sizeof(h1));
46188: walShmBarrier(pWal);
46189: memcpy(&h2, (void *)&aHdr[1], sizeof(h2));
46190:
46191: if( memcmp(&h1, &h2, sizeof(h1))!=0 ){
46192: return 1; /* Dirty read */
46193: }
46194: if( h1.isInit==0 ){
46195: return 1; /* Malformed header - probably all zeros */
46196: }
46197: walChecksumBytes(1, (u8*)&h1, sizeof(h1)-sizeof(h1.aCksum), 0, aCksum);
46198: if( aCksum[0]!=h1.aCksum[0] || aCksum[1]!=h1.aCksum[1] ){
46199: return 1; /* Checksum does not match */
46200: }
46201:
46202: if( memcmp(&pWal->hdr, &h1, sizeof(WalIndexHdr)) ){
46203: *pChanged = 1;
46204: memcpy(&pWal->hdr, &h1, sizeof(WalIndexHdr));
46205: pWal->szPage = (pWal->hdr.szPage&0xfe00) + ((pWal->hdr.szPage&0x0001)<<16);
46206: testcase( pWal->szPage<=32768 );
46207: testcase( pWal->szPage>=65536 );
46208: }
46209:
46210: /* The header was successfully read. Return zero. */
46211: return 0;
46212: }
46213:
46214: /*
46215: ** Read the wal-index header from the wal-index and into pWal->hdr.
46216: ** If the wal-header appears to be corrupt, try to reconstruct the
46217: ** wal-index from the WAL before returning.
46218: **
46219: ** Set *pChanged to 1 if the wal-index header value in pWal->hdr is
46220: ** changed by this opertion. If pWal->hdr is unchanged, set *pChanged
46221: ** to 0.
46222: **
46223: ** If the wal-index header is successfully read, return SQLITE_OK.
46224: ** Otherwise an SQLite error code.
46225: */
46226: static int walIndexReadHdr(Wal *pWal, int *pChanged){
46227: int rc; /* Return code */
46228: int badHdr; /* True if a header read failed */
46229: volatile u32 *page0; /* Chunk of wal-index containing header */
46230:
46231: /* Ensure that page 0 of the wal-index (the page that contains the
46232: ** wal-index header) is mapped. Return early if an error occurs here.
46233: */
46234: assert( pChanged );
46235: rc = walIndexPage(pWal, 0, &page0);
46236: if( rc!=SQLITE_OK ){
46237: return rc;
46238: };
46239: assert( page0 || pWal->writeLock==0 );
46240:
46241: /* If the first page of the wal-index has been mapped, try to read the
46242: ** wal-index header immediately, without holding any lock. This usually
46243: ** works, but may fail if the wal-index header is corrupt or currently
46244: ** being modified by another thread or process.
46245: */
46246: badHdr = (page0 ? walIndexTryHdr(pWal, pChanged) : 1);
46247:
46248: /* If the first attempt failed, it might have been due to a race
46249: ** with a writer. So get a WRITE lock and try again.
46250: */
46251: assert( badHdr==0 || pWal->writeLock==0 );
46252: if( badHdr ){
46253: if( pWal->readOnly & WAL_SHM_RDONLY ){
46254: if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){
46255: walUnlockShared(pWal, WAL_WRITE_LOCK);
46256: rc = SQLITE_READONLY_RECOVERY;
46257: }
46258: }else if( SQLITE_OK==(rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1)) ){
46259: pWal->writeLock = 1;
46260: if( SQLITE_OK==(rc = walIndexPage(pWal, 0, &page0)) ){
46261: badHdr = walIndexTryHdr(pWal, pChanged);
46262: if( badHdr ){
46263: /* If the wal-index header is still malformed even while holding
46264: ** a WRITE lock, it can only mean that the header is corrupted and
46265: ** needs to be reconstructed. So run recovery to do exactly that.
46266: */
46267: rc = walIndexRecover(pWal);
46268: *pChanged = 1;
46269: }
46270: }
46271: pWal->writeLock = 0;
46272: walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
46273: }
46274: }
46275:
46276: /* If the header is read successfully, check the version number to make
46277: ** sure the wal-index was not constructed with some future format that
46278: ** this version of SQLite cannot understand.
46279: */
46280: if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){
46281: rc = SQLITE_CANTOPEN_BKPT;
46282: }
46283:
46284: return rc;
46285: }
46286:
46287: /*
46288: ** This is the value that walTryBeginRead returns when it needs to
46289: ** be retried.
46290: */
46291: #define WAL_RETRY (-1)
46292:
46293: /*
46294: ** Attempt to start a read transaction. This might fail due to a race or
46295: ** other transient condition. When that happens, it returns WAL_RETRY to
46296: ** indicate to the caller that it is safe to retry immediately.
46297: **
46298: ** On success return SQLITE_OK. On a permanent failure (such an
46299: ** I/O error or an SQLITE_BUSY because another process is running
46300: ** recovery) return a positive error code.
46301: **
46302: ** The useWal parameter is true to force the use of the WAL and disable
46303: ** the case where the WAL is bypassed because it has been completely
46304: ** checkpointed. If useWal==0 then this routine calls walIndexReadHdr()
46305: ** to make a copy of the wal-index header into pWal->hdr. If the
46306: ** wal-index header has changed, *pChanged is set to 1 (as an indication
46307: ** to the caller that the local paget cache is obsolete and needs to be
46308: ** flushed.) When useWal==1, the wal-index header is assumed to already
46309: ** be loaded and the pChanged parameter is unused.
46310: **
46311: ** The caller must set the cnt parameter to the number of prior calls to
46312: ** this routine during the current read attempt that returned WAL_RETRY.
46313: ** This routine will start taking more aggressive measures to clear the
46314: ** race conditions after multiple WAL_RETRY returns, and after an excessive
46315: ** number of errors will ultimately return SQLITE_PROTOCOL. The
46316: ** SQLITE_PROTOCOL return indicates that some other process has gone rogue
46317: ** and is not honoring the locking protocol. There is a vanishingly small
46318: ** chance that SQLITE_PROTOCOL could be returned because of a run of really
46319: ** bad luck when there is lots of contention for the wal-index, but that
46320: ** possibility is so small that it can be safely neglected, we believe.
46321: **
46322: ** On success, this routine obtains a read lock on
46323: ** WAL_READ_LOCK(pWal->readLock). The pWal->readLock integer is
46324: ** in the range 0 <= pWal->readLock < WAL_NREADER. If pWal->readLock==(-1)
46325: ** that means the Wal does not hold any read lock. The reader must not
46326: ** access any database page that is modified by a WAL frame up to and
46327: ** including frame number aReadMark[pWal->readLock]. The reader will
46328: ** use WAL frames up to and including pWal->hdr.mxFrame if pWal->readLock>0
46329: ** Or if pWal->readLock==0, then the reader will ignore the WAL
46330: ** completely and get all content directly from the database file.
46331: ** If the useWal parameter is 1 then the WAL will never be ignored and
46332: ** this routine will always set pWal->readLock>0 on success.
46333: ** When the read transaction is completed, the caller must release the
46334: ** lock on WAL_READ_LOCK(pWal->readLock) and set pWal->readLock to -1.
46335: **
46336: ** This routine uses the nBackfill and aReadMark[] fields of the header
46337: ** to select a particular WAL_READ_LOCK() that strives to let the
46338: ** checkpoint process do as much work as possible. This routine might
46339: ** update values of the aReadMark[] array in the header, but if it does
46340: ** so it takes care to hold an exclusive lock on the corresponding
46341: ** WAL_READ_LOCK() while changing values.
46342: */
46343: static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){
46344: volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */
46345: u32 mxReadMark; /* Largest aReadMark[] value */
46346: int mxI; /* Index of largest aReadMark[] value */
46347: int i; /* Loop counter */
46348: int rc = SQLITE_OK; /* Return code */
46349:
46350: assert( pWal->readLock<0 ); /* Not currently locked */
46351:
46352: /* Take steps to avoid spinning forever if there is a protocol error.
46353: **
46354: ** Circumstances that cause a RETRY should only last for the briefest
46355: ** instances of time. No I/O or other system calls are done while the
46356: ** locks are held, so the locks should not be held for very long. But
46357: ** if we are unlucky, another process that is holding a lock might get
46358: ** paged out or take a page-fault that is time-consuming to resolve,
46359: ** during the few nanoseconds that it is holding the lock. In that case,
46360: ** it might take longer than normal for the lock to free.
46361: **
46362: ** After 5 RETRYs, we begin calling sqlite3OsSleep(). The first few
46363: ** calls to sqlite3OsSleep() have a delay of 1 microsecond. Really this
46364: ** is more of a scheduler yield than an actual delay. But on the 10th
46365: ** an subsequent retries, the delays start becoming longer and longer,
46366: ** so that on the 100th (and last) RETRY we delay for 21 milliseconds.
46367: ** The total delay time before giving up is less than 1 second.
46368: */
46369: if( cnt>5 ){
46370: int nDelay = 1; /* Pause time in microseconds */
46371: if( cnt>100 ){
46372: VVA_ONLY( pWal->lockError = 1; )
46373: return SQLITE_PROTOCOL;
46374: }
46375: if( cnt>=10 ) nDelay = (cnt-9)*238; /* Max delay 21ms. Total delay 996ms */
46376: sqlite3OsSleep(pWal->pVfs, nDelay);
46377: }
46378:
46379: if( !useWal ){
46380: rc = walIndexReadHdr(pWal, pChanged);
46381: if( rc==SQLITE_BUSY ){
46382: /* If there is not a recovery running in another thread or process
46383: ** then convert BUSY errors to WAL_RETRY. If recovery is known to
46384: ** be running, convert BUSY to BUSY_RECOVERY. There is a race here
46385: ** which might cause WAL_RETRY to be returned even if BUSY_RECOVERY
46386: ** would be technically correct. But the race is benign since with
46387: ** WAL_RETRY this routine will be called again and will probably be
46388: ** right on the second iteration.
46389: */
46390: if( pWal->apWiData[0]==0 ){
46391: /* This branch is taken when the xShmMap() method returns SQLITE_BUSY.
46392: ** We assume this is a transient condition, so return WAL_RETRY. The
46393: ** xShmMap() implementation used by the default unix and win32 VFS
46394: ** modules may return SQLITE_BUSY due to a race condition in the
46395: ** code that determines whether or not the shared-memory region
46396: ** must be zeroed before the requested page is returned.
46397: */
46398: rc = WAL_RETRY;
46399: }else if( SQLITE_OK==(rc = walLockShared(pWal, WAL_RECOVER_LOCK)) ){
46400: walUnlockShared(pWal, WAL_RECOVER_LOCK);
46401: rc = WAL_RETRY;
46402: }else if( rc==SQLITE_BUSY ){
46403: rc = SQLITE_BUSY_RECOVERY;
46404: }
46405: }
46406: if( rc!=SQLITE_OK ){
46407: return rc;
46408: }
46409: }
46410:
46411: pInfo = walCkptInfo(pWal);
46412: if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame ){
46413: /* The WAL has been completely backfilled (or it is empty).
46414: ** and can be safely ignored.
46415: */
46416: rc = walLockShared(pWal, WAL_READ_LOCK(0));
46417: walShmBarrier(pWal);
46418: if( rc==SQLITE_OK ){
46419: if( memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) ){
46420: /* It is not safe to allow the reader to continue here if frames
46421: ** may have been appended to the log before READ_LOCK(0) was obtained.
46422: ** When holding READ_LOCK(0), the reader ignores the entire log file,
46423: ** which implies that the database file contains a trustworthy
46424: ** snapshoT. Since holding READ_LOCK(0) prevents a checkpoint from
46425: ** happening, this is usually correct.
46426: **
46427: ** However, if frames have been appended to the log (or if the log
46428: ** is wrapped and written for that matter) before the READ_LOCK(0)
46429: ** is obtained, that is not necessarily true. A checkpointer may
46430: ** have started to backfill the appended frames but crashed before
46431: ** it finished. Leaving a corrupt image in the database file.
46432: */
46433: walUnlockShared(pWal, WAL_READ_LOCK(0));
46434: return WAL_RETRY;
46435: }
46436: pWal->readLock = 0;
46437: return SQLITE_OK;
46438: }else if( rc!=SQLITE_BUSY ){
46439: return rc;
46440: }
46441: }
46442:
46443: /* If we get this far, it means that the reader will want to use
46444: ** the WAL to get at content from recent commits. The job now is
46445: ** to select one of the aReadMark[] entries that is closest to
46446: ** but not exceeding pWal->hdr.mxFrame and lock that entry.
46447: */
46448: mxReadMark = 0;
46449: mxI = 0;
46450: for(i=1; i<WAL_NREADER; i++){
46451: u32 thisMark = pInfo->aReadMark[i];
46452: if( mxReadMark<=thisMark && thisMark<=pWal->hdr.mxFrame ){
46453: assert( thisMark!=READMARK_NOT_USED );
46454: mxReadMark = thisMark;
46455: mxI = i;
46456: }
46457: }
46458: /* There was once an "if" here. The extra "{" is to preserve indentation. */
46459: {
46460: if( (pWal->readOnly & WAL_SHM_RDONLY)==0
46461: && (mxReadMark<pWal->hdr.mxFrame || mxI==0)
46462: ){
46463: for(i=1; i<WAL_NREADER; i++){
46464: rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1);
46465: if( rc==SQLITE_OK ){
46466: mxReadMark = pInfo->aReadMark[i] = pWal->hdr.mxFrame;
46467: mxI = i;
46468: walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1);
46469: break;
46470: }else if( rc!=SQLITE_BUSY ){
46471: return rc;
46472: }
46473: }
46474: }
46475: if( mxI==0 ){
46476: assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 );
46477: return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTLOCK;
46478: }
46479:
46480: rc = walLockShared(pWal, WAL_READ_LOCK(mxI));
46481: if( rc ){
46482: return rc==SQLITE_BUSY ? WAL_RETRY : rc;
46483: }
46484: /* Now that the read-lock has been obtained, check that neither the
46485: ** value in the aReadMark[] array or the contents of the wal-index
46486: ** header have changed.
46487: **
46488: ** It is necessary to check that the wal-index header did not change
46489: ** between the time it was read and when the shared-lock was obtained
46490: ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility
46491: ** that the log file may have been wrapped by a writer, or that frames
46492: ** that occur later in the log than pWal->hdr.mxFrame may have been
46493: ** copied into the database by a checkpointer. If either of these things
46494: ** happened, then reading the database with the current value of
46495: ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry
46496: ** instead.
46497: **
46498: ** This does not guarantee that the copy of the wal-index header is up to
46499: ** date before proceeding. That would not be possible without somehow
46500: ** blocking writers. It only guarantees that a dangerous checkpoint or
46501: ** log-wrap (either of which would require an exclusive lock on
46502: ** WAL_READ_LOCK(mxI)) has not occurred since the snapshot was valid.
46503: */
46504: walShmBarrier(pWal);
46505: if( pInfo->aReadMark[mxI]!=mxReadMark
46506: || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr))
46507: ){
46508: walUnlockShared(pWal, WAL_READ_LOCK(mxI));
46509: return WAL_RETRY;
46510: }else{
46511: assert( mxReadMark<=pWal->hdr.mxFrame );
46512: pWal->readLock = (i16)mxI;
46513: }
46514: }
46515: return rc;
46516: }
46517:
46518: /*
46519: ** Begin a read transaction on the database.
46520: **
46521: ** This routine used to be called sqlite3OpenSnapshot() and with good reason:
46522: ** it takes a snapshot of the state of the WAL and wal-index for the current
46523: ** instant in time. The current thread will continue to use this snapshot.
46524: ** Other threads might append new content to the WAL and wal-index but
46525: ** that extra content is ignored by the current thread.
46526: **
46527: ** If the database contents have changes since the previous read
46528: ** transaction, then *pChanged is set to 1 before returning. The
46529: ** Pager layer will use this to know that is cache is stale and
46530: ** needs to be flushed.
46531: */
46532: SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){
46533: int rc; /* Return code */
46534: int cnt = 0; /* Number of TryBeginRead attempts */
46535:
46536: do{
46537: rc = walTryBeginRead(pWal, pChanged, 0, ++cnt);
46538: }while( rc==WAL_RETRY );
46539: testcase( (rc&0xff)==SQLITE_BUSY );
46540: testcase( (rc&0xff)==SQLITE_IOERR );
46541: testcase( rc==SQLITE_PROTOCOL );
46542: testcase( rc==SQLITE_OK );
46543: return rc;
46544: }
46545:
46546: /*
46547: ** Finish with a read transaction. All this does is release the
46548: ** read-lock.
46549: */
46550: SQLITE_PRIVATE void sqlite3WalEndReadTransaction(Wal *pWal){
46551: sqlite3WalEndWriteTransaction(pWal);
46552: if( pWal->readLock>=0 ){
46553: walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
46554: pWal->readLock = -1;
46555: }
46556: }
46557:
46558: /*
46559: ** Read a page from the WAL, if it is present in the WAL and if the
46560: ** current read transaction is configured to use the WAL.
46561: **
46562: ** The *pInWal is set to 1 if the requested page is in the WAL and
46563: ** has been loaded. Or *pInWal is set to 0 if the page was not in
46564: ** the WAL and needs to be read out of the database.
46565: */
46566: SQLITE_PRIVATE int sqlite3WalRead(
46567: Wal *pWal, /* WAL handle */
46568: Pgno pgno, /* Database page number to read data for */
46569: int *pInWal, /* OUT: True if data is read from WAL */
46570: int nOut, /* Size of buffer pOut in bytes */
46571: u8 *pOut /* Buffer to write page data to */
46572: ){
46573: u32 iRead = 0; /* If !=0, WAL frame to return data from */
46574: u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */
46575: int iHash; /* Used to loop through N hash tables */
46576:
46577: /* This routine is only be called from within a read transaction. */
46578: assert( pWal->readLock>=0 || pWal->lockError );
46579:
46580: /* If the "last page" field of the wal-index header snapshot is 0, then
46581: ** no data will be read from the wal under any circumstances. Return early
46582: ** in this case as an optimization. Likewise, if pWal->readLock==0,
46583: ** then the WAL is ignored by the reader so return early, as if the
46584: ** WAL were empty.
46585: */
46586: if( iLast==0 || pWal->readLock==0 ){
46587: *pInWal = 0;
46588: return SQLITE_OK;
46589: }
46590:
46591: /* Search the hash table or tables for an entry matching page number
46592: ** pgno. Each iteration of the following for() loop searches one
46593: ** hash table (each hash table indexes up to HASHTABLE_NPAGE frames).
46594: **
46595: ** This code might run concurrently to the code in walIndexAppend()
46596: ** that adds entries to the wal-index (and possibly to this hash
46597: ** table). This means the value just read from the hash
46598: ** slot (aHash[iKey]) may have been added before or after the
46599: ** current read transaction was opened. Values added after the
46600: ** read transaction was opened may have been written incorrectly -
46601: ** i.e. these slots may contain garbage data. However, we assume
46602: ** that any slots written before the current read transaction was
46603: ** opened remain unmodified.
46604: **
46605: ** For the reasons above, the if(...) condition featured in the inner
46606: ** loop of the following block is more stringent that would be required
46607: ** if we had exclusive access to the hash-table:
46608: **
46609: ** (aPgno[iFrame]==pgno):
46610: ** This condition filters out normal hash-table collisions.
46611: **
46612: ** (iFrame<=iLast):
46613: ** This condition filters out entries that were added to the hash
46614: ** table after the current read-transaction had started.
46615: */
46616: for(iHash=walFramePage(iLast); iHash>=0 && iRead==0; iHash--){
46617: volatile ht_slot *aHash; /* Pointer to hash table */
46618: volatile u32 *aPgno; /* Pointer to array of page numbers */
46619: u32 iZero; /* Frame number corresponding to aPgno[0] */
46620: int iKey; /* Hash slot index */
46621: int nCollide; /* Number of hash collisions remaining */
46622: int rc; /* Error code */
46623:
46624: rc = walHashGet(pWal, iHash, &aHash, &aPgno, &iZero);
46625: if( rc!=SQLITE_OK ){
46626: return rc;
46627: }
46628: nCollide = HASHTABLE_NSLOT;
46629: for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){
46630: u32 iFrame = aHash[iKey] + iZero;
46631: if( iFrame<=iLast && aPgno[aHash[iKey]]==pgno ){
46632: /* assert( iFrame>iRead ); -- not true if there is corruption */
46633: iRead = iFrame;
46634: }
46635: if( (nCollide--)==0 ){
46636: return SQLITE_CORRUPT_BKPT;
46637: }
46638: }
46639: }
46640:
46641: #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT
46642: /* If expensive assert() statements are available, do a linear search
46643: ** of the wal-index file content. Make sure the results agree with the
46644: ** result obtained using the hash indexes above. */
46645: {
46646: u32 iRead2 = 0;
46647: u32 iTest;
46648: for(iTest=iLast; iTest>0; iTest--){
46649: if( walFramePgno(pWal, iTest)==pgno ){
46650: iRead2 = iTest;
46651: break;
46652: }
46653: }
46654: assert( iRead==iRead2 );
46655: }
46656: #endif
46657:
46658: /* If iRead is non-zero, then it is the log frame number that contains the
46659: ** required page. Read and return data from the log file.
46660: */
46661: if( iRead ){
46662: int sz;
46663: i64 iOffset;
46664: sz = pWal->hdr.szPage;
46665: sz = (sz&0xfe00) + ((sz&0x0001)<<16);
46666: testcase( sz<=32768 );
46667: testcase( sz>=65536 );
46668: iOffset = walFrameOffset(iRead, sz) + WAL_FRAME_HDRSIZE;
46669: *pInWal = 1;
46670: /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */
1.2.2.1 ! misho 46671: return sqlite3OsRead(pWal->pWalFd, pOut, (nOut>sz ? sz : nOut), iOffset);
1.2 misho 46672: }
46673:
46674: *pInWal = 0;
46675: return SQLITE_OK;
46676: }
46677:
46678:
46679: /*
46680: ** Return the size of the database in pages (or zero, if unknown).
46681: */
46682: SQLITE_PRIVATE Pgno sqlite3WalDbsize(Wal *pWal){
46683: if( pWal && ALWAYS(pWal->readLock>=0) ){
46684: return pWal->hdr.nPage;
46685: }
46686: return 0;
46687: }
46688:
46689:
46690: /*
46691: ** This function starts a write transaction on the WAL.
46692: **
46693: ** A read transaction must have already been started by a prior call
46694: ** to sqlite3WalBeginReadTransaction().
46695: **
46696: ** If another thread or process has written into the database since
46697: ** the read transaction was started, then it is not possible for this
46698: ** thread to write as doing so would cause a fork. So this routine
46699: ** returns SQLITE_BUSY in that case and no write transaction is started.
46700: **
46701: ** There can only be a single writer active at a time.
46702: */
46703: SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){
46704: int rc;
46705:
46706: /* Cannot start a write transaction without first holding a read
46707: ** transaction. */
46708: assert( pWal->readLock>=0 );
46709:
46710: if( pWal->readOnly ){
46711: return SQLITE_READONLY;
46712: }
46713:
46714: /* Only one writer allowed at a time. Get the write lock. Return
46715: ** SQLITE_BUSY if unable.
46716: */
46717: rc = walLockExclusive(pWal, WAL_WRITE_LOCK, 1);
46718: if( rc ){
46719: return rc;
46720: }
46721: pWal->writeLock = 1;
46722:
46723: /* If another connection has written to the database file since the
46724: ** time the read transaction on this connection was started, then
46725: ** the write is disallowed.
46726: */
46727: if( memcmp(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr))!=0 ){
46728: walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
46729: pWal->writeLock = 0;
46730: rc = SQLITE_BUSY;
46731: }
46732:
46733: return rc;
46734: }
46735:
46736: /*
46737: ** End a write transaction. The commit has already been done. This
46738: ** routine merely releases the lock.
46739: */
46740: SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){
46741: if( pWal->writeLock ){
46742: walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1);
46743: pWal->writeLock = 0;
46744: pWal->truncateOnCommit = 0;
46745: }
46746: return SQLITE_OK;
46747: }
46748:
46749: /*
46750: ** If any data has been written (but not committed) to the log file, this
46751: ** function moves the write-pointer back to the start of the transaction.
46752: **
46753: ** Additionally, the callback function is invoked for each frame written
46754: ** to the WAL since the start of the transaction. If the callback returns
46755: ** other than SQLITE_OK, it is not invoked again and the error code is
46756: ** returned to the caller.
46757: **
46758: ** Otherwise, if the callback function does not return an error, this
46759: ** function returns SQLITE_OK.
46760: */
46761: SQLITE_PRIVATE int sqlite3WalUndo(Wal *pWal, int (*xUndo)(void *, Pgno), void *pUndoCtx){
46762: int rc = SQLITE_OK;
46763: if( ALWAYS(pWal->writeLock) ){
46764: Pgno iMax = pWal->hdr.mxFrame;
46765: Pgno iFrame;
46766:
46767: /* Restore the clients cache of the wal-index header to the state it
46768: ** was in before the client began writing to the database.
46769: */
46770: memcpy(&pWal->hdr, (void *)walIndexHdr(pWal), sizeof(WalIndexHdr));
46771:
46772: for(iFrame=pWal->hdr.mxFrame+1;
46773: ALWAYS(rc==SQLITE_OK) && iFrame<=iMax;
46774: iFrame++
46775: ){
46776: /* This call cannot fail. Unless the page for which the page number
46777: ** is passed as the second argument is (a) in the cache and
46778: ** (b) has an outstanding reference, then xUndo is either a no-op
46779: ** (if (a) is false) or simply expels the page from the cache (if (b)
46780: ** is false).
46781: **
46782: ** If the upper layer is doing a rollback, it is guaranteed that there
46783: ** are no outstanding references to any page other than page 1. And
46784: ** page 1 is never written to the log until the transaction is
46785: ** committed. As a result, the call to xUndo may not fail.
46786: */
46787: assert( walFramePgno(pWal, iFrame)!=1 );
46788: rc = xUndo(pUndoCtx, walFramePgno(pWal, iFrame));
46789: }
1.2.2.1 ! misho 46790: if( iMax!=pWal->hdr.mxFrame ) walCleanupHash(pWal);
1.2 misho 46791: }
46792: assert( rc==SQLITE_OK );
46793: return rc;
46794: }
46795:
46796: /*
46797: ** Argument aWalData must point to an array of WAL_SAVEPOINT_NDATA u32
46798: ** values. This function populates the array with values required to
46799: ** "rollback" the write position of the WAL handle back to the current
46800: ** point in the event of a savepoint rollback (via WalSavepointUndo()).
46801: */
46802: SQLITE_PRIVATE void sqlite3WalSavepoint(Wal *pWal, u32 *aWalData){
46803: assert( pWal->writeLock );
46804: aWalData[0] = pWal->hdr.mxFrame;
46805: aWalData[1] = pWal->hdr.aFrameCksum[0];
46806: aWalData[2] = pWal->hdr.aFrameCksum[1];
46807: aWalData[3] = pWal->nCkpt;
46808: }
46809:
46810: /*
46811: ** Move the write position of the WAL back to the point identified by
46812: ** the values in the aWalData[] array. aWalData must point to an array
46813: ** of WAL_SAVEPOINT_NDATA u32 values that has been previously populated
46814: ** by a call to WalSavepoint().
46815: */
46816: SQLITE_PRIVATE int sqlite3WalSavepointUndo(Wal *pWal, u32 *aWalData){
46817: int rc = SQLITE_OK;
46818:
46819: assert( pWal->writeLock );
46820: assert( aWalData[3]!=pWal->nCkpt || aWalData[0]<=pWal->hdr.mxFrame );
46821:
46822: if( aWalData[3]!=pWal->nCkpt ){
46823: /* This savepoint was opened immediately after the write-transaction
46824: ** was started. Right after that, the writer decided to wrap around
46825: ** to the start of the log. Update the savepoint values to match.
46826: */
46827: aWalData[0] = 0;
46828: aWalData[3] = pWal->nCkpt;
46829: }
46830:
46831: if( aWalData[0]<pWal->hdr.mxFrame ){
46832: pWal->hdr.mxFrame = aWalData[0];
46833: pWal->hdr.aFrameCksum[0] = aWalData[1];
46834: pWal->hdr.aFrameCksum[1] = aWalData[2];
46835: walCleanupHash(pWal);
46836: }
46837:
46838: return rc;
46839: }
46840:
46841:
46842: /*
46843: ** This function is called just before writing a set of frames to the log
46844: ** file (see sqlite3WalFrames()). It checks to see if, instead of appending
46845: ** to the current log file, it is possible to overwrite the start of the
46846: ** existing log file with the new frames (i.e. "reset" the log). If so,
46847: ** it sets pWal->hdr.mxFrame to 0. Otherwise, pWal->hdr.mxFrame is left
46848: ** unchanged.
46849: **
46850: ** SQLITE_OK is returned if no error is encountered (regardless of whether
46851: ** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned
46852: ** if an error occurs.
46853: */
46854: static int walRestartLog(Wal *pWal){
46855: int rc = SQLITE_OK;
46856: int cnt;
46857:
46858: if( pWal->readLock==0 ){
46859: volatile WalCkptInfo *pInfo = walCkptInfo(pWal);
46860: assert( pInfo->nBackfill==pWal->hdr.mxFrame );
46861: if( pInfo->nBackfill>0 ){
46862: u32 salt1;
46863: sqlite3_randomness(4, &salt1);
46864: rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
46865: if( rc==SQLITE_OK ){
46866: /* If all readers are using WAL_READ_LOCK(0) (in other words if no
46867: ** readers are currently using the WAL), then the transactions
46868: ** frames will overwrite the start of the existing log. Update the
46869: ** wal-index header to reflect this.
46870: **
46871: ** In theory it would be Ok to update the cache of the header only
46872: ** at this point. But updating the actual wal-index header is also
46873: ** safe and means there is no special case for sqlite3WalUndo()
46874: ** to handle if this transaction is rolled back.
46875: */
46876: int i; /* Loop counter */
46877: u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */
46878:
46879: pWal->nCkpt++;
46880: pWal->hdr.mxFrame = 0;
46881: sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0]));
46882: aSalt[1] = salt1;
46883: walIndexWriteHdr(pWal);
46884: pInfo->nBackfill = 0;
1.2.2.1 ! misho 46885: pInfo->aReadMark[1] = 0;
! 46886: for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED;
1.2 misho 46887: assert( pInfo->aReadMark[0]==0 );
46888: walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1);
46889: }else if( rc!=SQLITE_BUSY ){
46890: return rc;
46891: }
46892: }
46893: walUnlockShared(pWal, WAL_READ_LOCK(0));
46894: pWal->readLock = -1;
46895: cnt = 0;
46896: do{
46897: int notUsed;
46898: rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt);
46899: }while( rc==WAL_RETRY );
46900: assert( (rc&0xff)!=SQLITE_BUSY ); /* BUSY not possible when useWal==1 */
46901: testcase( (rc&0xff)==SQLITE_IOERR );
46902: testcase( rc==SQLITE_PROTOCOL );
46903: testcase( rc==SQLITE_OK );
46904: }
46905: return rc;
46906: }
46907:
46908: /*
46909: ** Information about the current state of the WAL file and where
46910: ** the next fsync should occur - passed from sqlite3WalFrames() into
46911: ** walWriteToLog().
46912: */
46913: typedef struct WalWriter {
46914: Wal *pWal; /* The complete WAL information */
46915: sqlite3_file *pFd; /* The WAL file to which we write */
46916: sqlite3_int64 iSyncPoint; /* Fsync at this offset */
46917: int syncFlags; /* Flags for the fsync */
46918: int szPage; /* Size of one page */
46919: } WalWriter;
46920:
46921: /*
46922: ** Write iAmt bytes of content into the WAL file beginning at iOffset.
46923: ** Do a sync when crossing the p->iSyncPoint boundary.
46924: **
46925: ** In other words, if iSyncPoint is in between iOffset and iOffset+iAmt,
46926: ** first write the part before iSyncPoint, then sync, then write the
46927: ** rest.
46928: */
46929: static int walWriteToLog(
46930: WalWriter *p, /* WAL to write to */
46931: void *pContent, /* Content to be written */
46932: int iAmt, /* Number of bytes to write */
46933: sqlite3_int64 iOffset /* Start writing at this offset */
46934: ){
46935: int rc;
46936: if( iOffset<p->iSyncPoint && iOffset+iAmt>=p->iSyncPoint ){
46937: int iFirstAmt = (int)(p->iSyncPoint - iOffset);
46938: rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset);
46939: if( rc ) return rc;
46940: iOffset += iFirstAmt;
46941: iAmt -= iFirstAmt;
46942: pContent = (void*)(iFirstAmt + (char*)pContent);
46943: assert( p->syncFlags & (SQLITE_SYNC_NORMAL|SQLITE_SYNC_FULL) );
46944: rc = sqlite3OsSync(p->pFd, p->syncFlags);
46945: if( iAmt==0 || rc ) return rc;
46946: }
46947: rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset);
46948: return rc;
46949: }
46950:
46951: /*
46952: ** Write out a single frame of the WAL
46953: */
46954: static int walWriteOneFrame(
46955: WalWriter *p, /* Where to write the frame */
46956: PgHdr *pPage, /* The page of the frame to be written */
46957: int nTruncate, /* The commit flag. Usually 0. >0 for commit */
46958: sqlite3_int64 iOffset /* Byte offset at which to write */
46959: ){
46960: int rc; /* Result code from subfunctions */
46961: void *pData; /* Data actually written */
46962: u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */
46963: #if defined(SQLITE_HAS_CODEC)
46964: if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM;
46965: #else
46966: pData = pPage->pData;
46967: #endif
46968: walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame);
46969: rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset);
46970: if( rc ) return rc;
46971: /* Write the page data */
46972: rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame));
46973: return rc;
46974: }
46975:
46976: /*
46977: ** Write a set of frames to the log. The caller must hold the write-lock
46978: ** on the log file (obtained using sqlite3WalBeginWriteTransaction()).
46979: */
46980: SQLITE_PRIVATE int sqlite3WalFrames(
46981: Wal *pWal, /* Wal handle to write to */
46982: int szPage, /* Database page-size in bytes */
46983: PgHdr *pList, /* List of dirty pages to write */
46984: Pgno nTruncate, /* Database size after this commit */
46985: int isCommit, /* True if this is a commit */
46986: int sync_flags /* Flags to pass to OsSync() (or 0) */
46987: ){
46988: int rc; /* Used to catch return codes */
46989: u32 iFrame; /* Next frame address */
46990: PgHdr *p; /* Iterator to run through pList with. */
46991: PgHdr *pLast = 0; /* Last frame in list */
46992: int nExtra = 0; /* Number of extra copies of last page */
46993: int szFrame; /* The size of a single frame */
46994: i64 iOffset; /* Next byte to write in WAL file */
46995: WalWriter w; /* The writer */
46996:
46997: assert( pList );
46998: assert( pWal->writeLock );
46999:
47000: /* If this frame set completes a transaction, then nTruncate>0. If
47001: ** nTruncate==0 then this frame set does not complete the transaction. */
47002: assert( (isCommit!=0)==(nTruncate!=0) );
47003:
47004: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
47005: { int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){}
47006: WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n",
47007: pWal, cnt, pWal->hdr.mxFrame, isCommit ? "Commit" : "Spill"));
47008: }
47009: #endif
47010:
47011: /* See if it is possible to write these frames into the start of the
47012: ** log file, instead of appending to it at pWal->hdr.mxFrame.
47013: */
47014: if( SQLITE_OK!=(rc = walRestartLog(pWal)) ){
47015: return rc;
47016: }
47017:
47018: /* If this is the first frame written into the log, write the WAL
47019: ** header to the start of the WAL file. See comments at the top of
47020: ** this source file for a description of the WAL header format.
47021: */
47022: iFrame = pWal->hdr.mxFrame;
47023: if( iFrame==0 ){
47024: u8 aWalHdr[WAL_HDRSIZE]; /* Buffer to assemble wal-header in */
47025: u32 aCksum[2]; /* Checksum for wal-header */
47026:
47027: sqlite3Put4byte(&aWalHdr[0], (WAL_MAGIC | SQLITE_BIGENDIAN));
47028: sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION);
47029: sqlite3Put4byte(&aWalHdr[8], szPage);
47030: sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt);
47031: if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt);
47032: memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8);
47033: walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum);
47034: sqlite3Put4byte(&aWalHdr[24], aCksum[0]);
47035: sqlite3Put4byte(&aWalHdr[28], aCksum[1]);
47036:
47037: pWal->szPage = szPage;
47038: pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN;
47039: pWal->hdr.aFrameCksum[0] = aCksum[0];
47040: pWal->hdr.aFrameCksum[1] = aCksum[1];
47041: pWal->truncateOnCommit = 1;
47042:
47043: rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0);
47044: WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok"));
47045: if( rc!=SQLITE_OK ){
47046: return rc;
47047: }
47048:
47049: /* Sync the header (unless SQLITE_IOCAP_SEQUENTIAL is true or unless
47050: ** all syncing is turned off by PRAGMA synchronous=OFF). Otherwise
47051: ** an out-of-order write following a WAL restart could result in
47052: ** database corruption. See the ticket:
47053: **
47054: ** http://localhost:591/sqlite/info/ff5be73dee
47055: */
47056: if( pWal->syncHeader && sync_flags ){
47057: rc = sqlite3OsSync(pWal->pWalFd, sync_flags & SQLITE_SYNC_MASK);
47058: if( rc ) return rc;
47059: }
47060: }
47061: assert( (int)pWal->szPage==szPage );
47062:
47063: /* Setup information needed to write frames into the WAL */
47064: w.pWal = pWal;
47065: w.pFd = pWal->pWalFd;
47066: w.iSyncPoint = 0;
47067: w.syncFlags = sync_flags;
47068: w.szPage = szPage;
47069: iOffset = walFrameOffset(iFrame+1, szPage);
47070: szFrame = szPage + WAL_FRAME_HDRSIZE;
47071:
47072: /* Write all frames into the log file exactly once */
47073: for(p=pList; p; p=p->pDirty){
47074: int nDbSize; /* 0 normally. Positive == commit flag */
47075: iFrame++;
47076: assert( iOffset==walFrameOffset(iFrame, szPage) );
47077: nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0;
47078: rc = walWriteOneFrame(&w, p, nDbSize, iOffset);
47079: if( rc ) return rc;
47080: pLast = p;
47081: iOffset += szFrame;
47082: }
47083:
47084: /* If this is the end of a transaction, then we might need to pad
47085: ** the transaction and/or sync the WAL file.
47086: **
47087: ** Padding and syncing only occur if this set of frames complete a
47088: ** transaction and if PRAGMA synchronous=FULL. If synchronous==NORMAL
47089: ** or synchonous==OFF, then no padding or syncing are needed.
47090: **
47091: ** If SQLITE_IOCAP_POWERSAFE_OVERWRITE is defined, then padding is not
47092: ** needed and only the sync is done. If padding is needed, then the
47093: ** final frame is repeated (with its commit mark) until the next sector
47094: ** boundary is crossed. Only the part of the WAL prior to the last
47095: ** sector boundary is synced; the part of the last frame that extends
47096: ** past the sector boundary is written after the sync.
47097: */
47098: if( isCommit && (sync_flags & WAL_SYNC_TRANSACTIONS)!=0 ){
47099: if( pWal->padToSectorBoundary ){
1.2.2.1 ! misho 47100: int sectorSize = sqlite3SectorSize(pWal->pWalFd);
1.2 misho 47101: w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize;
47102: while( iOffset<w.iSyncPoint ){
47103: rc = walWriteOneFrame(&w, pLast, nTruncate, iOffset);
47104: if( rc ) return rc;
47105: iOffset += szFrame;
47106: nExtra++;
47107: }
47108: }else{
47109: rc = sqlite3OsSync(w.pFd, sync_flags & SQLITE_SYNC_MASK);
47110: }
47111: }
47112:
47113: /* If this frame set completes the first transaction in the WAL and
47114: ** if PRAGMA journal_size_limit is set, then truncate the WAL to the
47115: ** journal size limit, if possible.
47116: */
47117: if( isCommit && pWal->truncateOnCommit && pWal->mxWalSize>=0 ){
47118: i64 sz = pWal->mxWalSize;
47119: if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){
47120: sz = walFrameOffset(iFrame+nExtra+1, szPage);
47121: }
47122: walLimitSize(pWal, sz);
47123: pWal->truncateOnCommit = 0;
47124: }
47125:
47126: /* Append data to the wal-index. It is not necessary to lock the
47127: ** wal-index to do this as the SQLITE_SHM_WRITE lock held on the wal-index
47128: ** guarantees that there are no other writers, and no data that may
47129: ** be in use by existing readers is being overwritten.
47130: */
47131: iFrame = pWal->hdr.mxFrame;
47132: for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){
47133: iFrame++;
47134: rc = walIndexAppend(pWal, iFrame, p->pgno);
47135: }
47136: while( rc==SQLITE_OK && nExtra>0 ){
47137: iFrame++;
47138: nExtra--;
47139: rc = walIndexAppend(pWal, iFrame, pLast->pgno);
47140: }
47141:
47142: if( rc==SQLITE_OK ){
47143: /* Update the private copy of the header. */
47144: pWal->hdr.szPage = (u16)((szPage&0xff00) | (szPage>>16));
47145: testcase( szPage<=32768 );
47146: testcase( szPage>=65536 );
47147: pWal->hdr.mxFrame = iFrame;
47148: if( isCommit ){
47149: pWal->hdr.iChange++;
47150: pWal->hdr.nPage = nTruncate;
47151: }
47152: /* If this is a commit, update the wal-index header too. */
47153: if( isCommit ){
47154: walIndexWriteHdr(pWal);
47155: pWal->iCallback = iFrame;
47156: }
47157: }
47158:
47159: WALTRACE(("WAL%p: frame write %s\n", pWal, rc ? "failed" : "ok"));
47160: return rc;
47161: }
47162:
47163: /*
47164: ** This routine is called to implement sqlite3_wal_checkpoint() and
47165: ** related interfaces.
47166: **
47167: ** Obtain a CHECKPOINT lock and then backfill as much information as
47168: ** we can from WAL into the database.
47169: **
47170: ** If parameter xBusy is not NULL, it is a pointer to a busy-handler
47171: ** callback. In this case this function runs a blocking checkpoint.
47172: */
47173: SQLITE_PRIVATE int sqlite3WalCheckpoint(
47174: Wal *pWal, /* Wal connection */
47175: int eMode, /* PASSIVE, FULL or RESTART */
47176: int (*xBusy)(void*), /* Function to call when busy */
47177: void *pBusyArg, /* Context argument for xBusyHandler */
47178: int sync_flags, /* Flags to sync db file with (or 0) */
47179: int nBuf, /* Size of temporary buffer */
47180: u8 *zBuf, /* Temporary buffer to use */
47181: int *pnLog, /* OUT: Number of frames in WAL */
47182: int *pnCkpt /* OUT: Number of backfilled frames in WAL */
47183: ){
47184: int rc; /* Return code */
47185: int isChanged = 0; /* True if a new wal-index header is loaded */
47186: int eMode2 = eMode; /* Mode to pass to walCheckpoint() */
47187:
47188: assert( pWal->ckptLock==0 );
47189: assert( pWal->writeLock==0 );
47190:
47191: if( pWal->readOnly ) return SQLITE_READONLY;
47192: WALTRACE(("WAL%p: checkpoint begins\n", pWal));
47193: rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1);
47194: if( rc ){
47195: /* Usually this is SQLITE_BUSY meaning that another thread or process
47196: ** is already running a checkpoint, or maybe a recovery. But it might
47197: ** also be SQLITE_IOERR. */
47198: return rc;
47199: }
47200: pWal->ckptLock = 1;
47201:
47202: /* If this is a blocking-checkpoint, then obtain the write-lock as well
47203: ** to prevent any writers from running while the checkpoint is underway.
47204: ** This has to be done before the call to walIndexReadHdr() below.
47205: **
47206: ** If the writer lock cannot be obtained, then a passive checkpoint is
47207: ** run instead. Since the checkpointer is not holding the writer lock,
47208: ** there is no point in blocking waiting for any readers. Assuming no
47209: ** other error occurs, this function will return SQLITE_BUSY to the caller.
47210: */
47211: if( eMode!=SQLITE_CHECKPOINT_PASSIVE ){
47212: rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_WRITE_LOCK, 1);
47213: if( rc==SQLITE_OK ){
47214: pWal->writeLock = 1;
47215: }else if( rc==SQLITE_BUSY ){
47216: eMode2 = SQLITE_CHECKPOINT_PASSIVE;
47217: rc = SQLITE_OK;
47218: }
47219: }
47220:
47221: /* Read the wal-index header. */
47222: if( rc==SQLITE_OK ){
47223: rc = walIndexReadHdr(pWal, &isChanged);
47224: }
47225:
47226: /* Copy data from the log to the database file. */
47227: if( rc==SQLITE_OK ){
47228: if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){
47229: rc = SQLITE_CORRUPT_BKPT;
47230: }else{
47231: rc = walCheckpoint(pWal, eMode2, xBusy, pBusyArg, sync_flags, zBuf);
47232: }
47233:
47234: /* If no error occurred, set the output variables. */
47235: if( rc==SQLITE_OK || rc==SQLITE_BUSY ){
47236: if( pnLog ) *pnLog = (int)pWal->hdr.mxFrame;
47237: if( pnCkpt ) *pnCkpt = (int)(walCkptInfo(pWal)->nBackfill);
47238: }
47239: }
47240:
47241: if( isChanged ){
47242: /* If a new wal-index header was loaded before the checkpoint was
47243: ** performed, then the pager-cache associated with pWal is now
47244: ** out of date. So zero the cached wal-index header to ensure that
47245: ** next time the pager opens a snapshot on this database it knows that
47246: ** the cache needs to be reset.
47247: */
47248: memset(&pWal->hdr, 0, sizeof(WalIndexHdr));
47249: }
47250:
47251: /* Release the locks. */
47252: sqlite3WalEndWriteTransaction(pWal);
47253: walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1);
47254: pWal->ckptLock = 0;
47255: WALTRACE(("WAL%p: checkpoint %s\n", pWal, rc ? "failed" : "ok"));
47256: return (rc==SQLITE_OK && eMode!=eMode2 ? SQLITE_BUSY : rc);
47257: }
47258:
47259: /* Return the value to pass to a sqlite3_wal_hook callback, the
47260: ** number of frames in the WAL at the point of the last commit since
47261: ** sqlite3WalCallback() was called. If no commits have occurred since
47262: ** the last call, then return 0.
47263: */
47264: SQLITE_PRIVATE int sqlite3WalCallback(Wal *pWal){
47265: u32 ret = 0;
47266: if( pWal ){
47267: ret = pWal->iCallback;
47268: pWal->iCallback = 0;
47269: }
47270: return (int)ret;
47271: }
47272:
47273: /*
47274: ** This function is called to change the WAL subsystem into or out
47275: ** of locking_mode=EXCLUSIVE.
47276: **
47277: ** If op is zero, then attempt to change from locking_mode=EXCLUSIVE
47278: ** into locking_mode=NORMAL. This means that we must acquire a lock
47279: ** on the pWal->readLock byte. If the WAL is already in locking_mode=NORMAL
47280: ** or if the acquisition of the lock fails, then return 0. If the
47281: ** transition out of exclusive-mode is successful, return 1. This
47282: ** operation must occur while the pager is still holding the exclusive
47283: ** lock on the main database file.
47284: **
47285: ** If op is one, then change from locking_mode=NORMAL into
47286: ** locking_mode=EXCLUSIVE. This means that the pWal->readLock must
47287: ** be released. Return 1 if the transition is made and 0 if the
47288: ** WAL is already in exclusive-locking mode - meaning that this
47289: ** routine is a no-op. The pager must already hold the exclusive lock
47290: ** on the main database file before invoking this operation.
47291: **
47292: ** If op is negative, then do a dry-run of the op==1 case but do
47293: ** not actually change anything. The pager uses this to see if it
47294: ** should acquire the database exclusive lock prior to invoking
47295: ** the op==1 case.
47296: */
47297: SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){
47298: int rc;
47299: assert( pWal->writeLock==0 );
47300: assert( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE || op==-1 );
47301:
47302: /* pWal->readLock is usually set, but might be -1 if there was a
47303: ** prior error while attempting to acquire are read-lock. This cannot
47304: ** happen if the connection is actually in exclusive mode (as no xShmLock
47305: ** locks are taken in this case). Nor should the pager attempt to
47306: ** upgrade to exclusive-mode following such an error.
47307: */
47308: assert( pWal->readLock>=0 || pWal->lockError );
47309: assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) );
47310:
47311: if( op==0 ){
47312: if( pWal->exclusiveMode ){
47313: pWal->exclusiveMode = 0;
47314: if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){
47315: pWal->exclusiveMode = 1;
47316: }
47317: rc = pWal->exclusiveMode==0;
47318: }else{
47319: /* Already in locking_mode=NORMAL */
47320: rc = 0;
47321: }
47322: }else if( op>0 ){
47323: assert( pWal->exclusiveMode==0 );
47324: assert( pWal->readLock>=0 );
47325: walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock));
47326: pWal->exclusiveMode = 1;
47327: rc = 1;
47328: }else{
47329: rc = pWal->exclusiveMode==0;
47330: }
47331: return rc;
47332: }
47333:
47334: /*
47335: ** Return true if the argument is non-NULL and the WAL module is using
47336: ** heap-memory for the wal-index. Otherwise, if the argument is NULL or the
47337: ** WAL module is using shared-memory, return false.
47338: */
47339: SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){
47340: return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE );
47341: }
47342:
1.2.2.1 ! misho 47343: #ifdef SQLITE_ENABLE_ZIPVFS
! 47344: /*
! 47345: ** If the argument is not NULL, it points to a Wal object that holds a
! 47346: ** read-lock. This function returns the database page-size if it is known,
! 47347: ** or zero if it is not (or if pWal is NULL).
! 47348: */
! 47349: SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){
! 47350: assert( pWal==0 || pWal->readLock>=0 );
! 47351: return (pWal ? pWal->szPage : 0);
! 47352: }
! 47353: #endif
! 47354:
1.2 misho 47355: #endif /* #ifndef SQLITE_OMIT_WAL */
47356:
47357: /************** End of wal.c *************************************************/
47358: /************** Begin file btmutex.c *****************************************/
47359: /*
47360: ** 2007 August 27
47361: **
47362: ** The author disclaims copyright to this source code. In place of
47363: ** a legal notice, here is a blessing:
47364: **
47365: ** May you do good and not evil.
47366: ** May you find forgiveness for yourself and forgive others.
47367: ** May you share freely, never taking more than you give.
47368: **
47369: *************************************************************************
47370: **
47371: ** This file contains code used to implement mutexes on Btree objects.
47372: ** This code really belongs in btree.c. But btree.c is getting too
47373: ** big and we want to break it down some. This packaged seemed like
47374: ** a good breakout.
47375: */
47376: /************** Include btreeInt.h in the middle of btmutex.c ****************/
47377: /************** Begin file btreeInt.h ****************************************/
47378: /*
47379: ** 2004 April 6
47380: **
47381: ** The author disclaims copyright to this source code. In place of
47382: ** a legal notice, here is a blessing:
47383: **
47384: ** May you do good and not evil.
47385: ** May you find forgiveness for yourself and forgive others.
47386: ** May you share freely, never taking more than you give.
47387: **
47388: *************************************************************************
47389: ** This file implements a external (disk-based) database using BTrees.
47390: ** For a detailed discussion of BTrees, refer to
47391: **
47392: ** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3:
47393: ** "Sorting And Searching", pages 473-480. Addison-Wesley
47394: ** Publishing Company, Reading, Massachusetts.
47395: **
47396: ** The basic idea is that each page of the file contains N database
47397: ** entries and N+1 pointers to subpages.
47398: **
47399: ** ----------------------------------------------------------------
47400: ** | Ptr(0) | Key(0) | Ptr(1) | Key(1) | ... | Key(N-1) | Ptr(N) |
47401: ** ----------------------------------------------------------------
47402: **
47403: ** All of the keys on the page that Ptr(0) points to have values less
47404: ** than Key(0). All of the keys on page Ptr(1) and its subpages have
47405: ** values greater than Key(0) and less than Key(1). All of the keys
47406: ** on Ptr(N) and its subpages have values greater than Key(N-1). And
47407: ** so forth.
47408: **
47409: ** Finding a particular key requires reading O(log(M)) pages from the
47410: ** disk where M is the number of entries in the tree.
47411: **
47412: ** In this implementation, a single file can hold one or more separate
47413: ** BTrees. Each BTree is identified by the index of its root page. The
47414: ** key and data for any entry are combined to form the "payload". A
47415: ** fixed amount of payload can be carried directly on the database
47416: ** page. If the payload is larger than the preset amount then surplus
47417: ** bytes are stored on overflow pages. The payload for an entry
47418: ** and the preceding pointer are combined to form a "Cell". Each
47419: ** page has a small header which contains the Ptr(N) pointer and other
47420: ** information such as the size of key and data.
47421: **
47422: ** FORMAT DETAILS
47423: **
47424: ** The file is divided into pages. The first page is called page 1,
47425: ** the second is page 2, and so forth. A page number of zero indicates
47426: ** "no such page". The page size can be any power of 2 between 512 and 65536.
47427: ** Each page can be either a btree page, a freelist page, an overflow
47428: ** page, or a pointer-map page.
47429: **
47430: ** The first page is always a btree page. The first 100 bytes of the first
47431: ** page contain a special header (the "file header") that describes the file.
47432: ** The format of the file header is as follows:
47433: **
47434: ** OFFSET SIZE DESCRIPTION
47435: ** 0 16 Header string: "SQLite format 3\000"
47436: ** 16 2 Page size in bytes.
47437: ** 18 1 File format write version
47438: ** 19 1 File format read version
47439: ** 20 1 Bytes of unused space at the end of each page
47440: ** 21 1 Max embedded payload fraction
47441: ** 22 1 Min embedded payload fraction
47442: ** 23 1 Min leaf payload fraction
47443: ** 24 4 File change counter
47444: ** 28 4 Reserved for future use
47445: ** 32 4 First freelist page
47446: ** 36 4 Number of freelist pages in the file
47447: ** 40 60 15 4-byte meta values passed to higher layers
47448: **
47449: ** 40 4 Schema cookie
47450: ** 44 4 File format of schema layer
47451: ** 48 4 Size of page cache
47452: ** 52 4 Largest root-page (auto/incr_vacuum)
47453: ** 56 4 1=UTF-8 2=UTF16le 3=UTF16be
47454: ** 60 4 User version
47455: ** 64 4 Incremental vacuum mode
47456: ** 68 4 unused
47457: ** 72 4 unused
47458: ** 76 4 unused
47459: **
47460: ** All of the integer values are big-endian (most significant byte first).
47461: **
47462: ** The file change counter is incremented when the database is changed
47463: ** This counter allows other processes to know when the file has changed
47464: ** and thus when they need to flush their cache.
47465: **
47466: ** The max embedded payload fraction is the amount of the total usable
47467: ** space in a page that can be consumed by a single cell for standard
47468: ** B-tree (non-LEAFDATA) tables. A value of 255 means 100%. The default
47469: ** is to limit the maximum cell size so that at least 4 cells will fit
47470: ** on one page. Thus the default max embedded payload fraction is 64.
47471: **
47472: ** If the payload for a cell is larger than the max payload, then extra
47473: ** payload is spilled to overflow pages. Once an overflow page is allocated,
47474: ** as many bytes as possible are moved into the overflow pages without letting
47475: ** the cell size drop below the min embedded payload fraction.
47476: **
47477: ** The min leaf payload fraction is like the min embedded payload fraction
47478: ** except that it applies to leaf nodes in a LEAFDATA tree. The maximum
47479: ** payload fraction for a LEAFDATA tree is always 100% (or 255) and it
47480: ** not specified in the header.
47481: **
47482: ** Each btree pages is divided into three sections: The header, the
47483: ** cell pointer array, and the cell content area. Page 1 also has a 100-byte
47484: ** file header that occurs before the page header.
47485: **
47486: ** |----------------|
47487: ** | file header | 100 bytes. Page 1 only.
47488: ** |----------------|
47489: ** | page header | 8 bytes for leaves. 12 bytes for interior nodes
47490: ** |----------------|
47491: ** | cell pointer | | 2 bytes per cell. Sorted order.
47492: ** | array | | Grows downward
47493: ** | | v
47494: ** |----------------|
47495: ** | unallocated |
47496: ** | space |
47497: ** |----------------| ^ Grows upwards
47498: ** | cell content | | Arbitrary order interspersed with freeblocks.
47499: ** | area | | and free space fragments.
47500: ** |----------------|
47501: **
47502: ** The page headers looks like this:
47503: **
47504: ** OFFSET SIZE DESCRIPTION
47505: ** 0 1 Flags. 1: intkey, 2: zerodata, 4: leafdata, 8: leaf
47506: ** 1 2 byte offset to the first freeblock
47507: ** 3 2 number of cells on this page
47508: ** 5 2 first byte of the cell content area
47509: ** 7 1 number of fragmented free bytes
47510: ** 8 4 Right child (the Ptr(N) value). Omitted on leaves.
47511: **
47512: ** The flags define the format of this btree page. The leaf flag means that
47513: ** this page has no children. The zerodata flag means that this page carries
47514: ** only keys and no data. The intkey flag means that the key is a integer
47515: ** which is stored in the key size entry of the cell header rather than in
47516: ** the payload area.
47517: **
47518: ** The cell pointer array begins on the first byte after the page header.
47519: ** The cell pointer array contains zero or more 2-byte numbers which are
47520: ** offsets from the beginning of the page to the cell content in the cell
47521: ** content area. The cell pointers occur in sorted order. The system strives
47522: ** to keep free space after the last cell pointer so that new cells can
47523: ** be easily added without having to defragment the page.
47524: **
47525: ** Cell content is stored at the very end of the page and grows toward the
47526: ** beginning of the page.
47527: **
47528: ** Unused space within the cell content area is collected into a linked list of
47529: ** freeblocks. Each freeblock is at least 4 bytes in size. The byte offset
47530: ** to the first freeblock is given in the header. Freeblocks occur in
47531: ** increasing order. Because a freeblock must be at least 4 bytes in size,
47532: ** any group of 3 or fewer unused bytes in the cell content area cannot
47533: ** exist on the freeblock chain. A group of 3 or fewer free bytes is called
47534: ** a fragment. The total number of bytes in all fragments is recorded.
47535: ** in the page header at offset 7.
47536: **
47537: ** SIZE DESCRIPTION
47538: ** 2 Byte offset of the next freeblock
47539: ** 2 Bytes in this freeblock
47540: **
47541: ** Cells are of variable length. Cells are stored in the cell content area at
47542: ** the end of the page. Pointers to the cells are in the cell pointer array
47543: ** that immediately follows the page header. Cells is not necessarily
47544: ** contiguous or in order, but cell pointers are contiguous and in order.
47545: **
47546: ** Cell content makes use of variable length integers. A variable
47547: ** length integer is 1 to 9 bytes where the lower 7 bits of each
47548: ** byte are used. The integer consists of all bytes that have bit 8 set and
47549: ** the first byte with bit 8 clear. The most significant byte of the integer
47550: ** appears first. A variable-length integer may not be more than 9 bytes long.
47551: ** As a special case, all 8 bytes of the 9th byte are used as data. This
47552: ** allows a 64-bit integer to be encoded in 9 bytes.
47553: **
47554: ** 0x00 becomes 0x00000000
47555: ** 0x7f becomes 0x0000007f
47556: ** 0x81 0x00 becomes 0x00000080
47557: ** 0x82 0x00 becomes 0x00000100
47558: ** 0x80 0x7f becomes 0x0000007f
47559: ** 0x8a 0x91 0xd1 0xac 0x78 becomes 0x12345678
47560: ** 0x81 0x81 0x81 0x81 0x01 becomes 0x10204081
47561: **
47562: ** Variable length integers are used for rowids and to hold the number of
47563: ** bytes of key and data in a btree cell.
47564: **
47565: ** The content of a cell looks like this:
47566: **
47567: ** SIZE DESCRIPTION
47568: ** 4 Page number of the left child. Omitted if leaf flag is set.
47569: ** var Number of bytes of data. Omitted if the zerodata flag is set.
47570: ** var Number of bytes of key. Or the key itself if intkey flag is set.
47571: ** * Payload
47572: ** 4 First page of the overflow chain. Omitted if no overflow
47573: **
47574: ** Overflow pages form a linked list. Each page except the last is completely
47575: ** filled with data (pagesize - 4 bytes). The last page can have as little
47576: ** as 1 byte of data.
47577: **
47578: ** SIZE DESCRIPTION
47579: ** 4 Page number of next overflow page
47580: ** * Data
47581: **
47582: ** Freelist pages come in two subtypes: trunk pages and leaf pages. The
47583: ** file header points to the first in a linked list of trunk page. Each trunk
47584: ** page points to multiple leaf pages. The content of a leaf page is
47585: ** unspecified. A trunk page looks like this:
47586: **
47587: ** SIZE DESCRIPTION
47588: ** 4 Page number of next trunk page
47589: ** 4 Number of leaf pointers on this page
47590: ** * zero or more pages numbers of leaves
47591: */
47592:
47593:
47594: /* The following value is the maximum cell size assuming a maximum page
47595: ** size give above.
47596: */
47597: #define MX_CELL_SIZE(pBt) ((int)(pBt->pageSize-8))
47598:
47599: /* The maximum number of cells on a single page of the database. This
47600: ** assumes a minimum cell size of 6 bytes (4 bytes for the cell itself
47601: ** plus 2 bytes for the index to the cell in the page header). Such
47602: ** small cells will be rare, but they are possible.
47603: */
47604: #define MX_CELL(pBt) ((pBt->pageSize-8)/6)
47605:
47606: /* Forward declarations */
47607: typedef struct MemPage MemPage;
47608: typedef struct BtLock BtLock;
47609:
47610: /*
47611: ** This is a magic string that appears at the beginning of every
47612: ** SQLite database in order to identify the file as a real database.
47613: **
47614: ** You can change this value at compile-time by specifying a
47615: ** -DSQLITE_FILE_HEADER="..." on the compiler command-line. The
47616: ** header must be exactly 16 bytes including the zero-terminator so
47617: ** the string itself should be 15 characters long. If you change
47618: ** the header, then your custom library will not be able to read
47619: ** databases generated by the standard tools and the standard tools
47620: ** will not be able to read databases created by your custom library.
47621: */
47622: #ifndef SQLITE_FILE_HEADER /* 123456789 123456 */
47623: # define SQLITE_FILE_HEADER "SQLite format 3"
47624: #endif
47625:
47626: /*
47627: ** Page type flags. An ORed combination of these flags appear as the
47628: ** first byte of on-disk image of every BTree page.
47629: */
47630: #define PTF_INTKEY 0x01
47631: #define PTF_ZERODATA 0x02
47632: #define PTF_LEAFDATA 0x04
47633: #define PTF_LEAF 0x08
47634:
47635: /*
47636: ** As each page of the file is loaded into memory, an instance of the following
47637: ** structure is appended and initialized to zero. This structure stores
47638: ** information about the page that is decoded from the raw file page.
47639: **
47640: ** The pParent field points back to the parent page. This allows us to
47641: ** walk up the BTree from any leaf to the root. Care must be taken to
47642: ** unref() the parent page pointer when this page is no longer referenced.
47643: ** The pageDestructor() routine handles that chore.
47644: **
47645: ** Access to all fields of this structure is controlled by the mutex
47646: ** stored in MemPage.pBt->mutex.
47647: */
47648: struct MemPage {
47649: u8 isInit; /* True if previously initialized. MUST BE FIRST! */
47650: u8 nOverflow; /* Number of overflow cell bodies in aCell[] */
47651: u8 intKey; /* True if intkey flag is set */
47652: u8 leaf; /* True if leaf flag is set */
47653: u8 hasData; /* True if this page stores data */
47654: u8 hdrOffset; /* 100 for page 1. 0 otherwise */
47655: u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */
47656: u8 max1bytePayload; /* min(maxLocal,127) */
47657: u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */
47658: u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */
47659: u16 cellOffset; /* Index in aData of first cell pointer */
47660: u16 nFree; /* Number of free bytes on the page */
47661: u16 nCell; /* Number of cells on this page, local and ovfl */
47662: u16 maskPage; /* Mask for page offset */
1.2.2.1 ! misho 47663: u16 aiOvfl[5]; /* Insert the i-th overflow cell before the aiOvfl-th
! 47664: ** non-overflow cell */
! 47665: u8 *apOvfl[5]; /* Pointers to the body of overflow cells */
1.2 misho 47666: BtShared *pBt; /* Pointer to BtShared that this page is part of */
47667: u8 *aData; /* Pointer to disk image of the page data */
47668: u8 *aDataEnd; /* One byte past the end of usable data */
47669: u8 *aCellIdx; /* The cell index area */
47670: DbPage *pDbPage; /* Pager page handle */
47671: Pgno pgno; /* Page number for this page */
47672: };
47673:
47674: /*
47675: ** The in-memory image of a disk page has the auxiliary information appended
47676: ** to the end. EXTRA_SIZE is the number of bytes of space needed to hold
47677: ** that extra information.
47678: */
47679: #define EXTRA_SIZE sizeof(MemPage)
47680:
47681: /*
47682: ** A linked list of the following structures is stored at BtShared.pLock.
47683: ** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor
47684: ** is opened on the table with root page BtShared.iTable. Locks are removed
47685: ** from this list when a transaction is committed or rolled back, or when
47686: ** a btree handle is closed.
47687: */
47688: struct BtLock {
47689: Btree *pBtree; /* Btree handle holding this lock */
47690: Pgno iTable; /* Root page of table */
47691: u8 eLock; /* READ_LOCK or WRITE_LOCK */
47692: BtLock *pNext; /* Next in BtShared.pLock list */
47693: };
47694:
47695: /* Candidate values for BtLock.eLock */
47696: #define READ_LOCK 1
47697: #define WRITE_LOCK 2
47698:
47699: /* A Btree handle
47700: **
47701: ** A database connection contains a pointer to an instance of
47702: ** this object for every database file that it has open. This structure
47703: ** is opaque to the database connection. The database connection cannot
47704: ** see the internals of this structure and only deals with pointers to
47705: ** this structure.
47706: **
47707: ** For some database files, the same underlying database cache might be
47708: ** shared between multiple connections. In that case, each connection
47709: ** has it own instance of this object. But each instance of this object
47710: ** points to the same BtShared object. The database cache and the
47711: ** schema associated with the database file are all contained within
47712: ** the BtShared object.
47713: **
47714: ** All fields in this structure are accessed under sqlite3.mutex.
47715: ** The pBt pointer itself may not be changed while there exists cursors
47716: ** in the referenced BtShared that point back to this Btree since those
47717: ** cursors have to go through this Btree to find their BtShared and
47718: ** they often do so without holding sqlite3.mutex.
47719: */
47720: struct Btree {
47721: sqlite3 *db; /* The database connection holding this btree */
47722: BtShared *pBt; /* Sharable content of this btree */
47723: u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */
47724: u8 sharable; /* True if we can share pBt with another db */
47725: u8 locked; /* True if db currently has pBt locked */
47726: int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */
47727: int nBackup; /* Number of backup operations reading this btree */
47728: Btree *pNext; /* List of other sharable Btrees from the same db */
47729: Btree *pPrev; /* Back pointer of the same list */
47730: #ifndef SQLITE_OMIT_SHARED_CACHE
47731: BtLock lock; /* Object used to lock page 1 */
47732: #endif
47733: };
47734:
47735: /*
47736: ** Btree.inTrans may take one of the following values.
47737: **
47738: ** If the shared-data extension is enabled, there may be multiple users
47739: ** of the Btree structure. At most one of these may open a write transaction,
47740: ** but any number may have active read transactions.
47741: */
47742: #define TRANS_NONE 0
47743: #define TRANS_READ 1
47744: #define TRANS_WRITE 2
47745:
47746: /*
47747: ** An instance of this object represents a single database file.
47748: **
47749: ** A single database file can be in use at the same time by two
47750: ** or more database connections. When two or more connections are
47751: ** sharing the same database file, each connection has it own
47752: ** private Btree object for the file and each of those Btrees points
47753: ** to this one BtShared object. BtShared.nRef is the number of
47754: ** connections currently sharing this database file.
47755: **
47756: ** Fields in this structure are accessed under the BtShared.mutex
47757: ** mutex, except for nRef and pNext which are accessed under the
47758: ** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field
47759: ** may not be modified once it is initially set as long as nRef>0.
47760: ** The pSchema field may be set once under BtShared.mutex and
47761: ** thereafter is unchanged as long as nRef>0.
47762: **
47763: ** isPending:
47764: **
47765: ** If a BtShared client fails to obtain a write-lock on a database
47766: ** table (because there exists one or more read-locks on the table),
47767: ** the shared-cache enters 'pending-lock' state and isPending is
47768: ** set to true.
47769: **
47770: ** The shared-cache leaves the 'pending lock' state when either of
47771: ** the following occur:
47772: **
47773: ** 1) The current writer (BtShared.pWriter) concludes its transaction, OR
47774: ** 2) The number of locks held by other connections drops to zero.
47775: **
47776: ** while in the 'pending-lock' state, no connection may start a new
47777: ** transaction.
47778: **
47779: ** This feature is included to help prevent writer-starvation.
47780: */
47781: struct BtShared {
47782: Pager *pPager; /* The page cache */
47783: sqlite3 *db; /* Database connection currently using this Btree */
47784: BtCursor *pCursor; /* A list of all open cursors */
47785: MemPage *pPage1; /* First page of the database */
47786: u8 openFlags; /* Flags to sqlite3BtreeOpen() */
47787: #ifndef SQLITE_OMIT_AUTOVACUUM
47788: u8 autoVacuum; /* True if auto-vacuum is enabled */
47789: u8 incrVacuum; /* True if incr-vacuum is enabled */
47790: #endif
47791: u8 inTransaction; /* Transaction state */
47792: u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */
47793: u16 btsFlags; /* Boolean parameters. See BTS_* macros below */
47794: u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */
47795: u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */
47796: u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */
47797: u16 minLeaf; /* Minimum local payload in a LEAFDATA table */
47798: u32 pageSize; /* Total number of bytes on a page */
47799: u32 usableSize; /* Number of usable bytes on each page */
47800: int nTransaction; /* Number of open transactions (read + write) */
47801: u32 nPage; /* Number of pages in the database */
47802: void *pSchema; /* Pointer to space allocated by sqlite3BtreeSchema() */
47803: void (*xFreeSchema)(void*); /* Destructor for BtShared.pSchema */
47804: sqlite3_mutex *mutex; /* Non-recursive mutex required to access this object */
47805: Bitvec *pHasContent; /* Set of pages moved to free-list this transaction */
47806: #ifndef SQLITE_OMIT_SHARED_CACHE
47807: int nRef; /* Number of references to this structure */
47808: BtShared *pNext; /* Next on a list of sharable BtShared structs */
47809: BtLock *pLock; /* List of locks held on this shared-btree struct */
47810: Btree *pWriter; /* Btree with currently open write transaction */
47811: #endif
47812: u8 *pTmpSpace; /* BtShared.pageSize bytes of space for tmp use */
47813: };
47814:
47815: /*
47816: ** Allowed values for BtShared.btsFlags
47817: */
47818: #define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */
47819: #define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */
47820: #define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */
47821: #define BTS_INITIALLY_EMPTY 0x0008 /* Database was empty at trans start */
47822: #define BTS_NO_WAL 0x0010 /* Do not open write-ahead-log files */
47823: #define BTS_EXCLUSIVE 0x0020 /* pWriter has an exclusive lock */
47824: #define BTS_PENDING 0x0040 /* Waiting for read-locks to clear */
47825:
47826: /*
47827: ** An instance of the following structure is used to hold information
47828: ** about a cell. The parseCellPtr() function fills in this structure
47829: ** based on information extract from the raw disk page.
47830: */
47831: typedef struct CellInfo CellInfo;
47832: struct CellInfo {
47833: i64 nKey; /* The key for INTKEY tables, or number of bytes in key */
47834: u8 *pCell; /* Pointer to the start of cell content */
47835: u32 nData; /* Number of bytes of data */
47836: u32 nPayload; /* Total amount of payload */
47837: u16 nHeader; /* Size of the cell content header in bytes */
47838: u16 nLocal; /* Amount of payload held locally */
47839: u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */
47840: u16 nSize; /* Size of the cell content on the main b-tree page */
47841: };
47842:
47843: /*
47844: ** Maximum depth of an SQLite B-Tree structure. Any B-Tree deeper than
47845: ** this will be declared corrupt. This value is calculated based on a
47846: ** maximum database size of 2^31 pages a minimum fanout of 2 for a
47847: ** root-node and 3 for all other internal nodes.
47848: **
47849: ** If a tree that appears to be taller than this is encountered, it is
47850: ** assumed that the database is corrupt.
47851: */
47852: #define BTCURSOR_MAX_DEPTH 20
47853:
47854: /*
47855: ** A cursor is a pointer to a particular entry within a particular
47856: ** b-tree within a database file.
47857: **
47858: ** The entry is identified by its MemPage and the index in
47859: ** MemPage.aCell[] of the entry.
47860: **
47861: ** A single database file can be shared by two more database connections,
47862: ** but cursors cannot be shared. Each cursor is associated with a
47863: ** particular database connection identified BtCursor.pBtree.db.
47864: **
47865: ** Fields in this structure are accessed under the BtShared.mutex
47866: ** found at self->pBt->mutex.
47867: */
47868: struct BtCursor {
47869: Btree *pBtree; /* The Btree to which this cursor belongs */
47870: BtShared *pBt; /* The BtShared this cursor points to */
47871: BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */
47872: struct KeyInfo *pKeyInfo; /* Argument passed to comparison function */
1.2.2.1 ! misho 47873: #ifndef SQLITE_OMIT_INCRBLOB
! 47874: Pgno *aOverflow; /* Cache of overflow page locations */
! 47875: #endif
1.2 misho 47876: Pgno pgnoRoot; /* The root page of this tree */
47877: sqlite3_int64 cachedRowid; /* Next rowid cache. 0 means not valid */
47878: CellInfo info; /* A parse of the cell we are pointing at */
47879: i64 nKey; /* Size of pKey, or last integer key */
47880: void *pKey; /* Saved key that was cursor's last known position */
47881: int skipNext; /* Prev() is noop if negative. Next() is noop if positive */
47882: u8 wrFlag; /* True if writable */
47883: u8 atLast; /* Cursor pointing to the last entry */
47884: u8 validNKey; /* True if info.nKey is valid */
47885: u8 eState; /* One of the CURSOR_XXX constants (see below) */
47886: #ifndef SQLITE_OMIT_INCRBLOB
47887: u8 isIncrblobHandle; /* True if this cursor is an incr. io handle */
47888: #endif
1.2.2.1 ! misho 47889: u8 hints; /* As configured by CursorSetHints() */
1.2 misho 47890: i16 iPage; /* Index of current page in apPage */
47891: u16 aiIdx[BTCURSOR_MAX_DEPTH]; /* Current index in apPage[i] */
47892: MemPage *apPage[BTCURSOR_MAX_DEPTH]; /* Pages from root to current page */
47893: };
47894:
47895: /*
47896: ** Potential values for BtCursor.eState.
47897: **
47898: ** CURSOR_VALID:
47899: ** Cursor points to a valid entry. getPayload() etc. may be called.
47900: **
47901: ** CURSOR_INVALID:
47902: ** Cursor does not point to a valid entry. This can happen (for example)
47903: ** because the table is empty or because BtreeCursorFirst() has not been
47904: ** called.
47905: **
47906: ** CURSOR_REQUIRESEEK:
47907: ** The table that this cursor was opened on still exists, but has been
47908: ** modified since the cursor was last used. The cursor position is saved
47909: ** in variables BtCursor.pKey and BtCursor.nKey. When a cursor is in
47910: ** this state, restoreCursorPosition() can be called to attempt to
47911: ** seek the cursor to the saved position.
47912: **
47913: ** CURSOR_FAULT:
47914: ** A unrecoverable error (an I/O error or a malloc failure) has occurred
47915: ** on a different connection that shares the BtShared cache with this
47916: ** cursor. The error has left the cache in an inconsistent state.
47917: ** Do nothing else with this cursor. Any attempt to use the cursor
47918: ** should return the error code stored in BtCursor.skip
47919: */
47920: #define CURSOR_INVALID 0
47921: #define CURSOR_VALID 1
47922: #define CURSOR_REQUIRESEEK 2
47923: #define CURSOR_FAULT 3
47924:
47925: /*
47926: ** The database page the PENDING_BYTE occupies. This page is never used.
47927: */
47928: # define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt)
47929:
47930: /*
47931: ** These macros define the location of the pointer-map entry for a
47932: ** database page. The first argument to each is the number of usable
47933: ** bytes on each page of the database (often 1024). The second is the
47934: ** page number to look up in the pointer map.
47935: **
47936: ** PTRMAP_PAGENO returns the database page number of the pointer-map
47937: ** page that stores the required pointer. PTRMAP_PTROFFSET returns
47938: ** the offset of the requested map entry.
47939: **
47940: ** If the pgno argument passed to PTRMAP_PAGENO is a pointer-map page,
47941: ** then pgno is returned. So (pgno==PTRMAP_PAGENO(pgsz, pgno)) can be
47942: ** used to test if pgno is a pointer-map page. PTRMAP_ISPAGE implements
47943: ** this test.
47944: */
47945: #define PTRMAP_PAGENO(pBt, pgno) ptrmapPageno(pBt, pgno)
47946: #define PTRMAP_PTROFFSET(pgptrmap, pgno) (5*(pgno-pgptrmap-1))
47947: #define PTRMAP_ISPAGE(pBt, pgno) (PTRMAP_PAGENO((pBt),(pgno))==(pgno))
47948:
47949: /*
47950: ** The pointer map is a lookup table that identifies the parent page for
47951: ** each child page in the database file. The parent page is the page that
47952: ** contains a pointer to the child. Every page in the database contains
47953: ** 0 or 1 parent pages. (In this context 'database page' refers
47954: ** to any page that is not part of the pointer map itself.) Each pointer map
47955: ** entry consists of a single byte 'type' and a 4 byte parent page number.
47956: ** The PTRMAP_XXX identifiers below are the valid types.
47957: **
47958: ** The purpose of the pointer map is to facility moving pages from one
47959: ** position in the file to another as part of autovacuum. When a page
47960: ** is moved, the pointer in its parent must be updated to point to the
47961: ** new location. The pointer map is used to locate the parent page quickly.
47962: **
47963: ** PTRMAP_ROOTPAGE: The database page is a root-page. The page-number is not
47964: ** used in this case.
47965: **
47966: ** PTRMAP_FREEPAGE: The database page is an unused (free) page. The page-number
47967: ** is not used in this case.
47968: **
47969: ** PTRMAP_OVERFLOW1: The database page is the first page in a list of
47970: ** overflow pages. The page number identifies the page that
47971: ** contains the cell with a pointer to this overflow page.
47972: **
47973: ** PTRMAP_OVERFLOW2: The database page is the second or later page in a list of
47974: ** overflow pages. The page-number identifies the previous
47975: ** page in the overflow page list.
47976: **
47977: ** PTRMAP_BTREE: The database page is a non-root btree page. The page number
47978: ** identifies the parent page in the btree.
47979: */
47980: #define PTRMAP_ROOTPAGE 1
47981: #define PTRMAP_FREEPAGE 2
47982: #define PTRMAP_OVERFLOW1 3
47983: #define PTRMAP_OVERFLOW2 4
47984: #define PTRMAP_BTREE 5
47985:
47986: /* A bunch of assert() statements to check the transaction state variables
47987: ** of handle p (type Btree*) are internally consistent.
47988: */
47989: #define btreeIntegrity(p) \
47990: assert( p->pBt->inTransaction!=TRANS_NONE || p->pBt->nTransaction==0 ); \
47991: assert( p->pBt->inTransaction>=p->inTrans );
47992:
47993:
47994: /*
47995: ** The ISAUTOVACUUM macro is used within balance_nonroot() to determine
47996: ** if the database supports auto-vacuum or not. Because it is used
47997: ** within an expression that is an argument to another macro
47998: ** (sqliteMallocRaw), it is not possible to use conditional compilation.
47999: ** So, this macro is defined instead.
48000: */
48001: #ifndef SQLITE_OMIT_AUTOVACUUM
48002: #define ISAUTOVACUUM (pBt->autoVacuum)
48003: #else
48004: #define ISAUTOVACUUM 0
48005: #endif
48006:
48007:
48008: /*
48009: ** This structure is passed around through all the sanity checking routines
48010: ** in order to keep track of some global state information.
1.2.2.1 ! misho 48011: **
! 48012: ** The aRef[] array is allocated so that there is 1 bit for each page in
! 48013: ** the database. As the integrity-check proceeds, for each page used in
! 48014: ** the database the corresponding bit is set. This allows integrity-check to
! 48015: ** detect pages that are used twice and orphaned pages (both of which
! 48016: ** indicate corruption).
1.2 misho 48017: */
48018: typedef struct IntegrityCk IntegrityCk;
48019: struct IntegrityCk {
48020: BtShared *pBt; /* The tree being checked out */
48021: Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */
1.2.2.1 ! misho 48022: u8 *aPgRef; /* 1 bit per page in the db (see above) */
1.2 misho 48023: Pgno nPage; /* Number of pages in the database */
48024: int mxErr; /* Stop accumulating errors when this reaches zero */
48025: int nErr; /* Number of messages written to zErrMsg so far */
48026: int mallocFailed; /* A memory allocation error has occurred */
48027: StrAccum errMsg; /* Accumulate the error message text here */
48028: };
48029:
48030: /*
48031: ** Routines to read or write a two- and four-byte big-endian integer values.
48032: */
48033: #define get2byte(x) ((x)[0]<<8 | (x)[1])
48034: #define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v))
48035: #define get4byte sqlite3Get4byte
48036: #define put4byte sqlite3Put4byte
48037:
48038: /************** End of btreeInt.h ********************************************/
48039: /************** Continuing where we left off in btmutex.c ********************/
48040: #ifndef SQLITE_OMIT_SHARED_CACHE
48041: #if SQLITE_THREADSAFE
48042:
48043: /*
48044: ** Obtain the BtShared mutex associated with B-Tree handle p. Also,
48045: ** set BtShared.db to the database handle associated with p and the
48046: ** p->locked boolean to true.
48047: */
48048: static void lockBtreeMutex(Btree *p){
48049: assert( p->locked==0 );
48050: assert( sqlite3_mutex_notheld(p->pBt->mutex) );
48051: assert( sqlite3_mutex_held(p->db->mutex) );
48052:
48053: sqlite3_mutex_enter(p->pBt->mutex);
48054: p->pBt->db = p->db;
48055: p->locked = 1;
48056: }
48057:
48058: /*
48059: ** Release the BtShared mutex associated with B-Tree handle p and
48060: ** clear the p->locked boolean.
48061: */
48062: static void unlockBtreeMutex(Btree *p){
48063: BtShared *pBt = p->pBt;
48064: assert( p->locked==1 );
48065: assert( sqlite3_mutex_held(pBt->mutex) );
48066: assert( sqlite3_mutex_held(p->db->mutex) );
48067: assert( p->db==pBt->db );
48068:
48069: sqlite3_mutex_leave(pBt->mutex);
48070: p->locked = 0;
48071: }
48072:
48073: /*
48074: ** Enter a mutex on the given BTree object.
48075: **
48076: ** If the object is not sharable, then no mutex is ever required
48077: ** and this routine is a no-op. The underlying mutex is non-recursive.
48078: ** But we keep a reference count in Btree.wantToLock so the behavior
48079: ** of this interface is recursive.
48080: **
48081: ** To avoid deadlocks, multiple Btrees are locked in the same order
48082: ** by all database connections. The p->pNext is a list of other
48083: ** Btrees belonging to the same database connection as the p Btree
48084: ** which need to be locked after p. If we cannot get a lock on
48085: ** p, then first unlock all of the others on p->pNext, then wait
48086: ** for the lock to become available on p, then relock all of the
48087: ** subsequent Btrees that desire a lock.
48088: */
48089: SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){
48090: Btree *pLater;
48091:
48092: /* Some basic sanity checking on the Btree. The list of Btrees
48093: ** connected by pNext and pPrev should be in sorted order by
48094: ** Btree.pBt value. All elements of the list should belong to
48095: ** the same connection. Only shared Btrees are on the list. */
48096: assert( p->pNext==0 || p->pNext->pBt>p->pBt );
48097: assert( p->pPrev==0 || p->pPrev->pBt<p->pBt );
48098: assert( p->pNext==0 || p->pNext->db==p->db );
48099: assert( p->pPrev==0 || p->pPrev->db==p->db );
48100: assert( p->sharable || (p->pNext==0 && p->pPrev==0) );
48101:
48102: /* Check for locking consistency */
48103: assert( !p->locked || p->wantToLock>0 );
48104: assert( p->sharable || p->wantToLock==0 );
48105:
48106: /* We should already hold a lock on the database connection */
48107: assert( sqlite3_mutex_held(p->db->mutex) );
48108:
48109: /* Unless the database is sharable and unlocked, then BtShared.db
48110: ** should already be set correctly. */
48111: assert( (p->locked==0 && p->sharable) || p->pBt->db==p->db );
48112:
48113: if( !p->sharable ) return;
48114: p->wantToLock++;
48115: if( p->locked ) return;
48116:
48117: /* In most cases, we should be able to acquire the lock we
48118: ** want without having to go throught the ascending lock
48119: ** procedure that follows. Just be sure not to block.
48120: */
48121: if( sqlite3_mutex_try(p->pBt->mutex)==SQLITE_OK ){
48122: p->pBt->db = p->db;
48123: p->locked = 1;
48124: return;
48125: }
48126:
48127: /* To avoid deadlock, first release all locks with a larger
48128: ** BtShared address. Then acquire our lock. Then reacquire
48129: ** the other BtShared locks that we used to hold in ascending
48130: ** order.
48131: */
48132: for(pLater=p->pNext; pLater; pLater=pLater->pNext){
48133: assert( pLater->sharable );
48134: assert( pLater->pNext==0 || pLater->pNext->pBt>pLater->pBt );
48135: assert( !pLater->locked || pLater->wantToLock>0 );
48136: if( pLater->locked ){
48137: unlockBtreeMutex(pLater);
48138: }
48139: }
48140: lockBtreeMutex(p);
48141: for(pLater=p->pNext; pLater; pLater=pLater->pNext){
48142: if( pLater->wantToLock ){
48143: lockBtreeMutex(pLater);
48144: }
48145: }
48146: }
48147:
48148: /*
48149: ** Exit the recursive mutex on a Btree.
48150: */
48151: SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){
48152: if( p->sharable ){
48153: assert( p->wantToLock>0 );
48154: p->wantToLock--;
48155: if( p->wantToLock==0 ){
48156: unlockBtreeMutex(p);
48157: }
48158: }
48159: }
48160:
48161: #ifndef NDEBUG
48162: /*
48163: ** Return true if the BtShared mutex is held on the btree, or if the
48164: ** B-Tree is not marked as sharable.
48165: **
48166: ** This routine is used only from within assert() statements.
48167: */
48168: SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){
48169: assert( p->sharable==0 || p->locked==0 || p->wantToLock>0 );
48170: assert( p->sharable==0 || p->locked==0 || p->db==p->pBt->db );
48171: assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->pBt->mutex) );
48172: assert( p->sharable==0 || p->locked==0 || sqlite3_mutex_held(p->db->mutex) );
48173:
48174: return (p->sharable==0 || p->locked);
48175: }
48176: #endif
48177:
48178:
48179: #ifndef SQLITE_OMIT_INCRBLOB
48180: /*
48181: ** Enter and leave a mutex on a Btree given a cursor owned by that
48182: ** Btree. These entry points are used by incremental I/O and can be
48183: ** omitted if that module is not used.
48184: */
48185: SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){
48186: sqlite3BtreeEnter(pCur->pBtree);
48187: }
48188: SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){
48189: sqlite3BtreeLeave(pCur->pBtree);
48190: }
48191: #endif /* SQLITE_OMIT_INCRBLOB */
48192:
48193:
48194: /*
48195: ** Enter the mutex on every Btree associated with a database
48196: ** connection. This is needed (for example) prior to parsing
48197: ** a statement since we will be comparing table and column names
48198: ** against all schemas and we do not want those schemas being
48199: ** reset out from under us.
48200: **
48201: ** There is a corresponding leave-all procedures.
48202: **
48203: ** Enter the mutexes in accending order by BtShared pointer address
48204: ** to avoid the possibility of deadlock when two threads with
48205: ** two or more btrees in common both try to lock all their btrees
48206: ** at the same instant.
48207: */
48208: SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
48209: int i;
48210: Btree *p;
48211: assert( sqlite3_mutex_held(db->mutex) );
48212: for(i=0; i<db->nDb; i++){
48213: p = db->aDb[i].pBt;
48214: if( p ) sqlite3BtreeEnter(p);
48215: }
48216: }
48217: SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){
48218: int i;
48219: Btree *p;
48220: assert( sqlite3_mutex_held(db->mutex) );
48221: for(i=0; i<db->nDb; i++){
48222: p = db->aDb[i].pBt;
48223: if( p ) sqlite3BtreeLeave(p);
48224: }
48225: }
48226:
48227: /*
48228: ** Return true if a particular Btree requires a lock. Return FALSE if
48229: ** no lock is ever required since it is not sharable.
48230: */
48231: SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){
48232: return p->sharable;
48233: }
48234:
48235: #ifndef NDEBUG
48236: /*
48237: ** Return true if the current thread holds the database connection
48238: ** mutex and all required BtShared mutexes.
48239: **
48240: ** This routine is used inside assert() statements only.
48241: */
48242: SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3 *db){
48243: int i;
48244: if( !sqlite3_mutex_held(db->mutex) ){
48245: return 0;
48246: }
48247: for(i=0; i<db->nDb; i++){
48248: Btree *p;
48249: p = db->aDb[i].pBt;
48250: if( p && p->sharable &&
48251: (p->wantToLock==0 || !sqlite3_mutex_held(p->pBt->mutex)) ){
48252: return 0;
48253: }
48254: }
48255: return 1;
48256: }
48257: #endif /* NDEBUG */
48258:
48259: #ifndef NDEBUG
48260: /*
48261: ** Return true if the correct mutexes are held for accessing the
48262: ** db->aDb[iDb].pSchema structure. The mutexes required for schema
48263: ** access are:
48264: **
48265: ** (1) The mutex on db
48266: ** (2) if iDb!=1, then the mutex on db->aDb[iDb].pBt.
48267: **
48268: ** If pSchema is not NULL, then iDb is computed from pSchema and
48269: ** db using sqlite3SchemaToIndex().
48270: */
48271: SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3 *db, int iDb, Schema *pSchema){
48272: Btree *p;
48273: assert( db!=0 );
48274: if( pSchema ) iDb = sqlite3SchemaToIndex(db, pSchema);
48275: assert( iDb>=0 && iDb<db->nDb );
48276: if( !sqlite3_mutex_held(db->mutex) ) return 0;
48277: if( iDb==1 ) return 1;
48278: p = db->aDb[iDb].pBt;
48279: assert( p!=0 );
48280: return p->sharable==0 || p->locked==1;
48281: }
48282: #endif /* NDEBUG */
48283:
48284: #else /* SQLITE_THREADSAFE>0 above. SQLITE_THREADSAFE==0 below */
48285: /*
48286: ** The following are special cases for mutex enter routines for use
48287: ** in single threaded applications that use shared cache. Except for
48288: ** these two routines, all mutex operations are no-ops in that case and
48289: ** are null #defines in btree.h.
48290: **
48291: ** If shared cache is disabled, then all btree mutex routines, including
48292: ** the ones below, are no-ops and are null #defines in btree.h.
48293: */
48294:
48295: SQLITE_PRIVATE void sqlite3BtreeEnter(Btree *p){
48296: p->pBt->db = p->db;
48297: }
48298: SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){
48299: int i;
48300: for(i=0; i<db->nDb; i++){
48301: Btree *p = db->aDb[i].pBt;
48302: if( p ){
48303: p->pBt->db = p->db;
48304: }
48305: }
48306: }
48307: #endif /* if SQLITE_THREADSAFE */
48308: #endif /* ifndef SQLITE_OMIT_SHARED_CACHE */
48309:
48310: /************** End of btmutex.c *********************************************/
48311: /************** Begin file btree.c *******************************************/
48312: /*
48313: ** 2004 April 6
48314: **
48315: ** The author disclaims copyright to this source code. In place of
48316: ** a legal notice, here is a blessing:
48317: **
48318: ** May you do good and not evil.
48319: ** May you find forgiveness for yourself and forgive others.
48320: ** May you share freely, never taking more than you give.
48321: **
48322: *************************************************************************
48323: ** This file implements a external (disk-based) database using BTrees.
48324: ** See the header comment on "btreeInt.h" for additional information.
48325: ** Including a description of file format and an overview of operation.
48326: */
48327:
48328: /*
48329: ** The header string that appears at the beginning of every
48330: ** SQLite database.
48331: */
48332: static const char zMagicHeader[] = SQLITE_FILE_HEADER;
48333:
48334: /*
48335: ** Set this global variable to 1 to enable tracing using the TRACE
48336: ** macro.
48337: */
48338: #if 0
48339: int sqlite3BtreeTrace=1; /* True to enable tracing */
48340: # define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);}
48341: #else
48342: # define TRACE(X)
48343: #endif
48344:
48345: /*
48346: ** Extract a 2-byte big-endian integer from an array of unsigned bytes.
48347: ** But if the value is zero, make it 65536.
48348: **
48349: ** This routine is used to extract the "offset to cell content area" value
48350: ** from the header of a btree page. If the page size is 65536 and the page
48351: ** is empty, the offset should be 65536, but the 2-byte value stores zero.
48352: ** This routine makes the necessary adjustment to 65536.
48353: */
48354: #define get2byteNotZero(X) (((((int)get2byte(X))-1)&0xffff)+1)
48355:
48356: #ifndef SQLITE_OMIT_SHARED_CACHE
48357: /*
48358: ** A list of BtShared objects that are eligible for participation
48359: ** in shared cache. This variable has file scope during normal builds,
48360: ** but the test harness needs to access it so we make it global for
48361: ** test builds.
48362: **
48363: ** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER.
48364: */
48365: #ifdef SQLITE_TEST
48366: SQLITE_PRIVATE BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
48367: #else
48368: static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
48369: #endif
48370: #endif /* SQLITE_OMIT_SHARED_CACHE */
48371:
48372: #ifndef SQLITE_OMIT_SHARED_CACHE
48373: /*
48374: ** Enable or disable the shared pager and schema features.
48375: **
48376: ** This routine has no effect on existing database connections.
48377: ** The shared cache setting effects only future calls to
48378: ** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2().
48379: */
48380: SQLITE_API int sqlite3_enable_shared_cache(int enable){
48381: sqlite3GlobalConfig.sharedCacheEnabled = enable;
48382: return SQLITE_OK;
48383: }
48384: #endif
48385:
48386:
48387:
48388: #ifdef SQLITE_OMIT_SHARED_CACHE
48389: /*
48390: ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(),
48391: ** and clearAllSharedCacheTableLocks()
48392: ** manipulate entries in the BtShared.pLock linked list used to store
48393: ** shared-cache table level locks. If the library is compiled with the
48394: ** shared-cache feature disabled, then there is only ever one user
48395: ** of each BtShared structure and so this locking is not necessary.
48396: ** So define the lock related functions as no-ops.
48397: */
48398: #define querySharedCacheTableLock(a,b,c) SQLITE_OK
48399: #define setSharedCacheTableLock(a,b,c) SQLITE_OK
48400: #define clearAllSharedCacheTableLocks(a)
48401: #define downgradeAllSharedCacheTableLocks(a)
48402: #define hasSharedCacheTableLock(a,b,c,d) 1
48403: #define hasReadConflicts(a, b) 0
48404: #endif
48405:
48406: #ifndef SQLITE_OMIT_SHARED_CACHE
48407:
48408: #ifdef SQLITE_DEBUG
48409: /*
48410: **** This function is only used as part of an assert() statement. ***
48411: **
48412: ** Check to see if pBtree holds the required locks to read or write to the
48413: ** table with root page iRoot. Return 1 if it does and 0 if not.
48414: **
48415: ** For example, when writing to a table with root-page iRoot via
48416: ** Btree connection pBtree:
48417: **
48418: ** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) );
48419: **
48420: ** When writing to an index that resides in a sharable database, the
48421: ** caller should have first obtained a lock specifying the root page of
48422: ** the corresponding table. This makes things a bit more complicated,
48423: ** as this module treats each table as a separate structure. To determine
48424: ** the table corresponding to the index being written, this
48425: ** function has to search through the database schema.
48426: **
48427: ** Instead of a lock on the table/index rooted at page iRoot, the caller may
48428: ** hold a write-lock on the schema table (root page 1). This is also
48429: ** acceptable.
48430: */
48431: static int hasSharedCacheTableLock(
48432: Btree *pBtree, /* Handle that must hold lock */
48433: Pgno iRoot, /* Root page of b-tree */
48434: int isIndex, /* True if iRoot is the root of an index b-tree */
48435: int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */
48436: ){
48437: Schema *pSchema = (Schema *)pBtree->pBt->pSchema;
48438: Pgno iTab = 0;
48439: BtLock *pLock;
48440:
48441: /* If this database is not shareable, or if the client is reading
48442: ** and has the read-uncommitted flag set, then no lock is required.
48443: ** Return true immediately.
48444: */
48445: if( (pBtree->sharable==0)
48446: || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted))
48447: ){
48448: return 1;
48449: }
48450:
48451: /* If the client is reading or writing an index and the schema is
48452: ** not loaded, then it is too difficult to actually check to see if
48453: ** the correct locks are held. So do not bother - just return true.
48454: ** This case does not come up very often anyhow.
48455: */
48456: if( isIndex && (!pSchema || (pSchema->flags&DB_SchemaLoaded)==0) ){
48457: return 1;
48458: }
48459:
48460: /* Figure out the root-page that the lock should be held on. For table
48461: ** b-trees, this is just the root page of the b-tree being read or
48462: ** written. For index b-trees, it is the root page of the associated
48463: ** table. */
48464: if( isIndex ){
48465: HashElem *p;
48466: for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){
48467: Index *pIdx = (Index *)sqliteHashData(p);
48468: if( pIdx->tnum==(int)iRoot ){
48469: iTab = pIdx->pTable->tnum;
48470: }
48471: }
48472: }else{
48473: iTab = iRoot;
48474: }
48475:
48476: /* Search for the required lock. Either a write-lock on root-page iTab, a
48477: ** write-lock on the schema table, or (if the client is reading) a
48478: ** read-lock on iTab will suffice. Return 1 if any of these are found. */
48479: for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){
48480: if( pLock->pBtree==pBtree
48481: && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1))
48482: && pLock->eLock>=eLockType
48483: ){
48484: return 1;
48485: }
48486: }
48487:
48488: /* Failed to find the required lock. */
48489: return 0;
48490: }
48491: #endif /* SQLITE_DEBUG */
48492:
48493: #ifdef SQLITE_DEBUG
48494: /*
48495: **** This function may be used as part of assert() statements only. ****
48496: **
48497: ** Return true if it would be illegal for pBtree to write into the
48498: ** table or index rooted at iRoot because other shared connections are
48499: ** simultaneously reading that same table or index.
48500: **
48501: ** It is illegal for pBtree to write if some other Btree object that
48502: ** shares the same BtShared object is currently reading or writing
48503: ** the iRoot table. Except, if the other Btree object has the
48504: ** read-uncommitted flag set, then it is OK for the other object to
48505: ** have a read cursor.
48506: **
48507: ** For example, before writing to any part of the table or index
48508: ** rooted at page iRoot, one should call:
48509: **
48510: ** assert( !hasReadConflicts(pBtree, iRoot) );
48511: */
48512: static int hasReadConflicts(Btree *pBtree, Pgno iRoot){
48513: BtCursor *p;
48514: for(p=pBtree->pBt->pCursor; p; p=p->pNext){
48515: if( p->pgnoRoot==iRoot
48516: && p->pBtree!=pBtree
48517: && 0==(p->pBtree->db->flags & SQLITE_ReadUncommitted)
48518: ){
48519: return 1;
48520: }
48521: }
48522: return 0;
48523: }
48524: #endif /* #ifdef SQLITE_DEBUG */
48525:
48526: /*
48527: ** Query to see if Btree handle p may obtain a lock of type eLock
48528: ** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return
48529: ** SQLITE_OK if the lock may be obtained (by calling
48530: ** setSharedCacheTableLock()), or SQLITE_LOCKED if not.
48531: */
48532: static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){
48533: BtShared *pBt = p->pBt;
48534: BtLock *pIter;
48535:
48536: assert( sqlite3BtreeHoldsMutex(p) );
48537: assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
48538: assert( p->db!=0 );
48539: assert( !(p->db->flags&SQLITE_ReadUncommitted)||eLock==WRITE_LOCK||iTab==1 );
48540:
48541: /* If requesting a write-lock, then the Btree must have an open write
48542: ** transaction on this file. And, obviously, for this to be so there
48543: ** must be an open write transaction on the file itself.
48544: */
48545: assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) );
48546: assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE );
48547:
48548: /* This routine is a no-op if the shared-cache is not enabled */
48549: if( !p->sharable ){
48550: return SQLITE_OK;
48551: }
48552:
48553: /* If some other connection is holding an exclusive lock, the
48554: ** requested lock may not be obtained.
48555: */
48556: if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){
48557: sqlite3ConnectionBlocked(p->db, pBt->pWriter->db);
48558: return SQLITE_LOCKED_SHAREDCACHE;
48559: }
48560:
48561: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
48562: /* The condition (pIter->eLock!=eLock) in the following if(...)
48563: ** statement is a simplification of:
48564: **
48565: ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK)
48566: **
48567: ** since we know that if eLock==WRITE_LOCK, then no other connection
48568: ** may hold a WRITE_LOCK on any table in this file (since there can
48569: ** only be a single writer).
48570: */
48571: assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK );
48572: assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK);
48573: if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){
48574: sqlite3ConnectionBlocked(p->db, pIter->pBtree->db);
48575: if( eLock==WRITE_LOCK ){
48576: assert( p==pBt->pWriter );
48577: pBt->btsFlags |= BTS_PENDING;
48578: }
48579: return SQLITE_LOCKED_SHAREDCACHE;
48580: }
48581: }
48582: return SQLITE_OK;
48583: }
48584: #endif /* !SQLITE_OMIT_SHARED_CACHE */
48585:
48586: #ifndef SQLITE_OMIT_SHARED_CACHE
48587: /*
48588: ** Add a lock on the table with root-page iTable to the shared-btree used
48589: ** by Btree handle p. Parameter eLock must be either READ_LOCK or
48590: ** WRITE_LOCK.
48591: **
48592: ** This function assumes the following:
48593: **
48594: ** (a) The specified Btree object p is connected to a sharable
48595: ** database (one with the BtShared.sharable flag set), and
48596: **
48597: ** (b) No other Btree objects hold a lock that conflicts
48598: ** with the requested lock (i.e. querySharedCacheTableLock() has
48599: ** already been called and returned SQLITE_OK).
48600: **
48601: ** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM
48602: ** is returned if a malloc attempt fails.
48603: */
48604: static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){
48605: BtShared *pBt = p->pBt;
48606: BtLock *pLock = 0;
48607: BtLock *pIter;
48608:
48609: assert( sqlite3BtreeHoldsMutex(p) );
48610: assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
48611: assert( p->db!=0 );
48612:
48613: /* A connection with the read-uncommitted flag set will never try to
48614: ** obtain a read-lock using this function. The only read-lock obtained
48615: ** by a connection in read-uncommitted mode is on the sqlite_master
48616: ** table, and that lock is obtained in BtreeBeginTrans(). */
48617: assert( 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK );
48618:
48619: /* This function should only be called on a sharable b-tree after it
48620: ** has been determined that no other b-tree holds a conflicting lock. */
48621: assert( p->sharable );
48622: assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) );
48623:
48624: /* First search the list for an existing lock on this table. */
48625: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
48626: if( pIter->iTable==iTable && pIter->pBtree==p ){
48627: pLock = pIter;
48628: break;
48629: }
48630: }
48631:
48632: /* If the above search did not find a BtLock struct associating Btree p
48633: ** with table iTable, allocate one and link it into the list.
48634: */
48635: if( !pLock ){
48636: pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock));
48637: if( !pLock ){
48638: return SQLITE_NOMEM;
48639: }
48640: pLock->iTable = iTable;
48641: pLock->pBtree = p;
48642: pLock->pNext = pBt->pLock;
48643: pBt->pLock = pLock;
48644: }
48645:
48646: /* Set the BtLock.eLock variable to the maximum of the current lock
48647: ** and the requested lock. This means if a write-lock was already held
48648: ** and a read-lock requested, we don't incorrectly downgrade the lock.
48649: */
48650: assert( WRITE_LOCK>READ_LOCK );
48651: if( eLock>pLock->eLock ){
48652: pLock->eLock = eLock;
48653: }
48654:
48655: return SQLITE_OK;
48656: }
48657: #endif /* !SQLITE_OMIT_SHARED_CACHE */
48658:
48659: #ifndef SQLITE_OMIT_SHARED_CACHE
48660: /*
48661: ** Release all the table locks (locks obtained via calls to
48662: ** the setSharedCacheTableLock() procedure) held by Btree object p.
48663: **
48664: ** This function assumes that Btree p has an open read or write
48665: ** transaction. If it does not, then the BTS_PENDING flag
48666: ** may be incorrectly cleared.
48667: */
48668: static void clearAllSharedCacheTableLocks(Btree *p){
48669: BtShared *pBt = p->pBt;
48670: BtLock **ppIter = &pBt->pLock;
48671:
48672: assert( sqlite3BtreeHoldsMutex(p) );
48673: assert( p->sharable || 0==*ppIter );
48674: assert( p->inTrans>0 );
48675:
48676: while( *ppIter ){
48677: BtLock *pLock = *ppIter;
48678: assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree );
48679: assert( pLock->pBtree->inTrans>=pLock->eLock );
48680: if( pLock->pBtree==p ){
48681: *ppIter = pLock->pNext;
48682: assert( pLock->iTable!=1 || pLock==&p->lock );
48683: if( pLock->iTable!=1 ){
48684: sqlite3_free(pLock);
48685: }
48686: }else{
48687: ppIter = &pLock->pNext;
48688: }
48689: }
48690:
48691: assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter );
48692: if( pBt->pWriter==p ){
48693: pBt->pWriter = 0;
48694: pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING);
48695: }else if( pBt->nTransaction==2 ){
48696: /* This function is called when Btree p is concluding its
48697: ** transaction. If there currently exists a writer, and p is not
48698: ** that writer, then the number of locks held by connections other
48699: ** than the writer must be about to drop to zero. In this case
48700: ** set the BTS_PENDING flag to 0.
48701: **
48702: ** If there is not currently a writer, then BTS_PENDING must
48703: ** be zero already. So this next line is harmless in that case.
48704: */
48705: pBt->btsFlags &= ~BTS_PENDING;
48706: }
48707: }
48708:
48709: /*
48710: ** This function changes all write-locks held by Btree p into read-locks.
48711: */
48712: static void downgradeAllSharedCacheTableLocks(Btree *p){
48713: BtShared *pBt = p->pBt;
48714: if( pBt->pWriter==p ){
48715: BtLock *pLock;
48716: pBt->pWriter = 0;
48717: pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING);
48718: for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){
48719: assert( pLock->eLock==READ_LOCK || pLock->pBtree==p );
48720: pLock->eLock = READ_LOCK;
48721: }
48722: }
48723: }
48724:
48725: #endif /* SQLITE_OMIT_SHARED_CACHE */
48726:
48727: static void releasePage(MemPage *pPage); /* Forward reference */
48728:
48729: /*
48730: ***** This routine is used inside of assert() only ****
48731: **
48732: ** Verify that the cursor holds the mutex on its BtShared
48733: */
48734: #ifdef SQLITE_DEBUG
48735: static int cursorHoldsMutex(BtCursor *p){
48736: return sqlite3_mutex_held(p->pBt->mutex);
48737: }
48738: #endif
48739:
48740:
48741: #ifndef SQLITE_OMIT_INCRBLOB
48742: /*
48743: ** Invalidate the overflow page-list cache for cursor pCur, if any.
48744: */
48745: static void invalidateOverflowCache(BtCursor *pCur){
48746: assert( cursorHoldsMutex(pCur) );
48747: sqlite3_free(pCur->aOverflow);
48748: pCur->aOverflow = 0;
48749: }
48750:
48751: /*
48752: ** Invalidate the overflow page-list cache for all cursors opened
48753: ** on the shared btree structure pBt.
48754: */
48755: static void invalidateAllOverflowCache(BtShared *pBt){
48756: BtCursor *p;
48757: assert( sqlite3_mutex_held(pBt->mutex) );
48758: for(p=pBt->pCursor; p; p=p->pNext){
48759: invalidateOverflowCache(p);
48760: }
48761: }
48762:
48763: /*
48764: ** This function is called before modifying the contents of a table
48765: ** to invalidate any incrblob cursors that are open on the
48766: ** row or one of the rows being modified.
48767: **
48768: ** If argument isClearTable is true, then the entire contents of the
48769: ** table is about to be deleted. In this case invalidate all incrblob
48770: ** cursors open on any row within the table with root-page pgnoRoot.
48771: **
48772: ** Otherwise, if argument isClearTable is false, then the row with
48773: ** rowid iRow is being replaced or deleted. In this case invalidate
48774: ** only those incrblob cursors open on that specific row.
48775: */
48776: static void invalidateIncrblobCursors(
48777: Btree *pBtree, /* The database file to check */
48778: i64 iRow, /* The rowid that might be changing */
48779: int isClearTable /* True if all rows are being deleted */
48780: ){
48781: BtCursor *p;
48782: BtShared *pBt = pBtree->pBt;
48783: assert( sqlite3BtreeHoldsMutex(pBtree) );
48784: for(p=pBt->pCursor; p; p=p->pNext){
48785: if( p->isIncrblobHandle && (isClearTable || p->info.nKey==iRow) ){
48786: p->eState = CURSOR_INVALID;
48787: }
48788: }
48789: }
48790:
48791: #else
48792: /* Stub functions when INCRBLOB is omitted */
48793: #define invalidateOverflowCache(x)
48794: #define invalidateAllOverflowCache(x)
48795: #define invalidateIncrblobCursors(x,y,z)
48796: #endif /* SQLITE_OMIT_INCRBLOB */
48797:
48798: /*
48799: ** Set bit pgno of the BtShared.pHasContent bitvec. This is called
48800: ** when a page that previously contained data becomes a free-list leaf
48801: ** page.
48802: **
48803: ** The BtShared.pHasContent bitvec exists to work around an obscure
48804: ** bug caused by the interaction of two useful IO optimizations surrounding
48805: ** free-list leaf pages:
48806: **
48807: ** 1) When all data is deleted from a page and the page becomes
48808: ** a free-list leaf page, the page is not written to the database
48809: ** (as free-list leaf pages contain no meaningful data). Sometimes
48810: ** such a page is not even journalled (as it will not be modified,
48811: ** why bother journalling it?).
48812: **
48813: ** 2) When a free-list leaf page is reused, its content is not read
48814: ** from the database or written to the journal file (why should it
48815: ** be, if it is not at all meaningful?).
48816: **
48817: ** By themselves, these optimizations work fine and provide a handy
48818: ** performance boost to bulk delete or insert operations. However, if
48819: ** a page is moved to the free-list and then reused within the same
48820: ** transaction, a problem comes up. If the page is not journalled when
48821: ** it is moved to the free-list and it is also not journalled when it
48822: ** is extracted from the free-list and reused, then the original data
48823: ** may be lost. In the event of a rollback, it may not be possible
48824: ** to restore the database to its original configuration.
48825: **
48826: ** The solution is the BtShared.pHasContent bitvec. Whenever a page is
48827: ** moved to become a free-list leaf page, the corresponding bit is
48828: ** set in the bitvec. Whenever a leaf page is extracted from the free-list,
48829: ** optimization 2 above is omitted if the corresponding bit is already
48830: ** set in BtShared.pHasContent. The contents of the bitvec are cleared
48831: ** at the end of every transaction.
48832: */
48833: static int btreeSetHasContent(BtShared *pBt, Pgno pgno){
48834: int rc = SQLITE_OK;
48835: if( !pBt->pHasContent ){
48836: assert( pgno<=pBt->nPage );
48837: pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage);
48838: if( !pBt->pHasContent ){
48839: rc = SQLITE_NOMEM;
48840: }
48841: }
48842: if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){
48843: rc = sqlite3BitvecSet(pBt->pHasContent, pgno);
48844: }
48845: return rc;
48846: }
48847:
48848: /*
48849: ** Query the BtShared.pHasContent vector.
48850: **
48851: ** This function is called when a free-list leaf page is removed from the
48852: ** free-list for reuse. It returns false if it is safe to retrieve the
48853: ** page from the pager layer with the 'no-content' flag set. True otherwise.
48854: */
48855: static int btreeGetHasContent(BtShared *pBt, Pgno pgno){
48856: Bitvec *p = pBt->pHasContent;
48857: return (p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTest(p, pgno)));
48858: }
48859:
48860: /*
48861: ** Clear (destroy) the BtShared.pHasContent bitvec. This should be
48862: ** invoked at the conclusion of each write-transaction.
48863: */
48864: static void btreeClearHasContent(BtShared *pBt){
48865: sqlite3BitvecDestroy(pBt->pHasContent);
48866: pBt->pHasContent = 0;
48867: }
48868:
48869: /*
48870: ** Save the current cursor position in the variables BtCursor.nKey
48871: ** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK.
48872: **
48873: ** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID)
48874: ** prior to calling this routine.
48875: */
48876: static int saveCursorPosition(BtCursor *pCur){
48877: int rc;
48878:
48879: assert( CURSOR_VALID==pCur->eState );
48880: assert( 0==pCur->pKey );
48881: assert( cursorHoldsMutex(pCur) );
48882:
48883: rc = sqlite3BtreeKeySize(pCur, &pCur->nKey);
48884: assert( rc==SQLITE_OK ); /* KeySize() cannot fail */
48885:
48886: /* If this is an intKey table, then the above call to BtreeKeySize()
48887: ** stores the integer key in pCur->nKey. In this case this value is
48888: ** all that is required. Otherwise, if pCur is not open on an intKey
48889: ** table, then malloc space for and store the pCur->nKey bytes of key
48890: ** data.
48891: */
48892: if( 0==pCur->apPage[0]->intKey ){
48893: void *pKey = sqlite3Malloc( (int)pCur->nKey );
48894: if( pKey ){
48895: rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey);
48896: if( rc==SQLITE_OK ){
48897: pCur->pKey = pKey;
48898: }else{
48899: sqlite3_free(pKey);
48900: }
48901: }else{
48902: rc = SQLITE_NOMEM;
48903: }
48904: }
48905: assert( !pCur->apPage[0]->intKey || !pCur->pKey );
48906:
48907: if( rc==SQLITE_OK ){
48908: int i;
48909: for(i=0; i<=pCur->iPage; i++){
48910: releasePage(pCur->apPage[i]);
48911: pCur->apPage[i] = 0;
48912: }
48913: pCur->iPage = -1;
48914: pCur->eState = CURSOR_REQUIRESEEK;
48915: }
48916:
48917: invalidateOverflowCache(pCur);
48918: return rc;
48919: }
48920:
48921: /*
48922: ** Save the positions of all cursors (except pExcept) that are open on
48923: ** the table with root-page iRoot. Usually, this is called just before cursor
48924: ** pExcept is used to modify the table (BtreeDelete() or BtreeInsert()).
48925: */
48926: static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){
48927: BtCursor *p;
48928: assert( sqlite3_mutex_held(pBt->mutex) );
48929: assert( pExcept==0 || pExcept->pBt==pBt );
48930: for(p=pBt->pCursor; p; p=p->pNext){
48931: if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) &&
48932: p->eState==CURSOR_VALID ){
48933: int rc = saveCursorPosition(p);
48934: if( SQLITE_OK!=rc ){
48935: return rc;
48936: }
48937: }
48938: }
48939: return SQLITE_OK;
48940: }
48941:
48942: /*
48943: ** Clear the current cursor position.
48944: */
48945: SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){
48946: assert( cursorHoldsMutex(pCur) );
48947: sqlite3_free(pCur->pKey);
48948: pCur->pKey = 0;
48949: pCur->eState = CURSOR_INVALID;
48950: }
48951:
48952: /*
48953: ** In this version of BtreeMoveto, pKey is a packed index record
48954: ** such as is generated by the OP_MakeRecord opcode. Unpack the
48955: ** record and then call BtreeMovetoUnpacked() to do the work.
48956: */
48957: static int btreeMoveto(
48958: BtCursor *pCur, /* Cursor open on the btree to be searched */
48959: const void *pKey, /* Packed key if the btree is an index */
48960: i64 nKey, /* Integer key for tables. Size of pKey for indices */
48961: int bias, /* Bias search to the high end */
48962: int *pRes /* Write search results here */
48963: ){
48964: int rc; /* Status code */
48965: UnpackedRecord *pIdxKey; /* Unpacked index key */
48966: char aSpace[150]; /* Temp space for pIdxKey - to avoid a malloc */
48967: char *pFree = 0;
48968:
48969: if( pKey ){
48970: assert( nKey==(i64)(int)nKey );
48971: pIdxKey = sqlite3VdbeAllocUnpackedRecord(
48972: pCur->pKeyInfo, aSpace, sizeof(aSpace), &pFree
48973: );
48974: if( pIdxKey==0 ) return SQLITE_NOMEM;
48975: sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey);
48976: }else{
48977: pIdxKey = 0;
48978: }
48979: rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes);
48980: if( pFree ){
48981: sqlite3DbFree(pCur->pKeyInfo->db, pFree);
48982: }
48983: return rc;
48984: }
48985:
48986: /*
48987: ** Restore the cursor to the position it was in (or as close to as possible)
48988: ** when saveCursorPosition() was called. Note that this call deletes the
48989: ** saved position info stored by saveCursorPosition(), so there can be
48990: ** at most one effective restoreCursorPosition() call after each
48991: ** saveCursorPosition().
48992: */
48993: static int btreeRestoreCursorPosition(BtCursor *pCur){
48994: int rc;
48995: assert( cursorHoldsMutex(pCur) );
48996: assert( pCur->eState>=CURSOR_REQUIRESEEK );
48997: if( pCur->eState==CURSOR_FAULT ){
48998: return pCur->skipNext;
48999: }
49000: pCur->eState = CURSOR_INVALID;
49001: rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skipNext);
49002: if( rc==SQLITE_OK ){
49003: sqlite3_free(pCur->pKey);
49004: pCur->pKey = 0;
49005: assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID );
49006: }
49007: return rc;
49008: }
49009:
49010: #define restoreCursorPosition(p) \
49011: (p->eState>=CURSOR_REQUIRESEEK ? \
49012: btreeRestoreCursorPosition(p) : \
49013: SQLITE_OK)
49014:
49015: /*
49016: ** Determine whether or not a cursor has moved from the position it
49017: ** was last placed at. Cursors can move when the row they are pointing
49018: ** at is deleted out from under them.
49019: **
49020: ** This routine returns an error code if something goes wrong. The
49021: ** integer *pHasMoved is set to one if the cursor has moved and 0 if not.
49022: */
49023: SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur, int *pHasMoved){
49024: int rc;
49025:
49026: rc = restoreCursorPosition(pCur);
49027: if( rc ){
49028: *pHasMoved = 1;
49029: return rc;
49030: }
49031: if( pCur->eState!=CURSOR_VALID || pCur->skipNext!=0 ){
49032: *pHasMoved = 1;
49033: }else{
49034: *pHasMoved = 0;
49035: }
49036: return SQLITE_OK;
49037: }
49038:
49039: #ifndef SQLITE_OMIT_AUTOVACUUM
49040: /*
49041: ** Given a page number of a regular database page, return the page
49042: ** number for the pointer-map page that contains the entry for the
49043: ** input page number.
49044: **
49045: ** Return 0 (not a valid page) for pgno==1 since there is
49046: ** no pointer map associated with page 1. The integrity_check logic
49047: ** requires that ptrmapPageno(*,1)!=1.
49048: */
49049: static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){
49050: int nPagesPerMapPage;
49051: Pgno iPtrMap, ret;
49052: assert( sqlite3_mutex_held(pBt->mutex) );
49053: if( pgno<2 ) return 0;
49054: nPagesPerMapPage = (pBt->usableSize/5)+1;
49055: iPtrMap = (pgno-2)/nPagesPerMapPage;
49056: ret = (iPtrMap*nPagesPerMapPage) + 2;
49057: if( ret==PENDING_BYTE_PAGE(pBt) ){
49058: ret++;
49059: }
49060: return ret;
49061: }
49062:
49063: /*
49064: ** Write an entry into the pointer map.
49065: **
49066: ** This routine updates the pointer map entry for page number 'key'
49067: ** so that it maps to type 'eType' and parent page number 'pgno'.
49068: **
49069: ** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is
49070: ** a no-op. If an error occurs, the appropriate error code is written
49071: ** into *pRC.
49072: */
49073: static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){
49074: DbPage *pDbPage; /* The pointer map page */
49075: u8 *pPtrmap; /* The pointer map data */
49076: Pgno iPtrmap; /* The pointer map page number */
49077: int offset; /* Offset in pointer map page */
49078: int rc; /* Return code from subfunctions */
49079:
49080: if( *pRC ) return;
49081:
49082: assert( sqlite3_mutex_held(pBt->mutex) );
49083: /* The master-journal page number must never be used as a pointer map page */
49084: assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) );
49085:
49086: assert( pBt->autoVacuum );
49087: if( key==0 ){
49088: *pRC = SQLITE_CORRUPT_BKPT;
49089: return;
49090: }
49091: iPtrmap = PTRMAP_PAGENO(pBt, key);
49092: rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
49093: if( rc!=SQLITE_OK ){
49094: *pRC = rc;
49095: return;
49096: }
49097: offset = PTRMAP_PTROFFSET(iPtrmap, key);
49098: if( offset<0 ){
49099: *pRC = SQLITE_CORRUPT_BKPT;
49100: goto ptrmap_exit;
49101: }
49102: assert( offset <= (int)pBt->usableSize-5 );
49103: pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
49104:
49105: if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){
49106: TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent));
49107: *pRC= rc = sqlite3PagerWrite(pDbPage);
49108: if( rc==SQLITE_OK ){
49109: pPtrmap[offset] = eType;
49110: put4byte(&pPtrmap[offset+1], parent);
49111: }
49112: }
49113:
49114: ptrmap_exit:
49115: sqlite3PagerUnref(pDbPage);
49116: }
49117:
49118: /*
49119: ** Read an entry from the pointer map.
49120: **
49121: ** This routine retrieves the pointer map entry for page 'key', writing
49122: ** the type and parent page number to *pEType and *pPgno respectively.
49123: ** An error code is returned if something goes wrong, otherwise SQLITE_OK.
49124: */
49125: static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
49126: DbPage *pDbPage; /* The pointer map page */
49127: int iPtrmap; /* Pointer map page index */
49128: u8 *pPtrmap; /* Pointer map page data */
49129: int offset; /* Offset of entry in pointer map */
49130: int rc;
49131:
49132: assert( sqlite3_mutex_held(pBt->mutex) );
49133:
49134: iPtrmap = PTRMAP_PAGENO(pBt, key);
49135: rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
49136: if( rc!=0 ){
49137: return rc;
49138: }
49139: pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
49140:
49141: offset = PTRMAP_PTROFFSET(iPtrmap, key);
49142: if( offset<0 ){
49143: sqlite3PagerUnref(pDbPage);
49144: return SQLITE_CORRUPT_BKPT;
49145: }
49146: assert( offset <= (int)pBt->usableSize-5 );
49147: assert( pEType!=0 );
49148: *pEType = pPtrmap[offset];
49149: if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]);
49150:
49151: sqlite3PagerUnref(pDbPage);
49152: if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT;
49153: return SQLITE_OK;
49154: }
49155:
49156: #else /* if defined SQLITE_OMIT_AUTOVACUUM */
49157: #define ptrmapPut(w,x,y,z,rc)
49158: #define ptrmapGet(w,x,y,z) SQLITE_OK
49159: #define ptrmapPutOvflPtr(x, y, rc)
49160: #endif
49161:
49162: /*
49163: ** Given a btree page and a cell index (0 means the first cell on
49164: ** the page, 1 means the second cell, and so forth) return a pointer
49165: ** to the cell content.
49166: **
49167: ** This routine works only for pages that do not contain overflow cells.
49168: */
49169: #define findCell(P,I) \
49170: ((P)->aData + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)])))
49171: #define findCellv2(D,M,O,I) (D+(M&get2byte(D+(O+2*(I)))))
49172:
49173:
49174: /*
49175: ** This a more complex version of findCell() that works for
49176: ** pages that do contain overflow cells.
49177: */
49178: static u8 *findOverflowCell(MemPage *pPage, int iCell){
49179: int i;
49180: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49181: for(i=pPage->nOverflow-1; i>=0; i--){
49182: int k;
1.2.2.1 ! misho 49183: k = pPage->aiOvfl[i];
1.2 misho 49184: if( k<=iCell ){
49185: if( k==iCell ){
1.2.2.1 ! misho 49186: return pPage->apOvfl[i];
1.2 misho 49187: }
49188: iCell--;
49189: }
49190: }
49191: return findCell(pPage, iCell);
49192: }
49193:
49194: /*
49195: ** Parse a cell content block and fill in the CellInfo structure. There
49196: ** are two versions of this function. btreeParseCell() takes a
49197: ** cell index as the second argument and btreeParseCellPtr()
49198: ** takes a pointer to the body of the cell as its second argument.
49199: **
49200: ** Within this file, the parseCell() macro can be called instead of
49201: ** btreeParseCellPtr(). Using some compilers, this will be faster.
49202: */
49203: static void btreeParseCellPtr(
49204: MemPage *pPage, /* Page containing the cell */
49205: u8 *pCell, /* Pointer to the cell text. */
49206: CellInfo *pInfo /* Fill in this structure */
49207: ){
49208: u16 n; /* Number bytes in cell content header */
49209: u32 nPayload; /* Number of bytes of cell payload */
49210:
49211: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49212:
49213: pInfo->pCell = pCell;
49214: assert( pPage->leaf==0 || pPage->leaf==1 );
49215: n = pPage->childPtrSize;
49216: assert( n==4-4*pPage->leaf );
49217: if( pPage->intKey ){
49218: if( pPage->hasData ){
49219: n += getVarint32(&pCell[n], nPayload);
49220: }else{
49221: nPayload = 0;
49222: }
49223: n += getVarint(&pCell[n], (u64*)&pInfo->nKey);
49224: pInfo->nData = nPayload;
49225: }else{
49226: pInfo->nData = 0;
49227: n += getVarint32(&pCell[n], nPayload);
49228: pInfo->nKey = nPayload;
49229: }
49230: pInfo->nPayload = nPayload;
49231: pInfo->nHeader = n;
49232: testcase( nPayload==pPage->maxLocal );
49233: testcase( nPayload==pPage->maxLocal+1 );
49234: if( likely(nPayload<=pPage->maxLocal) ){
49235: /* This is the (easy) common case where the entire payload fits
49236: ** on the local page. No overflow is required.
49237: */
49238: if( (pInfo->nSize = (u16)(n+nPayload))<4 ) pInfo->nSize = 4;
49239: pInfo->nLocal = (u16)nPayload;
49240: pInfo->iOverflow = 0;
49241: }else{
49242: /* If the payload will not fit completely on the local page, we have
49243: ** to decide how much to store locally and how much to spill onto
49244: ** overflow pages. The strategy is to minimize the amount of unused
49245: ** space on overflow pages while keeping the amount of local storage
49246: ** in between minLocal and maxLocal.
49247: **
49248: ** Warning: changing the way overflow payload is distributed in any
49249: ** way will result in an incompatible file format.
49250: */
49251: int minLocal; /* Minimum amount of payload held locally */
49252: int maxLocal; /* Maximum amount of payload held locally */
49253: int surplus; /* Overflow payload available for local storage */
49254:
49255: minLocal = pPage->minLocal;
49256: maxLocal = pPage->maxLocal;
49257: surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4);
49258: testcase( surplus==maxLocal );
49259: testcase( surplus==maxLocal+1 );
49260: if( surplus <= maxLocal ){
49261: pInfo->nLocal = (u16)surplus;
49262: }else{
49263: pInfo->nLocal = (u16)minLocal;
49264: }
49265: pInfo->iOverflow = (u16)(pInfo->nLocal + n);
49266: pInfo->nSize = pInfo->iOverflow + 4;
49267: }
49268: }
49269: #define parseCell(pPage, iCell, pInfo) \
49270: btreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo))
49271: static void btreeParseCell(
49272: MemPage *pPage, /* Page containing the cell */
49273: int iCell, /* The cell index. First cell is 0 */
49274: CellInfo *pInfo /* Fill in this structure */
49275: ){
49276: parseCell(pPage, iCell, pInfo);
49277: }
49278:
49279: /*
49280: ** Compute the total number of bytes that a Cell needs in the cell
49281: ** data area of the btree-page. The return number includes the cell
49282: ** data header and the local payload, but not any overflow page or
49283: ** the space used by the cell pointer.
49284: */
49285: static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
49286: u8 *pIter = &pCell[pPage->childPtrSize];
49287: u32 nSize;
49288:
49289: #ifdef SQLITE_DEBUG
49290: /* The value returned by this function should always be the same as
49291: ** the (CellInfo.nSize) value found by doing a full parse of the
49292: ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of
49293: ** this function verifies that this invariant is not violated. */
49294: CellInfo debuginfo;
49295: btreeParseCellPtr(pPage, pCell, &debuginfo);
49296: #endif
49297:
49298: if( pPage->intKey ){
49299: u8 *pEnd;
49300: if( pPage->hasData ){
49301: pIter += getVarint32(pIter, nSize);
49302: }else{
49303: nSize = 0;
49304: }
49305:
49306: /* pIter now points at the 64-bit integer key value, a variable length
49307: ** integer. The following block moves pIter to point at the first byte
49308: ** past the end of the key value. */
49309: pEnd = &pIter[9];
49310: while( (*pIter++)&0x80 && pIter<pEnd );
49311: }else{
49312: pIter += getVarint32(pIter, nSize);
49313: }
49314:
49315: testcase( nSize==pPage->maxLocal );
49316: testcase( nSize==pPage->maxLocal+1 );
49317: if( nSize>pPage->maxLocal ){
49318: int minLocal = pPage->minLocal;
49319: nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
49320: testcase( nSize==pPage->maxLocal );
49321: testcase( nSize==pPage->maxLocal+1 );
49322: if( nSize>pPage->maxLocal ){
49323: nSize = minLocal;
49324: }
49325: nSize += 4;
49326: }
49327: nSize += (u32)(pIter - pCell);
49328:
49329: /* The minimum size of any cell is 4 bytes. */
49330: if( nSize<4 ){
49331: nSize = 4;
49332: }
49333:
49334: assert( nSize==debuginfo.nSize );
49335: return (u16)nSize;
49336: }
49337:
49338: #ifdef SQLITE_DEBUG
49339: /* This variation on cellSizePtr() is used inside of assert() statements
49340: ** only. */
49341: static u16 cellSize(MemPage *pPage, int iCell){
49342: return cellSizePtr(pPage, findCell(pPage, iCell));
49343: }
49344: #endif
49345:
49346: #ifndef SQLITE_OMIT_AUTOVACUUM
49347: /*
49348: ** If the cell pCell, part of page pPage contains a pointer
49349: ** to an overflow page, insert an entry into the pointer-map
49350: ** for the overflow page.
49351: */
49352: static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
49353: CellInfo info;
49354: if( *pRC ) return;
49355: assert( pCell!=0 );
49356: btreeParseCellPtr(pPage, pCell, &info);
49357: assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload );
49358: if( info.iOverflow ){
49359: Pgno ovfl = get4byte(&pCell[info.iOverflow]);
49360: ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC);
49361: }
49362: }
49363: #endif
49364:
49365:
49366: /*
49367: ** Defragment the page given. All Cells are moved to the
49368: ** end of the page and all free space is collected into one
49369: ** big FreeBlk that occurs in between the header and cell
49370: ** pointer array and the cell content area.
49371: */
49372: static int defragmentPage(MemPage *pPage){
49373: int i; /* Loop counter */
49374: int pc; /* Address of a i-th cell */
49375: int hdr; /* Offset to the page header */
49376: int size; /* Size of a cell */
49377: int usableSize; /* Number of usable bytes on a page */
49378: int cellOffset; /* Offset to the cell pointer array */
49379: int cbrk; /* Offset to the cell content area */
49380: int nCell; /* Number of cells on the page */
49381: unsigned char *data; /* The page data */
49382: unsigned char *temp; /* Temp area for cell content */
49383: int iCellFirst; /* First allowable cell index */
49384: int iCellLast; /* Last possible cell index */
49385:
49386:
49387: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49388: assert( pPage->pBt!=0 );
49389: assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
49390: assert( pPage->nOverflow==0 );
49391: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49392: temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
49393: data = pPage->aData;
49394: hdr = pPage->hdrOffset;
49395: cellOffset = pPage->cellOffset;
49396: nCell = pPage->nCell;
49397: assert( nCell==get2byte(&data[hdr+3]) );
49398: usableSize = pPage->pBt->usableSize;
49399: cbrk = get2byte(&data[hdr+5]);
49400: memcpy(&temp[cbrk], &data[cbrk], usableSize - cbrk);
49401: cbrk = usableSize;
49402: iCellFirst = cellOffset + 2*nCell;
49403: iCellLast = usableSize - 4;
49404: for(i=0; i<nCell; i++){
49405: u8 *pAddr; /* The i-th cell pointer */
49406: pAddr = &data[cellOffset + i*2];
49407: pc = get2byte(pAddr);
49408: testcase( pc==iCellFirst );
49409: testcase( pc==iCellLast );
49410: #if !defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
49411: /* These conditions have already been verified in btreeInitPage()
49412: ** if SQLITE_ENABLE_OVERSIZE_CELL_CHECK is defined
49413: */
49414: if( pc<iCellFirst || pc>iCellLast ){
49415: return SQLITE_CORRUPT_BKPT;
49416: }
49417: #endif
49418: assert( pc>=iCellFirst && pc<=iCellLast );
49419: size = cellSizePtr(pPage, &temp[pc]);
49420: cbrk -= size;
49421: #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
49422: if( cbrk<iCellFirst ){
49423: return SQLITE_CORRUPT_BKPT;
49424: }
49425: #else
49426: if( cbrk<iCellFirst || pc+size>usableSize ){
49427: return SQLITE_CORRUPT_BKPT;
49428: }
49429: #endif
49430: assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
49431: testcase( cbrk+size==usableSize );
49432: testcase( pc+size==usableSize );
49433: memcpy(&data[cbrk], &temp[pc], size);
49434: put2byte(pAddr, cbrk);
49435: }
49436: assert( cbrk>=iCellFirst );
49437: put2byte(&data[hdr+5], cbrk);
49438: data[hdr+1] = 0;
49439: data[hdr+2] = 0;
49440: data[hdr+7] = 0;
49441: memset(&data[iCellFirst], 0, cbrk-iCellFirst);
49442: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49443: if( cbrk-iCellFirst!=pPage->nFree ){
49444: return SQLITE_CORRUPT_BKPT;
49445: }
49446: return SQLITE_OK;
49447: }
49448:
49449: /*
49450: ** Allocate nByte bytes of space from within the B-Tree page passed
49451: ** as the first argument. Write into *pIdx the index into pPage->aData[]
49452: ** of the first byte of allocated space. Return either SQLITE_OK or
49453: ** an error code (usually SQLITE_CORRUPT).
49454: **
49455: ** The caller guarantees that there is sufficient space to make the
49456: ** allocation. This routine might need to defragment in order to bring
49457: ** all the space together, however. This routine will avoid using
49458: ** the first two bytes past the cell pointer area since presumably this
49459: ** allocation is being made in order to insert a new cell, so we will
49460: ** also end up needing a new cell pointer.
49461: */
49462: static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
49463: const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */
49464: u8 * const data = pPage->aData; /* Local cache of pPage->aData */
49465: int nFrag; /* Number of fragmented bytes on pPage */
49466: int top; /* First byte of cell content area */
49467: int gap; /* First byte of gap between cell pointers and cell content */
49468: int rc; /* Integer return code */
49469: int usableSize; /* Usable size of the page */
49470:
49471: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49472: assert( pPage->pBt );
49473: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49474: assert( nByte>=0 ); /* Minimum cell size is 4 */
49475: assert( pPage->nFree>=nByte );
49476: assert( pPage->nOverflow==0 );
49477: usableSize = pPage->pBt->usableSize;
49478: assert( nByte < usableSize-8 );
49479:
49480: nFrag = data[hdr+7];
49481: assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf );
49482: gap = pPage->cellOffset + 2*pPage->nCell;
49483: top = get2byteNotZero(&data[hdr+5]);
49484: if( gap>top ) return SQLITE_CORRUPT_BKPT;
49485: testcase( gap+2==top );
49486: testcase( gap+1==top );
49487: testcase( gap==top );
49488:
49489: if( nFrag>=60 ){
49490: /* Always defragment highly fragmented pages */
49491: rc = defragmentPage(pPage);
49492: if( rc ) return rc;
49493: top = get2byteNotZero(&data[hdr+5]);
49494: }else if( gap+2<=top ){
49495: /* Search the freelist looking for a free slot big enough to satisfy
49496: ** the request. The allocation is made from the first free slot in
49497: ** the list that is large enough to accomadate it.
49498: */
49499: int pc, addr;
49500: for(addr=hdr+1; (pc = get2byte(&data[addr]))>0; addr=pc){
49501: int size; /* Size of the free slot */
49502: if( pc>usableSize-4 || pc<addr+4 ){
49503: return SQLITE_CORRUPT_BKPT;
49504: }
49505: size = get2byte(&data[pc+2]);
49506: if( size>=nByte ){
49507: int x = size - nByte;
49508: testcase( x==4 );
49509: testcase( x==3 );
49510: if( x<4 ){
49511: /* Remove the slot from the free-list. Update the number of
49512: ** fragmented bytes within the page. */
49513: memcpy(&data[addr], &data[pc], 2);
49514: data[hdr+7] = (u8)(nFrag + x);
49515: }else if( size+pc > usableSize ){
49516: return SQLITE_CORRUPT_BKPT;
49517: }else{
49518: /* The slot remains on the free-list. Reduce its size to account
49519: ** for the portion used by the new allocation. */
49520: put2byte(&data[pc+2], x);
49521: }
49522: *pIdx = pc + x;
49523: return SQLITE_OK;
49524: }
49525: }
49526: }
49527:
49528: /* Check to make sure there is enough space in the gap to satisfy
49529: ** the allocation. If not, defragment.
49530: */
49531: testcase( gap+2+nByte==top );
49532: if( gap+2+nByte>top ){
49533: rc = defragmentPage(pPage);
49534: if( rc ) return rc;
49535: top = get2byteNotZero(&data[hdr+5]);
49536: assert( gap+nByte<=top );
49537: }
49538:
49539:
49540: /* Allocate memory from the gap in between the cell pointer array
49541: ** and the cell content area. The btreeInitPage() call has already
49542: ** validated the freelist. Given that the freelist is valid, there
49543: ** is no way that the allocation can extend off the end of the page.
49544: ** The assert() below verifies the previous sentence.
49545: */
49546: top -= nByte;
49547: put2byte(&data[hdr+5], top);
49548: assert( top+nByte <= (int)pPage->pBt->usableSize );
49549: *pIdx = top;
49550: return SQLITE_OK;
49551: }
49552:
49553: /*
49554: ** Return a section of the pPage->aData to the freelist.
49555: ** The first byte of the new free block is pPage->aDisk[start]
49556: ** and the size of the block is "size" bytes.
49557: **
49558: ** Most of the effort here is involved in coalesing adjacent
49559: ** free blocks into a single big free block.
49560: */
49561: static int freeSpace(MemPage *pPage, int start, int size){
49562: int addr, pbegin, hdr;
49563: int iLast; /* Largest possible freeblock offset */
49564: unsigned char *data = pPage->aData;
49565:
49566: assert( pPage->pBt!=0 );
49567: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49568: assert( start>=pPage->hdrOffset+6+pPage->childPtrSize );
49569: assert( (start + size) <= (int)pPage->pBt->usableSize );
49570: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49571: assert( size>=0 ); /* Minimum cell size is 4 */
49572:
49573: if( pPage->pBt->btsFlags & BTS_SECURE_DELETE ){
49574: /* Overwrite deleted information with zeros when the secure_delete
49575: ** option is enabled */
49576: memset(&data[start], 0, size);
49577: }
49578:
49579: /* Add the space back into the linked list of freeblocks. Note that
49580: ** even though the freeblock list was checked by btreeInitPage(),
49581: ** btreeInitPage() did not detect overlapping cells or
49582: ** freeblocks that overlapped cells. Nor does it detect when the
49583: ** cell content area exceeds the value in the page header. If these
49584: ** situations arise, then subsequent insert operations might corrupt
49585: ** the freelist. So we do need to check for corruption while scanning
49586: ** the freelist.
49587: */
49588: hdr = pPage->hdrOffset;
49589: addr = hdr + 1;
49590: iLast = pPage->pBt->usableSize - 4;
49591: assert( start<=iLast );
49592: while( (pbegin = get2byte(&data[addr]))<start && pbegin>0 ){
49593: if( pbegin<addr+4 ){
49594: return SQLITE_CORRUPT_BKPT;
49595: }
49596: addr = pbegin;
49597: }
49598: if( pbegin>iLast ){
49599: return SQLITE_CORRUPT_BKPT;
49600: }
49601: assert( pbegin>addr || pbegin==0 );
49602: put2byte(&data[addr], start);
49603: put2byte(&data[start], pbegin);
49604: put2byte(&data[start+2], size);
49605: pPage->nFree = pPage->nFree + (u16)size;
49606:
49607: /* Coalesce adjacent free blocks */
49608: addr = hdr + 1;
49609: while( (pbegin = get2byte(&data[addr]))>0 ){
49610: int pnext, psize, x;
49611: assert( pbegin>addr );
49612: assert( pbegin <= (int)pPage->pBt->usableSize-4 );
49613: pnext = get2byte(&data[pbegin]);
49614: psize = get2byte(&data[pbegin+2]);
49615: if( pbegin + psize + 3 >= pnext && pnext>0 ){
49616: int frag = pnext - (pbegin+psize);
49617: if( (frag<0) || (frag>(int)data[hdr+7]) ){
49618: return SQLITE_CORRUPT_BKPT;
49619: }
49620: data[hdr+7] -= (u8)frag;
49621: x = get2byte(&data[pnext]);
49622: put2byte(&data[pbegin], x);
49623: x = pnext + get2byte(&data[pnext+2]) - pbegin;
49624: put2byte(&data[pbegin+2], x);
49625: }else{
49626: addr = pbegin;
49627: }
49628: }
49629:
49630: /* If the cell content area begins with a freeblock, remove it. */
49631: if( data[hdr+1]==data[hdr+5] && data[hdr+2]==data[hdr+6] ){
49632: int top;
49633: pbegin = get2byte(&data[hdr+1]);
49634: memcpy(&data[hdr+1], &data[pbegin], 2);
49635: top = get2byte(&data[hdr+5]) + get2byte(&data[pbegin+2]);
49636: put2byte(&data[hdr+5], top);
49637: }
49638: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49639: return SQLITE_OK;
49640: }
49641:
49642: /*
49643: ** Decode the flags byte (the first byte of the header) for a page
49644: ** and initialize fields of the MemPage structure accordingly.
49645: **
49646: ** Only the following combinations are supported. Anything different
49647: ** indicates a corrupt database files:
49648: **
49649: ** PTF_ZERODATA
49650: ** PTF_ZERODATA | PTF_LEAF
49651: ** PTF_LEAFDATA | PTF_INTKEY
49652: ** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF
49653: */
49654: static int decodeFlags(MemPage *pPage, int flagByte){
49655: BtShared *pBt; /* A copy of pPage->pBt */
49656:
49657: assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) );
49658: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49659: pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 );
49660: flagByte &= ~PTF_LEAF;
49661: pPage->childPtrSize = 4-4*pPage->leaf;
49662: pBt = pPage->pBt;
49663: if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
49664: pPage->intKey = 1;
49665: pPage->hasData = pPage->leaf;
49666: pPage->maxLocal = pBt->maxLeaf;
49667: pPage->minLocal = pBt->minLeaf;
49668: }else if( flagByte==PTF_ZERODATA ){
49669: pPage->intKey = 0;
49670: pPage->hasData = 0;
49671: pPage->maxLocal = pBt->maxLocal;
49672: pPage->minLocal = pBt->minLocal;
49673: }else{
49674: return SQLITE_CORRUPT_BKPT;
49675: }
49676: pPage->max1bytePayload = pBt->max1bytePayload;
49677: return SQLITE_OK;
49678: }
49679:
49680: /*
49681: ** Initialize the auxiliary information for a disk block.
49682: **
49683: ** Return SQLITE_OK on success. If we see that the page does
49684: ** not contain a well-formed database page, then return
49685: ** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not
49686: ** guarantee that the page is well-formed. It only shows that
49687: ** we failed to detect any corruption.
49688: */
49689: static int btreeInitPage(MemPage *pPage){
49690:
49691: assert( pPage->pBt!=0 );
49692: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49693: assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) );
49694: assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) );
49695: assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) );
49696:
49697: if( !pPage->isInit ){
49698: u16 pc; /* Address of a freeblock within pPage->aData[] */
49699: u8 hdr; /* Offset to beginning of page header */
49700: u8 *data; /* Equal to pPage->aData */
49701: BtShared *pBt; /* The main btree structure */
49702: int usableSize; /* Amount of usable space on each page */
49703: u16 cellOffset; /* Offset from start of page to first cell pointer */
49704: int nFree; /* Number of unused bytes on the page */
49705: int top; /* First byte of the cell content area */
49706: int iCellFirst; /* First allowable cell or freeblock offset */
49707: int iCellLast; /* Last possible cell or freeblock offset */
49708:
49709: pBt = pPage->pBt;
49710:
49711: hdr = pPage->hdrOffset;
49712: data = pPage->aData;
49713: if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT;
49714: assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
49715: pPage->maskPage = (u16)(pBt->pageSize - 1);
49716: pPage->nOverflow = 0;
49717: usableSize = pBt->usableSize;
49718: pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf;
49719: pPage->aDataEnd = &data[usableSize];
49720: pPage->aCellIdx = &data[cellOffset];
49721: top = get2byteNotZero(&data[hdr+5]);
49722: pPage->nCell = get2byte(&data[hdr+3]);
49723: if( pPage->nCell>MX_CELL(pBt) ){
49724: /* To many cells for a single page. The page must be corrupt */
49725: return SQLITE_CORRUPT_BKPT;
49726: }
49727: testcase( pPage->nCell==MX_CELL(pBt) );
49728:
49729: /* A malformed database page might cause us to read past the end
49730: ** of page when parsing a cell.
49731: **
49732: ** The following block of code checks early to see if a cell extends
49733: ** past the end of a page boundary and causes SQLITE_CORRUPT to be
49734: ** returned if it does.
49735: */
49736: iCellFirst = cellOffset + 2*pPage->nCell;
49737: iCellLast = usableSize - 4;
49738: #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
49739: {
49740: int i; /* Index into the cell pointer array */
49741: int sz; /* Size of a cell */
49742:
49743: if( !pPage->leaf ) iCellLast--;
49744: for(i=0; i<pPage->nCell; i++){
49745: pc = get2byte(&data[cellOffset+i*2]);
49746: testcase( pc==iCellFirst );
49747: testcase( pc==iCellLast );
49748: if( pc<iCellFirst || pc>iCellLast ){
49749: return SQLITE_CORRUPT_BKPT;
49750: }
49751: sz = cellSizePtr(pPage, &data[pc]);
49752: testcase( pc+sz==usableSize );
49753: if( pc+sz>usableSize ){
49754: return SQLITE_CORRUPT_BKPT;
49755: }
49756: }
49757: if( !pPage->leaf ) iCellLast++;
49758: }
49759: #endif
49760:
49761: /* Compute the total free space on the page */
49762: pc = get2byte(&data[hdr+1]);
49763: nFree = data[hdr+7] + top;
49764: while( pc>0 ){
49765: u16 next, size;
49766: if( pc<iCellFirst || pc>iCellLast ){
49767: /* Start of free block is off the page */
49768: return SQLITE_CORRUPT_BKPT;
49769: }
49770: next = get2byte(&data[pc]);
49771: size = get2byte(&data[pc+2]);
49772: if( (next>0 && next<=pc+size+3) || pc+size>usableSize ){
49773: /* Free blocks must be in ascending order. And the last byte of
1.2.2.1 ! misho 49774: ** the free-block must lie on the database page. */
1.2 misho 49775: return SQLITE_CORRUPT_BKPT;
49776: }
49777: nFree = nFree + size;
49778: pc = next;
49779: }
49780:
49781: /* At this point, nFree contains the sum of the offset to the start
49782: ** of the cell-content area plus the number of free bytes within
49783: ** the cell-content area. If this is greater than the usable-size
49784: ** of the page, then the page must be corrupted. This check also
49785: ** serves to verify that the offset to the start of the cell-content
49786: ** area, according to the page header, lies within the page.
49787: */
49788: if( nFree>usableSize ){
49789: return SQLITE_CORRUPT_BKPT;
49790: }
49791: pPage->nFree = (u16)(nFree - iCellFirst);
49792: pPage->isInit = 1;
49793: }
49794: return SQLITE_OK;
49795: }
49796:
49797: /*
49798: ** Set up a raw page so that it looks like a database page holding
49799: ** no entries.
49800: */
49801: static void zeroPage(MemPage *pPage, int flags){
49802: unsigned char *data = pPage->aData;
49803: BtShared *pBt = pPage->pBt;
49804: u8 hdr = pPage->hdrOffset;
49805: u16 first;
49806:
49807: assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
49808: assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
49809: assert( sqlite3PagerGetData(pPage->pDbPage) == data );
49810: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
49811: assert( sqlite3_mutex_held(pBt->mutex) );
49812: if( pBt->btsFlags & BTS_SECURE_DELETE ){
49813: memset(&data[hdr], 0, pBt->usableSize - hdr);
49814: }
49815: data[hdr] = (char)flags;
49816: first = hdr + 8 + 4*((flags&PTF_LEAF)==0 ?1:0);
49817: memset(&data[hdr+1], 0, 4);
49818: data[hdr+7] = 0;
49819: put2byte(&data[hdr+5], pBt->usableSize);
49820: pPage->nFree = (u16)(pBt->usableSize - first);
49821: decodeFlags(pPage, flags);
49822: pPage->hdrOffset = hdr;
49823: pPage->cellOffset = first;
49824: pPage->aDataEnd = &data[pBt->usableSize];
49825: pPage->aCellIdx = &data[first];
49826: pPage->nOverflow = 0;
49827: assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
49828: pPage->maskPage = (u16)(pBt->pageSize - 1);
49829: pPage->nCell = 0;
49830: pPage->isInit = 1;
49831: }
49832:
49833:
49834: /*
49835: ** Convert a DbPage obtained from the pager into a MemPage used by
49836: ** the btree layer.
49837: */
49838: static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){
49839: MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage);
49840: pPage->aData = sqlite3PagerGetData(pDbPage);
49841: pPage->pDbPage = pDbPage;
49842: pPage->pBt = pBt;
49843: pPage->pgno = pgno;
49844: pPage->hdrOffset = pPage->pgno==1 ? 100 : 0;
49845: return pPage;
49846: }
49847:
49848: /*
49849: ** Get a page from the pager. Initialize the MemPage.pBt and
49850: ** MemPage.aData elements if needed.
49851: **
49852: ** If the noContent flag is set, it means that we do not care about
49853: ** the content of the page at this time. So do not go to the disk
49854: ** to fetch the content. Just fill in the content with zeros for now.
49855: ** If in the future we call sqlite3PagerWrite() on this page, that
49856: ** means we have started to be concerned about content and the disk
49857: ** read should occur at that point.
49858: */
49859: static int btreeGetPage(
49860: BtShared *pBt, /* The btree */
49861: Pgno pgno, /* Number of the page to fetch */
49862: MemPage **ppPage, /* Return the page in this parameter */
49863: int noContent /* Do not load page content if true */
49864: ){
49865: int rc;
49866: DbPage *pDbPage;
49867:
49868: assert( sqlite3_mutex_held(pBt->mutex) );
49869: rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, noContent);
49870: if( rc ) return rc;
49871: *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt);
49872: return SQLITE_OK;
49873: }
49874:
49875: /*
49876: ** Retrieve a page from the pager cache. If the requested page is not
49877: ** already in the pager cache return NULL. Initialize the MemPage.pBt and
49878: ** MemPage.aData elements if needed.
49879: */
49880: static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){
49881: DbPage *pDbPage;
49882: assert( sqlite3_mutex_held(pBt->mutex) );
49883: pDbPage = sqlite3PagerLookup(pBt->pPager, pgno);
49884: if( pDbPage ){
49885: return btreePageFromDbPage(pDbPage, pgno, pBt);
49886: }
49887: return 0;
49888: }
49889:
49890: /*
49891: ** Return the size of the database file in pages. If there is any kind of
49892: ** error, return ((unsigned int)-1).
49893: */
49894: static Pgno btreePagecount(BtShared *pBt){
49895: return pBt->nPage;
49896: }
49897: SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree *p){
49898: assert( sqlite3BtreeHoldsMutex(p) );
49899: assert( ((p->pBt->nPage)&0x8000000)==0 );
49900: return (int)btreePagecount(p->pBt);
49901: }
49902:
49903: /*
49904: ** Get a page from the pager and initialize it. This routine is just a
49905: ** convenience wrapper around separate calls to btreeGetPage() and
49906: ** btreeInitPage().
49907: **
49908: ** If an error occurs, then the value *ppPage is set to is undefined. It
49909: ** may remain unchanged, or it may be set to an invalid value.
49910: */
49911: static int getAndInitPage(
49912: BtShared *pBt, /* The database file */
49913: Pgno pgno, /* Number of the page to get */
49914: MemPage **ppPage /* Write the page pointer here */
49915: ){
49916: int rc;
49917: assert( sqlite3_mutex_held(pBt->mutex) );
49918:
49919: if( pgno>btreePagecount(pBt) ){
49920: rc = SQLITE_CORRUPT_BKPT;
49921: }else{
49922: rc = btreeGetPage(pBt, pgno, ppPage, 0);
49923: if( rc==SQLITE_OK ){
49924: rc = btreeInitPage(*ppPage);
49925: if( rc!=SQLITE_OK ){
49926: releasePage(*ppPage);
49927: }
49928: }
49929: }
49930:
49931: testcase( pgno==0 );
49932: assert( pgno!=0 || rc==SQLITE_CORRUPT );
49933: return rc;
49934: }
49935:
49936: /*
49937: ** Release a MemPage. This should be called once for each prior
49938: ** call to btreeGetPage.
49939: */
49940: static void releasePage(MemPage *pPage){
49941: if( pPage ){
49942: assert( pPage->aData );
49943: assert( pPage->pBt );
49944: assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
49945: assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData );
49946: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49947: sqlite3PagerUnref(pPage->pDbPage);
49948: }
49949: }
49950:
49951: /*
49952: ** During a rollback, when the pager reloads information into the cache
49953: ** so that the cache is restored to its original state at the start of
49954: ** the transaction, for each page restored this routine is called.
49955: **
49956: ** This routine needs to reset the extra data section at the end of the
49957: ** page to agree with the restored data.
49958: */
49959: static void pageReinit(DbPage *pData){
49960: MemPage *pPage;
49961: pPage = (MemPage *)sqlite3PagerGetExtra(pData);
49962: assert( sqlite3PagerPageRefcount(pData)>0 );
49963: if( pPage->isInit ){
49964: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
49965: pPage->isInit = 0;
49966: if( sqlite3PagerPageRefcount(pData)>1 ){
49967: /* pPage might not be a btree page; it might be an overflow page
49968: ** or ptrmap page or a free page. In those cases, the following
49969: ** call to btreeInitPage() will likely return SQLITE_CORRUPT.
49970: ** But no harm is done by this. And it is very important that
49971: ** btreeInitPage() be called on every btree page so we make
49972: ** the call for every page that comes in for re-initing. */
49973: btreeInitPage(pPage);
49974: }
49975: }
49976: }
49977:
49978: /*
49979: ** Invoke the busy handler for a btree.
49980: */
49981: static int btreeInvokeBusyHandler(void *pArg){
49982: BtShared *pBt = (BtShared*)pArg;
49983: assert( pBt->db );
49984: assert( sqlite3_mutex_held(pBt->db->mutex) );
49985: return sqlite3InvokeBusyHandler(&pBt->db->busyHandler);
49986: }
49987:
49988: /*
49989: ** Open a database file.
49990: **
49991: ** zFilename is the name of the database file. If zFilename is NULL
49992: ** then an ephemeral database is created. The ephemeral database might
49993: ** be exclusively in memory, or it might use a disk-based memory cache.
49994: ** Either way, the ephemeral database will be automatically deleted
49995: ** when sqlite3BtreeClose() is called.
49996: **
49997: ** If zFilename is ":memory:" then an in-memory database is created
49998: ** that is automatically destroyed when it is closed.
49999: **
1.2.2.1 ! misho 50000: ** The "flags" parameter is a bitmask that might contain bits like
! 50001: ** BTREE_OMIT_JOURNAL and/or BTREE_MEMORY.
1.2 misho 50002: **
50003: ** If the database is already opened in the same database connection
50004: ** and we are in shared cache mode, then the open will fail with an
50005: ** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared
50006: ** objects in the same database connection since doing so will lead
50007: ** to problems with locking.
50008: */
50009: SQLITE_PRIVATE int sqlite3BtreeOpen(
50010: sqlite3_vfs *pVfs, /* VFS to use for this b-tree */
50011: const char *zFilename, /* Name of the file containing the BTree database */
50012: sqlite3 *db, /* Associated database handle */
50013: Btree **ppBtree, /* Pointer to new Btree object written here */
50014: int flags, /* Options */
50015: int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */
50016: ){
50017: BtShared *pBt = 0; /* Shared part of btree structure */
50018: Btree *p; /* Handle to return */
50019: sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */
50020: int rc = SQLITE_OK; /* Result code from this function */
50021: u8 nReserve; /* Byte of unused space on each page */
50022: unsigned char zDbHeader[100]; /* Database header content */
50023:
50024: /* True if opening an ephemeral, temporary database */
50025: const int isTempDb = zFilename==0 || zFilename[0]==0;
50026:
50027: /* Set the variable isMemdb to true for an in-memory database, or
50028: ** false for a file-based database.
50029: */
50030: #ifdef SQLITE_OMIT_MEMORYDB
50031: const int isMemdb = 0;
50032: #else
50033: const int isMemdb = (zFilename && strcmp(zFilename, ":memory:")==0)
1.2.2.1 ! misho 50034: || (isTempDb && sqlite3TempInMemory(db))
! 50035: || (vfsFlags & SQLITE_OPEN_MEMORY)!=0;
1.2 misho 50036: #endif
50037:
50038: assert( db!=0 );
50039: assert( pVfs!=0 );
50040: assert( sqlite3_mutex_held(db->mutex) );
50041: assert( (flags&0xff)==flags ); /* flags fit in 8 bits */
50042:
50043: /* Only a BTREE_SINGLE database can be BTREE_UNORDERED */
50044: assert( (flags & BTREE_UNORDERED)==0 || (flags & BTREE_SINGLE)!=0 );
50045:
50046: /* A BTREE_SINGLE database is always a temporary and/or ephemeral */
50047: assert( (flags & BTREE_SINGLE)==0 || isTempDb );
50048:
50049: if( isMemdb ){
50050: flags |= BTREE_MEMORY;
50051: }
50052: if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){
50053: vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;
50054: }
50055: p = sqlite3MallocZero(sizeof(Btree));
50056: if( !p ){
50057: return SQLITE_NOMEM;
50058: }
50059: p->inTrans = TRANS_NONE;
50060: p->db = db;
50061: #ifndef SQLITE_OMIT_SHARED_CACHE
50062: p->lock.pBtree = p;
50063: p->lock.iTable = 1;
50064: #endif
50065:
50066: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
50067: /*
50068: ** If this Btree is a candidate for shared cache, try to find an
50069: ** existing BtShared object that we can share with
50070: */
1.2.2.1 ! misho 50071: if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){
1.2 misho 50072: if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
50073: int nFullPathname = pVfs->mxPathname+1;
50074: char *zFullPathname = sqlite3Malloc(nFullPathname);
50075: MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
50076: p->sharable = 1;
50077: if( !zFullPathname ){
50078: sqlite3_free(p);
50079: return SQLITE_NOMEM;
50080: }
1.2.2.1 ! misho 50081: if( isMemdb ){
! 50082: memcpy(zFullPathname, zFilename, sqlite3Strlen30(zFilename)+1);
! 50083: }else{
! 50084: rc = sqlite3OsFullPathname(pVfs, zFilename,
! 50085: nFullPathname, zFullPathname);
! 50086: if( rc ){
! 50087: sqlite3_free(zFullPathname);
! 50088: sqlite3_free(p);
! 50089: return rc;
! 50090: }
1.2 misho 50091: }
50092: #if SQLITE_THREADSAFE
50093: mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
50094: sqlite3_mutex_enter(mutexOpen);
50095: mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
50096: sqlite3_mutex_enter(mutexShared);
50097: #endif
50098: for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
50099: assert( pBt->nRef>0 );
1.2.2.1 ! misho 50100: if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager, 0))
1.2 misho 50101: && sqlite3PagerVfs(pBt->pPager)==pVfs ){
50102: int iDb;
50103: for(iDb=db->nDb-1; iDb>=0; iDb--){
50104: Btree *pExisting = db->aDb[iDb].pBt;
50105: if( pExisting && pExisting->pBt==pBt ){
50106: sqlite3_mutex_leave(mutexShared);
50107: sqlite3_mutex_leave(mutexOpen);
50108: sqlite3_free(zFullPathname);
50109: sqlite3_free(p);
50110: return SQLITE_CONSTRAINT;
50111: }
50112: }
50113: p->pBt = pBt;
50114: pBt->nRef++;
50115: break;
50116: }
50117: }
50118: sqlite3_mutex_leave(mutexShared);
50119: sqlite3_free(zFullPathname);
50120: }
50121: #ifdef SQLITE_DEBUG
50122: else{
50123: /* In debug mode, we mark all persistent databases as sharable
50124: ** even when they are not. This exercises the locking code and
50125: ** gives more opportunity for asserts(sqlite3_mutex_held())
50126: ** statements to find locking problems.
50127: */
50128: p->sharable = 1;
50129: }
50130: #endif
50131: }
50132: #endif
50133: if( pBt==0 ){
50134: /*
50135: ** The following asserts make sure that structures used by the btree are
50136: ** the right size. This is to guard against size changes that result
50137: ** when compiling on a different architecture.
50138: */
50139: assert( sizeof(i64)==8 || sizeof(i64)==4 );
50140: assert( sizeof(u64)==8 || sizeof(u64)==4 );
50141: assert( sizeof(u32)==4 );
50142: assert( sizeof(u16)==2 );
50143: assert( sizeof(Pgno)==4 );
50144:
50145: pBt = sqlite3MallocZero( sizeof(*pBt) );
50146: if( pBt==0 ){
50147: rc = SQLITE_NOMEM;
50148: goto btree_open_out;
50149: }
50150: rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename,
50151: EXTRA_SIZE, flags, vfsFlags, pageReinit);
50152: if( rc==SQLITE_OK ){
50153: rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);
50154: }
50155: if( rc!=SQLITE_OK ){
50156: goto btree_open_out;
50157: }
50158: pBt->openFlags = (u8)flags;
50159: pBt->db = db;
50160: sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
50161: p->pBt = pBt;
50162:
50163: pBt->pCursor = 0;
50164: pBt->pPage1 = 0;
50165: if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY;
50166: #ifdef SQLITE_SECURE_DELETE
50167: pBt->btsFlags |= BTS_SECURE_DELETE;
50168: #endif
50169: pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16);
50170: if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
50171: || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){
50172: pBt->pageSize = 0;
50173: #ifndef SQLITE_OMIT_AUTOVACUUM
50174: /* If the magic name ":memory:" will create an in-memory database, then
50175: ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if
50176: ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if
50177: ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a
50178: ** regular file-name. In this case the auto-vacuum applies as per normal.
50179: */
50180: if( zFilename && !isMemdb ){
50181: pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0);
50182: pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0);
50183: }
50184: #endif
50185: nReserve = 0;
50186: }else{
50187: nReserve = zDbHeader[20];
50188: pBt->btsFlags |= BTS_PAGESIZE_FIXED;
50189: #ifndef SQLITE_OMIT_AUTOVACUUM
50190: pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0);
50191: pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0);
50192: #endif
50193: }
50194: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
50195: if( rc ) goto btree_open_out;
50196: pBt->usableSize = pBt->pageSize - nReserve;
50197: assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */
50198:
50199: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
50200: /* Add the new BtShared object to the linked list sharable BtShareds.
50201: */
50202: if( p->sharable ){
50203: MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
50204: pBt->nRef = 1;
50205: MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);)
50206: if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
50207: pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
50208: if( pBt->mutex==0 ){
50209: rc = SQLITE_NOMEM;
50210: db->mallocFailed = 0;
50211: goto btree_open_out;
50212: }
50213: }
50214: sqlite3_mutex_enter(mutexShared);
50215: pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList);
50216: GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt;
50217: sqlite3_mutex_leave(mutexShared);
50218: }
50219: #endif
50220: }
50221:
50222: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
50223: /* If the new Btree uses a sharable pBtShared, then link the new
50224: ** Btree into the list of all sharable Btrees for the same connection.
50225: ** The list is kept in ascending order by pBt address.
50226: */
50227: if( p->sharable ){
50228: int i;
50229: Btree *pSib;
50230: for(i=0; i<db->nDb; i++){
50231: if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){
50232: while( pSib->pPrev ){ pSib = pSib->pPrev; }
50233: if( p->pBt<pSib->pBt ){
50234: p->pNext = pSib;
50235: p->pPrev = 0;
50236: pSib->pPrev = p;
50237: }else{
50238: while( pSib->pNext && pSib->pNext->pBt<p->pBt ){
50239: pSib = pSib->pNext;
50240: }
50241: p->pNext = pSib->pNext;
50242: p->pPrev = pSib;
50243: if( p->pNext ){
50244: p->pNext->pPrev = p;
50245: }
50246: pSib->pNext = p;
50247: }
50248: break;
50249: }
50250: }
50251: }
50252: #endif
50253: *ppBtree = p;
50254:
50255: btree_open_out:
50256: if( rc!=SQLITE_OK ){
50257: if( pBt && pBt->pPager ){
50258: sqlite3PagerClose(pBt->pPager);
50259: }
50260: sqlite3_free(pBt);
50261: sqlite3_free(p);
50262: *ppBtree = 0;
50263: }else{
50264: /* If the B-Tree was successfully opened, set the pager-cache size to the
50265: ** default value. Except, when opening on an existing shared pager-cache,
50266: ** do not change the pager-cache size.
50267: */
50268: if( sqlite3BtreeSchema(p, 0, 0)==0 ){
50269: sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE);
50270: }
50271: }
50272: if( mutexOpen ){
50273: assert( sqlite3_mutex_held(mutexOpen) );
50274: sqlite3_mutex_leave(mutexOpen);
50275: }
50276: return rc;
50277: }
50278:
50279: /*
50280: ** Decrement the BtShared.nRef counter. When it reaches zero,
50281: ** remove the BtShared structure from the sharing list. Return
50282: ** true if the BtShared.nRef counter reaches zero and return
50283: ** false if it is still positive.
50284: */
50285: static int removeFromSharingList(BtShared *pBt){
50286: #ifndef SQLITE_OMIT_SHARED_CACHE
50287: MUTEX_LOGIC( sqlite3_mutex *pMaster; )
50288: BtShared *pList;
50289: int removed = 0;
50290:
50291: assert( sqlite3_mutex_notheld(pBt->mutex) );
50292: MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
50293: sqlite3_mutex_enter(pMaster);
50294: pBt->nRef--;
50295: if( pBt->nRef<=0 ){
50296: if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
50297: GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
50298: }else{
50299: pList = GLOBAL(BtShared*,sqlite3SharedCacheList);
50300: while( ALWAYS(pList) && pList->pNext!=pBt ){
50301: pList=pList->pNext;
50302: }
50303: if( ALWAYS(pList) ){
50304: pList->pNext = pBt->pNext;
50305: }
50306: }
50307: if( SQLITE_THREADSAFE ){
50308: sqlite3_mutex_free(pBt->mutex);
50309: }
50310: removed = 1;
50311: }
50312: sqlite3_mutex_leave(pMaster);
50313: return removed;
50314: #else
50315: return 1;
50316: #endif
50317: }
50318:
50319: /*
50320: ** Make sure pBt->pTmpSpace points to an allocation of
50321: ** MX_CELL_SIZE(pBt) bytes.
50322: */
50323: static void allocateTempSpace(BtShared *pBt){
50324: if( !pBt->pTmpSpace ){
50325: pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize );
50326: }
50327: }
50328:
50329: /*
50330: ** Free the pBt->pTmpSpace allocation
50331: */
50332: static void freeTempSpace(BtShared *pBt){
50333: sqlite3PageFree( pBt->pTmpSpace);
50334: pBt->pTmpSpace = 0;
50335: }
50336:
50337: /*
50338: ** Close an open database and invalidate all cursors.
50339: */
50340: SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){
50341: BtShared *pBt = p->pBt;
50342: BtCursor *pCur;
50343:
50344: /* Close all cursors opened via this handle. */
50345: assert( sqlite3_mutex_held(p->db->mutex) );
50346: sqlite3BtreeEnter(p);
50347: pCur = pBt->pCursor;
50348: while( pCur ){
50349: BtCursor *pTmp = pCur;
50350: pCur = pCur->pNext;
50351: if( pTmp->pBtree==p ){
50352: sqlite3BtreeCloseCursor(pTmp);
50353: }
50354: }
50355:
50356: /* Rollback any active transaction and free the handle structure.
50357: ** The call to sqlite3BtreeRollback() drops any table-locks held by
50358: ** this handle.
50359: */
1.2.2.1 ! misho 50360: sqlite3BtreeRollback(p, SQLITE_OK);
1.2 misho 50361: sqlite3BtreeLeave(p);
50362:
50363: /* If there are still other outstanding references to the shared-btree
50364: ** structure, return now. The remainder of this procedure cleans
50365: ** up the shared-btree.
50366: */
50367: assert( p->wantToLock==0 && p->locked==0 );
50368: if( !p->sharable || removeFromSharingList(pBt) ){
50369: /* The pBt is no longer on the sharing list, so we can access
50370: ** it without having to hold the mutex.
50371: **
50372: ** Clean out and delete the BtShared object.
50373: */
50374: assert( !pBt->pCursor );
50375: sqlite3PagerClose(pBt->pPager);
50376: if( pBt->xFreeSchema && pBt->pSchema ){
50377: pBt->xFreeSchema(pBt->pSchema);
50378: }
50379: sqlite3DbFree(0, pBt->pSchema);
50380: freeTempSpace(pBt);
50381: sqlite3_free(pBt);
50382: }
50383:
50384: #ifndef SQLITE_OMIT_SHARED_CACHE
50385: assert( p->wantToLock==0 );
50386: assert( p->locked==0 );
50387: if( p->pPrev ) p->pPrev->pNext = p->pNext;
50388: if( p->pNext ) p->pNext->pPrev = p->pPrev;
50389: #endif
50390:
50391: sqlite3_free(p);
50392: return SQLITE_OK;
50393: }
50394:
50395: /*
50396: ** Change the limit on the number of pages allowed in the cache.
50397: **
50398: ** The maximum number of cache pages is set to the absolute
50399: ** value of mxPage. If mxPage is negative, the pager will
50400: ** operate asynchronously - it will not stop to do fsync()s
50401: ** to insure data is written to the disk surface before
50402: ** continuing. Transactions still work if synchronous is off,
50403: ** and the database cannot be corrupted if this program
50404: ** crashes. But if the operating system crashes or there is
50405: ** an abrupt power failure when synchronous is off, the database
50406: ** could be left in an inconsistent and unrecoverable state.
50407: ** Synchronous is on by default so database corruption is not
50408: ** normally a worry.
50409: */
50410: SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){
50411: BtShared *pBt = p->pBt;
50412: assert( sqlite3_mutex_held(p->db->mutex) );
50413: sqlite3BtreeEnter(p);
50414: sqlite3PagerSetCachesize(pBt->pPager, mxPage);
50415: sqlite3BtreeLeave(p);
50416: return SQLITE_OK;
50417: }
50418:
50419: /*
50420: ** Change the way data is synced to disk in order to increase or decrease
50421: ** how well the database resists damage due to OS crashes and power
50422: ** failures. Level 1 is the same as asynchronous (no syncs() occur and
50423: ** there is a high probability of damage) Level 2 is the default. There
50424: ** is a very low but non-zero probability of damage. Level 3 reduces the
50425: ** probability of damage to near zero but with a write performance reduction.
50426: */
50427: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
50428: SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(
50429: Btree *p, /* The btree to set the safety level on */
50430: int level, /* PRAGMA synchronous. 1=OFF, 2=NORMAL, 3=FULL */
50431: int fullSync, /* PRAGMA fullfsync. */
50432: int ckptFullSync /* PRAGMA checkpoint_fullfync */
50433: ){
50434: BtShared *pBt = p->pBt;
50435: assert( sqlite3_mutex_held(p->db->mutex) );
50436: assert( level>=1 && level<=3 );
50437: sqlite3BtreeEnter(p);
50438: sqlite3PagerSetSafetyLevel(pBt->pPager, level, fullSync, ckptFullSync);
50439: sqlite3BtreeLeave(p);
50440: return SQLITE_OK;
50441: }
50442: #endif
50443:
50444: /*
50445: ** Return TRUE if the given btree is set to safety level 1. In other
50446: ** words, return TRUE if no sync() occurs on the disk files.
50447: */
50448: SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree *p){
50449: BtShared *pBt = p->pBt;
50450: int rc;
50451: assert( sqlite3_mutex_held(p->db->mutex) );
50452: sqlite3BtreeEnter(p);
50453: assert( pBt && pBt->pPager );
50454: rc = sqlite3PagerNosync(pBt->pPager);
50455: sqlite3BtreeLeave(p);
50456: return rc;
50457: }
50458:
50459: /*
50460: ** Change the default pages size and the number of reserved bytes per page.
50461: ** Or, if the page size has already been fixed, return SQLITE_READONLY
50462: ** without changing anything.
50463: **
50464: ** The page size must be a power of 2 between 512 and 65536. If the page
50465: ** size supplied does not meet this constraint then the page size is not
50466: ** changed.
50467: **
50468: ** Page sizes are constrained to be a power of two so that the region
50469: ** of the database file used for locking (beginning at PENDING_BYTE,
50470: ** the first byte past the 1GB boundary, 0x40000000) needs to occur
50471: ** at the beginning of a page.
50472: **
50473: ** If parameter nReserve is less than zero, then the number of reserved
50474: ** bytes per page is left unchanged.
50475: **
50476: ** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size
50477: ** and autovacuum mode can no longer be changed.
50478: */
50479: SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){
50480: int rc = SQLITE_OK;
50481: BtShared *pBt = p->pBt;
50482: assert( nReserve>=-1 && nReserve<=255 );
50483: sqlite3BtreeEnter(p);
50484: if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){
50485: sqlite3BtreeLeave(p);
50486: return SQLITE_READONLY;
50487: }
50488: if( nReserve<0 ){
50489: nReserve = pBt->pageSize - pBt->usableSize;
50490: }
50491: assert( nReserve>=0 && nReserve<=255 );
50492: if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE &&
50493: ((pageSize-1)&pageSize)==0 ){
50494: assert( (pageSize & 7)==0 );
50495: assert( !pBt->pPage1 && !pBt->pCursor );
50496: pBt->pageSize = (u32)pageSize;
50497: freeTempSpace(pBt);
50498: }
50499: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
50500: pBt->usableSize = pBt->pageSize - (u16)nReserve;
50501: if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED;
50502: sqlite3BtreeLeave(p);
50503: return rc;
50504: }
50505:
50506: /*
50507: ** Return the currently defined page size
50508: */
50509: SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){
50510: return p->pBt->pageSize;
50511: }
50512:
1.2.2.1 ! misho 50513: #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG)
! 50514: /*
! 50515: ** This function is similar to sqlite3BtreeGetReserve(), except that it
! 50516: ** may only be called if it is guaranteed that the b-tree mutex is already
! 50517: ** held.
! 50518: **
! 50519: ** This is useful in one special case in the backup API code where it is
! 50520: ** known that the shared b-tree mutex is held, but the mutex on the
! 50521: ** database handle that owns *p is not. In this case if sqlite3BtreeEnter()
! 50522: ** were to be called, it might collide with some other operation on the
! 50523: ** database handle that owns *p, causing undefined behaviour.
! 50524: */
! 50525: SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){
! 50526: assert( sqlite3_mutex_held(p->pBt->mutex) );
! 50527: return p->pBt->pageSize - p->pBt->usableSize;
! 50528: }
! 50529: #endif /* SQLITE_HAS_CODEC || SQLITE_DEBUG */
! 50530:
1.2 misho 50531: #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM)
50532: /*
50533: ** Return the number of bytes of space at the end of every page that
50534: ** are intentually left unused. This is the "reserved" space that is
50535: ** sometimes used by extensions.
50536: */
50537: SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree *p){
50538: int n;
50539: sqlite3BtreeEnter(p);
50540: n = p->pBt->pageSize - p->pBt->usableSize;
50541: sqlite3BtreeLeave(p);
50542: return n;
50543: }
50544:
50545: /*
50546: ** Set the maximum page count for a database if mxPage is positive.
50547: ** No changes are made if mxPage is 0 or negative.
50548: ** Regardless of the value of mxPage, return the maximum page count.
50549: */
50550: SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){
50551: int n;
50552: sqlite3BtreeEnter(p);
50553: n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage);
50554: sqlite3BtreeLeave(p);
50555: return n;
50556: }
50557:
50558: /*
50559: ** Set the BTS_SECURE_DELETE flag if newFlag is 0 or 1. If newFlag is -1,
50560: ** then make no changes. Always return the value of the BTS_SECURE_DELETE
50561: ** setting after the change.
50562: */
50563: SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){
50564: int b;
50565: if( p==0 ) return 0;
50566: sqlite3BtreeEnter(p);
50567: if( newFlag>=0 ){
50568: p->pBt->btsFlags &= ~BTS_SECURE_DELETE;
50569: if( newFlag ) p->pBt->btsFlags |= BTS_SECURE_DELETE;
50570: }
50571: b = (p->pBt->btsFlags & BTS_SECURE_DELETE)!=0;
50572: sqlite3BtreeLeave(p);
50573: return b;
50574: }
50575: #endif /* !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) */
50576:
50577: /*
50578: ** Change the 'auto-vacuum' property of the database. If the 'autoVacuum'
50579: ** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it
50580: ** is disabled. The default value for the auto-vacuum property is
50581: ** determined by the SQLITE_DEFAULT_AUTOVACUUM macro.
50582: */
50583: SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){
50584: #ifdef SQLITE_OMIT_AUTOVACUUM
50585: return SQLITE_READONLY;
50586: #else
50587: BtShared *pBt = p->pBt;
50588: int rc = SQLITE_OK;
50589: u8 av = (u8)autoVacuum;
50590:
50591: sqlite3BtreeEnter(p);
50592: if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){
50593: rc = SQLITE_READONLY;
50594: }else{
50595: pBt->autoVacuum = av ?1:0;
50596: pBt->incrVacuum = av==2 ?1:0;
50597: }
50598: sqlite3BtreeLeave(p);
50599: return rc;
50600: #endif
50601: }
50602:
50603: /*
50604: ** Return the value of the 'auto-vacuum' property. If auto-vacuum is
50605: ** enabled 1 is returned. Otherwise 0.
50606: */
50607: SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){
50608: #ifdef SQLITE_OMIT_AUTOVACUUM
50609: return BTREE_AUTOVACUUM_NONE;
50610: #else
50611: int rc;
50612: sqlite3BtreeEnter(p);
50613: rc = (
50614: (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE:
50615: (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL:
50616: BTREE_AUTOVACUUM_INCR
50617: );
50618: sqlite3BtreeLeave(p);
50619: return rc;
50620: #endif
50621: }
50622:
50623:
50624: /*
50625: ** Get a reference to pPage1 of the database file. This will
50626: ** also acquire a readlock on that file.
50627: **
50628: ** SQLITE_OK is returned on success. If the file is not a
50629: ** well-formed database file, then SQLITE_CORRUPT is returned.
50630: ** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM
50631: ** is returned if we run out of memory.
50632: */
50633: static int lockBtree(BtShared *pBt){
50634: int rc; /* Result code from subfunctions */
50635: MemPage *pPage1; /* Page 1 of the database file */
50636: int nPage; /* Number of pages in the database */
50637: int nPageFile = 0; /* Number of pages in the database file */
50638: int nPageHeader; /* Number of pages in the database according to hdr */
50639:
50640: assert( sqlite3_mutex_held(pBt->mutex) );
50641: assert( pBt->pPage1==0 );
50642: rc = sqlite3PagerSharedLock(pBt->pPager);
50643: if( rc!=SQLITE_OK ) return rc;
50644: rc = btreeGetPage(pBt, 1, &pPage1, 0);
50645: if( rc!=SQLITE_OK ) return rc;
50646:
50647: /* Do some checking to help insure the file we opened really is
50648: ** a valid database file.
50649: */
50650: nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData);
50651: sqlite3PagerPagecount(pBt->pPager, &nPageFile);
50652: if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
50653: nPage = nPageFile;
50654: }
50655: if( nPage>0 ){
50656: u32 pageSize;
50657: u32 usableSize;
50658: u8 *page1 = pPage1->aData;
50659: rc = SQLITE_NOTADB;
50660: if( memcmp(page1, zMagicHeader, 16)!=0 ){
50661: goto page1_init_failed;
50662: }
50663:
50664: #ifdef SQLITE_OMIT_WAL
50665: if( page1[18]>1 ){
50666: pBt->btsFlags |= BTS_READ_ONLY;
50667: }
50668: if( page1[19]>1 ){
50669: goto page1_init_failed;
50670: }
50671: #else
50672: if( page1[18]>2 ){
50673: pBt->btsFlags |= BTS_READ_ONLY;
50674: }
50675: if( page1[19]>2 ){
50676: goto page1_init_failed;
50677: }
50678:
50679: /* If the write version is set to 2, this database should be accessed
50680: ** in WAL mode. If the log is not already open, open it now. Then
50681: ** return SQLITE_OK and return without populating BtShared.pPage1.
50682: ** The caller detects this and calls this function again. This is
50683: ** required as the version of page 1 currently in the page1 buffer
50684: ** may not be the latest version - there may be a newer one in the log
50685: ** file.
50686: */
50687: if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){
50688: int isOpen = 0;
50689: rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen);
50690: if( rc!=SQLITE_OK ){
50691: goto page1_init_failed;
50692: }else if( isOpen==0 ){
50693: releasePage(pPage1);
50694: return SQLITE_OK;
50695: }
50696: rc = SQLITE_NOTADB;
50697: }
50698: #endif
50699:
50700: /* The maximum embedded fraction must be exactly 25%. And the minimum
50701: ** embedded fraction must be 12.5% for both leaf-data and non-leaf-data.
50702: ** The original design allowed these amounts to vary, but as of
50703: ** version 3.6.0, we require them to be fixed.
50704: */
50705: if( memcmp(&page1[21], "\100\040\040",3)!=0 ){
50706: goto page1_init_failed;
50707: }
50708: pageSize = (page1[16]<<8) | (page1[17]<<16);
50709: if( ((pageSize-1)&pageSize)!=0
50710: || pageSize>SQLITE_MAX_PAGE_SIZE
50711: || pageSize<=256
50712: ){
50713: goto page1_init_failed;
50714: }
50715: assert( (pageSize & 7)==0 );
50716: usableSize = pageSize - page1[20];
50717: if( (u32)pageSize!=pBt->pageSize ){
50718: /* After reading the first page of the database assuming a page size
50719: ** of BtShared.pageSize, we have discovered that the page-size is
50720: ** actually pageSize. Unlock the database, leave pBt->pPage1 at
50721: ** zero and return SQLITE_OK. The caller will call this function
50722: ** again with the correct page-size.
50723: */
50724: releasePage(pPage1);
50725: pBt->usableSize = usableSize;
50726: pBt->pageSize = pageSize;
50727: freeTempSpace(pBt);
50728: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize,
50729: pageSize-usableSize);
50730: return rc;
50731: }
50732: if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){
50733: rc = SQLITE_CORRUPT_BKPT;
50734: goto page1_init_failed;
50735: }
50736: if( usableSize<480 ){
50737: goto page1_init_failed;
50738: }
50739: pBt->pageSize = pageSize;
50740: pBt->usableSize = usableSize;
50741: #ifndef SQLITE_OMIT_AUTOVACUUM
50742: pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0);
50743: pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0);
50744: #endif
50745: }
50746:
50747: /* maxLocal is the maximum amount of payload to store locally for
50748: ** a cell. Make sure it is small enough so that at least minFanout
50749: ** cells can will fit on one page. We assume a 10-byte page header.
50750: ** Besides the payload, the cell must store:
50751: ** 2-byte pointer to the cell
50752: ** 4-byte child pointer
50753: ** 9-byte nKey value
50754: ** 4-byte nData value
50755: ** 4-byte overflow page pointer
50756: ** So a cell consists of a 2-byte pointer, a header which is as much as
50757: ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow
50758: ** page pointer.
50759: */
50760: pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23);
50761: pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23);
50762: pBt->maxLeaf = (u16)(pBt->usableSize - 35);
50763: pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23);
50764: if( pBt->maxLocal>127 ){
50765: pBt->max1bytePayload = 127;
50766: }else{
50767: pBt->max1bytePayload = (u8)pBt->maxLocal;
50768: }
50769: assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) );
50770: pBt->pPage1 = pPage1;
50771: pBt->nPage = nPage;
50772: return SQLITE_OK;
50773:
50774: page1_init_failed:
50775: releasePage(pPage1);
50776: pBt->pPage1 = 0;
50777: return rc;
50778: }
50779:
50780: /*
50781: ** If there are no outstanding cursors and we are not in the middle
50782: ** of a transaction but there is a read lock on the database, then
50783: ** this routine unrefs the first page of the database file which
50784: ** has the effect of releasing the read lock.
50785: **
50786: ** If there is a transaction in progress, this routine is a no-op.
50787: */
50788: static void unlockBtreeIfUnused(BtShared *pBt){
50789: assert( sqlite3_mutex_held(pBt->mutex) );
50790: assert( pBt->pCursor==0 || pBt->inTransaction>TRANS_NONE );
50791: if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){
50792: assert( pBt->pPage1->aData );
50793: assert( sqlite3PagerRefcount(pBt->pPager)==1 );
50794: assert( pBt->pPage1->aData );
50795: releasePage(pBt->pPage1);
50796: pBt->pPage1 = 0;
50797: }
50798: }
50799:
50800: /*
50801: ** If pBt points to an empty file then convert that empty file
50802: ** into a new empty database by initializing the first page of
50803: ** the database.
50804: */
50805: static int newDatabase(BtShared *pBt){
50806: MemPage *pP1;
50807: unsigned char *data;
50808: int rc;
50809:
50810: assert( sqlite3_mutex_held(pBt->mutex) );
50811: if( pBt->nPage>0 ){
50812: return SQLITE_OK;
50813: }
50814: pP1 = pBt->pPage1;
50815: assert( pP1!=0 );
50816: data = pP1->aData;
50817: rc = sqlite3PagerWrite(pP1->pDbPage);
50818: if( rc ) return rc;
50819: memcpy(data, zMagicHeader, sizeof(zMagicHeader));
50820: assert( sizeof(zMagicHeader)==16 );
50821: data[16] = (u8)((pBt->pageSize>>8)&0xff);
50822: data[17] = (u8)((pBt->pageSize>>16)&0xff);
50823: data[18] = 1;
50824: data[19] = 1;
50825: assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize);
50826: data[20] = (u8)(pBt->pageSize - pBt->usableSize);
50827: data[21] = 64;
50828: data[22] = 32;
50829: data[23] = 32;
50830: memset(&data[24], 0, 100-24);
50831: zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA );
50832: pBt->btsFlags |= BTS_PAGESIZE_FIXED;
50833: #ifndef SQLITE_OMIT_AUTOVACUUM
50834: assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 );
50835: assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 );
50836: put4byte(&data[36 + 4*4], pBt->autoVacuum);
50837: put4byte(&data[36 + 7*4], pBt->incrVacuum);
50838: #endif
50839: pBt->nPage = 1;
50840: data[31] = 1;
50841: return SQLITE_OK;
50842: }
50843:
50844: /*
1.2.2.1 ! misho 50845: ** Initialize the first page of the database file (creating a database
! 50846: ** consisting of a single page and no schema objects). Return SQLITE_OK
! 50847: ** if successful, or an SQLite error code otherwise.
! 50848: */
! 50849: SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){
! 50850: int rc;
! 50851: sqlite3BtreeEnter(p);
! 50852: p->pBt->nPage = 0;
! 50853: rc = newDatabase(p->pBt);
! 50854: sqlite3BtreeLeave(p);
! 50855: return rc;
! 50856: }
! 50857:
! 50858: /*
1.2 misho 50859: ** Attempt to start a new transaction. A write-transaction
50860: ** is started if the second argument is nonzero, otherwise a read-
50861: ** transaction. If the second argument is 2 or more and exclusive
50862: ** transaction is started, meaning that no other process is allowed
50863: ** to access the database. A preexisting transaction may not be
50864: ** upgraded to exclusive by calling this routine a second time - the
50865: ** exclusivity flag only works for a new transaction.
50866: **
50867: ** A write-transaction must be started before attempting any
50868: ** changes to the database. None of the following routines
50869: ** will work unless a transaction is started first:
50870: **
50871: ** sqlite3BtreeCreateTable()
50872: ** sqlite3BtreeCreateIndex()
50873: ** sqlite3BtreeClearTable()
50874: ** sqlite3BtreeDropTable()
50875: ** sqlite3BtreeInsert()
50876: ** sqlite3BtreeDelete()
50877: ** sqlite3BtreeUpdateMeta()
50878: **
50879: ** If an initial attempt to acquire the lock fails because of lock contention
50880: ** and the database was previously unlocked, then invoke the busy handler
50881: ** if there is one. But if there was previously a read-lock, do not
50882: ** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is
50883: ** returned when there is already a read-lock in order to avoid a deadlock.
50884: **
50885: ** Suppose there are two processes A and B. A has a read lock and B has
50886: ** a reserved lock. B tries to promote to exclusive but is blocked because
50887: ** of A's read lock. A tries to promote to reserved but is blocked by B.
50888: ** One or the other of the two processes must give way or there can be
50889: ** no progress. By returning SQLITE_BUSY and not invoking the busy callback
50890: ** when A already has a read lock, we encourage A to give up and let B
50891: ** proceed.
50892: */
50893: SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
50894: sqlite3 *pBlock = 0;
50895: BtShared *pBt = p->pBt;
50896: int rc = SQLITE_OK;
50897:
50898: sqlite3BtreeEnter(p);
50899: btreeIntegrity(p);
50900:
50901: /* If the btree is already in a write-transaction, or it
50902: ** is already in a read-transaction and a read-transaction
50903: ** is requested, this is a no-op.
50904: */
50905: if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){
50906: goto trans_begun;
50907: }
50908:
50909: /* Write transactions are not possible on a read-only database */
50910: if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){
50911: rc = SQLITE_READONLY;
50912: goto trans_begun;
50913: }
50914:
50915: #ifndef SQLITE_OMIT_SHARED_CACHE
50916: /* If another database handle has already opened a write transaction
50917: ** on this shared-btree structure and a second write transaction is
50918: ** requested, return SQLITE_LOCKED.
50919: */
50920: if( (wrflag && pBt->inTransaction==TRANS_WRITE)
50921: || (pBt->btsFlags & BTS_PENDING)!=0
50922: ){
50923: pBlock = pBt->pWriter->db;
50924: }else if( wrflag>1 ){
50925: BtLock *pIter;
50926: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
50927: if( pIter->pBtree!=p ){
50928: pBlock = pIter->pBtree->db;
50929: break;
50930: }
50931: }
50932: }
50933: if( pBlock ){
50934: sqlite3ConnectionBlocked(p->db, pBlock);
50935: rc = SQLITE_LOCKED_SHAREDCACHE;
50936: goto trans_begun;
50937: }
50938: #endif
50939:
50940: /* Any read-only or read-write transaction implies a read-lock on
50941: ** page 1. So if some other shared-cache client already has a write-lock
50942: ** on page 1, the transaction cannot be opened. */
50943: rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
50944: if( SQLITE_OK!=rc ) goto trans_begun;
50945:
50946: pBt->btsFlags &= ~BTS_INITIALLY_EMPTY;
50947: if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY;
50948: do {
50949: /* Call lockBtree() until either pBt->pPage1 is populated or
50950: ** lockBtree() returns something other than SQLITE_OK. lockBtree()
50951: ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after
50952: ** reading page 1 it discovers that the page-size of the database
50953: ** file is not pBt->pageSize. In this case lockBtree() will update
50954: ** pBt->pageSize to the page-size of the file on disk.
50955: */
50956: while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) );
50957:
50958: if( rc==SQLITE_OK && wrflag ){
50959: if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){
50960: rc = SQLITE_READONLY;
50961: }else{
50962: rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db));
50963: if( rc==SQLITE_OK ){
50964: rc = newDatabase(pBt);
50965: }
50966: }
50967: }
50968:
50969: if( rc!=SQLITE_OK ){
50970: unlockBtreeIfUnused(pBt);
50971: }
50972: }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
50973: btreeInvokeBusyHandler(pBt) );
50974:
50975: if( rc==SQLITE_OK ){
50976: if( p->inTrans==TRANS_NONE ){
50977: pBt->nTransaction++;
50978: #ifndef SQLITE_OMIT_SHARED_CACHE
50979: if( p->sharable ){
1.2.2.1 ! misho 50980: assert( p->lock.pBtree==p && p->lock.iTable==1 );
1.2 misho 50981: p->lock.eLock = READ_LOCK;
50982: p->lock.pNext = pBt->pLock;
50983: pBt->pLock = &p->lock;
50984: }
50985: #endif
50986: }
50987: p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ);
50988: if( p->inTrans>pBt->inTransaction ){
50989: pBt->inTransaction = p->inTrans;
50990: }
50991: if( wrflag ){
50992: MemPage *pPage1 = pBt->pPage1;
50993: #ifndef SQLITE_OMIT_SHARED_CACHE
50994: assert( !pBt->pWriter );
50995: pBt->pWriter = p;
50996: pBt->btsFlags &= ~BTS_EXCLUSIVE;
50997: if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE;
50998: #endif
50999:
51000: /* If the db-size header field is incorrect (as it may be if an old
51001: ** client has been writing the database file), update it now. Doing
51002: ** this sooner rather than later means the database size can safely
51003: ** re-read the database size from page 1 if a savepoint or transaction
51004: ** rollback occurs within the transaction.
51005: */
51006: if( pBt->nPage!=get4byte(&pPage1->aData[28]) ){
51007: rc = sqlite3PagerWrite(pPage1->pDbPage);
51008: if( rc==SQLITE_OK ){
51009: put4byte(&pPage1->aData[28], pBt->nPage);
51010: }
51011: }
51012: }
51013: }
51014:
51015:
51016: trans_begun:
51017: if( rc==SQLITE_OK && wrflag ){
51018: /* This call makes sure that the pager has the correct number of
51019: ** open savepoints. If the second parameter is greater than 0 and
51020: ** the sub-journal is not already open, then it will be opened here.
51021: */
51022: rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
51023: }
51024:
51025: btreeIntegrity(p);
51026: sqlite3BtreeLeave(p);
51027: return rc;
51028: }
51029:
51030: #ifndef SQLITE_OMIT_AUTOVACUUM
51031:
51032: /*
51033: ** Set the pointer-map entries for all children of page pPage. Also, if
51034: ** pPage contains cells that point to overflow pages, set the pointer
51035: ** map entries for the overflow pages as well.
51036: */
51037: static int setChildPtrmaps(MemPage *pPage){
51038: int i; /* Counter variable */
51039: int nCell; /* Number of cells in page pPage */
51040: int rc; /* Return code */
51041: BtShared *pBt = pPage->pBt;
51042: u8 isInitOrig = pPage->isInit;
51043: Pgno pgno = pPage->pgno;
51044:
51045: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
51046: rc = btreeInitPage(pPage);
51047: if( rc!=SQLITE_OK ){
51048: goto set_child_ptrmaps_out;
51049: }
51050: nCell = pPage->nCell;
51051:
51052: for(i=0; i<nCell; i++){
51053: u8 *pCell = findCell(pPage, i);
51054:
51055: ptrmapPutOvflPtr(pPage, pCell, &rc);
51056:
51057: if( !pPage->leaf ){
51058: Pgno childPgno = get4byte(pCell);
51059: ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
51060: }
51061: }
51062:
51063: if( !pPage->leaf ){
51064: Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
51065: ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
51066: }
51067:
51068: set_child_ptrmaps_out:
51069: pPage->isInit = isInitOrig;
51070: return rc;
51071: }
51072:
51073: /*
51074: ** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so
51075: ** that it points to iTo. Parameter eType describes the type of pointer to
51076: ** be modified, as follows:
51077: **
51078: ** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child
51079: ** page of pPage.
51080: **
51081: ** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow
51082: ** page pointed to by one of the cells on pPage.
51083: **
51084: ** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next
51085: ** overflow page in the list.
51086: */
51087: static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
51088: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
51089: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
51090: if( eType==PTRMAP_OVERFLOW2 ){
51091: /* The pointer is always the first 4 bytes of the page in this case. */
51092: if( get4byte(pPage->aData)!=iFrom ){
51093: return SQLITE_CORRUPT_BKPT;
51094: }
51095: put4byte(pPage->aData, iTo);
51096: }else{
51097: u8 isInitOrig = pPage->isInit;
51098: int i;
51099: int nCell;
51100:
51101: btreeInitPage(pPage);
51102: nCell = pPage->nCell;
51103:
51104: for(i=0; i<nCell; i++){
51105: u8 *pCell = findCell(pPage, i);
51106: if( eType==PTRMAP_OVERFLOW1 ){
51107: CellInfo info;
51108: btreeParseCellPtr(pPage, pCell, &info);
51109: if( info.iOverflow
51110: && pCell+info.iOverflow+3<=pPage->aData+pPage->maskPage
51111: && iFrom==get4byte(&pCell[info.iOverflow])
51112: ){
51113: put4byte(&pCell[info.iOverflow], iTo);
51114: break;
51115: }
51116: }else{
51117: if( get4byte(pCell)==iFrom ){
51118: put4byte(pCell, iTo);
51119: break;
51120: }
51121: }
51122: }
51123:
51124: if( i==nCell ){
51125: if( eType!=PTRMAP_BTREE ||
51126: get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){
51127: return SQLITE_CORRUPT_BKPT;
51128: }
51129: put4byte(&pPage->aData[pPage->hdrOffset+8], iTo);
51130: }
51131:
51132: pPage->isInit = isInitOrig;
51133: }
51134: return SQLITE_OK;
51135: }
51136:
51137:
51138: /*
51139: ** Move the open database page pDbPage to location iFreePage in the
51140: ** database. The pDbPage reference remains valid.
51141: **
51142: ** The isCommit flag indicates that there is no need to remember that
51143: ** the journal needs to be sync()ed before database page pDbPage->pgno
51144: ** can be written to. The caller has already promised not to write to that
51145: ** page.
51146: */
51147: static int relocatePage(
51148: BtShared *pBt, /* Btree */
51149: MemPage *pDbPage, /* Open page to move */
51150: u8 eType, /* Pointer map 'type' entry for pDbPage */
51151: Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */
51152: Pgno iFreePage, /* The location to move pDbPage to */
51153: int isCommit /* isCommit flag passed to sqlite3PagerMovepage */
51154: ){
51155: MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */
51156: Pgno iDbPage = pDbPage->pgno;
51157: Pager *pPager = pBt->pPager;
51158: int rc;
51159:
51160: assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 ||
51161: eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE );
51162: assert( sqlite3_mutex_held(pBt->mutex) );
51163: assert( pDbPage->pBt==pBt );
51164:
51165: /* Move page iDbPage from its current location to page number iFreePage */
51166: TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
51167: iDbPage, iFreePage, iPtrPage, eType));
51168: rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit);
51169: if( rc!=SQLITE_OK ){
51170: return rc;
51171: }
51172: pDbPage->pgno = iFreePage;
51173:
51174: /* If pDbPage was a btree-page, then it may have child pages and/or cells
51175: ** that point to overflow pages. The pointer map entries for all these
51176: ** pages need to be changed.
51177: **
51178: ** If pDbPage is an overflow page, then the first 4 bytes may store a
51179: ** pointer to a subsequent overflow page. If this is the case, then
51180: ** the pointer map needs to be updated for the subsequent overflow page.
51181: */
51182: if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){
51183: rc = setChildPtrmaps(pDbPage);
51184: if( rc!=SQLITE_OK ){
51185: return rc;
51186: }
51187: }else{
51188: Pgno nextOvfl = get4byte(pDbPage->aData);
51189: if( nextOvfl!=0 ){
51190: ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc);
51191: if( rc!=SQLITE_OK ){
51192: return rc;
51193: }
51194: }
51195: }
51196:
51197: /* Fix the database pointer on page iPtrPage that pointed at iDbPage so
51198: ** that it points at iFreePage. Also fix the pointer map entry for
51199: ** iPtrPage.
51200: */
51201: if( eType!=PTRMAP_ROOTPAGE ){
51202: rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0);
51203: if( rc!=SQLITE_OK ){
51204: return rc;
51205: }
51206: rc = sqlite3PagerWrite(pPtrPage->pDbPage);
51207: if( rc!=SQLITE_OK ){
51208: releasePage(pPtrPage);
51209: return rc;
51210: }
51211: rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType);
51212: releasePage(pPtrPage);
51213: if( rc==SQLITE_OK ){
51214: ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc);
51215: }
51216: }
51217: return rc;
51218: }
51219:
51220: /* Forward declaration required by incrVacuumStep(). */
51221: static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8);
51222:
51223: /*
51224: ** Perform a single step of an incremental-vacuum. If successful,
51225: ** return SQLITE_OK. If there is no work to do (and therefore no
51226: ** point in calling this function again), return SQLITE_DONE.
51227: **
51228: ** More specificly, this function attempts to re-organize the
51229: ** database so that the last page of the file currently in use
51230: ** is no longer in use.
51231: **
51232: ** If the nFin parameter is non-zero, this function assumes
51233: ** that the caller will keep calling incrVacuumStep() until
51234: ** it returns SQLITE_DONE or an error, and that nFin is the
51235: ** number of pages the database file will contain after this
51236: ** process is complete. If nFin is zero, it is assumed that
51237: ** incrVacuumStep() will be called a finite amount of times
51238: ** which may or may not empty the freelist. A full autovacuum
51239: ** has nFin>0. A "PRAGMA incremental_vacuum" has nFin==0.
51240: */
51241: static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg){
51242: Pgno nFreeList; /* Number of pages still on the free-list */
51243: int rc;
51244:
51245: assert( sqlite3_mutex_held(pBt->mutex) );
51246: assert( iLastPg>nFin );
51247:
51248: if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){
51249: u8 eType;
51250: Pgno iPtrPage;
51251:
51252: nFreeList = get4byte(&pBt->pPage1->aData[36]);
51253: if( nFreeList==0 ){
51254: return SQLITE_DONE;
51255: }
51256:
51257: rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage);
51258: if( rc!=SQLITE_OK ){
51259: return rc;
51260: }
51261: if( eType==PTRMAP_ROOTPAGE ){
51262: return SQLITE_CORRUPT_BKPT;
51263: }
51264:
51265: if( eType==PTRMAP_FREEPAGE ){
51266: if( nFin==0 ){
51267: /* Remove the page from the files free-list. This is not required
51268: ** if nFin is non-zero. In that case, the free-list will be
51269: ** truncated to zero after this function returns, so it doesn't
51270: ** matter if it still contains some garbage entries.
51271: */
51272: Pgno iFreePg;
51273: MemPage *pFreePg;
51274: rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, 1);
51275: if( rc!=SQLITE_OK ){
51276: return rc;
51277: }
51278: assert( iFreePg==iLastPg );
51279: releasePage(pFreePg);
51280: }
51281: } else {
51282: Pgno iFreePg; /* Index of free page to move pLastPg to */
51283: MemPage *pLastPg;
51284:
51285: rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0);
51286: if( rc!=SQLITE_OK ){
51287: return rc;
51288: }
51289:
51290: /* If nFin is zero, this loop runs exactly once and page pLastPg
51291: ** is swapped with the first free page pulled off the free list.
51292: **
51293: ** On the other hand, if nFin is greater than zero, then keep
51294: ** looping until a free-page located within the first nFin pages
51295: ** of the file is found.
51296: */
51297: do {
51298: MemPage *pFreePg;
51299: rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, 0, 0);
51300: if( rc!=SQLITE_OK ){
51301: releasePage(pLastPg);
51302: return rc;
51303: }
51304: releasePage(pFreePg);
51305: }while( nFin!=0 && iFreePg>nFin );
51306: assert( iFreePg<iLastPg );
51307:
51308: rc = sqlite3PagerWrite(pLastPg->pDbPage);
51309: if( rc==SQLITE_OK ){
51310: rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg, nFin!=0);
51311: }
51312: releasePage(pLastPg);
51313: if( rc!=SQLITE_OK ){
51314: return rc;
51315: }
51316: }
51317: }
51318:
51319: if( nFin==0 ){
51320: iLastPg--;
51321: while( iLastPg==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, iLastPg) ){
51322: if( PTRMAP_ISPAGE(pBt, iLastPg) ){
51323: MemPage *pPg;
51324: rc = btreeGetPage(pBt, iLastPg, &pPg, 0);
51325: if( rc!=SQLITE_OK ){
51326: return rc;
51327: }
51328: rc = sqlite3PagerWrite(pPg->pDbPage);
51329: releasePage(pPg);
51330: if( rc!=SQLITE_OK ){
51331: return rc;
51332: }
51333: }
51334: iLastPg--;
51335: }
51336: sqlite3PagerTruncateImage(pBt->pPager, iLastPg);
51337: pBt->nPage = iLastPg;
51338: }
51339: return SQLITE_OK;
51340: }
51341:
51342: /*
51343: ** A write-transaction must be opened before calling this function.
51344: ** It performs a single unit of work towards an incremental vacuum.
51345: **
51346: ** If the incremental vacuum is finished after this function has run,
51347: ** SQLITE_DONE is returned. If it is not finished, but no error occurred,
51348: ** SQLITE_OK is returned. Otherwise an SQLite error code.
51349: */
51350: SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){
51351: int rc;
51352: BtShared *pBt = p->pBt;
51353:
51354: sqlite3BtreeEnter(p);
51355: assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE );
51356: if( !pBt->autoVacuum ){
51357: rc = SQLITE_DONE;
51358: }else{
51359: invalidateAllOverflowCache(pBt);
51360: rc = incrVacuumStep(pBt, 0, btreePagecount(pBt));
51361: if( rc==SQLITE_OK ){
51362: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
51363: put4byte(&pBt->pPage1->aData[28], pBt->nPage);
51364: }
51365: }
51366: sqlite3BtreeLeave(p);
51367: return rc;
51368: }
51369:
51370: /*
51371: ** This routine is called prior to sqlite3PagerCommit when a transaction
51372: ** is commited for an auto-vacuum database.
51373: **
51374: ** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages
51375: ** the database file should be truncated to during the commit process.
51376: ** i.e. the database has been reorganized so that only the first *pnTrunc
51377: ** pages are in use.
51378: */
51379: static int autoVacuumCommit(BtShared *pBt){
51380: int rc = SQLITE_OK;
51381: Pager *pPager = pBt->pPager;
51382: VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager) );
51383:
51384: assert( sqlite3_mutex_held(pBt->mutex) );
51385: invalidateAllOverflowCache(pBt);
51386: assert(pBt->autoVacuum);
51387: if( !pBt->incrVacuum ){
51388: Pgno nFin; /* Number of pages in database after autovacuuming */
51389: Pgno nFree; /* Number of pages on the freelist initially */
51390: Pgno nPtrmap; /* Number of PtrMap pages to be freed */
51391: Pgno iFree; /* The next page to be freed */
51392: int nEntry; /* Number of entries on one ptrmap page */
51393: Pgno nOrig; /* Database size before freeing */
51394:
51395: nOrig = btreePagecount(pBt);
51396: if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){
51397: /* It is not possible to create a database for which the final page
51398: ** is either a pointer-map page or the pending-byte page. If one
51399: ** is encountered, this indicates corruption.
51400: */
51401: return SQLITE_CORRUPT_BKPT;
51402: }
51403:
51404: nFree = get4byte(&pBt->pPage1->aData[36]);
51405: nEntry = pBt->usableSize/5;
51406: nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry;
51407: nFin = nOrig - nFree - nPtrmap;
51408: if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<PENDING_BYTE_PAGE(pBt) ){
51409: nFin--;
51410: }
51411: while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){
51412: nFin--;
51413: }
51414: if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT;
51415:
51416: for(iFree=nOrig; iFree>nFin && rc==SQLITE_OK; iFree--){
51417: rc = incrVacuumStep(pBt, nFin, iFree);
51418: }
51419: if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){
51420: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
51421: put4byte(&pBt->pPage1->aData[32], 0);
51422: put4byte(&pBt->pPage1->aData[36], 0);
51423: put4byte(&pBt->pPage1->aData[28], nFin);
51424: sqlite3PagerTruncateImage(pBt->pPager, nFin);
51425: pBt->nPage = nFin;
51426: }
51427: if( rc!=SQLITE_OK ){
51428: sqlite3PagerRollback(pPager);
51429: }
51430: }
51431:
51432: assert( nRef==sqlite3PagerRefcount(pPager) );
51433: return rc;
51434: }
51435:
51436: #else /* ifndef SQLITE_OMIT_AUTOVACUUM */
51437: # define setChildPtrmaps(x) SQLITE_OK
51438: #endif
51439:
51440: /*
51441: ** This routine does the first phase of a two-phase commit. This routine
51442: ** causes a rollback journal to be created (if it does not already exist)
51443: ** and populated with enough information so that if a power loss occurs
51444: ** the database can be restored to its original state by playing back
51445: ** the journal. Then the contents of the journal are flushed out to
51446: ** the disk. After the journal is safely on oxide, the changes to the
51447: ** database are written into the database file and flushed to oxide.
51448: ** At the end of this call, the rollback journal still exists on the
51449: ** disk and we are still holding all locks, so the transaction has not
51450: ** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the
51451: ** commit process.
51452: **
51453: ** This call is a no-op if no write-transaction is currently active on pBt.
51454: **
51455: ** Otherwise, sync the database file for the btree pBt. zMaster points to
51456: ** the name of a master journal file that should be written into the
51457: ** individual journal file, or is NULL, indicating no master journal file
51458: ** (single database transaction).
51459: **
51460: ** When this is called, the master journal should already have been
51461: ** created, populated with this journal pointer and synced to disk.
51462: **
51463: ** Once this is routine has returned, the only thing required to commit
51464: ** the write-transaction for this database file is to delete the journal.
51465: */
51466: SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){
51467: int rc = SQLITE_OK;
51468: if( p->inTrans==TRANS_WRITE ){
51469: BtShared *pBt = p->pBt;
51470: sqlite3BtreeEnter(p);
51471: #ifndef SQLITE_OMIT_AUTOVACUUM
51472: if( pBt->autoVacuum ){
51473: rc = autoVacuumCommit(pBt);
51474: if( rc!=SQLITE_OK ){
51475: sqlite3BtreeLeave(p);
51476: return rc;
51477: }
51478: }
51479: #endif
51480: rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0);
51481: sqlite3BtreeLeave(p);
51482: }
51483: return rc;
51484: }
51485:
51486: /*
51487: ** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback()
51488: ** at the conclusion of a transaction.
51489: */
51490: static void btreeEndTransaction(Btree *p){
51491: BtShared *pBt = p->pBt;
51492: assert( sqlite3BtreeHoldsMutex(p) );
51493:
51494: btreeClearHasContent(pBt);
51495: if( p->inTrans>TRANS_NONE && p->db->activeVdbeCnt>1 ){
51496: /* If there are other active statements that belong to this database
51497: ** handle, downgrade to a read-only transaction. The other statements
51498: ** may still be reading from the database. */
51499: downgradeAllSharedCacheTableLocks(p);
51500: p->inTrans = TRANS_READ;
51501: }else{
51502: /* If the handle had any kind of transaction open, decrement the
51503: ** transaction count of the shared btree. If the transaction count
51504: ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused()
51505: ** call below will unlock the pager. */
51506: if( p->inTrans!=TRANS_NONE ){
51507: clearAllSharedCacheTableLocks(p);
51508: pBt->nTransaction--;
51509: if( 0==pBt->nTransaction ){
51510: pBt->inTransaction = TRANS_NONE;
51511: }
51512: }
51513:
51514: /* Set the current transaction state to TRANS_NONE and unlock the
51515: ** pager if this call closed the only read or write transaction. */
51516: p->inTrans = TRANS_NONE;
51517: unlockBtreeIfUnused(pBt);
51518: }
51519:
51520: btreeIntegrity(p);
51521: }
51522:
51523: /*
51524: ** Commit the transaction currently in progress.
51525: **
51526: ** This routine implements the second phase of a 2-phase commit. The
51527: ** sqlite3BtreeCommitPhaseOne() routine does the first phase and should
51528: ** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne()
51529: ** routine did all the work of writing information out to disk and flushing the
51530: ** contents so that they are written onto the disk platter. All this
51531: ** routine has to do is delete or truncate or zero the header in the
51532: ** the rollback journal (which causes the transaction to commit) and
51533: ** drop locks.
51534: **
51535: ** Normally, if an error occurs while the pager layer is attempting to
51536: ** finalize the underlying journal file, this function returns an error and
51537: ** the upper layer will attempt a rollback. However, if the second argument
51538: ** is non-zero then this b-tree transaction is part of a multi-file
51539: ** transaction. In this case, the transaction has already been committed
51540: ** (by deleting a master journal file) and the caller will ignore this
51541: ** functions return code. So, even if an error occurs in the pager layer,
51542: ** reset the b-tree objects internal state to indicate that the write
51543: ** transaction has been closed. This is quite safe, as the pager will have
51544: ** transitioned to the error state.
51545: **
51546: ** This will release the write lock on the database file. If there
51547: ** are no active cursors, it also releases the read lock.
51548: */
51549: SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){
51550:
51551: if( p->inTrans==TRANS_NONE ) return SQLITE_OK;
51552: sqlite3BtreeEnter(p);
51553: btreeIntegrity(p);
51554:
51555: /* If the handle has a write-transaction open, commit the shared-btrees
51556: ** transaction and set the shared state to TRANS_READ.
51557: */
51558: if( p->inTrans==TRANS_WRITE ){
51559: int rc;
51560: BtShared *pBt = p->pBt;
51561: assert( pBt->inTransaction==TRANS_WRITE );
51562: assert( pBt->nTransaction>0 );
51563: rc = sqlite3PagerCommitPhaseTwo(pBt->pPager);
51564: if( rc!=SQLITE_OK && bCleanup==0 ){
51565: sqlite3BtreeLeave(p);
51566: return rc;
51567: }
51568: pBt->inTransaction = TRANS_READ;
51569: }
51570:
51571: btreeEndTransaction(p);
51572: sqlite3BtreeLeave(p);
51573: return SQLITE_OK;
51574: }
51575:
51576: /*
51577: ** Do both phases of a commit.
51578: */
51579: SQLITE_PRIVATE int sqlite3BtreeCommit(Btree *p){
51580: int rc;
51581: sqlite3BtreeEnter(p);
51582: rc = sqlite3BtreeCommitPhaseOne(p, 0);
51583: if( rc==SQLITE_OK ){
51584: rc = sqlite3BtreeCommitPhaseTwo(p, 0);
51585: }
51586: sqlite3BtreeLeave(p);
51587: return rc;
51588: }
51589:
51590: #ifndef NDEBUG
51591: /*
51592: ** Return the number of write-cursors open on this handle. This is for use
51593: ** in assert() expressions, so it is only compiled if NDEBUG is not
51594: ** defined.
51595: **
51596: ** For the purposes of this routine, a write-cursor is any cursor that
51597: ** is capable of writing to the databse. That means the cursor was
51598: ** originally opened for writing and the cursor has not be disabled
51599: ** by having its state changed to CURSOR_FAULT.
51600: */
51601: static int countWriteCursors(BtShared *pBt){
51602: BtCursor *pCur;
51603: int r = 0;
51604: for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){
51605: if( pCur->wrFlag && pCur->eState!=CURSOR_FAULT ) r++;
51606: }
51607: return r;
51608: }
51609: #endif
51610:
51611: /*
51612: ** This routine sets the state to CURSOR_FAULT and the error
51613: ** code to errCode for every cursor on BtShared that pBtree
51614: ** references.
51615: **
51616: ** Every cursor is tripped, including cursors that belong
51617: ** to other database connections that happen to be sharing
51618: ** the cache with pBtree.
51619: **
51620: ** This routine gets called when a rollback occurs.
51621: ** All cursors using the same cache must be tripped
51622: ** to prevent them from trying to use the btree after
51623: ** the rollback. The rollback may have deleted tables
51624: ** or moved root pages, so it is not sufficient to
51625: ** save the state of the cursor. The cursor must be
51626: ** invalidated.
51627: */
51628: SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode){
51629: BtCursor *p;
1.2.2.1 ! misho 51630: if( pBtree==0 ) return;
1.2 misho 51631: sqlite3BtreeEnter(pBtree);
51632: for(p=pBtree->pBt->pCursor; p; p=p->pNext){
51633: int i;
51634: sqlite3BtreeClearCursor(p);
51635: p->eState = CURSOR_FAULT;
51636: p->skipNext = errCode;
51637: for(i=0; i<=p->iPage; i++){
51638: releasePage(p->apPage[i]);
51639: p->apPage[i] = 0;
51640: }
51641: }
51642: sqlite3BtreeLeave(pBtree);
51643: }
51644:
51645: /*
51646: ** Rollback the transaction in progress. All cursors will be
51647: ** invalided by this operation. Any attempt to use a cursor
51648: ** that was open at the beginning of this operation will result
51649: ** in an error.
51650: **
51651: ** This will release the write lock on the database file. If there
51652: ** are no active cursors, it also releases the read lock.
51653: */
1.2.2.1 ! misho 51654: SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode){
1.2 misho 51655: int rc;
51656: BtShared *pBt = p->pBt;
51657: MemPage *pPage1;
51658:
51659: sqlite3BtreeEnter(p);
1.2.2.1 ! misho 51660: if( tripCode==SQLITE_OK ){
! 51661: rc = tripCode = saveAllCursors(pBt, 0, 0);
! 51662: }else{
! 51663: rc = SQLITE_OK;
! 51664: }
! 51665: if( tripCode ){
! 51666: sqlite3BtreeTripAllCursors(p, tripCode);
1.2 misho 51667: }
51668: btreeIntegrity(p);
51669:
51670: if( p->inTrans==TRANS_WRITE ){
51671: int rc2;
51672:
51673: assert( TRANS_WRITE==pBt->inTransaction );
51674: rc2 = sqlite3PagerRollback(pBt->pPager);
51675: if( rc2!=SQLITE_OK ){
51676: rc = rc2;
51677: }
51678:
51679: /* The rollback may have destroyed the pPage1->aData value. So
51680: ** call btreeGetPage() on page 1 again to make
51681: ** sure pPage1->aData is set correctly. */
51682: if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){
51683: int nPage = get4byte(28+(u8*)pPage1->aData);
51684: testcase( nPage==0 );
51685: if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage);
51686: testcase( pBt->nPage!=nPage );
51687: pBt->nPage = nPage;
51688: releasePage(pPage1);
51689: }
51690: assert( countWriteCursors(pBt)==0 );
51691: pBt->inTransaction = TRANS_READ;
51692: }
51693:
51694: btreeEndTransaction(p);
51695: sqlite3BtreeLeave(p);
51696: return rc;
51697: }
51698:
51699: /*
51700: ** Start a statement subtransaction. The subtransaction can can be rolled
51701: ** back independently of the main transaction. You must start a transaction
51702: ** before starting a subtransaction. The subtransaction is ended automatically
51703: ** if the main transaction commits or rolls back.
51704: **
51705: ** Statement subtransactions are used around individual SQL statements
51706: ** that are contained within a BEGIN...COMMIT block. If a constraint
51707: ** error occurs within the statement, the effect of that one statement
51708: ** can be rolled back without having to rollback the entire transaction.
51709: **
51710: ** A statement sub-transaction is implemented as an anonymous savepoint. The
51711: ** value passed as the second parameter is the total number of savepoints,
51712: ** including the new anonymous savepoint, open on the B-Tree. i.e. if there
51713: ** are no active savepoints and no other statement-transactions open,
51714: ** iStatement is 1. This anonymous savepoint can be released or rolled back
51715: ** using the sqlite3BtreeSavepoint() function.
51716: */
51717: SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree *p, int iStatement){
51718: int rc;
51719: BtShared *pBt = p->pBt;
51720: sqlite3BtreeEnter(p);
51721: assert( p->inTrans==TRANS_WRITE );
51722: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
51723: assert( iStatement>0 );
51724: assert( iStatement>p->db->nSavepoint );
51725: assert( pBt->inTransaction==TRANS_WRITE );
51726: /* At the pager level, a statement transaction is a savepoint with
51727: ** an index greater than all savepoints created explicitly using
51728: ** SQL statements. It is illegal to open, release or rollback any
51729: ** such savepoints while the statement transaction savepoint is active.
51730: */
51731: rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement);
51732: sqlite3BtreeLeave(p);
51733: return rc;
51734: }
51735:
51736: /*
51737: ** The second argument to this function, op, is always SAVEPOINT_ROLLBACK
51738: ** or SAVEPOINT_RELEASE. This function either releases or rolls back the
51739: ** savepoint identified by parameter iSavepoint, depending on the value
51740: ** of op.
51741: **
51742: ** Normally, iSavepoint is greater than or equal to zero. However, if op is
51743: ** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the
51744: ** contents of the entire transaction are rolled back. This is different
51745: ** from a normal transaction rollback, as no locks are released and the
51746: ** transaction remains open.
51747: */
51748: SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){
51749: int rc = SQLITE_OK;
51750: if( p && p->inTrans==TRANS_WRITE ){
51751: BtShared *pBt = p->pBt;
51752: assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
51753: assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) );
51754: sqlite3BtreeEnter(p);
51755: rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint);
51756: if( rc==SQLITE_OK ){
51757: if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){
51758: pBt->nPage = 0;
51759: }
51760: rc = newDatabase(pBt);
51761: pBt->nPage = get4byte(28 + pBt->pPage1->aData);
51762:
51763: /* The database size was written into the offset 28 of the header
51764: ** when the transaction started, so we know that the value at offset
51765: ** 28 is nonzero. */
51766: assert( pBt->nPage>0 );
51767: }
51768: sqlite3BtreeLeave(p);
51769: }
51770: return rc;
51771: }
51772:
51773: /*
51774: ** Create a new cursor for the BTree whose root is on the page
51775: ** iTable. If a read-only cursor is requested, it is assumed that
51776: ** the caller already has at least a read-only transaction open
51777: ** on the database already. If a write-cursor is requested, then
51778: ** the caller is assumed to have an open write transaction.
51779: **
51780: ** If wrFlag==0, then the cursor can only be used for reading.
51781: ** If wrFlag==1, then the cursor can be used for reading or for
51782: ** writing if other conditions for writing are also met. These
51783: ** are the conditions that must be met in order for writing to
51784: ** be allowed:
51785: **
51786: ** 1: The cursor must have been opened with wrFlag==1
51787: **
51788: ** 2: Other database connections that share the same pager cache
51789: ** but which are not in the READ_UNCOMMITTED state may not have
51790: ** cursors open with wrFlag==0 on the same table. Otherwise
51791: ** the changes made by this write cursor would be visible to
51792: ** the read cursors in the other database connection.
51793: **
51794: ** 3: The database must be writable (not on read-only media)
51795: **
51796: ** 4: There must be an active transaction.
51797: **
51798: ** No checking is done to make sure that page iTable really is the
51799: ** root page of a b-tree. If it is not, then the cursor acquired
51800: ** will not work correctly.
51801: **
51802: ** It is assumed that the sqlite3BtreeCursorZero() has been called
51803: ** on pCur to initialize the memory space prior to invoking this routine.
51804: */
51805: static int btreeCursor(
51806: Btree *p, /* The btree */
51807: int iTable, /* Root page of table to open */
51808: int wrFlag, /* 1 to write. 0 read-only */
51809: struct KeyInfo *pKeyInfo, /* First arg to comparison function */
51810: BtCursor *pCur /* Space for new cursor */
51811: ){
51812: BtShared *pBt = p->pBt; /* Shared b-tree handle */
51813:
51814: assert( sqlite3BtreeHoldsMutex(p) );
51815: assert( wrFlag==0 || wrFlag==1 );
51816:
51817: /* The following assert statements verify that if this is a sharable
51818: ** b-tree database, the connection is holding the required table locks,
51819: ** and that no other connection has any open cursor that conflicts with
51820: ** this lock. */
51821: assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, wrFlag+1) );
51822: assert( wrFlag==0 || !hasReadConflicts(p, iTable) );
51823:
51824: /* Assert that the caller has opened the required transaction. */
51825: assert( p->inTrans>TRANS_NONE );
51826: assert( wrFlag==0 || p->inTrans==TRANS_WRITE );
51827: assert( pBt->pPage1 && pBt->pPage1->aData );
51828:
51829: if( NEVER(wrFlag && (pBt->btsFlags & BTS_READ_ONLY)!=0) ){
51830: return SQLITE_READONLY;
51831: }
51832: if( iTable==1 && btreePagecount(pBt)==0 ){
51833: assert( wrFlag==0 );
51834: iTable = 0;
51835: }
51836:
51837: /* Now that no other errors can occur, finish filling in the BtCursor
51838: ** variables and link the cursor into the BtShared list. */
51839: pCur->pgnoRoot = (Pgno)iTable;
51840: pCur->iPage = -1;
51841: pCur->pKeyInfo = pKeyInfo;
51842: pCur->pBtree = p;
51843: pCur->pBt = pBt;
51844: pCur->wrFlag = (u8)wrFlag;
51845: pCur->pNext = pBt->pCursor;
51846: if( pCur->pNext ){
51847: pCur->pNext->pPrev = pCur;
51848: }
51849: pBt->pCursor = pCur;
51850: pCur->eState = CURSOR_INVALID;
51851: pCur->cachedRowid = 0;
51852: return SQLITE_OK;
51853: }
51854: SQLITE_PRIVATE int sqlite3BtreeCursor(
51855: Btree *p, /* The btree */
51856: int iTable, /* Root page of table to open */
51857: int wrFlag, /* 1 to write. 0 read-only */
51858: struct KeyInfo *pKeyInfo, /* First arg to xCompare() */
51859: BtCursor *pCur /* Write new cursor here */
51860: ){
51861: int rc;
51862: sqlite3BtreeEnter(p);
51863: rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur);
51864: sqlite3BtreeLeave(p);
51865: return rc;
51866: }
51867:
51868: /*
51869: ** Return the size of a BtCursor object in bytes.
51870: **
51871: ** This interfaces is needed so that users of cursors can preallocate
51872: ** sufficient storage to hold a cursor. The BtCursor object is opaque
51873: ** to users so they cannot do the sizeof() themselves - they must call
51874: ** this routine.
51875: */
51876: SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){
51877: return ROUND8(sizeof(BtCursor));
51878: }
51879:
51880: /*
51881: ** Initialize memory that will be converted into a BtCursor object.
51882: **
51883: ** The simple approach here would be to memset() the entire object
51884: ** to zero. But it turns out that the apPage[] and aiIdx[] arrays
51885: ** do not need to be zeroed and they are large, so we can save a lot
51886: ** of run-time by skipping the initialization of those elements.
51887: */
51888: SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){
51889: memset(p, 0, offsetof(BtCursor, iPage));
51890: }
51891:
51892: /*
51893: ** Set the cached rowid value of every cursor in the same database file
51894: ** as pCur and having the same root page number as pCur. The value is
51895: ** set to iRowid.
51896: **
51897: ** Only positive rowid values are considered valid for this cache.
51898: ** The cache is initialized to zero, indicating an invalid cache.
51899: ** A btree will work fine with zero or negative rowids. We just cannot
51900: ** cache zero or negative rowids, which means tables that use zero or
51901: ** negative rowids might run a little slower. But in practice, zero
51902: ** or negative rowids are very uncommon so this should not be a problem.
51903: */
51904: SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor *pCur, sqlite3_int64 iRowid){
51905: BtCursor *p;
51906: for(p=pCur->pBt->pCursor; p; p=p->pNext){
51907: if( p->pgnoRoot==pCur->pgnoRoot ) p->cachedRowid = iRowid;
51908: }
51909: assert( pCur->cachedRowid==iRowid );
51910: }
51911:
51912: /*
51913: ** Return the cached rowid for the given cursor. A negative or zero
51914: ** return value indicates that the rowid cache is invalid and should be
51915: ** ignored. If the rowid cache has never before been set, then a
51916: ** zero is returned.
51917: */
51918: SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor *pCur){
51919: return pCur->cachedRowid;
51920: }
51921:
51922: /*
51923: ** Close a cursor. The read lock on the database file is released
51924: ** when the last cursor is closed.
51925: */
51926: SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){
51927: Btree *pBtree = pCur->pBtree;
51928: if( pBtree ){
51929: int i;
51930: BtShared *pBt = pCur->pBt;
51931: sqlite3BtreeEnter(pBtree);
51932: sqlite3BtreeClearCursor(pCur);
51933: if( pCur->pPrev ){
51934: pCur->pPrev->pNext = pCur->pNext;
51935: }else{
51936: pBt->pCursor = pCur->pNext;
51937: }
51938: if( pCur->pNext ){
51939: pCur->pNext->pPrev = pCur->pPrev;
51940: }
51941: for(i=0; i<=pCur->iPage; i++){
51942: releasePage(pCur->apPage[i]);
51943: }
51944: unlockBtreeIfUnused(pBt);
51945: invalidateOverflowCache(pCur);
51946: /* sqlite3_free(pCur); */
51947: sqlite3BtreeLeave(pBtree);
51948: }
51949: return SQLITE_OK;
51950: }
51951:
51952: /*
51953: ** Make sure the BtCursor* given in the argument has a valid
51954: ** BtCursor.info structure. If it is not already valid, call
51955: ** btreeParseCell() to fill it in.
51956: **
51957: ** BtCursor.info is a cache of the information in the current cell.
51958: ** Using this cache reduces the number of calls to btreeParseCell().
51959: **
51960: ** 2007-06-25: There is a bug in some versions of MSVC that cause the
51961: ** compiler to crash when getCellInfo() is implemented as a macro.
51962: ** But there is a measureable speed advantage to using the macro on gcc
51963: ** (when less compiler optimizations like -Os or -O0 are used and the
51964: ** compiler is not doing agressive inlining.) So we use a real function
51965: ** for MSVC and a macro for everything else. Ticket #2457.
51966: */
51967: #ifndef NDEBUG
51968: static void assertCellInfo(BtCursor *pCur){
51969: CellInfo info;
51970: int iPage = pCur->iPage;
51971: memset(&info, 0, sizeof(info));
51972: btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info);
51973: assert( memcmp(&info, &pCur->info, sizeof(info))==0 );
51974: }
51975: #else
51976: #define assertCellInfo(x)
51977: #endif
51978: #ifdef _MSC_VER
51979: /* Use a real function in MSVC to work around bugs in that compiler. */
51980: static void getCellInfo(BtCursor *pCur){
51981: if( pCur->info.nSize==0 ){
51982: int iPage = pCur->iPage;
51983: btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
51984: pCur->validNKey = 1;
51985: }else{
51986: assertCellInfo(pCur);
51987: }
51988: }
51989: #else /* if not _MSC_VER */
51990: /* Use a macro in all other compilers so that the function is inlined */
51991: #define getCellInfo(pCur) \
51992: if( pCur->info.nSize==0 ){ \
51993: int iPage = pCur->iPage; \
51994: btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \
51995: pCur->validNKey = 1; \
51996: }else{ \
51997: assertCellInfo(pCur); \
51998: }
51999: #endif /* _MSC_VER */
52000:
52001: #ifndef NDEBUG /* The next routine used only within assert() statements */
52002: /*
52003: ** Return true if the given BtCursor is valid. A valid cursor is one
52004: ** that is currently pointing to a row in a (non-empty) table.
52005: ** This is a verification routine is used only within assert() statements.
52006: */
52007: SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){
52008: return pCur && pCur->eState==CURSOR_VALID;
52009: }
52010: #endif /* NDEBUG */
52011:
52012: /*
52013: ** Set *pSize to the size of the buffer needed to hold the value of
52014: ** the key for the current entry. If the cursor is not pointing
52015: ** to a valid entry, *pSize is set to 0.
52016: **
52017: ** For a table with the INTKEY flag set, this routine returns the key
52018: ** itself, not the number of bytes in the key.
52019: **
52020: ** The caller must position the cursor prior to invoking this routine.
52021: **
52022: ** This routine cannot fail. It always returns SQLITE_OK.
52023: */
52024: SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){
52025: assert( cursorHoldsMutex(pCur) );
52026: assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID );
52027: if( pCur->eState!=CURSOR_VALID ){
52028: *pSize = 0;
52029: }else{
52030: getCellInfo(pCur);
52031: *pSize = pCur->info.nKey;
52032: }
52033: return SQLITE_OK;
52034: }
52035:
52036: /*
52037: ** Set *pSize to the number of bytes of data in the entry the
52038: ** cursor currently points to.
52039: **
52040: ** The caller must guarantee that the cursor is pointing to a non-NULL
52041: ** valid entry. In other words, the calling procedure must guarantee
52042: ** that the cursor has Cursor.eState==CURSOR_VALID.
52043: **
52044: ** Failure is not possible. This function always returns SQLITE_OK.
52045: ** It might just as well be a procedure (returning void) but we continue
52046: ** to return an integer result code for historical reasons.
52047: */
52048: SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
52049: assert( cursorHoldsMutex(pCur) );
52050: assert( pCur->eState==CURSOR_VALID );
52051: getCellInfo(pCur);
52052: *pSize = pCur->info.nData;
52053: return SQLITE_OK;
52054: }
52055:
52056: /*
52057: ** Given the page number of an overflow page in the database (parameter
52058: ** ovfl), this function finds the page number of the next page in the
52059: ** linked list of overflow pages. If possible, it uses the auto-vacuum
52060: ** pointer-map data instead of reading the content of page ovfl to do so.
52061: **
52062: ** If an error occurs an SQLite error code is returned. Otherwise:
52063: **
52064: ** The page number of the next overflow page in the linked list is
52065: ** written to *pPgnoNext. If page ovfl is the last page in its linked
52066: ** list, *pPgnoNext is set to zero.
52067: **
52068: ** If ppPage is not NULL, and a reference to the MemPage object corresponding
52069: ** to page number pOvfl was obtained, then *ppPage is set to point to that
52070: ** reference. It is the responsibility of the caller to call releasePage()
52071: ** on *ppPage to free the reference. In no reference was obtained (because
52072: ** the pointer-map was used to obtain the value for *pPgnoNext), then
52073: ** *ppPage is set to zero.
52074: */
52075: static int getOverflowPage(
52076: BtShared *pBt, /* The database file */
52077: Pgno ovfl, /* Current overflow page number */
52078: MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */
52079: Pgno *pPgnoNext /* OUT: Next overflow page number */
52080: ){
52081: Pgno next = 0;
52082: MemPage *pPage = 0;
52083: int rc = SQLITE_OK;
52084:
52085: assert( sqlite3_mutex_held(pBt->mutex) );
52086: assert(pPgnoNext);
52087:
52088: #ifndef SQLITE_OMIT_AUTOVACUUM
52089: /* Try to find the next page in the overflow list using the
52090: ** autovacuum pointer-map pages. Guess that the next page in
52091: ** the overflow list is page number (ovfl+1). If that guess turns
52092: ** out to be wrong, fall back to loading the data of page
52093: ** number ovfl to determine the next page number.
52094: */
52095: if( pBt->autoVacuum ){
52096: Pgno pgno;
52097: Pgno iGuess = ovfl+1;
52098: u8 eType;
52099:
52100: while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){
52101: iGuess++;
52102: }
52103:
52104: if( iGuess<=btreePagecount(pBt) ){
52105: rc = ptrmapGet(pBt, iGuess, &eType, &pgno);
52106: if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){
52107: next = iGuess;
52108: rc = SQLITE_DONE;
52109: }
52110: }
52111: }
52112: #endif
52113:
52114: assert( next==0 || rc==SQLITE_DONE );
52115: if( rc==SQLITE_OK ){
52116: rc = btreeGetPage(pBt, ovfl, &pPage, 0);
52117: assert( rc==SQLITE_OK || pPage==0 );
52118: if( rc==SQLITE_OK ){
52119: next = get4byte(pPage->aData);
52120: }
52121: }
52122:
52123: *pPgnoNext = next;
52124: if( ppPage ){
52125: *ppPage = pPage;
52126: }else{
52127: releasePage(pPage);
52128: }
52129: return (rc==SQLITE_DONE ? SQLITE_OK : rc);
52130: }
52131:
52132: /*
52133: ** Copy data from a buffer to a page, or from a page to a buffer.
52134: **
52135: ** pPayload is a pointer to data stored on database page pDbPage.
52136: ** If argument eOp is false, then nByte bytes of data are copied
52137: ** from pPayload to the buffer pointed at by pBuf. If eOp is true,
52138: ** then sqlite3PagerWrite() is called on pDbPage and nByte bytes
52139: ** of data are copied from the buffer pBuf to pPayload.
52140: **
52141: ** SQLITE_OK is returned on success, otherwise an error code.
52142: */
52143: static int copyPayload(
52144: void *pPayload, /* Pointer to page data */
52145: void *pBuf, /* Pointer to buffer */
52146: int nByte, /* Number of bytes to copy */
52147: int eOp, /* 0 -> copy from page, 1 -> copy to page */
52148: DbPage *pDbPage /* Page containing pPayload */
52149: ){
52150: if( eOp ){
52151: /* Copy data from buffer to page (a write operation) */
52152: int rc = sqlite3PagerWrite(pDbPage);
52153: if( rc!=SQLITE_OK ){
52154: return rc;
52155: }
52156: memcpy(pPayload, pBuf, nByte);
52157: }else{
52158: /* Copy data from page to buffer (a read operation) */
52159: memcpy(pBuf, pPayload, nByte);
52160: }
52161: return SQLITE_OK;
52162: }
52163:
52164: /*
52165: ** This function is used to read or overwrite payload information
52166: ** for the entry that the pCur cursor is pointing to. If the eOp
52167: ** parameter is 0, this is a read operation (data copied into
52168: ** buffer pBuf). If it is non-zero, a write (data copied from
52169: ** buffer pBuf).
52170: **
52171: ** A total of "amt" bytes are read or written beginning at "offset".
52172: ** Data is read to or from the buffer pBuf.
52173: **
52174: ** The content being read or written might appear on the main page
52175: ** or be scattered out on multiple overflow pages.
52176: **
52177: ** If the BtCursor.isIncrblobHandle flag is set, and the current
52178: ** cursor entry uses one or more overflow pages, this function
52179: ** allocates space for and lazily popluates the overflow page-list
52180: ** cache array (BtCursor.aOverflow). Subsequent calls use this
52181: ** cache to make seeking to the supplied offset more efficient.
52182: **
52183: ** Once an overflow page-list cache has been allocated, it may be
52184: ** invalidated if some other cursor writes to the same table, or if
52185: ** the cursor is moved to a different row. Additionally, in auto-vacuum
52186: ** mode, the following events may invalidate an overflow page-list cache.
52187: **
52188: ** * An incremental vacuum,
52189: ** * A commit in auto_vacuum="full" mode,
52190: ** * Creating a table (may require moving an overflow page).
52191: */
52192: static int accessPayload(
52193: BtCursor *pCur, /* Cursor pointing to entry to read from */
52194: u32 offset, /* Begin reading this far into payload */
52195: u32 amt, /* Read this many bytes */
52196: unsigned char *pBuf, /* Write the bytes into this buffer */
52197: int eOp /* zero to read. non-zero to write. */
52198: ){
52199: unsigned char *aPayload;
52200: int rc = SQLITE_OK;
52201: u32 nKey;
52202: int iIdx = 0;
52203: MemPage *pPage = pCur->apPage[pCur->iPage]; /* Btree page of current entry */
52204: BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */
52205:
52206: assert( pPage );
52207: assert( pCur->eState==CURSOR_VALID );
52208: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
52209: assert( cursorHoldsMutex(pCur) );
52210:
52211: getCellInfo(pCur);
52212: aPayload = pCur->info.pCell + pCur->info.nHeader;
52213: nKey = (pPage->intKey ? 0 : (int)pCur->info.nKey);
52214:
52215: if( NEVER(offset+amt > nKey+pCur->info.nData)
52216: || &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize]
52217: ){
52218: /* Trying to read or write past the end of the data is an error */
52219: return SQLITE_CORRUPT_BKPT;
52220: }
52221:
52222: /* Check if data must be read/written to/from the btree page itself. */
52223: if( offset<pCur->info.nLocal ){
52224: int a = amt;
52225: if( a+offset>pCur->info.nLocal ){
52226: a = pCur->info.nLocal - offset;
52227: }
52228: rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage);
52229: offset = 0;
52230: pBuf += a;
52231: amt -= a;
52232: }else{
52233: offset -= pCur->info.nLocal;
52234: }
52235:
52236: if( rc==SQLITE_OK && amt>0 ){
52237: const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */
52238: Pgno nextPage;
52239:
52240: nextPage = get4byte(&aPayload[pCur->info.nLocal]);
52241:
52242: #ifndef SQLITE_OMIT_INCRBLOB
52243: /* If the isIncrblobHandle flag is set and the BtCursor.aOverflow[]
52244: ** has not been allocated, allocate it now. The array is sized at
52245: ** one entry for each overflow page in the overflow chain. The
52246: ** page number of the first overflow page is stored in aOverflow[0],
52247: ** etc. A value of 0 in the aOverflow[] array means "not yet known"
52248: ** (the cache is lazily populated).
52249: */
52250: if( pCur->isIncrblobHandle && !pCur->aOverflow ){
52251: int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
52252: pCur->aOverflow = (Pgno *)sqlite3MallocZero(sizeof(Pgno)*nOvfl);
52253: /* nOvfl is always positive. If it were zero, fetchPayload would have
52254: ** been used instead of this routine. */
52255: if( ALWAYS(nOvfl) && !pCur->aOverflow ){
52256: rc = SQLITE_NOMEM;
52257: }
52258: }
52259:
52260: /* If the overflow page-list cache has been allocated and the
52261: ** entry for the first required overflow page is valid, skip
52262: ** directly to it.
52263: */
52264: if( pCur->aOverflow && pCur->aOverflow[offset/ovflSize] ){
52265: iIdx = (offset/ovflSize);
52266: nextPage = pCur->aOverflow[iIdx];
52267: offset = (offset%ovflSize);
52268: }
52269: #endif
52270:
52271: for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){
52272:
52273: #ifndef SQLITE_OMIT_INCRBLOB
52274: /* If required, populate the overflow page-list cache. */
52275: if( pCur->aOverflow ){
52276: assert(!pCur->aOverflow[iIdx] || pCur->aOverflow[iIdx]==nextPage);
52277: pCur->aOverflow[iIdx] = nextPage;
52278: }
52279: #endif
52280:
52281: if( offset>=ovflSize ){
52282: /* The only reason to read this page is to obtain the page
52283: ** number for the next page in the overflow chain. The page
52284: ** data is not required. So first try to lookup the overflow
52285: ** page-list cache, if any, then fall back to the getOverflowPage()
52286: ** function.
52287: */
52288: #ifndef SQLITE_OMIT_INCRBLOB
52289: if( pCur->aOverflow && pCur->aOverflow[iIdx+1] ){
52290: nextPage = pCur->aOverflow[iIdx+1];
52291: } else
52292: #endif
52293: rc = getOverflowPage(pBt, nextPage, 0, &nextPage);
52294: offset -= ovflSize;
52295: }else{
52296: /* Need to read this page properly. It contains some of the
52297: ** range of data that is being read (eOp==0) or written (eOp!=0).
52298: */
52299: #ifdef SQLITE_DIRECT_OVERFLOW_READ
52300: sqlite3_file *fd;
52301: #endif
52302: int a = amt;
52303: if( a + offset > ovflSize ){
52304: a = ovflSize - offset;
52305: }
52306:
52307: #ifdef SQLITE_DIRECT_OVERFLOW_READ
52308: /* If all the following are true:
52309: **
52310: ** 1) this is a read operation, and
52311: ** 2) data is required from the start of this overflow page, and
52312: ** 3) the database is file-backed, and
52313: ** 4) there is no open write-transaction, and
52314: ** 5) the database is not a WAL database,
52315: **
52316: ** then data can be read directly from the database file into the
52317: ** output buffer, bypassing the page-cache altogether. This speeds
52318: ** up loading large records that span many overflow pages.
52319: */
52320: if( eOp==0 /* (1) */
52321: && offset==0 /* (2) */
52322: && pBt->inTransaction==TRANS_READ /* (4) */
52323: && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (3) */
52324: && pBt->pPage1->aData[19]==0x01 /* (5) */
52325: ){
52326: u8 aSave[4];
52327: u8 *aWrite = &pBuf[-4];
52328: memcpy(aSave, aWrite, 4);
52329: rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1));
52330: nextPage = get4byte(aWrite);
52331: memcpy(aWrite, aSave, 4);
52332: }else
52333: #endif
52334:
52335: {
52336: DbPage *pDbPage;
52337: rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage);
52338: if( rc==SQLITE_OK ){
52339: aPayload = sqlite3PagerGetData(pDbPage);
52340: nextPage = get4byte(aPayload);
52341: rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage);
52342: sqlite3PagerUnref(pDbPage);
52343: offset = 0;
52344: }
52345: }
52346: amt -= a;
52347: pBuf += a;
52348: }
52349: }
52350: }
52351:
52352: if( rc==SQLITE_OK && amt>0 ){
52353: return SQLITE_CORRUPT_BKPT;
52354: }
52355: return rc;
52356: }
52357:
52358: /*
52359: ** Read part of the key associated with cursor pCur. Exactly
52360: ** "amt" bytes will be transfered into pBuf[]. The transfer
52361: ** begins at "offset".
52362: **
52363: ** The caller must ensure that pCur is pointing to a valid row
52364: ** in the table.
52365: **
52366: ** Return SQLITE_OK on success or an error code if anything goes
52367: ** wrong. An error is returned if "offset+amt" is larger than
52368: ** the available payload.
52369: */
52370: SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
52371: assert( cursorHoldsMutex(pCur) );
52372: assert( pCur->eState==CURSOR_VALID );
52373: assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
52374: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
52375: return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0);
52376: }
52377:
52378: /*
52379: ** Read part of the data associated with cursor pCur. Exactly
52380: ** "amt" bytes will be transfered into pBuf[]. The transfer
52381: ** begins at "offset".
52382: **
52383: ** Return SQLITE_OK on success or an error code if anything goes
52384: ** wrong. An error is returned if "offset+amt" is larger than
52385: ** the available payload.
52386: */
52387: SQLITE_PRIVATE int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
52388: int rc;
52389:
52390: #ifndef SQLITE_OMIT_INCRBLOB
52391: if ( pCur->eState==CURSOR_INVALID ){
52392: return SQLITE_ABORT;
52393: }
52394: #endif
52395:
52396: assert( cursorHoldsMutex(pCur) );
52397: rc = restoreCursorPosition(pCur);
52398: if( rc==SQLITE_OK ){
52399: assert( pCur->eState==CURSOR_VALID );
52400: assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
52401: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
52402: rc = accessPayload(pCur, offset, amt, pBuf, 0);
52403: }
52404: return rc;
52405: }
52406:
52407: /*
52408: ** Return a pointer to payload information from the entry that the
52409: ** pCur cursor is pointing to. The pointer is to the beginning of
52410: ** the key if skipKey==0 and it points to the beginning of data if
52411: ** skipKey==1. The number of bytes of available key/data is written
52412: ** into *pAmt. If *pAmt==0, then the value returned will not be
52413: ** a valid pointer.
52414: **
52415: ** This routine is an optimization. It is common for the entire key
52416: ** and data to fit on the local page and for there to be no overflow
52417: ** pages. When that is so, this routine can be used to access the
52418: ** key and data without making a copy. If the key and/or data spills
52419: ** onto overflow pages, then accessPayload() must be used to reassemble
52420: ** the key/data and copy it into a preallocated buffer.
52421: **
52422: ** The pointer returned by this routine looks directly into the cached
52423: ** page of the database. The data might change or move the next time
52424: ** any btree routine is called.
52425: */
52426: static const unsigned char *fetchPayload(
52427: BtCursor *pCur, /* Cursor pointing to entry to read from */
52428: int *pAmt, /* Write the number of available bytes here */
52429: int skipKey /* read beginning at data if this is true */
52430: ){
52431: unsigned char *aPayload;
52432: MemPage *pPage;
52433: u32 nKey;
52434: u32 nLocal;
52435:
52436: assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]);
52437: assert( pCur->eState==CURSOR_VALID );
52438: assert( cursorHoldsMutex(pCur) );
52439: pPage = pCur->apPage[pCur->iPage];
52440: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
52441: if( NEVER(pCur->info.nSize==0) ){
52442: btreeParseCell(pCur->apPage[pCur->iPage], pCur->aiIdx[pCur->iPage],
52443: &pCur->info);
52444: }
52445: aPayload = pCur->info.pCell;
52446: aPayload += pCur->info.nHeader;
52447: if( pPage->intKey ){
52448: nKey = 0;
52449: }else{
52450: nKey = (int)pCur->info.nKey;
52451: }
52452: if( skipKey ){
52453: aPayload += nKey;
52454: nLocal = pCur->info.nLocal - nKey;
52455: }else{
52456: nLocal = pCur->info.nLocal;
52457: assert( nLocal<=nKey );
52458: }
52459: *pAmt = nLocal;
52460: return aPayload;
52461: }
52462:
52463:
52464: /*
52465: ** For the entry that cursor pCur is point to, return as
52466: ** many bytes of the key or data as are available on the local
52467: ** b-tree page. Write the number of available bytes into *pAmt.
52468: **
52469: ** The pointer returned is ephemeral. The key/data may move
52470: ** or be destroyed on the next call to any Btree routine,
52471: ** including calls from other threads against the same cache.
52472: ** Hence, a mutex on the BtShared should be held prior to calling
52473: ** this routine.
52474: **
52475: ** These routines is used to get quick access to key and data
52476: ** in the common case where no overflow pages are used.
52477: */
52478: SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor *pCur, int *pAmt){
52479: const void *p = 0;
52480: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
52481: assert( cursorHoldsMutex(pCur) );
52482: if( ALWAYS(pCur->eState==CURSOR_VALID) ){
52483: p = (const void*)fetchPayload(pCur, pAmt, 0);
52484: }
52485: return p;
52486: }
52487: SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor *pCur, int *pAmt){
52488: const void *p = 0;
52489: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
52490: assert( cursorHoldsMutex(pCur) );
52491: if( ALWAYS(pCur->eState==CURSOR_VALID) ){
52492: p = (const void*)fetchPayload(pCur, pAmt, 1);
52493: }
52494: return p;
52495: }
52496:
52497:
52498: /*
52499: ** Move the cursor down to a new child page. The newPgno argument is the
52500: ** page number of the child page to move to.
52501: **
52502: ** This function returns SQLITE_CORRUPT if the page-header flags field of
52503: ** the new child page does not match the flags field of the parent (i.e.
52504: ** if an intkey page appears to be the parent of a non-intkey page, or
52505: ** vice-versa).
52506: */
52507: static int moveToChild(BtCursor *pCur, u32 newPgno){
52508: int rc;
52509: int i = pCur->iPage;
52510: MemPage *pNewPage;
52511: BtShared *pBt = pCur->pBt;
52512:
52513: assert( cursorHoldsMutex(pCur) );
52514: assert( pCur->eState==CURSOR_VALID );
52515: assert( pCur->iPage<BTCURSOR_MAX_DEPTH );
52516: if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){
52517: return SQLITE_CORRUPT_BKPT;
52518: }
52519: rc = getAndInitPage(pBt, newPgno, &pNewPage);
52520: if( rc ) return rc;
52521: pCur->apPage[i+1] = pNewPage;
52522: pCur->aiIdx[i+1] = 0;
52523: pCur->iPage++;
52524:
52525: pCur->info.nSize = 0;
52526: pCur->validNKey = 0;
52527: if( pNewPage->nCell<1 || pNewPage->intKey!=pCur->apPage[i]->intKey ){
52528: return SQLITE_CORRUPT_BKPT;
52529: }
52530: return SQLITE_OK;
52531: }
52532:
52533: #if 0
52534: /*
52535: ** Page pParent is an internal (non-leaf) tree page. This function
52536: ** asserts that page number iChild is the left-child if the iIdx'th
52537: ** cell in page pParent. Or, if iIdx is equal to the total number of
52538: ** cells in pParent, that page number iChild is the right-child of
52539: ** the page.
52540: */
52541: static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){
52542: assert( iIdx<=pParent->nCell );
52543: if( iIdx==pParent->nCell ){
52544: assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild );
52545: }else{
52546: assert( get4byte(findCell(pParent, iIdx))==iChild );
52547: }
52548: }
52549: #else
52550: # define assertParentIndex(x,y,z)
52551: #endif
52552:
52553: /*
52554: ** Move the cursor up to the parent page.
52555: **
52556: ** pCur->idx is set to the cell index that contains the pointer
52557: ** to the page we are coming from. If we are coming from the
52558: ** right-most child page then pCur->idx is set to one more than
52559: ** the largest cell index.
52560: */
52561: static void moveToParent(BtCursor *pCur){
52562: assert( cursorHoldsMutex(pCur) );
52563: assert( pCur->eState==CURSOR_VALID );
52564: assert( pCur->iPage>0 );
52565: assert( pCur->apPage[pCur->iPage] );
52566:
52567: /* UPDATE: It is actually possible for the condition tested by the assert
52568: ** below to be untrue if the database file is corrupt. This can occur if
52569: ** one cursor has modified page pParent while a reference to it is held
52570: ** by a second cursor. Which can only happen if a single page is linked
52571: ** into more than one b-tree structure in a corrupt database. */
52572: #if 0
52573: assertParentIndex(
52574: pCur->apPage[pCur->iPage-1],
52575: pCur->aiIdx[pCur->iPage-1],
52576: pCur->apPage[pCur->iPage]->pgno
52577: );
52578: #endif
52579: testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell );
52580:
52581: releasePage(pCur->apPage[pCur->iPage]);
52582: pCur->iPage--;
52583: pCur->info.nSize = 0;
52584: pCur->validNKey = 0;
52585: }
52586:
52587: /*
52588: ** Move the cursor to point to the root page of its b-tree structure.
52589: **
52590: ** If the table has a virtual root page, then the cursor is moved to point
52591: ** to the virtual root page instead of the actual root page. A table has a
52592: ** virtual root page when the actual root page contains no cells and a
52593: ** single child page. This can only happen with the table rooted at page 1.
52594: **
52595: ** If the b-tree structure is empty, the cursor state is set to
52596: ** CURSOR_INVALID. Otherwise, the cursor is set to point to the first
52597: ** cell located on the root (or virtual root) page and the cursor state
52598: ** is set to CURSOR_VALID.
52599: **
52600: ** If this function returns successfully, it may be assumed that the
52601: ** page-header flags indicate that the [virtual] root-page is the expected
52602: ** kind of b-tree page (i.e. if when opening the cursor the caller did not
52603: ** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D,
52604: ** indicating a table b-tree, or if the caller did specify a KeyInfo
52605: ** structure the flags byte is set to 0x02 or 0x0A, indicating an index
52606: ** b-tree).
52607: */
52608: static int moveToRoot(BtCursor *pCur){
52609: MemPage *pRoot;
52610: int rc = SQLITE_OK;
52611: Btree *p = pCur->pBtree;
52612: BtShared *pBt = p->pBt;
52613:
52614: assert( cursorHoldsMutex(pCur) );
52615: assert( CURSOR_INVALID < CURSOR_REQUIRESEEK );
52616: assert( CURSOR_VALID < CURSOR_REQUIRESEEK );
52617: assert( CURSOR_FAULT > CURSOR_REQUIRESEEK );
52618: if( pCur->eState>=CURSOR_REQUIRESEEK ){
52619: if( pCur->eState==CURSOR_FAULT ){
52620: assert( pCur->skipNext!=SQLITE_OK );
52621: return pCur->skipNext;
52622: }
52623: sqlite3BtreeClearCursor(pCur);
52624: }
52625:
52626: if( pCur->iPage>=0 ){
52627: int i;
52628: for(i=1; i<=pCur->iPage; i++){
52629: releasePage(pCur->apPage[i]);
52630: }
52631: pCur->iPage = 0;
52632: }else if( pCur->pgnoRoot==0 ){
52633: pCur->eState = CURSOR_INVALID;
52634: return SQLITE_OK;
52635: }else{
52636: rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0]);
52637: if( rc!=SQLITE_OK ){
52638: pCur->eState = CURSOR_INVALID;
52639: return rc;
52640: }
52641: pCur->iPage = 0;
52642:
52643: /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
52644: ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
52645: ** NULL, the caller expects a table b-tree. If this is not the case,
52646: ** return an SQLITE_CORRUPT error. */
52647: assert( pCur->apPage[0]->intKey==1 || pCur->apPage[0]->intKey==0 );
52648: if( (pCur->pKeyInfo==0)!=pCur->apPage[0]->intKey ){
52649: return SQLITE_CORRUPT_BKPT;
52650: }
52651: }
52652:
52653: /* Assert that the root page is of the correct type. This must be the
52654: ** case as the call to this function that loaded the root-page (either
52655: ** this call or a previous invocation) would have detected corruption
52656: ** if the assumption were not true, and it is not possible for the flags
52657: ** byte to have been modified while this cursor is holding a reference
52658: ** to the page. */
52659: pRoot = pCur->apPage[0];
52660: assert( pRoot->pgno==pCur->pgnoRoot );
52661: assert( pRoot->isInit && (pCur->pKeyInfo==0)==pRoot->intKey );
52662:
52663: pCur->aiIdx[0] = 0;
52664: pCur->info.nSize = 0;
52665: pCur->atLast = 0;
52666: pCur->validNKey = 0;
52667:
52668: if( pRoot->nCell==0 && !pRoot->leaf ){
52669: Pgno subpage;
52670: if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT;
52671: subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]);
52672: pCur->eState = CURSOR_VALID;
52673: rc = moveToChild(pCur, subpage);
52674: }else{
52675: pCur->eState = ((pRoot->nCell>0)?CURSOR_VALID:CURSOR_INVALID);
52676: }
52677: return rc;
52678: }
52679:
52680: /*
52681: ** Move the cursor down to the left-most leaf entry beneath the
52682: ** entry to which it is currently pointing.
52683: **
52684: ** The left-most leaf is the one with the smallest key - the first
52685: ** in ascending order.
52686: */
52687: static int moveToLeftmost(BtCursor *pCur){
52688: Pgno pgno;
52689: int rc = SQLITE_OK;
52690: MemPage *pPage;
52691:
52692: assert( cursorHoldsMutex(pCur) );
52693: assert( pCur->eState==CURSOR_VALID );
52694: while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
52695: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
52696: pgno = get4byte(findCell(pPage, pCur->aiIdx[pCur->iPage]));
52697: rc = moveToChild(pCur, pgno);
52698: }
52699: return rc;
52700: }
52701:
52702: /*
52703: ** Move the cursor down to the right-most leaf entry beneath the
52704: ** page to which it is currently pointing. Notice the difference
52705: ** between moveToLeftmost() and moveToRightmost(). moveToLeftmost()
52706: ** finds the left-most entry beneath the *entry* whereas moveToRightmost()
52707: ** finds the right-most entry beneath the *page*.
52708: **
52709: ** The right-most entry is the one with the largest key - the last
52710: ** key in ascending order.
52711: */
52712: static int moveToRightmost(BtCursor *pCur){
52713: Pgno pgno;
52714: int rc = SQLITE_OK;
52715: MemPage *pPage = 0;
52716:
52717: assert( cursorHoldsMutex(pCur) );
52718: assert( pCur->eState==CURSOR_VALID );
52719: while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
52720: pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
52721: pCur->aiIdx[pCur->iPage] = pPage->nCell;
52722: rc = moveToChild(pCur, pgno);
52723: }
52724: if( rc==SQLITE_OK ){
52725: pCur->aiIdx[pCur->iPage] = pPage->nCell-1;
52726: pCur->info.nSize = 0;
52727: pCur->validNKey = 0;
52728: }
52729: return rc;
52730: }
52731:
52732: /* Move the cursor to the first entry in the table. Return SQLITE_OK
52733: ** on success. Set *pRes to 0 if the cursor actually points to something
52734: ** or set *pRes to 1 if the table is empty.
52735: */
52736: SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){
52737: int rc;
52738:
52739: assert( cursorHoldsMutex(pCur) );
52740: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
52741: rc = moveToRoot(pCur);
52742: if( rc==SQLITE_OK ){
52743: if( pCur->eState==CURSOR_INVALID ){
52744: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
52745: *pRes = 1;
52746: }else{
52747: assert( pCur->apPage[pCur->iPage]->nCell>0 );
52748: *pRes = 0;
52749: rc = moveToLeftmost(pCur);
52750: }
52751: }
52752: return rc;
52753: }
52754:
52755: /* Move the cursor to the last entry in the table. Return SQLITE_OK
52756: ** on success. Set *pRes to 0 if the cursor actually points to something
52757: ** or set *pRes to 1 if the table is empty.
52758: */
52759: SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
52760: int rc;
52761:
52762: assert( cursorHoldsMutex(pCur) );
52763: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
52764:
52765: /* If the cursor already points to the last entry, this is a no-op. */
52766: if( CURSOR_VALID==pCur->eState && pCur->atLast ){
52767: #ifdef SQLITE_DEBUG
52768: /* This block serves to assert() that the cursor really does point
52769: ** to the last entry in the b-tree. */
52770: int ii;
52771: for(ii=0; ii<pCur->iPage; ii++){
52772: assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell );
52773: }
52774: assert( pCur->aiIdx[pCur->iPage]==pCur->apPage[pCur->iPage]->nCell-1 );
52775: assert( pCur->apPage[pCur->iPage]->leaf );
52776: #endif
52777: return SQLITE_OK;
52778: }
52779:
52780: rc = moveToRoot(pCur);
52781: if( rc==SQLITE_OK ){
52782: if( CURSOR_INVALID==pCur->eState ){
52783: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
52784: *pRes = 1;
52785: }else{
52786: assert( pCur->eState==CURSOR_VALID );
52787: *pRes = 0;
52788: rc = moveToRightmost(pCur);
52789: pCur->atLast = rc==SQLITE_OK ?1:0;
52790: }
52791: }
52792: return rc;
52793: }
52794:
52795: /* Move the cursor so that it points to an entry near the key
52796: ** specified by pIdxKey or intKey. Return a success code.
52797: **
52798: ** For INTKEY tables, the intKey parameter is used. pIdxKey
52799: ** must be NULL. For index tables, pIdxKey is used and intKey
52800: ** is ignored.
52801: **
52802: ** If an exact match is not found, then the cursor is always
52803: ** left pointing at a leaf page which would hold the entry if it
52804: ** were present. The cursor might point to an entry that comes
52805: ** before or after the key.
52806: **
52807: ** An integer is written into *pRes which is the result of
52808: ** comparing the key with the entry to which the cursor is
52809: ** pointing. The meaning of the integer written into
52810: ** *pRes is as follows:
52811: **
52812: ** *pRes<0 The cursor is left pointing at an entry that
52813: ** is smaller than intKey/pIdxKey or if the table is empty
52814: ** and the cursor is therefore left point to nothing.
52815: **
52816: ** *pRes==0 The cursor is left pointing at an entry that
52817: ** exactly matches intKey/pIdxKey.
52818: **
52819: ** *pRes>0 The cursor is left pointing at an entry that
52820: ** is larger than intKey/pIdxKey.
52821: **
52822: */
52823: SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked(
52824: BtCursor *pCur, /* The cursor to be moved */
52825: UnpackedRecord *pIdxKey, /* Unpacked index key */
52826: i64 intKey, /* The table key */
52827: int biasRight, /* If true, bias the search to the high end */
52828: int *pRes /* Write search results here */
52829: ){
52830: int rc;
52831:
52832: assert( cursorHoldsMutex(pCur) );
52833: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
52834: assert( pRes );
52835: assert( (pIdxKey==0)==(pCur->pKeyInfo==0) );
52836:
52837: /* If the cursor is already positioned at the point we are trying
52838: ** to move to, then just return without doing any work */
52839: if( pCur->eState==CURSOR_VALID && pCur->validNKey
52840: && pCur->apPage[0]->intKey
52841: ){
52842: if( pCur->info.nKey==intKey ){
52843: *pRes = 0;
52844: return SQLITE_OK;
52845: }
52846: if( pCur->atLast && pCur->info.nKey<intKey ){
52847: *pRes = -1;
52848: return SQLITE_OK;
52849: }
52850: }
52851:
52852: rc = moveToRoot(pCur);
52853: if( rc ){
52854: return rc;
52855: }
52856: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage] );
52857: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->isInit );
52858: assert( pCur->eState==CURSOR_INVALID || pCur->apPage[pCur->iPage]->nCell>0 );
52859: if( pCur->eState==CURSOR_INVALID ){
52860: *pRes = -1;
52861: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
52862: return SQLITE_OK;
52863: }
52864: assert( pCur->apPage[0]->intKey || pIdxKey );
52865: for(;;){
52866: int lwr, upr, idx;
52867: Pgno chldPg;
52868: MemPage *pPage = pCur->apPage[pCur->iPage];
52869: int c;
52870:
52871: /* pPage->nCell must be greater than zero. If this is the root-page
52872: ** the cursor would have been INVALID above and this for(;;) loop
52873: ** not run. If this is not the root-page, then the moveToChild() routine
52874: ** would have already detected db corruption. Similarly, pPage must
52875: ** be the right kind (index or table) of b-tree page. Otherwise
52876: ** a moveToChild() or moveToRoot() call would have detected corruption. */
52877: assert( pPage->nCell>0 );
52878: assert( pPage->intKey==(pIdxKey==0) );
52879: lwr = 0;
52880: upr = pPage->nCell-1;
52881: if( biasRight ){
52882: pCur->aiIdx[pCur->iPage] = (u16)(idx = upr);
52883: }else{
52884: pCur->aiIdx[pCur->iPage] = (u16)(idx = (upr+lwr)/2);
52885: }
52886: for(;;){
52887: u8 *pCell; /* Pointer to current cell in pPage */
52888:
52889: assert( idx==pCur->aiIdx[pCur->iPage] );
52890: pCur->info.nSize = 0;
52891: pCell = findCell(pPage, idx) + pPage->childPtrSize;
52892: if( pPage->intKey ){
52893: i64 nCellKey;
52894: if( pPage->hasData ){
52895: u32 dummy;
52896: pCell += getVarint32(pCell, dummy);
52897: }
52898: getVarint(pCell, (u64*)&nCellKey);
52899: if( nCellKey==intKey ){
52900: c = 0;
52901: }else if( nCellKey<intKey ){
52902: c = -1;
52903: }else{
52904: assert( nCellKey>intKey );
52905: c = +1;
52906: }
52907: pCur->validNKey = 1;
52908: pCur->info.nKey = nCellKey;
52909: }else{
52910: /* The maximum supported page-size is 65536 bytes. This means that
52911: ** the maximum number of record bytes stored on an index B-Tree
52912: ** page is less than 16384 bytes and may be stored as a 2-byte
52913: ** varint. This information is used to attempt to avoid parsing
52914: ** the entire cell by checking for the cases where the record is
52915: ** stored entirely within the b-tree page by inspecting the first
52916: ** 2 bytes of the cell.
52917: */
52918: int nCell = pCell[0];
52919: if( nCell<=pPage->max1bytePayload
52920: /* && (pCell+nCell)<pPage->aDataEnd */
52921: ){
52922: /* This branch runs if the record-size field of the cell is a
52923: ** single byte varint and the record fits entirely on the main
52924: ** b-tree page. */
52925: testcase( pCell+nCell+1==pPage->aDataEnd );
52926: c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
52927: }else if( !(pCell[1] & 0x80)
52928: && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
52929: /* && (pCell+nCell+2)<=pPage->aDataEnd */
52930: ){
52931: /* The record-size field is a 2 byte varint and the record
52932: ** fits entirely on the main b-tree page. */
52933: testcase( pCell+nCell+2==pPage->aDataEnd );
52934: c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
52935: }else{
52936: /* The record flows over onto one or more overflow pages. In
52937: ** this case the whole cell needs to be parsed, a buffer allocated
52938: ** and accessPayload() used to retrieve the record into the
52939: ** buffer before VdbeRecordCompare() can be called. */
52940: void *pCellKey;
52941: u8 * const pCellBody = pCell - pPage->childPtrSize;
52942: btreeParseCellPtr(pPage, pCellBody, &pCur->info);
52943: nCell = (int)pCur->info.nKey;
52944: pCellKey = sqlite3Malloc( nCell );
52945: if( pCellKey==0 ){
52946: rc = SQLITE_NOMEM;
52947: goto moveto_finish;
52948: }
52949: rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
52950: if( rc ){
52951: sqlite3_free(pCellKey);
52952: goto moveto_finish;
52953: }
52954: c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey);
52955: sqlite3_free(pCellKey);
52956: }
52957: }
52958: if( c==0 ){
52959: if( pPage->intKey && !pPage->leaf ){
52960: lwr = idx;
52961: break;
52962: }else{
52963: *pRes = 0;
52964: rc = SQLITE_OK;
52965: goto moveto_finish;
52966: }
52967: }
52968: if( c<0 ){
52969: lwr = idx+1;
52970: }else{
52971: upr = idx-1;
52972: }
52973: if( lwr>upr ){
52974: break;
52975: }
52976: pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
52977: }
52978: assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
52979: assert( pPage->isInit );
52980: if( pPage->leaf ){
52981: chldPg = 0;
52982: }else if( lwr>=pPage->nCell ){
52983: chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
52984: }else{
52985: chldPg = get4byte(findCell(pPage, lwr));
52986: }
52987: if( chldPg==0 ){
52988: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
52989: *pRes = c;
52990: rc = SQLITE_OK;
52991: goto moveto_finish;
52992: }
52993: pCur->aiIdx[pCur->iPage] = (u16)lwr;
52994: pCur->info.nSize = 0;
52995: pCur->validNKey = 0;
52996: rc = moveToChild(pCur, chldPg);
52997: if( rc ) goto moveto_finish;
52998: }
52999: moveto_finish:
53000: return rc;
53001: }
53002:
53003:
53004: /*
53005: ** Return TRUE if the cursor is not pointing at an entry of the table.
53006: **
53007: ** TRUE will be returned after a call to sqlite3BtreeNext() moves
53008: ** past the last entry in the table or sqlite3BtreePrev() moves past
53009: ** the first entry. TRUE is also returned if the table is empty.
53010: */
53011: SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){
53012: /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries
53013: ** have been deleted? This API will need to change to return an error code
53014: ** as well as the boolean result value.
53015: */
53016: return (CURSOR_VALID!=pCur->eState);
53017: }
53018:
53019: /*
53020: ** Advance the cursor to the next entry in the database. If
53021: ** successful then set *pRes=0. If the cursor
53022: ** was already pointing to the last entry in the database before
53023: ** this routine was called, then set *pRes=1.
53024: */
53025: SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
53026: int rc;
53027: int idx;
53028: MemPage *pPage;
53029:
53030: assert( cursorHoldsMutex(pCur) );
53031: rc = restoreCursorPosition(pCur);
53032: if( rc!=SQLITE_OK ){
53033: return rc;
53034: }
53035: assert( pRes!=0 );
53036: if( CURSOR_INVALID==pCur->eState ){
53037: *pRes = 1;
53038: return SQLITE_OK;
53039: }
53040: if( pCur->skipNext>0 ){
53041: pCur->skipNext = 0;
53042: *pRes = 0;
53043: return SQLITE_OK;
53044: }
53045: pCur->skipNext = 0;
53046:
53047: pPage = pCur->apPage[pCur->iPage];
53048: idx = ++pCur->aiIdx[pCur->iPage];
53049: assert( pPage->isInit );
53050:
53051: /* If the database file is corrupt, it is possible for the value of idx
53052: ** to be invalid here. This can only occur if a second cursor modifies
53053: ** the page while cursor pCur is holding a reference to it. Which can
53054: ** only happen if the database is corrupt in such a way as to link the
53055: ** page into more than one b-tree structure. */
53056: testcase( idx>pPage->nCell );
53057:
53058: pCur->info.nSize = 0;
53059: pCur->validNKey = 0;
53060: if( idx>=pPage->nCell ){
53061: if( !pPage->leaf ){
53062: rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
53063: if( rc ) return rc;
53064: rc = moveToLeftmost(pCur);
53065: *pRes = 0;
53066: return rc;
53067: }
53068: do{
53069: if( pCur->iPage==0 ){
53070: *pRes = 1;
53071: pCur->eState = CURSOR_INVALID;
53072: return SQLITE_OK;
53073: }
53074: moveToParent(pCur);
53075: pPage = pCur->apPage[pCur->iPage];
53076: }while( pCur->aiIdx[pCur->iPage]>=pPage->nCell );
53077: *pRes = 0;
53078: if( pPage->intKey ){
53079: rc = sqlite3BtreeNext(pCur, pRes);
53080: }else{
53081: rc = SQLITE_OK;
53082: }
53083: return rc;
53084: }
53085: *pRes = 0;
53086: if( pPage->leaf ){
53087: return SQLITE_OK;
53088: }
53089: rc = moveToLeftmost(pCur);
53090: return rc;
53091: }
53092:
53093:
53094: /*
53095: ** Step the cursor to the back to the previous entry in the database. If
53096: ** successful then set *pRes=0. If the cursor
53097: ** was already pointing to the first entry in the database before
53098: ** this routine was called, then set *pRes=1.
53099: */
53100: SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){
53101: int rc;
53102: MemPage *pPage;
53103:
53104: assert( cursorHoldsMutex(pCur) );
53105: rc = restoreCursorPosition(pCur);
53106: if( rc!=SQLITE_OK ){
53107: return rc;
53108: }
53109: pCur->atLast = 0;
53110: if( CURSOR_INVALID==pCur->eState ){
53111: *pRes = 1;
53112: return SQLITE_OK;
53113: }
53114: if( pCur->skipNext<0 ){
53115: pCur->skipNext = 0;
53116: *pRes = 0;
53117: return SQLITE_OK;
53118: }
53119: pCur->skipNext = 0;
53120:
53121: pPage = pCur->apPage[pCur->iPage];
53122: assert( pPage->isInit );
53123: if( !pPage->leaf ){
53124: int idx = pCur->aiIdx[pCur->iPage];
53125: rc = moveToChild(pCur, get4byte(findCell(pPage, idx)));
53126: if( rc ){
53127: return rc;
53128: }
53129: rc = moveToRightmost(pCur);
53130: }else{
53131: while( pCur->aiIdx[pCur->iPage]==0 ){
53132: if( pCur->iPage==0 ){
53133: pCur->eState = CURSOR_INVALID;
53134: *pRes = 1;
53135: return SQLITE_OK;
53136: }
53137: moveToParent(pCur);
53138: }
53139: pCur->info.nSize = 0;
53140: pCur->validNKey = 0;
53141:
53142: pCur->aiIdx[pCur->iPage]--;
53143: pPage = pCur->apPage[pCur->iPage];
53144: if( pPage->intKey && !pPage->leaf ){
53145: rc = sqlite3BtreePrevious(pCur, pRes);
53146: }else{
53147: rc = SQLITE_OK;
53148: }
53149: }
53150: *pRes = 0;
53151: return rc;
53152: }
53153:
53154: /*
53155: ** Allocate a new page from the database file.
53156: **
53157: ** The new page is marked as dirty. (In other words, sqlite3PagerWrite()
53158: ** has already been called on the new page.) The new page has also
53159: ** been referenced and the calling routine is responsible for calling
53160: ** sqlite3PagerUnref() on the new page when it is done.
53161: **
53162: ** SQLITE_OK is returned on success. Any other return value indicates
53163: ** an error. *ppPage and *pPgno are undefined in the event of an error.
53164: ** Do not invoke sqlite3PagerUnref() on *ppPage if an error is returned.
53165: **
53166: ** If the "nearby" parameter is not 0, then a (feeble) effort is made to
53167: ** locate a page close to the page number "nearby". This can be used in an
53168: ** attempt to keep related pages close to each other in the database file,
53169: ** which in turn can make database access faster.
53170: **
53171: ** If the "exact" parameter is not 0, and the page-number nearby exists
53172: ** anywhere on the free-list, then it is guarenteed to be returned. This
53173: ** is only used by auto-vacuum databases when allocating a new table.
53174: */
53175: static int allocateBtreePage(
53176: BtShared *pBt,
53177: MemPage **ppPage,
53178: Pgno *pPgno,
53179: Pgno nearby,
53180: u8 exact
53181: ){
53182: MemPage *pPage1;
53183: int rc;
53184: u32 n; /* Number of pages on the freelist */
53185: u32 k; /* Number of leaves on the trunk of the freelist */
53186: MemPage *pTrunk = 0;
53187: MemPage *pPrevTrunk = 0;
53188: Pgno mxPage; /* Total size of the database file */
53189:
53190: assert( sqlite3_mutex_held(pBt->mutex) );
53191: pPage1 = pBt->pPage1;
53192: mxPage = btreePagecount(pBt);
53193: n = get4byte(&pPage1->aData[36]);
53194: testcase( n==mxPage-1 );
53195: if( n>=mxPage ){
53196: return SQLITE_CORRUPT_BKPT;
53197: }
53198: if( n>0 ){
53199: /* There are pages on the freelist. Reuse one of those pages. */
53200: Pgno iTrunk;
53201: u8 searchList = 0; /* If the free-list must be searched for 'nearby' */
53202:
53203: /* If the 'exact' parameter was true and a query of the pointer-map
53204: ** shows that the page 'nearby' is somewhere on the free-list, then
53205: ** the entire-list will be searched for that page.
53206: */
53207: #ifndef SQLITE_OMIT_AUTOVACUUM
53208: if( exact && nearby<=mxPage ){
53209: u8 eType;
53210: assert( nearby>0 );
53211: assert( pBt->autoVacuum );
53212: rc = ptrmapGet(pBt, nearby, &eType, 0);
53213: if( rc ) return rc;
53214: if( eType==PTRMAP_FREEPAGE ){
53215: searchList = 1;
53216: }
53217: *pPgno = nearby;
53218: }
53219: #endif
53220:
53221: /* Decrement the free-list count by 1. Set iTrunk to the index of the
53222: ** first free-list trunk page. iPrevTrunk is initially 1.
53223: */
53224: rc = sqlite3PagerWrite(pPage1->pDbPage);
53225: if( rc ) return rc;
53226: put4byte(&pPage1->aData[36], n-1);
53227:
53228: /* The code within this loop is run only once if the 'searchList' variable
53229: ** is not true. Otherwise, it runs once for each trunk-page on the
53230: ** free-list until the page 'nearby' is located.
53231: */
53232: do {
53233: pPrevTrunk = pTrunk;
53234: if( pPrevTrunk ){
53235: iTrunk = get4byte(&pPrevTrunk->aData[0]);
53236: }else{
53237: iTrunk = get4byte(&pPage1->aData[32]);
53238: }
53239: testcase( iTrunk==mxPage );
53240: if( iTrunk>mxPage ){
53241: rc = SQLITE_CORRUPT_BKPT;
53242: }else{
53243: rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
53244: }
53245: if( rc ){
53246: pTrunk = 0;
53247: goto end_allocate_page;
53248: }
53249: assert( pTrunk!=0 );
53250: assert( pTrunk->aData!=0 );
53251:
53252: k = get4byte(&pTrunk->aData[4]); /* # of leaves on this trunk page */
53253: if( k==0 && !searchList ){
53254: /* The trunk has no leaves and the list is not being searched.
53255: ** So extract the trunk page itself and use it as the newly
53256: ** allocated page */
53257: assert( pPrevTrunk==0 );
53258: rc = sqlite3PagerWrite(pTrunk->pDbPage);
53259: if( rc ){
53260: goto end_allocate_page;
53261: }
53262: *pPgno = iTrunk;
53263: memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
53264: *ppPage = pTrunk;
53265: pTrunk = 0;
53266: TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
53267: }else if( k>(u32)(pBt->usableSize/4 - 2) ){
53268: /* Value of k is out of range. Database corruption */
53269: rc = SQLITE_CORRUPT_BKPT;
53270: goto end_allocate_page;
53271: #ifndef SQLITE_OMIT_AUTOVACUUM
53272: }else if( searchList && nearby==iTrunk ){
53273: /* The list is being searched and this trunk page is the page
53274: ** to allocate, regardless of whether it has leaves.
53275: */
53276: assert( *pPgno==iTrunk );
53277: *ppPage = pTrunk;
53278: searchList = 0;
53279: rc = sqlite3PagerWrite(pTrunk->pDbPage);
53280: if( rc ){
53281: goto end_allocate_page;
53282: }
53283: if( k==0 ){
53284: if( !pPrevTrunk ){
53285: memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
53286: }else{
53287: rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
53288: if( rc!=SQLITE_OK ){
53289: goto end_allocate_page;
53290: }
53291: memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4);
53292: }
53293: }else{
53294: /* The trunk page is required by the caller but it contains
53295: ** pointers to free-list leaves. The first leaf becomes a trunk
53296: ** page in this case.
53297: */
53298: MemPage *pNewTrunk;
53299: Pgno iNewTrunk = get4byte(&pTrunk->aData[8]);
53300: if( iNewTrunk>mxPage ){
53301: rc = SQLITE_CORRUPT_BKPT;
53302: goto end_allocate_page;
53303: }
53304: testcase( iNewTrunk==mxPage );
53305: rc = btreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0);
53306: if( rc!=SQLITE_OK ){
53307: goto end_allocate_page;
53308: }
53309: rc = sqlite3PagerWrite(pNewTrunk->pDbPage);
53310: if( rc!=SQLITE_OK ){
53311: releasePage(pNewTrunk);
53312: goto end_allocate_page;
53313: }
53314: memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4);
53315: put4byte(&pNewTrunk->aData[4], k-1);
53316: memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4);
53317: releasePage(pNewTrunk);
53318: if( !pPrevTrunk ){
53319: assert( sqlite3PagerIswriteable(pPage1->pDbPage) );
53320: put4byte(&pPage1->aData[32], iNewTrunk);
53321: }else{
53322: rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
53323: if( rc ){
53324: goto end_allocate_page;
53325: }
53326: put4byte(&pPrevTrunk->aData[0], iNewTrunk);
53327: }
53328: }
53329: pTrunk = 0;
53330: TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
53331: #endif
53332: }else if( k>0 ){
53333: /* Extract a leaf from the trunk */
53334: u32 closest;
53335: Pgno iPage;
53336: unsigned char *aData = pTrunk->aData;
53337: if( nearby>0 ){
53338: u32 i;
53339: int dist;
53340: closest = 0;
53341: dist = sqlite3AbsInt32(get4byte(&aData[8]) - nearby);
53342: for(i=1; i<k; i++){
53343: int d2 = sqlite3AbsInt32(get4byte(&aData[8+i*4]) - nearby);
53344: if( d2<dist ){
53345: closest = i;
53346: dist = d2;
53347: }
53348: }
53349: }else{
53350: closest = 0;
53351: }
53352:
53353: iPage = get4byte(&aData[8+closest*4]);
53354: testcase( iPage==mxPage );
53355: if( iPage>mxPage ){
53356: rc = SQLITE_CORRUPT_BKPT;
53357: goto end_allocate_page;
53358: }
53359: testcase( iPage==mxPage );
53360: if( !searchList || iPage==nearby ){
53361: int noContent;
53362: *pPgno = iPage;
53363: TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d"
53364: ": %d more free pages\n",
53365: *pPgno, closest+1, k, pTrunk->pgno, n-1));
53366: rc = sqlite3PagerWrite(pTrunk->pDbPage);
53367: if( rc ) goto end_allocate_page;
53368: if( closest<k-1 ){
53369: memcpy(&aData[8+closest*4], &aData[4+k*4], 4);
53370: }
53371: put4byte(&aData[4], k-1);
53372: noContent = !btreeGetHasContent(pBt, *pPgno);
53373: rc = btreeGetPage(pBt, *pPgno, ppPage, noContent);
53374: if( rc==SQLITE_OK ){
53375: rc = sqlite3PagerWrite((*ppPage)->pDbPage);
53376: if( rc!=SQLITE_OK ){
53377: releasePage(*ppPage);
53378: }
53379: }
53380: searchList = 0;
53381: }
53382: }
53383: releasePage(pPrevTrunk);
53384: pPrevTrunk = 0;
53385: }while( searchList );
53386: }else{
53387: /* There are no pages on the freelist, so create a new page at the
53388: ** end of the file */
53389: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
53390: if( rc ) return rc;
53391: pBt->nPage++;
53392: if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++;
53393:
53394: #ifndef SQLITE_OMIT_AUTOVACUUM
53395: if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){
53396: /* If *pPgno refers to a pointer-map page, allocate two new pages
53397: ** at the end of the file instead of one. The first allocated page
53398: ** becomes a new pointer-map page, the second is used by the caller.
53399: */
53400: MemPage *pPg = 0;
53401: TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage));
53402: assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) );
53403: rc = btreeGetPage(pBt, pBt->nPage, &pPg, 1);
53404: if( rc==SQLITE_OK ){
53405: rc = sqlite3PagerWrite(pPg->pDbPage);
53406: releasePage(pPg);
53407: }
53408: if( rc ) return rc;
53409: pBt->nPage++;
53410: if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ pBt->nPage++; }
53411: }
53412: #endif
53413: put4byte(28 + (u8*)pBt->pPage1->aData, pBt->nPage);
53414: *pPgno = pBt->nPage;
53415:
53416: assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
53417: rc = btreeGetPage(pBt, *pPgno, ppPage, 1);
53418: if( rc ) return rc;
53419: rc = sqlite3PagerWrite((*ppPage)->pDbPage);
53420: if( rc!=SQLITE_OK ){
53421: releasePage(*ppPage);
53422: }
53423: TRACE(("ALLOCATE: %d from end of file\n", *pPgno));
53424: }
53425:
53426: assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
53427:
53428: end_allocate_page:
53429: releasePage(pTrunk);
53430: releasePage(pPrevTrunk);
53431: if( rc==SQLITE_OK ){
53432: if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){
53433: releasePage(*ppPage);
53434: return SQLITE_CORRUPT_BKPT;
53435: }
53436: (*ppPage)->isInit = 0;
53437: }else{
53438: *ppPage = 0;
53439: }
53440: assert( rc!=SQLITE_OK || sqlite3PagerIswriteable((*ppPage)->pDbPage) );
53441: return rc;
53442: }
53443:
53444: /*
53445: ** This function is used to add page iPage to the database file free-list.
53446: ** It is assumed that the page is not already a part of the free-list.
53447: **
53448: ** The value passed as the second argument to this function is optional.
53449: ** If the caller happens to have a pointer to the MemPage object
53450: ** corresponding to page iPage handy, it may pass it as the second value.
53451: ** Otherwise, it may pass NULL.
53452: **
53453: ** If a pointer to a MemPage object is passed as the second argument,
53454: ** its reference count is not altered by this function.
53455: */
53456: static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
53457: MemPage *pTrunk = 0; /* Free-list trunk page */
53458: Pgno iTrunk = 0; /* Page number of free-list trunk page */
53459: MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */
53460: MemPage *pPage; /* Page being freed. May be NULL. */
53461: int rc; /* Return Code */
53462: int nFree; /* Initial number of pages on free-list */
53463:
53464: assert( sqlite3_mutex_held(pBt->mutex) );
53465: assert( iPage>1 );
53466: assert( !pMemPage || pMemPage->pgno==iPage );
53467:
53468: if( pMemPage ){
53469: pPage = pMemPage;
53470: sqlite3PagerRef(pPage->pDbPage);
53471: }else{
53472: pPage = btreePageLookup(pBt, iPage);
53473: }
53474:
53475: /* Increment the free page count on pPage1 */
53476: rc = sqlite3PagerWrite(pPage1->pDbPage);
53477: if( rc ) goto freepage_out;
53478: nFree = get4byte(&pPage1->aData[36]);
53479: put4byte(&pPage1->aData[36], nFree+1);
53480:
53481: if( pBt->btsFlags & BTS_SECURE_DELETE ){
53482: /* If the secure_delete option is enabled, then
53483: ** always fully overwrite deleted information with zeros.
53484: */
53485: if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) )
53486: || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0)
53487: ){
53488: goto freepage_out;
53489: }
53490: memset(pPage->aData, 0, pPage->pBt->pageSize);
53491: }
53492:
53493: /* If the database supports auto-vacuum, write an entry in the pointer-map
53494: ** to indicate that the page is free.
53495: */
53496: if( ISAUTOVACUUM ){
53497: ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc);
53498: if( rc ) goto freepage_out;
53499: }
53500:
53501: /* Now manipulate the actual database free-list structure. There are two
53502: ** possibilities. If the free-list is currently empty, or if the first
53503: ** trunk page in the free-list is full, then this page will become a
53504: ** new free-list trunk page. Otherwise, it will become a leaf of the
53505: ** first trunk page in the current free-list. This block tests if it
53506: ** is possible to add the page as a new free-list leaf.
53507: */
53508: if( nFree!=0 ){
53509: u32 nLeaf; /* Initial number of leaf cells on trunk page */
53510:
53511: iTrunk = get4byte(&pPage1->aData[32]);
53512: rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
53513: if( rc!=SQLITE_OK ){
53514: goto freepage_out;
53515: }
53516:
53517: nLeaf = get4byte(&pTrunk->aData[4]);
53518: assert( pBt->usableSize>32 );
53519: if( nLeaf > (u32)pBt->usableSize/4 - 2 ){
53520: rc = SQLITE_CORRUPT_BKPT;
53521: goto freepage_out;
53522: }
53523: if( nLeaf < (u32)pBt->usableSize/4 - 8 ){
53524: /* In this case there is room on the trunk page to insert the page
53525: ** being freed as a new leaf.
53526: **
53527: ** Note that the trunk page is not really full until it contains
53528: ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have
53529: ** coded. But due to a coding error in versions of SQLite prior to
53530: ** 3.6.0, databases with freelist trunk pages holding more than
53531: ** usableSize/4 - 8 entries will be reported as corrupt. In order
53532: ** to maintain backwards compatibility with older versions of SQLite,
53533: ** we will continue to restrict the number of entries to usableSize/4 - 8
53534: ** for now. At some point in the future (once everyone has upgraded
53535: ** to 3.6.0 or later) we should consider fixing the conditional above
53536: ** to read "usableSize/4-2" instead of "usableSize/4-8".
53537: */
53538: rc = sqlite3PagerWrite(pTrunk->pDbPage);
53539: if( rc==SQLITE_OK ){
53540: put4byte(&pTrunk->aData[4], nLeaf+1);
53541: put4byte(&pTrunk->aData[8+nLeaf*4], iPage);
53542: if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){
53543: sqlite3PagerDontWrite(pPage->pDbPage);
53544: }
53545: rc = btreeSetHasContent(pBt, iPage);
53546: }
53547: TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno));
53548: goto freepage_out;
53549: }
53550: }
53551:
53552: /* If control flows to this point, then it was not possible to add the
53553: ** the page being freed as a leaf page of the first trunk in the free-list.
53554: ** Possibly because the free-list is empty, or possibly because the
53555: ** first trunk in the free-list is full. Either way, the page being freed
53556: ** will become the new first trunk page in the free-list.
53557: */
53558: if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){
53559: goto freepage_out;
53560: }
53561: rc = sqlite3PagerWrite(pPage->pDbPage);
53562: if( rc!=SQLITE_OK ){
53563: goto freepage_out;
53564: }
53565: put4byte(pPage->aData, iTrunk);
53566: put4byte(&pPage->aData[4], 0);
53567: put4byte(&pPage1->aData[32], iPage);
53568: TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk));
53569:
53570: freepage_out:
53571: if( pPage ){
53572: pPage->isInit = 0;
53573: }
53574: releasePage(pPage);
53575: releasePage(pTrunk);
53576: return rc;
53577: }
53578: static void freePage(MemPage *pPage, int *pRC){
53579: if( (*pRC)==SQLITE_OK ){
53580: *pRC = freePage2(pPage->pBt, pPage, pPage->pgno);
53581: }
53582: }
53583:
53584: /*
53585: ** Free any overflow pages associated with the given Cell.
53586: */
53587: static int clearCell(MemPage *pPage, unsigned char *pCell){
53588: BtShared *pBt = pPage->pBt;
53589: CellInfo info;
53590: Pgno ovflPgno;
53591: int rc;
53592: int nOvfl;
53593: u32 ovflPageSize;
53594:
53595: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
53596: btreeParseCellPtr(pPage, pCell, &info);
53597: if( info.iOverflow==0 ){
53598: return SQLITE_OK; /* No overflow pages. Return without doing anything */
53599: }
53600: if( pCell+info.iOverflow+3 > pPage->aData+pPage->maskPage ){
1.2.2.1 ! misho 53601: return SQLITE_CORRUPT_BKPT; /* Cell extends past end of page */
1.2 misho 53602: }
53603: ovflPgno = get4byte(&pCell[info.iOverflow]);
53604: assert( pBt->usableSize > 4 );
53605: ovflPageSize = pBt->usableSize - 4;
53606: nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize;
53607: assert( ovflPgno==0 || nOvfl>0 );
53608: while( nOvfl-- ){
53609: Pgno iNext = 0;
53610: MemPage *pOvfl = 0;
53611: if( ovflPgno<2 || ovflPgno>btreePagecount(pBt) ){
53612: /* 0 is not a legal page number and page 1 cannot be an
53613: ** overflow page. Therefore if ovflPgno<2 or past the end of the
53614: ** file the database must be corrupt. */
53615: return SQLITE_CORRUPT_BKPT;
53616: }
53617: if( nOvfl ){
53618: rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext);
53619: if( rc ) return rc;
53620: }
53621:
53622: if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) )
53623: && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1
53624: ){
53625: /* There is no reason any cursor should have an outstanding reference
53626: ** to an overflow page belonging to a cell that is being deleted/updated.
53627: ** So if there exists more than one reference to this page, then it
53628: ** must not really be an overflow page and the database must be corrupt.
53629: ** It is helpful to detect this before calling freePage2(), as
53630: ** freePage2() may zero the page contents if secure-delete mode is
53631: ** enabled. If this 'overflow' page happens to be a page that the
53632: ** caller is iterating through or using in some other way, this
53633: ** can be problematic.
53634: */
53635: rc = SQLITE_CORRUPT_BKPT;
53636: }else{
53637: rc = freePage2(pBt, pOvfl, ovflPgno);
53638: }
53639:
53640: if( pOvfl ){
53641: sqlite3PagerUnref(pOvfl->pDbPage);
53642: }
53643: if( rc ) return rc;
53644: ovflPgno = iNext;
53645: }
53646: return SQLITE_OK;
53647: }
53648:
53649: /*
53650: ** Create the byte sequence used to represent a cell on page pPage
53651: ** and write that byte sequence into pCell[]. Overflow pages are
53652: ** allocated and filled in as necessary. The calling procedure
53653: ** is responsible for making sure sufficient space has been allocated
53654: ** for pCell[].
53655: **
53656: ** Note that pCell does not necessary need to point to the pPage->aData
53657: ** area. pCell might point to some temporary storage. The cell will
53658: ** be constructed in this temporary area then copied into pPage->aData
53659: ** later.
53660: */
53661: static int fillInCell(
53662: MemPage *pPage, /* The page that contains the cell */
53663: unsigned char *pCell, /* Complete text of the cell */
53664: const void *pKey, i64 nKey, /* The key */
53665: const void *pData,int nData, /* The data */
53666: int nZero, /* Extra zero bytes to append to pData */
53667: int *pnSize /* Write cell size here */
53668: ){
53669: int nPayload;
53670: const u8 *pSrc;
53671: int nSrc, n, rc;
53672: int spaceLeft;
53673: MemPage *pOvfl = 0;
53674: MemPage *pToRelease = 0;
53675: unsigned char *pPrior;
53676: unsigned char *pPayload;
53677: BtShared *pBt = pPage->pBt;
53678: Pgno pgnoOvfl = 0;
53679: int nHeader;
53680: CellInfo info;
53681:
53682: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
53683:
53684: /* pPage is not necessarily writeable since pCell might be auxiliary
53685: ** buffer space that is separate from the pPage buffer area */
53686: assert( pCell<pPage->aData || pCell>=&pPage->aData[pBt->pageSize]
53687: || sqlite3PagerIswriteable(pPage->pDbPage) );
53688:
53689: /* Fill in the header. */
53690: nHeader = 0;
53691: if( !pPage->leaf ){
53692: nHeader += 4;
53693: }
53694: if( pPage->hasData ){
53695: nHeader += putVarint(&pCell[nHeader], nData+nZero);
53696: }else{
53697: nData = nZero = 0;
53698: }
53699: nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey);
53700: btreeParseCellPtr(pPage, pCell, &info);
53701: assert( info.nHeader==nHeader );
53702: assert( info.nKey==nKey );
53703: assert( info.nData==(u32)(nData+nZero) );
53704:
53705: /* Fill in the payload */
53706: nPayload = nData + nZero;
53707: if( pPage->intKey ){
53708: pSrc = pData;
53709: nSrc = nData;
53710: nData = 0;
53711: }else{
53712: if( NEVER(nKey>0x7fffffff || pKey==0) ){
53713: return SQLITE_CORRUPT_BKPT;
53714: }
53715: nPayload += (int)nKey;
53716: pSrc = pKey;
53717: nSrc = (int)nKey;
53718: }
53719: *pnSize = info.nSize;
53720: spaceLeft = info.nLocal;
53721: pPayload = &pCell[nHeader];
53722: pPrior = &pCell[info.iOverflow];
53723:
53724: while( nPayload>0 ){
53725: if( spaceLeft==0 ){
53726: #ifndef SQLITE_OMIT_AUTOVACUUM
53727: Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */
53728: if( pBt->autoVacuum ){
53729: do{
53730: pgnoOvfl++;
53731: } while(
53732: PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt)
53733: );
53734: }
53735: #endif
53736: rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0);
53737: #ifndef SQLITE_OMIT_AUTOVACUUM
53738: /* If the database supports auto-vacuum, and the second or subsequent
53739: ** overflow page is being allocated, add an entry to the pointer-map
53740: ** for that page now.
53741: **
53742: ** If this is the first overflow page, then write a partial entry
53743: ** to the pointer-map. If we write nothing to this pointer-map slot,
53744: ** then the optimistic overflow chain processing in clearCell()
53745: ** may misinterpret the uninitialised values and delete the
53746: ** wrong pages from the database.
53747: */
53748: if( pBt->autoVacuum && rc==SQLITE_OK ){
53749: u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1);
53750: ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc);
53751: if( rc ){
53752: releasePage(pOvfl);
53753: }
53754: }
53755: #endif
53756: if( rc ){
53757: releasePage(pToRelease);
53758: return rc;
53759: }
53760:
53761: /* If pToRelease is not zero than pPrior points into the data area
53762: ** of pToRelease. Make sure pToRelease is still writeable. */
53763: assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
53764:
53765: /* If pPrior is part of the data area of pPage, then make sure pPage
53766: ** is still writeable */
53767: assert( pPrior<pPage->aData || pPrior>=&pPage->aData[pBt->pageSize]
53768: || sqlite3PagerIswriteable(pPage->pDbPage) );
53769:
53770: put4byte(pPrior, pgnoOvfl);
53771: releasePage(pToRelease);
53772: pToRelease = pOvfl;
53773: pPrior = pOvfl->aData;
53774: put4byte(pPrior, 0);
53775: pPayload = &pOvfl->aData[4];
53776: spaceLeft = pBt->usableSize - 4;
53777: }
53778: n = nPayload;
53779: if( n>spaceLeft ) n = spaceLeft;
53780:
53781: /* If pToRelease is not zero than pPayload points into the data area
53782: ** of pToRelease. Make sure pToRelease is still writeable. */
53783: assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
53784:
53785: /* If pPayload is part of the data area of pPage, then make sure pPage
53786: ** is still writeable */
53787: assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize]
53788: || sqlite3PagerIswriteable(pPage->pDbPage) );
53789:
53790: if( nSrc>0 ){
53791: if( n>nSrc ) n = nSrc;
53792: assert( pSrc );
53793: memcpy(pPayload, pSrc, n);
53794: }else{
53795: memset(pPayload, 0, n);
53796: }
53797: nPayload -= n;
53798: pPayload += n;
53799: pSrc += n;
53800: nSrc -= n;
53801: spaceLeft -= n;
53802: if( nSrc==0 ){
53803: nSrc = nData;
53804: pSrc = pData;
53805: }
53806: }
53807: releasePage(pToRelease);
53808: return SQLITE_OK;
53809: }
53810:
53811: /*
53812: ** Remove the i-th cell from pPage. This routine effects pPage only.
53813: ** The cell content is not freed or deallocated. It is assumed that
53814: ** the cell content has been copied someplace else. This routine just
53815: ** removes the reference to the cell from pPage.
53816: **
53817: ** "sz" must be the number of bytes in the cell.
53818: */
53819: static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
53820: u32 pc; /* Offset to cell content of cell being deleted */
53821: u8 *data; /* pPage->aData */
53822: u8 *ptr; /* Used to move bytes around within data[] */
53823: u8 *endPtr; /* End of loop */
53824: int rc; /* The return code */
53825: int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */
53826:
53827: if( *pRC ) return;
53828:
53829: assert( idx>=0 && idx<pPage->nCell );
53830: assert( sz==cellSize(pPage, idx) );
53831: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
53832: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
53833: data = pPage->aData;
53834: ptr = &pPage->aCellIdx[2*idx];
53835: pc = get2byte(ptr);
53836: hdr = pPage->hdrOffset;
53837: testcase( pc==get2byte(&data[hdr+5]) );
53838: testcase( pc+sz==pPage->pBt->usableSize );
53839: if( pc < (u32)get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){
53840: *pRC = SQLITE_CORRUPT_BKPT;
53841: return;
53842: }
53843: rc = freeSpace(pPage, pc, sz);
53844: if( rc ){
53845: *pRC = rc;
53846: return;
53847: }
53848: endPtr = &pPage->aCellIdx[2*pPage->nCell - 2];
53849: assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
53850: while( ptr<endPtr ){
53851: *(u16*)ptr = *(u16*)&ptr[2];
53852: ptr += 2;
53853: }
53854: pPage->nCell--;
53855: put2byte(&data[hdr+3], pPage->nCell);
53856: pPage->nFree += 2;
53857: }
53858:
53859: /*
53860: ** Insert a new cell on pPage at cell index "i". pCell points to the
53861: ** content of the cell.
53862: **
53863: ** If the cell content will fit on the page, then put it there. If it
53864: ** will not fit, then make a copy of the cell content into pTemp if
53865: ** pTemp is not null. Regardless of pTemp, allocate a new entry
1.2.2.1 ! misho 53866: ** in pPage->apOvfl[] and make it point to the cell content (either
1.2 misho 53867: ** in pTemp or the original pCell) and also record its index.
53868: ** Allocating a new entry in pPage->aCell[] implies that
53869: ** pPage->nOverflow is incremented.
53870: **
53871: ** If nSkip is non-zero, then do not copy the first nSkip bytes of the
53872: ** cell. The caller will overwrite them after this function returns. If
53873: ** nSkip is non-zero, then pCell may not point to an invalid memory location
53874: ** (but pCell+nSkip is always valid).
53875: */
53876: static void insertCell(
53877: MemPage *pPage, /* Page into which we are copying */
53878: int i, /* New cell becomes the i-th cell of the page */
53879: u8 *pCell, /* Content of the new cell */
53880: int sz, /* Bytes of content in pCell */
53881: u8 *pTemp, /* Temp storage space for pCell, if needed */
53882: Pgno iChild, /* If non-zero, replace first 4 bytes with this value */
53883: int *pRC /* Read and write return code from here */
53884: ){
53885: int idx = 0; /* Where to write new cell content in data[] */
53886: int j; /* Loop counter */
53887: int end; /* First byte past the last cell pointer in data[] */
53888: int ins; /* Index in data[] where new cell pointer is inserted */
53889: int cellOffset; /* Address of first cell pointer in data[] */
53890: u8 *data; /* The content of the whole page */
53891: u8 *ptr; /* Used for moving information around in data[] */
53892: u8 *endPtr; /* End of the loop */
53893:
53894: int nSkip = (iChild ? 4 : 0);
53895:
53896: if( *pRC ) return;
53897:
53898: assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
53899: assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921 );
1.2.2.1 ! misho 53900: assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) );
! 53901: assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) );
1.2 misho 53902: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
53903: /* The cell should normally be sized correctly. However, when moving a
53904: ** malformed cell from a leaf page to an interior page, if the cell size
53905: ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size
53906: ** might be less than 8 (leaf-size + pointer) on the interior node. Hence
53907: ** the term after the || in the following assert(). */
53908: assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) );
53909: if( pPage->nOverflow || sz+2>pPage->nFree ){
53910: if( pTemp ){
53911: memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip);
53912: pCell = pTemp;
53913: }
53914: if( iChild ){
53915: put4byte(pCell, iChild);
53916: }
53917: j = pPage->nOverflow++;
1.2.2.1 ! misho 53918: assert( j<(int)(sizeof(pPage->apOvfl)/sizeof(pPage->apOvfl[0])) );
! 53919: pPage->apOvfl[j] = pCell;
! 53920: pPage->aiOvfl[j] = (u16)i;
1.2 misho 53921: }else{
53922: int rc = sqlite3PagerWrite(pPage->pDbPage);
53923: if( rc!=SQLITE_OK ){
53924: *pRC = rc;
53925: return;
53926: }
53927: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
53928: data = pPage->aData;
53929: cellOffset = pPage->cellOffset;
53930: end = cellOffset + 2*pPage->nCell;
53931: ins = cellOffset + 2*i;
53932: rc = allocateSpace(pPage, sz, &idx);
53933: if( rc ){ *pRC = rc; return; }
53934: /* The allocateSpace() routine guarantees the following two properties
53935: ** if it returns success */
53936: assert( idx >= end+2 );
53937: assert( idx+sz <= (int)pPage->pBt->usableSize );
53938: pPage->nCell++;
53939: pPage->nFree -= (u16)(2 + sz);
53940: memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip);
53941: if( iChild ){
53942: put4byte(&data[idx], iChild);
53943: }
53944: ptr = &data[end];
53945: endPtr = &data[ins];
53946: assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
53947: while( ptr>endPtr ){
53948: *(u16*)ptr = *(u16*)&ptr[-2];
53949: ptr -= 2;
53950: }
53951: put2byte(&data[ins], idx);
53952: put2byte(&data[pPage->hdrOffset+3], pPage->nCell);
53953: #ifndef SQLITE_OMIT_AUTOVACUUM
53954: if( pPage->pBt->autoVacuum ){
53955: /* The cell may contain a pointer to an overflow page. If so, write
53956: ** the entry for the overflow page into the pointer map.
53957: */
53958: ptrmapPutOvflPtr(pPage, pCell, pRC);
53959: }
53960: #endif
53961: }
53962: }
53963:
53964: /*
53965: ** Add a list of cells to a page. The page should be initially empty.
53966: ** The cells are guaranteed to fit on the page.
53967: */
53968: static void assemblePage(
53969: MemPage *pPage, /* The page to be assemblied */
53970: int nCell, /* The number of cells to add to this page */
53971: u8 **apCell, /* Pointers to cell bodies */
53972: u16 *aSize /* Sizes of the cells */
53973: ){
53974: int i; /* Loop counter */
53975: u8 *pCellptr; /* Address of next cell pointer */
53976: int cellbody; /* Address of next cell body */
53977: u8 * const data = pPage->aData; /* Pointer to data for pPage */
53978: const int hdr = pPage->hdrOffset; /* Offset of header on pPage */
53979: const int nUsable = pPage->pBt->usableSize; /* Usable size of page */
53980:
53981: assert( pPage->nOverflow==0 );
53982: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
53983: assert( nCell>=0 && nCell<=(int)MX_CELL(pPage->pBt)
53984: && (int)MX_CELL(pPage->pBt)<=10921);
53985: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
53986:
53987: /* Check that the page has just been zeroed by zeroPage() */
53988: assert( pPage->nCell==0 );
53989: assert( get2byteNotZero(&data[hdr+5])==nUsable );
53990:
53991: pCellptr = &pPage->aCellIdx[nCell*2];
53992: cellbody = nUsable;
53993: for(i=nCell-1; i>=0; i--){
53994: u16 sz = aSize[i];
53995: pCellptr -= 2;
53996: cellbody -= sz;
53997: put2byte(pCellptr, cellbody);
53998: memcpy(&data[cellbody], apCell[i], sz);
53999: }
54000: put2byte(&data[hdr+3], nCell);
54001: put2byte(&data[hdr+5], cellbody);
54002: pPage->nFree -= (nCell*2 + nUsable - cellbody);
54003: pPage->nCell = (u16)nCell;
54004: }
54005:
54006: /*
54007: ** The following parameters determine how many adjacent pages get involved
54008: ** in a balancing operation. NN is the number of neighbors on either side
54009: ** of the page that participate in the balancing operation. NB is the
54010: ** total number of pages that participate, including the target page and
54011: ** NN neighbors on either side.
54012: **
54013: ** The minimum value of NN is 1 (of course). Increasing NN above 1
54014: ** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance
54015: ** in exchange for a larger degradation in INSERT and UPDATE performance.
54016: ** The value of NN appears to give the best results overall.
54017: */
54018: #define NN 1 /* Number of neighbors on either side of pPage */
54019: #define NB (NN*2+1) /* Total pages involved in the balance */
54020:
54021:
54022: #ifndef SQLITE_OMIT_QUICKBALANCE
54023: /*
54024: ** This version of balance() handles the common special case where
54025: ** a new entry is being inserted on the extreme right-end of the
54026: ** tree, in other words, when the new entry will become the largest
54027: ** entry in the tree.
54028: **
54029: ** Instead of trying to balance the 3 right-most leaf pages, just add
54030: ** a new page to the right-hand side and put the one new entry in
54031: ** that page. This leaves the right side of the tree somewhat
54032: ** unbalanced. But odds are that we will be inserting new entries
54033: ** at the end soon afterwards so the nearly empty page will quickly
54034: ** fill up. On average.
54035: **
54036: ** pPage is the leaf page which is the right-most page in the tree.
54037: ** pParent is its parent. pPage must have a single overflow entry
54038: ** which is also the right-most entry on the page.
54039: **
54040: ** The pSpace buffer is used to store a temporary copy of the divider
54041: ** cell that will be inserted into pParent. Such a cell consists of a 4
54042: ** byte page number followed by a variable length integer. In other
54043: ** words, at most 13 bytes. Hence the pSpace buffer must be at
54044: ** least 13 bytes in size.
54045: */
54046: static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
54047: BtShared *const pBt = pPage->pBt; /* B-Tree Database */
54048: MemPage *pNew; /* Newly allocated page */
54049: int rc; /* Return Code */
54050: Pgno pgnoNew; /* Page number of pNew */
54051:
54052: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
54053: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
54054: assert( pPage->nOverflow==1 );
54055:
54056: /* This error condition is now caught prior to reaching this function */
1.2.2.1 ! misho 54057: if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT;
1.2 misho 54058:
54059: /* Allocate a new page. This page will become the right-sibling of
54060: ** pPage. Make the parent page writable, so that the new divider cell
54061: ** may be inserted. If both these operations are successful, proceed.
54062: */
54063: rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0);
54064:
54065: if( rc==SQLITE_OK ){
54066:
54067: u8 *pOut = &pSpace[4];
1.2.2.1 ! misho 54068: u8 *pCell = pPage->apOvfl[0];
1.2 misho 54069: u16 szCell = cellSizePtr(pPage, pCell);
54070: u8 *pStop;
54071:
54072: assert( sqlite3PagerIswriteable(pNew->pDbPage) );
54073: assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) );
54074: zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF);
54075: assemblePage(pNew, 1, &pCell, &szCell);
54076:
54077: /* If this is an auto-vacuum database, update the pointer map
54078: ** with entries for the new page, and any pointer from the
54079: ** cell on the page to an overflow page. If either of these
54080: ** operations fails, the return code is set, but the contents
54081: ** of the parent page are still manipulated by thh code below.
54082: ** That is Ok, at this point the parent page is guaranteed to
54083: ** be marked as dirty. Returning an error code will cause a
54084: ** rollback, undoing any changes made to the parent page.
54085: */
54086: if( ISAUTOVACUUM ){
54087: ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc);
54088: if( szCell>pNew->minLocal ){
54089: ptrmapPutOvflPtr(pNew, pCell, &rc);
54090: }
54091: }
54092:
54093: /* Create a divider cell to insert into pParent. The divider cell
54094: ** consists of a 4-byte page number (the page number of pPage) and
54095: ** a variable length key value (which must be the same value as the
54096: ** largest key on pPage).
54097: **
54098: ** To find the largest key value on pPage, first find the right-most
54099: ** cell on pPage. The first two fields of this cell are the
54100: ** record-length (a variable length integer at most 32-bits in size)
54101: ** and the key value (a variable length integer, may have any value).
54102: ** The first of the while(...) loops below skips over the record-length
54103: ** field. The second while(...) loop copies the key value from the
54104: ** cell on pPage into the pSpace buffer.
54105: */
54106: pCell = findCell(pPage, pPage->nCell-1);
54107: pStop = &pCell[9];
54108: while( (*(pCell++)&0x80) && pCell<pStop );
54109: pStop = &pCell[9];
54110: while( ((*(pOut++) = *(pCell++))&0x80) && pCell<pStop );
54111:
54112: /* Insert the new divider cell into pParent. */
54113: insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace),
54114: 0, pPage->pgno, &rc);
54115:
54116: /* Set the right-child pointer of pParent to point to the new page. */
54117: put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew);
54118:
54119: /* Release the reference to the new page. */
54120: releasePage(pNew);
54121: }
54122:
54123: return rc;
54124: }
54125: #endif /* SQLITE_OMIT_QUICKBALANCE */
54126:
54127: #if 0
54128: /*
54129: ** This function does not contribute anything to the operation of SQLite.
54130: ** it is sometimes activated temporarily while debugging code responsible
54131: ** for setting pointer-map entries.
54132: */
54133: static int ptrmapCheckPages(MemPage **apPage, int nPage){
54134: int i, j;
54135: for(i=0; i<nPage; i++){
54136: Pgno n;
54137: u8 e;
54138: MemPage *pPage = apPage[i];
54139: BtShared *pBt = pPage->pBt;
54140: assert( pPage->isInit );
54141:
54142: for(j=0; j<pPage->nCell; j++){
54143: CellInfo info;
54144: u8 *z;
54145:
54146: z = findCell(pPage, j);
54147: btreeParseCellPtr(pPage, z, &info);
54148: if( info.iOverflow ){
54149: Pgno ovfl = get4byte(&z[info.iOverflow]);
54150: ptrmapGet(pBt, ovfl, &e, &n);
54151: assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 );
54152: }
54153: if( !pPage->leaf ){
54154: Pgno child = get4byte(z);
54155: ptrmapGet(pBt, child, &e, &n);
54156: assert( n==pPage->pgno && e==PTRMAP_BTREE );
54157: }
54158: }
54159: if( !pPage->leaf ){
54160: Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]);
54161: ptrmapGet(pBt, child, &e, &n);
54162: assert( n==pPage->pgno && e==PTRMAP_BTREE );
54163: }
54164: }
54165: return 1;
54166: }
54167: #endif
54168:
54169: /*
54170: ** This function is used to copy the contents of the b-tree node stored
54171: ** on page pFrom to page pTo. If page pFrom was not a leaf page, then
54172: ** the pointer-map entries for each child page are updated so that the
54173: ** parent page stored in the pointer map is page pTo. If pFrom contained
54174: ** any cells with overflow page pointers, then the corresponding pointer
54175: ** map entries are also updated so that the parent page is page pTo.
54176: **
54177: ** If pFrom is currently carrying any overflow cells (entries in the
1.2.2.1 ! misho 54178: ** MemPage.apOvfl[] array), they are not copied to pTo.
1.2 misho 54179: **
54180: ** Before returning, page pTo is reinitialized using btreeInitPage().
54181: **
54182: ** The performance of this function is not critical. It is only used by
54183: ** the balance_shallower() and balance_deeper() procedures, neither of
54184: ** which are called often under normal circumstances.
54185: */
54186: static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){
54187: if( (*pRC)==SQLITE_OK ){
54188: BtShared * const pBt = pFrom->pBt;
54189: u8 * const aFrom = pFrom->aData;
54190: u8 * const aTo = pTo->aData;
54191: int const iFromHdr = pFrom->hdrOffset;
54192: int const iToHdr = ((pTo->pgno==1) ? 100 : 0);
54193: int rc;
54194: int iData;
54195:
54196:
54197: assert( pFrom->isInit );
54198: assert( pFrom->nFree>=iToHdr );
54199: assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize );
54200:
54201: /* Copy the b-tree node content from page pFrom to page pTo. */
54202: iData = get2byte(&aFrom[iFromHdr+5]);
54203: memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData);
54204: memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell);
54205:
54206: /* Reinitialize page pTo so that the contents of the MemPage structure
54207: ** match the new data. The initialization of pTo can actually fail under
54208: ** fairly obscure circumstances, even though it is a copy of initialized
54209: ** page pFrom.
54210: */
54211: pTo->isInit = 0;
54212: rc = btreeInitPage(pTo);
54213: if( rc!=SQLITE_OK ){
54214: *pRC = rc;
54215: return;
54216: }
54217:
54218: /* If this is an auto-vacuum database, update the pointer-map entries
54219: ** for any b-tree or overflow pages that pTo now contains the pointers to.
54220: */
54221: if( ISAUTOVACUUM ){
54222: *pRC = setChildPtrmaps(pTo);
54223: }
54224: }
54225: }
54226:
54227: /*
54228: ** This routine redistributes cells on the iParentIdx'th child of pParent
54229: ** (hereafter "the page") and up to 2 siblings so that all pages have about the
54230: ** same amount of free space. Usually a single sibling on either side of the
54231: ** page are used in the balancing, though both siblings might come from one
54232: ** side if the page is the first or last child of its parent. If the page
54233: ** has fewer than 2 siblings (something which can only happen if the page
54234: ** is a root page or a child of a root page) then all available siblings
54235: ** participate in the balancing.
54236: **
54237: ** The number of siblings of the page might be increased or decreased by
54238: ** one or two in an effort to keep pages nearly full but not over full.
54239: **
54240: ** Note that when this routine is called, some of the cells on the page
54241: ** might not actually be stored in MemPage.aData[]. This can happen
54242: ** if the page is overfull. This routine ensures that all cells allocated
54243: ** to the page and its siblings fit into MemPage.aData[] before returning.
54244: **
54245: ** In the course of balancing the page and its siblings, cells may be
54246: ** inserted into or removed from the parent page (pParent). Doing so
54247: ** may cause the parent page to become overfull or underfull. If this
54248: ** happens, it is the responsibility of the caller to invoke the correct
54249: ** balancing routine to fix this problem (see the balance() routine).
54250: **
54251: ** If this routine fails for any reason, it might leave the database
54252: ** in a corrupted state. So if this routine fails, the database should
54253: ** be rolled back.
54254: **
54255: ** The third argument to this function, aOvflSpace, is a pointer to a
54256: ** buffer big enough to hold one page. If while inserting cells into the parent
54257: ** page (pParent) the parent page becomes overfull, this buffer is
54258: ** used to store the parent's overflow cells. Because this function inserts
54259: ** a maximum of four divider cells into the parent page, and the maximum
54260: ** size of a cell stored within an internal node is always less than 1/4
54261: ** of the page-size, the aOvflSpace[] buffer is guaranteed to be large
54262: ** enough for all overflow cells.
54263: **
54264: ** If aOvflSpace is set to a null pointer, this function returns
54265: ** SQLITE_NOMEM.
54266: */
1.2.2.1 ! misho 54267: #if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM)
! 54268: #pragma optimize("", off)
! 54269: #endif
1.2 misho 54270: static int balance_nonroot(
54271: MemPage *pParent, /* Parent page of siblings being balanced */
54272: int iParentIdx, /* Index of "the page" in pParent */
54273: u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */
1.2.2.1 ! misho 54274: int isRoot, /* True if pParent is a root-page */
! 54275: int bBulk /* True if this call is part of a bulk load */
1.2 misho 54276: ){
54277: BtShared *pBt; /* The whole database */
54278: int nCell = 0; /* Number of cells in apCell[] */
54279: int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */
54280: int nNew = 0; /* Number of pages in apNew[] */
54281: int nOld; /* Number of pages in apOld[] */
54282: int i, j, k; /* Loop counters */
54283: int nxDiv; /* Next divider slot in pParent->aCell[] */
54284: int rc = SQLITE_OK; /* The return code */
54285: u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */
54286: int leafData; /* True if pPage is a leaf of a LEAFDATA tree */
54287: int usableSpace; /* Bytes in pPage beyond the header */
54288: int pageFlags; /* Value of pPage->aData[0] */
54289: int subtotal; /* Subtotal of bytes in cells on one page */
54290: int iSpace1 = 0; /* First unused byte of aSpace1[] */
54291: int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */
54292: int szScratch; /* Size of scratch memory requested */
54293: MemPage *apOld[NB]; /* pPage and up to two siblings */
54294: MemPage *apCopy[NB]; /* Private copies of apOld[] pages */
54295: MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */
54296: u8 *pRight; /* Location in parent of right-sibling pointer */
54297: u8 *apDiv[NB-1]; /* Divider cells in pParent */
54298: int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */
54299: int szNew[NB+2]; /* Combined size of cells place on i-th page */
54300: u8 **apCell = 0; /* All cells begin balanced */
54301: u16 *szCell; /* Local size of all cells in apCell[] */
54302: u8 *aSpace1; /* Space for copies of dividers cells */
54303: Pgno pgno; /* Temp var to store a page number in */
54304:
54305: pBt = pParent->pBt;
54306: assert( sqlite3_mutex_held(pBt->mutex) );
54307: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
54308:
54309: #if 0
54310: TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno));
54311: #endif
54312:
54313: /* At this point pParent may have at most one overflow cell. And if
54314: ** this overflow cell is present, it must be the cell with
54315: ** index iParentIdx. This scenario comes about when this function
54316: ** is called (indirectly) from sqlite3BtreeDelete().
54317: */
54318: assert( pParent->nOverflow==0 || pParent->nOverflow==1 );
1.2.2.1 ! misho 54319: assert( pParent->nOverflow==0 || pParent->aiOvfl[0]==iParentIdx );
1.2 misho 54320:
54321: if( !aOvflSpace ){
54322: return SQLITE_NOMEM;
54323: }
54324:
54325: /* Find the sibling pages to balance. Also locate the cells in pParent
54326: ** that divide the siblings. An attempt is made to find NN siblings on
54327: ** either side of pPage. More siblings are taken from one side, however,
54328: ** if there are fewer than NN siblings on the other side. If pParent
54329: ** has NB or fewer children then all children of pParent are taken.
54330: **
54331: ** This loop also drops the divider cells from the parent page. This
54332: ** way, the remainder of the function does not have to deal with any
54333: ** overflow cells in the parent page, since if any existed they will
54334: ** have already been removed.
54335: */
54336: i = pParent->nOverflow + pParent->nCell;
54337: if( i<2 ){
54338: nxDiv = 0;
54339: }else{
1.2.2.1 ! misho 54340: assert( bBulk==0 || bBulk==1 );
1.2 misho 54341: if( iParentIdx==0 ){
54342: nxDiv = 0;
54343: }else if( iParentIdx==i ){
1.2.2.1 ! misho 54344: nxDiv = i-2+bBulk;
1.2 misho 54345: }else{
1.2.2.1 ! misho 54346: assert( bBulk==0 );
1.2 misho 54347: nxDiv = iParentIdx-1;
54348: }
1.2.2.1 ! misho 54349: i = 2-bBulk;
1.2 misho 54350: }
1.2.2.1 ! misho 54351: nOld = i+1;
1.2 misho 54352: if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){
54353: pRight = &pParent->aData[pParent->hdrOffset+8];
54354: }else{
54355: pRight = findCell(pParent, i+nxDiv-pParent->nOverflow);
54356: }
54357: pgno = get4byte(pRight);
54358: while( 1 ){
54359: rc = getAndInitPage(pBt, pgno, &apOld[i]);
54360: if( rc ){
54361: memset(apOld, 0, (i+1)*sizeof(MemPage*));
54362: goto balance_cleanup;
54363: }
54364: nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow;
54365: if( (i--)==0 ) break;
54366:
1.2.2.1 ! misho 54367: if( i+nxDiv==pParent->aiOvfl[0] && pParent->nOverflow ){
! 54368: apDiv[i] = pParent->apOvfl[0];
1.2 misho 54369: pgno = get4byte(apDiv[i]);
54370: szNew[i] = cellSizePtr(pParent, apDiv[i]);
54371: pParent->nOverflow = 0;
54372: }else{
54373: apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow);
54374: pgno = get4byte(apDiv[i]);
54375: szNew[i] = cellSizePtr(pParent, apDiv[i]);
54376:
54377: /* Drop the cell from the parent page. apDiv[i] still points to
54378: ** the cell within the parent, even though it has been dropped.
54379: ** This is safe because dropping a cell only overwrites the first
54380: ** four bytes of it, and this function does not need the first
54381: ** four bytes of the divider cell. So the pointer is safe to use
54382: ** later on.
54383: **
54384: ** But not if we are in secure-delete mode. In secure-delete mode,
54385: ** the dropCell() routine will overwrite the entire cell with zeroes.
54386: ** In this case, temporarily copy the cell into the aOvflSpace[]
54387: ** buffer. It will be copied out again as soon as the aSpace[] buffer
54388: ** is allocated. */
54389: if( pBt->btsFlags & BTS_SECURE_DELETE ){
54390: int iOff;
54391:
54392: iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
54393: if( (iOff+szNew[i])>(int)pBt->usableSize ){
54394: rc = SQLITE_CORRUPT_BKPT;
54395: memset(apOld, 0, (i+1)*sizeof(MemPage*));
54396: goto balance_cleanup;
54397: }else{
54398: memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]);
54399: apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData];
54400: }
54401: }
54402: dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc);
54403: }
54404: }
54405:
54406: /* Make nMaxCells a multiple of 4 in order to preserve 8-byte
54407: ** alignment */
54408: nMaxCells = (nMaxCells + 3)&~3;
54409:
54410: /*
54411: ** Allocate space for memory structures
54412: */
54413: k = pBt->pageSize + ROUND8(sizeof(MemPage));
54414: szScratch =
54415: nMaxCells*sizeof(u8*) /* apCell */
54416: + nMaxCells*sizeof(u16) /* szCell */
54417: + pBt->pageSize /* aSpace1 */
54418: + k*nOld; /* Page copies (apCopy) */
54419: apCell = sqlite3ScratchMalloc( szScratch );
54420: if( apCell==0 ){
54421: rc = SQLITE_NOMEM;
54422: goto balance_cleanup;
54423: }
54424: szCell = (u16*)&apCell[nMaxCells];
54425: aSpace1 = (u8*)&szCell[nMaxCells];
54426: assert( EIGHT_BYTE_ALIGNMENT(aSpace1) );
54427:
54428: /*
54429: ** Load pointers to all cells on sibling pages and the divider cells
54430: ** into the local apCell[] array. Make copies of the divider cells
1.2.2.1 ! misho 54431: ** into space obtained from aSpace1[] and remove the divider cells
1.2 misho 54432: ** from pParent.
54433: **
54434: ** If the siblings are on leaf pages, then the child pointers of the
54435: ** divider cells are stripped from the cells before they are copied
54436: ** into aSpace1[]. In this way, all cells in apCell[] are without
54437: ** child pointers. If siblings are not leaves, then all cell in
54438: ** apCell[] include child pointers. Either way, all cells in apCell[]
54439: ** are alike.
54440: **
54441: ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf.
54442: ** leafData: 1 if pPage holds key+data and pParent holds only keys.
54443: */
54444: leafCorrection = apOld[0]->leaf*4;
54445: leafData = apOld[0]->hasData;
54446: for(i=0; i<nOld; i++){
54447: int limit;
54448:
54449: /* Before doing anything else, take a copy of the i'th original sibling
54450: ** The rest of this function will use data from the copies rather
54451: ** that the original pages since the original pages will be in the
54452: ** process of being overwritten. */
54453: MemPage *pOld = apCopy[i] = (MemPage*)&aSpace1[pBt->pageSize + k*i];
54454: memcpy(pOld, apOld[i], sizeof(MemPage));
54455: pOld->aData = (void*)&pOld[1];
54456: memcpy(pOld->aData, apOld[i]->aData, pBt->pageSize);
54457:
54458: limit = pOld->nCell+pOld->nOverflow;
54459: if( pOld->nOverflow>0 ){
54460: for(j=0; j<limit; j++){
54461: assert( nCell<nMaxCells );
54462: apCell[nCell] = findOverflowCell(pOld, j);
54463: szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
54464: nCell++;
54465: }
54466: }else{
54467: u8 *aData = pOld->aData;
54468: u16 maskPage = pOld->maskPage;
54469: u16 cellOffset = pOld->cellOffset;
54470: for(j=0; j<limit; j++){
54471: assert( nCell<nMaxCells );
54472: apCell[nCell] = findCellv2(aData, maskPage, cellOffset, j);
54473: szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
54474: nCell++;
54475: }
54476: }
54477: if( i<nOld-1 && !leafData){
54478: u16 sz = (u16)szNew[i];
54479: u8 *pTemp;
54480: assert( nCell<nMaxCells );
54481: szCell[nCell] = sz;
54482: pTemp = &aSpace1[iSpace1];
54483: iSpace1 += sz;
54484: assert( sz<=pBt->maxLocal+23 );
54485: assert( iSpace1 <= (int)pBt->pageSize );
54486: memcpy(pTemp, apDiv[i], sz);
54487: apCell[nCell] = pTemp+leafCorrection;
54488: assert( leafCorrection==0 || leafCorrection==4 );
54489: szCell[nCell] = szCell[nCell] - leafCorrection;
54490: if( !pOld->leaf ){
54491: assert( leafCorrection==0 );
54492: assert( pOld->hdrOffset==0 );
54493: /* The right pointer of the child page pOld becomes the left
54494: ** pointer of the divider cell */
54495: memcpy(apCell[nCell], &pOld->aData[8], 4);
54496: }else{
54497: assert( leafCorrection==4 );
54498: if( szCell[nCell]<4 ){
54499: /* Do not allow any cells smaller than 4 bytes. */
54500: szCell[nCell] = 4;
54501: }
54502: }
54503: nCell++;
54504: }
54505: }
54506:
54507: /*
54508: ** Figure out the number of pages needed to hold all nCell cells.
54509: ** Store this number in "k". Also compute szNew[] which is the total
54510: ** size of all cells on the i-th page and cntNew[] which is the index
54511: ** in apCell[] of the cell that divides page i from page i+1.
54512: ** cntNew[k] should equal nCell.
54513: **
54514: ** Values computed by this block:
54515: **
54516: ** k: The total number of sibling pages
54517: ** szNew[i]: Spaced used on the i-th sibling page.
54518: ** cntNew[i]: Index in apCell[] and szCell[] for the first cell to
54519: ** the right of the i-th sibling page.
54520: ** usableSpace: Number of bytes of space available on each sibling.
54521: **
54522: */
54523: usableSpace = pBt->usableSize - 12 + leafCorrection;
54524: for(subtotal=k=i=0; i<nCell; i++){
54525: assert( i<nMaxCells );
54526: subtotal += szCell[i] + 2;
54527: if( subtotal > usableSpace ){
54528: szNew[k] = subtotal - szCell[i];
54529: cntNew[k] = i;
54530: if( leafData ){ i--; }
54531: subtotal = 0;
54532: k++;
54533: if( k>NB+1 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; }
54534: }
54535: }
54536: szNew[k] = subtotal;
54537: cntNew[k] = nCell;
54538: k++;
54539:
54540: /*
54541: ** The packing computed by the previous block is biased toward the siblings
54542: ** on the left side. The left siblings are always nearly full, while the
54543: ** right-most sibling might be nearly empty. This block of code attempts
54544: ** to adjust the packing of siblings to get a better balance.
54545: **
54546: ** This adjustment is more than an optimization. The packing above might
54547: ** be so out of balance as to be illegal. For example, the right-most
54548: ** sibling might be completely empty. This adjustment is not optional.
54549: */
54550: for(i=k-1; i>0; i--){
54551: int szRight = szNew[i]; /* Size of sibling on the right */
54552: int szLeft = szNew[i-1]; /* Size of sibling on the left */
54553: int r; /* Index of right-most cell in left sibling */
54554: int d; /* Index of first cell to the left of right sibling */
54555:
54556: r = cntNew[i-1] - 1;
54557: d = r + 1 - leafData;
54558: assert( d<nMaxCells );
54559: assert( r<nMaxCells );
1.2.2.1 ! misho 54560: while( szRight==0
! 54561: || (!bBulk && szRight+szCell[d]+2<=szLeft-(szCell[r]+2))
! 54562: ){
1.2 misho 54563: szRight += szCell[d] + 2;
54564: szLeft -= szCell[r] + 2;
54565: cntNew[i-1]--;
54566: r = cntNew[i-1] - 1;
54567: d = r + 1 - leafData;
54568: }
54569: szNew[i] = szRight;
54570: szNew[i-1] = szLeft;
54571: }
54572:
54573: /* Either we found one or more cells (cntnew[0])>0) or pPage is
54574: ** a virtual root page. A virtual root page is when the real root
54575: ** page is page 1 and we are the only child of that page.
54576: **
54577: ** UPDATE: The assert() below is not necessarily true if the database
54578: ** file is corrupt. The corruption will be detected and reported later
54579: ** in this procedure so there is no need to act upon it now.
54580: */
54581: #if 0
54582: assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) );
54583: #endif
54584:
54585: TRACE(("BALANCE: old: %d %d %d ",
54586: apOld[0]->pgno,
54587: nOld>=2 ? apOld[1]->pgno : 0,
54588: nOld>=3 ? apOld[2]->pgno : 0
54589: ));
54590:
54591: /*
54592: ** Allocate k new pages. Reuse old pages where possible.
54593: */
54594: if( apOld[0]->pgno<=1 ){
54595: rc = SQLITE_CORRUPT_BKPT;
54596: goto balance_cleanup;
54597: }
54598: pageFlags = apOld[0]->aData[0];
54599: for(i=0; i<k; i++){
54600: MemPage *pNew;
54601: if( i<nOld ){
54602: pNew = apNew[i] = apOld[i];
54603: apOld[i] = 0;
54604: rc = sqlite3PagerWrite(pNew->pDbPage);
54605: nNew++;
54606: if( rc ) goto balance_cleanup;
54607: }else{
54608: assert( i>0 );
1.2.2.1 ! misho 54609: rc = allocateBtreePage(pBt, &pNew, &pgno, (bBulk ? 1 : pgno), 0);
1.2 misho 54610: if( rc ) goto balance_cleanup;
54611: apNew[i] = pNew;
54612: nNew++;
54613:
54614: /* Set the pointer-map entry for the new sibling page. */
54615: if( ISAUTOVACUUM ){
54616: ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc);
54617: if( rc!=SQLITE_OK ){
54618: goto balance_cleanup;
54619: }
54620: }
54621: }
54622: }
54623:
54624: /* Free any old pages that were not reused as new pages.
54625: */
54626: while( i<nOld ){
54627: freePage(apOld[i], &rc);
54628: if( rc ) goto balance_cleanup;
54629: releasePage(apOld[i]);
54630: apOld[i] = 0;
54631: i++;
54632: }
54633:
54634: /*
54635: ** Put the new pages in accending order. This helps to
54636: ** keep entries in the disk file in order so that a scan
54637: ** of the table is a linear scan through the file. That
54638: ** in turn helps the operating system to deliver pages
54639: ** from the disk more rapidly.
54640: **
54641: ** An O(n^2) insertion sort algorithm is used, but since
54642: ** n is never more than NB (a small constant), that should
54643: ** not be a problem.
54644: **
54645: ** When NB==3, this one optimization makes the database
54646: ** about 25% faster for large insertions and deletions.
54647: */
54648: for(i=0; i<k-1; i++){
54649: int minV = apNew[i]->pgno;
54650: int minI = i;
54651: for(j=i+1; j<k; j++){
54652: if( apNew[j]->pgno<(unsigned)minV ){
54653: minI = j;
54654: minV = apNew[j]->pgno;
54655: }
54656: }
54657: if( minI>i ){
54658: MemPage *pT;
54659: pT = apNew[i];
54660: apNew[i] = apNew[minI];
54661: apNew[minI] = pT;
54662: }
54663: }
54664: TRACE(("new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n",
54665: apNew[0]->pgno, szNew[0],
54666: nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0,
54667: nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0,
54668: nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0,
54669: nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0));
54670:
54671: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
54672: put4byte(pRight, apNew[nNew-1]->pgno);
54673:
54674: /*
54675: ** Evenly distribute the data in apCell[] across the new pages.
54676: ** Insert divider cells into pParent as necessary.
54677: */
54678: j = 0;
54679: for(i=0; i<nNew; i++){
54680: /* Assemble the new sibling page. */
54681: MemPage *pNew = apNew[i];
54682: assert( j<nMaxCells );
54683: zeroPage(pNew, pageFlags);
54684: assemblePage(pNew, cntNew[i]-j, &apCell[j], &szCell[j]);
54685: assert( pNew->nCell>0 || (nNew==1 && cntNew[0]==0) );
54686: assert( pNew->nOverflow==0 );
54687:
54688: j = cntNew[i];
54689:
54690: /* If the sibling page assembled above was not the right-most sibling,
54691: ** insert a divider cell into the parent page.
54692: */
54693: assert( i<nNew-1 || j==nCell );
54694: if( j<nCell ){
54695: u8 *pCell;
54696: u8 *pTemp;
54697: int sz;
54698:
54699: assert( j<nMaxCells );
54700: pCell = apCell[j];
54701: sz = szCell[j] + leafCorrection;
54702: pTemp = &aOvflSpace[iOvflSpace];
54703: if( !pNew->leaf ){
54704: memcpy(&pNew->aData[8], pCell, 4);
54705: }else if( leafData ){
54706: /* If the tree is a leaf-data tree, and the siblings are leaves,
54707: ** then there is no divider cell in apCell[]. Instead, the divider
54708: ** cell consists of the integer key for the right-most cell of
54709: ** the sibling-page assembled above only.
54710: */
54711: CellInfo info;
54712: j--;
54713: btreeParseCellPtr(pNew, apCell[j], &info);
54714: pCell = pTemp;
54715: sz = 4 + putVarint(&pCell[4], info.nKey);
54716: pTemp = 0;
54717: }else{
54718: pCell -= 4;
54719: /* Obscure case for non-leaf-data trees: If the cell at pCell was
54720: ** previously stored on a leaf node, and its reported size was 4
54721: ** bytes, then it may actually be smaller than this
54722: ** (see btreeParseCellPtr(), 4 bytes is the minimum size of
54723: ** any cell). But it is important to pass the correct size to
54724: ** insertCell(), so reparse the cell now.
54725: **
54726: ** Note that this can never happen in an SQLite data file, as all
54727: ** cells are at least 4 bytes. It only happens in b-trees used
54728: ** to evaluate "IN (SELECT ...)" and similar clauses.
54729: */
54730: if( szCell[j]==4 ){
54731: assert(leafCorrection==4);
54732: sz = cellSizePtr(pParent, pCell);
54733: }
54734: }
54735: iOvflSpace += sz;
54736: assert( sz<=pBt->maxLocal+23 );
54737: assert( iOvflSpace <= (int)pBt->pageSize );
54738: insertCell(pParent, nxDiv, pCell, sz, pTemp, pNew->pgno, &rc);
54739: if( rc!=SQLITE_OK ) goto balance_cleanup;
54740: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
54741:
54742: j++;
54743: nxDiv++;
54744: }
54745: }
54746: assert( j==nCell );
54747: assert( nOld>0 );
54748: assert( nNew>0 );
54749: if( (pageFlags & PTF_LEAF)==0 ){
54750: u8 *zChild = &apCopy[nOld-1]->aData[8];
54751: memcpy(&apNew[nNew-1]->aData[8], zChild, 4);
54752: }
54753:
54754: if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){
54755: /* The root page of the b-tree now contains no cells. The only sibling
54756: ** page is the right-child of the parent. Copy the contents of the
54757: ** child page into the parent, decreasing the overall height of the
54758: ** b-tree structure by one. This is described as the "balance-shallower"
54759: ** sub-algorithm in some documentation.
54760: **
54761: ** If this is an auto-vacuum database, the call to copyNodeContent()
54762: ** sets all pointer-map entries corresponding to database image pages
54763: ** for which the pointer is stored within the content being copied.
54764: **
54765: ** The second assert below verifies that the child page is defragmented
54766: ** (it must be, as it was just reconstructed using assemblePage()). This
54767: ** is important if the parent page happens to be page 1 of the database
54768: ** image. */
54769: assert( nNew==1 );
54770: assert( apNew[0]->nFree ==
54771: (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2)
54772: );
54773: copyNodeContent(apNew[0], pParent, &rc);
54774: freePage(apNew[0], &rc);
54775: }else if( ISAUTOVACUUM ){
54776: /* Fix the pointer-map entries for all the cells that were shifted around.
54777: ** There are several different types of pointer-map entries that need to
54778: ** be dealt with by this routine. Some of these have been set already, but
54779: ** many have not. The following is a summary:
54780: **
54781: ** 1) The entries associated with new sibling pages that were not
54782: ** siblings when this function was called. These have already
54783: ** been set. We don't need to worry about old siblings that were
54784: ** moved to the free-list - the freePage() code has taken care
54785: ** of those.
54786: **
54787: ** 2) The pointer-map entries associated with the first overflow
54788: ** page in any overflow chains used by new divider cells. These
54789: ** have also already been taken care of by the insertCell() code.
54790: **
54791: ** 3) If the sibling pages are not leaves, then the child pages of
54792: ** cells stored on the sibling pages may need to be updated.
54793: **
54794: ** 4) If the sibling pages are not internal intkey nodes, then any
54795: ** overflow pages used by these cells may need to be updated
54796: ** (internal intkey nodes never contain pointers to overflow pages).
54797: **
54798: ** 5) If the sibling pages are not leaves, then the pointer-map
54799: ** entries for the right-child pages of each sibling may need
54800: ** to be updated.
54801: **
54802: ** Cases 1 and 2 are dealt with above by other code. The next
54803: ** block deals with cases 3 and 4 and the one after that, case 5. Since
54804: ** setting a pointer map entry is a relatively expensive operation, this
54805: ** code only sets pointer map entries for child or overflow pages that have
54806: ** actually moved between pages. */
54807: MemPage *pNew = apNew[0];
54808: MemPage *pOld = apCopy[0];
54809: int nOverflow = pOld->nOverflow;
54810: int iNextOld = pOld->nCell + nOverflow;
1.2.2.1 ! misho 54811: int iOverflow = (nOverflow ? pOld->aiOvfl[0] : -1);
1.2 misho 54812: j = 0; /* Current 'old' sibling page */
54813: k = 0; /* Current 'new' sibling page */
54814: for(i=0; i<nCell; i++){
54815: int isDivider = 0;
54816: while( i==iNextOld ){
54817: /* Cell i is the cell immediately following the last cell on old
54818: ** sibling page j. If the siblings are not leaf pages of an
54819: ** intkey b-tree, then cell i was a divider cell. */
54820: assert( j+1 < ArraySize(apCopy) );
1.2.2.1 ! misho 54821: assert( j+1 < nOld );
1.2 misho 54822: pOld = apCopy[++j];
54823: iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
54824: if( pOld->nOverflow ){
54825: nOverflow = pOld->nOverflow;
1.2.2.1 ! misho 54826: iOverflow = i + !leafData + pOld->aiOvfl[0];
1.2 misho 54827: }
54828: isDivider = !leafData;
54829: }
54830:
54831: assert(nOverflow>0 || iOverflow<i );
1.2.2.1 ! misho 54832: assert(nOverflow<2 || pOld->aiOvfl[0]==pOld->aiOvfl[1]-1);
! 54833: assert(nOverflow<3 || pOld->aiOvfl[1]==pOld->aiOvfl[2]-1);
1.2 misho 54834: if( i==iOverflow ){
54835: isDivider = 1;
54836: if( (--nOverflow)>0 ){
54837: iOverflow++;
54838: }
54839: }
54840:
54841: if( i==cntNew[k] ){
54842: /* Cell i is the cell immediately following the last cell on new
54843: ** sibling page k. If the siblings are not leaf pages of an
54844: ** intkey b-tree, then cell i is a divider cell. */
54845: pNew = apNew[++k];
54846: if( !leafData ) continue;
54847: }
54848: assert( j<nOld );
54849: assert( k<nNew );
54850:
54851: /* If the cell was originally divider cell (and is not now) or
54852: ** an overflow cell, or if the cell was located on a different sibling
54853: ** page before the balancing, then the pointer map entries associated
54854: ** with any child or overflow pages need to be updated. */
54855: if( isDivider || pOld->pgno!=pNew->pgno ){
54856: if( !leafCorrection ){
54857: ptrmapPut(pBt, get4byte(apCell[i]), PTRMAP_BTREE, pNew->pgno, &rc);
54858: }
54859: if( szCell[i]>pNew->minLocal ){
54860: ptrmapPutOvflPtr(pNew, apCell[i], &rc);
54861: }
54862: }
54863: }
54864:
54865: if( !leafCorrection ){
54866: for(i=0; i<nNew; i++){
54867: u32 key = get4byte(&apNew[i]->aData[8]);
54868: ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc);
54869: }
54870: }
54871:
54872: #if 0
54873: /* The ptrmapCheckPages() contains assert() statements that verify that
54874: ** all pointer map pages are set correctly. This is helpful while
54875: ** debugging. This is usually disabled because a corrupt database may
54876: ** cause an assert() statement to fail. */
54877: ptrmapCheckPages(apNew, nNew);
54878: ptrmapCheckPages(&pParent, 1);
54879: #endif
54880: }
54881:
54882: assert( pParent->isInit );
54883: TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n",
54884: nOld, nNew, nCell));
54885:
54886: /*
54887: ** Cleanup before returning.
54888: */
54889: balance_cleanup:
54890: sqlite3ScratchFree(apCell);
54891: for(i=0; i<nOld; i++){
54892: releasePage(apOld[i]);
54893: }
54894: for(i=0; i<nNew; i++){
54895: releasePage(apNew[i]);
54896: }
54897:
54898: return rc;
54899: }
1.2.2.1 ! misho 54900: #if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM)
! 54901: #pragma optimize("", on)
! 54902: #endif
1.2 misho 54903:
54904:
54905: /*
54906: ** This function is called when the root page of a b-tree structure is
54907: ** overfull (has one or more overflow pages).
54908: **
54909: ** A new child page is allocated and the contents of the current root
54910: ** page, including overflow cells, are copied into the child. The root
54911: ** page is then overwritten to make it an empty page with the right-child
54912: ** pointer pointing to the new page.
54913: **
54914: ** Before returning, all pointer-map entries corresponding to pages
54915: ** that the new child-page now contains pointers to are updated. The
54916: ** entry corresponding to the new right-child pointer of the root
54917: ** page is also updated.
54918: **
54919: ** If successful, *ppChild is set to contain a reference to the child
54920: ** page and SQLITE_OK is returned. In this case the caller is required
54921: ** to call releasePage() on *ppChild exactly once. If an error occurs,
54922: ** an error code is returned and *ppChild is set to 0.
54923: */
54924: static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
54925: int rc; /* Return value from subprocedures */
54926: MemPage *pChild = 0; /* Pointer to a new child page */
54927: Pgno pgnoChild = 0; /* Page number of the new child page */
54928: BtShared *pBt = pRoot->pBt; /* The BTree */
54929:
54930: assert( pRoot->nOverflow>0 );
54931: assert( sqlite3_mutex_held(pBt->mutex) );
54932:
54933: /* Make pRoot, the root page of the b-tree, writable. Allocate a new
54934: ** page that will become the new right-child of pPage. Copy the contents
54935: ** of the node stored on pRoot into the new child page.
54936: */
54937: rc = sqlite3PagerWrite(pRoot->pDbPage);
54938: if( rc==SQLITE_OK ){
54939: rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0);
54940: copyNodeContent(pRoot, pChild, &rc);
54941: if( ISAUTOVACUUM ){
54942: ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc);
54943: }
54944: }
54945: if( rc ){
54946: *ppChild = 0;
54947: releasePage(pChild);
54948: return rc;
54949: }
54950: assert( sqlite3PagerIswriteable(pChild->pDbPage) );
54951: assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
54952: assert( pChild->nCell==pRoot->nCell );
54953:
54954: TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno));
54955:
54956: /* Copy the overflow cells from pRoot to pChild */
1.2.2.1 ! misho 54957: memcpy(pChild->aiOvfl, pRoot->aiOvfl,
! 54958: pRoot->nOverflow*sizeof(pRoot->aiOvfl[0]));
! 54959: memcpy(pChild->apOvfl, pRoot->apOvfl,
! 54960: pRoot->nOverflow*sizeof(pRoot->apOvfl[0]));
1.2 misho 54961: pChild->nOverflow = pRoot->nOverflow;
54962:
54963: /* Zero the contents of pRoot. Then install pChild as the right-child. */
54964: zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF);
54965: put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild);
54966:
54967: *ppChild = pChild;
54968: return SQLITE_OK;
54969: }
54970:
54971: /*
54972: ** The page that pCur currently points to has just been modified in
54973: ** some way. This function figures out if this modification means the
54974: ** tree needs to be balanced, and if so calls the appropriate balancing
54975: ** routine. Balancing routines are:
54976: **
54977: ** balance_quick()
54978: ** balance_deeper()
54979: ** balance_nonroot()
54980: */
54981: static int balance(BtCursor *pCur){
54982: int rc = SQLITE_OK;
54983: const int nMin = pCur->pBt->usableSize * 2 / 3;
54984: u8 aBalanceQuickSpace[13];
54985: u8 *pFree = 0;
54986:
54987: TESTONLY( int balance_quick_called = 0 );
54988: TESTONLY( int balance_deeper_called = 0 );
54989:
54990: do {
54991: int iPage = pCur->iPage;
54992: MemPage *pPage = pCur->apPage[iPage];
54993:
54994: if( iPage==0 ){
54995: if( pPage->nOverflow ){
54996: /* The root page of the b-tree is overfull. In this case call the
54997: ** balance_deeper() function to create a new child for the root-page
54998: ** and copy the current contents of the root-page to it. The
54999: ** next iteration of the do-loop will balance the child page.
55000: */
55001: assert( (balance_deeper_called++)==0 );
55002: rc = balance_deeper(pPage, &pCur->apPage[1]);
55003: if( rc==SQLITE_OK ){
55004: pCur->iPage = 1;
55005: pCur->aiIdx[0] = 0;
55006: pCur->aiIdx[1] = 0;
55007: assert( pCur->apPage[1]->nOverflow );
55008: }
55009: }else{
55010: break;
55011: }
55012: }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){
55013: break;
55014: }else{
55015: MemPage * const pParent = pCur->apPage[iPage-1];
55016: int const iIdx = pCur->aiIdx[iPage-1];
55017:
55018: rc = sqlite3PagerWrite(pParent->pDbPage);
55019: if( rc==SQLITE_OK ){
55020: #ifndef SQLITE_OMIT_QUICKBALANCE
55021: if( pPage->hasData
55022: && pPage->nOverflow==1
1.2.2.1 ! misho 55023: && pPage->aiOvfl[0]==pPage->nCell
1.2 misho 55024: && pParent->pgno!=1
55025: && pParent->nCell==iIdx
55026: ){
55027: /* Call balance_quick() to create a new sibling of pPage on which
55028: ** to store the overflow cell. balance_quick() inserts a new cell
55029: ** into pParent, which may cause pParent overflow. If this
55030: ** happens, the next interation of the do-loop will balance pParent
55031: ** use either balance_nonroot() or balance_deeper(). Until this
55032: ** happens, the overflow cell is stored in the aBalanceQuickSpace[]
55033: ** buffer.
55034: **
55035: ** The purpose of the following assert() is to check that only a
55036: ** single call to balance_quick() is made for each call to this
55037: ** function. If this were not verified, a subtle bug involving reuse
55038: ** of the aBalanceQuickSpace[] might sneak in.
55039: */
55040: assert( (balance_quick_called++)==0 );
55041: rc = balance_quick(pParent, pPage, aBalanceQuickSpace);
55042: }else
55043: #endif
55044: {
55045: /* In this case, call balance_nonroot() to redistribute cells
55046: ** between pPage and up to 2 of its sibling pages. This involves
55047: ** modifying the contents of pParent, which may cause pParent to
55048: ** become overfull or underfull. The next iteration of the do-loop
55049: ** will balance the parent page to correct this.
55050: **
55051: ** If the parent page becomes overfull, the overflow cell or cells
55052: ** are stored in the pSpace buffer allocated immediately below.
55053: ** A subsequent iteration of the do-loop will deal with this by
55054: ** calling balance_nonroot() (balance_deeper() may be called first,
55055: ** but it doesn't deal with overflow cells - just moves them to a
55056: ** different page). Once this subsequent call to balance_nonroot()
55057: ** has completed, it is safe to release the pSpace buffer used by
55058: ** the previous call, as the overflow cell data will have been
55059: ** copied either into the body of a database page or into the new
55060: ** pSpace buffer passed to the latter call to balance_nonroot().
55061: */
55062: u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize);
1.2.2.1 ! misho 55063: rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, pCur->hints);
1.2 misho 55064: if( pFree ){
55065: /* If pFree is not NULL, it points to the pSpace buffer used
55066: ** by a previous call to balance_nonroot(). Its contents are
55067: ** now stored either on real database pages or within the
55068: ** new pSpace buffer, so it may be safely freed here. */
55069: sqlite3PageFree(pFree);
55070: }
55071:
55072: /* The pSpace buffer will be freed after the next call to
55073: ** balance_nonroot(), or just before this function returns, whichever
55074: ** comes first. */
55075: pFree = pSpace;
55076: }
55077: }
55078:
55079: pPage->nOverflow = 0;
55080:
55081: /* The next iteration of the do-loop balances the parent page. */
55082: releasePage(pPage);
55083: pCur->iPage--;
55084: }
55085: }while( rc==SQLITE_OK );
55086:
55087: if( pFree ){
55088: sqlite3PageFree(pFree);
55089: }
55090: return rc;
55091: }
55092:
55093:
55094: /*
55095: ** Insert a new record into the BTree. The key is given by (pKey,nKey)
55096: ** and the data is given by (pData,nData). The cursor is used only to
55097: ** define what table the record should be inserted into. The cursor
55098: ** is left pointing at a random location.
55099: **
55100: ** For an INTKEY table, only the nKey value of the key is used. pKey is
55101: ** ignored. For a ZERODATA table, the pData and nData are both ignored.
55102: **
55103: ** If the seekResult parameter is non-zero, then a successful call to
55104: ** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already
55105: ** been performed. seekResult is the search result returned (a negative
55106: ** number if pCur points at an entry that is smaller than (pKey, nKey), or
55107: ** a positive value if pCur points at an etry that is larger than
55108: ** (pKey, nKey)).
55109: **
55110: ** If the seekResult parameter is non-zero, then the caller guarantees that
55111: ** cursor pCur is pointing at the existing copy of a row that is to be
55112: ** overwritten. If the seekResult parameter is 0, then cursor pCur may
55113: ** point to any entry or to no entry at all and so this function has to seek
55114: ** the cursor before the new key can be inserted.
55115: */
55116: SQLITE_PRIVATE int sqlite3BtreeInsert(
55117: BtCursor *pCur, /* Insert data into the table of this cursor */
55118: const void *pKey, i64 nKey, /* The key of the new record */
55119: const void *pData, int nData, /* The data of the new record */
55120: int nZero, /* Number of extra 0 bytes to append to data */
55121: int appendBias, /* True if this is likely an append */
55122: int seekResult /* Result of prior MovetoUnpacked() call */
55123: ){
55124: int rc;
55125: int loc = seekResult; /* -1: before desired location +1: after */
55126: int szNew = 0;
55127: int idx;
55128: MemPage *pPage;
55129: Btree *p = pCur->pBtree;
55130: BtShared *pBt = p->pBt;
55131: unsigned char *oldCell;
55132: unsigned char *newCell = 0;
55133:
55134: if( pCur->eState==CURSOR_FAULT ){
55135: assert( pCur->skipNext!=SQLITE_OK );
55136: return pCur->skipNext;
55137: }
55138:
55139: assert( cursorHoldsMutex(pCur) );
55140: assert( pCur->wrFlag && pBt->inTransaction==TRANS_WRITE
55141: && (pBt->btsFlags & BTS_READ_ONLY)==0 );
55142: assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
55143:
55144: /* Assert that the caller has been consistent. If this cursor was opened
55145: ** expecting an index b-tree, then the caller should be inserting blob
55146: ** keys with no associated data. If the cursor was opened expecting an
55147: ** intkey table, the caller should be inserting integer keys with a
55148: ** blob of associated data. */
55149: assert( (pKey==0)==(pCur->pKeyInfo==0) );
55150:
55151: /* Save the positions of any other cursors open on this table.
55152: **
55153: ** In some cases, the call to btreeMoveto() below is a no-op. For
55154: ** example, when inserting data into a table with auto-generated integer
55155: ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the
55156: ** integer key to use. It then calls this function to actually insert the
55157: ** data into the intkey B-Tree. In this case btreeMoveto() recognizes
55158: ** that the cursor is already where it needs to be and returns without
55159: ** doing any work. To avoid thwarting these optimizations, it is important
55160: ** not to clear the cursor here.
55161: */
55162: rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
55163: if( rc ) return rc;
1.2.2.1 ! misho 55164:
! 55165: /* If this is an insert into a table b-tree, invalidate any incrblob
! 55166: ** cursors open on the row being replaced (assuming this is a replace
! 55167: ** operation - if it is not, the following is a no-op). */
! 55168: if( pCur->pKeyInfo==0 ){
! 55169: invalidateIncrblobCursors(p, nKey, 0);
! 55170: }
! 55171:
1.2 misho 55172: if( !loc ){
55173: rc = btreeMoveto(pCur, pKey, nKey, appendBias, &loc);
55174: if( rc ) return rc;
55175: }
55176: assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) );
55177:
55178: pPage = pCur->apPage[pCur->iPage];
55179: assert( pPage->intKey || nKey>=0 );
55180: assert( pPage->leaf || !pPage->intKey );
55181:
55182: TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n",
55183: pCur->pgnoRoot, nKey, nData, pPage->pgno,
55184: loc==0 ? "overwrite" : "new entry"));
55185: assert( pPage->isInit );
55186: allocateTempSpace(pBt);
55187: newCell = pBt->pTmpSpace;
55188: if( newCell==0 ) return SQLITE_NOMEM;
55189: rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew);
55190: if( rc ) goto end_insert;
55191: assert( szNew==cellSizePtr(pPage, newCell) );
55192: assert( szNew <= MX_CELL_SIZE(pBt) );
55193: idx = pCur->aiIdx[pCur->iPage];
55194: if( loc==0 ){
55195: u16 szOld;
55196: assert( idx<pPage->nCell );
55197: rc = sqlite3PagerWrite(pPage->pDbPage);
55198: if( rc ){
55199: goto end_insert;
55200: }
55201: oldCell = findCell(pPage, idx);
55202: if( !pPage->leaf ){
55203: memcpy(newCell, oldCell, 4);
55204: }
55205: szOld = cellSizePtr(pPage, oldCell);
55206: rc = clearCell(pPage, oldCell);
55207: dropCell(pPage, idx, szOld, &rc);
55208: if( rc ) goto end_insert;
55209: }else if( loc<0 && pPage->nCell>0 ){
55210: assert( pPage->leaf );
55211: idx = ++pCur->aiIdx[pCur->iPage];
55212: }else{
55213: assert( pPage->leaf );
55214: }
55215: insertCell(pPage, idx, newCell, szNew, 0, 0, &rc);
55216: assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 );
55217:
55218: /* If no error has occured and pPage has an overflow cell, call balance()
55219: ** to redistribute the cells within the tree. Since balance() may move
55220: ** the cursor, zero the BtCursor.info.nSize and BtCursor.validNKey
55221: ** variables.
55222: **
55223: ** Previous versions of SQLite called moveToRoot() to move the cursor
55224: ** back to the root page as balance() used to invalidate the contents
55225: ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that,
55226: ** set the cursor state to "invalid". This makes common insert operations
55227: ** slightly faster.
55228: **
55229: ** There is a subtle but important optimization here too. When inserting
55230: ** multiple records into an intkey b-tree using a single cursor (as can
55231: ** happen while processing an "INSERT INTO ... SELECT" statement), it
55232: ** is advantageous to leave the cursor pointing to the last entry in
55233: ** the b-tree if possible. If the cursor is left pointing to the last
55234: ** entry in the table, and the next row inserted has an integer key
55235: ** larger than the largest existing key, it is possible to insert the
55236: ** row without seeking the cursor. This can be a big performance boost.
55237: */
55238: pCur->info.nSize = 0;
55239: pCur->validNKey = 0;
55240: if( rc==SQLITE_OK && pPage->nOverflow ){
55241: rc = balance(pCur);
55242:
55243: /* Must make sure nOverflow is reset to zero even if the balance()
55244: ** fails. Internal data structure corruption will result otherwise.
55245: ** Also, set the cursor state to invalid. This stops saveCursorPosition()
55246: ** from trying to save the current position of the cursor. */
55247: pCur->apPage[pCur->iPage]->nOverflow = 0;
55248: pCur->eState = CURSOR_INVALID;
55249: }
55250: assert( pCur->apPage[pCur->iPage]->nOverflow==0 );
55251:
55252: end_insert:
55253: return rc;
55254: }
55255:
55256: /*
55257: ** Delete the entry that the cursor is pointing to. The cursor
55258: ** is left pointing at a arbitrary location.
55259: */
55260: SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){
55261: Btree *p = pCur->pBtree;
55262: BtShared *pBt = p->pBt;
55263: int rc; /* Return code */
55264: MemPage *pPage; /* Page to delete cell from */
55265: unsigned char *pCell; /* Pointer to cell to delete */
55266: int iCellIdx; /* Index of cell to delete */
55267: int iCellDepth; /* Depth of node containing pCell */
55268:
55269: assert( cursorHoldsMutex(pCur) );
55270: assert( pBt->inTransaction==TRANS_WRITE );
55271: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
55272: assert( pCur->wrFlag );
55273: assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
55274: assert( !hasReadConflicts(p, pCur->pgnoRoot) );
55275:
55276: if( NEVER(pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell)
55277: || NEVER(pCur->eState!=CURSOR_VALID)
55278: ){
55279: return SQLITE_ERROR; /* Something has gone awry. */
55280: }
55281:
55282: iCellDepth = pCur->iPage;
55283: iCellIdx = pCur->aiIdx[iCellDepth];
55284: pPage = pCur->apPage[iCellDepth];
55285: pCell = findCell(pPage, iCellIdx);
55286:
55287: /* If the page containing the entry to delete is not a leaf page, move
55288: ** the cursor to the largest entry in the tree that is smaller than
55289: ** the entry being deleted. This cell will replace the cell being deleted
55290: ** from the internal node. The 'previous' entry is used for this instead
55291: ** of the 'next' entry, as the previous entry is always a part of the
55292: ** sub-tree headed by the child page of the cell being deleted. This makes
55293: ** balancing the tree following the delete operation easier. */
55294: if( !pPage->leaf ){
55295: int notUsed;
55296: rc = sqlite3BtreePrevious(pCur, ¬Used);
55297: if( rc ) return rc;
55298: }
55299:
55300: /* Save the positions of any other cursors open on this table before
55301: ** making any modifications. Make the page containing the entry to be
55302: ** deleted writable. Then free any overflow pages associated with the
55303: ** entry and finally remove the cell itself from within the page.
55304: */
55305: rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
55306: if( rc ) return rc;
1.2.2.1 ! misho 55307:
! 55308: /* If this is a delete operation to remove a row from a table b-tree,
! 55309: ** invalidate any incrblob cursors open on the row being deleted. */
! 55310: if( pCur->pKeyInfo==0 ){
! 55311: invalidateIncrblobCursors(p, pCur->info.nKey, 0);
! 55312: }
! 55313:
1.2 misho 55314: rc = sqlite3PagerWrite(pPage->pDbPage);
55315: if( rc ) return rc;
55316: rc = clearCell(pPage, pCell);
55317: dropCell(pPage, iCellIdx, cellSizePtr(pPage, pCell), &rc);
55318: if( rc ) return rc;
55319:
55320: /* If the cell deleted was not located on a leaf page, then the cursor
55321: ** is currently pointing to the largest entry in the sub-tree headed
55322: ** by the child-page of the cell that was just deleted from an internal
55323: ** node. The cell from the leaf node needs to be moved to the internal
55324: ** node to replace the deleted cell. */
55325: if( !pPage->leaf ){
55326: MemPage *pLeaf = pCur->apPage[pCur->iPage];
55327: int nCell;
55328: Pgno n = pCur->apPage[iCellDepth+1]->pgno;
55329: unsigned char *pTmp;
55330:
55331: pCell = findCell(pLeaf, pLeaf->nCell-1);
55332: nCell = cellSizePtr(pLeaf, pCell);
55333: assert( MX_CELL_SIZE(pBt) >= nCell );
55334:
55335: allocateTempSpace(pBt);
55336: pTmp = pBt->pTmpSpace;
55337:
55338: rc = sqlite3PagerWrite(pLeaf->pDbPage);
55339: insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc);
55340: dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc);
55341: if( rc ) return rc;
55342: }
55343:
55344: /* Balance the tree. If the entry deleted was located on a leaf page,
55345: ** then the cursor still points to that page. In this case the first
55346: ** call to balance() repairs the tree, and the if(...) condition is
55347: ** never true.
55348: **
55349: ** Otherwise, if the entry deleted was on an internal node page, then
55350: ** pCur is pointing to the leaf page from which a cell was removed to
55351: ** replace the cell deleted from the internal node. This is slightly
55352: ** tricky as the leaf node may be underfull, and the internal node may
55353: ** be either under or overfull. In this case run the balancing algorithm
55354: ** on the leaf node first. If the balance proceeds far enough up the
55355: ** tree that we can be sure that any problem in the internal node has
55356: ** been corrected, so be it. Otherwise, after balancing the leaf node,
55357: ** walk the cursor up the tree to the internal node and balance it as
55358: ** well. */
55359: rc = balance(pCur);
55360: if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){
55361: while( pCur->iPage>iCellDepth ){
55362: releasePage(pCur->apPage[pCur->iPage--]);
55363: }
55364: rc = balance(pCur);
55365: }
55366:
55367: if( rc==SQLITE_OK ){
55368: moveToRoot(pCur);
55369: }
55370: return rc;
55371: }
55372:
55373: /*
55374: ** Create a new BTree table. Write into *piTable the page
55375: ** number for the root page of the new table.
55376: **
55377: ** The type of type is determined by the flags parameter. Only the
55378: ** following values of flags are currently in use. Other values for
55379: ** flags might not work:
55380: **
55381: ** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys
55382: ** BTREE_ZERODATA Used for SQL indices
55383: */
55384: static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){
55385: BtShared *pBt = p->pBt;
55386: MemPage *pRoot;
55387: Pgno pgnoRoot;
55388: int rc;
55389: int ptfFlags; /* Page-type flage for the root page of new table */
55390:
55391: assert( sqlite3BtreeHoldsMutex(p) );
55392: assert( pBt->inTransaction==TRANS_WRITE );
55393: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
55394:
55395: #ifdef SQLITE_OMIT_AUTOVACUUM
55396: rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0);
55397: if( rc ){
55398: return rc;
55399: }
55400: #else
55401: if( pBt->autoVacuum ){
55402: Pgno pgnoMove; /* Move a page here to make room for the root-page */
55403: MemPage *pPageMove; /* The page to move to. */
55404:
55405: /* Creating a new table may probably require moving an existing database
55406: ** to make room for the new tables root page. In case this page turns
55407: ** out to be an overflow page, delete all overflow page-map caches
55408: ** held by open cursors.
55409: */
55410: invalidateAllOverflowCache(pBt);
55411:
55412: /* Read the value of meta[3] from the database to determine where the
55413: ** root page of the new table should go. meta[3] is the largest root-page
55414: ** created so far, so the new root-page is (meta[3]+1).
55415: */
55416: sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot);
55417: pgnoRoot++;
55418:
55419: /* The new root-page may not be allocated on a pointer-map page, or the
55420: ** PENDING_BYTE page.
55421: */
55422: while( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) ||
55423: pgnoRoot==PENDING_BYTE_PAGE(pBt) ){
55424: pgnoRoot++;
55425: }
55426: assert( pgnoRoot>=3 );
55427:
55428: /* Allocate a page. The page that currently resides at pgnoRoot will
55429: ** be moved to the allocated page (unless the allocated page happens
55430: ** to reside at pgnoRoot).
55431: */
55432: rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, 1);
55433: if( rc!=SQLITE_OK ){
55434: return rc;
55435: }
55436:
55437: if( pgnoMove!=pgnoRoot ){
55438: /* pgnoRoot is the page that will be used for the root-page of
55439: ** the new table (assuming an error did not occur). But we were
55440: ** allocated pgnoMove. If required (i.e. if it was not allocated
55441: ** by extending the file), the current page at position pgnoMove
55442: ** is already journaled.
55443: */
55444: u8 eType = 0;
55445: Pgno iPtrPage = 0;
55446:
55447: releasePage(pPageMove);
55448:
55449: /* Move the page currently at pgnoRoot to pgnoMove. */
55450: rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
55451: if( rc!=SQLITE_OK ){
55452: return rc;
55453: }
55454: rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage);
55455: if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){
55456: rc = SQLITE_CORRUPT_BKPT;
55457: }
55458: if( rc!=SQLITE_OK ){
55459: releasePage(pRoot);
55460: return rc;
55461: }
55462: assert( eType!=PTRMAP_ROOTPAGE );
55463: assert( eType!=PTRMAP_FREEPAGE );
55464: rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0);
55465: releasePage(pRoot);
55466:
55467: /* Obtain the page at pgnoRoot */
55468: if( rc!=SQLITE_OK ){
55469: return rc;
55470: }
55471: rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
55472: if( rc!=SQLITE_OK ){
55473: return rc;
55474: }
55475: rc = sqlite3PagerWrite(pRoot->pDbPage);
55476: if( rc!=SQLITE_OK ){
55477: releasePage(pRoot);
55478: return rc;
55479: }
55480: }else{
55481: pRoot = pPageMove;
55482: }
55483:
55484: /* Update the pointer-map and meta-data with the new root-page number. */
55485: ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc);
55486: if( rc ){
55487: releasePage(pRoot);
55488: return rc;
55489: }
55490:
55491: /* When the new root page was allocated, page 1 was made writable in
55492: ** order either to increase the database filesize, or to decrement the
55493: ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail.
55494: */
55495: assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) );
55496: rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot);
55497: if( NEVER(rc) ){
55498: releasePage(pRoot);
55499: return rc;
55500: }
55501:
55502: }else{
55503: rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0);
55504: if( rc ) return rc;
55505: }
55506: #endif
55507: assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
55508: if( createTabFlags & BTREE_INTKEY ){
55509: ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF;
55510: }else{
55511: ptfFlags = PTF_ZERODATA | PTF_LEAF;
55512: }
55513: zeroPage(pRoot, ptfFlags);
55514: sqlite3PagerUnref(pRoot->pDbPage);
55515: assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 );
55516: *piTable = (int)pgnoRoot;
55517: return SQLITE_OK;
55518: }
55519: SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){
55520: int rc;
55521: sqlite3BtreeEnter(p);
55522: rc = btreeCreateTable(p, piTable, flags);
55523: sqlite3BtreeLeave(p);
55524: return rc;
55525: }
55526:
55527: /*
55528: ** Erase the given database page and all its children. Return
55529: ** the page to the freelist.
55530: */
55531: static int clearDatabasePage(
55532: BtShared *pBt, /* The BTree that contains the table */
55533: Pgno pgno, /* Page number to clear */
55534: int freePageFlag, /* Deallocate page if true */
55535: int *pnChange /* Add number of Cells freed to this counter */
55536: ){
55537: MemPage *pPage;
55538: int rc;
55539: unsigned char *pCell;
55540: int i;
55541:
55542: assert( sqlite3_mutex_held(pBt->mutex) );
55543: if( pgno>btreePagecount(pBt) ){
55544: return SQLITE_CORRUPT_BKPT;
55545: }
55546:
55547: rc = getAndInitPage(pBt, pgno, &pPage);
55548: if( rc ) return rc;
55549: for(i=0; i<pPage->nCell; i++){
55550: pCell = findCell(pPage, i);
55551: if( !pPage->leaf ){
55552: rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange);
55553: if( rc ) goto cleardatabasepage_out;
55554: }
55555: rc = clearCell(pPage, pCell);
55556: if( rc ) goto cleardatabasepage_out;
55557: }
55558: if( !pPage->leaf ){
55559: rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), 1, pnChange);
55560: if( rc ) goto cleardatabasepage_out;
55561: }else if( pnChange ){
55562: assert( pPage->intKey );
55563: *pnChange += pPage->nCell;
55564: }
55565: if( freePageFlag ){
55566: freePage(pPage, &rc);
55567: }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){
55568: zeroPage(pPage, pPage->aData[0] | PTF_LEAF);
55569: }
55570:
55571: cleardatabasepage_out:
55572: releasePage(pPage);
55573: return rc;
55574: }
55575:
55576: /*
55577: ** Delete all information from a single table in the database. iTable is
55578: ** the page number of the root of the table. After this routine returns,
55579: ** the root page is empty, but still exists.
55580: **
55581: ** This routine will fail with SQLITE_LOCKED if there are any open
55582: ** read cursors on the table. Open write cursors are moved to the
55583: ** root of the table.
55584: **
55585: ** If pnChange is not NULL, then table iTable must be an intkey table. The
55586: ** integer value pointed to by pnChange is incremented by the number of
55587: ** entries in the table.
55588: */
55589: SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){
55590: int rc;
55591: BtShared *pBt = p->pBt;
55592: sqlite3BtreeEnter(p);
55593: assert( p->inTrans==TRANS_WRITE );
55594:
55595: rc = saveAllCursors(pBt, (Pgno)iTable, 0);
1.2.2.1 ! misho 55596:
1.2 misho 55597: if( SQLITE_OK==rc ){
1.2.2.1 ! misho 55598: /* Invalidate all incrblob cursors open on table iTable (assuming iTable
! 55599: ** is the root of a table b-tree - if it is not, the following call is
! 55600: ** a no-op). */
! 55601: invalidateIncrblobCursors(p, 0, 1);
1.2 misho 55602: rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange);
55603: }
55604: sqlite3BtreeLeave(p);
55605: return rc;
55606: }
55607:
55608: /*
55609: ** Erase all information in a table and add the root of the table to
55610: ** the freelist. Except, the root of the principle table (the one on
55611: ** page 1) is never added to the freelist.
55612: **
55613: ** This routine will fail with SQLITE_LOCKED if there are any open
55614: ** cursors on the table.
55615: **
55616: ** If AUTOVACUUM is enabled and the page at iTable is not the last
55617: ** root page in the database file, then the last root page
55618: ** in the database file is moved into the slot formerly occupied by
55619: ** iTable and that last slot formerly occupied by the last root page
55620: ** is added to the freelist instead of iTable. In this say, all
55621: ** root pages are kept at the beginning of the database file, which
55622: ** is necessary for AUTOVACUUM to work right. *piMoved is set to the
55623: ** page number that used to be the last root page in the file before
55624: ** the move. If no page gets moved, *piMoved is set to 0.
55625: ** The last root page is recorded in meta[3] and the value of
55626: ** meta[3] is updated by this procedure.
55627: */
55628: static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){
55629: int rc;
55630: MemPage *pPage = 0;
55631: BtShared *pBt = p->pBt;
55632:
55633: assert( sqlite3BtreeHoldsMutex(p) );
55634: assert( p->inTrans==TRANS_WRITE );
55635:
55636: /* It is illegal to drop a table if any cursors are open on the
55637: ** database. This is because in auto-vacuum mode the backend may
55638: ** need to move another root-page to fill a gap left by the deleted
55639: ** root page. If an open cursor was using this page a problem would
55640: ** occur.
55641: **
55642: ** This error is caught long before control reaches this point.
55643: */
55644: if( NEVER(pBt->pCursor) ){
55645: sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db);
55646: return SQLITE_LOCKED_SHAREDCACHE;
55647: }
55648:
55649: rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
55650: if( rc ) return rc;
55651: rc = sqlite3BtreeClearTable(p, iTable, 0);
55652: if( rc ){
55653: releasePage(pPage);
55654: return rc;
55655: }
55656:
55657: *piMoved = 0;
55658:
55659: if( iTable>1 ){
55660: #ifdef SQLITE_OMIT_AUTOVACUUM
55661: freePage(pPage, &rc);
55662: releasePage(pPage);
55663: #else
55664: if( pBt->autoVacuum ){
55665: Pgno maxRootPgno;
55666: sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno);
55667:
55668: if( iTable==maxRootPgno ){
55669: /* If the table being dropped is the table with the largest root-page
55670: ** number in the database, put the root page on the free list.
55671: */
55672: freePage(pPage, &rc);
55673: releasePage(pPage);
55674: if( rc!=SQLITE_OK ){
55675: return rc;
55676: }
55677: }else{
55678: /* The table being dropped does not have the largest root-page
55679: ** number in the database. So move the page that does into the
55680: ** gap left by the deleted root-page.
55681: */
55682: MemPage *pMove;
55683: releasePage(pPage);
55684: rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
55685: if( rc!=SQLITE_OK ){
55686: return rc;
55687: }
55688: rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0);
55689: releasePage(pMove);
55690: if( rc!=SQLITE_OK ){
55691: return rc;
55692: }
55693: pMove = 0;
55694: rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
55695: freePage(pMove, &rc);
55696: releasePage(pMove);
55697: if( rc!=SQLITE_OK ){
55698: return rc;
55699: }
55700: *piMoved = maxRootPgno;
55701: }
55702:
55703: /* Set the new 'max-root-page' value in the database header. This
55704: ** is the old value less one, less one more if that happens to
55705: ** be a root-page number, less one again if that is the
55706: ** PENDING_BYTE_PAGE.
55707: */
55708: maxRootPgno--;
55709: while( maxRootPgno==PENDING_BYTE_PAGE(pBt)
55710: || PTRMAP_ISPAGE(pBt, maxRootPgno) ){
55711: maxRootPgno--;
55712: }
55713: assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) );
55714:
55715: rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno);
55716: }else{
55717: freePage(pPage, &rc);
55718: releasePage(pPage);
55719: }
55720: #endif
55721: }else{
55722: /* If sqlite3BtreeDropTable was called on page 1.
55723: ** This really never should happen except in a corrupt
55724: ** database.
55725: */
55726: zeroPage(pPage, PTF_INTKEY|PTF_LEAF );
55727: releasePage(pPage);
55728: }
55729: return rc;
55730: }
55731: SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){
55732: int rc;
55733: sqlite3BtreeEnter(p);
55734: rc = btreeDropTable(p, iTable, piMoved);
55735: sqlite3BtreeLeave(p);
55736: return rc;
55737: }
55738:
55739:
55740: /*
55741: ** This function may only be called if the b-tree connection already
55742: ** has a read or write transaction open on the database.
55743: **
55744: ** Read the meta-information out of a database file. Meta[0]
55745: ** is the number of free pages currently in the database. Meta[1]
55746: ** through meta[15] are available for use by higher layers. Meta[0]
55747: ** is read-only, the others are read/write.
55748: **
55749: ** The schema layer numbers meta values differently. At the schema
55750: ** layer (and the SetCookie and ReadCookie opcodes) the number of
55751: ** free pages is not visible. So Cookie[0] is the same as Meta[1].
55752: */
55753: SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){
55754: BtShared *pBt = p->pBt;
55755:
55756: sqlite3BtreeEnter(p);
55757: assert( p->inTrans>TRANS_NONE );
55758: assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) );
55759: assert( pBt->pPage1 );
55760: assert( idx>=0 && idx<=15 );
55761:
55762: *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]);
55763:
55764: /* If auto-vacuum is disabled in this build and this is an auto-vacuum
55765: ** database, mark the database as read-only. */
55766: #ifdef SQLITE_OMIT_AUTOVACUUM
55767: if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){
55768: pBt->btsFlags |= BTS_READ_ONLY;
55769: }
55770: #endif
55771:
55772: sqlite3BtreeLeave(p);
55773: }
55774:
55775: /*
55776: ** Write meta-information back into the database. Meta[0] is
55777: ** read-only and may not be written.
55778: */
55779: SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){
55780: BtShared *pBt = p->pBt;
55781: unsigned char *pP1;
55782: int rc;
55783: assert( idx>=1 && idx<=15 );
55784: sqlite3BtreeEnter(p);
55785: assert( p->inTrans==TRANS_WRITE );
55786: assert( pBt->pPage1!=0 );
55787: pP1 = pBt->pPage1->aData;
55788: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
55789: if( rc==SQLITE_OK ){
55790: put4byte(&pP1[36 + idx*4], iMeta);
55791: #ifndef SQLITE_OMIT_AUTOVACUUM
55792: if( idx==BTREE_INCR_VACUUM ){
55793: assert( pBt->autoVacuum || iMeta==0 );
55794: assert( iMeta==0 || iMeta==1 );
55795: pBt->incrVacuum = (u8)iMeta;
55796: }
55797: #endif
55798: }
55799: sqlite3BtreeLeave(p);
55800: return rc;
55801: }
55802:
55803: #ifndef SQLITE_OMIT_BTREECOUNT
55804: /*
55805: ** The first argument, pCur, is a cursor opened on some b-tree. Count the
55806: ** number of entries in the b-tree and write the result to *pnEntry.
55807: **
55808: ** SQLITE_OK is returned if the operation is successfully executed.
55809: ** Otherwise, if an error is encountered (i.e. an IO error or database
55810: ** corruption) an SQLite error code is returned.
55811: */
55812: SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){
55813: i64 nEntry = 0; /* Value to return in *pnEntry */
55814: int rc; /* Return code */
55815:
55816: if( pCur->pgnoRoot==0 ){
55817: *pnEntry = 0;
55818: return SQLITE_OK;
55819: }
55820: rc = moveToRoot(pCur);
55821:
55822: /* Unless an error occurs, the following loop runs one iteration for each
55823: ** page in the B-Tree structure (not including overflow pages).
55824: */
55825: while( rc==SQLITE_OK ){
55826: int iIdx; /* Index of child node in parent */
55827: MemPage *pPage; /* Current page of the b-tree */
55828:
55829: /* If this is a leaf page or the tree is not an int-key tree, then
55830: ** this page contains countable entries. Increment the entry counter
55831: ** accordingly.
55832: */
55833: pPage = pCur->apPage[pCur->iPage];
55834: if( pPage->leaf || !pPage->intKey ){
55835: nEntry += pPage->nCell;
55836: }
55837:
55838: /* pPage is a leaf node. This loop navigates the cursor so that it
55839: ** points to the first interior cell that it points to the parent of
55840: ** the next page in the tree that has not yet been visited. The
55841: ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell
55842: ** of the page, or to the number of cells in the page if the next page
55843: ** to visit is the right-child of its parent.
55844: **
55845: ** If all pages in the tree have been visited, return SQLITE_OK to the
55846: ** caller.
55847: */
55848: if( pPage->leaf ){
55849: do {
55850: if( pCur->iPage==0 ){
55851: /* All pages of the b-tree have been visited. Return successfully. */
55852: *pnEntry = nEntry;
55853: return SQLITE_OK;
55854: }
55855: moveToParent(pCur);
55856: }while ( pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell );
55857:
55858: pCur->aiIdx[pCur->iPage]++;
55859: pPage = pCur->apPage[pCur->iPage];
55860: }
55861:
55862: /* Descend to the child node of the cell that the cursor currently
55863: ** points at. This is the right-child if (iIdx==pPage->nCell).
55864: */
55865: iIdx = pCur->aiIdx[pCur->iPage];
55866: if( iIdx==pPage->nCell ){
55867: rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
55868: }else{
55869: rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx)));
55870: }
55871: }
55872:
55873: /* An error has occurred. Return an error code. */
55874: return rc;
55875: }
55876: #endif
55877:
55878: /*
55879: ** Return the pager associated with a BTree. This routine is used for
55880: ** testing and debugging only.
55881: */
55882: SQLITE_PRIVATE Pager *sqlite3BtreePager(Btree *p){
55883: return p->pBt->pPager;
55884: }
55885:
55886: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
55887: /*
55888: ** Append a message to the error message string.
55889: */
55890: static void checkAppendMsg(
55891: IntegrityCk *pCheck,
55892: char *zMsg1,
55893: const char *zFormat,
55894: ...
55895: ){
55896: va_list ap;
55897: if( !pCheck->mxErr ) return;
55898: pCheck->mxErr--;
55899: pCheck->nErr++;
55900: va_start(ap, zFormat);
55901: if( pCheck->errMsg.nChar ){
55902: sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
55903: }
55904: if( zMsg1 ){
55905: sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1);
55906: }
55907: sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap);
55908: va_end(ap);
55909: if( pCheck->errMsg.mallocFailed ){
55910: pCheck->mallocFailed = 1;
55911: }
55912: }
55913: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
55914:
55915: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
1.2.2.1 ! misho 55916:
! 55917: /*
! 55918: ** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that
! 55919: ** corresponds to page iPg is already set.
! 55920: */
! 55921: static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
! 55922: assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 );
! 55923: return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07)));
! 55924: }
! 55925:
! 55926: /*
! 55927: ** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg.
! 55928: */
! 55929: static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
! 55930: assert( iPg<=pCheck->nPage && sizeof(pCheck->aPgRef[0])==1 );
! 55931: pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07));
! 55932: }
! 55933:
! 55934:
1.2 misho 55935: /*
55936: ** Add 1 to the reference count for page iPage. If this is the second
55937: ** reference to the page, add an error message to pCheck->zErrMsg.
55938: ** Return 1 if there are 2 ore more references to the page and 0 if
55939: ** if this is the first reference to the page.
55940: **
55941: ** Also check that the page number is in bounds.
55942: */
55943: static int checkRef(IntegrityCk *pCheck, Pgno iPage, char *zContext){
55944: if( iPage==0 ) return 1;
55945: if( iPage>pCheck->nPage ){
55946: checkAppendMsg(pCheck, zContext, "invalid page number %d", iPage);
55947: return 1;
55948: }
1.2.2.1 ! misho 55949: if( getPageReferenced(pCheck, iPage) ){
1.2 misho 55950: checkAppendMsg(pCheck, zContext, "2nd reference to page %d", iPage);
55951: return 1;
55952: }
1.2.2.1 ! misho 55953: setPageReferenced(pCheck, iPage);
! 55954: return 0;
1.2 misho 55955: }
55956:
55957: #ifndef SQLITE_OMIT_AUTOVACUUM
55958: /*
55959: ** Check that the entry in the pointer-map for page iChild maps to
55960: ** page iParent, pointer type ptrType. If not, append an error message
55961: ** to pCheck.
55962: */
55963: static void checkPtrmap(
55964: IntegrityCk *pCheck, /* Integrity check context */
55965: Pgno iChild, /* Child page number */
55966: u8 eType, /* Expected pointer map type */
55967: Pgno iParent, /* Expected pointer map parent page number */
55968: char *zContext /* Context description (used for error msg) */
55969: ){
55970: int rc;
55971: u8 ePtrmapType;
55972: Pgno iPtrmapParent;
55973:
55974: rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
55975: if( rc!=SQLITE_OK ){
55976: if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->mallocFailed = 1;
55977: checkAppendMsg(pCheck, zContext, "Failed to read ptrmap key=%d", iChild);
55978: return;
55979: }
55980:
55981: if( ePtrmapType!=eType || iPtrmapParent!=iParent ){
55982: checkAppendMsg(pCheck, zContext,
55983: "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)",
55984: iChild, eType, iParent, ePtrmapType, iPtrmapParent);
55985: }
55986: }
55987: #endif
55988:
55989: /*
55990: ** Check the integrity of the freelist or of an overflow page list.
55991: ** Verify that the number of pages on the list is N.
55992: */
55993: static void checkList(
55994: IntegrityCk *pCheck, /* Integrity checking context */
55995: int isFreeList, /* True for a freelist. False for overflow page list */
55996: int iPage, /* Page number for first page in the list */
55997: int N, /* Expected number of pages in the list */
55998: char *zContext /* Context for error messages */
55999: ){
56000: int i;
56001: int expected = N;
56002: int iFirst = iPage;
56003: while( N-- > 0 && pCheck->mxErr ){
56004: DbPage *pOvflPage;
56005: unsigned char *pOvflData;
56006: if( iPage<1 ){
56007: checkAppendMsg(pCheck, zContext,
56008: "%d of %d pages missing from overflow list starting at %d",
56009: N+1, expected, iFirst);
56010: break;
56011: }
56012: if( checkRef(pCheck, iPage, zContext) ) break;
56013: if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage) ){
56014: checkAppendMsg(pCheck, zContext, "failed to get page %d", iPage);
56015: break;
56016: }
56017: pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage);
56018: if( isFreeList ){
56019: int n = get4byte(&pOvflData[4]);
56020: #ifndef SQLITE_OMIT_AUTOVACUUM
56021: if( pCheck->pBt->autoVacuum ){
56022: checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext);
56023: }
56024: #endif
56025: if( n>(int)pCheck->pBt->usableSize/4-2 ){
56026: checkAppendMsg(pCheck, zContext,
56027: "freelist leaf count too big on page %d", iPage);
56028: N--;
56029: }else{
56030: for(i=0; i<n; i++){
56031: Pgno iFreePage = get4byte(&pOvflData[8+i*4]);
56032: #ifndef SQLITE_OMIT_AUTOVACUUM
56033: if( pCheck->pBt->autoVacuum ){
56034: checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0, zContext);
56035: }
56036: #endif
56037: checkRef(pCheck, iFreePage, zContext);
56038: }
56039: N -= n;
56040: }
56041: }
56042: #ifndef SQLITE_OMIT_AUTOVACUUM
56043: else{
56044: /* If this database supports auto-vacuum and iPage is not the last
56045: ** page in this overflow list, check that the pointer-map entry for
56046: ** the following page matches iPage.
56047: */
56048: if( pCheck->pBt->autoVacuum && N>0 ){
56049: i = get4byte(pOvflData);
56050: checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage, zContext);
56051: }
56052: }
56053: #endif
56054: iPage = get4byte(pOvflData);
56055: sqlite3PagerUnref(pOvflPage);
56056: }
56057: }
56058: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
56059:
56060: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
56061: /*
56062: ** Do various sanity checks on a single page of a tree. Return
56063: ** the tree depth. Root pages return 0. Parents of root pages
56064: ** return 1, and so forth.
56065: **
56066: ** These checks are done:
56067: **
56068: ** 1. Make sure that cells and freeblocks do not overlap
56069: ** but combine to completely cover the page.
56070: ** NO 2. Make sure cell keys are in order.
56071: ** NO 3. Make sure no key is less than or equal to zLowerBound.
56072: ** NO 4. Make sure no key is greater than or equal to zUpperBound.
56073: ** 5. Check the integrity of overflow pages.
56074: ** 6. Recursively call checkTreePage on all children.
56075: ** 7. Verify that the depth of all children is the same.
56076: ** 8. Make sure this page is at least 33% full or else it is
56077: ** the root of the tree.
56078: */
56079: static int checkTreePage(
56080: IntegrityCk *pCheck, /* Context for the sanity check */
56081: int iPage, /* Page number of the page to check */
56082: char *zParentContext, /* Parent context */
56083: i64 *pnParentMinKey,
56084: i64 *pnParentMaxKey
56085: ){
56086: MemPage *pPage;
56087: int i, rc, depth, d2, pgno, cnt;
56088: int hdr, cellStart;
56089: int nCell;
56090: u8 *data;
56091: BtShared *pBt;
56092: int usableSize;
56093: char zContext[100];
56094: char *hit = 0;
56095: i64 nMinKey = 0;
56096: i64 nMaxKey = 0;
56097:
56098: sqlite3_snprintf(sizeof(zContext), zContext, "Page %d: ", iPage);
56099:
56100: /* Check that the page exists
56101: */
56102: pBt = pCheck->pBt;
56103: usableSize = pBt->usableSize;
56104: if( iPage==0 ) return 0;
56105: if( checkRef(pCheck, iPage, zParentContext) ) return 0;
56106: if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){
56107: checkAppendMsg(pCheck, zContext,
56108: "unable to get the page. error code=%d", rc);
56109: return 0;
56110: }
56111:
56112: /* Clear MemPage.isInit to make sure the corruption detection code in
56113: ** btreeInitPage() is executed. */
56114: pPage->isInit = 0;
56115: if( (rc = btreeInitPage(pPage))!=0 ){
56116: assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */
56117: checkAppendMsg(pCheck, zContext,
56118: "btreeInitPage() returns error code %d", rc);
56119: releasePage(pPage);
56120: return 0;
56121: }
56122:
56123: /* Check out all the cells.
56124: */
56125: depth = 0;
56126: for(i=0; i<pPage->nCell && pCheck->mxErr; i++){
56127: u8 *pCell;
56128: u32 sz;
56129: CellInfo info;
56130:
56131: /* Check payload overflow pages
56132: */
56133: sqlite3_snprintf(sizeof(zContext), zContext,
56134: "On tree page %d cell %d: ", iPage, i);
56135: pCell = findCell(pPage,i);
56136: btreeParseCellPtr(pPage, pCell, &info);
56137: sz = info.nData;
56138: if( !pPage->intKey ) sz += (int)info.nKey;
56139: /* For intKey pages, check that the keys are in order.
56140: */
56141: else if( i==0 ) nMinKey = nMaxKey = info.nKey;
56142: else{
56143: if( info.nKey <= nMaxKey ){
56144: checkAppendMsg(pCheck, zContext,
56145: "Rowid %lld out of order (previous was %lld)", info.nKey, nMaxKey);
56146: }
56147: nMaxKey = info.nKey;
56148: }
56149: assert( sz==info.nPayload );
56150: if( (sz>info.nLocal)
56151: && (&pCell[info.iOverflow]<=&pPage->aData[pBt->usableSize])
56152: ){
56153: int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4);
56154: Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]);
56155: #ifndef SQLITE_OMIT_AUTOVACUUM
56156: if( pBt->autoVacuum ){
56157: checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage, zContext);
56158: }
56159: #endif
56160: checkList(pCheck, 0, pgnoOvfl, nPage, zContext);
56161: }
56162:
56163: /* Check sanity of left child page.
56164: */
56165: if( !pPage->leaf ){
56166: pgno = get4byte(pCell);
56167: #ifndef SQLITE_OMIT_AUTOVACUUM
56168: if( pBt->autoVacuum ){
56169: checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext);
56170: }
56171: #endif
56172: d2 = checkTreePage(pCheck, pgno, zContext, &nMinKey, i==0 ? NULL : &nMaxKey);
56173: if( i>0 && d2!=depth ){
56174: checkAppendMsg(pCheck, zContext, "Child page depth differs");
56175: }
56176: depth = d2;
56177: }
56178: }
56179:
56180: if( !pPage->leaf ){
56181: pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
56182: sqlite3_snprintf(sizeof(zContext), zContext,
56183: "On page %d at right child: ", iPage);
56184: #ifndef SQLITE_OMIT_AUTOVACUUM
56185: if( pBt->autoVacuum ){
56186: checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext);
56187: }
56188: #endif
56189: checkTreePage(pCheck, pgno, zContext, NULL, !pPage->nCell ? NULL : &nMaxKey);
56190: }
56191:
56192: /* For intKey leaf pages, check that the min/max keys are in order
56193: ** with any left/parent/right pages.
56194: */
56195: if( pPage->leaf && pPage->intKey ){
56196: /* if we are a left child page */
56197: if( pnParentMinKey ){
56198: /* if we are the left most child page */
56199: if( !pnParentMaxKey ){
56200: if( nMaxKey > *pnParentMinKey ){
56201: checkAppendMsg(pCheck, zContext,
56202: "Rowid %lld out of order (max larger than parent min of %lld)",
56203: nMaxKey, *pnParentMinKey);
56204: }
56205: }else{
56206: if( nMinKey <= *pnParentMinKey ){
56207: checkAppendMsg(pCheck, zContext,
56208: "Rowid %lld out of order (min less than parent min of %lld)",
56209: nMinKey, *pnParentMinKey);
56210: }
56211: if( nMaxKey > *pnParentMaxKey ){
56212: checkAppendMsg(pCheck, zContext,
56213: "Rowid %lld out of order (max larger than parent max of %lld)",
56214: nMaxKey, *pnParentMaxKey);
56215: }
56216: *pnParentMinKey = nMaxKey;
56217: }
56218: /* else if we're a right child page */
56219: } else if( pnParentMaxKey ){
56220: if( nMinKey <= *pnParentMaxKey ){
56221: checkAppendMsg(pCheck, zContext,
56222: "Rowid %lld out of order (min less than parent max of %lld)",
56223: nMinKey, *pnParentMaxKey);
56224: }
56225: }
56226: }
56227:
56228: /* Check for complete coverage of the page
56229: */
56230: data = pPage->aData;
56231: hdr = pPage->hdrOffset;
56232: hit = sqlite3PageMalloc( pBt->pageSize );
56233: if( hit==0 ){
56234: pCheck->mallocFailed = 1;
56235: }else{
56236: int contentOffset = get2byteNotZero(&data[hdr+5]);
56237: assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */
56238: memset(hit+contentOffset, 0, usableSize-contentOffset);
56239: memset(hit, 1, contentOffset);
56240: nCell = get2byte(&data[hdr+3]);
56241: cellStart = hdr + 12 - 4*pPage->leaf;
56242: for(i=0; i<nCell; i++){
56243: int pc = get2byte(&data[cellStart+i*2]);
56244: u32 size = 65536;
56245: int j;
56246: if( pc<=usableSize-4 ){
56247: size = cellSizePtr(pPage, &data[pc]);
56248: }
56249: if( (int)(pc+size-1)>=usableSize ){
56250: checkAppendMsg(pCheck, 0,
56251: "Corruption detected in cell %d on page %d",i,iPage);
56252: }else{
56253: for(j=pc+size-1; j>=pc; j--) hit[j]++;
56254: }
56255: }
56256: i = get2byte(&data[hdr+1]);
56257: while( i>0 ){
56258: int size, j;
56259: assert( i<=usableSize-4 ); /* Enforced by btreeInitPage() */
56260: size = get2byte(&data[i+2]);
56261: assert( i+size<=usableSize ); /* Enforced by btreeInitPage() */
56262: for(j=i+size-1; j>=i; j--) hit[j]++;
56263: j = get2byte(&data[i]);
56264: assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */
56265: assert( j<=usableSize-4 ); /* Enforced by btreeInitPage() */
56266: i = j;
56267: }
56268: for(i=cnt=0; i<usableSize; i++){
56269: if( hit[i]==0 ){
56270: cnt++;
56271: }else if( hit[i]>1 ){
56272: checkAppendMsg(pCheck, 0,
56273: "Multiple uses for byte %d of page %d", i, iPage);
56274: break;
56275: }
56276: }
56277: if( cnt!=data[hdr+7] ){
56278: checkAppendMsg(pCheck, 0,
56279: "Fragmentation of %d bytes reported as %d on page %d",
56280: cnt, data[hdr+7], iPage);
56281: }
56282: }
56283: sqlite3PageFree(hit);
56284: releasePage(pPage);
56285: return depth+1;
56286: }
56287: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
56288:
56289: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
56290: /*
56291: ** This routine does a complete check of the given BTree file. aRoot[] is
56292: ** an array of pages numbers were each page number is the root page of
56293: ** a table. nRoot is the number of entries in aRoot.
56294: **
56295: ** A read-only or read-write transaction must be opened before calling
56296: ** this function.
56297: **
56298: ** Write the number of error seen in *pnErr. Except for some memory
56299: ** allocation errors, an error message held in memory obtained from
56300: ** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is
56301: ** returned. If a memory allocation error occurs, NULL is returned.
56302: */
56303: SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(
56304: Btree *p, /* The btree to be checked */
56305: int *aRoot, /* An array of root pages numbers for individual trees */
56306: int nRoot, /* Number of entries in aRoot[] */
56307: int mxErr, /* Stop reporting errors after this many */
56308: int *pnErr /* Write number of errors seen to this variable */
56309: ){
56310: Pgno i;
56311: int nRef;
56312: IntegrityCk sCheck;
56313: BtShared *pBt = p->pBt;
56314: char zErr[100];
56315:
56316: sqlite3BtreeEnter(p);
56317: assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
56318: nRef = sqlite3PagerRefcount(pBt->pPager);
56319: sCheck.pBt = pBt;
56320: sCheck.pPager = pBt->pPager;
56321: sCheck.nPage = btreePagecount(sCheck.pBt);
56322: sCheck.mxErr = mxErr;
56323: sCheck.nErr = 0;
56324: sCheck.mallocFailed = 0;
56325: *pnErr = 0;
56326: if( sCheck.nPage==0 ){
56327: sqlite3BtreeLeave(p);
56328: return 0;
56329: }
1.2.2.1 ! misho 56330:
! 56331: sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1);
! 56332: if( !sCheck.aPgRef ){
1.2 misho 56333: *pnErr = 1;
56334: sqlite3BtreeLeave(p);
56335: return 0;
56336: }
56337: i = PENDING_BYTE_PAGE(pBt);
1.2.2.1 ! misho 56338: if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i);
1.2 misho 56339: sqlite3StrAccumInit(&sCheck.errMsg, zErr, sizeof(zErr), 20000);
56340: sCheck.errMsg.useMalloc = 2;
56341:
56342: /* Check the integrity of the freelist
56343: */
56344: checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]),
56345: get4byte(&pBt->pPage1->aData[36]), "Main freelist: ");
56346:
56347: /* Check all the tables.
56348: */
56349: for(i=0; (int)i<nRoot && sCheck.mxErr; i++){
56350: if( aRoot[i]==0 ) continue;
56351: #ifndef SQLITE_OMIT_AUTOVACUUM
56352: if( pBt->autoVacuum && aRoot[i]>1 ){
56353: checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0, 0);
56354: }
56355: #endif
56356: checkTreePage(&sCheck, aRoot[i], "List of tree roots: ", NULL, NULL);
56357: }
56358:
56359: /* Make sure every page in the file is referenced
56360: */
56361: for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
56362: #ifdef SQLITE_OMIT_AUTOVACUUM
1.2.2.1 ! misho 56363: if( getPageReferenced(&sCheck, i)==0 ){
1.2 misho 56364: checkAppendMsg(&sCheck, 0, "Page %d is never used", i);
56365: }
56366: #else
56367: /* If the database supports auto-vacuum, make sure no tables contain
56368: ** references to pointer-map pages.
56369: */
1.2.2.1 ! misho 56370: if( getPageReferenced(&sCheck, i)==0 &&
1.2 misho 56371: (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){
56372: checkAppendMsg(&sCheck, 0, "Page %d is never used", i);
56373: }
1.2.2.1 ! misho 56374: if( getPageReferenced(&sCheck, i)!=0 &&
1.2 misho 56375: (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){
56376: checkAppendMsg(&sCheck, 0, "Pointer map page %d is referenced", i);
56377: }
56378: #endif
56379: }
56380:
56381: /* Make sure this analysis did not leave any unref() pages.
56382: ** This is an internal consistency check; an integrity check
56383: ** of the integrity check.
56384: */
56385: if( NEVER(nRef != sqlite3PagerRefcount(pBt->pPager)) ){
56386: checkAppendMsg(&sCheck, 0,
56387: "Outstanding page count goes from %d to %d during this analysis",
56388: nRef, sqlite3PagerRefcount(pBt->pPager)
56389: );
56390: }
56391:
56392: /* Clean up and report errors.
56393: */
56394: sqlite3BtreeLeave(p);
1.2.2.1 ! misho 56395: sqlite3_free(sCheck.aPgRef);
1.2 misho 56396: if( sCheck.mallocFailed ){
56397: sqlite3StrAccumReset(&sCheck.errMsg);
56398: *pnErr = sCheck.nErr+1;
56399: return 0;
56400: }
56401: *pnErr = sCheck.nErr;
56402: if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg);
56403: return sqlite3StrAccumFinish(&sCheck.errMsg);
56404: }
56405: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
56406:
56407: /*
1.2.2.1 ! misho 56408: ** Return the full pathname of the underlying database file. Return
! 56409: ** an empty string if the database is in-memory or a TEMP database.
1.2 misho 56410: **
56411: ** The pager filename is invariant as long as the pager is
56412: ** open so it is safe to access without the BtShared mutex.
56413: */
56414: SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *p){
56415: assert( p->pBt->pPager!=0 );
1.2.2.1 ! misho 56416: return sqlite3PagerFilename(p->pBt->pPager, 1);
1.2 misho 56417: }
56418:
56419: /*
56420: ** Return the pathname of the journal file for this database. The return
56421: ** value of this routine is the same regardless of whether the journal file
56422: ** has been created or not.
56423: **
56424: ** The pager journal filename is invariant as long as the pager is
56425: ** open so it is safe to access without the BtShared mutex.
56426: */
56427: SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *p){
56428: assert( p->pBt->pPager!=0 );
56429: return sqlite3PagerJournalname(p->pBt->pPager);
56430: }
56431:
56432: /*
56433: ** Return non-zero if a transaction is active.
56434: */
56435: SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree *p){
56436: assert( p==0 || sqlite3_mutex_held(p->db->mutex) );
56437: return (p && (p->inTrans==TRANS_WRITE));
56438: }
56439:
56440: #ifndef SQLITE_OMIT_WAL
56441: /*
56442: ** Run a checkpoint on the Btree passed as the first argument.
56443: **
56444: ** Return SQLITE_LOCKED if this or any other connection has an open
56445: ** transaction on the shared-cache the argument Btree is connected to.
56446: **
56447: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
56448: */
56449: SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){
56450: int rc = SQLITE_OK;
56451: if( p ){
56452: BtShared *pBt = p->pBt;
56453: sqlite3BtreeEnter(p);
56454: if( pBt->inTransaction!=TRANS_NONE ){
56455: rc = SQLITE_LOCKED;
56456: }else{
56457: rc = sqlite3PagerCheckpoint(pBt->pPager, eMode, pnLog, pnCkpt);
56458: }
56459: sqlite3BtreeLeave(p);
56460: }
56461: return rc;
56462: }
56463: #endif
56464:
56465: /*
56466: ** Return non-zero if a read (or write) transaction is active.
56467: */
56468: SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree *p){
56469: assert( p );
56470: assert( sqlite3_mutex_held(p->db->mutex) );
56471: return p->inTrans!=TRANS_NONE;
56472: }
56473:
56474: SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree *p){
56475: assert( p );
56476: assert( sqlite3_mutex_held(p->db->mutex) );
56477: return p->nBackup!=0;
56478: }
56479:
56480: /*
56481: ** This function returns a pointer to a blob of memory associated with
56482: ** a single shared-btree. The memory is used by client code for its own
56483: ** purposes (for example, to store a high-level schema associated with
56484: ** the shared-btree). The btree layer manages reference counting issues.
56485: **
56486: ** The first time this is called on a shared-btree, nBytes bytes of memory
56487: ** are allocated, zeroed, and returned to the caller. For each subsequent
56488: ** call the nBytes parameter is ignored and a pointer to the same blob
56489: ** of memory returned.
56490: **
56491: ** If the nBytes parameter is 0 and the blob of memory has not yet been
56492: ** allocated, a null pointer is returned. If the blob has already been
56493: ** allocated, it is returned as normal.
56494: **
56495: ** Just before the shared-btree is closed, the function passed as the
56496: ** xFree argument when the memory allocation was made is invoked on the
56497: ** blob of allocated memory. The xFree function should not call sqlite3_free()
56498: ** on the memory, the btree layer does that.
56499: */
56500: SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){
56501: BtShared *pBt = p->pBt;
56502: sqlite3BtreeEnter(p);
56503: if( !pBt->pSchema && nBytes ){
56504: pBt->pSchema = sqlite3DbMallocZero(0, nBytes);
56505: pBt->xFreeSchema = xFree;
56506: }
56507: sqlite3BtreeLeave(p);
56508: return pBt->pSchema;
56509: }
56510:
56511: /*
56512: ** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared
56513: ** btree as the argument handle holds an exclusive lock on the
56514: ** sqlite_master table. Otherwise SQLITE_OK.
56515: */
56516: SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *p){
56517: int rc;
56518: assert( sqlite3_mutex_held(p->db->mutex) );
56519: sqlite3BtreeEnter(p);
56520: rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
56521: assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE );
56522: sqlite3BtreeLeave(p);
56523: return rc;
56524: }
56525:
56526:
56527: #ifndef SQLITE_OMIT_SHARED_CACHE
56528: /*
56529: ** Obtain a lock on the table whose root page is iTab. The
56530: ** lock is a write lock if isWritelock is true or a read lock
56531: ** if it is false.
56532: */
56533: SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){
56534: int rc = SQLITE_OK;
56535: assert( p->inTrans!=TRANS_NONE );
56536: if( p->sharable ){
56537: u8 lockType = READ_LOCK + isWriteLock;
56538: assert( READ_LOCK+1==WRITE_LOCK );
56539: assert( isWriteLock==0 || isWriteLock==1 );
56540:
56541: sqlite3BtreeEnter(p);
56542: rc = querySharedCacheTableLock(p, iTab, lockType);
56543: if( rc==SQLITE_OK ){
56544: rc = setSharedCacheTableLock(p, iTab, lockType);
56545: }
56546: sqlite3BtreeLeave(p);
56547: }
56548: return rc;
56549: }
56550: #endif
56551:
56552: #ifndef SQLITE_OMIT_INCRBLOB
56553: /*
56554: ** Argument pCsr must be a cursor opened for writing on an
56555: ** INTKEY table currently pointing at a valid table entry.
56556: ** This function modifies the data stored as part of that entry.
56557: **
56558: ** Only the data content may only be modified, it is not possible to
56559: ** change the length of the data stored. If this function is called with
56560: ** parameters that attempt to write past the end of the existing data,
56561: ** no modifications are made and SQLITE_CORRUPT is returned.
56562: */
56563: SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){
56564: int rc;
56565: assert( cursorHoldsMutex(pCsr) );
56566: assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) );
56567: assert( pCsr->isIncrblobHandle );
56568:
56569: rc = restoreCursorPosition(pCsr);
56570: if( rc!=SQLITE_OK ){
56571: return rc;
56572: }
56573: assert( pCsr->eState!=CURSOR_REQUIRESEEK );
56574: if( pCsr->eState!=CURSOR_VALID ){
56575: return SQLITE_ABORT;
56576: }
56577:
56578: /* Check some assumptions:
56579: ** (a) the cursor is open for writing,
56580: ** (b) there is a read/write transaction open,
56581: ** (c) the connection holds a write-lock on the table (if required),
56582: ** (d) there are no conflicting read-locks, and
56583: ** (e) the cursor points at a valid row of an intKey table.
56584: */
56585: if( !pCsr->wrFlag ){
56586: return SQLITE_READONLY;
56587: }
56588: assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0
56589: && pCsr->pBt->inTransaction==TRANS_WRITE );
56590: assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) );
56591: assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) );
56592: assert( pCsr->apPage[pCsr->iPage]->intKey );
56593:
56594: return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1);
56595: }
56596:
56597: /*
56598: ** Set a flag on this cursor to cache the locations of pages from the
56599: ** overflow list for the current row. This is used by cursors opened
56600: ** for incremental blob IO only.
56601: **
56602: ** This function sets a flag only. The actual page location cache
56603: ** (stored in BtCursor.aOverflow[]) is allocated and used by function
56604: ** accessPayload() (the worker function for sqlite3BtreeData() and
56605: ** sqlite3BtreePutData()).
56606: */
56607: SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *pCur){
56608: assert( cursorHoldsMutex(pCur) );
56609: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
56610: invalidateOverflowCache(pCur);
56611: pCur->isIncrblobHandle = 1;
56612: }
56613: #endif
56614:
56615: /*
56616: ** Set both the "read version" (single byte at byte offset 18) and
56617: ** "write version" (single byte at byte offset 19) fields in the database
56618: ** header to iVersion.
56619: */
56620: SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
56621: BtShared *pBt = pBtree->pBt;
56622: int rc; /* Return code */
56623:
56624: assert( iVersion==1 || iVersion==2 );
56625:
56626: /* If setting the version fields to 1, do not automatically open the
56627: ** WAL connection, even if the version fields are currently set to 2.
56628: */
56629: pBt->btsFlags &= ~BTS_NO_WAL;
56630: if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL;
56631:
56632: rc = sqlite3BtreeBeginTrans(pBtree, 0);
56633: if( rc==SQLITE_OK ){
56634: u8 *aData = pBt->pPage1->aData;
56635: if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){
56636: rc = sqlite3BtreeBeginTrans(pBtree, 2);
56637: if( rc==SQLITE_OK ){
56638: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
56639: if( rc==SQLITE_OK ){
56640: aData[18] = (u8)iVersion;
56641: aData[19] = (u8)iVersion;
56642: }
56643: }
56644: }
56645: }
56646:
56647: pBt->btsFlags &= ~BTS_NO_WAL;
56648: return rc;
56649: }
56650:
1.2.2.1 ! misho 56651: /*
! 56652: ** set the mask of hint flags for cursor pCsr. Currently the only valid
! 56653: ** values are 0 and BTREE_BULKLOAD.
! 56654: */
! 56655: SQLITE_PRIVATE void sqlite3BtreeCursorHints(BtCursor *pCsr, unsigned int mask){
! 56656: assert( mask==BTREE_BULKLOAD || mask==0 );
! 56657: pCsr->hints = mask;
! 56658: }
! 56659:
1.2 misho 56660: /************** End of btree.c ***********************************************/
56661: /************** Begin file backup.c ******************************************/
56662: /*
56663: ** 2009 January 28
56664: **
56665: ** The author disclaims copyright to this source code. In place of
56666: ** a legal notice, here is a blessing:
56667: **
56668: ** May you do good and not evil.
56669: ** May you find forgiveness for yourself and forgive others.
56670: ** May you share freely, never taking more than you give.
56671: **
56672: *************************************************************************
56673: ** This file contains the implementation of the sqlite3_backup_XXX()
56674: ** API functions and the related features.
56675: */
56676:
56677: /* Macro to find the minimum of two numeric values.
56678: */
56679: #ifndef MIN
56680: # define MIN(x,y) ((x)<(y)?(x):(y))
56681: #endif
56682:
56683: /*
56684: ** Structure allocated for each backup operation.
56685: */
56686: struct sqlite3_backup {
56687: sqlite3* pDestDb; /* Destination database handle */
56688: Btree *pDest; /* Destination b-tree file */
56689: u32 iDestSchema; /* Original schema cookie in destination */
56690: int bDestLocked; /* True once a write-transaction is open on pDest */
56691:
56692: Pgno iNext; /* Page number of the next source page to copy */
56693: sqlite3* pSrcDb; /* Source database handle */
56694: Btree *pSrc; /* Source b-tree file */
56695:
56696: int rc; /* Backup process error code */
56697:
56698: /* These two variables are set by every call to backup_step(). They are
56699: ** read by calls to backup_remaining() and backup_pagecount().
56700: */
56701: Pgno nRemaining; /* Number of pages left to copy */
56702: Pgno nPagecount; /* Total number of pages to copy */
56703:
56704: int isAttached; /* True once backup has been registered with pager */
56705: sqlite3_backup *pNext; /* Next backup associated with source pager */
56706: };
56707:
56708: /*
56709: ** THREAD SAFETY NOTES:
56710: **
56711: ** Once it has been created using backup_init(), a single sqlite3_backup
56712: ** structure may be accessed via two groups of thread-safe entry points:
56713: **
56714: ** * Via the sqlite3_backup_XXX() API function backup_step() and
56715: ** backup_finish(). Both these functions obtain the source database
56716: ** handle mutex and the mutex associated with the source BtShared
56717: ** structure, in that order.
56718: **
56719: ** * Via the BackupUpdate() and BackupRestart() functions, which are
56720: ** invoked by the pager layer to report various state changes in
56721: ** the page cache associated with the source database. The mutex
56722: ** associated with the source database BtShared structure will always
56723: ** be held when either of these functions are invoked.
56724: **
56725: ** The other sqlite3_backup_XXX() API functions, backup_remaining() and
56726: ** backup_pagecount() are not thread-safe functions. If they are called
56727: ** while some other thread is calling backup_step() or backup_finish(),
56728: ** the values returned may be invalid. There is no way for a call to
56729: ** BackupUpdate() or BackupRestart() to interfere with backup_remaining()
56730: ** or backup_pagecount().
56731: **
56732: ** Depending on the SQLite configuration, the database handles and/or
56733: ** the Btree objects may have their own mutexes that require locking.
56734: ** Non-sharable Btrees (in-memory databases for example), do not have
56735: ** associated mutexes.
56736: */
56737:
56738: /*
56739: ** Return a pointer corresponding to database zDb (i.e. "main", "temp")
56740: ** in connection handle pDb. If such a database cannot be found, return
56741: ** a NULL pointer and write an error message to pErrorDb.
56742: **
56743: ** If the "temp" database is requested, it may need to be opened by this
56744: ** function. If an error occurs while doing so, return 0 and write an
56745: ** error message to pErrorDb.
56746: */
56747: static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){
56748: int i = sqlite3FindDbName(pDb, zDb);
56749:
56750: if( i==1 ){
56751: Parse *pParse;
56752: int rc = 0;
56753: pParse = sqlite3StackAllocZero(pErrorDb, sizeof(*pParse));
56754: if( pParse==0 ){
56755: sqlite3Error(pErrorDb, SQLITE_NOMEM, "out of memory");
56756: rc = SQLITE_NOMEM;
56757: }else{
56758: pParse->db = pDb;
56759: if( sqlite3OpenTempDatabase(pParse) ){
56760: sqlite3Error(pErrorDb, pParse->rc, "%s", pParse->zErrMsg);
56761: rc = SQLITE_ERROR;
56762: }
56763: sqlite3DbFree(pErrorDb, pParse->zErrMsg);
56764: sqlite3StackFree(pErrorDb, pParse);
56765: }
56766: if( rc ){
56767: return 0;
56768: }
56769: }
56770:
56771: if( i<0 ){
56772: sqlite3Error(pErrorDb, SQLITE_ERROR, "unknown database %s", zDb);
56773: return 0;
56774: }
56775:
56776: return pDb->aDb[i].pBt;
56777: }
56778:
56779: /*
56780: ** Attempt to set the page size of the destination to match the page size
56781: ** of the source.
56782: */
56783: static int setDestPgsz(sqlite3_backup *p){
56784: int rc;
56785: rc = sqlite3BtreeSetPageSize(p->pDest,sqlite3BtreeGetPageSize(p->pSrc),-1,0);
56786: return rc;
56787: }
56788:
56789: /*
56790: ** Create an sqlite3_backup process to copy the contents of zSrcDb from
56791: ** connection handle pSrcDb to zDestDb in pDestDb. If successful, return
56792: ** a pointer to the new sqlite3_backup object.
56793: **
56794: ** If an error occurs, NULL is returned and an error code and error message
56795: ** stored in database handle pDestDb.
56796: */
56797: SQLITE_API sqlite3_backup *sqlite3_backup_init(
56798: sqlite3* pDestDb, /* Database to write to */
56799: const char *zDestDb, /* Name of database within pDestDb */
56800: sqlite3* pSrcDb, /* Database connection to read from */
56801: const char *zSrcDb /* Name of database within pSrcDb */
56802: ){
56803: sqlite3_backup *p; /* Value to return */
56804:
56805: /* Lock the source database handle. The destination database
56806: ** handle is not locked in this routine, but it is locked in
56807: ** sqlite3_backup_step(). The user is required to ensure that no
56808: ** other thread accesses the destination handle for the duration
56809: ** of the backup operation. Any attempt to use the destination
56810: ** database connection while a backup is in progress may cause
56811: ** a malfunction or a deadlock.
56812: */
56813: sqlite3_mutex_enter(pSrcDb->mutex);
56814: sqlite3_mutex_enter(pDestDb->mutex);
56815:
56816: if( pSrcDb==pDestDb ){
56817: sqlite3Error(
56818: pDestDb, SQLITE_ERROR, "source and destination must be distinct"
56819: );
56820: p = 0;
56821: }else {
56822: /* Allocate space for a new sqlite3_backup object...
56823: ** EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a
56824: ** call to sqlite3_backup_init() and is destroyed by a call to
56825: ** sqlite3_backup_finish(). */
1.2.2.1 ! misho 56826: p = (sqlite3_backup *)sqlite3MallocZero(sizeof(sqlite3_backup));
1.2 misho 56827: if( !p ){
56828: sqlite3Error(pDestDb, SQLITE_NOMEM, 0);
56829: }
56830: }
56831:
56832: /* If the allocation succeeded, populate the new object. */
56833: if( p ){
56834: p->pSrc = findBtree(pDestDb, pSrcDb, zSrcDb);
56835: p->pDest = findBtree(pDestDb, pDestDb, zDestDb);
56836: p->pDestDb = pDestDb;
56837: p->pSrcDb = pSrcDb;
56838: p->iNext = 1;
56839: p->isAttached = 0;
56840:
56841: if( 0==p->pSrc || 0==p->pDest || setDestPgsz(p)==SQLITE_NOMEM ){
56842: /* One (or both) of the named databases did not exist or an OOM
56843: ** error was hit. The error has already been written into the
56844: ** pDestDb handle. All that is left to do here is free the
56845: ** sqlite3_backup structure.
56846: */
56847: sqlite3_free(p);
56848: p = 0;
56849: }
56850: }
56851: if( p ){
56852: p->pSrc->nBackup++;
56853: }
56854:
56855: sqlite3_mutex_leave(pDestDb->mutex);
56856: sqlite3_mutex_leave(pSrcDb->mutex);
56857: return p;
56858: }
56859:
56860: /*
56861: ** Argument rc is an SQLite error code. Return true if this error is
56862: ** considered fatal if encountered during a backup operation. All errors
56863: ** are considered fatal except for SQLITE_BUSY and SQLITE_LOCKED.
56864: */
56865: static int isFatalError(int rc){
56866: return (rc!=SQLITE_OK && rc!=SQLITE_BUSY && ALWAYS(rc!=SQLITE_LOCKED));
56867: }
56868:
56869: /*
56870: ** Parameter zSrcData points to a buffer containing the data for
56871: ** page iSrcPg from the source database. Copy this data into the
56872: ** destination database.
56873: */
56874: static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
56875: Pager * const pDestPager = sqlite3BtreePager(p->pDest);
56876: const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc);
56877: int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest);
56878: const int nCopy = MIN(nSrcPgsz, nDestPgsz);
56879: const i64 iEnd = (i64)iSrcPg*(i64)nSrcPgsz;
56880: #ifdef SQLITE_HAS_CODEC
1.2.2.1 ! misho 56881: /* Use BtreeGetReserveNoMutex() for the source b-tree, as although it is
! 56882: ** guaranteed that the shared-mutex is held by this thread, handle
! 56883: ** p->pSrc may not actually be the owner. */
! 56884: int nSrcReserve = sqlite3BtreeGetReserveNoMutex(p->pSrc);
1.2 misho 56885: int nDestReserve = sqlite3BtreeGetReserve(p->pDest);
56886: #endif
56887: int rc = SQLITE_OK;
56888: i64 iOff;
56889:
1.2.2.1 ! misho 56890: assert( sqlite3BtreeGetReserveNoMutex(p->pSrc)>=0 );
1.2 misho 56891: assert( p->bDestLocked );
56892: assert( !isFatalError(p->rc) );
56893: assert( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) );
56894: assert( zSrcData );
56895:
56896: /* Catch the case where the destination is an in-memory database and the
56897: ** page sizes of the source and destination differ.
56898: */
56899: if( nSrcPgsz!=nDestPgsz && sqlite3PagerIsMemdb(pDestPager) ){
56900: rc = SQLITE_READONLY;
56901: }
56902:
56903: #ifdef SQLITE_HAS_CODEC
56904: /* Backup is not possible if the page size of the destination is changing
56905: ** and a codec is in use.
56906: */
56907: if( nSrcPgsz!=nDestPgsz && sqlite3PagerGetCodec(pDestPager)!=0 ){
56908: rc = SQLITE_READONLY;
56909: }
56910:
56911: /* Backup is not possible if the number of bytes of reserve space differ
56912: ** between source and destination. If there is a difference, try to
56913: ** fix the destination to agree with the source. If that is not possible,
56914: ** then the backup cannot proceed.
56915: */
56916: if( nSrcReserve!=nDestReserve ){
56917: u32 newPgsz = nSrcPgsz;
56918: rc = sqlite3PagerSetPagesize(pDestPager, &newPgsz, nSrcReserve);
56919: if( rc==SQLITE_OK && newPgsz!=nSrcPgsz ) rc = SQLITE_READONLY;
56920: }
56921: #endif
56922:
56923: /* This loop runs once for each destination page spanned by the source
56924: ** page. For each iteration, variable iOff is set to the byte offset
56925: ** of the destination page.
56926: */
56927: for(iOff=iEnd-(i64)nSrcPgsz; rc==SQLITE_OK && iOff<iEnd; iOff+=nDestPgsz){
56928: DbPage *pDestPg = 0;
56929: Pgno iDest = (Pgno)(iOff/nDestPgsz)+1;
56930: if( iDest==PENDING_BYTE_PAGE(p->pDest->pBt) ) continue;
56931: if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg))
56932: && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg))
56933: ){
56934: const u8 *zIn = &zSrcData[iOff%nSrcPgsz];
56935: u8 *zDestData = sqlite3PagerGetData(pDestPg);
56936: u8 *zOut = &zDestData[iOff%nDestPgsz];
56937:
56938: /* Copy the data from the source page into the destination page.
56939: ** Then clear the Btree layer MemPage.isInit flag. Both this module
56940: ** and the pager code use this trick (clearing the first byte
56941: ** of the page 'extra' space to invalidate the Btree layers
56942: ** cached parse of the page). MemPage.isInit is marked
56943: ** "MUST BE FIRST" for this purpose.
56944: */
56945: memcpy(zOut, zIn, nCopy);
56946: ((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0;
56947: }
56948: sqlite3PagerUnref(pDestPg);
56949: }
56950:
56951: return rc;
56952: }
56953:
56954: /*
56955: ** If pFile is currently larger than iSize bytes, then truncate it to
56956: ** exactly iSize bytes. If pFile is not larger than iSize bytes, then
56957: ** this function is a no-op.
56958: **
56959: ** Return SQLITE_OK if everything is successful, or an SQLite error
56960: ** code if an error occurs.
56961: */
56962: static int backupTruncateFile(sqlite3_file *pFile, i64 iSize){
56963: i64 iCurrent;
56964: int rc = sqlite3OsFileSize(pFile, &iCurrent);
56965: if( rc==SQLITE_OK && iCurrent>iSize ){
56966: rc = sqlite3OsTruncate(pFile, iSize);
56967: }
56968: return rc;
56969: }
56970:
56971: /*
56972: ** Register this backup object with the associated source pager for
56973: ** callbacks when pages are changed or the cache invalidated.
56974: */
56975: static void attachBackupObject(sqlite3_backup *p){
56976: sqlite3_backup **pp;
56977: assert( sqlite3BtreeHoldsMutex(p->pSrc) );
56978: pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
56979: p->pNext = *pp;
56980: *pp = p;
56981: p->isAttached = 1;
56982: }
56983:
56984: /*
56985: ** Copy nPage pages from the source b-tree to the destination.
56986: */
56987: SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){
56988: int rc;
56989: int destMode; /* Destination journal mode */
56990: int pgszSrc = 0; /* Source page size */
56991: int pgszDest = 0; /* Destination page size */
56992:
56993: sqlite3_mutex_enter(p->pSrcDb->mutex);
56994: sqlite3BtreeEnter(p->pSrc);
56995: if( p->pDestDb ){
56996: sqlite3_mutex_enter(p->pDestDb->mutex);
56997: }
56998:
56999: rc = p->rc;
57000: if( !isFatalError(rc) ){
57001: Pager * const pSrcPager = sqlite3BtreePager(p->pSrc); /* Source pager */
57002: Pager * const pDestPager = sqlite3BtreePager(p->pDest); /* Dest pager */
57003: int ii; /* Iterator variable */
57004: int nSrcPage = -1; /* Size of source db in pages */
57005: int bCloseTrans = 0; /* True if src db requires unlocking */
57006:
57007: /* If the source pager is currently in a write-transaction, return
57008: ** SQLITE_BUSY immediately.
57009: */
57010: if( p->pDestDb && p->pSrc->pBt->inTransaction==TRANS_WRITE ){
57011: rc = SQLITE_BUSY;
57012: }else{
57013: rc = SQLITE_OK;
57014: }
57015:
57016: /* Lock the destination database, if it is not locked already. */
57017: if( SQLITE_OK==rc && p->bDestLocked==0
57018: && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2))
57019: ){
57020: p->bDestLocked = 1;
57021: sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema);
57022: }
57023:
57024: /* If there is no open read-transaction on the source database, open
57025: ** one now. If a transaction is opened here, then it will be closed
57026: ** before this function exits.
57027: */
57028: if( rc==SQLITE_OK && 0==sqlite3BtreeIsInReadTrans(p->pSrc) ){
57029: rc = sqlite3BtreeBeginTrans(p->pSrc, 0);
57030: bCloseTrans = 1;
57031: }
57032:
57033: /* Do not allow backup if the destination database is in WAL mode
57034: ** and the page sizes are different between source and destination */
57035: pgszSrc = sqlite3BtreeGetPageSize(p->pSrc);
57036: pgszDest = sqlite3BtreeGetPageSize(p->pDest);
57037: destMode = sqlite3PagerGetJournalMode(sqlite3BtreePager(p->pDest));
57038: if( SQLITE_OK==rc && destMode==PAGER_JOURNALMODE_WAL && pgszSrc!=pgszDest ){
57039: rc = SQLITE_READONLY;
57040: }
57041:
57042: /* Now that there is a read-lock on the source database, query the
57043: ** source pager for the number of pages in the database.
57044: */
57045: nSrcPage = (int)sqlite3BtreeLastPage(p->pSrc);
57046: assert( nSrcPage>=0 );
57047: for(ii=0; (nPage<0 || ii<nPage) && p->iNext<=(Pgno)nSrcPage && !rc; ii++){
57048: const Pgno iSrcPg = p->iNext; /* Source page number */
57049: if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){
57050: DbPage *pSrcPg; /* Source page object */
57051: rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
57052: if( rc==SQLITE_OK ){
57053: rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg));
57054: sqlite3PagerUnref(pSrcPg);
57055: }
57056: }
57057: p->iNext++;
57058: }
57059: if( rc==SQLITE_OK ){
57060: p->nPagecount = nSrcPage;
57061: p->nRemaining = nSrcPage+1-p->iNext;
57062: if( p->iNext>(Pgno)nSrcPage ){
57063: rc = SQLITE_DONE;
57064: }else if( !p->isAttached ){
57065: attachBackupObject(p);
57066: }
57067: }
57068:
57069: /* Update the schema version field in the destination database. This
57070: ** is to make sure that the schema-version really does change in
57071: ** the case where the source and destination databases have the
57072: ** same schema version.
57073: */
57074: if( rc==SQLITE_DONE ){
1.2.2.1 ! misho 57075: if( nSrcPage==0 ){
! 57076: rc = sqlite3BtreeNewDb(p->pDest);
! 57077: nSrcPage = 1;
! 57078: }
! 57079: if( rc==SQLITE_OK || rc==SQLITE_DONE ){
! 57080: rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1);
! 57081: }
1.2 misho 57082: if( rc==SQLITE_OK ){
57083: if( p->pDestDb ){
1.2.2.1 ! misho 57084: sqlite3ResetAllSchemasOfConnection(p->pDestDb);
1.2 misho 57085: }
57086: if( destMode==PAGER_JOURNALMODE_WAL ){
57087: rc = sqlite3BtreeSetVersion(p->pDest, 2);
57088: }
57089: }
57090: if( rc==SQLITE_OK ){
57091: int nDestTruncate;
57092: /* Set nDestTruncate to the final number of pages in the destination
57093: ** database. The complication here is that the destination page
57094: ** size may be different to the source page size.
57095: **
57096: ** If the source page size is smaller than the destination page size,
57097: ** round up. In this case the call to sqlite3OsTruncate() below will
57098: ** fix the size of the file. However it is important to call
57099: ** sqlite3PagerTruncateImage() here so that any pages in the
57100: ** destination file that lie beyond the nDestTruncate page mark are
57101: ** journalled by PagerCommitPhaseOne() before they are destroyed
57102: ** by the file truncation.
57103: */
57104: assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) );
57105: assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) );
57106: if( pgszSrc<pgszDest ){
57107: int ratio = pgszDest/pgszSrc;
57108: nDestTruncate = (nSrcPage+ratio-1)/ratio;
57109: if( nDestTruncate==(int)PENDING_BYTE_PAGE(p->pDest->pBt) ){
57110: nDestTruncate--;
57111: }
57112: }else{
57113: nDestTruncate = nSrcPage * (pgszSrc/pgszDest);
57114: }
1.2.2.1 ! misho 57115: assert( nDestTruncate>0 );
1.2 misho 57116: sqlite3PagerTruncateImage(pDestPager, nDestTruncate);
57117:
57118: if( pgszSrc<pgszDest ){
57119: /* If the source page-size is smaller than the destination page-size,
57120: ** two extra things may need to happen:
57121: **
57122: ** * The destination may need to be truncated, and
57123: **
57124: ** * Data stored on the pages immediately following the
57125: ** pending-byte page in the source database may need to be
57126: ** copied into the destination database.
57127: */
57128: const i64 iSize = (i64)pgszSrc * (i64)nSrcPage;
57129: sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
57130: i64 iOff;
57131: i64 iEnd;
57132:
57133: assert( pFile );
1.2.2.1 ! misho 57134: assert( nDestTruncate==0
! 57135: || (i64)nDestTruncate*(i64)pgszDest >= iSize || (
1.2 misho 57136: nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
57137: && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest
57138: ));
57139:
57140: /* This call ensures that all data required to recreate the original
57141: ** database has been stored in the journal for pDestPager and the
57142: ** journal synced to disk. So at this point we may safely modify
57143: ** the database file in any way, knowing that if a power failure
57144: ** occurs, the original database will be reconstructed from the
57145: ** journal file. */
57146: rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1);
57147:
57148: /* Write the extra pages and truncate the database file as required */
57149: iEnd = MIN(PENDING_BYTE + pgszDest, iSize);
57150: for(
57151: iOff=PENDING_BYTE+pgszSrc;
57152: rc==SQLITE_OK && iOff<iEnd;
57153: iOff+=pgszSrc
57154: ){
57155: PgHdr *pSrcPg = 0;
57156: const Pgno iSrcPg = (Pgno)((iOff/pgszSrc)+1);
57157: rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
57158: if( rc==SQLITE_OK ){
57159: u8 *zData = sqlite3PagerGetData(pSrcPg);
57160: rc = sqlite3OsWrite(pFile, zData, pgszSrc, iOff);
57161: }
57162: sqlite3PagerUnref(pSrcPg);
57163: }
57164: if( rc==SQLITE_OK ){
57165: rc = backupTruncateFile(pFile, iSize);
57166: }
57167:
57168: /* Sync the database file to disk. */
57169: if( rc==SQLITE_OK ){
57170: rc = sqlite3PagerSync(pDestPager);
57171: }
57172: }else{
57173: rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 0);
57174: }
57175:
57176: /* Finish committing the transaction to the destination database. */
57177: if( SQLITE_OK==rc
57178: && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest, 0))
57179: ){
57180: rc = SQLITE_DONE;
57181: }
57182: }
57183: }
57184:
57185: /* If bCloseTrans is true, then this function opened a read transaction
57186: ** on the source database. Close the read transaction here. There is
57187: ** no need to check the return values of the btree methods here, as
57188: ** "committing" a read-only transaction cannot fail.
57189: */
57190: if( bCloseTrans ){
57191: TESTONLY( int rc2 );
57192: TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0);
57193: TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0);
57194: assert( rc2==SQLITE_OK );
57195: }
57196:
57197: if( rc==SQLITE_IOERR_NOMEM ){
57198: rc = SQLITE_NOMEM;
57199: }
57200: p->rc = rc;
57201: }
57202: if( p->pDestDb ){
57203: sqlite3_mutex_leave(p->pDestDb->mutex);
57204: }
57205: sqlite3BtreeLeave(p->pSrc);
57206: sqlite3_mutex_leave(p->pSrcDb->mutex);
57207: return rc;
57208: }
57209:
57210: /*
57211: ** Release all resources associated with an sqlite3_backup* handle.
57212: */
57213: SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p){
57214: sqlite3_backup **pp; /* Ptr to head of pagers backup list */
1.2.2.1 ! misho 57215: sqlite3 *pSrcDb; /* Source database connection */
1.2 misho 57216: int rc; /* Value to return */
57217:
57218: /* Enter the mutexes */
57219: if( p==0 ) return SQLITE_OK;
1.2.2.1 ! misho 57220: pSrcDb = p->pSrcDb;
! 57221: sqlite3_mutex_enter(pSrcDb->mutex);
1.2 misho 57222: sqlite3BtreeEnter(p->pSrc);
57223: if( p->pDestDb ){
57224: sqlite3_mutex_enter(p->pDestDb->mutex);
57225: }
57226:
57227: /* Detach this backup from the source pager. */
57228: if( p->pDestDb ){
57229: p->pSrc->nBackup--;
57230: }
57231: if( p->isAttached ){
57232: pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc));
57233: while( *pp!=p ){
57234: pp = &(*pp)->pNext;
57235: }
57236: *pp = p->pNext;
57237: }
57238:
57239: /* If a transaction is still open on the Btree, roll it back. */
1.2.2.1 ! misho 57240: sqlite3BtreeRollback(p->pDest, SQLITE_OK);
1.2 misho 57241:
57242: /* Set the error code of the destination database handle. */
57243: rc = (p->rc==SQLITE_DONE) ? SQLITE_OK : p->rc;
57244: sqlite3Error(p->pDestDb, rc, 0);
57245:
57246: /* Exit the mutexes and free the backup context structure. */
57247: if( p->pDestDb ){
1.2.2.1 ! misho 57248: sqlite3LeaveMutexAndCloseZombie(p->pDestDb);
1.2 misho 57249: }
57250: sqlite3BtreeLeave(p->pSrc);
57251: if( p->pDestDb ){
57252: /* EVIDENCE-OF: R-64852-21591 The sqlite3_backup object is created by a
57253: ** call to sqlite3_backup_init() and is destroyed by a call to
57254: ** sqlite3_backup_finish(). */
57255: sqlite3_free(p);
57256: }
1.2.2.1 ! misho 57257: sqlite3LeaveMutexAndCloseZombie(pSrcDb);
1.2 misho 57258: return rc;
57259: }
57260:
57261: /*
57262: ** Return the number of pages still to be backed up as of the most recent
57263: ** call to sqlite3_backup_step().
57264: */
57265: SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p){
57266: return p->nRemaining;
57267: }
57268:
57269: /*
57270: ** Return the total number of pages in the source database as of the most
57271: ** recent call to sqlite3_backup_step().
57272: */
57273: SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){
57274: return p->nPagecount;
57275: }
57276:
57277: /*
57278: ** This function is called after the contents of page iPage of the
57279: ** source database have been modified. If page iPage has already been
57280: ** copied into the destination database, then the data written to the
57281: ** destination is now invalidated. The destination copy of iPage needs
57282: ** to be updated with the new data before the backup operation is
57283: ** complete.
57284: **
57285: ** It is assumed that the mutex associated with the BtShared object
57286: ** corresponding to the source database is held when this function is
57287: ** called.
57288: */
57289: SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){
57290: sqlite3_backup *p; /* Iterator variable */
57291: for(p=pBackup; p; p=p->pNext){
57292: assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
57293: if( !isFatalError(p->rc) && iPage<p->iNext ){
57294: /* The backup process p has already copied page iPage. But now it
57295: ** has been modified by a transaction on the source pager. Copy
57296: ** the new data into the backup.
57297: */
57298: int rc;
57299: assert( p->pDestDb );
57300: sqlite3_mutex_enter(p->pDestDb->mutex);
57301: rc = backupOnePage(p, iPage, aData);
57302: sqlite3_mutex_leave(p->pDestDb->mutex);
57303: assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED );
57304: if( rc!=SQLITE_OK ){
57305: p->rc = rc;
57306: }
57307: }
57308: }
57309: }
57310:
57311: /*
57312: ** Restart the backup process. This is called when the pager layer
57313: ** detects that the database has been modified by an external database
57314: ** connection. In this case there is no way of knowing which of the
57315: ** pages that have been copied into the destination database are still
57316: ** valid and which are not, so the entire process needs to be restarted.
57317: **
57318: ** It is assumed that the mutex associated with the BtShared object
57319: ** corresponding to the source database is held when this function is
57320: ** called.
57321: */
57322: SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *pBackup){
57323: sqlite3_backup *p; /* Iterator variable */
57324: for(p=pBackup; p; p=p->pNext){
57325: assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) );
57326: p->iNext = 1;
57327: }
57328: }
57329:
57330: #ifndef SQLITE_OMIT_VACUUM
57331: /*
57332: ** Copy the complete content of pBtFrom into pBtTo. A transaction
57333: ** must be active for both files.
57334: **
57335: ** The size of file pTo may be reduced by this operation. If anything
57336: ** goes wrong, the transaction on pTo is rolled back. If successful, the
57337: ** transaction is committed before returning.
57338: */
57339: SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){
57340: int rc;
57341: sqlite3_file *pFd; /* File descriptor for database pTo */
57342: sqlite3_backup b;
57343: sqlite3BtreeEnter(pTo);
57344: sqlite3BtreeEnter(pFrom);
57345:
57346: assert( sqlite3BtreeIsInTrans(pTo) );
57347: pFd = sqlite3PagerFile(sqlite3BtreePager(pTo));
57348: if( pFd->pMethods ){
57349: i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom);
57350: rc = sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte);
57351: if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK;
57352: if( rc ) goto copy_finished;
57353: }
57354:
57355: /* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set
57356: ** to 0. This is used by the implementations of sqlite3_backup_step()
57357: ** and sqlite3_backup_finish() to detect that they are being called
57358: ** from this function, not directly by the user.
57359: */
57360: memset(&b, 0, sizeof(b));
57361: b.pSrcDb = pFrom->db;
57362: b.pSrc = pFrom;
57363: b.pDest = pTo;
57364: b.iNext = 1;
57365:
57366: /* 0x7FFFFFFF is the hard limit for the number of pages in a database
57367: ** file. By passing this as the number of pages to copy to
57368: ** sqlite3_backup_step(), we can guarantee that the copy finishes
57369: ** within a single call (unless an error occurs). The assert() statement
57370: ** checks this assumption - (p->rc) should be set to either SQLITE_DONE
57371: ** or an error code.
57372: */
57373: sqlite3_backup_step(&b, 0x7FFFFFFF);
57374: assert( b.rc!=SQLITE_OK );
57375: rc = sqlite3_backup_finish(&b);
57376: if( rc==SQLITE_OK ){
57377: pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED;
57378: }else{
57379: sqlite3PagerClearCache(sqlite3BtreePager(b.pDest));
57380: }
57381:
57382: assert( sqlite3BtreeIsInTrans(pTo)==0 );
57383: copy_finished:
57384: sqlite3BtreeLeave(pFrom);
57385: sqlite3BtreeLeave(pTo);
57386: return rc;
57387: }
57388: #endif /* SQLITE_OMIT_VACUUM */
57389:
57390: /************** End of backup.c **********************************************/
57391: /************** Begin file vdbemem.c *****************************************/
57392: /*
57393: ** 2004 May 26
57394: **
57395: ** The author disclaims copyright to this source code. In place of
57396: ** a legal notice, here is a blessing:
57397: **
57398: ** May you do good and not evil.
57399: ** May you find forgiveness for yourself and forgive others.
57400: ** May you share freely, never taking more than you give.
57401: **
57402: *************************************************************************
57403: **
57404: ** This file contains code use to manipulate "Mem" structure. A "Mem"
57405: ** stores a single value in the VDBE. Mem is an opaque structure visible
57406: ** only within the VDBE. Interface routines refer to a Mem using the
57407: ** name sqlite_value
57408: */
57409:
57410: /*
57411: ** If pMem is an object with a valid string representation, this routine
57412: ** ensures the internal encoding for the string representation is
57413: ** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE.
57414: **
57415: ** If pMem is not a string object, or the encoding of the string
57416: ** representation is already stored using the requested encoding, then this
57417: ** routine is a no-op.
57418: **
57419: ** SQLITE_OK is returned if the conversion is successful (or not required).
57420: ** SQLITE_NOMEM may be returned if a malloc() fails during conversion
57421: ** between formats.
57422: */
57423: SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){
57424: int rc;
57425: assert( (pMem->flags&MEM_RowSet)==0 );
57426: assert( desiredEnc==SQLITE_UTF8 || desiredEnc==SQLITE_UTF16LE
57427: || desiredEnc==SQLITE_UTF16BE );
57428: if( !(pMem->flags&MEM_Str) || pMem->enc==desiredEnc ){
57429: return SQLITE_OK;
57430: }
57431: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57432: #ifdef SQLITE_OMIT_UTF16
57433: return SQLITE_ERROR;
57434: #else
57435:
57436: /* MemTranslate() may return SQLITE_OK or SQLITE_NOMEM. If NOMEM is returned,
57437: ** then the encoding of the value may not have changed.
57438: */
57439: rc = sqlite3VdbeMemTranslate(pMem, (u8)desiredEnc);
57440: assert(rc==SQLITE_OK || rc==SQLITE_NOMEM);
57441: assert(rc==SQLITE_OK || pMem->enc!=desiredEnc);
57442: assert(rc==SQLITE_NOMEM || pMem->enc==desiredEnc);
57443: return rc;
57444: #endif
57445: }
57446:
57447: /*
57448: ** Make sure pMem->z points to a writable allocation of at least
57449: ** n bytes.
57450: **
1.2.2.1 ! misho 57451: ** If the third argument passed to this function is true, then memory
! 57452: ** cell pMem must contain a string or blob. In this case the content is
! 57453: ** preserved. Otherwise, if the third parameter to this function is false,
! 57454: ** any current string or blob value may be discarded.
1.2 misho 57455: **
57456: ** This function sets the MEM_Dyn flag and clears any xDel callback.
57457: ** It also clears MEM_Ephem and MEM_Static. If the preserve flag is
57458: ** not set, Mem.n is zeroed.
57459: */
57460: SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve){
57461: assert( 1 >=
57462: ((pMem->zMalloc && pMem->zMalloc==pMem->z) ? 1 : 0) +
57463: (((pMem->flags&MEM_Dyn)&&pMem->xDel) ? 1 : 0) +
57464: ((pMem->flags&MEM_Ephem) ? 1 : 0) +
57465: ((pMem->flags&MEM_Static) ? 1 : 0)
57466: );
57467: assert( (pMem->flags&MEM_RowSet)==0 );
57468:
1.2.2.1 ! misho 57469: /* If the preserve flag is set to true, then the memory cell must already
! 57470: ** contain a valid string or blob value. */
! 57471: assert( preserve==0 || pMem->flags&(MEM_Blob|MEM_Str) );
! 57472:
1.2 misho 57473: if( n<32 ) n = 32;
57474: if( sqlite3DbMallocSize(pMem->db, pMem->zMalloc)<n ){
57475: if( preserve && pMem->z==pMem->zMalloc ){
57476: pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n);
57477: preserve = 0;
57478: }else{
57479: sqlite3DbFree(pMem->db, pMem->zMalloc);
57480: pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n);
57481: }
57482: }
57483:
57484: if( pMem->z && preserve && pMem->zMalloc && pMem->z!=pMem->zMalloc ){
57485: memcpy(pMem->zMalloc, pMem->z, pMem->n);
57486: }
57487: if( pMem->flags&MEM_Dyn && pMem->xDel ){
1.2.2.1 ! misho 57488: assert( pMem->xDel!=SQLITE_DYNAMIC );
1.2 misho 57489: pMem->xDel((void *)(pMem->z));
57490: }
57491:
57492: pMem->z = pMem->zMalloc;
57493: if( pMem->z==0 ){
57494: pMem->flags = MEM_Null;
57495: }else{
57496: pMem->flags &= ~(MEM_Ephem|MEM_Static);
57497: }
57498: pMem->xDel = 0;
57499: return (pMem->z ? SQLITE_OK : SQLITE_NOMEM);
57500: }
57501:
57502: /*
57503: ** Make the given Mem object MEM_Dyn. In other words, make it so
57504: ** that any TEXT or BLOB content is stored in memory obtained from
57505: ** malloc(). In this way, we know that the memory is safe to be
57506: ** overwritten or altered.
57507: **
57508: ** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails.
57509: */
57510: SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){
57511: int f;
57512: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57513: assert( (pMem->flags&MEM_RowSet)==0 );
57514: ExpandBlob(pMem);
57515: f = pMem->flags;
57516: if( (f&(MEM_Str|MEM_Blob)) && pMem->z!=pMem->zMalloc ){
57517: if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){
57518: return SQLITE_NOMEM;
57519: }
57520: pMem->z[pMem->n] = 0;
57521: pMem->z[pMem->n+1] = 0;
57522: pMem->flags |= MEM_Term;
57523: #ifdef SQLITE_DEBUG
57524: pMem->pScopyFrom = 0;
57525: #endif
57526: }
57527:
57528: return SQLITE_OK;
57529: }
57530:
57531: /*
57532: ** If the given Mem* has a zero-filled tail, turn it into an ordinary
57533: ** blob stored in dynamically allocated space.
57534: */
57535: #ifndef SQLITE_OMIT_INCRBLOB
57536: SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){
57537: if( pMem->flags & MEM_Zero ){
57538: int nByte;
57539: assert( pMem->flags&MEM_Blob );
57540: assert( (pMem->flags&MEM_RowSet)==0 );
57541: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57542:
57543: /* Set nByte to the number of bytes required to store the expanded blob. */
57544: nByte = pMem->n + pMem->u.nZero;
57545: if( nByte<=0 ){
57546: nByte = 1;
57547: }
57548: if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){
57549: return SQLITE_NOMEM;
57550: }
57551:
57552: memset(&pMem->z[pMem->n], 0, pMem->u.nZero);
57553: pMem->n += pMem->u.nZero;
57554: pMem->flags &= ~(MEM_Zero|MEM_Term);
57555: }
57556: return SQLITE_OK;
57557: }
57558: #endif
57559:
57560:
57561: /*
57562: ** Make sure the given Mem is \u0000 terminated.
57563: */
57564: SQLITE_PRIVATE int sqlite3VdbeMemNulTerminate(Mem *pMem){
57565: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57566: if( (pMem->flags & MEM_Term)!=0 || (pMem->flags & MEM_Str)==0 ){
57567: return SQLITE_OK; /* Nothing to do */
57568: }
57569: if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){
57570: return SQLITE_NOMEM;
57571: }
57572: pMem->z[pMem->n] = 0;
57573: pMem->z[pMem->n+1] = 0;
57574: pMem->flags |= MEM_Term;
57575: return SQLITE_OK;
57576: }
57577:
57578: /*
57579: ** Add MEM_Str to the set of representations for the given Mem. Numbers
57580: ** are converted using sqlite3_snprintf(). Converting a BLOB to a string
57581: ** is a no-op.
57582: **
57583: ** Existing representations MEM_Int and MEM_Real are *not* invalidated.
57584: **
57585: ** A MEM_Null value will never be passed to this function. This function is
57586: ** used for converting values to text for returning to the user (i.e. via
57587: ** sqlite3_value_text()), or for ensuring that values to be used as btree
57588: ** keys are strings. In the former case a NULL pointer is returned the
57589: ** user and the later is an internal programming error.
57590: */
57591: SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, int enc){
57592: int rc = SQLITE_OK;
57593: int fg = pMem->flags;
57594: const int nByte = 32;
57595:
57596: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57597: assert( !(fg&MEM_Zero) );
57598: assert( !(fg&(MEM_Str|MEM_Blob)) );
57599: assert( fg&(MEM_Int|MEM_Real) );
57600: assert( (pMem->flags&MEM_RowSet)==0 );
57601: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57602:
57603:
57604: if( sqlite3VdbeMemGrow(pMem, nByte, 0) ){
57605: return SQLITE_NOMEM;
57606: }
57607:
57608: /* For a Real or Integer, use sqlite3_mprintf() to produce the UTF-8
57609: ** string representation of the value. Then, if the required encoding
57610: ** is UTF-16le or UTF-16be do a translation.
57611: **
57612: ** FIX ME: It would be better if sqlite3_snprintf() could do UTF-16.
57613: */
57614: if( fg & MEM_Int ){
57615: sqlite3_snprintf(nByte, pMem->z, "%lld", pMem->u.i);
57616: }else{
57617: assert( fg & MEM_Real );
57618: sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
57619: }
57620: pMem->n = sqlite3Strlen30(pMem->z);
57621: pMem->enc = SQLITE_UTF8;
57622: pMem->flags |= MEM_Str|MEM_Term;
57623: sqlite3VdbeChangeEncoding(pMem, enc);
57624: return rc;
57625: }
57626:
57627: /*
57628: ** Memory cell pMem contains the context of an aggregate function.
57629: ** This routine calls the finalize method for that function. The
57630: ** result of the aggregate is stored back into pMem.
57631: **
57632: ** Return SQLITE_ERROR if the finalizer reports an error. SQLITE_OK
57633: ** otherwise.
57634: */
57635: SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){
57636: int rc = SQLITE_OK;
57637: if( ALWAYS(pFunc && pFunc->xFinalize) ){
57638: sqlite3_context ctx;
57639: assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef );
57640: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57641: memset(&ctx, 0, sizeof(ctx));
57642: ctx.s.flags = MEM_Null;
57643: ctx.s.db = pMem->db;
57644: ctx.pMem = pMem;
57645: ctx.pFunc = pFunc;
57646: pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */
57647: assert( 0==(pMem->flags&MEM_Dyn) && !pMem->xDel );
57648: sqlite3DbFree(pMem->db, pMem->zMalloc);
57649: memcpy(pMem, &ctx.s, sizeof(ctx.s));
57650: rc = ctx.isError;
57651: }
57652: return rc;
57653: }
57654:
57655: /*
57656: ** If the memory cell contains a string value that must be freed by
57657: ** invoking an external callback, free it now. Calling this function
57658: ** does not free any Mem.zMalloc buffer.
57659: */
57660: SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p){
57661: assert( p->db==0 || sqlite3_mutex_held(p->db->mutex) );
57662: if( p->flags&MEM_Agg ){
57663: sqlite3VdbeMemFinalize(p, p->u.pDef);
57664: assert( (p->flags & MEM_Agg)==0 );
57665: sqlite3VdbeMemRelease(p);
57666: }else if( p->flags&MEM_Dyn && p->xDel ){
57667: assert( (p->flags&MEM_RowSet)==0 );
1.2.2.1 ! misho 57668: assert( p->xDel!=SQLITE_DYNAMIC );
1.2 misho 57669: p->xDel((void *)p->z);
57670: p->xDel = 0;
57671: }else if( p->flags&MEM_RowSet ){
57672: sqlite3RowSetClear(p->u.pRowSet);
57673: }else if( p->flags&MEM_Frame ){
57674: sqlite3VdbeMemSetNull(p);
57675: }
57676: }
57677:
57678: /*
57679: ** Release any memory held by the Mem. This may leave the Mem in an
57680: ** inconsistent state, for example with (Mem.z==0) and
57681: ** (Mem.type==SQLITE_TEXT).
57682: */
57683: SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){
57684: VdbeMemRelease(p);
57685: sqlite3DbFree(p->db, p->zMalloc);
57686: p->z = 0;
57687: p->zMalloc = 0;
57688: p->xDel = 0;
57689: }
57690:
57691: /*
57692: ** Convert a 64-bit IEEE double into a 64-bit signed integer.
57693: ** If the double is too large, return 0x8000000000000000.
57694: **
57695: ** Most systems appear to do this simply by assigning
57696: ** variables and without the extra range tests. But
57697: ** there are reports that windows throws an expection
57698: ** if the floating point value is out of range. (See ticket #2880.)
57699: ** Because we do not completely understand the problem, we will
57700: ** take the conservative approach and always do range tests
57701: ** before attempting the conversion.
57702: */
57703: static i64 doubleToInt64(double r){
57704: #ifdef SQLITE_OMIT_FLOATING_POINT
57705: /* When floating-point is omitted, double and int64 are the same thing */
57706: return r;
57707: #else
57708: /*
57709: ** Many compilers we encounter do not define constants for the
57710: ** minimum and maximum 64-bit integers, or they define them
57711: ** inconsistently. And many do not understand the "LL" notation.
57712: ** So we define our own static constants here using nothing
57713: ** larger than a 32-bit integer constant.
57714: */
57715: static const i64 maxInt = LARGEST_INT64;
57716: static const i64 minInt = SMALLEST_INT64;
57717:
57718: if( r<(double)minInt ){
57719: return minInt;
57720: }else if( r>(double)maxInt ){
57721: /* minInt is correct here - not maxInt. It turns out that assigning
57722: ** a very large positive number to an integer results in a very large
57723: ** negative integer. This makes no sense, but it is what x86 hardware
57724: ** does so for compatibility we will do the same in software. */
57725: return minInt;
57726: }else{
57727: return (i64)r;
57728: }
57729: #endif
57730: }
57731:
57732: /*
57733: ** Return some kind of integer value which is the best we can do
57734: ** at representing the value that *pMem describes as an integer.
57735: ** If pMem is an integer, then the value is exact. If pMem is
57736: ** a floating-point then the value returned is the integer part.
57737: ** If pMem is a string or blob, then we make an attempt to convert
57738: ** it into a integer and return that. If pMem represents an
57739: ** an SQL-NULL value, return 0.
57740: **
57741: ** If pMem represents a string value, its encoding might be changed.
57742: */
57743: SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){
57744: int flags;
57745: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57746: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57747: flags = pMem->flags;
57748: if( flags & MEM_Int ){
57749: return pMem->u.i;
57750: }else if( flags & MEM_Real ){
57751: return doubleToInt64(pMem->r);
57752: }else if( flags & (MEM_Str|MEM_Blob) ){
57753: i64 value = 0;
57754: assert( pMem->z || pMem->n==0 );
57755: testcase( pMem->z==0 );
57756: sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc);
57757: return value;
57758: }else{
57759: return 0;
57760: }
57761: }
57762:
57763: /*
57764: ** Return the best representation of pMem that we can get into a
57765: ** double. If pMem is already a double or an integer, return its
57766: ** value. If it is a string or blob, try to convert it to a double.
57767: ** If it is a NULL, return 0.0.
57768: */
57769: SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){
57770: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57771: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57772: if( pMem->flags & MEM_Real ){
57773: return pMem->r;
57774: }else if( pMem->flags & MEM_Int ){
57775: return (double)pMem->u.i;
57776: }else if( pMem->flags & (MEM_Str|MEM_Blob) ){
57777: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
57778: double val = (double)0;
57779: sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc);
57780: return val;
57781: }else{
57782: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
57783: return (double)0;
57784: }
57785: }
57786:
57787: /*
57788: ** The MEM structure is already a MEM_Real. Try to also make it a
57789: ** MEM_Int if we can.
57790: */
57791: SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem *pMem){
57792: assert( pMem->flags & MEM_Real );
57793: assert( (pMem->flags & MEM_RowSet)==0 );
57794: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57795: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57796:
57797: pMem->u.i = doubleToInt64(pMem->r);
57798:
57799: /* Only mark the value as an integer if
57800: **
57801: ** (1) the round-trip conversion real->int->real is a no-op, and
57802: ** (2) The integer is neither the largest nor the smallest
57803: ** possible integer (ticket #3922)
57804: **
57805: ** The second and third terms in the following conditional enforces
57806: ** the second condition under the assumption that addition overflow causes
57807: ** values to wrap around. On x86 hardware, the third term is always
57808: ** true and could be omitted. But we leave it in because other
57809: ** architectures might behave differently.
57810: */
1.2.2.1 ! misho 57811: if( pMem->r==(double)pMem->u.i
! 57812: && pMem->u.i>SMALLEST_INT64
! 57813: #if defined(__i486__) || defined(__x86_64__)
! 57814: && ALWAYS(pMem->u.i<LARGEST_INT64)
! 57815: #else
! 57816: && pMem->u.i<LARGEST_INT64
! 57817: #endif
! 57818: ){
1.2 misho 57819: pMem->flags |= MEM_Int;
57820: }
57821: }
57822:
57823: /*
57824: ** Convert pMem to type integer. Invalidate any prior representations.
57825: */
57826: SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem *pMem){
57827: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57828: assert( (pMem->flags & MEM_RowSet)==0 );
57829: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57830:
57831: pMem->u.i = sqlite3VdbeIntValue(pMem);
57832: MemSetTypeFlag(pMem, MEM_Int);
57833: return SQLITE_OK;
57834: }
57835:
57836: /*
57837: ** Convert pMem so that it is of type MEM_Real.
57838: ** Invalidate any prior representations.
57839: */
57840: SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){
57841: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57842: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
57843:
57844: pMem->r = sqlite3VdbeRealValue(pMem);
57845: MemSetTypeFlag(pMem, MEM_Real);
57846: return SQLITE_OK;
57847: }
57848:
57849: /*
57850: ** Convert pMem so that it has types MEM_Real or MEM_Int or both.
57851: ** Invalidate any prior representations.
57852: **
57853: ** Every effort is made to force the conversion, even if the input
57854: ** is a string that does not look completely like a number. Convert
57855: ** as much of the string as we can and ignore the rest.
57856: */
57857: SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){
57858: if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){
57859: assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 );
57860: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
57861: if( 0==sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc) ){
57862: MemSetTypeFlag(pMem, MEM_Int);
57863: }else{
57864: pMem->r = sqlite3VdbeRealValue(pMem);
57865: MemSetTypeFlag(pMem, MEM_Real);
57866: sqlite3VdbeIntegerAffinity(pMem);
57867: }
57868: }
57869: assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 );
57870: pMem->flags &= ~(MEM_Str|MEM_Blob);
57871: return SQLITE_OK;
57872: }
57873:
57874: /*
57875: ** Delete any previous value and set the value stored in *pMem to NULL.
57876: */
57877: SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem *pMem){
57878: if( pMem->flags & MEM_Frame ){
57879: VdbeFrame *pFrame = pMem->u.pFrame;
57880: pFrame->pParent = pFrame->v->pDelFrame;
57881: pFrame->v->pDelFrame = pFrame;
57882: }
57883: if( pMem->flags & MEM_RowSet ){
57884: sqlite3RowSetClear(pMem->u.pRowSet);
57885: }
57886: MemSetTypeFlag(pMem, MEM_Null);
57887: pMem->type = SQLITE_NULL;
57888: }
57889:
57890: /*
57891: ** Delete any previous value and set the value to be a BLOB of length
57892: ** n containing all zeros.
57893: */
57894: SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem *pMem, int n){
57895: sqlite3VdbeMemRelease(pMem);
57896: pMem->flags = MEM_Blob|MEM_Zero;
57897: pMem->type = SQLITE_BLOB;
57898: pMem->n = 0;
57899: if( n<0 ) n = 0;
57900: pMem->u.nZero = n;
57901: pMem->enc = SQLITE_UTF8;
57902:
57903: #ifdef SQLITE_OMIT_INCRBLOB
57904: sqlite3VdbeMemGrow(pMem, n, 0);
57905: if( pMem->z ){
57906: pMem->n = n;
57907: memset(pMem->z, 0, n);
57908: }
57909: #endif
57910: }
57911:
57912: /*
57913: ** Delete any previous value and set the value stored in *pMem to val,
57914: ** manifest type INTEGER.
57915: */
57916: SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){
57917: sqlite3VdbeMemRelease(pMem);
57918: pMem->u.i = val;
57919: pMem->flags = MEM_Int;
57920: pMem->type = SQLITE_INTEGER;
57921: }
57922:
57923: #ifndef SQLITE_OMIT_FLOATING_POINT
57924: /*
57925: ** Delete any previous value and set the value stored in *pMem to val,
57926: ** manifest type REAL.
57927: */
57928: SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem *pMem, double val){
57929: if( sqlite3IsNaN(val) ){
57930: sqlite3VdbeMemSetNull(pMem);
57931: }else{
57932: sqlite3VdbeMemRelease(pMem);
57933: pMem->r = val;
57934: pMem->flags = MEM_Real;
57935: pMem->type = SQLITE_FLOAT;
57936: }
57937: }
57938: #endif
57939:
57940: /*
57941: ** Delete any previous value and set the value of pMem to be an
57942: ** empty boolean index.
57943: */
57944: SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem *pMem){
57945: sqlite3 *db = pMem->db;
57946: assert( db!=0 );
57947: assert( (pMem->flags & MEM_RowSet)==0 );
57948: sqlite3VdbeMemRelease(pMem);
57949: pMem->zMalloc = sqlite3DbMallocRaw(db, 64);
57950: if( db->mallocFailed ){
57951: pMem->flags = MEM_Null;
57952: }else{
57953: assert( pMem->zMalloc );
57954: pMem->u.pRowSet = sqlite3RowSetInit(db, pMem->zMalloc,
57955: sqlite3DbMallocSize(db, pMem->zMalloc));
57956: assert( pMem->u.pRowSet!=0 );
57957: pMem->flags = MEM_RowSet;
57958: }
57959: }
57960:
57961: /*
57962: ** Return true if the Mem object contains a TEXT or BLOB that is
57963: ** too large - whose size exceeds SQLITE_MAX_LENGTH.
57964: */
57965: SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){
57966: assert( p->db!=0 );
57967: if( p->flags & (MEM_Str|MEM_Blob) ){
57968: int n = p->n;
57969: if( p->flags & MEM_Zero ){
57970: n += p->u.nZero;
57971: }
57972: return n>p->db->aLimit[SQLITE_LIMIT_LENGTH];
57973: }
57974: return 0;
57975: }
57976:
57977: #ifdef SQLITE_DEBUG
57978: /*
57979: ** This routine prepares a memory cell for modication by breaking
57980: ** its link to a shallow copy and by marking any current shallow
57981: ** copies of this cell as invalid.
57982: **
57983: ** This is used for testing and debugging only - to make sure shallow
57984: ** copies are not misused.
57985: */
57986: SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){
57987: int i;
57988: Mem *pX;
57989: for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){
57990: if( pX->pScopyFrom==pMem ){
57991: pX->flags |= MEM_Invalid;
57992: pX->pScopyFrom = 0;
57993: }
57994: }
57995: pMem->pScopyFrom = 0;
57996: }
57997: #endif /* SQLITE_DEBUG */
57998:
57999: /*
58000: ** Size of struct Mem not including the Mem.zMalloc member.
58001: */
58002: #define MEMCELLSIZE (size_t)(&(((Mem *)0)->zMalloc))
58003:
58004: /*
58005: ** Make an shallow copy of pFrom into pTo. Prior contents of
58006: ** pTo are freed. The pFrom->z field is not duplicated. If
58007: ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z
58008: ** and flags gets srcType (either MEM_Ephem or MEM_Static).
58009: */
58010: SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){
58011: assert( (pFrom->flags & MEM_RowSet)==0 );
58012: VdbeMemRelease(pTo);
58013: memcpy(pTo, pFrom, MEMCELLSIZE);
58014: pTo->xDel = 0;
58015: if( (pFrom->flags&MEM_Static)==0 ){
58016: pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem);
58017: assert( srcType==MEM_Ephem || srcType==MEM_Static );
58018: pTo->flags |= srcType;
58019: }
58020: }
58021:
58022: /*
58023: ** Make a full copy of pFrom into pTo. Prior contents of pTo are
58024: ** freed before the copy is made.
58025: */
58026: SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){
58027: int rc = SQLITE_OK;
58028:
58029: assert( (pFrom->flags & MEM_RowSet)==0 );
58030: VdbeMemRelease(pTo);
58031: memcpy(pTo, pFrom, MEMCELLSIZE);
58032: pTo->flags &= ~MEM_Dyn;
58033:
58034: if( pTo->flags&(MEM_Str|MEM_Blob) ){
58035: if( 0==(pFrom->flags&MEM_Static) ){
58036: pTo->flags |= MEM_Ephem;
58037: rc = sqlite3VdbeMemMakeWriteable(pTo);
58038: }
58039: }
58040:
58041: return rc;
58042: }
58043:
58044: /*
58045: ** Transfer the contents of pFrom to pTo. Any existing value in pTo is
58046: ** freed. If pFrom contains ephemeral data, a copy is made.
58047: **
58048: ** pFrom contains an SQL NULL when this routine returns.
58049: */
58050: SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){
58051: assert( pFrom->db==0 || sqlite3_mutex_held(pFrom->db->mutex) );
58052: assert( pTo->db==0 || sqlite3_mutex_held(pTo->db->mutex) );
58053: assert( pFrom->db==0 || pTo->db==0 || pFrom->db==pTo->db );
58054:
58055: sqlite3VdbeMemRelease(pTo);
58056: memcpy(pTo, pFrom, sizeof(Mem));
58057: pFrom->flags = MEM_Null;
58058: pFrom->xDel = 0;
58059: pFrom->zMalloc = 0;
58060: }
58061:
58062: /*
58063: ** Change the value of a Mem to be a string or a BLOB.
58064: **
58065: ** The memory management strategy depends on the value of the xDel
58066: ** parameter. If the value passed is SQLITE_TRANSIENT, then the
58067: ** string is copied into a (possibly existing) buffer managed by the
58068: ** Mem structure. Otherwise, any existing buffer is freed and the
58069: ** pointer copied.
58070: **
58071: ** If the string is too large (if it exceeds the SQLITE_LIMIT_LENGTH
58072: ** size limit) then no memory allocation occurs. If the string can be
58073: ** stored without allocating memory, then it is. If a memory allocation
58074: ** is required to store the string, then value of pMem is unchanged. In
58075: ** either case, SQLITE_TOOBIG is returned.
58076: */
58077: SQLITE_PRIVATE int sqlite3VdbeMemSetStr(
58078: Mem *pMem, /* Memory cell to set to string value */
58079: const char *z, /* String pointer */
58080: int n, /* Bytes in string, or negative */
58081: u8 enc, /* Encoding of z. 0 for BLOBs */
58082: void (*xDel)(void*) /* Destructor function */
58083: ){
58084: int nByte = n; /* New value for pMem->n */
58085: int iLimit; /* Maximum allowed string or blob size */
58086: u16 flags = 0; /* New value for pMem->flags */
58087:
58088: assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) );
58089: assert( (pMem->flags & MEM_RowSet)==0 );
58090:
58091: /* If z is a NULL pointer, set pMem to contain an SQL NULL. */
58092: if( !z ){
58093: sqlite3VdbeMemSetNull(pMem);
58094: return SQLITE_OK;
58095: }
58096:
58097: if( pMem->db ){
58098: iLimit = pMem->db->aLimit[SQLITE_LIMIT_LENGTH];
58099: }else{
58100: iLimit = SQLITE_MAX_LENGTH;
58101: }
58102: flags = (enc==0?MEM_Blob:MEM_Str);
58103: if( nByte<0 ){
58104: assert( enc!=0 );
58105: if( enc==SQLITE_UTF8 ){
58106: for(nByte=0; nByte<=iLimit && z[nByte]; nByte++){}
58107: }else{
58108: for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){}
58109: }
58110: flags |= MEM_Term;
58111: }
58112:
58113: /* The following block sets the new values of Mem.z and Mem.xDel. It
58114: ** also sets a flag in local variable "flags" to indicate the memory
58115: ** management (one of MEM_Dyn or MEM_Static).
58116: */
58117: if( xDel==SQLITE_TRANSIENT ){
58118: int nAlloc = nByte;
58119: if( flags&MEM_Term ){
58120: nAlloc += (enc==SQLITE_UTF8?1:2);
58121: }
58122: if( nByte>iLimit ){
58123: return SQLITE_TOOBIG;
58124: }
58125: if( sqlite3VdbeMemGrow(pMem, nAlloc, 0) ){
58126: return SQLITE_NOMEM;
58127: }
58128: memcpy(pMem->z, z, nAlloc);
58129: }else if( xDel==SQLITE_DYNAMIC ){
58130: sqlite3VdbeMemRelease(pMem);
58131: pMem->zMalloc = pMem->z = (char *)z;
58132: pMem->xDel = 0;
58133: }else{
58134: sqlite3VdbeMemRelease(pMem);
58135: pMem->z = (char *)z;
58136: pMem->xDel = xDel;
58137: flags |= ((xDel==SQLITE_STATIC)?MEM_Static:MEM_Dyn);
58138: }
58139:
58140: pMem->n = nByte;
58141: pMem->flags = flags;
58142: pMem->enc = (enc==0 ? SQLITE_UTF8 : enc);
58143: pMem->type = (enc==0 ? SQLITE_BLOB : SQLITE_TEXT);
58144:
58145: #ifndef SQLITE_OMIT_UTF16
58146: if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){
58147: return SQLITE_NOMEM;
58148: }
58149: #endif
58150:
58151: if( nByte>iLimit ){
58152: return SQLITE_TOOBIG;
58153: }
58154:
58155: return SQLITE_OK;
58156: }
58157:
58158: /*
58159: ** Compare the values contained by the two memory cells, returning
58160: ** negative, zero or positive if pMem1 is less than, equal to, or greater
58161: ** than pMem2. Sorting order is NULL's first, followed by numbers (integers
58162: ** and reals) sorted numerically, followed by text ordered by the collating
58163: ** sequence pColl and finally blob's ordered by memcmp().
58164: **
58165: ** Two NULL values are considered equal by this function.
58166: */
58167: SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){
58168: int rc;
58169: int f1, f2;
58170: int combined_flags;
58171:
58172: f1 = pMem1->flags;
58173: f2 = pMem2->flags;
58174: combined_flags = f1|f2;
58175: assert( (combined_flags & MEM_RowSet)==0 );
58176:
58177: /* If one value is NULL, it is less than the other. If both values
58178: ** are NULL, return 0.
58179: */
58180: if( combined_flags&MEM_Null ){
58181: return (f2&MEM_Null) - (f1&MEM_Null);
58182: }
58183:
58184: /* If one value is a number and the other is not, the number is less.
58185: ** If both are numbers, compare as reals if one is a real, or as integers
58186: ** if both values are integers.
58187: */
58188: if( combined_flags&(MEM_Int|MEM_Real) ){
58189: if( !(f1&(MEM_Int|MEM_Real)) ){
58190: return 1;
58191: }
58192: if( !(f2&(MEM_Int|MEM_Real)) ){
58193: return -1;
58194: }
58195: if( (f1 & f2 & MEM_Int)==0 ){
58196: double r1, r2;
58197: if( (f1&MEM_Real)==0 ){
58198: r1 = (double)pMem1->u.i;
58199: }else{
58200: r1 = pMem1->r;
58201: }
58202: if( (f2&MEM_Real)==0 ){
58203: r2 = (double)pMem2->u.i;
58204: }else{
58205: r2 = pMem2->r;
58206: }
58207: if( r1<r2 ) return -1;
58208: if( r1>r2 ) return 1;
58209: return 0;
58210: }else{
58211: assert( f1&MEM_Int );
58212: assert( f2&MEM_Int );
58213: if( pMem1->u.i < pMem2->u.i ) return -1;
58214: if( pMem1->u.i > pMem2->u.i ) return 1;
58215: return 0;
58216: }
58217: }
58218:
58219: /* If one value is a string and the other is a blob, the string is less.
58220: ** If both are strings, compare using the collating functions.
58221: */
58222: if( combined_flags&MEM_Str ){
58223: if( (f1 & MEM_Str)==0 ){
58224: return 1;
58225: }
58226: if( (f2 & MEM_Str)==0 ){
58227: return -1;
58228: }
58229:
58230: assert( pMem1->enc==pMem2->enc );
58231: assert( pMem1->enc==SQLITE_UTF8 ||
58232: pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE );
58233:
58234: /* The collation sequence must be defined at this point, even if
58235: ** the user deletes the collation sequence after the vdbe program is
58236: ** compiled (this was not always the case).
58237: */
58238: assert( !pColl || pColl->xCmp );
58239:
58240: if( pColl ){
58241: if( pMem1->enc==pColl->enc ){
58242: /* The strings are already in the correct encoding. Call the
58243: ** comparison function directly */
58244: return pColl->xCmp(pColl->pUser,pMem1->n,pMem1->z,pMem2->n,pMem2->z);
58245: }else{
58246: const void *v1, *v2;
58247: int n1, n2;
58248: Mem c1;
58249: Mem c2;
58250: memset(&c1, 0, sizeof(c1));
58251: memset(&c2, 0, sizeof(c2));
58252: sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem);
58253: sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem);
58254: v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc);
58255: n1 = v1==0 ? 0 : c1.n;
58256: v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc);
58257: n2 = v2==0 ? 0 : c2.n;
58258: rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2);
58259: sqlite3VdbeMemRelease(&c1);
58260: sqlite3VdbeMemRelease(&c2);
58261: return rc;
58262: }
58263: }
58264: /* If a NULL pointer was passed as the collate function, fall through
58265: ** to the blob case and use memcmp(). */
58266: }
58267:
58268: /* Both values must be blobs. Compare using memcmp(). */
58269: rc = memcmp(pMem1->z, pMem2->z, (pMem1->n>pMem2->n)?pMem2->n:pMem1->n);
58270: if( rc==0 ){
58271: rc = pMem1->n - pMem2->n;
58272: }
58273: return rc;
58274: }
58275:
58276: /*
58277: ** Move data out of a btree key or data field and into a Mem structure.
58278: ** The data or key is taken from the entry that pCur is currently pointing
58279: ** to. offset and amt determine what portion of the data or key to retrieve.
58280: ** key is true to get the key or false to get data. The result is written
58281: ** into the pMem element.
58282: **
58283: ** The pMem structure is assumed to be uninitialized. Any prior content
58284: ** is overwritten without being freed.
58285: **
58286: ** If this routine fails for any reason (malloc returns NULL or unable
58287: ** to read from the disk) then the pMem is left in an inconsistent state.
58288: */
58289: SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(
58290: BtCursor *pCur, /* Cursor pointing at record to retrieve. */
58291: int offset, /* Offset from the start of data to return bytes from. */
58292: int amt, /* Number of bytes to return. */
58293: int key, /* If true, retrieve from the btree key, not data. */
58294: Mem *pMem /* OUT: Return data in this Mem structure. */
58295: ){
58296: char *zData; /* Data from the btree layer */
58297: int available = 0; /* Number of bytes available on the local btree page */
58298: int rc = SQLITE_OK; /* Return code */
58299:
58300: assert( sqlite3BtreeCursorIsValid(pCur) );
58301:
58302: /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert()
58303: ** that both the BtShared and database handle mutexes are held. */
58304: assert( (pMem->flags & MEM_RowSet)==0 );
58305: if( key ){
58306: zData = (char *)sqlite3BtreeKeyFetch(pCur, &available);
58307: }else{
58308: zData = (char *)sqlite3BtreeDataFetch(pCur, &available);
58309: }
58310: assert( zData!=0 );
58311:
58312: if( offset+amt<=available && (pMem->flags&MEM_Dyn)==0 ){
58313: sqlite3VdbeMemRelease(pMem);
58314: pMem->z = &zData[offset];
58315: pMem->flags = MEM_Blob|MEM_Ephem;
58316: }else if( SQLITE_OK==(rc = sqlite3VdbeMemGrow(pMem, amt+2, 0)) ){
58317: pMem->flags = MEM_Blob|MEM_Dyn|MEM_Term;
58318: pMem->enc = 0;
58319: pMem->type = SQLITE_BLOB;
58320: if( key ){
58321: rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z);
58322: }else{
58323: rc = sqlite3BtreeData(pCur, offset, amt, pMem->z);
58324: }
58325: pMem->z[amt] = 0;
58326: pMem->z[amt+1] = 0;
58327: if( rc!=SQLITE_OK ){
58328: sqlite3VdbeMemRelease(pMem);
58329: }
58330: }
58331: pMem->n = amt;
58332:
58333: return rc;
58334: }
58335:
58336: /* This function is only available internally, it is not part of the
58337: ** external API. It works in a similar way to sqlite3_value_text(),
58338: ** except the data returned is in the encoding specified by the second
58339: ** parameter, which must be one of SQLITE_UTF16BE, SQLITE_UTF16LE or
58340: ** SQLITE_UTF8.
58341: **
58342: ** (2006-02-16:) The enc value can be or-ed with SQLITE_UTF16_ALIGNED.
58343: ** If that is the case, then the result must be aligned on an even byte
58344: ** boundary.
58345: */
58346: SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){
58347: if( !pVal ) return 0;
58348:
58349: assert( pVal->db==0 || sqlite3_mutex_held(pVal->db->mutex) );
58350: assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) );
58351: assert( (pVal->flags & MEM_RowSet)==0 );
58352:
58353: if( pVal->flags&MEM_Null ){
58354: return 0;
58355: }
58356: assert( (MEM_Blob>>3) == MEM_Str );
58357: pVal->flags |= (pVal->flags & MEM_Blob)>>3;
58358: ExpandBlob(pVal);
58359: if( pVal->flags&MEM_Str ){
58360: sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED);
58361: if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){
58362: assert( (pVal->flags & (MEM_Ephem|MEM_Static))!=0 );
58363: if( sqlite3VdbeMemMakeWriteable(pVal)!=SQLITE_OK ){
58364: return 0;
58365: }
58366: }
58367: sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */
58368: }else{
58369: assert( (pVal->flags&MEM_Blob)==0 );
58370: sqlite3VdbeMemStringify(pVal, enc);
58371: assert( 0==(1&SQLITE_PTR_TO_INT(pVal->z)) );
58372: }
58373: assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0
58374: || pVal->db->mallocFailed );
58375: if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){
58376: return pVal->z;
58377: }else{
58378: return 0;
58379: }
58380: }
58381:
58382: /*
58383: ** Create a new sqlite3_value object.
58384: */
58385: SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *db){
58386: Mem *p = sqlite3DbMallocZero(db, sizeof(*p));
58387: if( p ){
58388: p->flags = MEM_Null;
58389: p->type = SQLITE_NULL;
58390: p->db = db;
58391: }
58392: return p;
58393: }
58394:
58395: /*
58396: ** Create a new sqlite3_value object, containing the value of pExpr.
58397: **
58398: ** This only works for very simple expressions that consist of one constant
58399: ** token (i.e. "5", "5.1", "'a string'"). If the expression can
58400: ** be converted directly into a value, then the value is allocated and
58401: ** a pointer written to *ppVal. The caller is responsible for deallocating
58402: ** the value by passing it to sqlite3ValueFree() later on. If the expression
58403: ** cannot be converted to a value, then *ppVal is set to NULL.
58404: */
58405: SQLITE_PRIVATE int sqlite3ValueFromExpr(
58406: sqlite3 *db, /* The database connection */
58407: Expr *pExpr, /* The expression to evaluate */
58408: u8 enc, /* Encoding to use */
58409: u8 affinity, /* Affinity to use */
58410: sqlite3_value **ppVal /* Write the new value here */
58411: ){
58412: int op;
58413: char *zVal = 0;
58414: sqlite3_value *pVal = 0;
58415: int negInt = 1;
58416: const char *zNeg = "";
58417:
58418: if( !pExpr ){
58419: *ppVal = 0;
58420: return SQLITE_OK;
58421: }
58422: op = pExpr->op;
58423:
58424: /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT3.
58425: ** The ifdef here is to enable us to achieve 100% branch test coverage even
58426: ** when SQLITE_ENABLE_STAT3 is omitted.
58427: */
58428: #ifdef SQLITE_ENABLE_STAT3
58429: if( op==TK_REGISTER ) op = pExpr->op2;
58430: #else
58431: if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
58432: #endif
58433:
58434: /* Handle negative integers in a single step. This is needed in the
58435: ** case when the value is -9223372036854775808.
58436: */
58437: if( op==TK_UMINUS
58438: && (pExpr->pLeft->op==TK_INTEGER || pExpr->pLeft->op==TK_FLOAT) ){
58439: pExpr = pExpr->pLeft;
58440: op = pExpr->op;
58441: negInt = -1;
58442: zNeg = "-";
58443: }
58444:
58445: if( op==TK_STRING || op==TK_FLOAT || op==TK_INTEGER ){
58446: pVal = sqlite3ValueNew(db);
58447: if( pVal==0 ) goto no_mem;
58448: if( ExprHasProperty(pExpr, EP_IntValue) ){
58449: sqlite3VdbeMemSetInt64(pVal, (i64)pExpr->u.iValue*negInt);
58450: }else{
58451: zVal = sqlite3MPrintf(db, "%s%s", zNeg, pExpr->u.zToken);
58452: if( zVal==0 ) goto no_mem;
58453: sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC);
58454: if( op==TK_FLOAT ) pVal->type = SQLITE_FLOAT;
58455: }
58456: if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){
58457: sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8);
58458: }else{
58459: sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8);
58460: }
58461: if( pVal->flags & (MEM_Int|MEM_Real) ) pVal->flags &= ~MEM_Str;
58462: if( enc!=SQLITE_UTF8 ){
58463: sqlite3VdbeChangeEncoding(pVal, enc);
58464: }
58465: }else if( op==TK_UMINUS ) {
58466: /* This branch happens for multiple negative signs. Ex: -(-5) */
58467: if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) ){
58468: sqlite3VdbeMemNumerify(pVal);
58469: if( pVal->u.i==SMALLEST_INT64 ){
58470: pVal->flags &= MEM_Int;
58471: pVal->flags |= MEM_Real;
58472: pVal->r = (double)LARGEST_INT64;
58473: }else{
58474: pVal->u.i = -pVal->u.i;
58475: }
58476: pVal->r = -pVal->r;
58477: sqlite3ValueApplyAffinity(pVal, affinity, enc);
58478: }
58479: }else if( op==TK_NULL ){
58480: pVal = sqlite3ValueNew(db);
58481: if( pVal==0 ) goto no_mem;
58482: }
58483: #ifndef SQLITE_OMIT_BLOB_LITERAL
58484: else if( op==TK_BLOB ){
58485: int nVal;
58486: assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
58487: assert( pExpr->u.zToken[1]=='\'' );
58488: pVal = sqlite3ValueNew(db);
58489: if( !pVal ) goto no_mem;
58490: zVal = &pExpr->u.zToken[2];
58491: nVal = sqlite3Strlen30(zVal)-1;
58492: assert( zVal[nVal]=='\'' );
58493: sqlite3VdbeMemSetStr(pVal, sqlite3HexToBlob(db, zVal, nVal), nVal/2,
58494: 0, SQLITE_DYNAMIC);
58495: }
58496: #endif
58497:
58498: if( pVal ){
58499: sqlite3VdbeMemStoreType(pVal);
58500: }
58501: *ppVal = pVal;
58502: return SQLITE_OK;
58503:
58504: no_mem:
58505: db->mallocFailed = 1;
58506: sqlite3DbFree(db, zVal);
58507: sqlite3ValueFree(pVal);
58508: *ppVal = 0;
58509: return SQLITE_NOMEM;
58510: }
58511:
58512: /*
58513: ** Change the string value of an sqlite3_value object
58514: */
58515: SQLITE_PRIVATE void sqlite3ValueSetStr(
58516: sqlite3_value *v, /* Value to be set */
58517: int n, /* Length of string z */
58518: const void *z, /* Text of the new string */
58519: u8 enc, /* Encoding to use */
58520: void (*xDel)(void*) /* Destructor for the string */
58521: ){
58522: if( v ) sqlite3VdbeMemSetStr((Mem *)v, z, n, enc, xDel);
58523: }
58524:
58525: /*
58526: ** Free an sqlite3_value object
58527: */
58528: SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){
58529: if( !v ) return;
58530: sqlite3VdbeMemRelease((Mem *)v);
58531: sqlite3DbFree(((Mem*)v)->db, v);
58532: }
58533:
58534: /*
58535: ** Return the number of bytes in the sqlite3_value object assuming
58536: ** that it uses the encoding "enc"
58537: */
58538: SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){
58539: Mem *p = (Mem*)pVal;
58540: if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){
58541: if( p->flags & MEM_Zero ){
58542: return p->n + p->u.nZero;
58543: }else{
58544: return p->n;
58545: }
58546: }
58547: return 0;
58548: }
58549:
58550: /************** End of vdbemem.c *********************************************/
58551: /************** Begin file vdbeaux.c *****************************************/
58552: /*
58553: ** 2003 September 6
58554: **
58555: ** The author disclaims copyright to this source code. In place of
58556: ** a legal notice, here is a blessing:
58557: **
58558: ** May you do good and not evil.
58559: ** May you find forgiveness for yourself and forgive others.
58560: ** May you share freely, never taking more than you give.
58561: **
58562: *************************************************************************
58563: ** This file contains code used for creating, destroying, and populating
58564: ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) Prior
58565: ** to version 2.8.7, all this code was combined into the vdbe.c source file.
58566: ** But that file was getting too big so this subroutines were split out.
58567: */
58568:
58569:
58570:
58571: /*
58572: ** When debugging the code generator in a symbolic debugger, one can
58573: ** set the sqlite3VdbeAddopTrace to 1 and all opcodes will be printed
58574: ** as they are added to the instruction stream.
58575: */
58576: #ifdef SQLITE_DEBUG
58577: SQLITE_PRIVATE int sqlite3VdbeAddopTrace = 0;
58578: #endif
58579:
58580:
58581: /*
58582: ** Create a new virtual database engine.
58583: */
58584: SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3 *db){
58585: Vdbe *p;
58586: p = sqlite3DbMallocZero(db, sizeof(Vdbe) );
58587: if( p==0 ) return 0;
58588: p->db = db;
58589: if( db->pVdbe ){
58590: db->pVdbe->pPrev = p;
58591: }
58592: p->pNext = db->pVdbe;
58593: p->pPrev = 0;
58594: db->pVdbe = p;
58595: p->magic = VDBE_MAGIC_INIT;
58596: return p;
58597: }
58598:
58599: /*
58600: ** Remember the SQL string for a prepared statement.
58601: */
58602: SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){
58603: assert( isPrepareV2==1 || isPrepareV2==0 );
58604: if( p==0 ) return;
1.2.2.1 ! misho 58605: #if defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_ENABLE_SQLLOG)
1.2 misho 58606: if( !isPrepareV2 ) return;
58607: #endif
58608: assert( p->zSql==0 );
58609: p->zSql = sqlite3DbStrNDup(p->db, z, n);
58610: p->isPrepareV2 = (u8)isPrepareV2;
58611: }
58612:
58613: /*
58614: ** Return the SQL associated with a prepared statement
58615: */
58616: SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){
58617: Vdbe *p = (Vdbe *)pStmt;
58618: return (p && p->isPrepareV2) ? p->zSql : 0;
58619: }
58620:
58621: /*
58622: ** Swap all content between two VDBE structures.
58623: */
58624: SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){
58625: Vdbe tmp, *pTmp;
58626: char *zTmp;
58627: tmp = *pA;
58628: *pA = *pB;
58629: *pB = tmp;
58630: pTmp = pA->pNext;
58631: pA->pNext = pB->pNext;
58632: pB->pNext = pTmp;
58633: pTmp = pA->pPrev;
58634: pA->pPrev = pB->pPrev;
58635: pB->pPrev = pTmp;
58636: zTmp = pA->zSql;
58637: pA->zSql = pB->zSql;
58638: pB->zSql = zTmp;
58639: pB->isPrepareV2 = pA->isPrepareV2;
58640: }
58641:
58642: #ifdef SQLITE_DEBUG
58643: /*
58644: ** Turn tracing on or off
58645: */
58646: SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe *p, FILE *trace){
58647: p->trace = trace;
58648: }
58649: #endif
58650:
58651: /*
58652: ** Resize the Vdbe.aOp array so that it is at least one op larger than
58653: ** it was.
58654: **
58655: ** If an out-of-memory error occurs while resizing the array, return
58656: ** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain
58657: ** unchanged (this is so that any opcodes already allocated can be
58658: ** correctly deallocated along with the rest of the Vdbe).
58659: */
58660: static int growOpArray(Vdbe *p){
58661: VdbeOp *pNew;
58662: int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op)));
58663: pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op));
58664: if( pNew ){
58665: p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op);
58666: p->aOp = pNew;
58667: }
58668: return (pNew ? SQLITE_OK : SQLITE_NOMEM);
58669: }
58670:
58671: /*
58672: ** Add a new instruction to the list of instructions current in the
58673: ** VDBE. Return the address of the new instruction.
58674: **
58675: ** Parameters:
58676: **
58677: ** p Pointer to the VDBE
58678: **
58679: ** op The opcode for this instruction
58680: **
58681: ** p1, p2, p3 Operands
58682: **
58683: ** Use the sqlite3VdbeResolveLabel() function to fix an address and
58684: ** the sqlite3VdbeChangeP4() function to change the value of the P4
58685: ** operand.
58686: */
58687: SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){
58688: int i;
58689: VdbeOp *pOp;
58690:
58691: i = p->nOp;
58692: assert( p->magic==VDBE_MAGIC_INIT );
58693: assert( op>0 && op<0xff );
58694: if( p->nOpAlloc<=i ){
58695: if( growOpArray(p) ){
58696: return 1;
58697: }
58698: }
58699: p->nOp++;
58700: pOp = &p->aOp[i];
58701: pOp->opcode = (u8)op;
58702: pOp->p5 = 0;
58703: pOp->p1 = p1;
58704: pOp->p2 = p2;
58705: pOp->p3 = p3;
58706: pOp->p4.p = 0;
58707: pOp->p4type = P4_NOTUSED;
58708: #ifdef SQLITE_DEBUG
58709: pOp->zComment = 0;
58710: if( sqlite3VdbeAddopTrace ) sqlite3VdbePrintOp(0, i, &p->aOp[i]);
58711: #endif
58712: #ifdef VDBE_PROFILE
58713: pOp->cycles = 0;
58714: pOp->cnt = 0;
58715: #endif
58716: return i;
58717: }
58718: SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe *p, int op){
58719: return sqlite3VdbeAddOp3(p, op, 0, 0, 0);
58720: }
58721: SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe *p, int op, int p1){
58722: return sqlite3VdbeAddOp3(p, op, p1, 0, 0);
58723: }
58724: SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){
58725: return sqlite3VdbeAddOp3(p, op, p1, p2, 0);
58726: }
58727:
58728:
58729: /*
58730: ** Add an opcode that includes the p4 value as a pointer.
58731: */
58732: SQLITE_PRIVATE int sqlite3VdbeAddOp4(
58733: Vdbe *p, /* Add the opcode to this VM */
58734: int op, /* The new opcode */
58735: int p1, /* The P1 operand */
58736: int p2, /* The P2 operand */
58737: int p3, /* The P3 operand */
58738: const char *zP4, /* The P4 operand */
58739: int p4type /* P4 operand type */
58740: ){
58741: int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3);
58742: sqlite3VdbeChangeP4(p, addr, zP4, p4type);
58743: return addr;
58744: }
58745:
58746: /*
58747: ** Add an OP_ParseSchema opcode. This routine is broken out from
58748: ** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
58749: ** as having been used.
58750: **
58751: ** The zWhere string must have been obtained from sqlite3_malloc().
58752: ** This routine will take ownership of the allocated memory.
58753: */
58754: SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere){
58755: int j;
58756: int addr = sqlite3VdbeAddOp3(p, OP_ParseSchema, iDb, 0, 0);
58757: sqlite3VdbeChangeP4(p, addr, zWhere, P4_DYNAMIC);
58758: for(j=0; j<p->db->nDb; j++) sqlite3VdbeUsesBtree(p, j);
58759: }
58760:
58761: /*
58762: ** Add an opcode that includes the p4 value as an integer.
58763: */
58764: SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(
58765: Vdbe *p, /* Add the opcode to this VM */
58766: int op, /* The new opcode */
58767: int p1, /* The P1 operand */
58768: int p2, /* The P2 operand */
58769: int p3, /* The P3 operand */
58770: int p4 /* The P4 operand as an integer */
58771: ){
58772: int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3);
58773: sqlite3VdbeChangeP4(p, addr, SQLITE_INT_TO_PTR(p4), P4_INT32);
58774: return addr;
58775: }
58776:
58777: /*
58778: ** Create a new symbolic label for an instruction that has yet to be
58779: ** coded. The symbolic label is really just a negative number. The
58780: ** label can be used as the P2 value of an operation. Later, when
58781: ** the label is resolved to a specific address, the VDBE will scan
58782: ** through its operation list and change all values of P2 which match
58783: ** the label into the resolved address.
58784: **
58785: ** The VDBE knows that a P2 value is a label because labels are
58786: ** always negative and P2 values are suppose to be non-negative.
58787: ** Hence, a negative P2 value is a label that has yet to be resolved.
58788: **
58789: ** Zero is returned if a malloc() fails.
58790: */
58791: SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *p){
1.2.2.1 ! misho 58792: int i = p->nLabel++;
1.2 misho 58793: assert( p->magic==VDBE_MAGIC_INIT );
1.2.2.1 ! misho 58794: if( (i & (i-1))==0 ){
! 58795: p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel,
! 58796: (i*2+1)*sizeof(p->aLabel[0]));
1.2 misho 58797: }
58798: if( p->aLabel ){
58799: p->aLabel[i] = -1;
58800: }
58801: return -1-i;
58802: }
58803:
58804: /*
58805: ** Resolve label "x" to be the address of the next instruction to
58806: ** be inserted. The parameter "x" must have been obtained from
58807: ** a prior call to sqlite3VdbeMakeLabel().
58808: */
58809: SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *p, int x){
58810: int j = -1-x;
58811: assert( p->magic==VDBE_MAGIC_INIT );
58812: assert( j>=0 && j<p->nLabel );
58813: if( p->aLabel ){
58814: p->aLabel[j] = p->nOp;
58815: }
58816: }
58817:
58818: /*
58819: ** Mark the VDBE as one that can only be run one time.
58820: */
58821: SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){
58822: p->runOnlyOnce = 1;
58823: }
58824:
58825: #ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */
58826:
58827: /*
58828: ** The following type and function are used to iterate through all opcodes
58829: ** in a Vdbe main program and each of the sub-programs (triggers) it may
58830: ** invoke directly or indirectly. It should be used as follows:
58831: **
58832: ** Op *pOp;
58833: ** VdbeOpIter sIter;
58834: **
58835: ** memset(&sIter, 0, sizeof(sIter));
58836: ** sIter.v = v; // v is of type Vdbe*
58837: ** while( (pOp = opIterNext(&sIter)) ){
58838: ** // Do something with pOp
58839: ** }
58840: ** sqlite3DbFree(v->db, sIter.apSub);
58841: **
58842: */
58843: typedef struct VdbeOpIter VdbeOpIter;
58844: struct VdbeOpIter {
58845: Vdbe *v; /* Vdbe to iterate through the opcodes of */
58846: SubProgram **apSub; /* Array of subprograms */
58847: int nSub; /* Number of entries in apSub */
58848: int iAddr; /* Address of next instruction to return */
58849: int iSub; /* 0 = main program, 1 = first sub-program etc. */
58850: };
58851: static Op *opIterNext(VdbeOpIter *p){
58852: Vdbe *v = p->v;
58853: Op *pRet = 0;
58854: Op *aOp;
58855: int nOp;
58856:
58857: if( p->iSub<=p->nSub ){
58858:
58859: if( p->iSub==0 ){
58860: aOp = v->aOp;
58861: nOp = v->nOp;
58862: }else{
58863: aOp = p->apSub[p->iSub-1]->aOp;
58864: nOp = p->apSub[p->iSub-1]->nOp;
58865: }
58866: assert( p->iAddr<nOp );
58867:
58868: pRet = &aOp[p->iAddr];
58869: p->iAddr++;
58870: if( p->iAddr==nOp ){
58871: p->iSub++;
58872: p->iAddr = 0;
58873: }
58874:
58875: if( pRet->p4type==P4_SUBPROGRAM ){
58876: int nByte = (p->nSub+1)*sizeof(SubProgram*);
58877: int j;
58878: for(j=0; j<p->nSub; j++){
58879: if( p->apSub[j]==pRet->p4.pProgram ) break;
58880: }
58881: if( j==p->nSub ){
58882: p->apSub = sqlite3DbReallocOrFree(v->db, p->apSub, nByte);
58883: if( !p->apSub ){
58884: pRet = 0;
58885: }else{
58886: p->apSub[p->nSub++] = pRet->p4.pProgram;
58887: }
58888: }
58889: }
58890: }
58891:
58892: return pRet;
58893: }
58894:
58895: /*
58896: ** Check if the program stored in the VM associated with pParse may
58897: ** throw an ABORT exception (causing the statement, but not entire transaction
58898: ** to be rolled back). This condition is true if the main program or any
58899: ** sub-programs contains any of the following:
58900: **
58901: ** * OP_Halt with P1=SQLITE_CONSTRAINT and P2=OE_Abort.
58902: ** * OP_HaltIfNull with P1=SQLITE_CONSTRAINT and P2=OE_Abort.
58903: ** * OP_Destroy
58904: ** * OP_VUpdate
58905: ** * OP_VRename
58906: ** * OP_FkCounter with P2==0 (immediate foreign key constraint)
58907: **
58908: ** Then check that the value of Parse.mayAbort is true if an
58909: ** ABORT may be thrown, or false otherwise. Return true if it does
58910: ** match, or false otherwise. This function is intended to be used as
58911: ** part of an assert statement in the compiler. Similar to:
58912: **
58913: ** assert( sqlite3VdbeAssertMayAbort(pParse->pVdbe, pParse->mayAbort) );
58914: */
58915: SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
58916: int hasAbort = 0;
58917: Op *pOp;
58918: VdbeOpIter sIter;
58919: memset(&sIter, 0, sizeof(sIter));
58920: sIter.v = v;
58921:
58922: while( (pOp = opIterNext(&sIter))!=0 ){
58923: int opcode = pOp->opcode;
58924: if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename
58925: #ifndef SQLITE_OMIT_FOREIGN_KEY
58926: || (opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1)
58927: #endif
58928: || ((opcode==OP_Halt || opcode==OP_HaltIfNull)
58929: && (pOp->p1==SQLITE_CONSTRAINT && pOp->p2==OE_Abort))
58930: ){
58931: hasAbort = 1;
58932: break;
58933: }
58934: }
58935: sqlite3DbFree(v->db, sIter.apSub);
58936:
58937: /* Return true if hasAbort==mayAbort. Or if a malloc failure occured.
58938: ** If malloc failed, then the while() loop above may not have iterated
58939: ** through all opcodes and hasAbort may be set incorrectly. Return
58940: ** true for this case to prevent the assert() in the callers frame
58941: ** from failing. */
58942: return ( v->db->mallocFailed || hasAbort==mayAbort );
58943: }
58944: #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */
58945:
58946: /*
58947: ** Loop through the program looking for P2 values that are negative
58948: ** on jump instructions. Each such value is a label. Resolve the
58949: ** label by setting the P2 value to its correct non-zero value.
58950: **
58951: ** This routine is called once after all opcodes have been inserted.
58952: **
58953: ** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument
58954: ** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by
58955: ** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array.
58956: **
58957: ** The Op.opflags field is set on all opcodes.
58958: */
58959: static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
58960: int i;
58961: int nMaxArgs = *pMaxFuncArgs;
58962: Op *pOp;
58963: int *aLabel = p->aLabel;
58964: p->readOnly = 1;
58965: for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){
58966: u8 opcode = pOp->opcode;
58967:
58968: pOp->opflags = sqlite3OpcodeProperty[opcode];
58969: if( opcode==OP_Function || opcode==OP_AggStep ){
58970: if( pOp->p5>nMaxArgs ) nMaxArgs = pOp->p5;
58971: }else if( (opcode==OP_Transaction && pOp->p2!=0) || opcode==OP_Vacuum ){
58972: p->readOnly = 0;
58973: #ifndef SQLITE_OMIT_VIRTUALTABLE
58974: }else if( opcode==OP_VUpdate ){
58975: if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2;
58976: }else if( opcode==OP_VFilter ){
58977: int n;
58978: assert( p->nOp - i >= 3 );
58979: assert( pOp[-1].opcode==OP_Integer );
58980: n = pOp[-1].p1;
58981: if( n>nMaxArgs ) nMaxArgs = n;
58982: #endif
58983: }else if( opcode==OP_Next || opcode==OP_SorterNext ){
58984: pOp->p4.xAdvance = sqlite3BtreeNext;
58985: pOp->p4type = P4_ADVANCE;
58986: }else if( opcode==OP_Prev ){
58987: pOp->p4.xAdvance = sqlite3BtreePrevious;
58988: pOp->p4type = P4_ADVANCE;
58989: }
58990:
58991: if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){
58992: assert( -1-pOp->p2<p->nLabel );
58993: pOp->p2 = aLabel[-1-pOp->p2];
58994: }
58995: }
58996: sqlite3DbFree(p->db, p->aLabel);
58997: p->aLabel = 0;
58998:
58999: *pMaxFuncArgs = nMaxArgs;
59000: }
59001:
59002: /*
59003: ** Return the address of the next instruction to be inserted.
59004: */
59005: SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){
59006: assert( p->magic==VDBE_MAGIC_INIT );
59007: return p->nOp;
59008: }
59009:
59010: /*
59011: ** This function returns a pointer to the array of opcodes associated with
59012: ** the Vdbe passed as the first argument. It is the callers responsibility
59013: ** to arrange for the returned array to be eventually freed using the
59014: ** vdbeFreeOpArray() function.
59015: **
59016: ** Before returning, *pnOp is set to the number of entries in the returned
59017: ** array. Also, *pnMaxArg is set to the larger of its current value and
59018: ** the number of entries in the Vdbe.apArg[] array required to execute the
59019: ** returned program.
59020: */
59021: SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){
59022: VdbeOp *aOp = p->aOp;
59023: assert( aOp && !p->db->mallocFailed );
59024:
59025: /* Check that sqlite3VdbeUsesBtree() was not called on this VM */
59026: assert( p->btreeMask==0 );
59027:
59028: resolveP2Values(p, pnMaxArg);
59029: *pnOp = p->nOp;
59030: p->aOp = 0;
59031: return aOp;
59032: }
59033:
59034: /*
59035: ** Add a whole list of operations to the operation stack. Return the
59036: ** address of the first operation added.
59037: */
59038: SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
59039: int addr;
59040: assert( p->magic==VDBE_MAGIC_INIT );
59041: if( p->nOp + nOp > p->nOpAlloc && growOpArray(p) ){
59042: return 0;
59043: }
59044: addr = p->nOp;
59045: if( ALWAYS(nOp>0) ){
59046: int i;
59047: VdbeOpList const *pIn = aOp;
59048: for(i=0; i<nOp; i++, pIn++){
59049: int p2 = pIn->p2;
59050: VdbeOp *pOut = &p->aOp[i+addr];
59051: pOut->opcode = pIn->opcode;
59052: pOut->p1 = pIn->p1;
59053: if( p2<0 && (sqlite3OpcodeProperty[pOut->opcode] & OPFLG_JUMP)!=0 ){
59054: pOut->p2 = addr + ADDR(p2);
59055: }else{
59056: pOut->p2 = p2;
59057: }
59058: pOut->p3 = pIn->p3;
59059: pOut->p4type = P4_NOTUSED;
59060: pOut->p4.p = 0;
59061: pOut->p5 = 0;
59062: #ifdef SQLITE_DEBUG
59063: pOut->zComment = 0;
59064: if( sqlite3VdbeAddopTrace ){
59065: sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]);
59066: }
59067: #endif
59068: }
59069: p->nOp += nOp;
59070: }
59071: return addr;
59072: }
59073:
59074: /*
59075: ** Change the value of the P1 operand for a specific instruction.
59076: ** This routine is useful when a large program is loaded from a
59077: ** static array using sqlite3VdbeAddOpList but we want to make a
59078: ** few minor changes to the program.
59079: */
59080: SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){
59081: assert( p!=0 );
59082: if( ((u32)p->nOp)>addr ){
59083: p->aOp[addr].p1 = val;
59084: }
59085: }
59086:
59087: /*
59088: ** Change the value of the P2 operand for a specific instruction.
59089: ** This routine is useful for setting a jump destination.
59090: */
59091: SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){
59092: assert( p!=0 );
59093: if( ((u32)p->nOp)>addr ){
59094: p->aOp[addr].p2 = val;
59095: }
59096: }
59097:
59098: /*
59099: ** Change the value of the P3 operand for a specific instruction.
59100: */
59101: SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){
59102: assert( p!=0 );
59103: if( ((u32)p->nOp)>addr ){
59104: p->aOp[addr].p3 = val;
59105: }
59106: }
59107:
59108: /*
59109: ** Change the value of the P5 operand for the most recently
59110: ** added operation.
59111: */
59112: SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u8 val){
59113: assert( p!=0 );
59114: if( p->aOp ){
59115: assert( p->nOp>0 );
59116: p->aOp[p->nOp-1].p5 = val;
59117: }
59118: }
59119:
59120: /*
59121: ** Change the P2 operand of instruction addr so that it points to
59122: ** the address of the next instruction to be coded.
59123: */
59124: SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){
59125: assert( addr>=0 || p->db->mallocFailed );
59126: if( addr>=0 ) sqlite3VdbeChangeP2(p, addr, p->nOp);
59127: }
59128:
59129:
59130: /*
59131: ** If the input FuncDef structure is ephemeral, then free it. If
59132: ** the FuncDef is not ephermal, then do nothing.
59133: */
59134: static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){
59135: if( ALWAYS(pDef) && (pDef->flags & SQLITE_FUNC_EPHEM)!=0 ){
59136: sqlite3DbFree(db, pDef);
59137: }
59138: }
59139:
59140: static void vdbeFreeOpArray(sqlite3 *, Op *, int);
59141:
59142: /*
59143: ** Delete a P4 value if necessary.
59144: */
59145: static void freeP4(sqlite3 *db, int p4type, void *p4){
59146: if( p4 ){
59147: assert( db );
59148: switch( p4type ){
59149: case P4_REAL:
59150: case P4_INT64:
59151: case P4_DYNAMIC:
59152: case P4_KEYINFO:
59153: case P4_INTARRAY:
59154: case P4_KEYINFO_HANDOFF: {
59155: sqlite3DbFree(db, p4);
59156: break;
59157: }
59158: case P4_MPRINTF: {
59159: if( db->pnBytesFreed==0 ) sqlite3_free(p4);
59160: break;
59161: }
59162: case P4_VDBEFUNC: {
59163: VdbeFunc *pVdbeFunc = (VdbeFunc *)p4;
59164: freeEphemeralFunction(db, pVdbeFunc->pFunc);
59165: if( db->pnBytesFreed==0 ) sqlite3VdbeDeleteAuxData(pVdbeFunc, 0);
59166: sqlite3DbFree(db, pVdbeFunc);
59167: break;
59168: }
59169: case P4_FUNCDEF: {
59170: freeEphemeralFunction(db, (FuncDef*)p4);
59171: break;
59172: }
59173: case P4_MEM: {
59174: if( db->pnBytesFreed==0 ){
59175: sqlite3ValueFree((sqlite3_value*)p4);
59176: }else{
59177: Mem *p = (Mem*)p4;
59178: sqlite3DbFree(db, p->zMalloc);
59179: sqlite3DbFree(db, p);
59180: }
59181: break;
59182: }
59183: case P4_VTAB : {
59184: if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4);
59185: break;
59186: }
59187: }
59188: }
59189: }
59190:
59191: /*
59192: ** Free the space allocated for aOp and any p4 values allocated for the
59193: ** opcodes contained within. If aOp is not NULL it is assumed to contain
59194: ** nOp entries.
59195: */
59196: static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){
59197: if( aOp ){
59198: Op *pOp;
59199: for(pOp=aOp; pOp<&aOp[nOp]; pOp++){
59200: freeP4(db, pOp->p4type, pOp->p4.p);
59201: #ifdef SQLITE_DEBUG
59202: sqlite3DbFree(db, pOp->zComment);
59203: #endif
59204: }
59205: }
59206: sqlite3DbFree(db, aOp);
59207: }
59208:
59209: /*
59210: ** Link the SubProgram object passed as the second argument into the linked
59211: ** list at Vdbe.pSubProgram. This list is used to delete all sub-program
59212: ** objects when the VM is no longer required.
59213: */
59214: SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){
59215: p->pNext = pVdbe->pProgram;
59216: pVdbe->pProgram = p;
59217: }
59218:
59219: /*
59220: ** Change the opcode at addr into OP_Noop
59221: */
59222: SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe *p, int addr){
59223: if( p->aOp ){
59224: VdbeOp *pOp = &p->aOp[addr];
59225: sqlite3 *db = p->db;
59226: freeP4(db, pOp->p4type, pOp->p4.p);
59227: memset(pOp, 0, sizeof(pOp[0]));
59228: pOp->opcode = OP_Noop;
59229: }
59230: }
59231:
59232: /*
59233: ** Change the value of the P4 operand for a specific instruction.
59234: ** This routine is useful when a large program is loaded from a
59235: ** static array using sqlite3VdbeAddOpList but we want to make a
59236: ** few minor changes to the program.
59237: **
59238: ** If n>=0 then the P4 operand is dynamic, meaning that a copy of
59239: ** the string is made into memory obtained from sqlite3_malloc().
59240: ** A value of n==0 means copy bytes of zP4 up to and including the
59241: ** first null byte. If n>0 then copy n+1 bytes of zP4.
59242: **
59243: ** If n==P4_KEYINFO it means that zP4 is a pointer to a KeyInfo structure.
59244: ** A copy is made of the KeyInfo structure into memory obtained from
59245: ** sqlite3_malloc, to be freed when the Vdbe is finalized.
59246: ** n==P4_KEYINFO_HANDOFF indicates that zP4 points to a KeyInfo structure
59247: ** stored in memory that the caller has obtained from sqlite3_malloc. The
59248: ** caller should not free the allocation, it will be freed when the Vdbe is
59249: ** finalized.
59250: **
59251: ** Other values of n (P4_STATIC, P4_COLLSEQ etc.) indicate that zP4 points
59252: ** to a string or structure that is guaranteed to exist for the lifetime of
59253: ** the Vdbe. In these cases we can just copy the pointer.
59254: **
59255: ** If addr<0 then change P4 on the most recently inserted instruction.
59256: */
59257: SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){
59258: Op *pOp;
59259: sqlite3 *db;
59260: assert( p!=0 );
59261: db = p->db;
59262: assert( p->magic==VDBE_MAGIC_INIT );
59263: if( p->aOp==0 || db->mallocFailed ){
59264: if ( n!=P4_KEYINFO && n!=P4_VTAB ) {
59265: freeP4(db, n, (void*)*(char**)&zP4);
59266: }
59267: return;
59268: }
59269: assert( p->nOp>0 );
59270: assert( addr<p->nOp );
59271: if( addr<0 ){
59272: addr = p->nOp - 1;
59273: }
59274: pOp = &p->aOp[addr];
1.2.2.1 ! misho 59275: assert( pOp->p4type==P4_NOTUSED || pOp->p4type==P4_INT32 );
1.2 misho 59276: freeP4(db, pOp->p4type, pOp->p4.p);
59277: pOp->p4.p = 0;
59278: if( n==P4_INT32 ){
59279: /* Note: this cast is safe, because the origin data point was an int
59280: ** that was cast to a (const char *). */
59281: pOp->p4.i = SQLITE_PTR_TO_INT(zP4);
59282: pOp->p4type = P4_INT32;
59283: }else if( zP4==0 ){
59284: pOp->p4.p = 0;
59285: pOp->p4type = P4_NOTUSED;
59286: }else if( n==P4_KEYINFO ){
59287: KeyInfo *pKeyInfo;
59288: int nField, nByte;
59289:
59290: nField = ((KeyInfo*)zP4)->nField;
59291: nByte = sizeof(*pKeyInfo) + (nField-1)*sizeof(pKeyInfo->aColl[0]) + nField;
59292: pKeyInfo = sqlite3DbMallocRaw(0, nByte);
59293: pOp->p4.pKeyInfo = pKeyInfo;
59294: if( pKeyInfo ){
59295: u8 *aSortOrder;
59296: memcpy((char*)pKeyInfo, zP4, nByte - nField);
59297: aSortOrder = pKeyInfo->aSortOrder;
1.2.2.1 ! misho 59298: assert( aSortOrder!=0 );
! 59299: pKeyInfo->aSortOrder = (unsigned char*)&pKeyInfo->aColl[nField];
! 59300: memcpy(pKeyInfo->aSortOrder, aSortOrder, nField);
1.2 misho 59301: pOp->p4type = P4_KEYINFO;
59302: }else{
59303: p->db->mallocFailed = 1;
59304: pOp->p4type = P4_NOTUSED;
59305: }
59306: }else if( n==P4_KEYINFO_HANDOFF ){
59307: pOp->p4.p = (void*)zP4;
59308: pOp->p4type = P4_KEYINFO;
59309: }else if( n==P4_VTAB ){
59310: pOp->p4.p = (void*)zP4;
59311: pOp->p4type = P4_VTAB;
59312: sqlite3VtabLock((VTable *)zP4);
59313: assert( ((VTable *)zP4)->db==p->db );
59314: }else if( n<0 ){
59315: pOp->p4.p = (void*)zP4;
59316: pOp->p4type = (signed char)n;
59317: }else{
59318: if( n==0 ) n = sqlite3Strlen30(zP4);
59319: pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n);
59320: pOp->p4type = P4_DYNAMIC;
59321: }
59322: }
59323:
59324: #ifndef NDEBUG
59325: /*
1.2.2.1 ! misho 59326: ** Change the comment on the most recently coded instruction. Or
1.2 misho 59327: ** insert a No-op and add the comment to that new instruction. This
59328: ** makes the code easier to read during debugging. None of this happens
59329: ** in a production build.
59330: */
59331: static void vdbeVComment(Vdbe *p, const char *zFormat, va_list ap){
59332: assert( p->nOp>0 || p->aOp==0 );
59333: assert( p->aOp==0 || p->aOp[p->nOp-1].zComment==0 || p->db->mallocFailed );
59334: if( p->nOp ){
59335: assert( p->aOp );
59336: sqlite3DbFree(p->db, p->aOp[p->nOp-1].zComment);
59337: p->aOp[p->nOp-1].zComment = sqlite3VMPrintf(p->db, zFormat, ap);
59338: }
59339: }
59340: SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe *p, const char *zFormat, ...){
59341: va_list ap;
59342: if( p ){
59343: va_start(ap, zFormat);
59344: vdbeVComment(p, zFormat, ap);
59345: va_end(ap);
59346: }
59347: }
59348: SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe *p, const char *zFormat, ...){
59349: va_list ap;
59350: if( p ){
59351: sqlite3VdbeAddOp0(p, OP_Noop);
59352: va_start(ap, zFormat);
59353: vdbeVComment(p, zFormat, ap);
59354: va_end(ap);
59355: }
59356: }
59357: #endif /* NDEBUG */
59358:
59359: /*
59360: ** Return the opcode for a given address. If the address is -1, then
59361: ** return the most recently inserted opcode.
59362: **
59363: ** If a memory allocation error has occurred prior to the calling of this
59364: ** routine, then a pointer to a dummy VdbeOp will be returned. That opcode
59365: ** is readable but not writable, though it is cast to a writable value.
59366: ** The return of a dummy opcode allows the call to continue functioning
59367: ** after a OOM fault without having to check to see if the return from
59368: ** this routine is a valid pointer. But because the dummy.opcode is 0,
59369: ** dummy will never be written to. This is verified by code inspection and
59370: ** by running with Valgrind.
59371: **
59372: ** About the #ifdef SQLITE_OMIT_TRACE: Normally, this routine is never called
59373: ** unless p->nOp>0. This is because in the absense of SQLITE_OMIT_TRACE,
59374: ** an OP_Trace instruction is always inserted by sqlite3VdbeGet() as soon as
59375: ** a new VDBE is created. So we are free to set addr to p->nOp-1 without
59376: ** having to double-check to make sure that the result is non-negative. But
59377: ** if SQLITE_OMIT_TRACE is defined, the OP_Trace is omitted and we do need to
59378: ** check the value of p->nOp-1 before continuing.
59379: */
59380: SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){
59381: /* C89 specifies that the constant "dummy" will be initialized to all
59382: ** zeros, which is correct. MSVC generates a warning, nevertheless. */
59383: static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */
59384: assert( p->magic==VDBE_MAGIC_INIT );
59385: if( addr<0 ){
59386: #ifdef SQLITE_OMIT_TRACE
59387: if( p->nOp==0 ) return (VdbeOp*)&dummy;
59388: #endif
59389: addr = p->nOp - 1;
59390: }
59391: assert( (addr>=0 && addr<p->nOp) || p->db->mallocFailed );
59392: if( p->db->mallocFailed ){
59393: return (VdbeOp*)&dummy;
59394: }else{
59395: return &p->aOp[addr];
59396: }
59397: }
59398:
59399: #if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \
59400: || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
59401: /*
59402: ** Compute a string that describes the P4 parameter for an opcode.
59403: ** Use zTemp for any required temporary buffer space.
59404: */
59405: static char *displayP4(Op *pOp, char *zTemp, int nTemp){
59406: char *zP4 = zTemp;
59407: assert( nTemp>=20 );
59408: switch( pOp->p4type ){
59409: case P4_KEYINFO_STATIC:
59410: case P4_KEYINFO: {
59411: int i, j;
59412: KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
1.2.2.1 ! misho 59413: assert( pKeyInfo->aSortOrder!=0 );
1.2 misho 59414: sqlite3_snprintf(nTemp, zTemp, "keyinfo(%d", pKeyInfo->nField);
59415: i = sqlite3Strlen30(zTemp);
59416: for(j=0; j<pKeyInfo->nField; j++){
59417: CollSeq *pColl = pKeyInfo->aColl[j];
1.2.2.1 ! misho 59418: const char *zColl = pColl ? pColl->zName : "nil";
! 59419: int n = sqlite3Strlen30(zColl);
! 59420: if( i+n>nTemp-6 ){
! 59421: memcpy(&zTemp[i],",...",4);
! 59422: break;
! 59423: }
! 59424: zTemp[i++] = ',';
! 59425: if( pKeyInfo->aSortOrder[j] ){
! 59426: zTemp[i++] = '-';
1.2 misho 59427: }
1.2.2.1 ! misho 59428: memcpy(&zTemp[i], zColl, n+1);
! 59429: i += n;
1.2 misho 59430: }
59431: zTemp[i++] = ')';
59432: zTemp[i] = 0;
59433: assert( i<nTemp );
59434: break;
59435: }
59436: case P4_COLLSEQ: {
59437: CollSeq *pColl = pOp->p4.pColl;
59438: sqlite3_snprintf(nTemp, zTemp, "collseq(%.20s)", pColl->zName);
59439: break;
59440: }
59441: case P4_FUNCDEF: {
59442: FuncDef *pDef = pOp->p4.pFunc;
59443: sqlite3_snprintf(nTemp, zTemp, "%s(%d)", pDef->zName, pDef->nArg);
59444: break;
59445: }
59446: case P4_INT64: {
59447: sqlite3_snprintf(nTemp, zTemp, "%lld", *pOp->p4.pI64);
59448: break;
59449: }
59450: case P4_INT32: {
59451: sqlite3_snprintf(nTemp, zTemp, "%d", pOp->p4.i);
59452: break;
59453: }
59454: case P4_REAL: {
59455: sqlite3_snprintf(nTemp, zTemp, "%.16g", *pOp->p4.pReal);
59456: break;
59457: }
59458: case P4_MEM: {
59459: Mem *pMem = pOp->p4.pMem;
59460: if( pMem->flags & MEM_Str ){
59461: zP4 = pMem->z;
59462: }else if( pMem->flags & MEM_Int ){
59463: sqlite3_snprintf(nTemp, zTemp, "%lld", pMem->u.i);
59464: }else if( pMem->flags & MEM_Real ){
59465: sqlite3_snprintf(nTemp, zTemp, "%.16g", pMem->r);
59466: }else if( pMem->flags & MEM_Null ){
59467: sqlite3_snprintf(nTemp, zTemp, "NULL");
59468: }else{
59469: assert( pMem->flags & MEM_Blob );
59470: zP4 = "(blob)";
59471: }
59472: break;
59473: }
59474: #ifndef SQLITE_OMIT_VIRTUALTABLE
59475: case P4_VTAB: {
59476: sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab;
59477: sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule);
59478: break;
59479: }
59480: #endif
59481: case P4_INTARRAY: {
59482: sqlite3_snprintf(nTemp, zTemp, "intarray");
59483: break;
59484: }
59485: case P4_SUBPROGRAM: {
59486: sqlite3_snprintf(nTemp, zTemp, "program");
59487: break;
59488: }
59489: case P4_ADVANCE: {
59490: zTemp[0] = 0;
59491: break;
59492: }
59493: default: {
59494: zP4 = pOp->p4.z;
59495: if( zP4==0 ){
59496: zP4 = zTemp;
59497: zTemp[0] = 0;
59498: }
59499: }
59500: }
59501: assert( zP4!=0 );
59502: return zP4;
59503: }
59504: #endif
59505:
59506: /*
59507: ** Declare to the Vdbe that the BTree object at db->aDb[i] is used.
59508: **
59509: ** The prepared statements need to know in advance the complete set of
59510: ** attached databases that will be use. A mask of these databases
59511: ** is maintained in p->btreeMask. The p->lockMask value is the subset of
59512: ** p->btreeMask of databases that will require a lock.
59513: */
59514: SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){
59515: assert( i>=0 && i<p->db->nDb && i<(int)sizeof(yDbMask)*8 );
59516: assert( i<(int)sizeof(p->btreeMask)*8 );
59517: p->btreeMask |= ((yDbMask)1)<<i;
59518: if( i!=1 && sqlite3BtreeSharable(p->db->aDb[i].pBt) ){
59519: p->lockMask |= ((yDbMask)1)<<i;
59520: }
59521: }
59522:
59523: #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0
59524: /*
59525: ** If SQLite is compiled to support shared-cache mode and to be threadsafe,
59526: ** this routine obtains the mutex associated with each BtShared structure
59527: ** that may be accessed by the VM passed as an argument. In doing so it also
59528: ** sets the BtShared.db member of each of the BtShared structures, ensuring
59529: ** that the correct busy-handler callback is invoked if required.
59530: **
59531: ** If SQLite is not threadsafe but does support shared-cache mode, then
59532: ** sqlite3BtreeEnter() is invoked to set the BtShared.db variables
59533: ** of all of BtShared structures accessible via the database handle
59534: ** associated with the VM.
59535: **
59536: ** If SQLite is not threadsafe and does not support shared-cache mode, this
59537: ** function is a no-op.
59538: **
59539: ** The p->btreeMask field is a bitmask of all btrees that the prepared
59540: ** statement p will ever use. Let N be the number of bits in p->btreeMask
59541: ** corresponding to btrees that use shared cache. Then the runtime of
59542: ** this routine is N*N. But as N is rarely more than 1, this should not
59543: ** be a problem.
59544: */
59545: SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe *p){
59546: int i;
59547: yDbMask mask;
59548: sqlite3 *db;
59549: Db *aDb;
59550: int nDb;
59551: if( p->lockMask==0 ) return; /* The common case */
59552: db = p->db;
59553: aDb = db->aDb;
59554: nDb = db->nDb;
59555: for(i=0, mask=1; i<nDb; i++, mask += mask){
59556: if( i!=1 && (mask & p->lockMask)!=0 && ALWAYS(aDb[i].pBt!=0) ){
59557: sqlite3BtreeEnter(aDb[i].pBt);
59558: }
59559: }
59560: }
59561: #endif
59562:
59563: #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0
59564: /*
59565: ** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter().
59566: */
59567: SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){
59568: int i;
59569: yDbMask mask;
59570: sqlite3 *db;
59571: Db *aDb;
59572: int nDb;
59573: if( p->lockMask==0 ) return; /* The common case */
59574: db = p->db;
59575: aDb = db->aDb;
59576: nDb = db->nDb;
59577: for(i=0, mask=1; i<nDb; i++, mask += mask){
59578: if( i!=1 && (mask & p->lockMask)!=0 && ALWAYS(aDb[i].pBt!=0) ){
59579: sqlite3BtreeLeave(aDb[i].pBt);
59580: }
59581: }
59582: }
59583: #endif
59584:
59585: #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG)
59586: /*
59587: ** Print a single opcode. This routine is used for debugging only.
59588: */
59589: SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){
59590: char *zP4;
59591: char zPtr[50];
59592: static const char *zFormat1 = "%4d %-13s %4d %4d %4d %-4s %.2X %s\n";
59593: if( pOut==0 ) pOut = stdout;
59594: zP4 = displayP4(pOp, zPtr, sizeof(zPtr));
59595: fprintf(pOut, zFormat1, pc,
59596: sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5,
59597: #ifdef SQLITE_DEBUG
59598: pOp->zComment ? pOp->zComment : ""
59599: #else
59600: ""
59601: #endif
59602: );
59603: fflush(pOut);
59604: }
59605: #endif
59606:
59607: /*
59608: ** Release an array of N Mem elements
59609: */
59610: static void releaseMemArray(Mem *p, int N){
59611: if( p && N ){
59612: Mem *pEnd;
59613: sqlite3 *db = p->db;
59614: u8 malloc_failed = db->mallocFailed;
59615: if( db->pnBytesFreed ){
59616: for(pEnd=&p[N]; p<pEnd; p++){
59617: sqlite3DbFree(db, p->zMalloc);
59618: }
59619: return;
59620: }
59621: for(pEnd=&p[N]; p<pEnd; p++){
59622: assert( (&p[1])==pEnd || p[0].db==p[1].db );
59623:
59624: /* This block is really an inlined version of sqlite3VdbeMemRelease()
59625: ** that takes advantage of the fact that the memory cell value is
59626: ** being set to NULL after releasing any dynamic resources.
59627: **
59628: ** The justification for duplicating code is that according to
59629: ** callgrind, this causes a certain test case to hit the CPU 4.7
59630: ** percent less (x86 linux, gcc version 4.1.2, -O6) than if
59631: ** sqlite3MemRelease() were called from here. With -O2, this jumps
59632: ** to 6.6 percent. The test case is inserting 1000 rows into a table
59633: ** with no indexes using a single prepared INSERT statement, bind()
59634: ** and reset(). Inserts are grouped into a transaction.
59635: */
59636: if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){
59637: sqlite3VdbeMemRelease(p);
59638: }else if( p->zMalloc ){
59639: sqlite3DbFree(db, p->zMalloc);
59640: p->zMalloc = 0;
59641: }
59642:
59643: p->flags = MEM_Invalid;
59644: }
59645: db->mallocFailed = malloc_failed;
59646: }
59647: }
59648:
59649: /*
59650: ** Delete a VdbeFrame object and its contents. VdbeFrame objects are
59651: ** allocated by the OP_Program opcode in sqlite3VdbeExec().
59652: */
59653: SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){
59654: int i;
59655: Mem *aMem = VdbeFrameMem(p);
59656: VdbeCursor **apCsr = (VdbeCursor **)&aMem[p->nChildMem];
59657: for(i=0; i<p->nChildCsr; i++){
59658: sqlite3VdbeFreeCursor(p->v, apCsr[i]);
59659: }
59660: releaseMemArray(aMem, p->nChildMem);
59661: sqlite3DbFree(p->v->db, p);
59662: }
59663:
59664: #ifndef SQLITE_OMIT_EXPLAIN
59665: /*
59666: ** Give a listing of the program in the virtual machine.
59667: **
59668: ** The interface is the same as sqlite3VdbeExec(). But instead of
59669: ** running the code, it invokes the callback once for each instruction.
59670: ** This feature is used to implement "EXPLAIN".
59671: **
59672: ** When p->explain==1, each instruction is listed. When
59673: ** p->explain==2, only OP_Explain instructions are listed and these
59674: ** are shown in a different format. p->explain==2 is used to implement
59675: ** EXPLAIN QUERY PLAN.
59676: **
59677: ** When p->explain==1, first the main program is listed, then each of
59678: ** the trigger subprograms are listed one by one.
59679: */
59680: SQLITE_PRIVATE int sqlite3VdbeList(
59681: Vdbe *p /* The VDBE */
59682: ){
59683: int nRow; /* Stop when row count reaches this */
59684: int nSub = 0; /* Number of sub-vdbes seen so far */
59685: SubProgram **apSub = 0; /* Array of sub-vdbes */
59686: Mem *pSub = 0; /* Memory cell hold array of subprogs */
59687: sqlite3 *db = p->db; /* The database connection */
59688: int i; /* Loop counter */
59689: int rc = SQLITE_OK; /* Return code */
59690: Mem *pMem = &p->aMem[1]; /* First Mem of result set */
59691:
59692: assert( p->explain );
59693: assert( p->magic==VDBE_MAGIC_RUN );
59694: assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM );
59695:
59696: /* Even though this opcode does not use dynamic strings for
59697: ** the result, result columns may become dynamic if the user calls
59698: ** sqlite3_column_text16(), causing a translation to UTF-16 encoding.
59699: */
59700: releaseMemArray(pMem, 8);
59701: p->pResultSet = 0;
59702:
59703: if( p->rc==SQLITE_NOMEM ){
59704: /* This happens if a malloc() inside a call to sqlite3_column_text() or
59705: ** sqlite3_column_text16() failed. */
59706: db->mallocFailed = 1;
59707: return SQLITE_ERROR;
59708: }
59709:
59710: /* When the number of output rows reaches nRow, that means the
59711: ** listing has finished and sqlite3_step() should return SQLITE_DONE.
59712: ** nRow is the sum of the number of rows in the main program, plus
59713: ** the sum of the number of rows in all trigger subprograms encountered
59714: ** so far. The nRow value will increase as new trigger subprograms are
59715: ** encountered, but p->pc will eventually catch up to nRow.
59716: */
59717: nRow = p->nOp;
59718: if( p->explain==1 ){
59719: /* The first 8 memory cells are used for the result set. So we will
59720: ** commandeer the 9th cell to use as storage for an array of pointers
59721: ** to trigger subprograms. The VDBE is guaranteed to have at least 9
59722: ** cells. */
59723: assert( p->nMem>9 );
59724: pSub = &p->aMem[9];
59725: if( pSub->flags&MEM_Blob ){
59726: /* On the first call to sqlite3_step(), pSub will hold a NULL. It is
59727: ** initialized to a BLOB by the P4_SUBPROGRAM processing logic below */
59728: nSub = pSub->n/sizeof(Vdbe*);
59729: apSub = (SubProgram **)pSub->z;
59730: }
59731: for(i=0; i<nSub; i++){
59732: nRow += apSub[i]->nOp;
59733: }
59734: }
59735:
59736: do{
59737: i = p->pc++;
59738: }while( i<nRow && p->explain==2 && p->aOp[i].opcode!=OP_Explain );
59739: if( i>=nRow ){
59740: p->rc = SQLITE_OK;
59741: rc = SQLITE_DONE;
59742: }else if( db->u1.isInterrupted ){
59743: p->rc = SQLITE_INTERRUPT;
59744: rc = SQLITE_ERROR;
59745: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(p->rc));
59746: }else{
59747: char *z;
59748: Op *pOp;
59749: if( i<p->nOp ){
59750: /* The output line number is small enough that we are still in the
59751: ** main program. */
59752: pOp = &p->aOp[i];
59753: }else{
59754: /* We are currently listing subprograms. Figure out which one and
59755: ** pick up the appropriate opcode. */
59756: int j;
59757: i -= p->nOp;
59758: for(j=0; i>=apSub[j]->nOp; j++){
59759: i -= apSub[j]->nOp;
59760: }
59761: pOp = &apSub[j]->aOp[i];
59762: }
59763: if( p->explain==1 ){
59764: pMem->flags = MEM_Int;
59765: pMem->type = SQLITE_INTEGER;
59766: pMem->u.i = i; /* Program counter */
59767: pMem++;
59768:
59769: pMem->flags = MEM_Static|MEM_Str|MEM_Term;
59770: pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */
59771: assert( pMem->z!=0 );
59772: pMem->n = sqlite3Strlen30(pMem->z);
59773: pMem->type = SQLITE_TEXT;
59774: pMem->enc = SQLITE_UTF8;
59775: pMem++;
59776:
59777: /* When an OP_Program opcode is encounter (the only opcode that has
59778: ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms
59779: ** kept in p->aMem[9].z to hold the new program - assuming this subprogram
59780: ** has not already been seen.
59781: */
59782: if( pOp->p4type==P4_SUBPROGRAM ){
59783: int nByte = (nSub+1)*sizeof(SubProgram*);
59784: int j;
59785: for(j=0; j<nSub; j++){
59786: if( apSub[j]==pOp->p4.pProgram ) break;
59787: }
1.2.2.1 ! misho 59788: if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, nSub!=0) ){
1.2 misho 59789: apSub = (SubProgram **)pSub->z;
59790: apSub[nSub++] = pOp->p4.pProgram;
59791: pSub->flags |= MEM_Blob;
59792: pSub->n = nSub*sizeof(SubProgram*);
59793: }
59794: }
59795: }
59796:
59797: pMem->flags = MEM_Int;
59798: pMem->u.i = pOp->p1; /* P1 */
59799: pMem->type = SQLITE_INTEGER;
59800: pMem++;
59801:
59802: pMem->flags = MEM_Int;
59803: pMem->u.i = pOp->p2; /* P2 */
59804: pMem->type = SQLITE_INTEGER;
59805: pMem++;
59806:
59807: pMem->flags = MEM_Int;
59808: pMem->u.i = pOp->p3; /* P3 */
59809: pMem->type = SQLITE_INTEGER;
59810: pMem++;
59811:
59812: if( sqlite3VdbeMemGrow(pMem, 32, 0) ){ /* P4 */
59813: assert( p->db->mallocFailed );
59814: return SQLITE_ERROR;
59815: }
59816: pMem->flags = MEM_Dyn|MEM_Str|MEM_Term;
59817: z = displayP4(pOp, pMem->z, 32);
59818: if( z!=pMem->z ){
59819: sqlite3VdbeMemSetStr(pMem, z, -1, SQLITE_UTF8, 0);
59820: }else{
59821: assert( pMem->z!=0 );
59822: pMem->n = sqlite3Strlen30(pMem->z);
59823: pMem->enc = SQLITE_UTF8;
59824: }
59825: pMem->type = SQLITE_TEXT;
59826: pMem++;
59827:
59828: if( p->explain==1 ){
59829: if( sqlite3VdbeMemGrow(pMem, 4, 0) ){
59830: assert( p->db->mallocFailed );
59831: return SQLITE_ERROR;
59832: }
59833: pMem->flags = MEM_Dyn|MEM_Str|MEM_Term;
59834: pMem->n = 2;
59835: sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */
59836: pMem->type = SQLITE_TEXT;
59837: pMem->enc = SQLITE_UTF8;
59838: pMem++;
59839:
59840: #ifdef SQLITE_DEBUG
59841: if( pOp->zComment ){
59842: pMem->flags = MEM_Str|MEM_Term;
59843: pMem->z = pOp->zComment;
59844: pMem->n = sqlite3Strlen30(pMem->z);
59845: pMem->enc = SQLITE_UTF8;
59846: pMem->type = SQLITE_TEXT;
59847: }else
59848: #endif
59849: {
59850: pMem->flags = MEM_Null; /* Comment */
59851: pMem->type = SQLITE_NULL;
59852: }
59853: }
59854:
59855: p->nResColumn = 8 - 4*(p->explain-1);
59856: p->pResultSet = &p->aMem[1];
59857: p->rc = SQLITE_OK;
59858: rc = SQLITE_ROW;
59859: }
59860: return rc;
59861: }
59862: #endif /* SQLITE_OMIT_EXPLAIN */
59863:
59864: #ifdef SQLITE_DEBUG
59865: /*
59866: ** Print the SQL that was used to generate a VDBE program.
59867: */
59868: SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe *p){
59869: int nOp = p->nOp;
59870: VdbeOp *pOp;
59871: if( nOp<1 ) return;
59872: pOp = &p->aOp[0];
59873: if( pOp->opcode==OP_Trace && pOp->p4.z!=0 ){
59874: const char *z = pOp->p4.z;
59875: while( sqlite3Isspace(*z) ) z++;
59876: printf("SQL: [%s]\n", z);
59877: }
59878: }
59879: #endif
59880:
59881: #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE)
59882: /*
59883: ** Print an IOTRACE message showing SQL content.
59884: */
59885: SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){
59886: int nOp = p->nOp;
59887: VdbeOp *pOp;
59888: if( sqlite3IoTrace==0 ) return;
59889: if( nOp<1 ) return;
59890: pOp = &p->aOp[0];
59891: if( pOp->opcode==OP_Trace && pOp->p4.z!=0 ){
59892: int i, j;
59893: char z[1000];
59894: sqlite3_snprintf(sizeof(z), z, "%s", pOp->p4.z);
59895: for(i=0; sqlite3Isspace(z[i]); i++){}
59896: for(j=0; z[i]; i++){
59897: if( sqlite3Isspace(z[i]) ){
59898: if( z[i-1]!=' ' ){
59899: z[j++] = ' ';
59900: }
59901: }else{
59902: z[j++] = z[i];
59903: }
59904: }
59905: z[j] = 0;
59906: sqlite3IoTrace("SQL %s\n", z);
59907: }
59908: }
59909: #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */
59910:
59911: /*
59912: ** Allocate space from a fixed size buffer and return a pointer to
59913: ** that space. If insufficient space is available, return NULL.
59914: **
59915: ** The pBuf parameter is the initial value of a pointer which will
59916: ** receive the new memory. pBuf is normally NULL. If pBuf is not
59917: ** NULL, it means that memory space has already been allocated and that
59918: ** this routine should not allocate any new memory. When pBuf is not
59919: ** NULL simply return pBuf. Only allocate new memory space when pBuf
59920: ** is NULL.
59921: **
59922: ** nByte is the number of bytes of space needed.
59923: **
59924: ** *ppFrom points to available space and pEnd points to the end of the
59925: ** available space. When space is allocated, *ppFrom is advanced past
59926: ** the end of the allocated space.
59927: **
59928: ** *pnByte is a counter of the number of bytes of space that have failed
59929: ** to allocate. If there is insufficient space in *ppFrom to satisfy the
59930: ** request, then increment *pnByte by the amount of the request.
59931: */
59932: static void *allocSpace(
59933: void *pBuf, /* Where return pointer will be stored */
59934: int nByte, /* Number of bytes to allocate */
59935: u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */
59936: u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */
59937: int *pnByte /* If allocation cannot be made, increment *pnByte */
59938: ){
59939: assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) );
59940: if( pBuf ) return pBuf;
59941: nByte = ROUND8(nByte);
59942: if( &(*ppFrom)[nByte] <= pEnd ){
59943: pBuf = (void*)*ppFrom;
59944: *ppFrom += nByte;
59945: }else{
59946: *pnByte += nByte;
59947: }
59948: return pBuf;
59949: }
59950:
59951: /*
59952: ** Rewind the VDBE back to the beginning in preparation for
59953: ** running it.
59954: */
59955: SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){
59956: #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
59957: int i;
59958: #endif
59959: assert( p!=0 );
59960: assert( p->magic==VDBE_MAGIC_INIT );
59961:
59962: /* There should be at least one opcode.
59963: */
59964: assert( p->nOp>0 );
59965:
59966: /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */
59967: p->magic = VDBE_MAGIC_RUN;
59968:
59969: #ifdef SQLITE_DEBUG
59970: for(i=1; i<p->nMem; i++){
59971: assert( p->aMem[i].db==p->db );
59972: }
59973: #endif
59974: p->pc = -1;
59975: p->rc = SQLITE_OK;
59976: p->errorAction = OE_Abort;
59977: p->magic = VDBE_MAGIC_RUN;
59978: p->nChange = 0;
59979: p->cacheCtr = 1;
59980: p->minWriteFileFormat = 255;
59981: p->iStatement = 0;
59982: p->nFkConstraint = 0;
59983: #ifdef VDBE_PROFILE
59984: for(i=0; i<p->nOp; i++){
59985: p->aOp[i].cnt = 0;
59986: p->aOp[i].cycles = 0;
59987: }
59988: #endif
59989: }
59990:
59991: /*
59992: ** Prepare a virtual machine for execution for the first time after
59993: ** creating the virtual machine. This involves things such
59994: ** as allocating stack space and initializing the program counter.
59995: ** After the VDBE has be prepped, it can be executed by one or more
59996: ** calls to sqlite3VdbeExec().
59997: **
59998: ** This function may be called exact once on a each virtual machine.
59999: ** After this routine is called the VM has been "packaged" and is ready
60000: ** to run. After this routine is called, futher calls to
60001: ** sqlite3VdbeAddOp() functions are prohibited. This routine disconnects
60002: ** the Vdbe from the Parse object that helped generate it so that the
60003: ** the Vdbe becomes an independent entity and the Parse object can be
60004: ** destroyed.
60005: **
60006: ** Use the sqlite3VdbeRewind() procedure to restore a virtual machine back
60007: ** to its initial state after it has been run.
60008: */
60009: SQLITE_PRIVATE void sqlite3VdbeMakeReady(
60010: Vdbe *p, /* The VDBE */
60011: Parse *pParse /* Parsing context */
60012: ){
60013: sqlite3 *db; /* The database connection */
60014: int nVar; /* Number of parameters */
60015: int nMem; /* Number of VM memory registers */
60016: int nCursor; /* Number of cursors required */
60017: int nArg; /* Number of arguments in subprograms */
60018: int nOnce; /* Number of OP_Once instructions */
60019: int n; /* Loop counter */
60020: u8 *zCsr; /* Memory available for allocation */
60021: u8 *zEnd; /* First byte past allocated memory */
60022: int nByte; /* How much extra memory is needed */
60023:
60024: assert( p!=0 );
60025: assert( p->nOp>0 );
60026: assert( pParse!=0 );
60027: assert( p->magic==VDBE_MAGIC_INIT );
60028: db = p->db;
60029: assert( db->mallocFailed==0 );
60030: nVar = pParse->nVar;
60031: nMem = pParse->nMem;
60032: nCursor = pParse->nTab;
60033: nArg = pParse->nMaxArg;
60034: nOnce = pParse->nOnce;
60035: if( nOnce==0 ) nOnce = 1; /* Ensure at least one byte in p->aOnceFlag[] */
60036:
60037: /* For each cursor required, also allocate a memory cell. Memory
60038: ** cells (nMem+1-nCursor)..nMem, inclusive, will never be used by
60039: ** the vdbe program. Instead they are used to allocate space for
60040: ** VdbeCursor/BtCursor structures. The blob of memory associated with
60041: ** cursor 0 is stored in memory cell nMem. Memory cell (nMem-1)
60042: ** stores the blob of memory associated with cursor 1, etc.
60043: **
60044: ** See also: allocateCursor().
60045: */
60046: nMem += nCursor;
60047:
60048: /* Allocate space for memory registers, SQL variables, VDBE cursors and
60049: ** an array to marshal SQL function arguments in.
60050: */
60051: zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */
60052: zEnd = (u8*)&p->aOp[p->nOpAlloc]; /* First byte past end of zCsr[] */
60053:
60054: resolveP2Values(p, &nArg);
60055: p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort);
60056: if( pParse->explain && nMem<10 ){
60057: nMem = 10;
60058: }
60059: memset(zCsr, 0, zEnd-zCsr);
60060: zCsr += (zCsr - (u8*)0)&7;
60061: assert( EIGHT_BYTE_ALIGNMENT(zCsr) );
60062: p->expired = 0;
60063:
60064: /* Memory for registers, parameters, cursor, etc, is allocated in two
60065: ** passes. On the first pass, we try to reuse unused space at the
60066: ** end of the opcode array. If we are unable to satisfy all memory
60067: ** requirements by reusing the opcode array tail, then the second
60068: ** pass will fill in the rest using a fresh allocation.
60069: **
60070: ** This two-pass approach that reuses as much memory as possible from
60071: ** the leftover space at the end of the opcode array can significantly
60072: ** reduce the amount of memory held by a prepared statement.
60073: */
60074: do {
60075: nByte = 0;
60076: p->aMem = allocSpace(p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte);
60077: p->aVar = allocSpace(p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte);
60078: p->apArg = allocSpace(p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte);
60079: p->azVar = allocSpace(p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte);
60080: p->apCsr = allocSpace(p->apCsr, nCursor*sizeof(VdbeCursor*),
60081: &zCsr, zEnd, &nByte);
60082: p->aOnceFlag = allocSpace(p->aOnceFlag, nOnce, &zCsr, zEnd, &nByte);
60083: if( nByte ){
60084: p->pFree = sqlite3DbMallocZero(db, nByte);
60085: }
60086: zCsr = p->pFree;
60087: zEnd = &zCsr[nByte];
60088: }while( nByte && !db->mallocFailed );
60089:
60090: p->nCursor = (u16)nCursor;
60091: p->nOnceFlag = nOnce;
60092: if( p->aVar ){
60093: p->nVar = (ynVar)nVar;
60094: for(n=0; n<nVar; n++){
60095: p->aVar[n].flags = MEM_Null;
60096: p->aVar[n].db = db;
60097: }
60098: }
60099: if( p->azVar ){
60100: p->nzVar = pParse->nzVar;
60101: memcpy(p->azVar, pParse->azVar, p->nzVar*sizeof(p->azVar[0]));
60102: memset(pParse->azVar, 0, pParse->nzVar*sizeof(pParse->azVar[0]));
60103: }
60104: if( p->aMem ){
60105: p->aMem--; /* aMem[] goes from 1..nMem */
60106: p->nMem = nMem; /* not from 0..nMem-1 */
60107: for(n=1; n<=nMem; n++){
60108: p->aMem[n].flags = MEM_Invalid;
60109: p->aMem[n].db = db;
60110: }
60111: }
60112: p->explain = pParse->explain;
60113: sqlite3VdbeRewind(p);
60114: }
60115:
60116: /*
60117: ** Close a VDBE cursor and release all the resources that cursor
60118: ** happens to hold.
60119: */
60120: SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){
60121: if( pCx==0 ){
60122: return;
60123: }
60124: sqlite3VdbeSorterClose(p->db, pCx);
60125: if( pCx->pBt ){
60126: sqlite3BtreeClose(pCx->pBt);
60127: /* The pCx->pCursor will be close automatically, if it exists, by
60128: ** the call above. */
60129: }else if( pCx->pCursor ){
60130: sqlite3BtreeCloseCursor(pCx->pCursor);
60131: }
60132: #ifndef SQLITE_OMIT_VIRTUALTABLE
60133: if( pCx->pVtabCursor ){
60134: sqlite3_vtab_cursor *pVtabCursor = pCx->pVtabCursor;
60135: const sqlite3_module *pModule = pCx->pModule;
60136: p->inVtabMethod = 1;
60137: pModule->xClose(pVtabCursor);
60138: p->inVtabMethod = 0;
60139: }
60140: #endif
60141: }
60142:
60143: /*
60144: ** Copy the values stored in the VdbeFrame structure to its Vdbe. This
60145: ** is used, for example, when a trigger sub-program is halted to restore
60146: ** control to the main program.
60147: */
60148: SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){
60149: Vdbe *v = pFrame->v;
60150: v->aOnceFlag = pFrame->aOnceFlag;
60151: v->nOnceFlag = pFrame->nOnceFlag;
60152: v->aOp = pFrame->aOp;
60153: v->nOp = pFrame->nOp;
60154: v->aMem = pFrame->aMem;
60155: v->nMem = pFrame->nMem;
60156: v->apCsr = pFrame->apCsr;
60157: v->nCursor = pFrame->nCursor;
60158: v->db->lastRowid = pFrame->lastRowid;
60159: v->nChange = pFrame->nChange;
60160: return pFrame->pc;
60161: }
60162:
60163: /*
60164: ** Close all cursors.
60165: **
60166: ** Also release any dynamic memory held by the VM in the Vdbe.aMem memory
60167: ** cell array. This is necessary as the memory cell array may contain
60168: ** pointers to VdbeFrame objects, which may in turn contain pointers to
60169: ** open cursors.
60170: */
60171: static void closeAllCursors(Vdbe *p){
60172: if( p->pFrame ){
60173: VdbeFrame *pFrame;
60174: for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
60175: sqlite3VdbeFrameRestore(pFrame);
60176: }
60177: p->pFrame = 0;
60178: p->nFrame = 0;
60179:
60180: if( p->apCsr ){
60181: int i;
60182: for(i=0; i<p->nCursor; i++){
60183: VdbeCursor *pC = p->apCsr[i];
60184: if( pC ){
60185: sqlite3VdbeFreeCursor(p, pC);
60186: p->apCsr[i] = 0;
60187: }
60188: }
60189: }
60190: if( p->aMem ){
60191: releaseMemArray(&p->aMem[1], p->nMem);
60192: }
60193: while( p->pDelFrame ){
60194: VdbeFrame *pDel = p->pDelFrame;
60195: p->pDelFrame = pDel->pParent;
60196: sqlite3VdbeFrameDelete(pDel);
60197: }
60198: }
60199:
60200: /*
60201: ** Clean up the VM after execution.
60202: **
60203: ** This routine will automatically close any cursors, lists, and/or
60204: ** sorters that were left open. It also deletes the values of
60205: ** variables in the aVar[] array.
60206: */
60207: static void Cleanup(Vdbe *p){
60208: sqlite3 *db = p->db;
60209:
60210: #ifdef SQLITE_DEBUG
60211: /* Execute assert() statements to ensure that the Vdbe.apCsr[] and
60212: ** Vdbe.aMem[] arrays have already been cleaned up. */
60213: int i;
60214: if( p->apCsr ) for(i=0; i<p->nCursor; i++) assert( p->apCsr[i]==0 );
60215: if( p->aMem ){
60216: for(i=1; i<=p->nMem; i++) assert( p->aMem[i].flags==MEM_Invalid );
60217: }
60218: #endif
60219:
60220: sqlite3DbFree(db, p->zErrMsg);
60221: p->zErrMsg = 0;
60222: p->pResultSet = 0;
60223: }
60224:
60225: /*
60226: ** Set the number of result columns that will be returned by this SQL
60227: ** statement. This is now set at compile time, rather than during
60228: ** execution of the vdbe program so that sqlite3_column_count() can
60229: ** be called on an SQL statement before sqlite3_step().
60230: */
60231: SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){
60232: Mem *pColName;
60233: int n;
60234: sqlite3 *db = p->db;
60235:
60236: releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
60237: sqlite3DbFree(db, p->aColName);
60238: n = nResColumn*COLNAME_N;
60239: p->nResColumn = (u16)nResColumn;
60240: p->aColName = pColName = (Mem*)sqlite3DbMallocZero(db, sizeof(Mem)*n );
60241: if( p->aColName==0 ) return;
60242: while( n-- > 0 ){
60243: pColName->flags = MEM_Null;
60244: pColName->db = p->db;
60245: pColName++;
60246: }
60247: }
60248:
60249: /*
60250: ** Set the name of the idx'th column to be returned by the SQL statement.
60251: ** zName must be a pointer to a nul terminated string.
60252: **
60253: ** This call must be made after a call to sqlite3VdbeSetNumCols().
60254: **
60255: ** The final parameter, xDel, must be one of SQLITE_DYNAMIC, SQLITE_STATIC
60256: ** or SQLITE_TRANSIENT. If it is SQLITE_DYNAMIC, then the buffer pointed
60257: ** to by zName will be freed by sqlite3DbFree() when the vdbe is destroyed.
60258: */
60259: SQLITE_PRIVATE int sqlite3VdbeSetColName(
60260: Vdbe *p, /* Vdbe being configured */
60261: int idx, /* Index of column zName applies to */
60262: int var, /* One of the COLNAME_* constants */
60263: const char *zName, /* Pointer to buffer containing name */
60264: void (*xDel)(void*) /* Memory management strategy for zName */
60265: ){
60266: int rc;
60267: Mem *pColName;
60268: assert( idx<p->nResColumn );
60269: assert( var<COLNAME_N );
60270: if( p->db->mallocFailed ){
60271: assert( !zName || xDel!=SQLITE_DYNAMIC );
60272: return SQLITE_NOMEM;
60273: }
60274: assert( p->aColName!=0 );
60275: pColName = &(p->aColName[idx+var*p->nResColumn]);
60276: rc = sqlite3VdbeMemSetStr(pColName, zName, -1, SQLITE_UTF8, xDel);
60277: assert( rc!=0 || !zName || (pColName->flags&MEM_Term)!=0 );
60278: return rc;
60279: }
60280:
60281: /*
60282: ** A read or write transaction may or may not be active on database handle
60283: ** db. If a transaction is active, commit it. If there is a
60284: ** write-transaction spanning more than one database file, this routine
60285: ** takes care of the master journal trickery.
60286: */
60287: static int vdbeCommit(sqlite3 *db, Vdbe *p){
60288: int i;
60289: int nTrans = 0; /* Number of databases with an active write-transaction */
60290: int rc = SQLITE_OK;
60291: int needXcommit = 0;
60292:
60293: #ifdef SQLITE_OMIT_VIRTUALTABLE
60294: /* With this option, sqlite3VtabSync() is defined to be simply
60295: ** SQLITE_OK so p is not used.
60296: */
60297: UNUSED_PARAMETER(p);
60298: #endif
60299:
60300: /* Before doing anything else, call the xSync() callback for any
60301: ** virtual module tables written in this transaction. This has to
60302: ** be done before determining whether a master journal file is
60303: ** required, as an xSync() callback may add an attached database
60304: ** to the transaction.
60305: */
60306: rc = sqlite3VtabSync(db, &p->zErrMsg);
60307:
60308: /* This loop determines (a) if the commit hook should be invoked and
60309: ** (b) how many database files have open write transactions, not
60310: ** including the temp database. (b) is important because if more than
60311: ** one database file has an open write transaction, a master journal
60312: ** file is required for an atomic commit.
60313: */
60314: for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
60315: Btree *pBt = db->aDb[i].pBt;
60316: if( sqlite3BtreeIsInTrans(pBt) ){
60317: needXcommit = 1;
60318: if( i!=1 ) nTrans++;
1.2.2.1 ! misho 60319: sqlite3BtreeEnter(pBt);
1.2 misho 60320: rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt));
1.2.2.1 ! misho 60321: sqlite3BtreeLeave(pBt);
1.2 misho 60322: }
60323: }
60324: if( rc!=SQLITE_OK ){
60325: return rc;
60326: }
60327:
60328: /* If there are any write-transactions at all, invoke the commit hook */
60329: if( needXcommit && db->xCommitCallback ){
60330: rc = db->xCommitCallback(db->pCommitArg);
60331: if( rc ){
60332: return SQLITE_CONSTRAINT;
60333: }
60334: }
60335:
60336: /* The simple case - no more than one database file (not counting the
60337: ** TEMP database) has a transaction active. There is no need for the
60338: ** master-journal.
60339: **
60340: ** If the return value of sqlite3BtreeGetFilename() is a zero length
60341: ** string, it means the main database is :memory: or a temp file. In
60342: ** that case we do not support atomic multi-file commits, so use the
60343: ** simple case then too.
60344: */
60345: if( 0==sqlite3Strlen30(sqlite3BtreeGetFilename(db->aDb[0].pBt))
60346: || nTrans<=1
60347: ){
60348: for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
60349: Btree *pBt = db->aDb[i].pBt;
60350: if( pBt ){
60351: rc = sqlite3BtreeCommitPhaseOne(pBt, 0);
60352: }
60353: }
60354:
60355: /* Do the commit only if all databases successfully complete phase 1.
60356: ** If one of the BtreeCommitPhaseOne() calls fails, this indicates an
60357: ** IO error while deleting or truncating a journal file. It is unlikely,
60358: ** but could happen. In this case abandon processing and return the error.
60359: */
60360: for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
60361: Btree *pBt = db->aDb[i].pBt;
60362: if( pBt ){
60363: rc = sqlite3BtreeCommitPhaseTwo(pBt, 0);
60364: }
60365: }
60366: if( rc==SQLITE_OK ){
60367: sqlite3VtabCommit(db);
60368: }
60369: }
60370:
60371: /* The complex case - There is a multi-file write-transaction active.
60372: ** This requires a master journal file to ensure the transaction is
60373: ** committed atomicly.
60374: */
60375: #ifndef SQLITE_OMIT_DISKIO
60376: else{
60377: sqlite3_vfs *pVfs = db->pVfs;
60378: int needSync = 0;
60379: char *zMaster = 0; /* File-name for the master journal */
60380: char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt);
60381: sqlite3_file *pMaster = 0;
60382: i64 offset = 0;
60383: int res;
60384: int retryCount = 0;
60385: int nMainFile;
60386:
60387: /* Select a master journal file name */
60388: nMainFile = sqlite3Strlen30(zMainFile);
60389: zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz", zMainFile);
60390: if( zMaster==0 ) return SQLITE_NOMEM;
60391: do {
60392: u32 iRandom;
60393: if( retryCount ){
60394: if( retryCount>100 ){
60395: sqlite3_log(SQLITE_FULL, "MJ delete: %s", zMaster);
60396: sqlite3OsDelete(pVfs, zMaster, 0);
60397: break;
60398: }else if( retryCount==1 ){
60399: sqlite3_log(SQLITE_FULL, "MJ collide: %s", zMaster);
60400: }
60401: }
60402: retryCount++;
60403: sqlite3_randomness(sizeof(iRandom), &iRandom);
60404: sqlite3_snprintf(13, &zMaster[nMainFile], "-mj%06X9%02X",
60405: (iRandom>>8)&0xffffff, iRandom&0xff);
60406: /* The antipenultimate character of the master journal name must
60407: ** be "9" to avoid name collisions when using 8+3 filenames. */
60408: assert( zMaster[sqlite3Strlen30(zMaster)-3]=='9' );
60409: sqlite3FileSuffix3(zMainFile, zMaster);
60410: rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res);
60411: }while( rc==SQLITE_OK && res );
60412: if( rc==SQLITE_OK ){
60413: /* Open the master journal. */
60414: rc = sqlite3OsOpenMalloc(pVfs, zMaster, &pMaster,
60415: SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|
60416: SQLITE_OPEN_EXCLUSIVE|SQLITE_OPEN_MASTER_JOURNAL, 0
60417: );
60418: }
60419: if( rc!=SQLITE_OK ){
60420: sqlite3DbFree(db, zMaster);
60421: return rc;
60422: }
60423:
60424: /* Write the name of each database file in the transaction into the new
60425: ** master journal file. If an error occurs at this point close
60426: ** and delete the master journal file. All the individual journal files
60427: ** still have 'null' as the master journal pointer, so they will roll
60428: ** back independently if a failure occurs.
60429: */
60430: for(i=0; i<db->nDb; i++){
60431: Btree *pBt = db->aDb[i].pBt;
60432: if( sqlite3BtreeIsInTrans(pBt) ){
60433: char const *zFile = sqlite3BtreeGetJournalname(pBt);
60434: if( zFile==0 ){
60435: continue; /* Ignore TEMP and :memory: databases */
60436: }
60437: assert( zFile[0]!=0 );
60438: if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){
60439: needSync = 1;
60440: }
60441: rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset);
60442: offset += sqlite3Strlen30(zFile)+1;
60443: if( rc!=SQLITE_OK ){
60444: sqlite3OsCloseFree(pMaster);
60445: sqlite3OsDelete(pVfs, zMaster, 0);
60446: sqlite3DbFree(db, zMaster);
60447: return rc;
60448: }
60449: }
60450: }
60451:
60452: /* Sync the master journal file. If the IOCAP_SEQUENTIAL device
60453: ** flag is set this is not required.
60454: */
60455: if( needSync
60456: && 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL)
60457: && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL))
60458: ){
60459: sqlite3OsCloseFree(pMaster);
60460: sqlite3OsDelete(pVfs, zMaster, 0);
60461: sqlite3DbFree(db, zMaster);
60462: return rc;
60463: }
60464:
60465: /* Sync all the db files involved in the transaction. The same call
60466: ** sets the master journal pointer in each individual journal. If
60467: ** an error occurs here, do not delete the master journal file.
60468: **
60469: ** If the error occurs during the first call to
60470: ** sqlite3BtreeCommitPhaseOne(), then there is a chance that the
60471: ** master journal file will be orphaned. But we cannot delete it,
60472: ** in case the master journal file name was written into the journal
60473: ** file before the failure occurred.
60474: */
60475: for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
60476: Btree *pBt = db->aDb[i].pBt;
60477: if( pBt ){
60478: rc = sqlite3BtreeCommitPhaseOne(pBt, zMaster);
60479: }
60480: }
60481: sqlite3OsCloseFree(pMaster);
60482: assert( rc!=SQLITE_BUSY );
60483: if( rc!=SQLITE_OK ){
60484: sqlite3DbFree(db, zMaster);
60485: return rc;
60486: }
60487:
60488: /* Delete the master journal file. This commits the transaction. After
60489: ** doing this the directory is synced again before any individual
60490: ** transaction files are deleted.
60491: */
60492: rc = sqlite3OsDelete(pVfs, zMaster, 1);
60493: sqlite3DbFree(db, zMaster);
60494: zMaster = 0;
60495: if( rc ){
60496: return rc;
60497: }
60498:
60499: /* All files and directories have already been synced, so the following
60500: ** calls to sqlite3BtreeCommitPhaseTwo() are only closing files and
60501: ** deleting or truncating journals. If something goes wrong while
60502: ** this is happening we don't really care. The integrity of the
60503: ** transaction is already guaranteed, but some stray 'cold' journals
60504: ** may be lying around. Returning an error code won't help matters.
60505: */
60506: disable_simulated_io_errors();
60507: sqlite3BeginBenignMalloc();
60508: for(i=0; i<db->nDb; i++){
60509: Btree *pBt = db->aDb[i].pBt;
60510: if( pBt ){
60511: sqlite3BtreeCommitPhaseTwo(pBt, 1);
60512: }
60513: }
60514: sqlite3EndBenignMalloc();
60515: enable_simulated_io_errors();
60516:
60517: sqlite3VtabCommit(db);
60518: }
60519: #endif
60520:
60521: return rc;
60522: }
60523:
60524: /*
60525: ** This routine checks that the sqlite3.activeVdbeCnt count variable
60526: ** matches the number of vdbe's in the list sqlite3.pVdbe that are
60527: ** currently active. An assertion fails if the two counts do not match.
60528: ** This is an internal self-check only - it is not an essential processing
60529: ** step.
60530: **
60531: ** This is a no-op if NDEBUG is defined.
60532: */
60533: #ifndef NDEBUG
60534: static void checkActiveVdbeCnt(sqlite3 *db){
60535: Vdbe *p;
60536: int cnt = 0;
60537: int nWrite = 0;
60538: p = db->pVdbe;
60539: while( p ){
60540: if( p->magic==VDBE_MAGIC_RUN && p->pc>=0 ){
60541: cnt++;
60542: if( p->readOnly==0 ) nWrite++;
60543: }
60544: p = p->pNext;
60545: }
60546: assert( cnt==db->activeVdbeCnt );
60547: assert( nWrite==db->writeVdbeCnt );
60548: }
60549: #else
60550: #define checkActiveVdbeCnt(x)
60551: #endif
60552:
60553: /*
60554: ** If the Vdbe passed as the first argument opened a statement-transaction,
60555: ** close it now. Argument eOp must be either SAVEPOINT_ROLLBACK or
60556: ** SAVEPOINT_RELEASE. If it is SAVEPOINT_ROLLBACK, then the statement
60557: ** transaction is rolled back. If eOp is SAVEPOINT_RELEASE, then the
60558: ** statement transaction is commtted.
60559: **
60560: ** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned.
60561: ** Otherwise SQLITE_OK.
60562: */
60563: SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){
60564: sqlite3 *const db = p->db;
60565: int rc = SQLITE_OK;
60566:
60567: /* If p->iStatement is greater than zero, then this Vdbe opened a
60568: ** statement transaction that should be closed here. The only exception
60569: ** is that an IO error may have occured, causing an emergency rollback.
60570: ** In this case (db->nStatement==0), and there is nothing to do.
60571: */
60572: if( db->nStatement && p->iStatement ){
60573: int i;
60574: const int iSavepoint = p->iStatement-1;
60575:
60576: assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE);
60577: assert( db->nStatement>0 );
60578: assert( p->iStatement==(db->nStatement+db->nSavepoint) );
60579:
60580: for(i=0; i<db->nDb; i++){
60581: int rc2 = SQLITE_OK;
60582: Btree *pBt = db->aDb[i].pBt;
60583: if( pBt ){
60584: if( eOp==SAVEPOINT_ROLLBACK ){
60585: rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint);
60586: }
60587: if( rc2==SQLITE_OK ){
60588: rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint);
60589: }
60590: if( rc==SQLITE_OK ){
60591: rc = rc2;
60592: }
60593: }
60594: }
60595: db->nStatement--;
60596: p->iStatement = 0;
60597:
60598: if( rc==SQLITE_OK ){
60599: if( eOp==SAVEPOINT_ROLLBACK ){
60600: rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint);
60601: }
60602: if( rc==SQLITE_OK ){
60603: rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint);
60604: }
60605: }
60606:
60607: /* If the statement transaction is being rolled back, also restore the
60608: ** database handles deferred constraint counter to the value it had when
60609: ** the statement transaction was opened. */
60610: if( eOp==SAVEPOINT_ROLLBACK ){
60611: db->nDeferredCons = p->nStmtDefCons;
60612: }
60613: }
60614: return rc;
60615: }
60616:
60617: /*
60618: ** This function is called when a transaction opened by the database
60619: ** handle associated with the VM passed as an argument is about to be
60620: ** committed. If there are outstanding deferred foreign key constraint
60621: ** violations, return SQLITE_ERROR. Otherwise, SQLITE_OK.
60622: **
60623: ** If there are outstanding FK violations and this function returns
60624: ** SQLITE_ERROR, set the result of the VM to SQLITE_CONSTRAINT and write
60625: ** an error message to it. Then return SQLITE_ERROR.
60626: */
60627: #ifndef SQLITE_OMIT_FOREIGN_KEY
60628: SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){
60629: sqlite3 *db = p->db;
60630: if( (deferred && db->nDeferredCons>0) || (!deferred && p->nFkConstraint>0) ){
60631: p->rc = SQLITE_CONSTRAINT;
60632: p->errorAction = OE_Abort;
60633: sqlite3SetString(&p->zErrMsg, db, "foreign key constraint failed");
60634: return SQLITE_ERROR;
60635: }
60636: return SQLITE_OK;
60637: }
60638: #endif
60639:
60640: /*
60641: ** This routine is called the when a VDBE tries to halt. If the VDBE
60642: ** has made changes and is in autocommit mode, then commit those
60643: ** changes. If a rollback is needed, then do the rollback.
60644: **
60645: ** This routine is the only way to move the state of a VM from
60646: ** SQLITE_MAGIC_RUN to SQLITE_MAGIC_HALT. It is harmless to
60647: ** call this on a VM that is in the SQLITE_MAGIC_HALT state.
60648: **
60649: ** Return an error code. If the commit could not complete because of
60650: ** lock contention, return SQLITE_BUSY. If SQLITE_BUSY is returned, it
60651: ** means the close did not happen and needs to be repeated.
60652: */
60653: SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){
60654: int rc; /* Used to store transient return codes */
60655: sqlite3 *db = p->db;
60656:
60657: /* This function contains the logic that determines if a statement or
60658: ** transaction will be committed or rolled back as a result of the
60659: ** execution of this virtual machine.
60660: **
60661: ** If any of the following errors occur:
60662: **
60663: ** SQLITE_NOMEM
60664: ** SQLITE_IOERR
60665: ** SQLITE_FULL
60666: ** SQLITE_INTERRUPT
60667: **
60668: ** Then the internal cache might have been left in an inconsistent
60669: ** state. We need to rollback the statement transaction, if there is
60670: ** one, or the complete transaction if there is no statement transaction.
60671: */
60672:
60673: if( p->db->mallocFailed ){
60674: p->rc = SQLITE_NOMEM;
60675: }
60676: if( p->aOnceFlag ) memset(p->aOnceFlag, 0, p->nOnceFlag);
60677: closeAllCursors(p);
60678: if( p->magic!=VDBE_MAGIC_RUN ){
60679: return SQLITE_OK;
60680: }
60681: checkActiveVdbeCnt(db);
60682:
60683: /* No commit or rollback needed if the program never started */
60684: if( p->pc>=0 ){
60685: int mrc; /* Primary error code from p->rc */
60686: int eStatementOp = 0;
60687: int isSpecialError; /* Set to true if a 'special' error */
60688:
60689: /* Lock all btrees used by the statement */
60690: sqlite3VdbeEnter(p);
60691:
60692: /* Check for one of the special errors */
60693: mrc = p->rc & 0xff;
60694: assert( p->rc!=SQLITE_IOERR_BLOCKED ); /* This error no longer exists */
60695: isSpecialError = mrc==SQLITE_NOMEM || mrc==SQLITE_IOERR
60696: || mrc==SQLITE_INTERRUPT || mrc==SQLITE_FULL;
60697: if( isSpecialError ){
60698: /* If the query was read-only and the error code is SQLITE_INTERRUPT,
60699: ** no rollback is necessary. Otherwise, at least a savepoint
60700: ** transaction must be rolled back to restore the database to a
60701: ** consistent state.
60702: **
60703: ** Even if the statement is read-only, it is important to perform
60704: ** a statement or transaction rollback operation. If the error
60705: ** occured while writing to the journal, sub-journal or database
60706: ** file as part of an effort to free up cache space (see function
60707: ** pagerStress() in pager.c), the rollback is required to restore
60708: ** the pager to a consistent state.
60709: */
60710: if( !p->readOnly || mrc!=SQLITE_INTERRUPT ){
60711: if( (mrc==SQLITE_NOMEM || mrc==SQLITE_FULL) && p->usesStmtJournal ){
60712: eStatementOp = SAVEPOINT_ROLLBACK;
60713: }else{
60714: /* We are forced to roll back the active transaction. Before doing
60715: ** so, abort any other statements this handle currently has active.
60716: */
1.2.2.1 ! misho 60717: sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
1.2 misho 60718: sqlite3CloseSavepoints(db);
60719: db->autoCommit = 1;
60720: }
60721: }
60722: }
60723:
60724: /* Check for immediate foreign key violations. */
60725: if( p->rc==SQLITE_OK ){
60726: sqlite3VdbeCheckFk(p, 0);
60727: }
60728:
60729: /* If the auto-commit flag is set and this is the only active writer
60730: ** VM, then we do either a commit or rollback of the current transaction.
60731: **
60732: ** Note: This block also runs if one of the special errors handled
60733: ** above has occurred.
60734: */
60735: if( !sqlite3VtabInSync(db)
60736: && db->autoCommit
60737: && db->writeVdbeCnt==(p->readOnly==0)
60738: ){
60739: if( p->rc==SQLITE_OK || (p->errorAction==OE_Fail && !isSpecialError) ){
60740: rc = sqlite3VdbeCheckFk(p, 1);
60741: if( rc!=SQLITE_OK ){
60742: if( NEVER(p->readOnly) ){
60743: sqlite3VdbeLeave(p);
60744: return SQLITE_ERROR;
60745: }
60746: rc = SQLITE_CONSTRAINT;
60747: }else{
60748: /* The auto-commit flag is true, the vdbe program was successful
60749: ** or hit an 'OR FAIL' constraint and there are no deferred foreign
60750: ** key constraints to hold up the transaction. This means a commit
60751: ** is required. */
60752: rc = vdbeCommit(db, p);
60753: }
60754: if( rc==SQLITE_BUSY && p->readOnly ){
60755: sqlite3VdbeLeave(p);
60756: return SQLITE_BUSY;
60757: }else if( rc!=SQLITE_OK ){
60758: p->rc = rc;
1.2.2.1 ! misho 60759: sqlite3RollbackAll(db, SQLITE_OK);
1.2 misho 60760: }else{
60761: db->nDeferredCons = 0;
60762: sqlite3CommitInternalChanges(db);
60763: }
60764: }else{
1.2.2.1 ! misho 60765: sqlite3RollbackAll(db, SQLITE_OK);
1.2 misho 60766: }
60767: db->nStatement = 0;
60768: }else if( eStatementOp==0 ){
60769: if( p->rc==SQLITE_OK || p->errorAction==OE_Fail ){
60770: eStatementOp = SAVEPOINT_RELEASE;
60771: }else if( p->errorAction==OE_Abort ){
60772: eStatementOp = SAVEPOINT_ROLLBACK;
60773: }else{
1.2.2.1 ! misho 60774: sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
1.2 misho 60775: sqlite3CloseSavepoints(db);
60776: db->autoCommit = 1;
60777: }
60778: }
60779:
60780: /* If eStatementOp is non-zero, then a statement transaction needs to
60781: ** be committed or rolled back. Call sqlite3VdbeCloseStatement() to
60782: ** do so. If this operation returns an error, and the current statement
60783: ** error code is SQLITE_OK or SQLITE_CONSTRAINT, then promote the
60784: ** current statement error code.
60785: */
60786: if( eStatementOp ){
60787: rc = sqlite3VdbeCloseStatement(p, eStatementOp);
60788: if( rc ){
60789: if( p->rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT ){
60790: p->rc = rc;
60791: sqlite3DbFree(db, p->zErrMsg);
60792: p->zErrMsg = 0;
60793: }
1.2.2.1 ! misho 60794: sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
1.2 misho 60795: sqlite3CloseSavepoints(db);
60796: db->autoCommit = 1;
60797: }
60798: }
60799:
60800: /* If this was an INSERT, UPDATE or DELETE and no statement transaction
60801: ** has been rolled back, update the database connection change-counter.
60802: */
60803: if( p->changeCntOn ){
60804: if( eStatementOp!=SAVEPOINT_ROLLBACK ){
60805: sqlite3VdbeSetChanges(db, p->nChange);
60806: }else{
60807: sqlite3VdbeSetChanges(db, 0);
60808: }
60809: p->nChange = 0;
60810: }
60811:
60812: /* Release the locks */
60813: sqlite3VdbeLeave(p);
60814: }
60815:
60816: /* We have successfully halted and closed the VM. Record this fact. */
60817: if( p->pc>=0 ){
60818: db->activeVdbeCnt--;
60819: if( !p->readOnly ){
60820: db->writeVdbeCnt--;
60821: }
60822: assert( db->activeVdbeCnt>=db->writeVdbeCnt );
60823: }
60824: p->magic = VDBE_MAGIC_HALT;
60825: checkActiveVdbeCnt(db);
60826: if( p->db->mallocFailed ){
60827: p->rc = SQLITE_NOMEM;
60828: }
60829:
60830: /* If the auto-commit flag is set to true, then any locks that were held
60831: ** by connection db have now been released. Call sqlite3ConnectionUnlocked()
60832: ** to invoke any required unlock-notify callbacks.
60833: */
60834: if( db->autoCommit ){
60835: sqlite3ConnectionUnlocked(db);
60836: }
60837:
60838: assert( db->activeVdbeCnt>0 || db->autoCommit==0 || db->nStatement==0 );
60839: return (p->rc==SQLITE_BUSY ? SQLITE_BUSY : SQLITE_OK);
60840: }
60841:
60842:
60843: /*
60844: ** Each VDBE holds the result of the most recent sqlite3_step() call
60845: ** in p->rc. This routine sets that result back to SQLITE_OK.
60846: */
60847: SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe *p){
60848: p->rc = SQLITE_OK;
60849: }
60850:
60851: /*
60852: ** Copy the error code and error message belonging to the VDBE passed
60853: ** as the first argument to its database handle (so that they will be
60854: ** returned by calls to sqlite3_errcode() and sqlite3_errmsg()).
60855: **
60856: ** This function does not clear the VDBE error code or message, just
60857: ** copies them to the database handle.
60858: */
60859: SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){
60860: sqlite3 *db = p->db;
60861: int rc = p->rc;
60862: if( p->zErrMsg ){
60863: u8 mallocFailed = db->mallocFailed;
60864: sqlite3BeginBenignMalloc();
60865: sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT);
60866: sqlite3EndBenignMalloc();
60867: db->mallocFailed = mallocFailed;
60868: db->errCode = rc;
60869: }else{
60870: sqlite3Error(db, rc, 0);
60871: }
60872: return rc;
60873: }
60874:
1.2.2.1 ! misho 60875: #ifdef SQLITE_ENABLE_SQLLOG
! 60876: /*
! 60877: ** If an SQLITE_CONFIG_SQLLOG hook is registered and the VM has been run,
! 60878: ** invoke it.
! 60879: */
! 60880: static void vdbeInvokeSqllog(Vdbe *v){
! 60881: if( sqlite3GlobalConfig.xSqllog && v->rc==SQLITE_OK && v->zSql && v->pc>=0 ){
! 60882: char *zExpanded = sqlite3VdbeExpandSql(v, v->zSql);
! 60883: assert( v->db->init.busy==0 );
! 60884: if( zExpanded ){
! 60885: sqlite3GlobalConfig.xSqllog(
! 60886: sqlite3GlobalConfig.pSqllogArg, v->db, zExpanded, 1
! 60887: );
! 60888: sqlite3DbFree(v->db, zExpanded);
! 60889: }
! 60890: }
! 60891: }
! 60892: #else
! 60893: # define vdbeInvokeSqllog(x)
! 60894: #endif
! 60895:
1.2 misho 60896: /*
60897: ** Clean up a VDBE after execution but do not delete the VDBE just yet.
60898: ** Write any error messages into *pzErrMsg. Return the result code.
60899: **
60900: ** After this routine is run, the VDBE should be ready to be executed
60901: ** again.
60902: **
60903: ** To look at it another way, this routine resets the state of the
60904: ** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to
60905: ** VDBE_MAGIC_INIT.
60906: */
60907: SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){
60908: sqlite3 *db;
60909: db = p->db;
60910:
60911: /* If the VM did not run to completion or if it encountered an
60912: ** error, then it might not have been halted properly. So halt
60913: ** it now.
60914: */
60915: sqlite3VdbeHalt(p);
60916:
60917: /* If the VDBE has be run even partially, then transfer the error code
60918: ** and error message from the VDBE into the main database structure. But
60919: ** if the VDBE has just been set to run but has not actually executed any
60920: ** instructions yet, leave the main database error information unchanged.
60921: */
60922: if( p->pc>=0 ){
1.2.2.1 ! misho 60923: vdbeInvokeSqllog(p);
1.2 misho 60924: sqlite3VdbeTransferError(p);
60925: sqlite3DbFree(db, p->zErrMsg);
60926: p->zErrMsg = 0;
60927: if( p->runOnlyOnce ) p->expired = 1;
60928: }else if( p->rc && p->expired ){
60929: /* The expired flag was set on the VDBE before the first call
60930: ** to sqlite3_step(). For consistency (since sqlite3_step() was
60931: ** called), set the database error in this case as well.
60932: */
60933: sqlite3Error(db, p->rc, 0);
60934: sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT);
60935: sqlite3DbFree(db, p->zErrMsg);
60936: p->zErrMsg = 0;
60937: }
60938:
60939: /* Reclaim all memory used by the VDBE
60940: */
60941: Cleanup(p);
60942:
60943: /* Save profiling information from this VDBE run.
60944: */
60945: #ifdef VDBE_PROFILE
60946: {
60947: FILE *out = fopen("vdbe_profile.out", "a");
60948: if( out ){
60949: int i;
60950: fprintf(out, "---- ");
60951: for(i=0; i<p->nOp; i++){
60952: fprintf(out, "%02x", p->aOp[i].opcode);
60953: }
60954: fprintf(out, "\n");
60955: for(i=0; i<p->nOp; i++){
60956: fprintf(out, "%6d %10lld %8lld ",
60957: p->aOp[i].cnt,
60958: p->aOp[i].cycles,
60959: p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0
60960: );
60961: sqlite3VdbePrintOp(out, i, &p->aOp[i]);
60962: }
60963: fclose(out);
60964: }
60965: }
60966: #endif
60967: p->magic = VDBE_MAGIC_INIT;
60968: return p->rc & db->errMask;
60969: }
60970:
60971: /*
60972: ** Clean up and delete a VDBE after execution. Return an integer which is
60973: ** the result code. Write any error message text into *pzErrMsg.
60974: */
60975: SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){
60976: int rc = SQLITE_OK;
60977: if( p->magic==VDBE_MAGIC_RUN || p->magic==VDBE_MAGIC_HALT ){
60978: rc = sqlite3VdbeReset(p);
60979: assert( (rc & p->db->errMask)==rc );
60980: }
60981: sqlite3VdbeDelete(p);
60982: return rc;
60983: }
60984:
60985: /*
60986: ** Call the destructor for each auxdata entry in pVdbeFunc for which
60987: ** the corresponding bit in mask is clear. Auxdata entries beyond 31
60988: ** are always destroyed. To destroy all auxdata entries, call this
60989: ** routine with mask==0.
60990: */
60991: SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(VdbeFunc *pVdbeFunc, int mask){
60992: int i;
60993: for(i=0; i<pVdbeFunc->nAux; i++){
60994: struct AuxData *pAux = &pVdbeFunc->apAux[i];
60995: if( (i>31 || !(mask&(((u32)1)<<i))) && pAux->pAux ){
60996: if( pAux->xDelete ){
60997: pAux->xDelete(pAux->pAux);
60998: }
60999: pAux->pAux = 0;
61000: }
61001: }
61002: }
61003:
61004: /*
1.2.2.1 ! misho 61005: ** Free all memory associated with the Vdbe passed as the second argument,
! 61006: ** except for object itself, which is preserved.
! 61007: **
1.2 misho 61008: ** The difference between this function and sqlite3VdbeDelete() is that
61009: ** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with
1.2.2.1 ! misho 61010: ** the database connection and frees the object itself.
1.2 misho 61011: */
1.2.2.1 ! misho 61012: SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){
1.2 misho 61013: SubProgram *pSub, *pNext;
61014: int i;
61015: assert( p->db==0 || p->db==db );
61016: releaseMemArray(p->aVar, p->nVar);
61017: releaseMemArray(p->aColName, p->nResColumn*COLNAME_N);
61018: for(pSub=p->pProgram; pSub; pSub=pNext){
61019: pNext = pSub->pNext;
61020: vdbeFreeOpArray(db, pSub->aOp, pSub->nOp);
61021: sqlite3DbFree(db, pSub);
61022: }
61023: for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]);
61024: vdbeFreeOpArray(db, p->aOp, p->nOp);
61025: sqlite3DbFree(db, p->aLabel);
61026: sqlite3DbFree(db, p->aColName);
61027: sqlite3DbFree(db, p->zSql);
61028: sqlite3DbFree(db, p->pFree);
61029: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
1.2.2.1 ! misho 61030: sqlite3_free(p->zExplain);
1.2 misho 61031: sqlite3DbFree(db, p->pExplain);
61032: #endif
61033: }
61034:
61035: /*
61036: ** Delete an entire VDBE.
61037: */
61038: SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){
61039: sqlite3 *db;
61040:
61041: if( NEVER(p==0) ) return;
61042: db = p->db;
1.2.2.1 ! misho 61043: assert( sqlite3_mutex_held(db->mutex) );
! 61044: sqlite3VdbeClearObject(db, p);
1.2 misho 61045: if( p->pPrev ){
61046: p->pPrev->pNext = p->pNext;
61047: }else{
61048: assert( db->pVdbe==p );
61049: db->pVdbe = p->pNext;
61050: }
61051: if( p->pNext ){
61052: p->pNext->pPrev = p->pPrev;
61053: }
61054: p->magic = VDBE_MAGIC_DEAD;
61055: p->db = 0;
1.2.2.1 ! misho 61056: sqlite3DbFree(db, p);
1.2 misho 61057: }
61058:
61059: /*
61060: ** Make sure the cursor p is ready to read or write the row to which it
61061: ** was last positioned. Return an error code if an OOM fault or I/O error
61062: ** prevents us from positioning the cursor to its correct position.
61063: **
61064: ** If a MoveTo operation is pending on the given cursor, then do that
61065: ** MoveTo now. If no move is pending, check to see if the row has been
61066: ** deleted out from under the cursor and if it has, mark the row as
61067: ** a NULL row.
61068: **
61069: ** If the cursor is already pointing to the correct row and that row has
61070: ** not been deleted out from under the cursor, then this routine is a no-op.
61071: */
61072: SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor *p){
61073: if( p->deferredMoveto ){
61074: int res, rc;
61075: #ifdef SQLITE_TEST
61076: extern int sqlite3_search_count;
61077: #endif
61078: assert( p->isTable );
61079: rc = sqlite3BtreeMovetoUnpacked(p->pCursor, 0, p->movetoTarget, 0, &res);
61080: if( rc ) return rc;
61081: p->lastRowid = p->movetoTarget;
61082: if( res!=0 ) return SQLITE_CORRUPT_BKPT;
61083: p->rowidIsValid = 1;
61084: #ifdef SQLITE_TEST
61085: sqlite3_search_count++;
61086: #endif
61087: p->deferredMoveto = 0;
61088: p->cacheStatus = CACHE_STALE;
61089: }else if( ALWAYS(p->pCursor) ){
61090: int hasMoved;
61091: int rc = sqlite3BtreeCursorHasMoved(p->pCursor, &hasMoved);
61092: if( rc ) return rc;
61093: if( hasMoved ){
61094: p->cacheStatus = CACHE_STALE;
61095: p->nullRow = 1;
61096: }
61097: }
61098: return SQLITE_OK;
61099: }
61100:
61101: /*
61102: ** The following functions:
61103: **
61104: ** sqlite3VdbeSerialType()
61105: ** sqlite3VdbeSerialTypeLen()
61106: ** sqlite3VdbeSerialLen()
61107: ** sqlite3VdbeSerialPut()
61108: ** sqlite3VdbeSerialGet()
61109: **
61110: ** encapsulate the code that serializes values for storage in SQLite
61111: ** data and index records. Each serialized value consists of a
61112: ** 'serial-type' and a blob of data. The serial type is an 8-byte unsigned
61113: ** integer, stored as a varint.
61114: **
61115: ** In an SQLite index record, the serial type is stored directly before
61116: ** the blob of data that it corresponds to. In a table record, all serial
61117: ** types are stored at the start of the record, and the blobs of data at
61118: ** the end. Hence these functions allow the caller to handle the
61119: ** serial-type and data blob seperately.
61120: **
61121: ** The following table describes the various storage classes for data:
61122: **
61123: ** serial type bytes of data type
61124: ** -------------- --------------- ---------------
61125: ** 0 0 NULL
61126: ** 1 1 signed integer
61127: ** 2 2 signed integer
61128: ** 3 3 signed integer
61129: ** 4 4 signed integer
61130: ** 5 6 signed integer
61131: ** 6 8 signed integer
61132: ** 7 8 IEEE float
61133: ** 8 0 Integer constant 0
61134: ** 9 0 Integer constant 1
61135: ** 10,11 reserved for expansion
61136: ** N>=12 and even (N-12)/2 BLOB
61137: ** N>=13 and odd (N-13)/2 text
61138: **
61139: ** The 8 and 9 types were added in 3.3.0, file format 4. Prior versions
61140: ** of SQLite will not understand those serial types.
61141: */
61142:
61143: /*
61144: ** Return the serial-type for the value stored in pMem.
61145: */
61146: SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
61147: int flags = pMem->flags;
61148: int n;
61149:
61150: if( flags&MEM_Null ){
61151: return 0;
61152: }
61153: if( flags&MEM_Int ){
61154: /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */
61155: # define MAX_6BYTE ((((i64)0x00008000)<<32)-1)
61156: i64 i = pMem->u.i;
61157: u64 u;
61158: if( i<0 ){
61159: if( i<(-MAX_6BYTE) ) return 6;
61160: /* Previous test prevents: u = -(-9223372036854775808) */
61161: u = -i;
61162: }else{
61163: u = i;
61164: }
1.2.2.1 ! misho 61165: if( u<=127 ){
! 61166: return ((i&1)==i && file_format>=4) ? 8+(u32)u : 1;
! 61167: }
1.2 misho 61168: if( u<=32767 ) return 2;
61169: if( u<=8388607 ) return 3;
61170: if( u<=2147483647 ) return 4;
61171: if( u<=MAX_6BYTE ) return 5;
61172: return 6;
61173: }
61174: if( flags&MEM_Real ){
61175: return 7;
61176: }
61177: assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) );
61178: n = pMem->n;
61179: if( flags & MEM_Zero ){
61180: n += pMem->u.nZero;
61181: }
61182: assert( n>=0 );
61183: return ((n*2) + 12 + ((flags&MEM_Str)!=0));
61184: }
61185:
61186: /*
61187: ** Return the length of the data corresponding to the supplied serial-type.
61188: */
61189: SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){
61190: if( serial_type>=12 ){
61191: return (serial_type-12)/2;
61192: }else{
61193: static const u8 aSize[] = { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 };
61194: return aSize[serial_type];
61195: }
61196: }
61197:
61198: /*
61199: ** If we are on an architecture with mixed-endian floating
61200: ** points (ex: ARM7) then swap the lower 4 bytes with the
61201: ** upper 4 bytes. Return the result.
61202: **
61203: ** For most architectures, this is a no-op.
61204: **
61205: ** (later): It is reported to me that the mixed-endian problem
61206: ** on ARM7 is an issue with GCC, not with the ARM7 chip. It seems
61207: ** that early versions of GCC stored the two words of a 64-bit
61208: ** float in the wrong order. And that error has been propagated
61209: ** ever since. The blame is not necessarily with GCC, though.
61210: ** GCC might have just copying the problem from a prior compiler.
61211: ** I am also told that newer versions of GCC that follow a different
61212: ** ABI get the byte order right.
61213: **
61214: ** Developers using SQLite on an ARM7 should compile and run their
61215: ** application using -DSQLITE_DEBUG=1 at least once. With DEBUG
61216: ** enabled, some asserts below will ensure that the byte order of
61217: ** floating point values is correct.
61218: **
61219: ** (2007-08-30) Frank van Vugt has studied this problem closely
61220: ** and has send his findings to the SQLite developers. Frank
61221: ** writes that some Linux kernels offer floating point hardware
61222: ** emulation that uses only 32-bit mantissas instead of a full
61223: ** 48-bits as required by the IEEE standard. (This is the
61224: ** CONFIG_FPE_FASTFPE option.) On such systems, floating point
61225: ** byte swapping becomes very complicated. To avoid problems,
61226: ** the necessary byte swapping is carried out using a 64-bit integer
61227: ** rather than a 64-bit float. Frank assures us that the code here
61228: ** works for him. We, the developers, have no way to independently
61229: ** verify this, but Frank seems to know what he is talking about
61230: ** so we trust him.
61231: */
61232: #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
61233: static u64 floatSwap(u64 in){
61234: union {
61235: u64 r;
61236: u32 i[2];
61237: } u;
61238: u32 t;
61239:
61240: u.r = in;
61241: t = u.i[0];
61242: u.i[0] = u.i[1];
61243: u.i[1] = t;
61244: return u.r;
61245: }
61246: # define swapMixedEndianFloat(X) X = floatSwap(X)
61247: #else
61248: # define swapMixedEndianFloat(X)
61249: #endif
61250:
61251: /*
61252: ** Write the serialized data blob for the value stored in pMem into
61253: ** buf. It is assumed that the caller has allocated sufficient space.
61254: ** Return the number of bytes written.
61255: **
61256: ** nBuf is the amount of space left in buf[]. nBuf must always be
61257: ** large enough to hold the entire field. Except, if the field is
61258: ** a blob with a zero-filled tail, then buf[] might be just the right
61259: ** size to hold everything except for the zero-filled tail. If buf[]
61260: ** is only big enough to hold the non-zero prefix, then only write that
61261: ** prefix into buf[]. But if buf[] is large enough to hold both the
61262: ** prefix and the tail then write the prefix and set the tail to all
61263: ** zeros.
61264: **
61265: ** Return the number of bytes actually written into buf[]. The number
61266: ** of bytes in the zero-filled tail is included in the return value only
61267: ** if those bytes were zeroed in buf[].
61268: */
61269: SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, int nBuf, Mem *pMem, int file_format){
61270: u32 serial_type = sqlite3VdbeSerialType(pMem, file_format);
61271: u32 len;
61272:
61273: /* Integer and Real */
61274: if( serial_type<=7 && serial_type>0 ){
61275: u64 v;
61276: u32 i;
61277: if( serial_type==7 ){
61278: assert( sizeof(v)==sizeof(pMem->r) );
61279: memcpy(&v, &pMem->r, sizeof(v));
61280: swapMixedEndianFloat(v);
61281: }else{
61282: v = pMem->u.i;
61283: }
61284: len = i = sqlite3VdbeSerialTypeLen(serial_type);
61285: assert( len<=(u32)nBuf );
61286: while( i-- ){
61287: buf[i] = (u8)(v&0xFF);
61288: v >>= 8;
61289: }
61290: return len;
61291: }
61292:
61293: /* String or blob */
61294: if( serial_type>=12 ){
61295: assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0)
61296: == (int)sqlite3VdbeSerialTypeLen(serial_type) );
61297: assert( pMem->n<=nBuf );
61298: len = pMem->n;
61299: memcpy(buf, pMem->z, len);
61300: if( pMem->flags & MEM_Zero ){
61301: len += pMem->u.nZero;
61302: assert( nBuf>=0 );
61303: if( len > (u32)nBuf ){
61304: len = (u32)nBuf;
61305: }
61306: memset(&buf[pMem->n], 0, len-pMem->n);
61307: }
61308: return len;
61309: }
61310:
61311: /* NULL or constants 0 or 1 */
61312: return 0;
61313: }
61314:
61315: /*
61316: ** Deserialize the data blob pointed to by buf as serial type serial_type
61317: ** and store the result in pMem. Return the number of bytes read.
61318: */
61319: SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
61320: const unsigned char *buf, /* Buffer to deserialize from */
61321: u32 serial_type, /* Serial type to deserialize */
61322: Mem *pMem /* Memory cell to write value into */
61323: ){
61324: switch( serial_type ){
61325: case 10: /* Reserved for future use */
61326: case 11: /* Reserved for future use */
61327: case 0: { /* NULL */
61328: pMem->flags = MEM_Null;
61329: break;
61330: }
61331: case 1: { /* 1-byte signed integer */
61332: pMem->u.i = (signed char)buf[0];
61333: pMem->flags = MEM_Int;
61334: return 1;
61335: }
61336: case 2: { /* 2-byte signed integer */
61337: pMem->u.i = (((signed char)buf[0])<<8) | buf[1];
61338: pMem->flags = MEM_Int;
61339: return 2;
61340: }
61341: case 3: { /* 3-byte signed integer */
61342: pMem->u.i = (((signed char)buf[0])<<16) | (buf[1]<<8) | buf[2];
61343: pMem->flags = MEM_Int;
61344: return 3;
61345: }
61346: case 4: { /* 4-byte signed integer */
61347: pMem->u.i = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
61348: pMem->flags = MEM_Int;
61349: return 4;
61350: }
61351: case 5: { /* 6-byte signed integer */
61352: u64 x = (((signed char)buf[0])<<8) | buf[1];
61353: u32 y = (buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5];
61354: x = (x<<32) | y;
61355: pMem->u.i = *(i64*)&x;
61356: pMem->flags = MEM_Int;
61357: return 6;
61358: }
61359: case 6: /* 8-byte signed integer */
61360: case 7: { /* IEEE floating point */
61361: u64 x;
61362: u32 y;
61363: #if !defined(NDEBUG) && !defined(SQLITE_OMIT_FLOATING_POINT)
61364: /* Verify that integers and floating point values use the same
61365: ** byte order. Or, that if SQLITE_MIXED_ENDIAN_64BIT_FLOAT is
61366: ** defined that 64-bit floating point values really are mixed
61367: ** endian.
61368: */
61369: static const u64 t1 = ((u64)0x3ff00000)<<32;
61370: static const double r1 = 1.0;
61371: u64 t2 = t1;
61372: swapMixedEndianFloat(t2);
61373: assert( sizeof(r1)==sizeof(t2) && memcmp(&r1, &t2, sizeof(r1))==0 );
61374: #endif
61375:
61376: x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
61377: y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7];
61378: x = (x<<32) | y;
61379: if( serial_type==6 ){
61380: pMem->u.i = *(i64*)&x;
61381: pMem->flags = MEM_Int;
61382: }else{
61383: assert( sizeof(x)==8 && sizeof(pMem->r)==8 );
61384: swapMixedEndianFloat(x);
61385: memcpy(&pMem->r, &x, sizeof(x));
61386: pMem->flags = sqlite3IsNaN(pMem->r) ? MEM_Null : MEM_Real;
61387: }
61388: return 8;
61389: }
61390: case 8: /* Integer 0 */
61391: case 9: { /* Integer 1 */
61392: pMem->u.i = serial_type-8;
61393: pMem->flags = MEM_Int;
61394: return 0;
61395: }
61396: default: {
61397: u32 len = (serial_type-12)/2;
61398: pMem->z = (char *)buf;
61399: pMem->n = len;
61400: pMem->xDel = 0;
61401: if( serial_type&0x01 ){
61402: pMem->flags = MEM_Str | MEM_Ephem;
61403: }else{
61404: pMem->flags = MEM_Blob | MEM_Ephem;
61405: }
61406: return len;
61407: }
61408: }
61409: return 0;
61410: }
61411:
61412: /*
61413: ** This routine is used to allocate sufficient space for an UnpackedRecord
61414: ** structure large enough to be used with sqlite3VdbeRecordUnpack() if
61415: ** the first argument is a pointer to KeyInfo structure pKeyInfo.
61416: **
61417: ** The space is either allocated using sqlite3DbMallocRaw() or from within
61418: ** the unaligned buffer passed via the second and third arguments (presumably
61419: ** stack space). If the former, then *ppFree is set to a pointer that should
61420: ** be eventually freed by the caller using sqlite3DbFree(). Or, if the
61421: ** allocation comes from the pSpace/szSpace buffer, *ppFree is set to NULL
61422: ** before returning.
61423: **
61424: ** If an OOM error occurs, NULL is returned.
61425: */
61426: SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(
61427: KeyInfo *pKeyInfo, /* Description of the record */
61428: char *pSpace, /* Unaligned space available */
61429: int szSpace, /* Size of pSpace[] in bytes */
61430: char **ppFree /* OUT: Caller should free this pointer */
61431: ){
61432: UnpackedRecord *p; /* Unpacked record to return */
61433: int nOff; /* Increment pSpace by nOff to align it */
61434: int nByte; /* Number of bytes required for *p */
61435:
61436: /* We want to shift the pointer pSpace up such that it is 8-byte aligned.
61437: ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift
61438: ** it by. If pSpace is already 8-byte aligned, nOff should be zero.
61439: */
61440: nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7;
61441: nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1);
61442: if( nByte>szSpace+nOff ){
61443: p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte);
61444: *ppFree = (char *)p;
61445: if( !p ) return 0;
61446: }else{
61447: p = (UnpackedRecord*)&pSpace[nOff];
61448: *ppFree = 0;
61449: }
61450:
61451: p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
1.2.2.1 ! misho 61452: assert( pKeyInfo->aSortOrder!=0 );
1.2 misho 61453: p->pKeyInfo = pKeyInfo;
61454: p->nField = pKeyInfo->nField + 1;
61455: return p;
61456: }
61457:
61458: /*
61459: ** Given the nKey-byte encoding of a record in pKey[], populate the
61460: ** UnpackedRecord structure indicated by the fourth argument with the
61461: ** contents of the decoded record.
61462: */
61463: SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(
61464: KeyInfo *pKeyInfo, /* Information about the record format */
61465: int nKey, /* Size of the binary record */
61466: const void *pKey, /* The binary record */
61467: UnpackedRecord *p /* Populate this structure before returning. */
61468: ){
61469: const unsigned char *aKey = (const unsigned char *)pKey;
61470: int d;
61471: u32 idx; /* Offset in aKey[] to read from */
61472: u16 u; /* Unsigned loop counter */
61473: u32 szHdr;
61474: Mem *pMem = p->aMem;
61475:
61476: p->flags = 0;
61477: assert( EIGHT_BYTE_ALIGNMENT(pMem) );
61478: idx = getVarint32(aKey, szHdr);
61479: d = szHdr;
61480: u = 0;
61481: while( idx<szHdr && u<p->nField && d<=nKey ){
61482: u32 serial_type;
61483:
61484: idx += getVarint32(&aKey[idx], serial_type);
61485: pMem->enc = pKeyInfo->enc;
61486: pMem->db = pKeyInfo->db;
61487: /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */
61488: pMem->zMalloc = 0;
61489: d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem);
61490: pMem++;
61491: u++;
61492: }
61493: assert( u<=pKeyInfo->nField + 1 );
61494: p->nField = u;
61495: }
61496:
61497: /*
61498: ** This function compares the two table rows or index records
61499: ** specified by {nKey1, pKey1} and pPKey2. It returns a negative, zero
61500: ** or positive integer if key1 is less than, equal to or
61501: ** greater than key2. The {nKey1, pKey1} key must be a blob
61502: ** created by th OP_MakeRecord opcode of the VDBE. The pPKey2
61503: ** key must be a parsed key such as obtained from
61504: ** sqlite3VdbeParseRecord.
61505: **
61506: ** Key1 and Key2 do not have to contain the same number of fields.
61507: ** The key with fewer fields is usually compares less than the
61508: ** longer key. However if the UNPACKED_INCRKEY flags in pPKey2 is set
61509: ** and the common prefixes are equal, then key1 is less than key2.
61510: ** Or if the UNPACKED_MATCH_PREFIX flag is set and the prefixes are
61511: ** equal, then the keys are considered to be equal and
61512: ** the parts beyond the common prefix are ignored.
61513: */
61514: SQLITE_PRIVATE int sqlite3VdbeRecordCompare(
61515: int nKey1, const void *pKey1, /* Left key */
61516: UnpackedRecord *pPKey2 /* Right key */
61517: ){
61518: int d1; /* Offset into aKey[] of next data element */
61519: u32 idx1; /* Offset into aKey[] of next header element */
61520: u32 szHdr1; /* Number of bytes in header */
61521: int i = 0;
61522: int nField;
61523: int rc = 0;
61524: const unsigned char *aKey1 = (const unsigned char *)pKey1;
61525: KeyInfo *pKeyInfo;
61526: Mem mem1;
61527:
61528: pKeyInfo = pPKey2->pKeyInfo;
61529: mem1.enc = pKeyInfo->enc;
61530: mem1.db = pKeyInfo->db;
61531: /* mem1.flags = 0; // Will be initialized by sqlite3VdbeSerialGet() */
61532: VVA_ONLY( mem1.zMalloc = 0; ) /* Only needed by assert() statements */
61533:
61534: /* Compilers may complain that mem1.u.i is potentially uninitialized.
61535: ** We could initialize it, as shown here, to silence those complaints.
61536: ** But in fact, mem1.u.i will never actually be used uninitialized, and doing
61537: ** the unnecessary initialization has a measurable negative performance
61538: ** impact, since this routine is a very high runner. And so, we choose
61539: ** to ignore the compiler warnings and leave this variable uninitialized.
61540: */
61541: /* mem1.u.i = 0; // not needed, here to silence compiler warning */
61542:
61543: idx1 = getVarint32(aKey1, szHdr1);
61544: d1 = szHdr1;
61545: nField = pKeyInfo->nField;
1.2.2.1 ! misho 61546: assert( pKeyInfo->aSortOrder!=0 );
1.2 misho 61547: while( idx1<szHdr1 && i<pPKey2->nField ){
61548: u32 serial_type1;
61549:
61550: /* Read the serial types for the next element in each key. */
61551: idx1 += getVarint32( aKey1+idx1, serial_type1 );
61552: if( d1>=nKey1 && sqlite3VdbeSerialTypeLen(serial_type1)>0 ) break;
61553:
61554: /* Extract the values to be compared.
61555: */
61556: d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1);
61557:
61558: /* Do the comparison
61559: */
61560: rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i],
61561: i<nField ? pKeyInfo->aColl[i] : 0);
61562: if( rc!=0 ){
61563: assert( mem1.zMalloc==0 ); /* See comment below */
61564:
61565: /* Invert the result if we are using DESC sort order. */
1.2.2.1 ! misho 61566: if( i<nField && pKeyInfo->aSortOrder[i] ){
1.2 misho 61567: rc = -rc;
61568: }
61569:
61570: /* If the PREFIX_SEARCH flag is set and all fields except the final
61571: ** rowid field were equal, then clear the PREFIX_SEARCH flag and set
61572: ** pPKey2->rowid to the value of the rowid field in (pKey1, nKey1).
61573: ** This is used by the OP_IsUnique opcode.
61574: */
61575: if( (pPKey2->flags & UNPACKED_PREFIX_SEARCH) && i==(pPKey2->nField-1) ){
61576: assert( idx1==szHdr1 && rc );
61577: assert( mem1.flags & MEM_Int );
61578: pPKey2->flags &= ~UNPACKED_PREFIX_SEARCH;
61579: pPKey2->rowid = mem1.u.i;
61580: }
61581:
61582: return rc;
61583: }
61584: i++;
61585: }
61586:
61587: /* No memory allocation is ever used on mem1. Prove this using
61588: ** the following assert(). If the assert() fails, it indicates a
61589: ** memory leak and a need to call sqlite3VdbeMemRelease(&mem1).
61590: */
61591: assert( mem1.zMalloc==0 );
61592:
61593: /* rc==0 here means that one of the keys ran out of fields and
61594: ** all the fields up to that point were equal. If the UNPACKED_INCRKEY
61595: ** flag is set, then break the tie by treating key2 as larger.
61596: ** If the UPACKED_PREFIX_MATCH flag is set, then keys with common prefixes
61597: ** are considered to be equal. Otherwise, the longer key is the
61598: ** larger. As it happens, the pPKey2 will always be the longer
61599: ** if there is a difference.
61600: */
61601: assert( rc==0 );
61602: if( pPKey2->flags & UNPACKED_INCRKEY ){
61603: rc = -1;
61604: }else if( pPKey2->flags & UNPACKED_PREFIX_MATCH ){
61605: /* Leave rc==0 */
61606: }else if( idx1<szHdr1 ){
61607: rc = 1;
61608: }
61609: return rc;
61610: }
61611:
61612:
61613: /*
61614: ** pCur points at an index entry created using the OP_MakeRecord opcode.
61615: ** Read the rowid (the last field in the record) and store it in *rowid.
61616: ** Return SQLITE_OK if everything works, or an error code otherwise.
61617: **
61618: ** pCur might be pointing to text obtained from a corrupt database file.
61619: ** So the content cannot be trusted. Do appropriate checks on the content.
61620: */
61621: SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){
61622: i64 nCellKey = 0;
61623: int rc;
61624: u32 szHdr; /* Size of the header */
61625: u32 typeRowid; /* Serial type of the rowid */
61626: u32 lenRowid; /* Size of the rowid */
61627: Mem m, v;
61628:
61629: UNUSED_PARAMETER(db);
61630:
61631: /* Get the size of the index entry. Only indices entries of less
61632: ** than 2GiB are support - anything large must be database corruption.
61633: ** Any corruption is detected in sqlite3BtreeParseCellPtr(), though, so
61634: ** this code can safely assume that nCellKey is 32-bits
61635: */
61636: assert( sqlite3BtreeCursorIsValid(pCur) );
61637: VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
61638: assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61639: assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey );
61640:
61641: /* Read in the complete content of the index entry */
61642: memset(&m, 0, sizeof(m));
61643: rc = sqlite3VdbeMemFromBtree(pCur, 0, (int)nCellKey, 1, &m);
61644: if( rc ){
61645: return rc;
61646: }
61647:
61648: /* The index entry must begin with a header size */
61649: (void)getVarint32((u8*)m.z, szHdr);
61650: testcase( szHdr==3 );
61651: testcase( szHdr==m.n );
61652: if( unlikely(szHdr<3 || (int)szHdr>m.n) ){
61653: goto idx_rowid_corruption;
61654: }
61655:
61656: /* The last field of the index should be an integer - the ROWID.
61657: ** Verify that the last entry really is an integer. */
61658: (void)getVarint32((u8*)&m.z[szHdr-1], typeRowid);
61659: testcase( typeRowid==1 );
61660: testcase( typeRowid==2 );
61661: testcase( typeRowid==3 );
61662: testcase( typeRowid==4 );
61663: testcase( typeRowid==5 );
61664: testcase( typeRowid==6 );
61665: testcase( typeRowid==8 );
61666: testcase( typeRowid==9 );
61667: if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){
61668: goto idx_rowid_corruption;
61669: }
61670: lenRowid = sqlite3VdbeSerialTypeLen(typeRowid);
61671: testcase( (u32)m.n==szHdr+lenRowid );
61672: if( unlikely((u32)m.n<szHdr+lenRowid) ){
61673: goto idx_rowid_corruption;
61674: }
61675:
61676: /* Fetch the integer off the end of the index record */
61677: sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v);
61678: *rowid = v.u.i;
61679: sqlite3VdbeMemRelease(&m);
61680: return SQLITE_OK;
61681:
61682: /* Jump here if database corruption is detected after m has been
61683: ** allocated. Free the m object and return SQLITE_CORRUPT. */
61684: idx_rowid_corruption:
61685: testcase( m.zMalloc!=0 );
61686: sqlite3VdbeMemRelease(&m);
61687: return SQLITE_CORRUPT_BKPT;
61688: }
61689:
61690: /*
61691: ** Compare the key of the index entry that cursor pC is pointing to against
61692: ** the key string in pUnpacked. Write into *pRes a number
61693: ** that is negative, zero, or positive if pC is less than, equal to,
61694: ** or greater than pUnpacked. Return SQLITE_OK on success.
61695: **
61696: ** pUnpacked is either created without a rowid or is truncated so that it
61697: ** omits the rowid at the end. The rowid at the end of the index entry
61698: ** is ignored as well. Hence, this routine only compares the prefixes
61699: ** of the keys prior to the final rowid, not the entire key.
61700: */
61701: SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(
61702: VdbeCursor *pC, /* The cursor to compare against */
61703: UnpackedRecord *pUnpacked, /* Unpacked version of key to compare against */
61704: int *res /* Write the comparison result here */
61705: ){
61706: i64 nCellKey = 0;
61707: int rc;
61708: BtCursor *pCur = pC->pCursor;
61709: Mem m;
61710:
61711: assert( sqlite3BtreeCursorIsValid(pCur) );
61712: VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey);
61713: assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */
61714: /* nCellKey will always be between 0 and 0xffffffff because of the say
61715: ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */
61716: if( nCellKey<=0 || nCellKey>0x7fffffff ){
61717: *res = 0;
61718: return SQLITE_CORRUPT_BKPT;
61719: }
61720: memset(&m, 0, sizeof(m));
61721: rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, (int)nCellKey, 1, &m);
61722: if( rc ){
61723: return rc;
61724: }
61725: assert( pUnpacked->flags & UNPACKED_PREFIX_MATCH );
61726: *res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked);
61727: sqlite3VdbeMemRelease(&m);
61728: return SQLITE_OK;
61729: }
61730:
61731: /*
61732: ** This routine sets the value to be returned by subsequent calls to
61733: ** sqlite3_changes() on the database handle 'db'.
61734: */
61735: SQLITE_PRIVATE void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){
61736: assert( sqlite3_mutex_held(db->mutex) );
61737: db->nChange = nChange;
61738: db->nTotalChange += nChange;
61739: }
61740:
61741: /*
61742: ** Set a flag in the vdbe to update the change counter when it is finalised
61743: ** or reset.
61744: */
61745: SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe *v){
61746: v->changeCntOn = 1;
61747: }
61748:
61749: /*
61750: ** Mark every prepared statement associated with a database connection
61751: ** as expired.
61752: **
61753: ** An expired statement means that recompilation of the statement is
61754: ** recommend. Statements expire when things happen that make their
61755: ** programs obsolete. Removing user-defined functions or collating
61756: ** sequences, or changing an authorization function are the types of
61757: ** things that make prepared statements obsolete.
61758: */
61759: SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3 *db){
61760: Vdbe *p;
61761: for(p = db->pVdbe; p; p=p->pNext){
61762: p->expired = 1;
61763: }
61764: }
61765:
61766: /*
61767: ** Return the database associated with the Vdbe.
61768: */
61769: SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){
61770: return v->db;
61771: }
61772:
61773: /*
61774: ** Return a pointer to an sqlite3_value structure containing the value bound
61775: ** parameter iVar of VM v. Except, if the value is an SQL NULL, return
61776: ** 0 instead. Unless it is NULL, apply affinity aff (one of the SQLITE_AFF_*
61777: ** constants) to the value before returning it.
61778: **
61779: ** The returned value must be freed by the caller using sqlite3ValueFree().
61780: */
61781: SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe *v, int iVar, u8 aff){
61782: assert( iVar>0 );
61783: if( v ){
61784: Mem *pMem = &v->aVar[iVar-1];
61785: if( 0==(pMem->flags & MEM_Null) ){
61786: sqlite3_value *pRet = sqlite3ValueNew(v->db);
61787: if( pRet ){
61788: sqlite3VdbeMemCopy((Mem *)pRet, pMem);
61789: sqlite3ValueApplyAffinity(pRet, aff, SQLITE_UTF8);
61790: sqlite3VdbeMemStoreType((Mem *)pRet);
61791: }
61792: return pRet;
61793: }
61794: }
61795: return 0;
61796: }
61797:
61798: /*
61799: ** Configure SQL variable iVar so that binding a new value to it signals
61800: ** to sqlite3_reoptimize() that re-preparing the statement may result
61801: ** in a better query plan.
61802: */
61803: SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){
61804: assert( iVar>0 );
61805: if( iVar>32 ){
61806: v->expmask = 0xffffffff;
61807: }else{
61808: v->expmask |= ((u32)1 << (iVar-1));
61809: }
61810: }
61811:
61812: /************** End of vdbeaux.c *********************************************/
61813: /************** Begin file vdbeapi.c *****************************************/
61814: /*
61815: ** 2004 May 26
61816: **
61817: ** The author disclaims copyright to this source code. In place of
61818: ** a legal notice, here is a blessing:
61819: **
61820: ** May you do good and not evil.
61821: ** May you find forgiveness for yourself and forgive others.
61822: ** May you share freely, never taking more than you give.
61823: **
61824: *************************************************************************
61825: **
61826: ** This file contains code use to implement APIs that are part of the
61827: ** VDBE.
61828: */
61829:
61830: #ifndef SQLITE_OMIT_DEPRECATED
61831: /*
61832: ** Return TRUE (non-zero) of the statement supplied as an argument needs
61833: ** to be recompiled. A statement needs to be recompiled whenever the
61834: ** execution environment changes in a way that would alter the program
61835: ** that sqlite3_prepare() generates. For example, if new functions or
61836: ** collating sequences are registered or if an authorizer function is
61837: ** added or changed.
61838: */
61839: SQLITE_API int sqlite3_expired(sqlite3_stmt *pStmt){
61840: Vdbe *p = (Vdbe*)pStmt;
61841: return p==0 || p->expired;
61842: }
61843: #endif
61844:
61845: /*
61846: ** Check on a Vdbe to make sure it has not been finalized. Log
61847: ** an error and return true if it has been finalized (or is otherwise
61848: ** invalid). Return false if it is ok.
61849: */
61850: static int vdbeSafety(Vdbe *p){
61851: if( p->db==0 ){
61852: sqlite3_log(SQLITE_MISUSE, "API called with finalized prepared statement");
61853: return 1;
61854: }else{
61855: return 0;
61856: }
61857: }
61858: static int vdbeSafetyNotNull(Vdbe *p){
61859: if( p==0 ){
61860: sqlite3_log(SQLITE_MISUSE, "API called with NULL prepared statement");
61861: return 1;
61862: }else{
61863: return vdbeSafety(p);
61864: }
61865: }
61866:
61867: /*
61868: ** The following routine destroys a virtual machine that is created by
61869: ** the sqlite3_compile() routine. The integer returned is an SQLITE_
61870: ** success/failure code that describes the result of executing the virtual
61871: ** machine.
61872: **
61873: ** This routine sets the error code and string returned by
61874: ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
61875: */
61876: SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){
61877: int rc;
61878: if( pStmt==0 ){
61879: /* IMPLEMENTATION-OF: R-57228-12904 Invoking sqlite3_finalize() on a NULL
61880: ** pointer is a harmless no-op. */
61881: rc = SQLITE_OK;
61882: }else{
61883: Vdbe *v = (Vdbe*)pStmt;
61884: sqlite3 *db = v->db;
61885: if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
1.2.2.1 ! misho 61886: sqlite3_mutex_enter(db->mutex);
1.2 misho 61887: rc = sqlite3VdbeFinalize(v);
61888: rc = sqlite3ApiExit(db, rc);
1.2.2.1 ! misho 61889: sqlite3LeaveMutexAndCloseZombie(db);
1.2 misho 61890: }
61891: return rc;
61892: }
61893:
61894: /*
61895: ** Terminate the current execution of an SQL statement and reset it
61896: ** back to its starting state so that it can be reused. A success code from
61897: ** the prior execution is returned.
61898: **
61899: ** This routine sets the error code and string returned by
61900: ** sqlite3_errcode(), sqlite3_errmsg() and sqlite3_errmsg16().
61901: */
61902: SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){
61903: int rc;
61904: if( pStmt==0 ){
61905: rc = SQLITE_OK;
61906: }else{
61907: Vdbe *v = (Vdbe*)pStmt;
61908: sqlite3_mutex_enter(v->db->mutex);
61909: rc = sqlite3VdbeReset(v);
61910: sqlite3VdbeRewind(v);
61911: assert( (rc & (v->db->errMask))==rc );
61912: rc = sqlite3ApiExit(v->db, rc);
61913: sqlite3_mutex_leave(v->db->mutex);
61914: }
61915: return rc;
61916: }
61917:
61918: /*
61919: ** Set all the parameters in the compiled SQL statement to NULL.
61920: */
61921: SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){
61922: int i;
61923: int rc = SQLITE_OK;
61924: Vdbe *p = (Vdbe*)pStmt;
61925: #if SQLITE_THREADSAFE
61926: sqlite3_mutex *mutex = ((Vdbe*)pStmt)->db->mutex;
61927: #endif
61928: sqlite3_mutex_enter(mutex);
61929: for(i=0; i<p->nVar; i++){
61930: sqlite3VdbeMemRelease(&p->aVar[i]);
61931: p->aVar[i].flags = MEM_Null;
61932: }
61933: if( p->isPrepareV2 && p->expmask ){
61934: p->expired = 1;
61935: }
61936: sqlite3_mutex_leave(mutex);
61937: return rc;
61938: }
61939:
61940:
61941: /**************************** sqlite3_value_ *******************************
61942: ** The following routines extract information from a Mem or sqlite3_value
61943: ** structure.
61944: */
61945: SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){
61946: Mem *p = (Mem*)pVal;
61947: if( p->flags & (MEM_Blob|MEM_Str) ){
61948: sqlite3VdbeMemExpandBlob(p);
61949: p->flags &= ~MEM_Str;
61950: p->flags |= MEM_Blob;
61951: return p->n ? p->z : 0;
61952: }else{
61953: return sqlite3_value_text(pVal);
61954: }
61955: }
61956: SQLITE_API int sqlite3_value_bytes(sqlite3_value *pVal){
61957: return sqlite3ValueBytes(pVal, SQLITE_UTF8);
61958: }
61959: SQLITE_API int sqlite3_value_bytes16(sqlite3_value *pVal){
61960: return sqlite3ValueBytes(pVal, SQLITE_UTF16NATIVE);
61961: }
61962: SQLITE_API double sqlite3_value_double(sqlite3_value *pVal){
61963: return sqlite3VdbeRealValue((Mem*)pVal);
61964: }
61965: SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){
61966: return (int)sqlite3VdbeIntValue((Mem*)pVal);
61967: }
61968: SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){
61969: return sqlite3VdbeIntValue((Mem*)pVal);
61970: }
61971: SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){
61972: return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8);
61973: }
61974: #ifndef SQLITE_OMIT_UTF16
61975: SQLITE_API const void *sqlite3_value_text16(sqlite3_value* pVal){
61976: return sqlite3ValueText(pVal, SQLITE_UTF16NATIVE);
61977: }
61978: SQLITE_API const void *sqlite3_value_text16be(sqlite3_value *pVal){
61979: return sqlite3ValueText(pVal, SQLITE_UTF16BE);
61980: }
61981: SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){
61982: return sqlite3ValueText(pVal, SQLITE_UTF16LE);
61983: }
61984: #endif /* SQLITE_OMIT_UTF16 */
61985: SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){
61986: return pVal->type;
61987: }
61988:
61989: /**************************** sqlite3_result_ *******************************
61990: ** The following routines are used by user-defined functions to specify
61991: ** the function result.
61992: **
61993: ** The setStrOrError() funtion calls sqlite3VdbeMemSetStr() to store the
61994: ** result as a string or blob but if the string or blob is too large, it
61995: ** then sets the error code to SQLITE_TOOBIG
61996: */
61997: static void setResultStrOrError(
61998: sqlite3_context *pCtx, /* Function context */
61999: const char *z, /* String pointer */
62000: int n, /* Bytes in string, or negative */
62001: u8 enc, /* Encoding of z. 0 for BLOBs */
62002: void (*xDel)(void*) /* Destructor function */
62003: ){
62004: if( sqlite3VdbeMemSetStr(&pCtx->s, z, n, enc, xDel)==SQLITE_TOOBIG ){
62005: sqlite3_result_error_toobig(pCtx);
62006: }
62007: }
62008: SQLITE_API void sqlite3_result_blob(
62009: sqlite3_context *pCtx,
62010: const void *z,
62011: int n,
62012: void (*xDel)(void *)
62013: ){
62014: assert( n>=0 );
62015: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62016: setResultStrOrError(pCtx, z, n, 0, xDel);
62017: }
62018: SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
62019: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62020: sqlite3VdbeMemSetDouble(&pCtx->s, rVal);
62021: }
62022: SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
62023: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62024: pCtx->isError = SQLITE_ERROR;
62025: sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
62026: }
62027: #ifndef SQLITE_OMIT_UTF16
62028: SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
62029: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62030: pCtx->isError = SQLITE_ERROR;
62031: sqlite3VdbeMemSetStr(&pCtx->s, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
62032: }
62033: #endif
62034: SQLITE_API void sqlite3_result_int(sqlite3_context *pCtx, int iVal){
62035: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62036: sqlite3VdbeMemSetInt64(&pCtx->s, (i64)iVal);
62037: }
62038: SQLITE_API void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){
62039: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62040: sqlite3VdbeMemSetInt64(&pCtx->s, iVal);
62041: }
62042: SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){
62043: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62044: sqlite3VdbeMemSetNull(&pCtx->s);
62045: }
62046: SQLITE_API void sqlite3_result_text(
62047: sqlite3_context *pCtx,
62048: const char *z,
62049: int n,
62050: void (*xDel)(void *)
62051: ){
62052: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62053: setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel);
62054: }
62055: #ifndef SQLITE_OMIT_UTF16
62056: SQLITE_API void sqlite3_result_text16(
62057: sqlite3_context *pCtx,
62058: const void *z,
62059: int n,
62060: void (*xDel)(void *)
62061: ){
62062: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62063: setResultStrOrError(pCtx, z, n, SQLITE_UTF16NATIVE, xDel);
62064: }
62065: SQLITE_API void sqlite3_result_text16be(
62066: sqlite3_context *pCtx,
62067: const void *z,
62068: int n,
62069: void (*xDel)(void *)
62070: ){
62071: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62072: setResultStrOrError(pCtx, z, n, SQLITE_UTF16BE, xDel);
62073: }
62074: SQLITE_API void sqlite3_result_text16le(
62075: sqlite3_context *pCtx,
62076: const void *z,
62077: int n,
62078: void (*xDel)(void *)
62079: ){
62080: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62081: setResultStrOrError(pCtx, z, n, SQLITE_UTF16LE, xDel);
62082: }
62083: #endif /* SQLITE_OMIT_UTF16 */
62084: SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
62085: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62086: sqlite3VdbeMemCopy(&pCtx->s, pValue);
62087: }
62088: SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
62089: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62090: sqlite3VdbeMemSetZeroBlob(&pCtx->s, n);
62091: }
62092: SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
62093: pCtx->isError = errCode;
62094: if( pCtx->s.flags & MEM_Null ){
62095: sqlite3VdbeMemSetStr(&pCtx->s, sqlite3ErrStr(errCode), -1,
62096: SQLITE_UTF8, SQLITE_STATIC);
62097: }
62098: }
62099:
62100: /* Force an SQLITE_TOOBIG error. */
62101: SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){
62102: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62103: pCtx->isError = SQLITE_TOOBIG;
62104: sqlite3VdbeMemSetStr(&pCtx->s, "string or blob too big", -1,
62105: SQLITE_UTF8, SQLITE_STATIC);
62106: }
62107:
62108: /* An SQLITE_NOMEM error. */
62109: SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){
62110: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62111: sqlite3VdbeMemSetNull(&pCtx->s);
62112: pCtx->isError = SQLITE_NOMEM;
62113: pCtx->s.db->mallocFailed = 1;
62114: }
62115:
62116: /*
62117: ** This function is called after a transaction has been committed. It
62118: ** invokes callbacks registered with sqlite3_wal_hook() as required.
62119: */
62120: static int doWalCallbacks(sqlite3 *db){
62121: int rc = SQLITE_OK;
62122: #ifndef SQLITE_OMIT_WAL
62123: int i;
62124: for(i=0; i<db->nDb; i++){
62125: Btree *pBt = db->aDb[i].pBt;
62126: if( pBt ){
62127: int nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt));
62128: if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){
62129: rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry);
62130: }
62131: }
62132: }
62133: #endif
62134: return rc;
62135: }
62136:
62137: /*
62138: ** Execute the statement pStmt, either until a row of data is ready, the
62139: ** statement is completely executed or an error occurs.
62140: **
62141: ** This routine implements the bulk of the logic behind the sqlite_step()
62142: ** API. The only thing omitted is the automatic recompile if a
62143: ** schema change has occurred. That detail is handled by the
62144: ** outer sqlite3_step() wrapper procedure.
62145: */
62146: static int sqlite3Step(Vdbe *p){
62147: sqlite3 *db;
62148: int rc;
62149:
62150: assert(p);
62151: if( p->magic!=VDBE_MAGIC_RUN ){
62152: /* We used to require that sqlite3_reset() be called before retrying
62153: ** sqlite3_step() after any error or after SQLITE_DONE. But beginning
62154: ** with version 3.7.0, we changed this so that sqlite3_reset() would
62155: ** be called automatically instead of throwing the SQLITE_MISUSE error.
62156: ** This "automatic-reset" change is not technically an incompatibility,
62157: ** since any application that receives an SQLITE_MISUSE is broken by
62158: ** definition.
62159: **
62160: ** Nevertheless, some published applications that were originally written
62161: ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE
62162: ** returns, and those were broken by the automatic-reset change. As a
62163: ** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the
62164: ** legacy behavior of returning SQLITE_MISUSE for cases where the
62165: ** previous sqlite3_step() returned something other than a SQLITE_LOCKED
62166: ** or SQLITE_BUSY error.
62167: */
62168: #ifdef SQLITE_OMIT_AUTORESET
62169: if( p->rc==SQLITE_BUSY || p->rc==SQLITE_LOCKED ){
62170: sqlite3_reset((sqlite3_stmt*)p);
62171: }else{
62172: return SQLITE_MISUSE_BKPT;
62173: }
62174: #else
62175: sqlite3_reset((sqlite3_stmt*)p);
62176: #endif
62177: }
62178:
62179: /* Check that malloc() has not failed. If it has, return early. */
62180: db = p->db;
62181: if( db->mallocFailed ){
62182: p->rc = SQLITE_NOMEM;
62183: return SQLITE_NOMEM;
62184: }
62185:
62186: if( p->pc<=0 && p->expired ){
62187: p->rc = SQLITE_SCHEMA;
62188: rc = SQLITE_ERROR;
62189: goto end_of_step;
62190: }
62191: if( p->pc<0 ){
62192: /* If there are no other statements currently running, then
62193: ** reset the interrupt flag. This prevents a call to sqlite3_interrupt
62194: ** from interrupting a statement that has not yet started.
62195: */
62196: if( db->activeVdbeCnt==0 ){
62197: db->u1.isInterrupted = 0;
62198: }
62199:
62200: assert( db->writeVdbeCnt>0 || db->autoCommit==0 || db->nDeferredCons==0 );
62201:
62202: #ifndef SQLITE_OMIT_TRACE
62203: if( db->xProfile && !db->init.busy ){
62204: sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime);
62205: }
62206: #endif
62207:
62208: db->activeVdbeCnt++;
62209: if( p->readOnly==0 ) db->writeVdbeCnt++;
62210: p->pc = 0;
62211: }
62212: #ifndef SQLITE_OMIT_EXPLAIN
62213: if( p->explain ){
62214: rc = sqlite3VdbeList(p);
62215: }else
62216: #endif /* SQLITE_OMIT_EXPLAIN */
62217: {
62218: db->vdbeExecCnt++;
62219: rc = sqlite3VdbeExec(p);
62220: db->vdbeExecCnt--;
62221: }
62222:
62223: #ifndef SQLITE_OMIT_TRACE
62224: /* Invoke the profile callback if there is one
62225: */
62226: if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){
62227: sqlite3_int64 iNow;
62228: sqlite3OsCurrentTimeInt64(db->pVfs, &iNow);
62229: db->xProfile(db->pProfileArg, p->zSql, (iNow - p->startTime)*1000000);
62230: }
62231: #endif
62232:
62233: if( rc==SQLITE_DONE ){
62234: assert( p->rc==SQLITE_OK );
62235: p->rc = doWalCallbacks(db);
62236: if( p->rc!=SQLITE_OK ){
62237: rc = SQLITE_ERROR;
62238: }
62239: }
62240:
62241: db->errCode = rc;
62242: if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){
62243: p->rc = SQLITE_NOMEM;
62244: }
62245: end_of_step:
62246: /* At this point local variable rc holds the value that should be
62247: ** returned if this statement was compiled using the legacy
62248: ** sqlite3_prepare() interface. According to the docs, this can only
62249: ** be one of the values in the first assert() below. Variable p->rc
62250: ** contains the value that would be returned if sqlite3_finalize()
62251: ** were called on statement p.
62252: */
62253: assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR
62254: || rc==SQLITE_BUSY || rc==SQLITE_MISUSE
62255: );
62256: assert( p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE );
62257: if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){
62258: /* If this statement was prepared using sqlite3_prepare_v2(), and an
62259: ** error has occured, then return the error code in p->rc to the
62260: ** caller. Set the error code in the database handle to the same value.
62261: */
62262: rc = sqlite3VdbeTransferError(p);
62263: }
62264: return (rc&db->errMask);
62265: }
62266:
62267: /*
62268: ** The maximum number of times that a statement will try to reparse
62269: ** itself before giving up and returning SQLITE_SCHEMA.
62270: */
62271: #ifndef SQLITE_MAX_SCHEMA_RETRY
62272: # define SQLITE_MAX_SCHEMA_RETRY 5
62273: #endif
62274:
62275: /*
62276: ** This is the top-level implementation of sqlite3_step(). Call
62277: ** sqlite3Step() to do most of the work. If a schema error occurs,
62278: ** call sqlite3Reprepare() and try again.
62279: */
62280: SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
62281: int rc = SQLITE_OK; /* Result from sqlite3Step() */
62282: int rc2 = SQLITE_OK; /* Result from sqlite3Reprepare() */
62283: Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */
62284: int cnt = 0; /* Counter to prevent infinite loop of reprepares */
62285: sqlite3 *db; /* The database connection */
62286:
62287: if( vdbeSafetyNotNull(v) ){
62288: return SQLITE_MISUSE_BKPT;
62289: }
62290: db = v->db;
62291: sqlite3_mutex_enter(db->mutex);
1.2.2.1 ! misho 62292: v->doingRerun = 0;
1.2 misho 62293: while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
62294: && cnt++ < SQLITE_MAX_SCHEMA_RETRY
62295: && (rc2 = rc = sqlite3Reprepare(v))==SQLITE_OK ){
62296: sqlite3_reset(pStmt);
1.2.2.1 ! misho 62297: v->doingRerun = 1;
1.2 misho 62298: assert( v->expired==0 );
62299: }
62300: if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
62301: /* This case occurs after failing to recompile an sql statement.
62302: ** The error message from the SQL compiler has already been loaded
62303: ** into the database handle. This block copies the error message
62304: ** from the database handle into the statement and sets the statement
62305: ** program counter to 0 to ensure that when the statement is
62306: ** finalized or reset the parser error message is available via
62307: ** sqlite3_errmsg() and sqlite3_errcode().
62308: */
62309: const char *zErr = (const char *)sqlite3_value_text(db->pErr);
62310: sqlite3DbFree(db, v->zErrMsg);
62311: if( !db->mallocFailed ){
62312: v->zErrMsg = sqlite3DbStrDup(db, zErr);
62313: v->rc = rc2;
62314: } else {
62315: v->zErrMsg = 0;
62316: v->rc = rc = SQLITE_NOMEM;
62317: }
62318: }
62319: rc = sqlite3ApiExit(db, rc);
62320: sqlite3_mutex_leave(db->mutex);
62321: return rc;
62322: }
62323:
62324: /*
62325: ** Extract the user data from a sqlite3_context structure and return a
62326: ** pointer to it.
62327: */
62328: SQLITE_API void *sqlite3_user_data(sqlite3_context *p){
62329: assert( p && p->pFunc );
62330: return p->pFunc->pUserData;
62331: }
62332:
62333: /*
62334: ** Extract the user data from a sqlite3_context structure and return a
62335: ** pointer to it.
62336: **
62337: ** IMPLEMENTATION-OF: R-46798-50301 The sqlite3_context_db_handle() interface
62338: ** returns a copy of the pointer to the database connection (the 1st
62339: ** parameter) of the sqlite3_create_function() and
62340: ** sqlite3_create_function16() routines that originally registered the
62341: ** application defined function.
62342: */
62343: SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
62344: assert( p && p->pFunc );
62345: return p->s.db;
62346: }
62347:
62348: /*
62349: ** The following is the implementation of an SQL function that always
62350: ** fails with an error message stating that the function is used in the
62351: ** wrong context. The sqlite3_overload_function() API might construct
62352: ** SQL function that use this routine so that the functions will exist
62353: ** for name resolution but are actually overloaded by the xFindFunction
62354: ** method of virtual tables.
62355: */
62356: SQLITE_PRIVATE void sqlite3InvalidFunction(
62357: sqlite3_context *context, /* The function calling context */
62358: int NotUsed, /* Number of arguments to the function */
62359: sqlite3_value **NotUsed2 /* Value of each argument */
62360: ){
62361: const char *zName = context->pFunc->zName;
62362: char *zErr;
62363: UNUSED_PARAMETER2(NotUsed, NotUsed2);
62364: zErr = sqlite3_mprintf(
62365: "unable to use function %s in the requested context", zName);
62366: sqlite3_result_error(context, zErr, -1);
62367: sqlite3_free(zErr);
62368: }
62369:
62370: /*
62371: ** Allocate or return the aggregate context for a user function. A new
62372: ** context is allocated on the first call. Subsequent calls return the
62373: ** same context that was returned on prior calls.
62374: */
62375: SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){
62376: Mem *pMem;
62377: assert( p && p->pFunc && p->pFunc->xStep );
62378: assert( sqlite3_mutex_held(p->s.db->mutex) );
62379: pMem = p->pMem;
62380: testcase( nByte<0 );
62381: if( (pMem->flags & MEM_Agg)==0 ){
62382: if( nByte<=0 ){
62383: sqlite3VdbeMemReleaseExternal(pMem);
62384: pMem->flags = MEM_Null;
62385: pMem->z = 0;
62386: }else{
62387: sqlite3VdbeMemGrow(pMem, nByte, 0);
62388: pMem->flags = MEM_Agg;
62389: pMem->u.pDef = p->pFunc;
62390: if( pMem->z ){
62391: memset(pMem->z, 0, nByte);
62392: }
62393: }
62394: }
62395: return (void*)pMem->z;
62396: }
62397:
62398: /*
62399: ** Return the auxilary data pointer, if any, for the iArg'th argument to
62400: ** the user-function defined by pCtx.
62401: */
62402: SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
62403: VdbeFunc *pVdbeFunc;
62404:
62405: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62406: pVdbeFunc = pCtx->pVdbeFunc;
62407: if( !pVdbeFunc || iArg>=pVdbeFunc->nAux || iArg<0 ){
62408: return 0;
62409: }
62410: return pVdbeFunc->apAux[iArg].pAux;
62411: }
62412:
62413: /*
62414: ** Set the auxilary data pointer and delete function, for the iArg'th
62415: ** argument to the user-function defined by pCtx. Any previous value is
62416: ** deleted by calling the delete function specified when it was set.
62417: */
62418: SQLITE_API void sqlite3_set_auxdata(
62419: sqlite3_context *pCtx,
62420: int iArg,
62421: void *pAux,
62422: void (*xDelete)(void*)
62423: ){
62424: struct AuxData *pAuxData;
62425: VdbeFunc *pVdbeFunc;
62426: if( iArg<0 ) goto failed;
62427:
62428: assert( sqlite3_mutex_held(pCtx->s.db->mutex) );
62429: pVdbeFunc = pCtx->pVdbeFunc;
62430: if( !pVdbeFunc || pVdbeFunc->nAux<=iArg ){
62431: int nAux = (pVdbeFunc ? pVdbeFunc->nAux : 0);
62432: int nMalloc = sizeof(VdbeFunc) + sizeof(struct AuxData)*iArg;
62433: pVdbeFunc = sqlite3DbRealloc(pCtx->s.db, pVdbeFunc, nMalloc);
62434: if( !pVdbeFunc ){
62435: goto failed;
62436: }
62437: pCtx->pVdbeFunc = pVdbeFunc;
62438: memset(&pVdbeFunc->apAux[nAux], 0, sizeof(struct AuxData)*(iArg+1-nAux));
62439: pVdbeFunc->nAux = iArg+1;
62440: pVdbeFunc->pFunc = pCtx->pFunc;
62441: }
62442:
62443: pAuxData = &pVdbeFunc->apAux[iArg];
62444: if( pAuxData->pAux && pAuxData->xDelete ){
62445: pAuxData->xDelete(pAuxData->pAux);
62446: }
62447: pAuxData->pAux = pAux;
62448: pAuxData->xDelete = xDelete;
62449: return;
62450:
62451: failed:
62452: if( xDelete ){
62453: xDelete(pAux);
62454: }
62455: }
62456:
62457: #ifndef SQLITE_OMIT_DEPRECATED
62458: /*
62459: ** Return the number of times the Step function of a aggregate has been
62460: ** called.
62461: **
62462: ** This function is deprecated. Do not use it for new code. It is
62463: ** provide only to avoid breaking legacy code. New aggregate function
62464: ** implementations should keep their own counts within their aggregate
62465: ** context.
62466: */
62467: SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){
62468: assert( p && p->pMem && p->pFunc && p->pFunc->xStep );
62469: return p->pMem->n;
62470: }
62471: #endif
62472:
62473: /*
62474: ** Return the number of columns in the result set for the statement pStmt.
62475: */
62476: SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt){
62477: Vdbe *pVm = (Vdbe *)pStmt;
62478: return pVm ? pVm->nResColumn : 0;
62479: }
62480:
62481: /*
62482: ** Return the number of values available from the current row of the
62483: ** currently executing statement pStmt.
62484: */
62485: SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt){
62486: Vdbe *pVm = (Vdbe *)pStmt;
62487: if( pVm==0 || pVm->pResultSet==0 ) return 0;
62488: return pVm->nResColumn;
62489: }
62490:
62491:
62492: /*
62493: ** Check to see if column iCol of the given statement is valid. If
62494: ** it is, return a pointer to the Mem for the value of that column.
62495: ** If iCol is not valid, return a pointer to a Mem which has a value
62496: ** of NULL.
62497: */
62498: static Mem *columnMem(sqlite3_stmt *pStmt, int i){
62499: Vdbe *pVm;
62500: Mem *pOut;
62501:
62502: pVm = (Vdbe *)pStmt;
62503: if( pVm && pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){
62504: sqlite3_mutex_enter(pVm->db->mutex);
62505: pOut = &pVm->pResultSet[i];
62506: }else{
62507: /* If the value passed as the second argument is out of range, return
62508: ** a pointer to the following static Mem object which contains the
62509: ** value SQL NULL. Even though the Mem structure contains an element
62510: ** of type i64, on certain architectures (x86) with certain compiler
62511: ** switches (-Os), gcc may align this Mem object on a 4-byte boundary
62512: ** instead of an 8-byte one. This all works fine, except that when
62513: ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s
62514: ** that a Mem structure is located on an 8-byte boundary. To prevent
62515: ** these assert()s from failing, when building with SQLITE_DEBUG defined
62516: ** using gcc, we force nullMem to be 8-byte aligned using the magical
62517: ** __attribute__((aligned(8))) macro. */
62518: static const Mem nullMem
62519: #if defined(SQLITE_DEBUG) && defined(__GNUC__)
62520: __attribute__((aligned(8)))
62521: #endif
62522: = {0, "", (double)0, {0}, 0, MEM_Null, SQLITE_NULL, 0,
62523: #ifdef SQLITE_DEBUG
62524: 0, 0, /* pScopyFrom, pFiller */
62525: #endif
62526: 0, 0 };
62527:
62528: if( pVm && ALWAYS(pVm->db) ){
62529: sqlite3_mutex_enter(pVm->db->mutex);
62530: sqlite3Error(pVm->db, SQLITE_RANGE, 0);
62531: }
62532: pOut = (Mem*)&nullMem;
62533: }
62534: return pOut;
62535: }
62536:
62537: /*
62538: ** This function is called after invoking an sqlite3_value_XXX function on a
62539: ** column value (i.e. a value returned by evaluating an SQL expression in the
62540: ** select list of a SELECT statement) that may cause a malloc() failure. If
62541: ** malloc() has failed, the threads mallocFailed flag is cleared and the result
62542: ** code of statement pStmt set to SQLITE_NOMEM.
62543: **
62544: ** Specifically, this is called from within:
62545: **
62546: ** sqlite3_column_int()
62547: ** sqlite3_column_int64()
62548: ** sqlite3_column_text()
62549: ** sqlite3_column_text16()
62550: ** sqlite3_column_real()
62551: ** sqlite3_column_bytes()
62552: ** sqlite3_column_bytes16()
62553: ** sqiite3_column_blob()
62554: */
62555: static void columnMallocFailure(sqlite3_stmt *pStmt)
62556: {
62557: /* If malloc() failed during an encoding conversion within an
62558: ** sqlite3_column_XXX API, then set the return code of the statement to
62559: ** SQLITE_NOMEM. The next call to _step() (if any) will return SQLITE_ERROR
62560: ** and _finalize() will return NOMEM.
62561: */
62562: Vdbe *p = (Vdbe *)pStmt;
62563: if( p ){
62564: p->rc = sqlite3ApiExit(p->db, p->rc);
62565: sqlite3_mutex_leave(p->db->mutex);
62566: }
62567: }
62568:
62569: /**************************** sqlite3_column_ *******************************
62570: ** The following routines are used to access elements of the current row
62571: ** in the result set.
62572: */
62573: SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){
62574: const void *val;
62575: val = sqlite3_value_blob( columnMem(pStmt,i) );
62576: /* Even though there is no encoding conversion, value_blob() might
62577: ** need to call malloc() to expand the result of a zeroblob()
62578: ** expression.
62579: */
62580: columnMallocFailure(pStmt);
62581: return val;
62582: }
62583: SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){
62584: int val = sqlite3_value_bytes( columnMem(pStmt,i) );
62585: columnMallocFailure(pStmt);
62586: return val;
62587: }
62588: SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt *pStmt, int i){
62589: int val = sqlite3_value_bytes16( columnMem(pStmt,i) );
62590: columnMallocFailure(pStmt);
62591: return val;
62592: }
62593: SQLITE_API double sqlite3_column_double(sqlite3_stmt *pStmt, int i){
62594: double val = sqlite3_value_double( columnMem(pStmt,i) );
62595: columnMallocFailure(pStmt);
62596: return val;
62597: }
62598: SQLITE_API int sqlite3_column_int(sqlite3_stmt *pStmt, int i){
62599: int val = sqlite3_value_int( columnMem(pStmt,i) );
62600: columnMallocFailure(pStmt);
62601: return val;
62602: }
62603: SQLITE_API sqlite_int64 sqlite3_column_int64(sqlite3_stmt *pStmt, int i){
62604: sqlite_int64 val = sqlite3_value_int64( columnMem(pStmt,i) );
62605: columnMallocFailure(pStmt);
62606: return val;
62607: }
62608: SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt *pStmt, int i){
62609: const unsigned char *val = sqlite3_value_text( columnMem(pStmt,i) );
62610: columnMallocFailure(pStmt);
62611: return val;
62612: }
62613: SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt *pStmt, int i){
62614: Mem *pOut = columnMem(pStmt, i);
62615: if( pOut->flags&MEM_Static ){
62616: pOut->flags &= ~MEM_Static;
62617: pOut->flags |= MEM_Ephem;
62618: }
62619: columnMallocFailure(pStmt);
62620: return (sqlite3_value *)pOut;
62621: }
62622: #ifndef SQLITE_OMIT_UTF16
62623: SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt *pStmt, int i){
62624: const void *val = sqlite3_value_text16( columnMem(pStmt,i) );
62625: columnMallocFailure(pStmt);
62626: return val;
62627: }
62628: #endif /* SQLITE_OMIT_UTF16 */
62629: SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){
62630: int iType = sqlite3_value_type( columnMem(pStmt,i) );
62631: columnMallocFailure(pStmt);
62632: return iType;
62633: }
62634:
62635: /* The following function is experimental and subject to change or
62636: ** removal */
62637: /*int sqlite3_column_numeric_type(sqlite3_stmt *pStmt, int i){
62638: ** return sqlite3_value_numeric_type( columnMem(pStmt,i) );
62639: **}
62640: */
62641:
62642: /*
62643: ** Convert the N-th element of pStmt->pColName[] into a string using
62644: ** xFunc() then return that string. If N is out of range, return 0.
62645: **
62646: ** There are up to 5 names for each column. useType determines which
62647: ** name is returned. Here are the names:
62648: **
62649: ** 0 The column name as it should be displayed for output
62650: ** 1 The datatype name for the column
62651: ** 2 The name of the database that the column derives from
62652: ** 3 The name of the table that the column derives from
62653: ** 4 The name of the table column that the result column derives from
62654: **
62655: ** If the result is not a simple column reference (if it is an expression
62656: ** or a constant) then useTypes 2, 3, and 4 return NULL.
62657: */
62658: static const void *columnName(
62659: sqlite3_stmt *pStmt,
62660: int N,
62661: const void *(*xFunc)(Mem*),
62662: int useType
62663: ){
62664: const void *ret = 0;
62665: Vdbe *p = (Vdbe *)pStmt;
62666: int n;
62667: sqlite3 *db = p->db;
62668:
62669: assert( db!=0 );
62670: n = sqlite3_column_count(pStmt);
62671: if( N<n && N>=0 ){
62672: N += useType*n;
62673: sqlite3_mutex_enter(db->mutex);
62674: assert( db->mallocFailed==0 );
62675: ret = xFunc(&p->aColName[N]);
62676: /* A malloc may have failed inside of the xFunc() call. If this
62677: ** is the case, clear the mallocFailed flag and return NULL.
62678: */
62679: if( db->mallocFailed ){
62680: db->mallocFailed = 0;
62681: ret = 0;
62682: }
62683: sqlite3_mutex_leave(db->mutex);
62684: }
62685: return ret;
62686: }
62687:
62688: /*
62689: ** Return the name of the Nth column of the result set returned by SQL
62690: ** statement pStmt.
62691: */
62692: SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N){
62693: return columnName(
62694: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_NAME);
62695: }
62696: #ifndef SQLITE_OMIT_UTF16
62697: SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt *pStmt, int N){
62698: return columnName(
62699: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_NAME);
62700: }
62701: #endif
62702:
62703: /*
62704: ** Constraint: If you have ENABLE_COLUMN_METADATA then you must
62705: ** not define OMIT_DECLTYPE.
62706: */
62707: #if defined(SQLITE_OMIT_DECLTYPE) && defined(SQLITE_ENABLE_COLUMN_METADATA)
62708: # error "Must not define both SQLITE_OMIT_DECLTYPE \
62709: and SQLITE_ENABLE_COLUMN_METADATA"
62710: #endif
62711:
62712: #ifndef SQLITE_OMIT_DECLTYPE
62713: /*
62714: ** Return the column declaration type (if applicable) of the 'i'th column
62715: ** of the result set of SQL statement pStmt.
62716: */
62717: SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt *pStmt, int N){
62718: return columnName(
62719: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DECLTYPE);
62720: }
62721: #ifndef SQLITE_OMIT_UTF16
62722: SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt *pStmt, int N){
62723: return columnName(
62724: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DECLTYPE);
62725: }
62726: #endif /* SQLITE_OMIT_UTF16 */
62727: #endif /* SQLITE_OMIT_DECLTYPE */
62728:
62729: #ifdef SQLITE_ENABLE_COLUMN_METADATA
62730: /*
62731: ** Return the name of the database from which a result column derives.
62732: ** NULL is returned if the result column is an expression or constant or
62733: ** anything else which is not an unabiguous reference to a database column.
62734: */
62735: SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt *pStmt, int N){
62736: return columnName(
62737: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_DATABASE);
62738: }
62739: #ifndef SQLITE_OMIT_UTF16
62740: SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt *pStmt, int N){
62741: return columnName(
62742: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_DATABASE);
62743: }
62744: #endif /* SQLITE_OMIT_UTF16 */
62745:
62746: /*
62747: ** Return the name of the table from which a result column derives.
62748: ** NULL is returned if the result column is an expression or constant or
62749: ** anything else which is not an unabiguous reference to a database column.
62750: */
62751: SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N){
62752: return columnName(
62753: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_TABLE);
62754: }
62755: #ifndef SQLITE_OMIT_UTF16
62756: SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt *pStmt, int N){
62757: return columnName(
62758: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_TABLE);
62759: }
62760: #endif /* SQLITE_OMIT_UTF16 */
62761:
62762: /*
62763: ** Return the name of the table column from which a result column derives.
62764: ** NULL is returned if the result column is an expression or constant or
62765: ** anything else which is not an unabiguous reference to a database column.
62766: */
62767: SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt *pStmt, int N){
62768: return columnName(
62769: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text, COLNAME_COLUMN);
62770: }
62771: #ifndef SQLITE_OMIT_UTF16
62772: SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt *pStmt, int N){
62773: return columnName(
62774: pStmt, N, (const void*(*)(Mem*))sqlite3_value_text16, COLNAME_COLUMN);
62775: }
62776: #endif /* SQLITE_OMIT_UTF16 */
62777: #endif /* SQLITE_ENABLE_COLUMN_METADATA */
62778:
62779:
62780: /******************************* sqlite3_bind_ ***************************
62781: **
62782: ** Routines used to attach values to wildcards in a compiled SQL statement.
62783: */
62784: /*
62785: ** Unbind the value bound to variable i in virtual machine p. This is the
62786: ** the same as binding a NULL value to the column. If the "i" parameter is
62787: ** out of range, then SQLITE_RANGE is returned. Othewise SQLITE_OK.
62788: **
62789: ** A successful evaluation of this routine acquires the mutex on p.
62790: ** the mutex is released if any kind of error occurs.
62791: **
62792: ** The error code stored in database p->db is overwritten with the return
62793: ** value in any case.
62794: */
62795: static int vdbeUnbind(Vdbe *p, int i){
62796: Mem *pVar;
62797: if( vdbeSafetyNotNull(p) ){
62798: return SQLITE_MISUSE_BKPT;
62799: }
62800: sqlite3_mutex_enter(p->db->mutex);
62801: if( p->magic!=VDBE_MAGIC_RUN || p->pc>=0 ){
62802: sqlite3Error(p->db, SQLITE_MISUSE, 0);
62803: sqlite3_mutex_leave(p->db->mutex);
62804: sqlite3_log(SQLITE_MISUSE,
62805: "bind on a busy prepared statement: [%s]", p->zSql);
62806: return SQLITE_MISUSE_BKPT;
62807: }
62808: if( i<1 || i>p->nVar ){
62809: sqlite3Error(p->db, SQLITE_RANGE, 0);
62810: sqlite3_mutex_leave(p->db->mutex);
62811: return SQLITE_RANGE;
62812: }
62813: i--;
62814: pVar = &p->aVar[i];
62815: sqlite3VdbeMemRelease(pVar);
62816: pVar->flags = MEM_Null;
62817: sqlite3Error(p->db, SQLITE_OK, 0);
62818:
62819: /* If the bit corresponding to this variable in Vdbe.expmask is set, then
62820: ** binding a new value to this variable invalidates the current query plan.
62821: **
62822: ** IMPLEMENTATION-OF: R-48440-37595 If the specific value bound to host
62823: ** parameter in the WHERE clause might influence the choice of query plan
62824: ** for a statement, then the statement will be automatically recompiled,
62825: ** as if there had been a schema change, on the first sqlite3_step() call
62826: ** following any change to the bindings of that parameter.
62827: */
62828: if( p->isPrepareV2 &&
62829: ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff)
62830: ){
62831: p->expired = 1;
62832: }
62833: return SQLITE_OK;
62834: }
62835:
62836: /*
62837: ** Bind a text or BLOB value.
62838: */
62839: static int bindText(
62840: sqlite3_stmt *pStmt, /* The statement to bind against */
62841: int i, /* Index of the parameter to bind */
62842: const void *zData, /* Pointer to the data to be bound */
62843: int nData, /* Number of bytes of data to be bound */
62844: void (*xDel)(void*), /* Destructor for the data */
62845: u8 encoding /* Encoding for the data */
62846: ){
62847: Vdbe *p = (Vdbe *)pStmt;
62848: Mem *pVar;
62849: int rc;
62850:
62851: rc = vdbeUnbind(p, i);
62852: if( rc==SQLITE_OK ){
62853: if( zData!=0 ){
62854: pVar = &p->aVar[i-1];
62855: rc = sqlite3VdbeMemSetStr(pVar, zData, nData, encoding, xDel);
62856: if( rc==SQLITE_OK && encoding!=0 ){
62857: rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db));
62858: }
62859: sqlite3Error(p->db, rc, 0);
62860: rc = sqlite3ApiExit(p->db, rc);
62861: }
62862: sqlite3_mutex_leave(p->db->mutex);
62863: }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){
62864: xDel((void*)zData);
62865: }
62866: return rc;
62867: }
62868:
62869:
62870: /*
62871: ** Bind a blob value to an SQL statement variable.
62872: */
62873: SQLITE_API int sqlite3_bind_blob(
62874: sqlite3_stmt *pStmt,
62875: int i,
62876: const void *zData,
62877: int nData,
62878: void (*xDel)(void*)
62879: ){
62880: return bindText(pStmt, i, zData, nData, xDel, 0);
62881: }
62882: SQLITE_API int sqlite3_bind_double(sqlite3_stmt *pStmt, int i, double rValue){
62883: int rc;
62884: Vdbe *p = (Vdbe *)pStmt;
62885: rc = vdbeUnbind(p, i);
62886: if( rc==SQLITE_OK ){
62887: sqlite3VdbeMemSetDouble(&p->aVar[i-1], rValue);
62888: sqlite3_mutex_leave(p->db->mutex);
62889: }
62890: return rc;
62891: }
62892: SQLITE_API int sqlite3_bind_int(sqlite3_stmt *p, int i, int iValue){
62893: return sqlite3_bind_int64(p, i, (i64)iValue);
62894: }
62895: SQLITE_API int sqlite3_bind_int64(sqlite3_stmt *pStmt, int i, sqlite_int64 iValue){
62896: int rc;
62897: Vdbe *p = (Vdbe *)pStmt;
62898: rc = vdbeUnbind(p, i);
62899: if( rc==SQLITE_OK ){
62900: sqlite3VdbeMemSetInt64(&p->aVar[i-1], iValue);
62901: sqlite3_mutex_leave(p->db->mutex);
62902: }
62903: return rc;
62904: }
62905: SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){
62906: int rc;
62907: Vdbe *p = (Vdbe*)pStmt;
62908: rc = vdbeUnbind(p, i);
62909: if( rc==SQLITE_OK ){
62910: sqlite3_mutex_leave(p->db->mutex);
62911: }
62912: return rc;
62913: }
62914: SQLITE_API int sqlite3_bind_text(
62915: sqlite3_stmt *pStmt,
62916: int i,
62917: const char *zData,
62918: int nData,
62919: void (*xDel)(void*)
62920: ){
62921: return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF8);
62922: }
62923: #ifndef SQLITE_OMIT_UTF16
62924: SQLITE_API int sqlite3_bind_text16(
62925: sqlite3_stmt *pStmt,
62926: int i,
62927: const void *zData,
62928: int nData,
62929: void (*xDel)(void*)
62930: ){
62931: return bindText(pStmt, i, zData, nData, xDel, SQLITE_UTF16NATIVE);
62932: }
62933: #endif /* SQLITE_OMIT_UTF16 */
62934: SQLITE_API int sqlite3_bind_value(sqlite3_stmt *pStmt, int i, const sqlite3_value *pValue){
62935: int rc;
62936: switch( pValue->type ){
62937: case SQLITE_INTEGER: {
62938: rc = sqlite3_bind_int64(pStmt, i, pValue->u.i);
62939: break;
62940: }
62941: case SQLITE_FLOAT: {
62942: rc = sqlite3_bind_double(pStmt, i, pValue->r);
62943: break;
62944: }
62945: case SQLITE_BLOB: {
62946: if( pValue->flags & MEM_Zero ){
62947: rc = sqlite3_bind_zeroblob(pStmt, i, pValue->u.nZero);
62948: }else{
62949: rc = sqlite3_bind_blob(pStmt, i, pValue->z, pValue->n,SQLITE_TRANSIENT);
62950: }
62951: break;
62952: }
62953: case SQLITE_TEXT: {
62954: rc = bindText(pStmt,i, pValue->z, pValue->n, SQLITE_TRANSIENT,
62955: pValue->enc);
62956: break;
62957: }
62958: default: {
62959: rc = sqlite3_bind_null(pStmt, i);
62960: break;
62961: }
62962: }
62963: return rc;
62964: }
62965: SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
62966: int rc;
62967: Vdbe *p = (Vdbe *)pStmt;
62968: rc = vdbeUnbind(p, i);
62969: if( rc==SQLITE_OK ){
62970: sqlite3VdbeMemSetZeroBlob(&p->aVar[i-1], n);
62971: sqlite3_mutex_leave(p->db->mutex);
62972: }
62973: return rc;
62974: }
62975:
62976: /*
62977: ** Return the number of wildcards that can be potentially bound to.
62978: ** This routine is added to support DBD::SQLite.
62979: */
62980: SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){
62981: Vdbe *p = (Vdbe*)pStmt;
62982: return p ? p->nVar : 0;
62983: }
62984:
62985: /*
62986: ** Return the name of a wildcard parameter. Return NULL if the index
62987: ** is out of range or if the wildcard is unnamed.
62988: **
62989: ** The result is always UTF-8.
62990: */
62991: SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){
62992: Vdbe *p = (Vdbe*)pStmt;
62993: if( p==0 || i<1 || i>p->nzVar ){
62994: return 0;
62995: }
62996: return p->azVar[i-1];
62997: }
62998:
62999: /*
63000: ** Given a wildcard parameter name, return the index of the variable
63001: ** with that name. If there is no variable with the given name,
63002: ** return 0.
63003: */
63004: SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){
63005: int i;
63006: if( p==0 ){
63007: return 0;
63008: }
63009: if( zName ){
63010: for(i=0; i<p->nzVar; i++){
63011: const char *z = p->azVar[i];
63012: if( z && memcmp(z,zName,nName)==0 && z[nName]==0 ){
63013: return i+1;
63014: }
63015: }
63016: }
63017: return 0;
63018: }
63019: SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){
63020: return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName));
63021: }
63022:
63023: /*
63024: ** Transfer all bindings from the first statement over to the second.
63025: */
63026: SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
63027: Vdbe *pFrom = (Vdbe*)pFromStmt;
63028: Vdbe *pTo = (Vdbe*)pToStmt;
63029: int i;
63030: assert( pTo->db==pFrom->db );
63031: assert( pTo->nVar==pFrom->nVar );
63032: sqlite3_mutex_enter(pTo->db->mutex);
63033: for(i=0; i<pFrom->nVar; i++){
63034: sqlite3VdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]);
63035: }
63036: sqlite3_mutex_leave(pTo->db->mutex);
63037: return SQLITE_OK;
63038: }
63039:
63040: #ifndef SQLITE_OMIT_DEPRECATED
63041: /*
63042: ** Deprecated external interface. Internal/core SQLite code
63043: ** should call sqlite3TransferBindings.
63044: **
63045: ** Is is misuse to call this routine with statements from different
63046: ** database connections. But as this is a deprecated interface, we
63047: ** will not bother to check for that condition.
63048: **
63049: ** If the two statements contain a different number of bindings, then
63050: ** an SQLITE_ERROR is returned. Nothing else can go wrong, so otherwise
63051: ** SQLITE_OK is returned.
63052: */
63053: SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt *pToStmt){
63054: Vdbe *pFrom = (Vdbe*)pFromStmt;
63055: Vdbe *pTo = (Vdbe*)pToStmt;
63056: if( pFrom->nVar!=pTo->nVar ){
63057: return SQLITE_ERROR;
63058: }
63059: if( pTo->isPrepareV2 && pTo->expmask ){
63060: pTo->expired = 1;
63061: }
63062: if( pFrom->isPrepareV2 && pFrom->expmask ){
63063: pFrom->expired = 1;
63064: }
63065: return sqlite3TransferBindings(pFromStmt, pToStmt);
63066: }
63067: #endif
63068:
63069: /*
63070: ** Return the sqlite3* database handle to which the prepared statement given
63071: ** in the argument belongs. This is the same database handle that was
63072: ** the first argument to the sqlite3_prepare() that was used to create
63073: ** the statement in the first place.
63074: */
63075: SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt *pStmt){
63076: return pStmt ? ((Vdbe*)pStmt)->db : 0;
63077: }
63078:
63079: /*
63080: ** Return true if the prepared statement is guaranteed to not modify the
63081: ** database.
63082: */
63083: SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){
63084: return pStmt ? ((Vdbe*)pStmt)->readOnly : 1;
63085: }
63086:
63087: /*
63088: ** Return true if the prepared statement is in need of being reset.
63089: */
63090: SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){
63091: Vdbe *v = (Vdbe*)pStmt;
63092: return v!=0 && v->pc>0 && v->magic==VDBE_MAGIC_RUN;
63093: }
63094:
63095: /*
63096: ** Return a pointer to the next prepared statement after pStmt associated
63097: ** with database connection pDb. If pStmt is NULL, return the first
63098: ** prepared statement for the database connection. Return NULL if there
63099: ** are no more.
63100: */
63101: SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){
63102: sqlite3_stmt *pNext;
63103: sqlite3_mutex_enter(pDb->mutex);
63104: if( pStmt==0 ){
63105: pNext = (sqlite3_stmt*)pDb->pVdbe;
63106: }else{
63107: pNext = (sqlite3_stmt*)((Vdbe*)pStmt)->pNext;
63108: }
63109: sqlite3_mutex_leave(pDb->mutex);
63110: return pNext;
63111: }
63112:
63113: /*
63114: ** Return the value of a status counter for a prepared statement
63115: */
63116: SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
63117: Vdbe *pVdbe = (Vdbe*)pStmt;
63118: int v = pVdbe->aCounter[op-1];
63119: if( resetFlag ) pVdbe->aCounter[op-1] = 0;
63120: return v;
63121: }
63122:
63123: /************** End of vdbeapi.c *********************************************/
63124: /************** Begin file vdbetrace.c ***************************************/
63125: /*
63126: ** 2009 November 25
63127: **
63128: ** The author disclaims copyright to this source code. In place of
63129: ** a legal notice, here is a blessing:
63130: **
63131: ** May you do good and not evil.
63132: ** May you find forgiveness for yourself and forgive others.
63133: ** May you share freely, never taking more than you give.
63134: **
63135: *************************************************************************
63136: **
63137: ** This file contains code used to insert the values of host parameters
63138: ** (aka "wildcards") into the SQL text output by sqlite3_trace().
63139: **
63140: ** The Vdbe parse-tree explainer is also found here.
63141: */
63142:
63143: #ifndef SQLITE_OMIT_TRACE
63144:
63145: /*
63146: ** zSql is a zero-terminated string of UTF-8 SQL text. Return the number of
63147: ** bytes in this text up to but excluding the first character in
63148: ** a host parameter. If the text contains no host parameters, return
63149: ** the total number of bytes in the text.
63150: */
63151: static int findNextHostParameter(const char *zSql, int *pnToken){
63152: int tokenType;
63153: int nTotal = 0;
63154: int n;
63155:
63156: *pnToken = 0;
63157: while( zSql[0] ){
63158: n = sqlite3GetToken((u8*)zSql, &tokenType);
63159: assert( n>0 && tokenType!=TK_ILLEGAL );
63160: if( tokenType==TK_VARIABLE ){
63161: *pnToken = n;
63162: break;
63163: }
63164: nTotal += n;
63165: zSql += n;
63166: }
63167: return nTotal;
63168: }
63169:
63170: /*
63171: ** This function returns a pointer to a nul-terminated string in memory
63172: ** obtained from sqlite3DbMalloc(). If sqlite3.vdbeExecCnt is 1, then the
63173: ** string contains a copy of zRawSql but with host parameters expanded to
63174: ** their current bindings. Or, if sqlite3.vdbeExecCnt is greater than 1,
63175: ** then the returned string holds a copy of zRawSql with "-- " prepended
63176: ** to each line of text.
63177: **
63178: ** The calling function is responsible for making sure the memory returned
63179: ** is eventually freed.
63180: **
63181: ** ALGORITHM: Scan the input string looking for host parameters in any of
63182: ** these forms: ?, ?N, $A, @A, :A. Take care to avoid text within
63183: ** string literals, quoted identifier names, and comments. For text forms,
63184: ** the host parameter index is found by scanning the perpared
63185: ** statement for the corresponding OP_Variable opcode. Once the host
63186: ** parameter index is known, locate the value in p->aVar[]. Then render
63187: ** the value as a literal in place of the host parameter name.
63188: */
63189: SQLITE_PRIVATE char *sqlite3VdbeExpandSql(
63190: Vdbe *p, /* The prepared statement being evaluated */
63191: const char *zRawSql /* Raw text of the SQL statement */
63192: ){
63193: sqlite3 *db; /* The database connection */
63194: int idx = 0; /* Index of a host parameter */
63195: int nextIndex = 1; /* Index of next ? host parameter */
63196: int n; /* Length of a token prefix */
63197: int nToken; /* Length of the parameter token */
63198: int i; /* Loop counter */
63199: Mem *pVar; /* Value of a host parameter */
63200: StrAccum out; /* Accumulate the output here */
63201: char zBase[100]; /* Initial working space */
63202:
63203: db = p->db;
63204: sqlite3StrAccumInit(&out, zBase, sizeof(zBase),
63205: db->aLimit[SQLITE_LIMIT_LENGTH]);
63206: out.db = db;
63207: if( db->vdbeExecCnt>1 ){
63208: while( *zRawSql ){
63209: const char *zStart = zRawSql;
63210: while( *(zRawSql++)!='\n' && *zRawSql );
63211: sqlite3StrAccumAppend(&out, "-- ", 3);
63212: sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart));
63213: }
63214: }else{
63215: while( zRawSql[0] ){
63216: n = findNextHostParameter(zRawSql, &nToken);
63217: assert( n>0 );
63218: sqlite3StrAccumAppend(&out, zRawSql, n);
63219: zRawSql += n;
63220: assert( zRawSql[0] || nToken==0 );
63221: if( nToken==0 ) break;
63222: if( zRawSql[0]=='?' ){
63223: if( nToken>1 ){
63224: assert( sqlite3Isdigit(zRawSql[1]) );
63225: sqlite3GetInt32(&zRawSql[1], &idx);
63226: }else{
63227: idx = nextIndex;
63228: }
63229: }else{
63230: assert( zRawSql[0]==':' || zRawSql[0]=='$' || zRawSql[0]=='@' );
63231: testcase( zRawSql[0]==':' );
63232: testcase( zRawSql[0]=='$' );
63233: testcase( zRawSql[0]=='@' );
63234: idx = sqlite3VdbeParameterIndex(p, zRawSql, nToken);
63235: assert( idx>0 );
63236: }
63237: zRawSql += nToken;
63238: nextIndex = idx + 1;
63239: assert( idx>0 && idx<=p->nVar );
63240: pVar = &p->aVar[idx-1];
63241: if( pVar->flags & MEM_Null ){
63242: sqlite3StrAccumAppend(&out, "NULL", 4);
63243: }else if( pVar->flags & MEM_Int ){
63244: sqlite3XPrintf(&out, "%lld", pVar->u.i);
63245: }else if( pVar->flags & MEM_Real ){
63246: sqlite3XPrintf(&out, "%!.15g", pVar->r);
63247: }else if( pVar->flags & MEM_Str ){
63248: #ifndef SQLITE_OMIT_UTF16
63249: u8 enc = ENC(db);
63250: if( enc!=SQLITE_UTF8 ){
63251: Mem utf8;
63252: memset(&utf8, 0, sizeof(utf8));
63253: utf8.db = db;
63254: sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC);
63255: sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8);
63256: sqlite3XPrintf(&out, "'%.*q'", utf8.n, utf8.z);
63257: sqlite3VdbeMemRelease(&utf8);
63258: }else
63259: #endif
63260: {
63261: sqlite3XPrintf(&out, "'%.*q'", pVar->n, pVar->z);
63262: }
63263: }else if( pVar->flags & MEM_Zero ){
63264: sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero);
63265: }else{
63266: assert( pVar->flags & MEM_Blob );
63267: sqlite3StrAccumAppend(&out, "x'", 2);
63268: for(i=0; i<pVar->n; i++){
63269: sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff);
63270: }
63271: sqlite3StrAccumAppend(&out, "'", 1);
63272: }
63273: }
63274: }
63275: return sqlite3StrAccumFinish(&out);
63276: }
63277:
63278: #endif /* #ifndef SQLITE_OMIT_TRACE */
63279:
63280: /*****************************************************************************
63281: ** The following code implements the data-structure explaining logic
63282: ** for the Vdbe.
63283: */
63284:
63285: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
63286:
63287: /*
63288: ** Allocate a new Explain object
63289: */
63290: SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe *pVdbe){
63291: if( pVdbe ){
1.2.2.1 ! misho 63292: Explain *p;
1.2 misho 63293: sqlite3BeginBenignMalloc();
1.2.2.1 ! misho 63294: p = (Explain *)sqlite3MallocZero( sizeof(Explain) );
1.2 misho 63295: if( p ){
63296: p->pVdbe = pVdbe;
63297: sqlite3_free(pVdbe->pExplain);
63298: pVdbe->pExplain = p;
63299: sqlite3StrAccumInit(&p->str, p->zBase, sizeof(p->zBase),
63300: SQLITE_MAX_LENGTH);
63301: p->str.useMalloc = 2;
63302: }else{
63303: sqlite3EndBenignMalloc();
63304: }
63305: }
63306: }
63307:
63308: /*
63309: ** Return true if the Explain ends with a new-line.
63310: */
63311: static int endsWithNL(Explain *p){
63312: return p && p->str.zText && p->str.nChar
63313: && p->str.zText[p->str.nChar-1]=='\n';
63314: }
63315:
63316: /*
63317: ** Append text to the indentation
63318: */
63319: SQLITE_PRIVATE void sqlite3ExplainPrintf(Vdbe *pVdbe, const char *zFormat, ...){
63320: Explain *p;
63321: if( pVdbe && (p = pVdbe->pExplain)!=0 ){
63322: va_list ap;
63323: if( p->nIndent && endsWithNL(p) ){
63324: int n = p->nIndent;
63325: if( n>ArraySize(p->aIndent) ) n = ArraySize(p->aIndent);
63326: sqlite3AppendSpace(&p->str, p->aIndent[n-1]);
63327: }
63328: va_start(ap, zFormat);
63329: sqlite3VXPrintf(&p->str, 1, zFormat, ap);
63330: va_end(ap);
63331: }
63332: }
63333:
63334: /*
63335: ** Append a '\n' if there is not already one.
63336: */
63337: SQLITE_PRIVATE void sqlite3ExplainNL(Vdbe *pVdbe){
63338: Explain *p;
63339: if( pVdbe && (p = pVdbe->pExplain)!=0 && !endsWithNL(p) ){
63340: sqlite3StrAccumAppend(&p->str, "\n", 1);
63341: }
63342: }
63343:
63344: /*
63345: ** Push a new indentation level. Subsequent lines will be indented
63346: ** so that they begin at the current cursor position.
63347: */
63348: SQLITE_PRIVATE void sqlite3ExplainPush(Vdbe *pVdbe){
63349: Explain *p;
63350: if( pVdbe && (p = pVdbe->pExplain)!=0 ){
63351: if( p->str.zText && p->nIndent<ArraySize(p->aIndent) ){
63352: const char *z = p->str.zText;
63353: int i = p->str.nChar-1;
63354: int x;
63355: while( i>=0 && z[i]!='\n' ){ i--; }
63356: x = (p->str.nChar - 1) - i;
63357: if( p->nIndent && x<p->aIndent[p->nIndent-1] ){
63358: x = p->aIndent[p->nIndent-1];
63359: }
63360: p->aIndent[p->nIndent] = x;
63361: }
63362: p->nIndent++;
63363: }
63364: }
63365:
63366: /*
63367: ** Pop the indentation stack by one level.
63368: */
63369: SQLITE_PRIVATE void sqlite3ExplainPop(Vdbe *p){
63370: if( p && p->pExplain ) p->pExplain->nIndent--;
63371: }
63372:
63373: /*
63374: ** Free the indentation structure
63375: */
63376: SQLITE_PRIVATE void sqlite3ExplainFinish(Vdbe *pVdbe){
63377: if( pVdbe && pVdbe->pExplain ){
63378: sqlite3_free(pVdbe->zExplain);
63379: sqlite3ExplainNL(pVdbe);
63380: pVdbe->zExplain = sqlite3StrAccumFinish(&pVdbe->pExplain->str);
63381: sqlite3_free(pVdbe->pExplain);
63382: pVdbe->pExplain = 0;
63383: sqlite3EndBenignMalloc();
63384: }
63385: }
63386:
63387: /*
63388: ** Return the explanation of a virtual machine.
63389: */
63390: SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe *pVdbe){
63391: return (pVdbe && pVdbe->zExplain) ? pVdbe->zExplain : 0;
63392: }
63393: #endif /* defined(SQLITE_DEBUG) */
63394:
63395: /************** End of vdbetrace.c *******************************************/
63396: /************** Begin file vdbe.c ********************************************/
63397: /*
63398: ** 2001 September 15
63399: **
63400: ** The author disclaims copyright to this source code. In place of
63401: ** a legal notice, here is a blessing:
63402: **
63403: ** May you do good and not evil.
63404: ** May you find forgiveness for yourself and forgive others.
63405: ** May you share freely, never taking more than you give.
63406: **
63407: *************************************************************************
63408: ** The code in this file implements execution method of the
63409: ** Virtual Database Engine (VDBE). A separate file ("vdbeaux.c")
63410: ** handles housekeeping details such as creating and deleting
63411: ** VDBE instances. This file is solely interested in executing
63412: ** the VDBE program.
63413: **
63414: ** In the external interface, an "sqlite3_stmt*" is an opaque pointer
63415: ** to a VDBE.
63416: **
63417: ** The SQL parser generates a program which is then executed by
63418: ** the VDBE to do the work of the SQL statement. VDBE programs are
63419: ** similar in form to assembly language. The program consists of
63420: ** a linear sequence of operations. Each operation has an opcode
63421: ** and 5 operands. Operands P1, P2, and P3 are integers. Operand P4
63422: ** is a null-terminated string. Operand P5 is an unsigned character.
63423: ** Few opcodes use all 5 operands.
63424: **
63425: ** Computation results are stored on a set of registers numbered beginning
63426: ** with 1 and going up to Vdbe.nMem. Each register can store
63427: ** either an integer, a null-terminated string, a floating point
63428: ** number, or the SQL "NULL" value. An implicit conversion from one
63429: ** type to the other occurs as necessary.
63430: **
63431: ** Most of the code in this file is taken up by the sqlite3VdbeExec()
63432: ** function which does the work of interpreting a VDBE program.
63433: ** But other routines are also provided to help in building up
63434: ** a program instruction by instruction.
63435: **
63436: ** Various scripts scan this source file in order to generate HTML
63437: ** documentation, headers files, or other derived files. The formatting
63438: ** of the code in this file is, therefore, important. See other comments
63439: ** in this file for details. If in doubt, do not deviate from existing
63440: ** commenting and indentation practices when changing or adding code.
63441: */
63442:
63443: /*
63444: ** Invoke this macro on memory cells just prior to changing the
63445: ** value of the cell. This macro verifies that shallow copies are
63446: ** not misused.
63447: */
63448: #ifdef SQLITE_DEBUG
63449: # define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M)
63450: #else
63451: # define memAboutToChange(P,M)
63452: #endif
63453:
63454: /*
63455: ** The following global variable is incremented every time a cursor
63456: ** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test
63457: ** procedures use this information to make sure that indices are
63458: ** working correctly. This variable has no function other than to
63459: ** help verify the correct operation of the library.
63460: */
63461: #ifdef SQLITE_TEST
63462: SQLITE_API int sqlite3_search_count = 0;
63463: #endif
63464:
63465: /*
63466: ** When this global variable is positive, it gets decremented once before
63467: ** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted
63468: ** field of the sqlite3 structure is set in order to simulate an interrupt.
63469: **
63470: ** This facility is used for testing purposes only. It does not function
63471: ** in an ordinary build.
63472: */
63473: #ifdef SQLITE_TEST
63474: SQLITE_API int sqlite3_interrupt_count = 0;
63475: #endif
63476:
63477: /*
63478: ** The next global variable is incremented each type the OP_Sort opcode
63479: ** is executed. The test procedures use this information to make sure that
63480: ** sorting is occurring or not occurring at appropriate times. This variable
63481: ** has no function other than to help verify the correct operation of the
63482: ** library.
63483: */
63484: #ifdef SQLITE_TEST
63485: SQLITE_API int sqlite3_sort_count = 0;
63486: #endif
63487:
63488: /*
63489: ** The next global variable records the size of the largest MEM_Blob
63490: ** or MEM_Str that has been used by a VDBE opcode. The test procedures
63491: ** use this information to make sure that the zero-blob functionality
63492: ** is working correctly. This variable has no function other than to
63493: ** help verify the correct operation of the library.
63494: */
63495: #ifdef SQLITE_TEST
63496: SQLITE_API int sqlite3_max_blobsize = 0;
63497: static void updateMaxBlobsize(Mem *p){
63498: if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){
63499: sqlite3_max_blobsize = p->n;
63500: }
63501: }
63502: #endif
63503:
63504: /*
63505: ** The next global variable is incremented each type the OP_Found opcode
63506: ** is executed. This is used to test whether or not the foreign key
63507: ** operation implemented using OP_FkIsZero is working. This variable
63508: ** has no function other than to help verify the correct operation of the
63509: ** library.
63510: */
63511: #ifdef SQLITE_TEST
63512: SQLITE_API int sqlite3_found_count = 0;
63513: #endif
63514:
63515: /*
63516: ** Test a register to see if it exceeds the current maximum blob size.
63517: ** If it does, record the new maximum blob size.
63518: */
63519: #if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST)
63520: # define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P)
63521: #else
63522: # define UPDATE_MAX_BLOBSIZE(P)
63523: #endif
63524:
63525: /*
63526: ** Convert the given register into a string if it isn't one
63527: ** already. Return non-zero if a malloc() fails.
63528: */
63529: #define Stringify(P, enc) \
63530: if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc)) \
63531: { goto no_mem; }
63532:
63533: /*
63534: ** An ephemeral string value (signified by the MEM_Ephem flag) contains
63535: ** a pointer to a dynamically allocated string where some other entity
63536: ** is responsible for deallocating that string. Because the register
63537: ** does not control the string, it might be deleted without the register
63538: ** knowing it.
63539: **
63540: ** This routine converts an ephemeral string into a dynamically allocated
63541: ** string that the register itself controls. In other words, it
63542: ** converts an MEM_Ephem string into an MEM_Dyn string.
63543: */
63544: #define Deephemeralize(P) \
63545: if( ((P)->flags&MEM_Ephem)!=0 \
63546: && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;}
63547:
63548: /* Return true if the cursor was opened using the OP_OpenSorter opcode. */
63549: #ifdef SQLITE_OMIT_MERGE_SORT
63550: # define isSorter(x) 0
63551: #else
63552: # define isSorter(x) ((x)->pSorter!=0)
63553: #endif
63554:
63555: /*
63556: ** Argument pMem points at a register that will be passed to a
63557: ** user-defined function or returned to the user as the result of a query.
63558: ** This routine sets the pMem->type variable used by the sqlite3_value_*()
63559: ** routines.
63560: */
63561: SQLITE_PRIVATE void sqlite3VdbeMemStoreType(Mem *pMem){
63562: int flags = pMem->flags;
63563: if( flags & MEM_Null ){
63564: pMem->type = SQLITE_NULL;
63565: }
63566: else if( flags & MEM_Int ){
63567: pMem->type = SQLITE_INTEGER;
63568: }
63569: else if( flags & MEM_Real ){
63570: pMem->type = SQLITE_FLOAT;
63571: }
63572: else if( flags & MEM_Str ){
63573: pMem->type = SQLITE_TEXT;
63574: }else{
63575: pMem->type = SQLITE_BLOB;
63576: }
63577: }
63578:
63579: /*
63580: ** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL
63581: ** if we run out of memory.
63582: */
63583: static VdbeCursor *allocateCursor(
63584: Vdbe *p, /* The virtual machine */
63585: int iCur, /* Index of the new VdbeCursor */
63586: int nField, /* Number of fields in the table or index */
63587: int iDb, /* Database the cursor belongs to, or -1 */
63588: int isBtreeCursor /* True for B-Tree. False for pseudo-table or vtab */
63589: ){
63590: /* Find the memory cell that will be used to store the blob of memory
63591: ** required for this VdbeCursor structure. It is convenient to use a
63592: ** vdbe memory cell to manage the memory allocation required for a
63593: ** VdbeCursor structure for the following reasons:
63594: **
63595: ** * Sometimes cursor numbers are used for a couple of different
63596: ** purposes in a vdbe program. The different uses might require
63597: ** different sized allocations. Memory cells provide growable
63598: ** allocations.
63599: **
63600: ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can
63601: ** be freed lazily via the sqlite3_release_memory() API. This
63602: ** minimizes the number of malloc calls made by the system.
63603: **
63604: ** Memory cells for cursors are allocated at the top of the address
63605: ** space. Memory cell (p->nMem) corresponds to cursor 0. Space for
63606: ** cursor 1 is managed by memory cell (p->nMem-1), etc.
63607: */
63608: Mem *pMem = &p->aMem[p->nMem-iCur];
63609:
63610: int nByte;
63611: VdbeCursor *pCx = 0;
63612: nByte =
63613: ROUND8(sizeof(VdbeCursor)) +
63614: (isBtreeCursor?sqlite3BtreeCursorSize():0) +
63615: 2*nField*sizeof(u32);
63616:
63617: assert( iCur<p->nCursor );
63618: if( p->apCsr[iCur] ){
63619: sqlite3VdbeFreeCursor(p, p->apCsr[iCur]);
63620: p->apCsr[iCur] = 0;
63621: }
63622: if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){
63623: p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z;
63624: memset(pCx, 0, sizeof(VdbeCursor));
63625: pCx->iDb = iDb;
63626: pCx->nField = nField;
63627: if( nField ){
63628: pCx->aType = (u32 *)&pMem->z[ROUND8(sizeof(VdbeCursor))];
63629: }
63630: if( isBtreeCursor ){
63631: pCx->pCursor = (BtCursor*)
63632: &pMem->z[ROUND8(sizeof(VdbeCursor))+2*nField*sizeof(u32)];
63633: sqlite3BtreeCursorZero(pCx->pCursor);
63634: }
63635: }
63636: return pCx;
63637: }
63638:
63639: /*
63640: ** Try to convert a value into a numeric representation if we can
63641: ** do so without loss of information. In other words, if the string
63642: ** looks like a number, convert it into a number. If it does not
63643: ** look like a number, leave it alone.
63644: */
63645: static void applyNumericAffinity(Mem *pRec){
63646: if( (pRec->flags & (MEM_Real|MEM_Int))==0 ){
63647: double rValue;
63648: i64 iValue;
63649: u8 enc = pRec->enc;
63650: if( (pRec->flags&MEM_Str)==0 ) return;
63651: if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return;
63652: if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){
63653: pRec->u.i = iValue;
63654: pRec->flags |= MEM_Int;
63655: }else{
63656: pRec->r = rValue;
63657: pRec->flags |= MEM_Real;
63658: }
63659: }
63660: }
63661:
63662: /*
63663: ** Processing is determine by the affinity parameter:
63664: **
63665: ** SQLITE_AFF_INTEGER:
63666: ** SQLITE_AFF_REAL:
63667: ** SQLITE_AFF_NUMERIC:
63668: ** Try to convert pRec to an integer representation or a
63669: ** floating-point representation if an integer representation
63670: ** is not possible. Note that the integer representation is
63671: ** always preferred, even if the affinity is REAL, because
63672: ** an integer representation is more space efficient on disk.
63673: **
63674: ** SQLITE_AFF_TEXT:
63675: ** Convert pRec to a text representation.
63676: **
63677: ** SQLITE_AFF_NONE:
63678: ** No-op. pRec is unchanged.
63679: */
63680: static void applyAffinity(
63681: Mem *pRec, /* The value to apply affinity to */
63682: char affinity, /* The affinity to be applied */
63683: u8 enc /* Use this text encoding */
63684: ){
63685: if( affinity==SQLITE_AFF_TEXT ){
63686: /* Only attempt the conversion to TEXT if there is an integer or real
63687: ** representation (blob and NULL do not get converted) but no string
63688: ** representation.
63689: */
63690: if( 0==(pRec->flags&MEM_Str) && (pRec->flags&(MEM_Real|MEM_Int)) ){
63691: sqlite3VdbeMemStringify(pRec, enc);
63692: }
63693: pRec->flags &= ~(MEM_Real|MEM_Int);
63694: }else if( affinity!=SQLITE_AFF_NONE ){
63695: assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL
63696: || affinity==SQLITE_AFF_NUMERIC );
63697: applyNumericAffinity(pRec);
63698: if( pRec->flags & MEM_Real ){
63699: sqlite3VdbeIntegerAffinity(pRec);
63700: }
63701: }
63702: }
63703:
63704: /*
63705: ** Try to convert the type of a function argument or a result column
63706: ** into a numeric representation. Use either INTEGER or REAL whichever
63707: ** is appropriate. But only do the conversion if it is possible without
63708: ** loss of information and return the revised type of the argument.
63709: */
63710: SQLITE_API int sqlite3_value_numeric_type(sqlite3_value *pVal){
63711: Mem *pMem = (Mem*)pVal;
63712: if( pMem->type==SQLITE_TEXT ){
63713: applyNumericAffinity(pMem);
63714: sqlite3VdbeMemStoreType(pMem);
63715: }
63716: return pMem->type;
63717: }
63718:
63719: /*
63720: ** Exported version of applyAffinity(). This one works on sqlite3_value*,
63721: ** not the internal Mem* type.
63722: */
63723: SQLITE_PRIVATE void sqlite3ValueApplyAffinity(
63724: sqlite3_value *pVal,
63725: u8 affinity,
63726: u8 enc
63727: ){
63728: applyAffinity((Mem *)pVal, affinity, enc);
63729: }
63730:
63731: #ifdef SQLITE_DEBUG
63732: /*
63733: ** Write a nice string representation of the contents of cell pMem
63734: ** into buffer zBuf, length nBuf.
63735: */
63736: SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
63737: char *zCsr = zBuf;
63738: int f = pMem->flags;
63739:
63740: static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"};
63741:
63742: if( f&MEM_Blob ){
63743: int i;
63744: char c;
63745: if( f & MEM_Dyn ){
63746: c = 'z';
63747: assert( (f & (MEM_Static|MEM_Ephem))==0 );
63748: }else if( f & MEM_Static ){
63749: c = 't';
63750: assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
63751: }else if( f & MEM_Ephem ){
63752: c = 'e';
63753: assert( (f & (MEM_Static|MEM_Dyn))==0 );
63754: }else{
63755: c = 's';
63756: }
63757:
63758: sqlite3_snprintf(100, zCsr, "%c", c);
63759: zCsr += sqlite3Strlen30(zCsr);
63760: sqlite3_snprintf(100, zCsr, "%d[", pMem->n);
63761: zCsr += sqlite3Strlen30(zCsr);
63762: for(i=0; i<16 && i<pMem->n; i++){
63763: sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF));
63764: zCsr += sqlite3Strlen30(zCsr);
63765: }
63766: for(i=0; i<16 && i<pMem->n; i++){
63767: char z = pMem->z[i];
63768: if( z<32 || z>126 ) *zCsr++ = '.';
63769: else *zCsr++ = z;
63770: }
63771:
63772: sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]);
63773: zCsr += sqlite3Strlen30(zCsr);
63774: if( f & MEM_Zero ){
63775: sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero);
63776: zCsr += sqlite3Strlen30(zCsr);
63777: }
63778: *zCsr = '\0';
63779: }else if( f & MEM_Str ){
63780: int j, k;
63781: zBuf[0] = ' ';
63782: if( f & MEM_Dyn ){
63783: zBuf[1] = 'z';
63784: assert( (f & (MEM_Static|MEM_Ephem))==0 );
63785: }else if( f & MEM_Static ){
63786: zBuf[1] = 't';
63787: assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
63788: }else if( f & MEM_Ephem ){
63789: zBuf[1] = 'e';
63790: assert( (f & (MEM_Static|MEM_Dyn))==0 );
63791: }else{
63792: zBuf[1] = 's';
63793: }
63794: k = 2;
63795: sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n);
63796: k += sqlite3Strlen30(&zBuf[k]);
63797: zBuf[k++] = '[';
63798: for(j=0; j<15 && j<pMem->n; j++){
63799: u8 c = pMem->z[j];
63800: if( c>=0x20 && c<0x7f ){
63801: zBuf[k++] = c;
63802: }else{
63803: zBuf[k++] = '.';
63804: }
63805: }
63806: zBuf[k++] = ']';
63807: sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]);
63808: k += sqlite3Strlen30(&zBuf[k]);
63809: zBuf[k++] = 0;
63810: }
63811: }
63812: #endif
63813:
63814: #ifdef SQLITE_DEBUG
63815: /*
63816: ** Print the value of a register for tracing purposes:
63817: */
63818: static void memTracePrint(FILE *out, Mem *p){
1.2.2.1 ! misho 63819: if( p->flags & MEM_Invalid ){
! 63820: fprintf(out, " undefined");
! 63821: }else if( p->flags & MEM_Null ){
1.2 misho 63822: fprintf(out, " NULL");
63823: }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
63824: fprintf(out, " si:%lld", p->u.i);
63825: }else if( p->flags & MEM_Int ){
63826: fprintf(out, " i:%lld", p->u.i);
63827: #ifndef SQLITE_OMIT_FLOATING_POINT
63828: }else if( p->flags & MEM_Real ){
63829: fprintf(out, " r:%g", p->r);
63830: #endif
63831: }else if( p->flags & MEM_RowSet ){
63832: fprintf(out, " (rowset)");
63833: }else{
63834: char zBuf[200];
63835: sqlite3VdbeMemPrettyPrint(p, zBuf);
63836: fprintf(out, " ");
63837: fprintf(out, "%s", zBuf);
63838: }
63839: }
63840: static void registerTrace(FILE *out, int iReg, Mem *p){
63841: fprintf(out, "REG[%d] = ", iReg);
63842: memTracePrint(out, p);
63843: fprintf(out, "\n");
63844: }
63845: #endif
63846:
63847: #ifdef SQLITE_DEBUG
63848: # define REGISTER_TRACE(R,M) if(p->trace)registerTrace(p->trace,R,M)
63849: #else
63850: # define REGISTER_TRACE(R,M)
63851: #endif
63852:
63853:
63854: #ifdef VDBE_PROFILE
63855:
63856: /*
63857: ** hwtime.h contains inline assembler code for implementing
63858: ** high-performance timing routines.
63859: */
63860: /************** Include hwtime.h in the middle of vdbe.c *********************/
63861: /************** Begin file hwtime.h ******************************************/
63862: /*
63863: ** 2008 May 27
63864: **
63865: ** The author disclaims copyright to this source code. In place of
63866: ** a legal notice, here is a blessing:
63867: **
63868: ** May you do good and not evil.
63869: ** May you find forgiveness for yourself and forgive others.
63870: ** May you share freely, never taking more than you give.
63871: **
63872: ******************************************************************************
63873: **
63874: ** This file contains inline asm code for retrieving "high-performance"
63875: ** counters for x86 class CPUs.
63876: */
63877: #ifndef _HWTIME_H_
63878: #define _HWTIME_H_
63879:
63880: /*
63881: ** The following routine only works on pentium-class (or newer) processors.
63882: ** It uses the RDTSC opcode to read the cycle count value out of the
63883: ** processor and returns that value. This can be used for high-res
63884: ** profiling.
63885: */
63886: #if (defined(__GNUC__) || defined(_MSC_VER)) && \
63887: (defined(i386) || defined(__i386__) || defined(_M_IX86))
63888:
63889: #if defined(__GNUC__)
63890:
63891: __inline__ sqlite_uint64 sqlite3Hwtime(void){
63892: unsigned int lo, hi;
63893: __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
63894: return (sqlite_uint64)hi << 32 | lo;
63895: }
63896:
63897: #elif defined(_MSC_VER)
63898:
63899: __declspec(naked) __inline sqlite_uint64 __cdecl sqlite3Hwtime(void){
63900: __asm {
63901: rdtsc
63902: ret ; return value at EDX:EAX
63903: }
63904: }
63905:
63906: #endif
63907:
63908: #elif (defined(__GNUC__) && defined(__x86_64__))
63909:
63910: __inline__ sqlite_uint64 sqlite3Hwtime(void){
63911: unsigned long val;
63912: __asm__ __volatile__ ("rdtsc" : "=A" (val));
63913: return val;
63914: }
63915:
63916: #elif (defined(__GNUC__) && defined(__ppc__))
63917:
63918: __inline__ sqlite_uint64 sqlite3Hwtime(void){
63919: unsigned long long retval;
63920: unsigned long junk;
63921: __asm__ __volatile__ ("\n\
63922: 1: mftbu %1\n\
63923: mftb %L0\n\
63924: mftbu %0\n\
63925: cmpw %0,%1\n\
63926: bne 1b"
63927: : "=r" (retval), "=r" (junk));
63928: return retval;
63929: }
63930:
63931: #else
63932:
63933: #error Need implementation of sqlite3Hwtime() for your platform.
63934:
63935: /*
63936: ** To compile without implementing sqlite3Hwtime() for your platform,
63937: ** you can remove the above #error and use the following
63938: ** stub function. You will lose timing support for many
63939: ** of the debugging and testing utilities, but it should at
63940: ** least compile and run.
63941: */
63942: SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); }
63943:
63944: #endif
63945:
63946: #endif /* !defined(_HWTIME_H_) */
63947:
63948: /************** End of hwtime.h **********************************************/
63949: /************** Continuing where we left off in vdbe.c ***********************/
63950:
63951: #endif
63952:
63953: /*
63954: ** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
63955: ** sqlite3_interrupt() routine has been called. If it has been, then
63956: ** processing of the VDBE program is interrupted.
63957: **
63958: ** This macro added to every instruction that does a jump in order to
63959: ** implement a loop. This test used to be on every single instruction,
63960: ** but that meant we more testing than we needed. By only testing the
63961: ** flag on jump instructions, we get a (small) speed improvement.
63962: */
63963: #define CHECK_FOR_INTERRUPT \
63964: if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
63965:
63966:
63967: #ifndef NDEBUG
63968: /*
63969: ** This function is only called from within an assert() expression. It
63970: ** checks that the sqlite3.nTransaction variable is correctly set to
63971: ** the number of non-transaction savepoints currently in the
63972: ** linked list starting at sqlite3.pSavepoint.
63973: **
63974: ** Usage:
63975: **
63976: ** assert( checkSavepointCount(db) );
63977: */
63978: static int checkSavepointCount(sqlite3 *db){
63979: int n = 0;
63980: Savepoint *p;
63981: for(p=db->pSavepoint; p; p=p->pNext) n++;
63982: assert( n==(db->nSavepoint + db->isTransactionSavepoint) );
63983: return 1;
63984: }
63985: #endif
63986:
63987: /*
63988: ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
63989: ** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
63990: ** in memory obtained from sqlite3DbMalloc).
63991: */
63992: static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
63993: sqlite3 *db = p->db;
63994: sqlite3DbFree(db, p->zErrMsg);
63995: p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
63996: sqlite3_free(pVtab->zErrMsg);
63997: pVtab->zErrMsg = 0;
63998: }
63999:
64000:
64001: /*
64002: ** Execute as much of a VDBE program as we can then return.
64003: **
64004: ** sqlite3VdbeMakeReady() must be called before this routine in order to
64005: ** close the program with a final OP_Halt and to set up the callbacks
64006: ** and the error message pointer.
64007: **
64008: ** Whenever a row or result data is available, this routine will either
64009: ** invoke the result callback (if there is one) or return with
64010: ** SQLITE_ROW.
64011: **
64012: ** If an attempt is made to open a locked database, then this routine
64013: ** will either invoke the busy callback (if there is one) or it will
64014: ** return SQLITE_BUSY.
64015: **
64016: ** If an error occurs, an error message is written to memory obtained
64017: ** from sqlite3_malloc() and p->zErrMsg is made to point to that memory.
64018: ** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
64019: **
64020: ** If the callback ever returns non-zero, then the program exits
64021: ** immediately. There will be no error message but the p->rc field is
64022: ** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
64023: **
64024: ** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
64025: ** routine to return SQLITE_ERROR.
64026: **
64027: ** Other fatal errors return SQLITE_ERROR.
64028: **
64029: ** After this routine has finished, sqlite3VdbeFinalize() should be
64030: ** used to clean up the mess that was left behind.
64031: */
64032: SQLITE_PRIVATE int sqlite3VdbeExec(
64033: Vdbe *p /* The VDBE */
64034: ){
64035: int pc=0; /* The program counter */
64036: Op *aOp = p->aOp; /* Copy of p->aOp */
64037: Op *pOp; /* Current operation */
64038: int rc = SQLITE_OK; /* Value to return */
64039: sqlite3 *db = p->db; /* The database */
64040: u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */
64041: u8 encoding = ENC(db); /* The database encoding */
64042: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
64043: int checkProgress; /* True if progress callbacks are enabled */
64044: int nProgressOps = 0; /* Opcodes executed since progress callback. */
64045: #endif
64046: Mem *aMem = p->aMem; /* Copy of p->aMem */
64047: Mem *pIn1 = 0; /* 1st input operand */
64048: Mem *pIn2 = 0; /* 2nd input operand */
64049: Mem *pIn3 = 0; /* 3rd input operand */
64050: Mem *pOut = 0; /* Output operand */
64051: int iCompare = 0; /* Result of last OP_Compare operation */
64052: int *aPermute = 0; /* Permutation of columns for OP_Compare */
64053: i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */
64054: #ifdef VDBE_PROFILE
64055: u64 start; /* CPU clock count at start of opcode */
64056: int origPc; /* Program counter at start of opcode */
64057: #endif
64058: /********************************************************************
64059: ** Automatically generated code
64060: **
64061: ** The following union is automatically generated by the
64062: ** vdbe-compress.tcl script. The purpose of this union is to
64063: ** reduce the amount of stack space required by this function.
64064: ** See comments in the vdbe-compress.tcl script for details.
64065: */
64066: union vdbeExecUnion {
64067: struct OP_Yield_stack_vars {
64068: int pcDest;
64069: } aa;
64070: struct OP_Null_stack_vars {
64071: int cnt;
1.2.2.1 ! misho 64072: u16 nullFlag;
1.2 misho 64073: } ab;
64074: struct OP_Variable_stack_vars {
64075: Mem *pVar; /* Value being transferred */
64076: } ac;
64077: struct OP_Move_stack_vars {
64078: char *zMalloc; /* Holding variable for allocated memory */
64079: int n; /* Number of registers left to copy */
64080: int p1; /* Register to copy from */
64081: int p2; /* Register to copy to */
64082: } ad;
1.2.2.1 ! misho 64083: struct OP_Copy_stack_vars {
! 64084: int n;
! 64085: } ae;
1.2 misho 64086: struct OP_ResultRow_stack_vars {
64087: Mem *pMem;
64088: int i;
1.2.2.1 ! misho 64089: } af;
1.2 misho 64090: struct OP_Concat_stack_vars {
64091: i64 nByte;
1.2.2.1 ! misho 64092: } ag;
1.2 misho 64093: struct OP_Remainder_stack_vars {
1.2.2.1 ! misho 64094: char bIntint; /* Started out as two integer operands */
1.2 misho 64095: int flags; /* Combined MEM_* flags from both inputs */
64096: i64 iA; /* Integer value of left operand */
64097: i64 iB; /* Integer value of right operand */
64098: double rA; /* Real value of left operand */
64099: double rB; /* Real value of right operand */
1.2.2.1 ! misho 64100: } ah;
1.2 misho 64101: struct OP_Function_stack_vars {
64102: int i;
64103: Mem *pArg;
64104: sqlite3_context ctx;
64105: sqlite3_value **apVal;
64106: int n;
1.2.2.1 ! misho 64107: } ai;
1.2 misho 64108: struct OP_ShiftRight_stack_vars {
64109: i64 iA;
64110: u64 uA;
64111: i64 iB;
64112: u8 op;
1.2.2.1 ! misho 64113: } aj;
1.2 misho 64114: struct OP_Ge_stack_vars {
64115: int res; /* Result of the comparison of pIn1 against pIn3 */
64116: char affinity; /* Affinity to use for comparison */
64117: u16 flags1; /* Copy of initial value of pIn1->flags */
64118: u16 flags3; /* Copy of initial value of pIn3->flags */
1.2.2.1 ! misho 64119: } ak;
1.2 misho 64120: struct OP_Compare_stack_vars {
64121: int n;
64122: int i;
64123: int p1;
64124: int p2;
64125: const KeyInfo *pKeyInfo;
64126: int idx;
64127: CollSeq *pColl; /* Collating sequence to use on this term */
64128: int bRev; /* True for DESCENDING sort order */
1.2.2.1 ! misho 64129: } al;
1.2 misho 64130: struct OP_Or_stack_vars {
64131: int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
64132: int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
1.2.2.1 ! misho 64133: } am;
1.2 misho 64134: struct OP_IfNot_stack_vars {
64135: int c;
1.2.2.1 ! misho 64136: } an;
1.2 misho 64137: struct OP_Column_stack_vars {
64138: u32 payloadSize; /* Number of bytes in the record */
64139: i64 payloadSize64; /* Number of bytes in the record */
64140: int p1; /* P1 value of the opcode */
64141: int p2; /* column number to retrieve */
64142: VdbeCursor *pC; /* The VDBE cursor */
64143: char *zRec; /* Pointer to complete record-data */
64144: BtCursor *pCrsr; /* The BTree cursor */
64145: u32 *aType; /* aType[i] holds the numeric type of the i-th column */
64146: u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
64147: int nField; /* number of fields in the record */
64148: int len; /* The length of the serialized data for the column */
64149: int i; /* Loop counter */
64150: char *zData; /* Part of the record being decoded */
64151: Mem *pDest; /* Where to write the extracted value */
64152: Mem sMem; /* For storing the record being decoded */
64153: u8 *zIdx; /* Index into header */
64154: u8 *zEndHdr; /* Pointer to first byte after the header */
64155: u32 offset; /* Offset into the data */
64156: u32 szField; /* Number of bytes in the content of a field */
64157: int szHdr; /* Size of the header size field at start of record */
64158: int avail; /* Number of bytes of available data */
64159: u32 t; /* A type code from the record header */
64160: Mem *pReg; /* PseudoTable input register */
1.2.2.1 ! misho 64161: } ao;
1.2 misho 64162: struct OP_Affinity_stack_vars {
64163: const char *zAffinity; /* The affinity to be applied */
64164: char cAff; /* A single character of affinity */
1.2.2.1 ! misho 64165: } ap;
1.2 misho 64166: struct OP_MakeRecord_stack_vars {
64167: u8 *zNewRecord; /* A buffer to hold the data for the new record */
64168: Mem *pRec; /* The new record */
64169: u64 nData; /* Number of bytes of data space */
64170: int nHdr; /* Number of bytes of header space */
64171: i64 nByte; /* Data space required for this record */
64172: int nZero; /* Number of zero bytes at the end of the record */
64173: int nVarint; /* Number of bytes in a varint */
64174: u32 serial_type; /* Type field */
64175: Mem *pData0; /* First field to be combined into the record */
64176: Mem *pLast; /* Last field of the record */
64177: int nField; /* Number of fields in the record */
64178: char *zAffinity; /* The affinity string for the record */
64179: int file_format; /* File format to use for encoding */
64180: int i; /* Space used in zNewRecord[] */
64181: int len; /* Length of a field */
1.2.2.1 ! misho 64182: } aq;
1.2 misho 64183: struct OP_Count_stack_vars {
64184: i64 nEntry;
64185: BtCursor *pCrsr;
1.2.2.1 ! misho 64186: } ar;
1.2 misho 64187: struct OP_Savepoint_stack_vars {
64188: int p1; /* Value of P1 operand */
64189: char *zName; /* Name of savepoint */
64190: int nName;
64191: Savepoint *pNew;
64192: Savepoint *pSavepoint;
64193: Savepoint *pTmp;
64194: int iSavepoint;
64195: int ii;
1.2.2.1 ! misho 64196: } as;
1.2 misho 64197: struct OP_AutoCommit_stack_vars {
64198: int desiredAutoCommit;
64199: int iRollback;
64200: int turnOnAC;
1.2.2.1 ! misho 64201: } at;
1.2 misho 64202: struct OP_Transaction_stack_vars {
64203: Btree *pBt;
1.2.2.1 ! misho 64204: } au;
1.2 misho 64205: struct OP_ReadCookie_stack_vars {
64206: int iMeta;
64207: int iDb;
64208: int iCookie;
1.2.2.1 ! misho 64209: } av;
1.2 misho 64210: struct OP_SetCookie_stack_vars {
64211: Db *pDb;
1.2.2.1 ! misho 64212: } aw;
1.2 misho 64213: struct OP_VerifyCookie_stack_vars {
64214: int iMeta;
64215: int iGen;
64216: Btree *pBt;
1.2.2.1 ! misho 64217: } ax;
1.2 misho 64218: struct OP_OpenWrite_stack_vars {
64219: int nField;
64220: KeyInfo *pKeyInfo;
64221: int p2;
64222: int iDb;
64223: int wrFlag;
64224: Btree *pX;
64225: VdbeCursor *pCur;
64226: Db *pDb;
1.2.2.1 ! misho 64227: } ay;
1.2 misho 64228: struct OP_OpenEphemeral_stack_vars {
64229: VdbeCursor *pCx;
1.2.2.1 ! misho 64230: } az;
1.2 misho 64231: struct OP_SorterOpen_stack_vars {
64232: VdbeCursor *pCx;
1.2.2.1 ! misho 64233: } ba;
1.2 misho 64234: struct OP_OpenPseudo_stack_vars {
64235: VdbeCursor *pCx;
1.2.2.1 ! misho 64236: } bb;
1.2 misho 64237: struct OP_SeekGt_stack_vars {
64238: int res;
64239: int oc;
64240: VdbeCursor *pC;
64241: UnpackedRecord r;
64242: int nField;
64243: i64 iKey; /* The rowid we are to seek to */
1.2.2.1 ! misho 64244: } bc;
1.2 misho 64245: struct OP_Seek_stack_vars {
64246: VdbeCursor *pC;
1.2.2.1 ! misho 64247: } bd;
1.2 misho 64248: struct OP_Found_stack_vars {
64249: int alreadyExists;
64250: VdbeCursor *pC;
64251: int res;
64252: char *pFree;
64253: UnpackedRecord *pIdxKey;
64254: UnpackedRecord r;
64255: char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
1.2.2.1 ! misho 64256: } be;
1.2 misho 64257: struct OP_IsUnique_stack_vars {
64258: u16 ii;
64259: VdbeCursor *pCx;
64260: BtCursor *pCrsr;
64261: u16 nField;
64262: Mem *aMx;
64263: UnpackedRecord r; /* B-Tree index search key */
64264: i64 R; /* Rowid stored in register P3 */
1.2.2.1 ! misho 64265: } bf;
1.2 misho 64266: struct OP_NotExists_stack_vars {
64267: VdbeCursor *pC;
64268: BtCursor *pCrsr;
64269: int res;
64270: u64 iKey;
1.2.2.1 ! misho 64271: } bg;
1.2 misho 64272: struct OP_NewRowid_stack_vars {
64273: i64 v; /* The new rowid */
64274: VdbeCursor *pC; /* Cursor of table to get the new rowid */
64275: int res; /* Result of an sqlite3BtreeLast() */
64276: int cnt; /* Counter to limit the number of searches */
64277: Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */
64278: VdbeFrame *pFrame; /* Root frame of VDBE */
1.2.2.1 ! misho 64279: } bh;
1.2 misho 64280: struct OP_InsertInt_stack_vars {
64281: Mem *pData; /* MEM cell holding data for the record to be inserted */
64282: Mem *pKey; /* MEM cell holding key for the record */
64283: i64 iKey; /* The integer ROWID or key for the record to be inserted */
64284: VdbeCursor *pC; /* Cursor to table into which insert is written */
64285: int nZero; /* Number of zero-bytes to append */
64286: int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
64287: const char *zDb; /* database name - used by the update hook */
64288: const char *zTbl; /* Table name - used by the opdate hook */
64289: int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
1.2.2.1 ! misho 64290: } bi;
1.2 misho 64291: struct OP_Delete_stack_vars {
64292: i64 iKey;
64293: VdbeCursor *pC;
1.2.2.1 ! misho 64294: } bj;
1.2 misho 64295: struct OP_SorterCompare_stack_vars {
64296: VdbeCursor *pC;
64297: int res;
1.2.2.1 ! misho 64298: } bk;
1.2 misho 64299: struct OP_SorterData_stack_vars {
64300: VdbeCursor *pC;
1.2.2.1 ! misho 64301: } bl;
1.2 misho 64302: struct OP_RowData_stack_vars {
64303: VdbeCursor *pC;
64304: BtCursor *pCrsr;
64305: u32 n;
64306: i64 n64;
1.2.2.1 ! misho 64307: } bm;
1.2 misho 64308: struct OP_Rowid_stack_vars {
64309: VdbeCursor *pC;
64310: i64 v;
64311: sqlite3_vtab *pVtab;
64312: const sqlite3_module *pModule;
1.2.2.1 ! misho 64313: } bn;
1.2 misho 64314: struct OP_NullRow_stack_vars {
64315: VdbeCursor *pC;
1.2.2.1 ! misho 64316: } bo;
1.2 misho 64317: struct OP_Last_stack_vars {
64318: VdbeCursor *pC;
64319: BtCursor *pCrsr;
64320: int res;
1.2.2.1 ! misho 64321: } bp;
1.2 misho 64322: struct OP_Rewind_stack_vars {
64323: VdbeCursor *pC;
64324: BtCursor *pCrsr;
64325: int res;
1.2.2.1 ! misho 64326: } bq;
1.2 misho 64327: struct OP_Next_stack_vars {
64328: VdbeCursor *pC;
64329: int res;
1.2.2.1 ! misho 64330: } br;
1.2 misho 64331: struct OP_IdxInsert_stack_vars {
64332: VdbeCursor *pC;
64333: BtCursor *pCrsr;
64334: int nKey;
64335: const char *zKey;
1.2.2.1 ! misho 64336: } bs;
1.2 misho 64337: struct OP_IdxDelete_stack_vars {
64338: VdbeCursor *pC;
64339: BtCursor *pCrsr;
64340: int res;
64341: UnpackedRecord r;
1.2.2.1 ! misho 64342: } bt;
1.2 misho 64343: struct OP_IdxRowid_stack_vars {
64344: BtCursor *pCrsr;
64345: VdbeCursor *pC;
64346: i64 rowid;
1.2.2.1 ! misho 64347: } bu;
1.2 misho 64348: struct OP_IdxGE_stack_vars {
64349: VdbeCursor *pC;
64350: int res;
64351: UnpackedRecord r;
1.2.2.1 ! misho 64352: } bv;
1.2 misho 64353: struct OP_Destroy_stack_vars {
64354: int iMoved;
64355: int iCnt;
64356: Vdbe *pVdbe;
64357: int iDb;
1.2.2.1 ! misho 64358: } bw;
1.2 misho 64359: struct OP_Clear_stack_vars {
64360: int nChange;
1.2.2.1 ! misho 64361: } bx;
1.2 misho 64362: struct OP_CreateTable_stack_vars {
64363: int pgno;
64364: int flags;
64365: Db *pDb;
1.2.2.1 ! misho 64366: } by;
1.2 misho 64367: struct OP_ParseSchema_stack_vars {
64368: int iDb;
64369: const char *zMaster;
64370: char *zSql;
64371: InitData initData;
1.2.2.1 ! misho 64372: } bz;
1.2 misho 64373: struct OP_IntegrityCk_stack_vars {
64374: int nRoot; /* Number of tables to check. (Number of root pages.) */
64375: int *aRoot; /* Array of rootpage numbers for tables to be checked */
64376: int j; /* Loop counter */
64377: int nErr; /* Number of errors reported */
64378: char *z; /* Text of the error report */
64379: Mem *pnErr; /* Register keeping track of errors remaining */
1.2.2.1 ! misho 64380: } ca;
1.2 misho 64381: struct OP_RowSetRead_stack_vars {
64382: i64 val;
1.2.2.1 ! misho 64383: } cb;
1.2 misho 64384: struct OP_RowSetTest_stack_vars {
64385: int iSet;
64386: int exists;
1.2.2.1 ! misho 64387: } cc;
1.2 misho 64388: struct OP_Program_stack_vars {
64389: int nMem; /* Number of memory registers for sub-program */
64390: int nByte; /* Bytes of runtime space required for sub-program */
64391: Mem *pRt; /* Register to allocate runtime space */
64392: Mem *pMem; /* Used to iterate through memory cells */
64393: Mem *pEnd; /* Last memory cell in new array */
64394: VdbeFrame *pFrame; /* New vdbe frame to execute in */
64395: SubProgram *pProgram; /* Sub-program to execute */
64396: void *t; /* Token identifying trigger */
1.2.2.1 ! misho 64397: } cd;
1.2 misho 64398: struct OP_Param_stack_vars {
64399: VdbeFrame *pFrame;
64400: Mem *pIn;
1.2.2.1 ! misho 64401: } ce;
1.2 misho 64402: struct OP_MemMax_stack_vars {
64403: Mem *pIn1;
64404: VdbeFrame *pFrame;
1.2.2.1 ! misho 64405: } cf;
1.2 misho 64406: struct OP_AggStep_stack_vars {
64407: int n;
64408: int i;
64409: Mem *pMem;
64410: Mem *pRec;
64411: sqlite3_context ctx;
64412: sqlite3_value **apVal;
1.2.2.1 ! misho 64413: } cg;
1.2 misho 64414: struct OP_AggFinal_stack_vars {
64415: Mem *pMem;
1.2.2.1 ! misho 64416: } ch;
1.2 misho 64417: struct OP_Checkpoint_stack_vars {
64418: int i; /* Loop counter */
64419: int aRes[3]; /* Results */
64420: Mem *pMem; /* Write results here */
1.2.2.1 ! misho 64421: } ci;
1.2 misho 64422: struct OP_JournalMode_stack_vars {
64423: Btree *pBt; /* Btree to change journal mode of */
64424: Pager *pPager; /* Pager associated with pBt */
64425: int eNew; /* New journal mode */
64426: int eOld; /* The old journal mode */
1.2.2.1 ! misho 64427: #ifndef SQLITE_OMIT_WAL
1.2 misho 64428: const char *zFilename; /* Name of database file for pPager */
1.2.2.1 ! misho 64429: #endif
! 64430: } cj;
1.2 misho 64431: struct OP_IncrVacuum_stack_vars {
64432: Btree *pBt;
1.2.2.1 ! misho 64433: } ck;
1.2 misho 64434: struct OP_VBegin_stack_vars {
64435: VTable *pVTab;
1.2.2.1 ! misho 64436: } cl;
1.2 misho 64437: struct OP_VOpen_stack_vars {
64438: VdbeCursor *pCur;
64439: sqlite3_vtab_cursor *pVtabCursor;
64440: sqlite3_vtab *pVtab;
64441: sqlite3_module *pModule;
1.2.2.1 ! misho 64442: } cm;
1.2 misho 64443: struct OP_VFilter_stack_vars {
64444: int nArg;
64445: int iQuery;
64446: const sqlite3_module *pModule;
64447: Mem *pQuery;
64448: Mem *pArgc;
64449: sqlite3_vtab_cursor *pVtabCursor;
64450: sqlite3_vtab *pVtab;
64451: VdbeCursor *pCur;
64452: int res;
64453: int i;
64454: Mem **apArg;
1.2.2.1 ! misho 64455: } cn;
1.2 misho 64456: struct OP_VColumn_stack_vars {
64457: sqlite3_vtab *pVtab;
64458: const sqlite3_module *pModule;
64459: Mem *pDest;
64460: sqlite3_context sContext;
1.2.2.1 ! misho 64461: } co;
1.2 misho 64462: struct OP_VNext_stack_vars {
64463: sqlite3_vtab *pVtab;
64464: const sqlite3_module *pModule;
64465: int res;
64466: VdbeCursor *pCur;
1.2.2.1 ! misho 64467: } cp;
1.2 misho 64468: struct OP_VRename_stack_vars {
64469: sqlite3_vtab *pVtab;
64470: Mem *pName;
1.2.2.1 ! misho 64471: } cq;
1.2 misho 64472: struct OP_VUpdate_stack_vars {
64473: sqlite3_vtab *pVtab;
64474: sqlite3_module *pModule;
64475: int nArg;
64476: int i;
64477: sqlite_int64 rowid;
64478: Mem **apArg;
64479: Mem *pX;
1.2.2.1 ! misho 64480: } cr;
1.2 misho 64481: struct OP_Trace_stack_vars {
64482: char *zTrace;
64483: char *z;
1.2.2.1 ! misho 64484: } cs;
1.2 misho 64485: } u;
64486: /* End automatically generated code
64487: ********************************************************************/
64488:
64489: assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
64490: sqlite3VdbeEnter(p);
64491: if( p->rc==SQLITE_NOMEM ){
64492: /* This happens if a malloc() inside a call to sqlite3_column_text() or
64493: ** sqlite3_column_text16() failed. */
64494: goto no_mem;
64495: }
64496: assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
64497: p->rc = SQLITE_OK;
64498: assert( p->explain==0 );
64499: p->pResultSet = 0;
64500: db->busyHandler.nBusy = 0;
64501: CHECK_FOR_INTERRUPT;
64502: sqlite3VdbeIOTraceSql(p);
64503: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
64504: checkProgress = db->xProgress!=0;
64505: #endif
64506: #ifdef SQLITE_DEBUG
64507: sqlite3BeginBenignMalloc();
64508: if( p->pc==0 && (p->db->flags & SQLITE_VdbeListing)!=0 ){
64509: int i;
64510: printf("VDBE Program Listing:\n");
64511: sqlite3VdbePrintSql(p);
64512: for(i=0; i<p->nOp; i++){
64513: sqlite3VdbePrintOp(stdout, i, &aOp[i]);
64514: }
64515: }
64516: sqlite3EndBenignMalloc();
64517: #endif
64518: for(pc=p->pc; rc==SQLITE_OK; pc++){
64519: assert( pc>=0 && pc<p->nOp );
64520: if( db->mallocFailed ) goto no_mem;
64521: #ifdef VDBE_PROFILE
64522: origPc = pc;
64523: start = sqlite3Hwtime();
64524: #endif
64525: pOp = &aOp[pc];
64526:
64527: /* Only allow tracing if SQLITE_DEBUG is defined.
64528: */
64529: #ifdef SQLITE_DEBUG
64530: if( p->trace ){
64531: if( pc==0 ){
64532: printf("VDBE Execution Trace:\n");
64533: sqlite3VdbePrintSql(p);
64534: }
64535: sqlite3VdbePrintOp(p->trace, pc, pOp);
64536: }
64537: #endif
64538:
64539:
64540: /* Check to see if we need to simulate an interrupt. This only happens
64541: ** if we have a special test build.
64542: */
64543: #ifdef SQLITE_TEST
64544: if( sqlite3_interrupt_count>0 ){
64545: sqlite3_interrupt_count--;
64546: if( sqlite3_interrupt_count==0 ){
64547: sqlite3_interrupt(db);
64548: }
64549: }
64550: #endif
64551:
64552: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
64553: /* Call the progress callback if it is configured and the required number
64554: ** of VDBE ops have been executed (either since this invocation of
64555: ** sqlite3VdbeExec() or since last time the progress callback was called).
64556: ** If the progress callback returns non-zero, exit the virtual machine with
64557: ** a return code SQLITE_ABORT.
64558: */
64559: if( checkProgress ){
64560: if( db->nProgressOps==nProgressOps ){
64561: int prc;
64562: prc = db->xProgress(db->pProgressArg);
64563: if( prc!=0 ){
64564: rc = SQLITE_INTERRUPT;
64565: goto vdbe_error_halt;
64566: }
64567: nProgressOps = 0;
64568: }
64569: nProgressOps++;
64570: }
64571: #endif
64572:
1.2.2.1 ! misho 64573: /* On any opcode with the "out2-prerelease" tag, free any
1.2 misho 64574: ** external allocations out of mem[p2] and set mem[p2] to be
64575: ** an undefined integer. Opcodes will either fill in the integer
64576: ** value or convert mem[p2] to a different type.
64577: */
64578: assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] );
64579: if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){
64580: assert( pOp->p2>0 );
64581: assert( pOp->p2<=p->nMem );
64582: pOut = &aMem[pOp->p2];
64583: memAboutToChange(p, pOut);
64584: VdbeMemRelease(pOut);
64585: pOut->flags = MEM_Int;
64586: }
64587:
64588: /* Sanity checking on other operands */
64589: #ifdef SQLITE_DEBUG
64590: if( (pOp->opflags & OPFLG_IN1)!=0 ){
64591: assert( pOp->p1>0 );
64592: assert( pOp->p1<=p->nMem );
64593: assert( memIsValid(&aMem[pOp->p1]) );
64594: REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]);
64595: }
64596: if( (pOp->opflags & OPFLG_IN2)!=0 ){
64597: assert( pOp->p2>0 );
64598: assert( pOp->p2<=p->nMem );
64599: assert( memIsValid(&aMem[pOp->p2]) );
64600: REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]);
64601: }
64602: if( (pOp->opflags & OPFLG_IN3)!=0 ){
64603: assert( pOp->p3>0 );
64604: assert( pOp->p3<=p->nMem );
64605: assert( memIsValid(&aMem[pOp->p3]) );
64606: REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]);
64607: }
64608: if( (pOp->opflags & OPFLG_OUT2)!=0 ){
64609: assert( pOp->p2>0 );
64610: assert( pOp->p2<=p->nMem );
64611: memAboutToChange(p, &aMem[pOp->p2]);
64612: }
64613: if( (pOp->opflags & OPFLG_OUT3)!=0 ){
64614: assert( pOp->p3>0 );
64615: assert( pOp->p3<=p->nMem );
64616: memAboutToChange(p, &aMem[pOp->p3]);
64617: }
64618: #endif
64619:
64620: switch( pOp->opcode ){
64621:
64622: /*****************************************************************************
64623: ** What follows is a massive switch statement where each case implements a
64624: ** separate instruction in the virtual machine. If we follow the usual
64625: ** indentation conventions, each case should be indented by 6 spaces. But
64626: ** that is a lot of wasted space on the left margin. So the code within
64627: ** the switch statement will break with convention and be flush-left. Another
64628: ** big comment (similar to this one) will mark the point in the code where
64629: ** we transition back to normal indentation.
64630: **
64631: ** The formatting of each case is important. The makefile for SQLite
64632: ** generates two C files "opcodes.h" and "opcodes.c" by scanning this
64633: ** file looking for lines that begin with "case OP_". The opcodes.h files
64634: ** will be filled with #defines that give unique integer values to each
64635: ** opcode and the opcodes.c file is filled with an array of strings where
64636: ** each string is the symbolic name for the corresponding opcode. If the
64637: ** case statement is followed by a comment of the form "/# same as ... #/"
64638: ** that comment is used to determine the particular value of the opcode.
64639: **
64640: ** Other keywords in the comment that follows each case are used to
64641: ** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[].
64642: ** Keywords include: in1, in2, in3, out2_prerelease, out2, out3. See
64643: ** the mkopcodeh.awk script for additional information.
64644: **
64645: ** Documentation about VDBE opcodes is generated by scanning this file
64646: ** for lines of that contain "Opcode:". That line and all subsequent
64647: ** comment lines are used in the generation of the opcode.html documentation
64648: ** file.
64649: **
64650: ** SUMMARY:
64651: **
64652: ** Formatting is important to scripts that scan this file.
64653: ** Do not deviate from the formatting style currently in use.
64654: **
64655: *****************************************************************************/
64656:
64657: /* Opcode: Goto * P2 * * *
64658: **
64659: ** An unconditional jump to address P2.
64660: ** The next instruction executed will be
64661: ** the one at index P2 from the beginning of
64662: ** the program.
64663: */
64664: case OP_Goto: { /* jump */
64665: CHECK_FOR_INTERRUPT;
64666: pc = pOp->p2 - 1;
64667: break;
64668: }
64669:
64670: /* Opcode: Gosub P1 P2 * * *
64671: **
64672: ** Write the current address onto register P1
64673: ** and then jump to address P2.
64674: */
64675: case OP_Gosub: { /* jump */
64676: assert( pOp->p1>0 && pOp->p1<=p->nMem );
64677: pIn1 = &aMem[pOp->p1];
64678: assert( (pIn1->flags & MEM_Dyn)==0 );
64679: memAboutToChange(p, pIn1);
64680: pIn1->flags = MEM_Int;
64681: pIn1->u.i = pc;
64682: REGISTER_TRACE(pOp->p1, pIn1);
64683: pc = pOp->p2 - 1;
64684: break;
64685: }
64686:
64687: /* Opcode: Return P1 * * * *
64688: **
64689: ** Jump to the next instruction after the address in register P1.
64690: */
64691: case OP_Return: { /* in1 */
64692: pIn1 = &aMem[pOp->p1];
64693: assert( pIn1->flags & MEM_Int );
64694: pc = (int)pIn1->u.i;
64695: break;
64696: }
64697:
64698: /* Opcode: Yield P1 * * * *
64699: **
64700: ** Swap the program counter with the value in register P1.
64701: */
64702: case OP_Yield: { /* in1 */
64703: #if 0 /* local variables moved into u.aa */
64704: int pcDest;
64705: #endif /* local variables moved into u.aa */
64706: pIn1 = &aMem[pOp->p1];
64707: assert( (pIn1->flags & MEM_Dyn)==0 );
64708: pIn1->flags = MEM_Int;
64709: u.aa.pcDest = (int)pIn1->u.i;
64710: pIn1->u.i = pc;
64711: REGISTER_TRACE(pOp->p1, pIn1);
64712: pc = u.aa.pcDest;
64713: break;
64714: }
64715:
64716: /* Opcode: HaltIfNull P1 P2 P3 P4 *
64717: **
64718: ** Check the value in register P3. If it is NULL then Halt using
64719: ** parameter P1, P2, and P4 as if this were a Halt instruction. If the
64720: ** value in register P3 is not NULL, then this routine is a no-op.
64721: */
64722: case OP_HaltIfNull: { /* in3 */
64723: pIn3 = &aMem[pOp->p3];
64724: if( (pIn3->flags & MEM_Null)==0 ) break;
64725: /* Fall through into OP_Halt */
64726: }
64727:
64728: /* Opcode: Halt P1 P2 * P4 *
64729: **
64730: ** Exit immediately. All open cursors, etc are closed
64731: ** automatically.
64732: **
64733: ** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(),
64734: ** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0).
64735: ** For errors, it can be some other value. If P1!=0 then P2 will determine
64736: ** whether or not to rollback the current transaction. Do not rollback
64737: ** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort,
64738: ** then back out all changes that have occurred during this execution of the
64739: ** VDBE, but do not rollback the transaction.
64740: **
64741: ** If P4 is not null then it is an error message string.
64742: **
64743: ** There is an implied "Halt 0 0 0" instruction inserted at the very end of
64744: ** every program. So a jump past the last instruction of the program
64745: ** is the same as executing Halt.
64746: */
64747: case OP_Halt: {
64748: if( pOp->p1==SQLITE_OK && p->pFrame ){
64749: /* Halt the sub-program. Return control to the parent frame. */
64750: VdbeFrame *pFrame = p->pFrame;
64751: p->pFrame = pFrame->pParent;
64752: p->nFrame--;
64753: sqlite3VdbeSetChanges(db, p->nChange);
64754: pc = sqlite3VdbeFrameRestore(pFrame);
64755: lastRowid = db->lastRowid;
64756: if( pOp->p2==OE_Ignore ){
64757: /* Instruction pc is the OP_Program that invoked the sub-program
64758: ** currently being halted. If the p2 instruction of this OP_Halt
64759: ** instruction is set to OE_Ignore, then the sub-program is throwing
64760: ** an IGNORE exception. In this case jump to the address specified
64761: ** as the p2 of the calling OP_Program. */
64762: pc = p->aOp[pc].p2-1;
64763: }
64764: aOp = p->aOp;
64765: aMem = p->aMem;
64766: break;
64767: }
64768:
64769: p->rc = pOp->p1;
64770: p->errorAction = (u8)pOp->p2;
64771: p->pc = pc;
64772: if( pOp->p4.z ){
64773: assert( p->rc!=SQLITE_OK );
64774: sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z);
64775: testcase( sqlite3GlobalConfig.xLog!=0 );
64776: sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pc, p->zSql, pOp->p4.z);
64777: }else if( p->rc ){
64778: testcase( sqlite3GlobalConfig.xLog!=0 );
64779: sqlite3_log(pOp->p1, "constraint failed at %d in [%s]", pc, p->zSql);
64780: }
64781: rc = sqlite3VdbeHalt(p);
64782: assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR );
64783: if( rc==SQLITE_BUSY ){
64784: p->rc = rc = SQLITE_BUSY;
64785: }else{
64786: assert( rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT );
64787: assert( rc==SQLITE_OK || db->nDeferredCons>0 );
64788: rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
64789: }
64790: goto vdbe_return;
64791: }
64792:
64793: /* Opcode: Integer P1 P2 * * *
64794: **
64795: ** The 32-bit integer value P1 is written into register P2.
64796: */
64797: case OP_Integer: { /* out2-prerelease */
64798: pOut->u.i = pOp->p1;
64799: break;
64800: }
64801:
64802: /* Opcode: Int64 * P2 * P4 *
64803: **
64804: ** P4 is a pointer to a 64-bit integer value.
64805: ** Write that value into register P2.
64806: */
64807: case OP_Int64: { /* out2-prerelease */
64808: assert( pOp->p4.pI64!=0 );
64809: pOut->u.i = *pOp->p4.pI64;
64810: break;
64811: }
64812:
64813: #ifndef SQLITE_OMIT_FLOATING_POINT
64814: /* Opcode: Real * P2 * P4 *
64815: **
64816: ** P4 is a pointer to a 64-bit floating point value.
64817: ** Write that value into register P2.
64818: */
64819: case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
64820: pOut->flags = MEM_Real;
64821: assert( !sqlite3IsNaN(*pOp->p4.pReal) );
64822: pOut->r = *pOp->p4.pReal;
64823: break;
64824: }
64825: #endif
64826:
64827: /* Opcode: String8 * P2 * P4 *
64828: **
64829: ** P4 points to a nul terminated UTF-8 string. This opcode is transformed
64830: ** into an OP_String before it is executed for the first time.
64831: */
64832: case OP_String8: { /* same as TK_STRING, out2-prerelease */
64833: assert( pOp->p4.z!=0 );
64834: pOp->opcode = OP_String;
64835: pOp->p1 = sqlite3Strlen30(pOp->p4.z);
64836:
64837: #ifndef SQLITE_OMIT_UTF16
64838: if( encoding!=SQLITE_UTF8 ){
64839: rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
64840: if( rc==SQLITE_TOOBIG ) goto too_big;
64841: if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem;
64842: assert( pOut->zMalloc==pOut->z );
64843: assert( pOut->flags & MEM_Dyn );
64844: pOut->zMalloc = 0;
64845: pOut->flags |= MEM_Static;
64846: pOut->flags &= ~MEM_Dyn;
64847: if( pOp->p4type==P4_DYNAMIC ){
64848: sqlite3DbFree(db, pOp->p4.z);
64849: }
64850: pOp->p4type = P4_DYNAMIC;
64851: pOp->p4.z = pOut->z;
64852: pOp->p1 = pOut->n;
64853: }
64854: #endif
64855: if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
64856: goto too_big;
64857: }
64858: /* Fall through to the next case, OP_String */
64859: }
64860:
64861: /* Opcode: String P1 P2 * P4 *
64862: **
64863: ** The string value P4 of length P1 (bytes) is stored in register P2.
64864: */
64865: case OP_String: { /* out2-prerelease */
64866: assert( pOp->p4.z!=0 );
64867: pOut->flags = MEM_Str|MEM_Static|MEM_Term;
64868: pOut->z = pOp->p4.z;
64869: pOut->n = pOp->p1;
64870: pOut->enc = encoding;
64871: UPDATE_MAX_BLOBSIZE(pOut);
64872: break;
64873: }
64874:
1.2.2.1 ! misho 64875: /* Opcode: Null P1 P2 P3 * *
1.2 misho 64876: **
64877: ** Write a NULL into registers P2. If P3 greater than P2, then also write
1.2.2.1 ! misho 64878: ** NULL into register P3 and every register in between P2 and P3. If P3
1.2 misho 64879: ** is less than P2 (typically P3 is zero) then only register P2 is
1.2.2.1 ! misho 64880: ** set to NULL.
! 64881: **
! 64882: ** If the P1 value is non-zero, then also set the MEM_Cleared flag so that
! 64883: ** NULL values will not compare equal even if SQLITE_NULLEQ is set on
! 64884: ** OP_Ne or OP_Eq.
1.2 misho 64885: */
64886: case OP_Null: { /* out2-prerelease */
64887: #if 0 /* local variables moved into u.ab */
64888: int cnt;
1.2.2.1 ! misho 64889: u16 nullFlag;
1.2 misho 64890: #endif /* local variables moved into u.ab */
64891: u.ab.cnt = pOp->p3-pOp->p2;
64892: assert( pOp->p3<=p->nMem );
1.2.2.1 ! misho 64893: pOut->flags = u.ab.nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null;
1.2 misho 64894: while( u.ab.cnt>0 ){
64895: pOut++;
64896: memAboutToChange(p, pOut);
64897: VdbeMemRelease(pOut);
1.2.2.1 ! misho 64898: pOut->flags = u.ab.nullFlag;
1.2 misho 64899: u.ab.cnt--;
64900: }
64901: break;
64902: }
64903:
64904:
64905: /* Opcode: Blob P1 P2 * P4
64906: **
64907: ** P4 points to a blob of data P1 bytes long. Store this
64908: ** blob in register P2.
64909: */
64910: case OP_Blob: { /* out2-prerelease */
64911: assert( pOp->p1 <= SQLITE_MAX_LENGTH );
64912: sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
64913: pOut->enc = encoding;
64914: UPDATE_MAX_BLOBSIZE(pOut);
64915: break;
64916: }
64917:
64918: /* Opcode: Variable P1 P2 * P4 *
64919: **
64920: ** Transfer the values of bound parameter P1 into register P2
64921: **
64922: ** If the parameter is named, then its name appears in P4 and P3==1.
64923: ** The P4 value is used by sqlite3_bind_parameter_name().
64924: */
64925: case OP_Variable: { /* out2-prerelease */
64926: #if 0 /* local variables moved into u.ac */
64927: Mem *pVar; /* Value being transferred */
64928: #endif /* local variables moved into u.ac */
64929:
64930: assert( pOp->p1>0 && pOp->p1<=p->nVar );
64931: assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] );
64932: u.ac.pVar = &p->aVar[pOp->p1 - 1];
64933: if( sqlite3VdbeMemTooBig(u.ac.pVar) ){
64934: goto too_big;
64935: }
64936: sqlite3VdbeMemShallowCopy(pOut, u.ac.pVar, MEM_Static);
64937: UPDATE_MAX_BLOBSIZE(pOut);
64938: break;
64939: }
64940:
64941: /* Opcode: Move P1 P2 P3 * *
64942: **
1.2.2.1 ! misho 64943: ** Move the values in register P1..P1+P3 over into
! 64944: ** registers P2..P2+P3. Registers P1..P1+P3 are
1.2 misho 64945: ** left holding a NULL. It is an error for register ranges
1.2.2.1 ! misho 64946: ** P1..P1+P3 and P2..P2+P3 to overlap.
1.2 misho 64947: */
64948: case OP_Move: {
64949: #if 0 /* local variables moved into u.ad */
64950: char *zMalloc; /* Holding variable for allocated memory */
64951: int n; /* Number of registers left to copy */
64952: int p1; /* Register to copy from */
64953: int p2; /* Register to copy to */
64954: #endif /* local variables moved into u.ad */
64955:
1.2.2.1 ! misho 64956: u.ad.n = pOp->p3 + 1;
1.2 misho 64957: u.ad.p1 = pOp->p1;
64958: u.ad.p2 = pOp->p2;
64959: assert( u.ad.n>0 && u.ad.p1>0 && u.ad.p2>0 );
64960: assert( u.ad.p1+u.ad.n<=u.ad.p2 || u.ad.p2+u.ad.n<=u.ad.p1 );
64961:
64962: pIn1 = &aMem[u.ad.p1];
64963: pOut = &aMem[u.ad.p2];
64964: while( u.ad.n-- ){
64965: assert( pOut<=&aMem[p->nMem] );
64966: assert( pIn1<=&aMem[p->nMem] );
64967: assert( memIsValid(pIn1) );
64968: memAboutToChange(p, pOut);
64969: u.ad.zMalloc = pOut->zMalloc;
64970: pOut->zMalloc = 0;
64971: sqlite3VdbeMemMove(pOut, pIn1);
64972: #ifdef SQLITE_DEBUG
64973: if( pOut->pScopyFrom>=&aMem[u.ad.p1] && pOut->pScopyFrom<&aMem[u.ad.p1+pOp->p3] ){
64974: pOut->pScopyFrom += u.ad.p1 - pOp->p2;
64975: }
64976: #endif
64977: pIn1->zMalloc = u.ad.zMalloc;
64978: REGISTER_TRACE(u.ad.p2++, pOut);
64979: pIn1++;
64980: pOut++;
64981: }
64982: break;
64983: }
64984:
1.2.2.1 ! misho 64985: /* Opcode: Copy P1 P2 P3 * *
1.2 misho 64986: **
1.2.2.1 ! misho 64987: ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3.
1.2 misho 64988: **
64989: ** This instruction makes a deep copy of the value. A duplicate
64990: ** is made of any string or blob constant. See also OP_SCopy.
64991: */
1.2.2.1 ! misho 64992: case OP_Copy: {
! 64993: #if 0 /* local variables moved into u.ae */
! 64994: int n;
! 64995: #endif /* local variables moved into u.ae */
! 64996:
! 64997: u.ae.n = pOp->p3;
1.2 misho 64998: pIn1 = &aMem[pOp->p1];
64999: pOut = &aMem[pOp->p2];
65000: assert( pOut!=pIn1 );
1.2.2.1 ! misho 65001: while( 1 ){
! 65002: sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
! 65003: Deephemeralize(pOut);
! 65004: #ifdef SQLITE_DEBUG
! 65005: pOut->pScopyFrom = 0;
! 65006: #endif
! 65007: REGISTER_TRACE(pOp->p2+pOp->p3-u.ae.n, pOut);
! 65008: if( (u.ae.n--)==0 ) break;
! 65009: pOut++;
! 65010: pIn1++;
! 65011: }
1.2 misho 65012: break;
65013: }
65014:
65015: /* Opcode: SCopy P1 P2 * * *
65016: **
65017: ** Make a shallow copy of register P1 into register P2.
65018: **
65019: ** This instruction makes a shallow copy of the value. If the value
65020: ** is a string or blob, then the copy is only a pointer to the
65021: ** original and hence if the original changes so will the copy.
65022: ** Worse, if the original is deallocated, the copy becomes invalid.
65023: ** Thus the program must guarantee that the original will not change
65024: ** during the lifetime of the copy. Use OP_Copy to make a complete
65025: ** copy.
65026: */
65027: case OP_SCopy: { /* in1, out2 */
65028: pIn1 = &aMem[pOp->p1];
65029: pOut = &aMem[pOp->p2];
65030: assert( pOut!=pIn1 );
65031: sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
65032: #ifdef SQLITE_DEBUG
65033: if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1;
65034: #endif
65035: REGISTER_TRACE(pOp->p2, pOut);
65036: break;
65037: }
65038:
65039: /* Opcode: ResultRow P1 P2 * * *
65040: **
65041: ** The registers P1 through P1+P2-1 contain a single row of
65042: ** results. This opcode causes the sqlite3_step() call to terminate
65043: ** with an SQLITE_ROW return code and it sets up the sqlite3_stmt
65044: ** structure to provide access to the top P1 values as the result
65045: ** row.
65046: */
65047: case OP_ResultRow: {
1.2.2.1 ! misho 65048: #if 0 /* local variables moved into u.af */
1.2 misho 65049: Mem *pMem;
65050: int i;
1.2.2.1 ! misho 65051: #endif /* local variables moved into u.af */
1.2 misho 65052: assert( p->nResColumn==pOp->p2 );
65053: assert( pOp->p1>0 );
65054: assert( pOp->p1+pOp->p2<=p->nMem+1 );
65055:
65056: /* If this statement has violated immediate foreign key constraints, do
65057: ** not return the number of rows modified. And do not RELEASE the statement
65058: ** transaction. It needs to be rolled back. */
65059: if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){
65060: assert( db->flags&SQLITE_CountRows );
65061: assert( p->usesStmtJournal );
65062: break;
65063: }
65064:
65065: /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then
65066: ** DML statements invoke this opcode to return the number of rows
65067: ** modified to the user. This is the only way that a VM that
65068: ** opens a statement transaction may invoke this opcode.
65069: **
65070: ** In case this is such a statement, close any statement transaction
65071: ** opened by this VM before returning control to the user. This is to
65072: ** ensure that statement-transactions are always nested, not overlapping.
65073: ** If the open statement-transaction is not closed here, then the user
65074: ** may step another VM that opens its own statement transaction. This
65075: ** may lead to overlapping statement transactions.
65076: **
65077: ** The statement transaction is never a top-level transaction. Hence
65078: ** the RELEASE call below can never fail.
65079: */
65080: assert( p->iStatement==0 || db->flags&SQLITE_CountRows );
65081: rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE);
65082: if( NEVER(rc!=SQLITE_OK) ){
65083: break;
65084: }
65085:
65086: /* Invalidate all ephemeral cursor row caches */
65087: p->cacheCtr = (p->cacheCtr + 2)|1;
65088:
65089: /* Make sure the results of the current row are \000 terminated
65090: ** and have an assigned type. The results are de-ephemeralized as
65091: ** a side effect.
65092: */
1.2.2.1 ! misho 65093: u.af.pMem = p->pResultSet = &aMem[pOp->p1];
! 65094: for(u.af.i=0; u.af.i<pOp->p2; u.af.i++){
! 65095: assert( memIsValid(&u.af.pMem[u.af.i]) );
! 65096: Deephemeralize(&u.af.pMem[u.af.i]);
! 65097: assert( (u.af.pMem[u.af.i].flags & MEM_Ephem)==0
! 65098: || (u.af.pMem[u.af.i].flags & (MEM_Str|MEM_Blob))==0 );
! 65099: sqlite3VdbeMemNulTerminate(&u.af.pMem[u.af.i]);
! 65100: sqlite3VdbeMemStoreType(&u.af.pMem[u.af.i]);
! 65101: REGISTER_TRACE(pOp->p1+u.af.i, &u.af.pMem[u.af.i]);
1.2 misho 65102: }
65103: if( db->mallocFailed ) goto no_mem;
65104:
65105: /* Return SQLITE_ROW
65106: */
65107: p->pc = pc + 1;
65108: rc = SQLITE_ROW;
65109: goto vdbe_return;
65110: }
65111:
65112: /* Opcode: Concat P1 P2 P3 * *
65113: **
65114: ** Add the text in register P1 onto the end of the text in
65115: ** register P2 and store the result in register P3.
65116: ** If either the P1 or P2 text are NULL then store NULL in P3.
65117: **
65118: ** P3 = P2 || P1
65119: **
65120: ** It is illegal for P1 and P3 to be the same register. Sometimes,
65121: ** if P3 is the same register as P2, the implementation is able
65122: ** to avoid a memcpy().
65123: */
65124: case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
1.2.2.1 ! misho 65125: #if 0 /* local variables moved into u.ag */
1.2 misho 65126: i64 nByte;
1.2.2.1 ! misho 65127: #endif /* local variables moved into u.ag */
1.2 misho 65128:
65129: pIn1 = &aMem[pOp->p1];
65130: pIn2 = &aMem[pOp->p2];
65131: pOut = &aMem[pOp->p3];
65132: assert( pIn1!=pOut );
65133: if( (pIn1->flags | pIn2->flags) & MEM_Null ){
65134: sqlite3VdbeMemSetNull(pOut);
65135: break;
65136: }
65137: if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem;
65138: Stringify(pIn1, encoding);
65139: Stringify(pIn2, encoding);
1.2.2.1 ! misho 65140: u.ag.nByte = pIn1->n + pIn2->n;
! 65141: if( u.ag.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
1.2 misho 65142: goto too_big;
65143: }
65144: MemSetTypeFlag(pOut, MEM_Str);
1.2.2.1 ! misho 65145: if( sqlite3VdbeMemGrow(pOut, (int)u.ag.nByte+2, pOut==pIn2) ){
1.2 misho 65146: goto no_mem;
65147: }
65148: if( pOut!=pIn2 ){
65149: memcpy(pOut->z, pIn2->z, pIn2->n);
65150: }
65151: memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
1.2.2.1 ! misho 65152: pOut->z[u.ag.nByte] = 0;
! 65153: pOut->z[u.ag.nByte+1] = 0;
1.2 misho 65154: pOut->flags |= MEM_Term;
1.2.2.1 ! misho 65155: pOut->n = (int)u.ag.nByte;
1.2 misho 65156: pOut->enc = encoding;
65157: UPDATE_MAX_BLOBSIZE(pOut);
65158: break;
65159: }
65160:
65161: /* Opcode: Add P1 P2 P3 * *
65162: **
65163: ** Add the value in register P1 to the value in register P2
65164: ** and store the result in register P3.
65165: ** If either input is NULL, the result is NULL.
65166: */
65167: /* Opcode: Multiply P1 P2 P3 * *
65168: **
65169: **
65170: ** Multiply the value in register P1 by the value in register P2
65171: ** and store the result in register P3.
65172: ** If either input is NULL, the result is NULL.
65173: */
65174: /* Opcode: Subtract P1 P2 P3 * *
65175: **
65176: ** Subtract the value in register P1 from the value in register P2
65177: ** and store the result in register P3.
65178: ** If either input is NULL, the result is NULL.
65179: */
65180: /* Opcode: Divide P1 P2 P3 * *
65181: **
65182: ** Divide the value in register P1 by the value in register P2
65183: ** and store the result in register P3 (P3=P2/P1). If the value in
65184: ** register P1 is zero, then the result is NULL. If either input is
65185: ** NULL, the result is NULL.
65186: */
65187: /* Opcode: Remainder P1 P2 P3 * *
65188: **
65189: ** Compute the remainder after integer division of the value in
65190: ** register P1 by the value in register P2 and store the result in P3.
65191: ** If the value in register P2 is zero the result is NULL.
65192: ** If either operand is NULL, the result is NULL.
65193: */
65194: case OP_Add: /* same as TK_PLUS, in1, in2, out3 */
65195: case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */
65196: case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */
65197: case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */
65198: case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
1.2.2.1 ! misho 65199: #if 0 /* local variables moved into u.ah */
! 65200: char bIntint; /* Started out as two integer operands */
1.2 misho 65201: int flags; /* Combined MEM_* flags from both inputs */
65202: i64 iA; /* Integer value of left operand */
65203: i64 iB; /* Integer value of right operand */
65204: double rA; /* Real value of left operand */
65205: double rB; /* Real value of right operand */
1.2.2.1 ! misho 65206: #endif /* local variables moved into u.ah */
1.2 misho 65207:
65208: pIn1 = &aMem[pOp->p1];
65209: applyNumericAffinity(pIn1);
65210: pIn2 = &aMem[pOp->p2];
65211: applyNumericAffinity(pIn2);
65212: pOut = &aMem[pOp->p3];
1.2.2.1 ! misho 65213: u.ah.flags = pIn1->flags | pIn2->flags;
! 65214: if( (u.ah.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
1.2 misho 65215: if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){
1.2.2.1 ! misho 65216: u.ah.iA = pIn1->u.i;
! 65217: u.ah.iB = pIn2->u.i;
! 65218: u.ah.bIntint = 1;
1.2 misho 65219: switch( pOp->opcode ){
1.2.2.1 ! misho 65220: case OP_Add: if( sqlite3AddInt64(&u.ah.iB,u.ah.iA) ) goto fp_math; break;
! 65221: case OP_Subtract: if( sqlite3SubInt64(&u.ah.iB,u.ah.iA) ) goto fp_math; break;
! 65222: case OP_Multiply: if( sqlite3MulInt64(&u.ah.iB,u.ah.iA) ) goto fp_math; break;
1.2 misho 65223: case OP_Divide: {
1.2.2.1 ! misho 65224: if( u.ah.iA==0 ) goto arithmetic_result_is_null;
! 65225: if( u.ah.iA==-1 && u.ah.iB==SMALLEST_INT64 ) goto fp_math;
! 65226: u.ah.iB /= u.ah.iA;
1.2 misho 65227: break;
65228: }
65229: default: {
1.2.2.1 ! misho 65230: if( u.ah.iA==0 ) goto arithmetic_result_is_null;
! 65231: if( u.ah.iA==-1 ) u.ah.iA = 1;
! 65232: u.ah.iB %= u.ah.iA;
1.2 misho 65233: break;
65234: }
65235: }
1.2.2.1 ! misho 65236: pOut->u.i = u.ah.iB;
1.2 misho 65237: MemSetTypeFlag(pOut, MEM_Int);
65238: }else{
1.2.2.1 ! misho 65239: u.ah.bIntint = 0;
1.2 misho 65240: fp_math:
1.2.2.1 ! misho 65241: u.ah.rA = sqlite3VdbeRealValue(pIn1);
! 65242: u.ah.rB = sqlite3VdbeRealValue(pIn2);
1.2 misho 65243: switch( pOp->opcode ){
1.2.2.1 ! misho 65244: case OP_Add: u.ah.rB += u.ah.rA; break;
! 65245: case OP_Subtract: u.ah.rB -= u.ah.rA; break;
! 65246: case OP_Multiply: u.ah.rB *= u.ah.rA; break;
1.2 misho 65247: case OP_Divide: {
65248: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
1.2.2.1 ! misho 65249: if( u.ah.rA==(double)0 ) goto arithmetic_result_is_null;
! 65250: u.ah.rB /= u.ah.rA;
1.2 misho 65251: break;
65252: }
65253: default: {
1.2.2.1 ! misho 65254: u.ah.iA = (i64)u.ah.rA;
! 65255: u.ah.iB = (i64)u.ah.rB;
! 65256: if( u.ah.iA==0 ) goto arithmetic_result_is_null;
! 65257: if( u.ah.iA==-1 ) u.ah.iA = 1;
! 65258: u.ah.rB = (double)(u.ah.iB % u.ah.iA);
1.2 misho 65259: break;
65260: }
65261: }
65262: #ifdef SQLITE_OMIT_FLOATING_POINT
1.2.2.1 ! misho 65263: pOut->u.i = u.ah.rB;
1.2 misho 65264: MemSetTypeFlag(pOut, MEM_Int);
65265: #else
1.2.2.1 ! misho 65266: if( sqlite3IsNaN(u.ah.rB) ){
1.2 misho 65267: goto arithmetic_result_is_null;
65268: }
1.2.2.1 ! misho 65269: pOut->r = u.ah.rB;
1.2 misho 65270: MemSetTypeFlag(pOut, MEM_Real);
1.2.2.1 ! misho 65271: if( (u.ah.flags & MEM_Real)==0 && !u.ah.bIntint ){
1.2 misho 65272: sqlite3VdbeIntegerAffinity(pOut);
65273: }
65274: #endif
65275: }
65276: break;
65277:
65278: arithmetic_result_is_null:
65279: sqlite3VdbeMemSetNull(pOut);
65280: break;
65281: }
65282:
1.2.2.1 ! misho 65283: /* Opcode: CollSeq P1 * * P4
1.2 misho 65284: **
65285: ** P4 is a pointer to a CollSeq struct. If the next call to a user function
65286: ** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will
65287: ** be returned. This is used by the built-in min(), max() and nullif()
65288: ** functions.
65289: **
1.2.2.1 ! misho 65290: ** If P1 is not zero, then it is a register that a subsequent min() or
! 65291: ** max() aggregate will set to 1 if the current row is not the minimum or
! 65292: ** maximum. The P1 register is initialized to 0 by this instruction.
! 65293: **
1.2 misho 65294: ** The interface used by the implementation of the aforementioned functions
65295: ** to retrieve the collation sequence set by this opcode is not available
65296: ** publicly, only to user functions defined in func.c.
65297: */
65298: case OP_CollSeq: {
65299: assert( pOp->p4type==P4_COLLSEQ );
1.2.2.1 ! misho 65300: if( pOp->p1 ){
! 65301: sqlite3VdbeMemSetInt64(&aMem[pOp->p1], 0);
! 65302: }
1.2 misho 65303: break;
65304: }
65305:
65306: /* Opcode: Function P1 P2 P3 P4 P5
65307: **
65308: ** Invoke a user function (P4 is a pointer to a Function structure that
65309: ** defines the function) with P5 arguments taken from register P2 and
65310: ** successors. The result of the function is stored in register P3.
65311: ** Register P3 must not be one of the function inputs.
65312: **
65313: ** P1 is a 32-bit bitmask indicating whether or not each argument to the
65314: ** function was determined to be constant at compile time. If the first
65315: ** argument was constant then bit 0 of P1 is set. This is used to determine
65316: ** whether meta data associated with a user function argument using the
65317: ** sqlite3_set_auxdata() API may be safely retained until the next
65318: ** invocation of this opcode.
65319: **
65320: ** See also: AggStep and AggFinal
65321: */
65322: case OP_Function: {
1.2.2.1 ! misho 65323: #if 0 /* local variables moved into u.ai */
1.2 misho 65324: int i;
65325: Mem *pArg;
65326: sqlite3_context ctx;
65327: sqlite3_value **apVal;
65328: int n;
1.2.2.1 ! misho 65329: #endif /* local variables moved into u.ai */
1.2 misho 65330:
1.2.2.1 ! misho 65331: u.ai.n = pOp->p5;
! 65332: u.ai.apVal = p->apArg;
! 65333: assert( u.ai.apVal || u.ai.n==0 );
1.2 misho 65334: assert( pOp->p3>0 && pOp->p3<=p->nMem );
65335: pOut = &aMem[pOp->p3];
65336: memAboutToChange(p, pOut);
65337:
1.2.2.1 ! misho 65338: assert( u.ai.n==0 || (pOp->p2>0 && pOp->p2+u.ai.n<=p->nMem+1) );
! 65339: assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+u.ai.n );
! 65340: u.ai.pArg = &aMem[pOp->p2];
! 65341: for(u.ai.i=0; u.ai.i<u.ai.n; u.ai.i++, u.ai.pArg++){
! 65342: assert( memIsValid(u.ai.pArg) );
! 65343: u.ai.apVal[u.ai.i] = u.ai.pArg;
! 65344: Deephemeralize(u.ai.pArg);
! 65345: sqlite3VdbeMemStoreType(u.ai.pArg);
! 65346: REGISTER_TRACE(pOp->p2+u.ai.i, u.ai.pArg);
1.2 misho 65347: }
65348:
65349: assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC );
65350: if( pOp->p4type==P4_FUNCDEF ){
1.2.2.1 ! misho 65351: u.ai.ctx.pFunc = pOp->p4.pFunc;
! 65352: u.ai.ctx.pVdbeFunc = 0;
1.2 misho 65353: }else{
1.2.2.1 ! misho 65354: u.ai.ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
! 65355: u.ai.ctx.pFunc = u.ai.ctx.pVdbeFunc->pFunc;
1.2 misho 65356: }
65357:
1.2.2.1 ! misho 65358: u.ai.ctx.s.flags = MEM_Null;
! 65359: u.ai.ctx.s.db = db;
! 65360: u.ai.ctx.s.xDel = 0;
! 65361: u.ai.ctx.s.zMalloc = 0;
1.2 misho 65362:
65363: /* The output cell may already have a buffer allocated. Move
1.2.2.1 ! misho 65364: ** the pointer to u.ai.ctx.s so in case the user-function can use
1.2 misho 65365: ** the already allocated buffer instead of allocating a new one.
65366: */
1.2.2.1 ! misho 65367: sqlite3VdbeMemMove(&u.ai.ctx.s, pOut);
! 65368: MemSetTypeFlag(&u.ai.ctx.s, MEM_Null);
1.2 misho 65369:
1.2.2.1 ! misho 65370: u.ai.ctx.isError = 0;
! 65371: if( u.ai.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
1.2 misho 65372: assert( pOp>aOp );
65373: assert( pOp[-1].p4type==P4_COLLSEQ );
65374: assert( pOp[-1].opcode==OP_CollSeq );
1.2.2.1 ! misho 65375: u.ai.ctx.pColl = pOp[-1].p4.pColl;
1.2 misho 65376: }
65377: db->lastRowid = lastRowid;
1.2.2.1 ! misho 65378: (*u.ai.ctx.pFunc->xFunc)(&u.ai.ctx, u.ai.n, u.ai.apVal); /* IMP: R-24505-23230 */
1.2 misho 65379: lastRowid = db->lastRowid;
65380:
65381: /* If any auxiliary data functions have been called by this user function,
65382: ** immediately call the destructor for any non-static values.
65383: */
1.2.2.1 ! misho 65384: if( u.ai.ctx.pVdbeFunc ){
! 65385: sqlite3VdbeDeleteAuxData(u.ai.ctx.pVdbeFunc, pOp->p1);
! 65386: pOp->p4.pVdbeFunc = u.ai.ctx.pVdbeFunc;
1.2 misho 65387: pOp->p4type = P4_VDBEFUNC;
65388: }
65389:
65390: if( db->mallocFailed ){
65391: /* Even though a malloc() has failed, the implementation of the
65392: ** user function may have called an sqlite3_result_XXX() function
65393: ** to return a value. The following call releases any resources
65394: ** associated with such a value.
65395: */
1.2.2.1 ! misho 65396: sqlite3VdbeMemRelease(&u.ai.ctx.s);
1.2 misho 65397: goto no_mem;
65398: }
65399:
65400: /* If the function returned an error, throw an exception */
1.2.2.1 ! misho 65401: if( u.ai.ctx.isError ){
! 65402: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ai.ctx.s));
! 65403: rc = u.ai.ctx.isError;
1.2 misho 65404: }
65405:
65406: /* Copy the result of the function into register P3 */
1.2.2.1 ! misho 65407: sqlite3VdbeChangeEncoding(&u.ai.ctx.s, encoding);
! 65408: sqlite3VdbeMemMove(pOut, &u.ai.ctx.s);
1.2 misho 65409: if( sqlite3VdbeMemTooBig(pOut) ){
65410: goto too_big;
65411: }
65412:
65413: #if 0
65414: /* The app-defined function has done something that as caused this
65415: ** statement to expire. (Perhaps the function called sqlite3_exec()
65416: ** with a CREATE TABLE statement.)
65417: */
65418: if( p->expired ) rc = SQLITE_ABORT;
65419: #endif
65420:
65421: REGISTER_TRACE(pOp->p3, pOut);
65422: UPDATE_MAX_BLOBSIZE(pOut);
65423: break;
65424: }
65425:
65426: /* Opcode: BitAnd P1 P2 P3 * *
65427: **
65428: ** Take the bit-wise AND of the values in register P1 and P2 and
65429: ** store the result in register P3.
65430: ** If either input is NULL, the result is NULL.
65431: */
65432: /* Opcode: BitOr P1 P2 P3 * *
65433: **
65434: ** Take the bit-wise OR of the values in register P1 and P2 and
65435: ** store the result in register P3.
65436: ** If either input is NULL, the result is NULL.
65437: */
65438: /* Opcode: ShiftLeft P1 P2 P3 * *
65439: **
65440: ** Shift the integer value in register P2 to the left by the
65441: ** number of bits specified by the integer in register P1.
65442: ** Store the result in register P3.
65443: ** If either input is NULL, the result is NULL.
65444: */
65445: /* Opcode: ShiftRight P1 P2 P3 * *
65446: **
65447: ** Shift the integer value in register P2 to the right by the
65448: ** number of bits specified by the integer in register P1.
65449: ** Store the result in register P3.
65450: ** If either input is NULL, the result is NULL.
65451: */
65452: case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */
65453: case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */
65454: case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */
65455: case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */
1.2.2.1 ! misho 65456: #if 0 /* local variables moved into u.aj */
1.2 misho 65457: i64 iA;
65458: u64 uA;
65459: i64 iB;
65460: u8 op;
1.2.2.1 ! misho 65461: #endif /* local variables moved into u.aj */
1.2 misho 65462:
65463: pIn1 = &aMem[pOp->p1];
65464: pIn2 = &aMem[pOp->p2];
65465: pOut = &aMem[pOp->p3];
65466: if( (pIn1->flags | pIn2->flags) & MEM_Null ){
65467: sqlite3VdbeMemSetNull(pOut);
65468: break;
65469: }
1.2.2.1 ! misho 65470: u.aj.iA = sqlite3VdbeIntValue(pIn2);
! 65471: u.aj.iB = sqlite3VdbeIntValue(pIn1);
! 65472: u.aj.op = pOp->opcode;
! 65473: if( u.aj.op==OP_BitAnd ){
! 65474: u.aj.iA &= u.aj.iB;
! 65475: }else if( u.aj.op==OP_BitOr ){
! 65476: u.aj.iA |= u.aj.iB;
! 65477: }else if( u.aj.iB!=0 ){
! 65478: assert( u.aj.op==OP_ShiftRight || u.aj.op==OP_ShiftLeft );
1.2 misho 65479:
65480: /* If shifting by a negative amount, shift in the other direction */
1.2.2.1 ! misho 65481: if( u.aj.iB<0 ){
1.2 misho 65482: assert( OP_ShiftRight==OP_ShiftLeft+1 );
1.2.2.1 ! misho 65483: u.aj.op = 2*OP_ShiftLeft + 1 - u.aj.op;
! 65484: u.aj.iB = u.aj.iB>(-64) ? -u.aj.iB : 64;
1.2 misho 65485: }
65486:
1.2.2.1 ! misho 65487: if( u.aj.iB>=64 ){
! 65488: u.aj.iA = (u.aj.iA>=0 || u.aj.op==OP_ShiftLeft) ? 0 : -1;
1.2 misho 65489: }else{
1.2.2.1 ! misho 65490: memcpy(&u.aj.uA, &u.aj.iA, sizeof(u.aj.uA));
! 65491: if( u.aj.op==OP_ShiftLeft ){
! 65492: u.aj.uA <<= u.aj.iB;
1.2 misho 65493: }else{
1.2.2.1 ! misho 65494: u.aj.uA >>= u.aj.iB;
1.2 misho 65495: /* Sign-extend on a right shift of a negative number */
1.2.2.1 ! misho 65496: if( u.aj.iA<0 ) u.aj.uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-u.aj.iB);
1.2 misho 65497: }
1.2.2.1 ! misho 65498: memcpy(&u.aj.iA, &u.aj.uA, sizeof(u.aj.iA));
1.2 misho 65499: }
65500: }
1.2.2.1 ! misho 65501: pOut->u.i = u.aj.iA;
1.2 misho 65502: MemSetTypeFlag(pOut, MEM_Int);
65503: break;
65504: }
65505:
65506: /* Opcode: AddImm P1 P2 * * *
65507: **
65508: ** Add the constant P2 to the value in register P1.
65509: ** The result is always an integer.
65510: **
65511: ** To force any register to be an integer, just add 0.
65512: */
65513: case OP_AddImm: { /* in1 */
65514: pIn1 = &aMem[pOp->p1];
65515: memAboutToChange(p, pIn1);
65516: sqlite3VdbeMemIntegerify(pIn1);
65517: pIn1->u.i += pOp->p2;
65518: break;
65519: }
65520:
65521: /* Opcode: MustBeInt P1 P2 * * *
65522: **
65523: ** Force the value in register P1 to be an integer. If the value
65524: ** in P1 is not an integer and cannot be converted into an integer
65525: ** without data loss, then jump immediately to P2, or if P2==0
65526: ** raise an SQLITE_MISMATCH exception.
65527: */
65528: case OP_MustBeInt: { /* jump, in1 */
65529: pIn1 = &aMem[pOp->p1];
65530: applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
65531: if( (pIn1->flags & MEM_Int)==0 ){
65532: if( pOp->p2==0 ){
65533: rc = SQLITE_MISMATCH;
65534: goto abort_due_to_error;
65535: }else{
65536: pc = pOp->p2 - 1;
65537: }
65538: }else{
65539: MemSetTypeFlag(pIn1, MEM_Int);
65540: }
65541: break;
65542: }
65543:
65544: #ifndef SQLITE_OMIT_FLOATING_POINT
65545: /* Opcode: RealAffinity P1 * * * *
65546: **
65547: ** If register P1 holds an integer convert it to a real value.
65548: **
65549: ** This opcode is used when extracting information from a column that
65550: ** has REAL affinity. Such column values may still be stored as
65551: ** integers, for space efficiency, but after extraction we want them
65552: ** to have only a real value.
65553: */
65554: case OP_RealAffinity: { /* in1 */
65555: pIn1 = &aMem[pOp->p1];
65556: if( pIn1->flags & MEM_Int ){
65557: sqlite3VdbeMemRealify(pIn1);
65558: }
65559: break;
65560: }
65561: #endif
65562:
65563: #ifndef SQLITE_OMIT_CAST
65564: /* Opcode: ToText P1 * * * *
65565: **
65566: ** Force the value in register P1 to be text.
65567: ** If the value is numeric, convert it to a string using the
65568: ** equivalent of printf(). Blob values are unchanged and
65569: ** are afterwards simply interpreted as text.
65570: **
65571: ** A NULL value is not changed by this routine. It remains NULL.
65572: */
65573: case OP_ToText: { /* same as TK_TO_TEXT, in1 */
65574: pIn1 = &aMem[pOp->p1];
65575: memAboutToChange(p, pIn1);
65576: if( pIn1->flags & MEM_Null ) break;
65577: assert( MEM_Str==(MEM_Blob>>3) );
65578: pIn1->flags |= (pIn1->flags&MEM_Blob)>>3;
65579: applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
65580: rc = ExpandBlob(pIn1);
65581: assert( pIn1->flags & MEM_Str || db->mallocFailed );
65582: pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero);
65583: UPDATE_MAX_BLOBSIZE(pIn1);
65584: break;
65585: }
65586:
65587: /* Opcode: ToBlob P1 * * * *
65588: **
65589: ** Force the value in register P1 to be a BLOB.
65590: ** If the value is numeric, convert it to a string first.
65591: ** Strings are simply reinterpreted as blobs with no change
65592: ** to the underlying data.
65593: **
65594: ** A NULL value is not changed by this routine. It remains NULL.
65595: */
65596: case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */
65597: pIn1 = &aMem[pOp->p1];
65598: if( pIn1->flags & MEM_Null ) break;
65599: if( (pIn1->flags & MEM_Blob)==0 ){
65600: applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
65601: assert( pIn1->flags & MEM_Str || db->mallocFailed );
65602: MemSetTypeFlag(pIn1, MEM_Blob);
65603: }else{
65604: pIn1->flags &= ~(MEM_TypeMask&~MEM_Blob);
65605: }
65606: UPDATE_MAX_BLOBSIZE(pIn1);
65607: break;
65608: }
65609:
65610: /* Opcode: ToNumeric P1 * * * *
65611: **
65612: ** Force the value in register P1 to be numeric (either an
65613: ** integer or a floating-point number.)
65614: ** If the value is text or blob, try to convert it to an using the
65615: ** equivalent of atoi() or atof() and store 0 if no such conversion
65616: ** is possible.
65617: **
65618: ** A NULL value is not changed by this routine. It remains NULL.
65619: */
65620: case OP_ToNumeric: { /* same as TK_TO_NUMERIC, in1 */
65621: pIn1 = &aMem[pOp->p1];
65622: sqlite3VdbeMemNumerify(pIn1);
65623: break;
65624: }
65625: #endif /* SQLITE_OMIT_CAST */
65626:
65627: /* Opcode: ToInt P1 * * * *
65628: **
65629: ** Force the value in register P1 to be an integer. If
65630: ** The value is currently a real number, drop its fractional part.
65631: ** If the value is text or blob, try to convert it to an integer using the
65632: ** equivalent of atoi() and store 0 if no such conversion is possible.
65633: **
65634: ** A NULL value is not changed by this routine. It remains NULL.
65635: */
65636: case OP_ToInt: { /* same as TK_TO_INT, in1 */
65637: pIn1 = &aMem[pOp->p1];
65638: if( (pIn1->flags & MEM_Null)==0 ){
65639: sqlite3VdbeMemIntegerify(pIn1);
65640: }
65641: break;
65642: }
65643:
65644: #if !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT)
65645: /* Opcode: ToReal P1 * * * *
65646: **
65647: ** Force the value in register P1 to be a floating point number.
65648: ** If The value is currently an integer, convert it.
65649: ** If the value is text or blob, try to convert it to an integer using the
65650: ** equivalent of atoi() and store 0.0 if no such conversion is possible.
65651: **
65652: ** A NULL value is not changed by this routine. It remains NULL.
65653: */
65654: case OP_ToReal: { /* same as TK_TO_REAL, in1 */
65655: pIn1 = &aMem[pOp->p1];
65656: memAboutToChange(p, pIn1);
65657: if( (pIn1->flags & MEM_Null)==0 ){
65658: sqlite3VdbeMemRealify(pIn1);
65659: }
65660: break;
65661: }
65662: #endif /* !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT) */
65663:
65664: /* Opcode: Lt P1 P2 P3 P4 P5
65665: **
65666: ** Compare the values in register P1 and P3. If reg(P3)<reg(P1) then
65667: ** jump to address P2.
65668: **
65669: ** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
65670: ** reg(P3) is NULL then take the jump. If the SQLITE_JUMPIFNULL
65671: ** bit is clear then fall through if either operand is NULL.
65672: **
65673: ** The SQLITE_AFF_MASK portion of P5 must be an affinity character -
65674: ** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made
65675: ** to coerce both inputs according to this affinity before the
65676: ** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric
65677: ** affinity is used. Note that the affinity conversions are stored
65678: ** back into the input registers P1 and P3. So this opcode can cause
65679: ** persistent changes to registers P1 and P3.
65680: **
65681: ** Once any conversions have taken place, and neither value is NULL,
65682: ** the values are compared. If both values are blobs then memcmp() is
65683: ** used to determine the results of the comparison. If both values
65684: ** are text, then the appropriate collating function specified in
65685: ** P4 is used to do the comparison. If P4 is not specified then
65686: ** memcmp() is used to compare text string. If both values are
65687: ** numeric, then a numeric comparison is used. If the two values
65688: ** are of different types, then numbers are considered less than
65689: ** strings and strings are considered less than blobs.
65690: **
65691: ** If the SQLITE_STOREP2 bit of P5 is set, then do not jump. Instead,
65692: ** store a boolean result (either 0, or 1, or NULL) in register P2.
1.2.2.1 ! misho 65693: **
! 65694: ** If the SQLITE_NULLEQ bit is set in P5, then NULL values are considered
! 65695: ** equal to one another, provided that they do not have their MEM_Cleared
! 65696: ** bit set.
1.2 misho 65697: */
65698: /* Opcode: Ne P1 P2 P3 P4 P5
65699: **
65700: ** This works just like the Lt opcode except that the jump is taken if
65701: ** the operands in registers P1 and P3 are not equal. See the Lt opcode for
65702: ** additional information.
65703: **
65704: ** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
65705: ** true or false and is never NULL. If both operands are NULL then the result
65706: ** of comparison is false. If either operand is NULL then the result is true.
65707: ** If neither operand is NULL the result is the same as it would be if
65708: ** the SQLITE_NULLEQ flag were omitted from P5.
65709: */
65710: /* Opcode: Eq P1 P2 P3 P4 P5
65711: **
65712: ** This works just like the Lt opcode except that the jump is taken if
65713: ** the operands in registers P1 and P3 are equal.
65714: ** See the Lt opcode for additional information.
65715: **
65716: ** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
65717: ** true or false and is never NULL. If both operands are NULL then the result
65718: ** of comparison is true. If either operand is NULL then the result is false.
65719: ** If neither operand is NULL the result is the same as it would be if
65720: ** the SQLITE_NULLEQ flag were omitted from P5.
65721: */
65722: /* Opcode: Le P1 P2 P3 P4 P5
65723: **
65724: ** This works just like the Lt opcode except that the jump is taken if
65725: ** the content of register P3 is less than or equal to the content of
65726: ** register P1. See the Lt opcode for additional information.
65727: */
65728: /* Opcode: Gt P1 P2 P3 P4 P5
65729: **
65730: ** This works just like the Lt opcode except that the jump is taken if
65731: ** the content of register P3 is greater than the content of
65732: ** register P1. See the Lt opcode for additional information.
65733: */
65734: /* Opcode: Ge P1 P2 P3 P4 P5
65735: **
65736: ** This works just like the Lt opcode except that the jump is taken if
65737: ** the content of register P3 is greater than or equal to the content of
65738: ** register P1. See the Lt opcode for additional information.
65739: */
65740: case OP_Eq: /* same as TK_EQ, jump, in1, in3 */
65741: case OP_Ne: /* same as TK_NE, jump, in1, in3 */
65742: case OP_Lt: /* same as TK_LT, jump, in1, in3 */
65743: case OP_Le: /* same as TK_LE, jump, in1, in3 */
65744: case OP_Gt: /* same as TK_GT, jump, in1, in3 */
65745: case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
1.2.2.1 ! misho 65746: #if 0 /* local variables moved into u.ak */
1.2 misho 65747: int res; /* Result of the comparison of pIn1 against pIn3 */
65748: char affinity; /* Affinity to use for comparison */
65749: u16 flags1; /* Copy of initial value of pIn1->flags */
65750: u16 flags3; /* Copy of initial value of pIn3->flags */
1.2.2.1 ! misho 65751: #endif /* local variables moved into u.ak */
1.2 misho 65752:
65753: pIn1 = &aMem[pOp->p1];
65754: pIn3 = &aMem[pOp->p3];
1.2.2.1 ! misho 65755: u.ak.flags1 = pIn1->flags;
! 65756: u.ak.flags3 = pIn3->flags;
! 65757: if( (u.ak.flags1 | u.ak.flags3)&MEM_Null ){
1.2 misho 65758: /* One or both operands are NULL */
65759: if( pOp->p5 & SQLITE_NULLEQ ){
65760: /* If SQLITE_NULLEQ is set (which will only happen if the operator is
65761: ** OP_Eq or OP_Ne) then take the jump or not depending on whether
65762: ** or not both operands are null.
65763: */
65764: assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne );
1.2.2.1 ! misho 65765: assert( (u.ak.flags1 & MEM_Cleared)==0 );
! 65766: if( (u.ak.flags1&MEM_Null)!=0
! 65767: && (u.ak.flags3&MEM_Null)!=0
! 65768: && (u.ak.flags3&MEM_Cleared)==0
! 65769: ){
! 65770: u.ak.res = 0; /* Results are equal */
! 65771: }else{
! 65772: u.ak.res = 1; /* Results are not equal */
! 65773: }
1.2 misho 65774: }else{
65775: /* SQLITE_NULLEQ is clear and at least one operand is NULL,
65776: ** then the result is always NULL.
65777: ** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
65778: */
65779: if( pOp->p5 & SQLITE_STOREP2 ){
65780: pOut = &aMem[pOp->p2];
65781: MemSetTypeFlag(pOut, MEM_Null);
65782: REGISTER_TRACE(pOp->p2, pOut);
65783: }else if( pOp->p5 & SQLITE_JUMPIFNULL ){
65784: pc = pOp->p2-1;
65785: }
65786: break;
65787: }
65788: }else{
65789: /* Neither operand is NULL. Do a comparison. */
1.2.2.1 ! misho 65790: u.ak.affinity = pOp->p5 & SQLITE_AFF_MASK;
! 65791: if( u.ak.affinity ){
! 65792: applyAffinity(pIn1, u.ak.affinity, encoding);
! 65793: applyAffinity(pIn3, u.ak.affinity, encoding);
1.2 misho 65794: if( db->mallocFailed ) goto no_mem;
65795: }
65796:
65797: assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
65798: ExpandBlob(pIn1);
65799: ExpandBlob(pIn3);
1.2.2.1 ! misho 65800: u.ak.res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
1.2 misho 65801: }
65802: switch( pOp->opcode ){
1.2.2.1 ! misho 65803: case OP_Eq: u.ak.res = u.ak.res==0; break;
! 65804: case OP_Ne: u.ak.res = u.ak.res!=0; break;
! 65805: case OP_Lt: u.ak.res = u.ak.res<0; break;
! 65806: case OP_Le: u.ak.res = u.ak.res<=0; break;
! 65807: case OP_Gt: u.ak.res = u.ak.res>0; break;
! 65808: default: u.ak.res = u.ak.res>=0; break;
1.2 misho 65809: }
65810:
65811: if( pOp->p5 & SQLITE_STOREP2 ){
65812: pOut = &aMem[pOp->p2];
65813: memAboutToChange(p, pOut);
65814: MemSetTypeFlag(pOut, MEM_Int);
1.2.2.1 ! misho 65815: pOut->u.i = u.ak.res;
1.2 misho 65816: REGISTER_TRACE(pOp->p2, pOut);
1.2.2.1 ! misho 65817: }else if( u.ak.res ){
1.2 misho 65818: pc = pOp->p2-1;
65819: }
65820:
65821: /* Undo any changes made by applyAffinity() to the input registers. */
1.2.2.1 ! misho 65822: pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (u.ak.flags1&MEM_TypeMask);
! 65823: pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (u.ak.flags3&MEM_TypeMask);
1.2 misho 65824: break;
65825: }
65826:
65827: /* Opcode: Permutation * * * P4 *
65828: **
65829: ** Set the permutation used by the OP_Compare operator to be the array
65830: ** of integers in P4.
65831: **
1.2.2.1 ! misho 65832: ** The permutation is only valid until the next OP_Compare that has
! 65833: ** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should
! 65834: ** occur immediately prior to the OP_Compare.
1.2 misho 65835: */
65836: case OP_Permutation: {
65837: assert( pOp->p4type==P4_INTARRAY );
65838: assert( pOp->p4.ai );
65839: aPermute = pOp->p4.ai;
65840: break;
65841: }
65842:
1.2.2.1 ! misho 65843: /* Opcode: Compare P1 P2 P3 P4 P5
1.2 misho 65844: **
65845: ** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this
65846: ** vector "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of
65847: ** the comparison for use by the next OP_Jump instruct.
65848: **
1.2.2.1 ! misho 65849: ** If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is
! 65850: ** determined by the most recent OP_Permutation operator. If the
! 65851: ** OPFLAG_PERMUTE bit is clear, then register are compared in sequential
! 65852: ** order.
! 65853: **
1.2 misho 65854: ** P4 is a KeyInfo structure that defines collating sequences and sort
65855: ** orders for the comparison. The permutation applies to registers
65856: ** only. The KeyInfo elements are used sequentially.
65857: **
65858: ** The comparison is a sort comparison, so NULLs compare equal,
65859: ** NULLs are less than numbers, numbers are less than strings,
65860: ** and strings are less than blobs.
65861: */
65862: case OP_Compare: {
1.2.2.1 ! misho 65863: #if 0 /* local variables moved into u.al */
1.2 misho 65864: int n;
65865: int i;
65866: int p1;
65867: int p2;
65868: const KeyInfo *pKeyInfo;
65869: int idx;
65870: CollSeq *pColl; /* Collating sequence to use on this term */
65871: int bRev; /* True for DESCENDING sort order */
1.2.2.1 ! misho 65872: #endif /* local variables moved into u.al */
1.2 misho 65873:
1.2.2.1 ! misho 65874: if( (pOp->p5 & OPFLAG_PERMUTE)==0 ) aPermute = 0;
! 65875: u.al.n = pOp->p3;
! 65876: u.al.pKeyInfo = pOp->p4.pKeyInfo;
! 65877: assert( u.al.n>0 );
! 65878: assert( u.al.pKeyInfo!=0 );
! 65879: u.al.p1 = pOp->p1;
! 65880: u.al.p2 = pOp->p2;
1.2 misho 65881: #if SQLITE_DEBUG
65882: if( aPermute ){
65883: int k, mx = 0;
1.2.2.1 ! misho 65884: for(k=0; k<u.al.n; k++) if( aPermute[k]>mx ) mx = aPermute[k];
! 65885: assert( u.al.p1>0 && u.al.p1+mx<=p->nMem+1 );
! 65886: assert( u.al.p2>0 && u.al.p2+mx<=p->nMem+1 );
1.2 misho 65887: }else{
1.2.2.1 ! misho 65888: assert( u.al.p1>0 && u.al.p1+u.al.n<=p->nMem+1 );
! 65889: assert( u.al.p2>0 && u.al.p2+u.al.n<=p->nMem+1 );
1.2 misho 65890: }
65891: #endif /* SQLITE_DEBUG */
1.2.2.1 ! misho 65892: for(u.al.i=0; u.al.i<u.al.n; u.al.i++){
! 65893: u.al.idx = aPermute ? aPermute[u.al.i] : u.al.i;
! 65894: assert( memIsValid(&aMem[u.al.p1+u.al.idx]) );
! 65895: assert( memIsValid(&aMem[u.al.p2+u.al.idx]) );
! 65896: REGISTER_TRACE(u.al.p1+u.al.idx, &aMem[u.al.p1+u.al.idx]);
! 65897: REGISTER_TRACE(u.al.p2+u.al.idx, &aMem[u.al.p2+u.al.idx]);
! 65898: assert( u.al.i<u.al.pKeyInfo->nField );
! 65899: u.al.pColl = u.al.pKeyInfo->aColl[u.al.i];
! 65900: u.al.bRev = u.al.pKeyInfo->aSortOrder[u.al.i];
! 65901: iCompare = sqlite3MemCompare(&aMem[u.al.p1+u.al.idx], &aMem[u.al.p2+u.al.idx], u.al.pColl);
1.2 misho 65902: if( iCompare ){
1.2.2.1 ! misho 65903: if( u.al.bRev ) iCompare = -iCompare;
1.2 misho 65904: break;
65905: }
65906: }
65907: aPermute = 0;
65908: break;
65909: }
65910:
65911: /* Opcode: Jump P1 P2 P3 * *
65912: **
65913: ** Jump to the instruction at address P1, P2, or P3 depending on whether
65914: ** in the most recent OP_Compare instruction the P1 vector was less than
65915: ** equal to, or greater than the P2 vector, respectively.
65916: */
65917: case OP_Jump: { /* jump */
65918: if( iCompare<0 ){
65919: pc = pOp->p1 - 1;
65920: }else if( iCompare==0 ){
65921: pc = pOp->p2 - 1;
65922: }else{
65923: pc = pOp->p3 - 1;
65924: }
65925: break;
65926: }
65927:
65928: /* Opcode: And P1 P2 P3 * *
65929: **
65930: ** Take the logical AND of the values in registers P1 and P2 and
65931: ** write the result into register P3.
65932: **
65933: ** If either P1 or P2 is 0 (false) then the result is 0 even if
65934: ** the other input is NULL. A NULL and true or two NULLs give
65935: ** a NULL output.
65936: */
65937: /* Opcode: Or P1 P2 P3 * *
65938: **
65939: ** Take the logical OR of the values in register P1 and P2 and
65940: ** store the answer in register P3.
65941: **
65942: ** If either P1 or P2 is nonzero (true) then the result is 1 (true)
65943: ** even if the other input is NULL. A NULL and false or two NULLs
65944: ** give a NULL output.
65945: */
65946: case OP_And: /* same as TK_AND, in1, in2, out3 */
65947: case OP_Or: { /* same as TK_OR, in1, in2, out3 */
1.2.2.1 ! misho 65948: #if 0 /* local variables moved into u.am */
1.2 misho 65949: int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
65950: int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
1.2.2.1 ! misho 65951: #endif /* local variables moved into u.am */
1.2 misho 65952:
65953: pIn1 = &aMem[pOp->p1];
65954: if( pIn1->flags & MEM_Null ){
1.2.2.1 ! misho 65955: u.am.v1 = 2;
1.2 misho 65956: }else{
1.2.2.1 ! misho 65957: u.am.v1 = sqlite3VdbeIntValue(pIn1)!=0;
1.2 misho 65958: }
65959: pIn2 = &aMem[pOp->p2];
65960: if( pIn2->flags & MEM_Null ){
1.2.2.1 ! misho 65961: u.am.v2 = 2;
1.2 misho 65962: }else{
1.2.2.1 ! misho 65963: u.am.v2 = sqlite3VdbeIntValue(pIn2)!=0;
1.2 misho 65964: }
65965: if( pOp->opcode==OP_And ){
65966: static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
1.2.2.1 ! misho 65967: u.am.v1 = and_logic[u.am.v1*3+u.am.v2];
1.2 misho 65968: }else{
65969: static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
1.2.2.1 ! misho 65970: u.am.v1 = or_logic[u.am.v1*3+u.am.v2];
1.2 misho 65971: }
65972: pOut = &aMem[pOp->p3];
1.2.2.1 ! misho 65973: if( u.am.v1==2 ){
1.2 misho 65974: MemSetTypeFlag(pOut, MEM_Null);
65975: }else{
1.2.2.1 ! misho 65976: pOut->u.i = u.am.v1;
1.2 misho 65977: MemSetTypeFlag(pOut, MEM_Int);
65978: }
65979: break;
65980: }
65981:
65982: /* Opcode: Not P1 P2 * * *
65983: **
65984: ** Interpret the value in register P1 as a boolean value. Store the
65985: ** boolean complement in register P2. If the value in register P1 is
65986: ** NULL, then a NULL is stored in P2.
65987: */
65988: case OP_Not: { /* same as TK_NOT, in1, out2 */
65989: pIn1 = &aMem[pOp->p1];
65990: pOut = &aMem[pOp->p2];
65991: if( pIn1->flags & MEM_Null ){
65992: sqlite3VdbeMemSetNull(pOut);
65993: }else{
65994: sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeIntValue(pIn1));
65995: }
65996: break;
65997: }
65998:
65999: /* Opcode: BitNot P1 P2 * * *
66000: **
66001: ** Interpret the content of register P1 as an integer. Store the
66002: ** ones-complement of the P1 value into register P2. If P1 holds
66003: ** a NULL then store a NULL in P2.
66004: */
66005: case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */
66006: pIn1 = &aMem[pOp->p1];
66007: pOut = &aMem[pOp->p2];
66008: if( pIn1->flags & MEM_Null ){
66009: sqlite3VdbeMemSetNull(pOut);
66010: }else{
66011: sqlite3VdbeMemSetInt64(pOut, ~sqlite3VdbeIntValue(pIn1));
66012: }
66013: break;
66014: }
66015:
66016: /* Opcode: Once P1 P2 * * *
66017: **
66018: ** Check if OP_Once flag P1 is set. If so, jump to instruction P2. Otherwise,
66019: ** set the flag and fall through to the next instruction.
66020: */
66021: case OP_Once: { /* jump */
66022: assert( pOp->p1<p->nOnceFlag );
66023: if( p->aOnceFlag[pOp->p1] ){
66024: pc = pOp->p2-1;
66025: }else{
66026: p->aOnceFlag[pOp->p1] = 1;
66027: }
66028: break;
66029: }
66030:
66031: /* Opcode: If P1 P2 P3 * *
66032: **
66033: ** Jump to P2 if the value in register P1 is true. The value
66034: ** is considered true if it is numeric and non-zero. If the value
66035: ** in P1 is NULL then take the jump if P3 is non-zero.
66036: */
66037: /* Opcode: IfNot P1 P2 P3 * *
66038: **
66039: ** Jump to P2 if the value in register P1 is False. The value
66040: ** is considered false if it has a numeric value of zero. If the value
66041: ** in P1 is NULL then take the jump if P3 is zero.
66042: */
66043: case OP_If: /* jump, in1 */
66044: case OP_IfNot: { /* jump, in1 */
1.2.2.1 ! misho 66045: #if 0 /* local variables moved into u.an */
1.2 misho 66046: int c;
1.2.2.1 ! misho 66047: #endif /* local variables moved into u.an */
1.2 misho 66048: pIn1 = &aMem[pOp->p1];
66049: if( pIn1->flags & MEM_Null ){
1.2.2.1 ! misho 66050: u.an.c = pOp->p3;
1.2 misho 66051: }else{
66052: #ifdef SQLITE_OMIT_FLOATING_POINT
1.2.2.1 ! misho 66053: u.an.c = sqlite3VdbeIntValue(pIn1)!=0;
1.2 misho 66054: #else
1.2.2.1 ! misho 66055: u.an.c = sqlite3VdbeRealValue(pIn1)!=0.0;
1.2 misho 66056: #endif
1.2.2.1 ! misho 66057: if( pOp->opcode==OP_IfNot ) u.an.c = !u.an.c;
1.2 misho 66058: }
1.2.2.1 ! misho 66059: if( u.an.c ){
1.2 misho 66060: pc = pOp->p2-1;
66061: }
66062: break;
66063: }
66064:
66065: /* Opcode: IsNull P1 P2 * * *
66066: **
66067: ** Jump to P2 if the value in register P1 is NULL.
66068: */
66069: case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
66070: pIn1 = &aMem[pOp->p1];
66071: if( (pIn1->flags & MEM_Null)!=0 ){
66072: pc = pOp->p2 - 1;
66073: }
66074: break;
66075: }
66076:
66077: /* Opcode: NotNull P1 P2 * * *
66078: **
66079: ** Jump to P2 if the value in register P1 is not NULL.
66080: */
66081: case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
66082: pIn1 = &aMem[pOp->p1];
66083: if( (pIn1->flags & MEM_Null)==0 ){
66084: pc = pOp->p2 - 1;
66085: }
66086: break;
66087: }
66088:
66089: /* Opcode: Column P1 P2 P3 P4 P5
66090: **
66091: ** Interpret the data that cursor P1 points to as a structure built using
66092: ** the MakeRecord instruction. (See the MakeRecord opcode for additional
66093: ** information about the format of the data.) Extract the P2-th column
66094: ** from this record. If there are less that (P2+1)
66095: ** values in the record, extract a NULL.
66096: **
66097: ** The value extracted is stored in register P3.
66098: **
66099: ** If the column contains fewer than P2 fields, then extract a NULL. Or,
66100: ** if the P4 argument is a P4_MEM use the value of the P4 argument as
66101: ** the result.
66102: **
66103: ** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor,
66104: ** then the cache of the cursor is reset prior to extracting the column.
66105: ** The first OP_Column against a pseudo-table after the value of the content
66106: ** register has changed should have this bit set.
1.2.2.1 ! misho 66107: **
! 66108: ** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 when
! 66109: ** the result is guaranteed to only be used as the argument of a length()
! 66110: ** or typeof() function, respectively. The loading of large blobs can be
! 66111: ** skipped for length() and all content loading can be skipped for typeof().
1.2 misho 66112: */
66113: case OP_Column: {
1.2.2.1 ! misho 66114: #if 0 /* local variables moved into u.ao */
1.2 misho 66115: u32 payloadSize; /* Number of bytes in the record */
66116: i64 payloadSize64; /* Number of bytes in the record */
66117: int p1; /* P1 value of the opcode */
66118: int p2; /* column number to retrieve */
66119: VdbeCursor *pC; /* The VDBE cursor */
66120: char *zRec; /* Pointer to complete record-data */
66121: BtCursor *pCrsr; /* The BTree cursor */
66122: u32 *aType; /* aType[i] holds the numeric type of the i-th column */
66123: u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
66124: int nField; /* number of fields in the record */
66125: int len; /* The length of the serialized data for the column */
66126: int i; /* Loop counter */
66127: char *zData; /* Part of the record being decoded */
66128: Mem *pDest; /* Where to write the extracted value */
66129: Mem sMem; /* For storing the record being decoded */
66130: u8 *zIdx; /* Index into header */
66131: u8 *zEndHdr; /* Pointer to first byte after the header */
66132: u32 offset; /* Offset into the data */
66133: u32 szField; /* Number of bytes in the content of a field */
66134: int szHdr; /* Size of the header size field at start of record */
66135: int avail; /* Number of bytes of available data */
66136: u32 t; /* A type code from the record header */
66137: Mem *pReg; /* PseudoTable input register */
1.2.2.1 ! misho 66138: #endif /* local variables moved into u.ao */
1.2 misho 66139:
66140:
1.2.2.1 ! misho 66141: u.ao.p1 = pOp->p1;
! 66142: u.ao.p2 = pOp->p2;
! 66143: u.ao.pC = 0;
! 66144: memset(&u.ao.sMem, 0, sizeof(u.ao.sMem));
! 66145: assert( u.ao.p1<p->nCursor );
1.2 misho 66146: assert( pOp->p3>0 && pOp->p3<=p->nMem );
1.2.2.1 ! misho 66147: u.ao.pDest = &aMem[pOp->p3];
! 66148: memAboutToChange(p, u.ao.pDest);
! 66149: u.ao.zRec = 0;
1.2 misho 66150:
1.2.2.1 ! misho 66151: /* This block sets the variable u.ao.payloadSize to be the total number of
1.2 misho 66152: ** bytes in the record.
66153: **
1.2.2.1 ! misho 66154: ** u.ao.zRec is set to be the complete text of the record if it is available.
1.2 misho 66155: ** The complete record text is always available for pseudo-tables
66156: ** If the record is stored in a cursor, the complete record text
1.2.2.1 ! misho 66157: ** might be available in the u.ao.pC->aRow cache. Or it might not be.
! 66158: ** If the data is unavailable, u.ao.zRec is set to NULL.
1.2 misho 66159: **
66160: ** We also compute the number of columns in the record. For cursors,
66161: ** the number of columns is stored in the VdbeCursor.nField element.
66162: */
1.2.2.1 ! misho 66163: u.ao.pC = p->apCsr[u.ao.p1];
! 66164: assert( u.ao.pC!=0 );
1.2 misho 66165: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 66166: assert( u.ao.pC->pVtabCursor==0 );
1.2 misho 66167: #endif
1.2.2.1 ! misho 66168: u.ao.pCrsr = u.ao.pC->pCursor;
! 66169: if( u.ao.pCrsr!=0 ){
1.2 misho 66170: /* The record is stored in a B-Tree */
1.2.2.1 ! misho 66171: rc = sqlite3VdbeCursorMoveto(u.ao.pC);
1.2 misho 66172: if( rc ) goto abort_due_to_error;
1.2.2.1 ! misho 66173: if( u.ao.pC->nullRow ){
! 66174: u.ao.payloadSize = 0;
! 66175: }else if( u.ao.pC->cacheStatus==p->cacheCtr ){
! 66176: u.ao.payloadSize = u.ao.pC->payloadSize;
! 66177: u.ao.zRec = (char*)u.ao.pC->aRow;
! 66178: }else if( u.ao.pC->isIndex ){
! 66179: assert( sqlite3BtreeCursorIsValid(u.ao.pCrsr) );
! 66180: VVA_ONLY(rc =) sqlite3BtreeKeySize(u.ao.pCrsr, &u.ao.payloadSize64);
1.2 misho 66181: assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
66182: /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
1.2.2.1 ! misho 66183: ** payload size, so it is impossible for u.ao.payloadSize64 to be
1.2 misho 66184: ** larger than 32 bits. */
1.2.2.1 ! misho 66185: assert( (u.ao.payloadSize64 & SQLITE_MAX_U32)==(u64)u.ao.payloadSize64 );
! 66186: u.ao.payloadSize = (u32)u.ao.payloadSize64;
1.2 misho 66187: }else{
1.2.2.1 ! misho 66188: assert( sqlite3BtreeCursorIsValid(u.ao.pCrsr) );
! 66189: VVA_ONLY(rc =) sqlite3BtreeDataSize(u.ao.pCrsr, &u.ao.payloadSize);
1.2 misho 66190: assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
66191: }
1.2.2.1 ! misho 66192: }else if( ALWAYS(u.ao.pC->pseudoTableReg>0) ){
! 66193: u.ao.pReg = &aMem[u.ao.pC->pseudoTableReg];
! 66194: if( u.ao.pC->multiPseudo ){
! 66195: sqlite3VdbeMemShallowCopy(u.ao.pDest, u.ao.pReg+u.ao.p2, MEM_Ephem);
! 66196: Deephemeralize(u.ao.pDest);
! 66197: goto op_column_out;
! 66198: }
! 66199: assert( u.ao.pReg->flags & MEM_Blob );
! 66200: assert( memIsValid(u.ao.pReg) );
! 66201: u.ao.payloadSize = u.ao.pReg->n;
! 66202: u.ao.zRec = u.ao.pReg->z;
! 66203: u.ao.pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr;
! 66204: assert( u.ao.payloadSize==0 || u.ao.zRec!=0 );
1.2 misho 66205: }else{
66206: /* Consider the row to be NULL */
1.2.2.1 ! misho 66207: u.ao.payloadSize = 0;
1.2 misho 66208: }
66209:
1.2.2.1 ! misho 66210: /* If u.ao.payloadSize is 0, then just store a NULL. This can happen because of
1.2 misho 66211: ** nullRow or because of a corrupt database. */
1.2.2.1 ! misho 66212: if( u.ao.payloadSize==0 ){
! 66213: MemSetTypeFlag(u.ao.pDest, MEM_Null);
1.2 misho 66214: goto op_column_out;
66215: }
66216: assert( db->aLimit[SQLITE_LIMIT_LENGTH]>=0 );
1.2.2.1 ! misho 66217: if( u.ao.payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
1.2 misho 66218: goto too_big;
66219: }
66220:
1.2.2.1 ! misho 66221: u.ao.nField = u.ao.pC->nField;
! 66222: assert( u.ao.p2<u.ao.nField );
1.2 misho 66223:
66224: /* Read and parse the table header. Store the results of the parse
66225: ** into the record header cache fields of the cursor.
66226: */
1.2.2.1 ! misho 66227: u.ao.aType = u.ao.pC->aType;
! 66228: if( u.ao.pC->cacheStatus==p->cacheCtr ){
! 66229: u.ao.aOffset = u.ao.pC->aOffset;
! 66230: }else{
! 66231: assert(u.ao.aType);
! 66232: u.ao.avail = 0;
! 66233: u.ao.pC->aOffset = u.ao.aOffset = &u.ao.aType[u.ao.nField];
! 66234: u.ao.pC->payloadSize = u.ao.payloadSize;
! 66235: u.ao.pC->cacheStatus = p->cacheCtr;
1.2 misho 66236:
66237: /* Figure out how many bytes are in the header */
1.2.2.1 ! misho 66238: if( u.ao.zRec ){
! 66239: u.ao.zData = u.ao.zRec;
1.2 misho 66240: }else{
1.2.2.1 ! misho 66241: if( u.ao.pC->isIndex ){
! 66242: u.ao.zData = (char*)sqlite3BtreeKeyFetch(u.ao.pCrsr, &u.ao.avail);
1.2 misho 66243: }else{
1.2.2.1 ! misho 66244: u.ao.zData = (char*)sqlite3BtreeDataFetch(u.ao.pCrsr, &u.ao.avail);
1.2 misho 66245: }
66246: /* If KeyFetch()/DataFetch() managed to get the entire payload,
1.2.2.1 ! misho 66247: ** save the payload in the u.ao.pC->aRow cache. That will save us from
1.2 misho 66248: ** having to make additional calls to fetch the content portion of
66249: ** the record.
66250: */
1.2.2.1 ! misho 66251: assert( u.ao.avail>=0 );
! 66252: if( u.ao.payloadSize <= (u32)u.ao.avail ){
! 66253: u.ao.zRec = u.ao.zData;
! 66254: u.ao.pC->aRow = (u8*)u.ao.zData;
1.2 misho 66255: }else{
1.2.2.1 ! misho 66256: u.ao.pC->aRow = 0;
1.2 misho 66257: }
66258: }
1.2.2.1 ! misho 66259: /* The following assert is true in all cases except when
1.2 misho 66260: ** the database file has been corrupted externally.
1.2.2.1 ! misho 66261: ** assert( u.ao.zRec!=0 || u.ao.avail>=u.ao.payloadSize || u.ao.avail>=9 ); */
! 66262: u.ao.szHdr = getVarint32((u8*)u.ao.zData, u.ao.offset);
1.2 misho 66263:
66264: /* Make sure a corrupt database has not given us an oversize header.
66265: ** Do this now to avoid an oversize memory allocation.
66266: **
66267: ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte
66268: ** types use so much data space that there can only be 4096 and 32 of
66269: ** them, respectively. So the maximum header length results from a
66270: ** 3-byte type for each of the maximum of 32768 columns plus three
66271: ** extra bytes for the header length itself. 32768*3 + 3 = 98307.
66272: */
1.2.2.1 ! misho 66273: if( u.ao.offset > 98307 ){
1.2 misho 66274: rc = SQLITE_CORRUPT_BKPT;
66275: goto op_column_out;
66276: }
66277:
1.2.2.1 ! misho 66278: /* Compute in u.ao.len the number of bytes of data we need to read in order
! 66279: ** to get u.ao.nField type values. u.ao.offset is an upper bound on this. But
! 66280: ** u.ao.nField might be significantly less than the true number of columns
! 66281: ** in the table, and in that case, 5*u.ao.nField+3 might be smaller than u.ao.offset.
! 66282: ** We want to minimize u.ao.len in order to limit the size of the memory
! 66283: ** allocation, especially if a corrupt database file has caused u.ao.offset
1.2 misho 66284: ** to be oversized. Offset is limited to 98307 above. But 98307 might
66285: ** still exceed Robson memory allocation limits on some configurations.
1.2.2.1 ! misho 66286: ** On systems that cannot tolerate large memory allocations, u.ao.nField*5+3
! 66287: ** will likely be much smaller since u.ao.nField will likely be less than
1.2 misho 66288: ** 20 or so. This insures that Robson memory allocation limits are
66289: ** not exceeded even for corrupt database files.
66290: */
1.2.2.1 ! misho 66291: u.ao.len = u.ao.nField*5 + 3;
! 66292: if( u.ao.len > (int)u.ao.offset ) u.ao.len = (int)u.ao.offset;
1.2 misho 66293:
66294: /* The KeyFetch() or DataFetch() above are fast and will get the entire
66295: ** record header in most cases. But they will fail to get the complete
66296: ** record header if the record header does not fit on a single page
66297: ** in the B-Tree. When that happens, use sqlite3VdbeMemFromBtree() to
66298: ** acquire the complete header text.
66299: */
1.2.2.1 ! misho 66300: if( !u.ao.zRec && u.ao.avail<u.ao.len ){
! 66301: u.ao.sMem.flags = 0;
! 66302: u.ao.sMem.db = 0;
! 66303: rc = sqlite3VdbeMemFromBtree(u.ao.pCrsr, 0, u.ao.len, u.ao.pC->isIndex, &u.ao.sMem);
1.2 misho 66304: if( rc!=SQLITE_OK ){
66305: goto op_column_out;
66306: }
1.2.2.1 ! misho 66307: u.ao.zData = u.ao.sMem.z;
1.2 misho 66308: }
1.2.2.1 ! misho 66309: u.ao.zEndHdr = (u8 *)&u.ao.zData[u.ao.len];
! 66310: u.ao.zIdx = (u8 *)&u.ao.zData[u.ao.szHdr];
1.2 misho 66311:
1.2.2.1 ! misho 66312: /* Scan the header and use it to fill in the u.ao.aType[] and u.ao.aOffset[]
! 66313: ** arrays. u.ao.aType[u.ao.i] will contain the type integer for the u.ao.i-th
! 66314: ** column and u.ao.aOffset[u.ao.i] will contain the u.ao.offset from the beginning
! 66315: ** of the record to the start of the data for the u.ao.i-th column
! 66316: */
! 66317: for(u.ao.i=0; u.ao.i<u.ao.nField; u.ao.i++){
! 66318: if( u.ao.zIdx<u.ao.zEndHdr ){
! 66319: u.ao.aOffset[u.ao.i] = u.ao.offset;
! 66320: if( u.ao.zIdx[0]<0x80 ){
! 66321: u.ao.t = u.ao.zIdx[0];
! 66322: u.ao.zIdx++;
1.2 misho 66323: }else{
1.2.2.1 ! misho 66324: u.ao.zIdx += sqlite3GetVarint32(u.ao.zIdx, &u.ao.t);
1.2 misho 66325: }
1.2.2.1 ! misho 66326: u.ao.aType[u.ao.i] = u.ao.t;
! 66327: u.ao.szField = sqlite3VdbeSerialTypeLen(u.ao.t);
! 66328: u.ao.offset += u.ao.szField;
! 66329: if( u.ao.offset<u.ao.szField ){ /* True if u.ao.offset overflows */
! 66330: u.ao.zIdx = &u.ao.zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */
1.2 misho 66331: break;
66332: }
66333: }else{
1.2.2.1 ! misho 66334: /* If u.ao.i is less that u.ao.nField, then there are fewer fields in this
1.2 misho 66335: ** record than SetNumColumns indicated there are columns in the
1.2.2.1 ! misho 66336: ** table. Set the u.ao.offset for any extra columns not present in
! 66337: ** the record to 0. This tells code below to store the default value
! 66338: ** for the column instead of deserializing a value from the record.
1.2 misho 66339: */
1.2.2.1 ! misho 66340: u.ao.aOffset[u.ao.i] = 0;
1.2 misho 66341: }
66342: }
1.2.2.1 ! misho 66343: sqlite3VdbeMemRelease(&u.ao.sMem);
! 66344: u.ao.sMem.flags = MEM_Null;
1.2 misho 66345:
66346: /* If we have read more header data than was contained in the header,
66347: ** or if the end of the last field appears to be past the end of the
66348: ** record, or if the end of the last field appears to be before the end
66349: ** of the record (when all fields present), then we must be dealing
66350: ** with a corrupt database.
66351: */
1.2.2.1 ! misho 66352: if( (u.ao.zIdx > u.ao.zEndHdr) || (u.ao.offset > u.ao.payloadSize)
! 66353: || (u.ao.zIdx==u.ao.zEndHdr && u.ao.offset!=u.ao.payloadSize) ){
1.2 misho 66354: rc = SQLITE_CORRUPT_BKPT;
66355: goto op_column_out;
66356: }
66357: }
66358:
1.2.2.1 ! misho 66359: /* Get the column information. If u.ao.aOffset[u.ao.p2] is non-zero, then
! 66360: ** deserialize the value from the record. If u.ao.aOffset[u.ao.p2] is zero,
1.2 misho 66361: ** then there are not enough fields in the record to satisfy the
66362: ** request. In this case, set the value NULL or to P4 if P4 is
66363: ** a pointer to a Mem object.
66364: */
1.2.2.1 ! misho 66365: if( u.ao.aOffset[u.ao.p2] ){
1.2 misho 66366: assert( rc==SQLITE_OK );
1.2.2.1 ! misho 66367: if( u.ao.zRec ){
! 66368: /* This is the common case where the whole row fits on a single page */
! 66369: VdbeMemRelease(u.ao.pDest);
! 66370: sqlite3VdbeSerialGet((u8 *)&u.ao.zRec[u.ao.aOffset[u.ao.p2]], u.ao.aType[u.ao.p2], u.ao.pDest);
! 66371: }else{
! 66372: /* This branch happens only when the row overflows onto multiple pages */
! 66373: u.ao.t = u.ao.aType[u.ao.p2];
! 66374: if( (pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0
! 66375: && ((u.ao.t>=12 && (u.ao.t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)
! 66376: ){
! 66377: /* Content is irrelevant for the typeof() function and for
! 66378: ** the length(X) function if X is a blob. So we might as well use
! 66379: ** bogus content rather than reading content from disk. NULL works
! 66380: ** for text and blob and whatever is in the u.ao.payloadSize64 variable
! 66381: ** will work for everything else. */
! 66382: u.ao.zData = u.ao.t<12 ? (char*)&u.ao.payloadSize64 : 0;
! 66383: }else{
! 66384: u.ao.len = sqlite3VdbeSerialTypeLen(u.ao.t);
! 66385: sqlite3VdbeMemMove(&u.ao.sMem, u.ao.pDest);
! 66386: rc = sqlite3VdbeMemFromBtree(u.ao.pCrsr, u.ao.aOffset[u.ao.p2], u.ao.len, u.ao.pC->isIndex,
! 66387: &u.ao.sMem);
! 66388: if( rc!=SQLITE_OK ){
! 66389: goto op_column_out;
! 66390: }
! 66391: u.ao.zData = u.ao.sMem.z;
1.2 misho 66392: }
1.2.2.1 ! misho 66393: sqlite3VdbeSerialGet((u8*)u.ao.zData, u.ao.t, u.ao.pDest);
1.2 misho 66394: }
1.2.2.1 ! misho 66395: u.ao.pDest->enc = encoding;
1.2 misho 66396: }else{
66397: if( pOp->p4type==P4_MEM ){
1.2.2.1 ! misho 66398: sqlite3VdbeMemShallowCopy(u.ao.pDest, pOp->p4.pMem, MEM_Static);
1.2 misho 66399: }else{
1.2.2.1 ! misho 66400: MemSetTypeFlag(u.ao.pDest, MEM_Null);
1.2 misho 66401: }
66402: }
66403:
66404: /* If we dynamically allocated space to hold the data (in the
66405: ** sqlite3VdbeMemFromBtree() call above) then transfer control of that
1.2.2.1 ! misho 66406: ** dynamically allocated space over to the u.ao.pDest structure.
1.2 misho 66407: ** This prevents a memory copy.
66408: */
1.2.2.1 ! misho 66409: if( u.ao.sMem.zMalloc ){
! 66410: assert( u.ao.sMem.z==u.ao.sMem.zMalloc );
! 66411: assert( !(u.ao.pDest->flags & MEM_Dyn) );
! 66412: assert( !(u.ao.pDest->flags & (MEM_Blob|MEM_Str)) || u.ao.pDest->z==u.ao.sMem.z );
! 66413: u.ao.pDest->flags &= ~(MEM_Ephem|MEM_Static);
! 66414: u.ao.pDest->flags |= MEM_Term;
! 66415: u.ao.pDest->z = u.ao.sMem.z;
! 66416: u.ao.pDest->zMalloc = u.ao.sMem.zMalloc;
1.2 misho 66417: }
66418:
1.2.2.1 ! misho 66419: rc = sqlite3VdbeMemMakeWriteable(u.ao.pDest);
1.2 misho 66420:
66421: op_column_out:
1.2.2.1 ! misho 66422: UPDATE_MAX_BLOBSIZE(u.ao.pDest);
! 66423: REGISTER_TRACE(pOp->p3, u.ao.pDest);
1.2 misho 66424: break;
66425: }
66426:
66427: /* Opcode: Affinity P1 P2 * P4 *
66428: **
66429: ** Apply affinities to a range of P2 registers starting with P1.
66430: **
66431: ** P4 is a string that is P2 characters long. The nth character of the
66432: ** string indicates the column affinity that should be used for the nth
66433: ** memory cell in the range.
66434: */
66435: case OP_Affinity: {
1.2.2.1 ! misho 66436: #if 0 /* local variables moved into u.ap */
1.2 misho 66437: const char *zAffinity; /* The affinity to be applied */
66438: char cAff; /* A single character of affinity */
1.2.2.1 ! misho 66439: #endif /* local variables moved into u.ap */
1.2 misho 66440:
1.2.2.1 ! misho 66441: u.ap.zAffinity = pOp->p4.z;
! 66442: assert( u.ap.zAffinity!=0 );
! 66443: assert( u.ap.zAffinity[pOp->p2]==0 );
1.2 misho 66444: pIn1 = &aMem[pOp->p1];
1.2.2.1 ! misho 66445: while( (u.ap.cAff = *(u.ap.zAffinity++))!=0 ){
1.2 misho 66446: assert( pIn1 <= &p->aMem[p->nMem] );
66447: assert( memIsValid(pIn1) );
66448: ExpandBlob(pIn1);
1.2.2.1 ! misho 66449: applyAffinity(pIn1, u.ap.cAff, encoding);
1.2 misho 66450: pIn1++;
66451: }
66452: break;
66453: }
66454:
66455: /* Opcode: MakeRecord P1 P2 P3 P4 *
66456: **
66457: ** Convert P2 registers beginning with P1 into the [record format]
66458: ** use as a data record in a database table or as a key
66459: ** in an index. The OP_Column opcode can decode the record later.
66460: **
66461: ** P4 may be a string that is P2 characters long. The nth character of the
66462: ** string indicates the column affinity that should be used for the nth
66463: ** field of the index key.
66464: **
66465: ** The mapping from character to affinity is given by the SQLITE_AFF_
66466: ** macros defined in sqliteInt.h.
66467: **
66468: ** If P4 is NULL then all index fields have the affinity NONE.
66469: */
66470: case OP_MakeRecord: {
1.2.2.1 ! misho 66471: #if 0 /* local variables moved into u.aq */
1.2 misho 66472: u8 *zNewRecord; /* A buffer to hold the data for the new record */
66473: Mem *pRec; /* The new record */
66474: u64 nData; /* Number of bytes of data space */
66475: int nHdr; /* Number of bytes of header space */
66476: i64 nByte; /* Data space required for this record */
66477: int nZero; /* Number of zero bytes at the end of the record */
66478: int nVarint; /* Number of bytes in a varint */
66479: u32 serial_type; /* Type field */
66480: Mem *pData0; /* First field to be combined into the record */
66481: Mem *pLast; /* Last field of the record */
66482: int nField; /* Number of fields in the record */
66483: char *zAffinity; /* The affinity string for the record */
66484: int file_format; /* File format to use for encoding */
66485: int i; /* Space used in zNewRecord[] */
66486: int len; /* Length of a field */
1.2.2.1 ! misho 66487: #endif /* local variables moved into u.aq */
1.2 misho 66488:
66489: /* Assuming the record contains N fields, the record format looks
66490: ** like this:
66491: **
66492: ** ------------------------------------------------------------------------
66493: ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
66494: ** ------------------------------------------------------------------------
66495: **
66496: ** Data(0) is taken from register P1. Data(1) comes from register P1+1
66497: ** and so froth.
66498: **
66499: ** Each type field is a varint representing the serial type of the
66500: ** corresponding data element (see sqlite3VdbeSerialType()). The
66501: ** hdr-size field is also a varint which is the offset from the beginning
66502: ** of the record to data0.
66503: */
1.2.2.1 ! misho 66504: u.aq.nData = 0; /* Number of bytes of data space */
! 66505: u.aq.nHdr = 0; /* Number of bytes of header space */
! 66506: u.aq.nZero = 0; /* Number of zero bytes at the end of the record */
! 66507: u.aq.nField = pOp->p1;
! 66508: u.aq.zAffinity = pOp->p4.z;
! 66509: assert( u.aq.nField>0 && pOp->p2>0 && pOp->p2+u.aq.nField<=p->nMem+1 );
! 66510: u.aq.pData0 = &aMem[u.aq.nField];
! 66511: u.aq.nField = pOp->p2;
! 66512: u.aq.pLast = &u.aq.pData0[u.aq.nField-1];
! 66513: u.aq.file_format = p->minWriteFileFormat;
1.2 misho 66514:
66515: /* Identify the output register */
66516: assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
66517: pOut = &aMem[pOp->p3];
66518: memAboutToChange(p, pOut);
66519:
66520: /* Loop through the elements that will make up the record to figure
66521: ** out how much space is required for the new record.
66522: */
1.2.2.1 ! misho 66523: for(u.aq.pRec=u.aq.pData0; u.aq.pRec<=u.aq.pLast; u.aq.pRec++){
! 66524: assert( memIsValid(u.aq.pRec) );
! 66525: if( u.aq.zAffinity ){
! 66526: applyAffinity(u.aq.pRec, u.aq.zAffinity[u.aq.pRec-u.aq.pData0], encoding);
! 66527: }
! 66528: if( u.aq.pRec->flags&MEM_Zero && u.aq.pRec->n>0 ){
! 66529: sqlite3VdbeMemExpandBlob(u.aq.pRec);
! 66530: }
! 66531: u.aq.serial_type = sqlite3VdbeSerialType(u.aq.pRec, u.aq.file_format);
! 66532: u.aq.len = sqlite3VdbeSerialTypeLen(u.aq.serial_type);
! 66533: u.aq.nData += u.aq.len;
! 66534: u.aq.nHdr += sqlite3VarintLen(u.aq.serial_type);
! 66535: if( u.aq.pRec->flags & MEM_Zero ){
1.2 misho 66536: /* Only pure zero-filled BLOBs can be input to this Opcode.
66537: ** We do not allow blobs with a prefix and a zero-filled tail. */
1.2.2.1 ! misho 66538: u.aq.nZero += u.aq.pRec->u.nZero;
! 66539: }else if( u.aq.len ){
! 66540: u.aq.nZero = 0;
1.2 misho 66541: }
66542: }
66543:
66544: /* Add the initial header varint and total the size */
1.2.2.1 ! misho 66545: u.aq.nHdr += u.aq.nVarint = sqlite3VarintLen(u.aq.nHdr);
! 66546: if( u.aq.nVarint<sqlite3VarintLen(u.aq.nHdr) ){
! 66547: u.aq.nHdr++;
1.2 misho 66548: }
1.2.2.1 ! misho 66549: u.aq.nByte = u.aq.nHdr+u.aq.nData-u.aq.nZero;
! 66550: if( u.aq.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
1.2 misho 66551: goto too_big;
66552: }
66553:
66554: /* Make sure the output register has a buffer large enough to store
66555: ** the new record. The output register (pOp->p3) is not allowed to
66556: ** be one of the input registers (because the following call to
66557: ** sqlite3VdbeMemGrow() could clobber the value before it is used).
66558: */
1.2.2.1 ! misho 66559: if( sqlite3VdbeMemGrow(pOut, (int)u.aq.nByte, 0) ){
1.2 misho 66560: goto no_mem;
66561: }
1.2.2.1 ! misho 66562: u.aq.zNewRecord = (u8 *)pOut->z;
1.2 misho 66563:
66564: /* Write the record */
1.2.2.1 ! misho 66565: u.aq.i = putVarint32(u.aq.zNewRecord, u.aq.nHdr);
! 66566: for(u.aq.pRec=u.aq.pData0; u.aq.pRec<=u.aq.pLast; u.aq.pRec++){
! 66567: u.aq.serial_type = sqlite3VdbeSerialType(u.aq.pRec, u.aq.file_format);
! 66568: u.aq.i += putVarint32(&u.aq.zNewRecord[u.aq.i], u.aq.serial_type); /* serial type */
1.2 misho 66569: }
1.2.2.1 ! misho 66570: for(u.aq.pRec=u.aq.pData0; u.aq.pRec<=u.aq.pLast; u.aq.pRec++){ /* serial data */
! 66571: u.aq.i += sqlite3VdbeSerialPut(&u.aq.zNewRecord[u.aq.i], (int)(u.aq.nByte-u.aq.i), u.aq.pRec,u.aq.file_format);
1.2 misho 66572: }
1.2.2.1 ! misho 66573: assert( u.aq.i==u.aq.nByte );
1.2 misho 66574:
66575: assert( pOp->p3>0 && pOp->p3<=p->nMem );
1.2.2.1 ! misho 66576: pOut->n = (int)u.aq.nByte;
1.2 misho 66577: pOut->flags = MEM_Blob | MEM_Dyn;
66578: pOut->xDel = 0;
1.2.2.1 ! misho 66579: if( u.aq.nZero ){
! 66580: pOut->u.nZero = u.aq.nZero;
1.2 misho 66581: pOut->flags |= MEM_Zero;
66582: }
66583: pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */
66584: REGISTER_TRACE(pOp->p3, pOut);
66585: UPDATE_MAX_BLOBSIZE(pOut);
66586: break;
66587: }
66588:
66589: /* Opcode: Count P1 P2 * * *
66590: **
66591: ** Store the number of entries (an integer value) in the table or index
66592: ** opened by cursor P1 in register P2
66593: */
66594: #ifndef SQLITE_OMIT_BTREECOUNT
66595: case OP_Count: { /* out2-prerelease */
1.2.2.1 ! misho 66596: #if 0 /* local variables moved into u.ar */
1.2 misho 66597: i64 nEntry;
66598: BtCursor *pCrsr;
1.2.2.1 ! misho 66599: #endif /* local variables moved into u.ar */
1.2 misho 66600:
1.2.2.1 ! misho 66601: u.ar.pCrsr = p->apCsr[pOp->p1]->pCursor;
! 66602: if( ALWAYS(u.ar.pCrsr) ){
! 66603: rc = sqlite3BtreeCount(u.ar.pCrsr, &u.ar.nEntry);
1.2 misho 66604: }else{
1.2.2.1 ! misho 66605: u.ar.nEntry = 0;
1.2 misho 66606: }
1.2.2.1 ! misho 66607: pOut->u.i = u.ar.nEntry;
1.2 misho 66608: break;
66609: }
66610: #endif
66611:
66612: /* Opcode: Savepoint P1 * * P4 *
66613: **
66614: ** Open, release or rollback the savepoint named by parameter P4, depending
66615: ** on the value of P1. To open a new savepoint, P1==0. To release (commit) an
66616: ** existing savepoint, P1==1, or to rollback an existing savepoint P1==2.
66617: */
66618: case OP_Savepoint: {
1.2.2.1 ! misho 66619: #if 0 /* local variables moved into u.as */
1.2 misho 66620: int p1; /* Value of P1 operand */
66621: char *zName; /* Name of savepoint */
66622: int nName;
66623: Savepoint *pNew;
66624: Savepoint *pSavepoint;
66625: Savepoint *pTmp;
66626: int iSavepoint;
66627: int ii;
1.2.2.1 ! misho 66628: #endif /* local variables moved into u.as */
1.2 misho 66629:
1.2.2.1 ! misho 66630: u.as.p1 = pOp->p1;
! 66631: u.as.zName = pOp->p4.z;
1.2 misho 66632:
1.2.2.1 ! misho 66633: /* Assert that the u.as.p1 parameter is valid. Also that if there is no open
1.2 misho 66634: ** transaction, then there cannot be any savepoints.
66635: */
66636: assert( db->pSavepoint==0 || db->autoCommit==0 );
1.2.2.1 ! misho 66637: assert( u.as.p1==SAVEPOINT_BEGIN||u.as.p1==SAVEPOINT_RELEASE||u.as.p1==SAVEPOINT_ROLLBACK );
1.2 misho 66638: assert( db->pSavepoint || db->isTransactionSavepoint==0 );
66639: assert( checkSavepointCount(db) );
66640:
1.2.2.1 ! misho 66641: if( u.as.p1==SAVEPOINT_BEGIN ){
1.2 misho 66642: if( db->writeVdbeCnt>0 ){
66643: /* A new savepoint cannot be created if there are active write
66644: ** statements (i.e. open read/write incremental blob handles).
66645: */
66646: sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - "
66647: "SQL statements in progress");
66648: rc = SQLITE_BUSY;
66649: }else{
1.2.2.1 ! misho 66650: u.as.nName = sqlite3Strlen30(u.as.zName);
1.2 misho 66651:
66652: #ifndef SQLITE_OMIT_VIRTUALTABLE
66653: /* This call is Ok even if this savepoint is actually a transaction
66654: ** savepoint (and therefore should not prompt xSavepoint()) callbacks.
66655: ** If this is a transaction savepoint being opened, it is guaranteed
66656: ** that the db->aVTrans[] array is empty. */
66657: assert( db->autoCommit==0 || db->nVTrans==0 );
66658: rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN,
66659: db->nStatement+db->nSavepoint);
66660: if( rc!=SQLITE_OK ) goto abort_due_to_error;
66661: #endif
66662:
66663: /* Create a new savepoint structure. */
1.2.2.1 ! misho 66664: u.as.pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+u.as.nName+1);
! 66665: if( u.as.pNew ){
! 66666: u.as.pNew->zName = (char *)&u.as.pNew[1];
! 66667: memcpy(u.as.pNew->zName, u.as.zName, u.as.nName+1);
1.2 misho 66668:
66669: /* If there is no open transaction, then mark this as a special
66670: ** "transaction savepoint". */
66671: if( db->autoCommit ){
66672: db->autoCommit = 0;
66673: db->isTransactionSavepoint = 1;
66674: }else{
66675: db->nSavepoint++;
66676: }
66677:
66678: /* Link the new savepoint into the database handle's list. */
1.2.2.1 ! misho 66679: u.as.pNew->pNext = db->pSavepoint;
! 66680: db->pSavepoint = u.as.pNew;
! 66681: u.as.pNew->nDeferredCons = db->nDeferredCons;
1.2 misho 66682: }
66683: }
66684: }else{
1.2.2.1 ! misho 66685: u.as.iSavepoint = 0;
1.2 misho 66686:
66687: /* Find the named savepoint. If there is no such savepoint, then an
66688: ** an error is returned to the user. */
66689: for(
1.2.2.1 ! misho 66690: u.as.pSavepoint = db->pSavepoint;
! 66691: u.as.pSavepoint && sqlite3StrICmp(u.as.pSavepoint->zName, u.as.zName);
! 66692: u.as.pSavepoint = u.as.pSavepoint->pNext
1.2 misho 66693: ){
1.2.2.1 ! misho 66694: u.as.iSavepoint++;
1.2 misho 66695: }
1.2.2.1 ! misho 66696: if( !u.as.pSavepoint ){
! 66697: sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", u.as.zName);
1.2 misho 66698: rc = SQLITE_ERROR;
1.2.2.1 ! misho 66699: }else if( db->writeVdbeCnt>0 && u.as.p1==SAVEPOINT_RELEASE ){
1.2 misho 66700: /* It is not possible to release (commit) a savepoint if there are
1.2.2.1 ! misho 66701: ** active write statements.
1.2 misho 66702: */
66703: sqlite3SetString(&p->zErrMsg, db,
1.2.2.1 ! misho 66704: "cannot release savepoint - SQL statements in progress"
1.2 misho 66705: );
66706: rc = SQLITE_BUSY;
66707: }else{
66708:
66709: /* Determine whether or not this is a transaction savepoint. If so,
66710: ** and this is a RELEASE command, then the current transaction
66711: ** is committed.
66712: */
1.2.2.1 ! misho 66713: int isTransaction = u.as.pSavepoint->pNext==0 && db->isTransactionSavepoint;
! 66714: if( isTransaction && u.as.p1==SAVEPOINT_RELEASE ){
1.2 misho 66715: if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
66716: goto vdbe_return;
66717: }
66718: db->autoCommit = 1;
66719: if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
66720: p->pc = pc;
66721: db->autoCommit = 0;
66722: p->rc = rc = SQLITE_BUSY;
66723: goto vdbe_return;
66724: }
66725: db->isTransactionSavepoint = 0;
66726: rc = p->rc;
66727: }else{
1.2.2.1 ! misho 66728: u.as.iSavepoint = db->nSavepoint - u.as.iSavepoint - 1;
! 66729: if( u.as.p1==SAVEPOINT_ROLLBACK ){
! 66730: for(u.as.ii=0; u.as.ii<db->nDb; u.as.ii++){
! 66731: sqlite3BtreeTripAllCursors(db->aDb[u.as.ii].pBt, SQLITE_ABORT);
! 66732: }
! 66733: }
! 66734: for(u.as.ii=0; u.as.ii<db->nDb; u.as.ii++){
! 66735: rc = sqlite3BtreeSavepoint(db->aDb[u.as.ii].pBt, u.as.p1, u.as.iSavepoint);
1.2 misho 66736: if( rc!=SQLITE_OK ){
66737: goto abort_due_to_error;
66738: }
66739: }
1.2.2.1 ! misho 66740: if( u.as.p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){
1.2 misho 66741: sqlite3ExpirePreparedStatements(db);
1.2.2.1 ! misho 66742: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 66743: db->flags = (db->flags | SQLITE_InternChanges);
66744: }
66745: }
66746:
66747: /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all
66748: ** savepoints nested inside of the savepoint being operated on. */
1.2.2.1 ! misho 66749: while( db->pSavepoint!=u.as.pSavepoint ){
! 66750: u.as.pTmp = db->pSavepoint;
! 66751: db->pSavepoint = u.as.pTmp->pNext;
! 66752: sqlite3DbFree(db, u.as.pTmp);
1.2 misho 66753: db->nSavepoint--;
66754: }
66755:
66756: /* If it is a RELEASE, then destroy the savepoint being operated on
66757: ** too. If it is a ROLLBACK TO, then set the number of deferred
66758: ** constraint violations present in the database to the value stored
66759: ** when the savepoint was created. */
1.2.2.1 ! misho 66760: if( u.as.p1==SAVEPOINT_RELEASE ){
! 66761: assert( u.as.pSavepoint==db->pSavepoint );
! 66762: db->pSavepoint = u.as.pSavepoint->pNext;
! 66763: sqlite3DbFree(db, u.as.pSavepoint);
1.2 misho 66764: if( !isTransaction ){
66765: db->nSavepoint--;
66766: }
66767: }else{
1.2.2.1 ! misho 66768: db->nDeferredCons = u.as.pSavepoint->nDeferredCons;
1.2 misho 66769: }
66770:
66771: if( !isTransaction ){
1.2.2.1 ! misho 66772: rc = sqlite3VtabSavepoint(db, u.as.p1, u.as.iSavepoint);
1.2 misho 66773: if( rc!=SQLITE_OK ) goto abort_due_to_error;
66774: }
66775: }
66776: }
66777:
66778: break;
66779: }
66780:
66781: /* Opcode: AutoCommit P1 P2 * * *
66782: **
66783: ** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
66784: ** back any currently active btree transactions. If there are any active
66785: ** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if
66786: ** there are active writing VMs or active VMs that use shared cache.
66787: **
66788: ** This instruction causes the VM to halt.
66789: */
66790: case OP_AutoCommit: {
1.2.2.1 ! misho 66791: #if 0 /* local variables moved into u.at */
1.2 misho 66792: int desiredAutoCommit;
66793: int iRollback;
66794: int turnOnAC;
1.2.2.1 ! misho 66795: #endif /* local variables moved into u.at */
1.2 misho 66796:
1.2.2.1 ! misho 66797: u.at.desiredAutoCommit = pOp->p1;
! 66798: u.at.iRollback = pOp->p2;
! 66799: u.at.turnOnAC = u.at.desiredAutoCommit && !db->autoCommit;
! 66800: assert( u.at.desiredAutoCommit==1 || u.at.desiredAutoCommit==0 );
! 66801: assert( u.at.desiredAutoCommit==1 || u.at.iRollback==0 );
1.2 misho 66802: assert( db->activeVdbeCnt>0 ); /* At least this one VM is active */
66803:
1.2.2.1 ! misho 66804: #if 0
! 66805: if( u.at.turnOnAC && u.at.iRollback && db->activeVdbeCnt>1 ){
1.2 misho 66806: /* If this instruction implements a ROLLBACK and other VMs are
66807: ** still running, and a transaction is active, return an error indicating
66808: ** that the other VMs must complete first.
66809: */
66810: sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - "
66811: "SQL statements in progress");
66812: rc = SQLITE_BUSY;
1.2.2.1 ! misho 66813: }else
! 66814: #endif
! 66815: if( u.at.turnOnAC && !u.at.iRollback && db->writeVdbeCnt>0 ){
1.2 misho 66816: /* If this instruction implements a COMMIT and other VMs are writing
66817: ** return an error indicating that the other VMs must complete first.
66818: */
66819: sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - "
66820: "SQL statements in progress");
66821: rc = SQLITE_BUSY;
1.2.2.1 ! misho 66822: }else if( u.at.desiredAutoCommit!=db->autoCommit ){
! 66823: if( u.at.iRollback ){
! 66824: assert( u.at.desiredAutoCommit==1 );
! 66825: sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK);
1.2 misho 66826: db->autoCommit = 1;
66827: }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
66828: goto vdbe_return;
66829: }else{
1.2.2.1 ! misho 66830: db->autoCommit = (u8)u.at.desiredAutoCommit;
1.2 misho 66831: if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
66832: p->pc = pc;
1.2.2.1 ! misho 66833: db->autoCommit = (u8)(1-u.at.desiredAutoCommit);
1.2 misho 66834: p->rc = rc = SQLITE_BUSY;
66835: goto vdbe_return;
66836: }
66837: }
66838: assert( db->nStatement==0 );
66839: sqlite3CloseSavepoints(db);
66840: if( p->rc==SQLITE_OK ){
66841: rc = SQLITE_DONE;
66842: }else{
66843: rc = SQLITE_ERROR;
66844: }
66845: goto vdbe_return;
66846: }else{
66847: sqlite3SetString(&p->zErrMsg, db,
1.2.2.1 ! misho 66848: (!u.at.desiredAutoCommit)?"cannot start a transaction within a transaction":(
! 66849: (u.at.iRollback)?"cannot rollback - no transaction is active":
1.2 misho 66850: "cannot commit - no transaction is active"));
66851:
66852: rc = SQLITE_ERROR;
66853: }
66854: break;
66855: }
66856:
66857: /* Opcode: Transaction P1 P2 * * *
66858: **
66859: ** Begin a transaction. The transaction ends when a Commit or Rollback
66860: ** opcode is encountered. Depending on the ON CONFLICT setting, the
66861: ** transaction might also be rolled back if an error is encountered.
66862: **
66863: ** P1 is the index of the database file on which the transaction is
66864: ** started. Index 0 is the main database file and index 1 is the
66865: ** file used for temporary tables. Indices of 2 or more are used for
66866: ** attached databases.
66867: **
66868: ** If P2 is non-zero, then a write-transaction is started. A RESERVED lock is
66869: ** obtained on the database file when a write-transaction is started. No
66870: ** other process can start another write transaction while this transaction is
66871: ** underway. Starting a write transaction also creates a rollback journal. A
66872: ** write transaction must be started before any changes can be made to the
66873: ** database. If P2 is 2 or greater then an EXCLUSIVE lock is also obtained
66874: ** on the file.
66875: **
66876: ** If a write-transaction is started and the Vdbe.usesStmtJournal flag is
66877: ** true (this flag is set if the Vdbe may modify more than one row and may
66878: ** throw an ABORT exception), a statement transaction may also be opened.
66879: ** More specifically, a statement transaction is opened iff the database
66880: ** connection is currently not in autocommit mode, or if there are other
1.2.2.1 ! misho 66881: ** active statements. A statement transaction allows the changes made by this
1.2 misho 66882: ** VDBE to be rolled back after an error without having to roll back the
66883: ** entire transaction. If no error is encountered, the statement transaction
66884: ** will automatically commit when the VDBE halts.
66885: **
66886: ** If P2 is zero, then a read-lock is obtained on the database file.
66887: */
66888: case OP_Transaction: {
1.2.2.1 ! misho 66889: #if 0 /* local variables moved into u.au */
1.2 misho 66890: Btree *pBt;
1.2.2.1 ! misho 66891: #endif /* local variables moved into u.au */
1.2 misho 66892:
66893: assert( pOp->p1>=0 && pOp->p1<db->nDb );
66894: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
1.2.2.1 ! misho 66895: u.au.pBt = db->aDb[pOp->p1].pBt;
1.2 misho 66896:
1.2.2.1 ! misho 66897: if( u.au.pBt ){
! 66898: rc = sqlite3BtreeBeginTrans(u.au.pBt, pOp->p2);
1.2 misho 66899: if( rc==SQLITE_BUSY ){
66900: p->pc = pc;
66901: p->rc = rc = SQLITE_BUSY;
66902: goto vdbe_return;
66903: }
66904: if( rc!=SQLITE_OK ){
66905: goto abort_due_to_error;
66906: }
66907:
66908: if( pOp->p2 && p->usesStmtJournal
66909: && (db->autoCommit==0 || db->activeVdbeCnt>1)
66910: ){
1.2.2.1 ! misho 66911: assert( sqlite3BtreeIsInTrans(u.au.pBt) );
1.2 misho 66912: if( p->iStatement==0 ){
66913: assert( db->nStatement>=0 && db->nSavepoint>=0 );
66914: db->nStatement++;
66915: p->iStatement = db->nSavepoint + db->nStatement;
66916: }
66917:
66918: rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1);
66919: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 66920: rc = sqlite3BtreeBeginStmt(u.au.pBt, p->iStatement);
1.2 misho 66921: }
66922:
66923: /* Store the current value of the database handles deferred constraint
66924: ** counter. If the statement transaction needs to be rolled back,
66925: ** the value of this counter needs to be restored too. */
66926: p->nStmtDefCons = db->nDeferredCons;
66927: }
66928: }
66929: break;
66930: }
66931:
66932: /* Opcode: ReadCookie P1 P2 P3 * *
66933: **
66934: ** Read cookie number P3 from database P1 and write it into register P2.
66935: ** P3==1 is the schema version. P3==2 is the database format.
66936: ** P3==3 is the recommended pager cache size, and so forth. P1==0 is
66937: ** the main database file and P1==1 is the database file used to store
66938: ** temporary tables.
66939: **
66940: ** There must be a read-lock on the database (either a transaction
66941: ** must be started or there must be an open cursor) before
66942: ** executing this instruction.
66943: */
66944: case OP_ReadCookie: { /* out2-prerelease */
1.2.2.1 ! misho 66945: #if 0 /* local variables moved into u.av */
1.2 misho 66946: int iMeta;
66947: int iDb;
66948: int iCookie;
1.2.2.1 ! misho 66949: #endif /* local variables moved into u.av */
1.2 misho 66950:
1.2.2.1 ! misho 66951: u.av.iDb = pOp->p1;
! 66952: u.av.iCookie = pOp->p3;
1.2 misho 66953: assert( pOp->p3<SQLITE_N_BTREE_META );
1.2.2.1 ! misho 66954: assert( u.av.iDb>=0 && u.av.iDb<db->nDb );
! 66955: assert( db->aDb[u.av.iDb].pBt!=0 );
! 66956: assert( (p->btreeMask & (((yDbMask)1)<<u.av.iDb))!=0 );
1.2 misho 66957:
1.2.2.1 ! misho 66958: sqlite3BtreeGetMeta(db->aDb[u.av.iDb].pBt, u.av.iCookie, (u32 *)&u.av.iMeta);
! 66959: pOut->u.i = u.av.iMeta;
1.2 misho 66960: break;
66961: }
66962:
66963: /* Opcode: SetCookie P1 P2 P3 * *
66964: **
66965: ** Write the content of register P3 (interpreted as an integer)
66966: ** into cookie number P2 of database P1. P2==1 is the schema version.
66967: ** P2==2 is the database format. P2==3 is the recommended pager cache
66968: ** size, and so forth. P1==0 is the main database file and P1==1 is the
66969: ** database file used to store temporary tables.
66970: **
66971: ** A transaction must be started before executing this opcode.
66972: */
66973: case OP_SetCookie: { /* in3 */
1.2.2.1 ! misho 66974: #if 0 /* local variables moved into u.aw */
1.2 misho 66975: Db *pDb;
1.2.2.1 ! misho 66976: #endif /* local variables moved into u.aw */
1.2 misho 66977: assert( pOp->p2<SQLITE_N_BTREE_META );
66978: assert( pOp->p1>=0 && pOp->p1<db->nDb );
66979: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
1.2.2.1 ! misho 66980: u.aw.pDb = &db->aDb[pOp->p1];
! 66981: assert( u.aw.pDb->pBt!=0 );
1.2 misho 66982: assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
66983: pIn3 = &aMem[pOp->p3];
66984: sqlite3VdbeMemIntegerify(pIn3);
66985: /* See note about index shifting on OP_ReadCookie */
1.2.2.1 ! misho 66986: rc = sqlite3BtreeUpdateMeta(u.aw.pDb->pBt, pOp->p2, (int)pIn3->u.i);
1.2 misho 66987: if( pOp->p2==BTREE_SCHEMA_VERSION ){
66988: /* When the schema cookie changes, record the new cookie internally */
1.2.2.1 ! misho 66989: u.aw.pDb->pSchema->schema_cookie = (int)pIn3->u.i;
1.2 misho 66990: db->flags |= SQLITE_InternChanges;
66991: }else if( pOp->p2==BTREE_FILE_FORMAT ){
66992: /* Record changes in the file format */
1.2.2.1 ! misho 66993: u.aw.pDb->pSchema->file_format = (u8)pIn3->u.i;
1.2 misho 66994: }
66995: if( pOp->p1==1 ){
66996: /* Invalidate all prepared statements whenever the TEMP database
66997: ** schema is changed. Ticket #1644 */
66998: sqlite3ExpirePreparedStatements(db);
66999: p->expired = 0;
67000: }
67001: break;
67002: }
67003:
67004: /* Opcode: VerifyCookie P1 P2 P3 * *
67005: **
67006: ** Check the value of global database parameter number 0 (the
67007: ** schema version) and make sure it is equal to P2 and that the
67008: ** generation counter on the local schema parse equals P3.
67009: **
67010: ** P1 is the database number which is 0 for the main database file
67011: ** and 1 for the file holding temporary tables and some higher number
67012: ** for auxiliary databases.
67013: **
67014: ** The cookie changes its value whenever the database schema changes.
67015: ** This operation is used to detect when that the cookie has changed
67016: ** and that the current process needs to reread the schema.
67017: **
67018: ** Either a transaction needs to have been started or an OP_Open needs
67019: ** to be executed (to establish a read lock) before this opcode is
67020: ** invoked.
67021: */
67022: case OP_VerifyCookie: {
1.2.2.1 ! misho 67023: #if 0 /* local variables moved into u.ax */
1.2 misho 67024: int iMeta;
67025: int iGen;
67026: Btree *pBt;
1.2.2.1 ! misho 67027: #endif /* local variables moved into u.ax */
1.2 misho 67028:
67029: assert( pOp->p1>=0 && pOp->p1<db->nDb );
67030: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
67031: assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
1.2.2.1 ! misho 67032: u.ax.pBt = db->aDb[pOp->p1].pBt;
! 67033: if( u.ax.pBt ){
! 67034: sqlite3BtreeGetMeta(u.ax.pBt, BTREE_SCHEMA_VERSION, (u32 *)&u.ax.iMeta);
! 67035: u.ax.iGen = db->aDb[pOp->p1].pSchema->iGeneration;
1.2 misho 67036: }else{
1.2.2.1 ! misho 67037: u.ax.iGen = u.ax.iMeta = 0;
1.2 misho 67038: }
1.2.2.1 ! misho 67039: if( u.ax.iMeta!=pOp->p2 || u.ax.iGen!=pOp->p3 ){
1.2 misho 67040: sqlite3DbFree(db, p->zErrMsg);
67041: p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
67042: /* If the schema-cookie from the database file matches the cookie
67043: ** stored with the in-memory representation of the schema, do
67044: ** not reload the schema from the database file.
67045: **
67046: ** If virtual-tables are in use, this is not just an optimization.
67047: ** Often, v-tables store their data in other SQLite tables, which
67048: ** are queried from within xNext() and other v-table methods using
67049: ** prepared queries. If such a query is out-of-date, we do not want to
67050: ** discard the database schema, as the user code implementing the
67051: ** v-table would have to be ready for the sqlite3_vtab structure itself
67052: ** to be invalidated whenever sqlite3_step() is called from within
67053: ** a v-table method.
67054: */
1.2.2.1 ! misho 67055: if( db->aDb[pOp->p1].pSchema->schema_cookie!=u.ax.iMeta ){
! 67056: sqlite3ResetOneSchema(db, pOp->p1);
1.2 misho 67057: }
67058:
67059: p->expired = 1;
67060: rc = SQLITE_SCHEMA;
67061: }
67062: break;
67063: }
67064:
67065: /* Opcode: OpenRead P1 P2 P3 P4 P5
67066: **
67067: ** Open a read-only cursor for the database table whose root page is
67068: ** P2 in a database file. The database file is determined by P3.
67069: ** P3==0 means the main database, P3==1 means the database used for
67070: ** temporary tables, and P3>1 means used the corresponding attached
67071: ** database. Give the new cursor an identifier of P1. The P1
67072: ** values need not be contiguous but all P1 values should be small integers.
67073: ** It is an error for P1 to be negative.
67074: **
67075: ** If P5!=0 then use the content of register P2 as the root page, not
67076: ** the value of P2 itself.
67077: **
67078: ** There will be a read lock on the database whenever there is an
67079: ** open cursor. If the database was unlocked prior to this instruction
67080: ** then a read lock is acquired as part of this instruction. A read
67081: ** lock allows other processes to read the database but prohibits
67082: ** any other process from modifying the database. The read lock is
67083: ** released when all cursors are closed. If this instruction attempts
67084: ** to get a read lock but fails, the script terminates with an
67085: ** SQLITE_BUSY error code.
67086: **
67087: ** The P4 value may be either an integer (P4_INT32) or a pointer to
67088: ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
67089: ** structure, then said structure defines the content and collating
67090: ** sequence of the index being opened. Otherwise, if P4 is an integer
67091: ** value, it is set to the number of columns in the table.
67092: **
67093: ** See also OpenWrite.
67094: */
67095: /* Opcode: OpenWrite P1 P2 P3 P4 P5
67096: **
67097: ** Open a read/write cursor named P1 on the table or index whose root
67098: ** page is P2. Or if P5!=0 use the content of register P2 to find the
67099: ** root page.
67100: **
67101: ** The P4 value may be either an integer (P4_INT32) or a pointer to
67102: ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
67103: ** structure, then said structure defines the content and collating
67104: ** sequence of the index being opened. Otherwise, if P4 is an integer
67105: ** value, it is set to the number of columns in the table, or to the
67106: ** largest index of any column of the table that is actually used.
67107: **
67108: ** This instruction works just like OpenRead except that it opens the cursor
67109: ** in read/write mode. For a given table, there can be one or more read-only
67110: ** cursors or a single read/write cursor but not both.
67111: **
67112: ** See also OpenRead.
67113: */
67114: case OP_OpenRead:
67115: case OP_OpenWrite: {
1.2.2.1 ! misho 67116: #if 0 /* local variables moved into u.ay */
1.2 misho 67117: int nField;
67118: KeyInfo *pKeyInfo;
67119: int p2;
67120: int iDb;
67121: int wrFlag;
67122: Btree *pX;
67123: VdbeCursor *pCur;
67124: Db *pDb;
1.2.2.1 ! misho 67125: #endif /* local variables moved into u.ay */
! 67126:
! 67127: assert( (pOp->p5&(OPFLAG_P2ISREG|OPFLAG_BULKCSR))==pOp->p5 );
! 67128: assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 );
1.2 misho 67129:
67130: if( p->expired ){
67131: rc = SQLITE_ABORT;
67132: break;
67133: }
67134:
1.2.2.1 ! misho 67135: u.ay.nField = 0;
! 67136: u.ay.pKeyInfo = 0;
! 67137: u.ay.p2 = pOp->p2;
! 67138: u.ay.iDb = pOp->p3;
! 67139: assert( u.ay.iDb>=0 && u.ay.iDb<db->nDb );
! 67140: assert( (p->btreeMask & (((yDbMask)1)<<u.ay.iDb))!=0 );
! 67141: u.ay.pDb = &db->aDb[u.ay.iDb];
! 67142: u.ay.pX = u.ay.pDb->pBt;
! 67143: assert( u.ay.pX!=0 );
1.2 misho 67144: if( pOp->opcode==OP_OpenWrite ){
1.2.2.1 ! misho 67145: u.ay.wrFlag = 1;
! 67146: assert( sqlite3SchemaMutexHeld(db, u.ay.iDb, 0) );
! 67147: if( u.ay.pDb->pSchema->file_format < p->minWriteFileFormat ){
! 67148: p->minWriteFileFormat = u.ay.pDb->pSchema->file_format;
1.2 misho 67149: }
67150: }else{
1.2.2.1 ! misho 67151: u.ay.wrFlag = 0;
! 67152: }
! 67153: if( pOp->p5 & OPFLAG_P2ISREG ){
! 67154: assert( u.ay.p2>0 );
! 67155: assert( u.ay.p2<=p->nMem );
! 67156: pIn2 = &aMem[u.ay.p2];
1.2 misho 67157: assert( memIsValid(pIn2) );
67158: assert( (pIn2->flags & MEM_Int)!=0 );
67159: sqlite3VdbeMemIntegerify(pIn2);
1.2.2.1 ! misho 67160: u.ay.p2 = (int)pIn2->u.i;
! 67161: /* The u.ay.p2 value always comes from a prior OP_CreateTable opcode and
! 67162: ** that opcode will always set the u.ay.p2 value to 2 or more or else fail.
1.2 misho 67163: ** If there were a failure, the prepared statement would have halted
67164: ** before reaching this instruction. */
1.2.2.1 ! misho 67165: if( NEVER(u.ay.p2<2) ) {
1.2 misho 67166: rc = SQLITE_CORRUPT_BKPT;
67167: goto abort_due_to_error;
67168: }
67169: }
67170: if( pOp->p4type==P4_KEYINFO ){
1.2.2.1 ! misho 67171: u.ay.pKeyInfo = pOp->p4.pKeyInfo;
! 67172: u.ay.pKeyInfo->enc = ENC(p->db);
! 67173: u.ay.nField = u.ay.pKeyInfo->nField+1;
1.2 misho 67174: }else if( pOp->p4type==P4_INT32 ){
1.2.2.1 ! misho 67175: u.ay.nField = pOp->p4.i;
1.2 misho 67176: }
67177: assert( pOp->p1>=0 );
1.2.2.1 ! misho 67178: u.ay.pCur = allocateCursor(p, pOp->p1, u.ay.nField, u.ay.iDb, 1);
! 67179: if( u.ay.pCur==0 ) goto no_mem;
! 67180: u.ay.pCur->nullRow = 1;
! 67181: u.ay.pCur->isOrdered = 1;
! 67182: rc = sqlite3BtreeCursor(u.ay.pX, u.ay.p2, u.ay.wrFlag, u.ay.pKeyInfo, u.ay.pCur->pCursor);
! 67183: u.ay.pCur->pKeyInfo = u.ay.pKeyInfo;
! 67184: assert( OPFLAG_BULKCSR==BTREE_BULKLOAD );
! 67185: sqlite3BtreeCursorHints(u.ay.pCur->pCursor, (pOp->p5 & OPFLAG_BULKCSR));
1.2 misho 67186:
67187: /* Since it performs no memory allocation or IO, the only value that
67188: ** sqlite3BtreeCursor() may return is SQLITE_OK. */
67189: assert( rc==SQLITE_OK );
67190:
67191: /* Set the VdbeCursor.isTable and isIndex variables. Previous versions of
67192: ** SQLite used to check if the root-page flags were sane at this point
67193: ** and report database corruption if they were not, but this check has
67194: ** since moved into the btree layer. */
1.2.2.1 ! misho 67195: u.ay.pCur->isTable = pOp->p4type!=P4_KEYINFO;
! 67196: u.ay.pCur->isIndex = !u.ay.pCur->isTable;
1.2 misho 67197: break;
67198: }
67199:
67200: /* Opcode: OpenEphemeral P1 P2 * P4 P5
67201: **
67202: ** Open a new cursor P1 to a transient table.
67203: ** The cursor is always opened read/write even if
67204: ** the main database is read-only. The ephemeral
67205: ** table is deleted automatically when the cursor is closed.
67206: **
67207: ** P2 is the number of columns in the ephemeral table.
67208: ** The cursor points to a BTree table if P4==0 and to a BTree index
67209: ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure
67210: ** that defines the format of keys in the index.
67211: **
67212: ** This opcode was once called OpenTemp. But that created
67213: ** confusion because the term "temp table", might refer either
67214: ** to a TEMP table at the SQL level, or to a table opened by
67215: ** this opcode. Then this opcode was call OpenVirtual. But
67216: ** that created confusion with the whole virtual-table idea.
67217: **
67218: ** The P5 parameter can be a mask of the BTREE_* flags defined
67219: ** in btree.h. These flags control aspects of the operation of
67220: ** the btree. The BTREE_OMIT_JOURNAL and BTREE_SINGLE flags are
67221: ** added automatically.
67222: */
67223: /* Opcode: OpenAutoindex P1 P2 * P4 *
67224: **
67225: ** This opcode works the same as OP_OpenEphemeral. It has a
67226: ** different name to distinguish its use. Tables created using
67227: ** by this opcode will be used for automatically created transient
67228: ** indices in joins.
67229: */
67230: case OP_OpenAutoindex:
67231: case OP_OpenEphemeral: {
1.2.2.1 ! misho 67232: #if 0 /* local variables moved into u.az */
1.2 misho 67233: VdbeCursor *pCx;
1.2.2.1 ! misho 67234: #endif /* local variables moved into u.az */
1.2 misho 67235: static const int vfsFlags =
67236: SQLITE_OPEN_READWRITE |
67237: SQLITE_OPEN_CREATE |
67238: SQLITE_OPEN_EXCLUSIVE |
67239: SQLITE_OPEN_DELETEONCLOSE |
67240: SQLITE_OPEN_TRANSIENT_DB;
67241:
67242: assert( pOp->p1>=0 );
1.2.2.1 ! misho 67243: u.az.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
! 67244: if( u.az.pCx==0 ) goto no_mem;
! 67245: u.az.pCx->nullRow = 1;
! 67246: rc = sqlite3BtreeOpen(db->pVfs, 0, db, &u.az.pCx->pBt,
1.2 misho 67247: BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
67248: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 67249: rc = sqlite3BtreeBeginTrans(u.az.pCx->pBt, 1);
1.2 misho 67250: }
67251: if( rc==SQLITE_OK ){
67252: /* If a transient index is required, create it by calling
67253: ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before
67254: ** opening it. If a transient table is required, just use the
67255: ** automatically created table with root-page 1 (an BLOB_INTKEY table).
67256: */
67257: if( pOp->p4.pKeyInfo ){
67258: int pgno;
67259: assert( pOp->p4type==P4_KEYINFO );
1.2.2.1 ! misho 67260: rc = sqlite3BtreeCreateTable(u.az.pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5);
1.2 misho 67261: if( rc==SQLITE_OK ){
67262: assert( pgno==MASTER_ROOT+1 );
1.2.2.1 ! misho 67263: rc = sqlite3BtreeCursor(u.az.pCx->pBt, pgno, 1,
! 67264: (KeyInfo*)pOp->p4.z, u.az.pCx->pCursor);
! 67265: u.az.pCx->pKeyInfo = pOp->p4.pKeyInfo;
! 67266: u.az.pCx->pKeyInfo->enc = ENC(p->db);
1.2 misho 67267: }
1.2.2.1 ! misho 67268: u.az.pCx->isTable = 0;
1.2 misho 67269: }else{
1.2.2.1 ! misho 67270: rc = sqlite3BtreeCursor(u.az.pCx->pBt, MASTER_ROOT, 1, 0, u.az.pCx->pCursor);
! 67271: u.az.pCx->isTable = 1;
1.2 misho 67272: }
67273: }
1.2.2.1 ! misho 67274: u.az.pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
! 67275: u.az.pCx->isIndex = !u.az.pCx->isTable;
1.2 misho 67276: break;
67277: }
67278:
1.2.2.1 ! misho 67279: /* Opcode: SorterOpen P1 P2 * P4 *
1.2 misho 67280: **
67281: ** This opcode works like OP_OpenEphemeral except that it opens
67282: ** a transient index that is specifically designed to sort large
67283: ** tables using an external merge-sort algorithm.
67284: */
67285: case OP_SorterOpen: {
1.2.2.1 ! misho 67286: #if 0 /* local variables moved into u.ba */
1.2 misho 67287: VdbeCursor *pCx;
1.2.2.1 ! misho 67288: #endif /* local variables moved into u.ba */
! 67289:
1.2 misho 67290: #ifndef SQLITE_OMIT_MERGE_SORT
1.2.2.1 ! misho 67291: u.ba.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
! 67292: if( u.ba.pCx==0 ) goto no_mem;
! 67293: u.ba.pCx->pKeyInfo = pOp->p4.pKeyInfo;
! 67294: u.ba.pCx->pKeyInfo->enc = ENC(p->db);
! 67295: u.ba.pCx->isSorter = 1;
! 67296: rc = sqlite3VdbeSorterInit(db, u.ba.pCx);
1.2 misho 67297: #else
67298: pOp->opcode = OP_OpenEphemeral;
67299: pc--;
67300: #endif
67301: break;
67302: }
67303:
1.2.2.1 ! misho 67304: /* Opcode: OpenPseudo P1 P2 P3 * P5
1.2 misho 67305: **
67306: ** Open a new cursor that points to a fake table that contains a single
67307: ** row of data. The content of that one row in the content of memory
1.2.2.1 ! misho 67308: ** register P2 when P5==0. In other words, cursor P1 becomes an alias for the
! 67309: ** MEM_Blob content contained in register P2. When P5==1, then the
! 67310: ** row is represented by P3 consecutive registers beginning with P2.
1.2 misho 67311: **
67312: ** A pseudo-table created by this opcode is used to hold a single
67313: ** row output from the sorter so that the row can be decomposed into
67314: ** individual columns using the OP_Column opcode. The OP_Column opcode
67315: ** is the only cursor opcode that works with a pseudo-table.
67316: **
67317: ** P3 is the number of fields in the records that will be stored by
67318: ** the pseudo-table.
67319: */
67320: case OP_OpenPseudo: {
1.2.2.1 ! misho 67321: #if 0 /* local variables moved into u.bb */
1.2 misho 67322: VdbeCursor *pCx;
1.2.2.1 ! misho 67323: #endif /* local variables moved into u.bb */
1.2 misho 67324:
67325: assert( pOp->p1>=0 );
1.2.2.1 ! misho 67326: u.bb.pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0);
! 67327: if( u.bb.pCx==0 ) goto no_mem;
! 67328: u.bb.pCx->nullRow = 1;
! 67329: u.bb.pCx->pseudoTableReg = pOp->p2;
! 67330: u.bb.pCx->isTable = 1;
! 67331: u.bb.pCx->isIndex = 0;
! 67332: u.bb.pCx->multiPseudo = pOp->p5;
1.2 misho 67333: break;
67334: }
67335:
67336: /* Opcode: Close P1 * * * *
67337: **
67338: ** Close a cursor previously opened as P1. If P1 is not
67339: ** currently open, this instruction is a no-op.
67340: */
67341: case OP_Close: {
67342: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
67343: sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
67344: p->apCsr[pOp->p1] = 0;
67345: break;
67346: }
67347:
67348: /* Opcode: SeekGe P1 P2 P3 P4 *
67349: **
67350: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
67351: ** use the value in register P3 as the key. If cursor P1 refers
67352: ** to an SQL index, then P3 is the first in an array of P4 registers
67353: ** that are used as an unpacked index key.
67354: **
67355: ** Reposition cursor P1 so that it points to the smallest entry that
67356: ** is greater than or equal to the key value. If there are no records
67357: ** greater than or equal to the key and P2 is not zero, then jump to P2.
67358: **
67359: ** See also: Found, NotFound, Distinct, SeekLt, SeekGt, SeekLe
67360: */
67361: /* Opcode: SeekGt P1 P2 P3 P4 *
67362: **
67363: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
67364: ** use the value in register P3 as a key. If cursor P1 refers
67365: ** to an SQL index, then P3 is the first in an array of P4 registers
67366: ** that are used as an unpacked index key.
67367: **
67368: ** Reposition cursor P1 so that it points to the smallest entry that
67369: ** is greater than the key value. If there are no records greater than
67370: ** the key and P2 is not zero, then jump to P2.
67371: **
67372: ** See also: Found, NotFound, Distinct, SeekLt, SeekGe, SeekLe
67373: */
67374: /* Opcode: SeekLt P1 P2 P3 P4 *
67375: **
67376: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
67377: ** use the value in register P3 as a key. If cursor P1 refers
67378: ** to an SQL index, then P3 is the first in an array of P4 registers
67379: ** that are used as an unpacked index key.
67380: **
67381: ** Reposition cursor P1 so that it points to the largest entry that
67382: ** is less than the key value. If there are no records less than
67383: ** the key and P2 is not zero, then jump to P2.
67384: **
67385: ** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLe
67386: */
67387: /* Opcode: SeekLe P1 P2 P3 P4 *
67388: **
67389: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
67390: ** use the value in register P3 as a key. If cursor P1 refers
67391: ** to an SQL index, then P3 is the first in an array of P4 registers
67392: ** that are used as an unpacked index key.
67393: **
67394: ** Reposition cursor P1 so that it points to the largest entry that
67395: ** is less than or equal to the key value. If there are no records
67396: ** less than or equal to the key and P2 is not zero, then jump to P2.
67397: **
67398: ** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLt
67399: */
67400: case OP_SeekLt: /* jump, in3 */
67401: case OP_SeekLe: /* jump, in3 */
67402: case OP_SeekGe: /* jump, in3 */
67403: case OP_SeekGt: { /* jump, in3 */
1.2.2.1 ! misho 67404: #if 0 /* local variables moved into u.bc */
1.2 misho 67405: int res;
67406: int oc;
67407: VdbeCursor *pC;
67408: UnpackedRecord r;
67409: int nField;
67410: i64 iKey; /* The rowid we are to seek to */
1.2.2.1 ! misho 67411: #endif /* local variables moved into u.bc */
1.2 misho 67412:
67413: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
67414: assert( pOp->p2!=0 );
1.2.2.1 ! misho 67415: u.bc.pC = p->apCsr[pOp->p1];
! 67416: assert( u.bc.pC!=0 );
! 67417: assert( u.bc.pC->pseudoTableReg==0 );
1.2 misho 67418: assert( OP_SeekLe == OP_SeekLt+1 );
67419: assert( OP_SeekGe == OP_SeekLt+2 );
67420: assert( OP_SeekGt == OP_SeekLt+3 );
1.2.2.1 ! misho 67421: assert( u.bc.pC->isOrdered );
! 67422: if( ALWAYS(u.bc.pC->pCursor!=0) ){
! 67423: u.bc.oc = pOp->opcode;
! 67424: u.bc.pC->nullRow = 0;
! 67425: if( u.bc.pC->isTable ){
1.2 misho 67426: /* The input value in P3 might be of any type: integer, real, string,
67427: ** blob, or NULL. But it needs to be an integer before we can do
67428: ** the seek, so covert it. */
67429: pIn3 = &aMem[pOp->p3];
67430: applyNumericAffinity(pIn3);
1.2.2.1 ! misho 67431: u.bc.iKey = sqlite3VdbeIntValue(pIn3);
! 67432: u.bc.pC->rowidIsValid = 0;
1.2 misho 67433:
67434: /* If the P3 value could not be converted into an integer without
67435: ** loss of information, then special processing is required... */
67436: if( (pIn3->flags & MEM_Int)==0 ){
67437: if( (pIn3->flags & MEM_Real)==0 ){
67438: /* If the P3 value cannot be converted into any kind of a number,
67439: ** then the seek is not possible, so jump to P2 */
67440: pc = pOp->p2 - 1;
67441: break;
67442: }
67443: /* If we reach this point, then the P3 value must be a floating
67444: ** point number. */
67445: assert( (pIn3->flags & MEM_Real)!=0 );
67446:
1.2.2.1 ! misho 67447: if( u.bc.iKey==SMALLEST_INT64 && (pIn3->r<(double)u.bc.iKey || pIn3->r>0) ){
1.2 misho 67448: /* The P3 value is too large in magnitude to be expressed as an
67449: ** integer. */
1.2.2.1 ! misho 67450: u.bc.res = 1;
1.2 misho 67451: if( pIn3->r<0 ){
1.2.2.1 ! misho 67452: if( u.bc.oc>=OP_SeekGe ){ assert( u.bc.oc==OP_SeekGe || u.bc.oc==OP_SeekGt );
! 67453: rc = sqlite3BtreeFirst(u.bc.pC->pCursor, &u.bc.res);
1.2 misho 67454: if( rc!=SQLITE_OK ) goto abort_due_to_error;
67455: }
67456: }else{
1.2.2.1 ! misho 67457: if( u.bc.oc<=OP_SeekLe ){ assert( u.bc.oc==OP_SeekLt || u.bc.oc==OP_SeekLe );
! 67458: rc = sqlite3BtreeLast(u.bc.pC->pCursor, &u.bc.res);
1.2 misho 67459: if( rc!=SQLITE_OK ) goto abort_due_to_error;
67460: }
67461: }
1.2.2.1 ! misho 67462: if( u.bc.res ){
1.2 misho 67463: pc = pOp->p2 - 1;
67464: }
67465: break;
1.2.2.1 ! misho 67466: }else if( u.bc.oc==OP_SeekLt || u.bc.oc==OP_SeekGe ){
1.2 misho 67467: /* Use the ceiling() function to convert real->int */
1.2.2.1 ! misho 67468: if( pIn3->r > (double)u.bc.iKey ) u.bc.iKey++;
1.2 misho 67469: }else{
67470: /* Use the floor() function to convert real->int */
1.2.2.1 ! misho 67471: assert( u.bc.oc==OP_SeekLe || u.bc.oc==OP_SeekGt );
! 67472: if( pIn3->r < (double)u.bc.iKey ) u.bc.iKey--;
1.2 misho 67473: }
67474: }
1.2.2.1 ! misho 67475: rc = sqlite3BtreeMovetoUnpacked(u.bc.pC->pCursor, 0, (u64)u.bc.iKey, 0, &u.bc.res);
1.2 misho 67476: if( rc!=SQLITE_OK ){
67477: goto abort_due_to_error;
67478: }
1.2.2.1 ! misho 67479: if( u.bc.res==0 ){
! 67480: u.bc.pC->rowidIsValid = 1;
! 67481: u.bc.pC->lastRowid = u.bc.iKey;
1.2 misho 67482: }
67483: }else{
1.2.2.1 ! misho 67484: u.bc.nField = pOp->p4.i;
1.2 misho 67485: assert( pOp->p4type==P4_INT32 );
1.2.2.1 ! misho 67486: assert( u.bc.nField>0 );
! 67487: u.bc.r.pKeyInfo = u.bc.pC->pKeyInfo;
! 67488: u.bc.r.nField = (u16)u.bc.nField;
1.2 misho 67489:
67490: /* The next line of code computes as follows, only faster:
1.2.2.1 ! misho 67491: ** if( u.bc.oc==OP_SeekGt || u.bc.oc==OP_SeekLe ){
! 67492: ** u.bc.r.flags = UNPACKED_INCRKEY;
1.2 misho 67493: ** }else{
1.2.2.1 ! misho 67494: ** u.bc.r.flags = 0;
1.2 misho 67495: ** }
67496: */
1.2.2.1 ! misho 67497: u.bc.r.flags = (u16)(UNPACKED_INCRKEY * (1 & (u.bc.oc - OP_SeekLt)));
! 67498: assert( u.bc.oc!=OP_SeekGt || u.bc.r.flags==UNPACKED_INCRKEY );
! 67499: assert( u.bc.oc!=OP_SeekLe || u.bc.r.flags==UNPACKED_INCRKEY );
! 67500: assert( u.bc.oc!=OP_SeekGe || u.bc.r.flags==0 );
! 67501: assert( u.bc.oc!=OP_SeekLt || u.bc.r.flags==0 );
1.2 misho 67502:
1.2.2.1 ! misho 67503: u.bc.r.aMem = &aMem[pOp->p3];
1.2 misho 67504: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 67505: { int i; for(i=0; i<u.bc.r.nField; i++) assert( memIsValid(&u.bc.r.aMem[i]) ); }
1.2 misho 67506: #endif
1.2.2.1 ! misho 67507: ExpandBlob(u.bc.r.aMem);
! 67508: rc = sqlite3BtreeMovetoUnpacked(u.bc.pC->pCursor, &u.bc.r, 0, 0, &u.bc.res);
1.2 misho 67509: if( rc!=SQLITE_OK ){
67510: goto abort_due_to_error;
67511: }
1.2.2.1 ! misho 67512: u.bc.pC->rowidIsValid = 0;
1.2 misho 67513: }
1.2.2.1 ! misho 67514: u.bc.pC->deferredMoveto = 0;
! 67515: u.bc.pC->cacheStatus = CACHE_STALE;
1.2 misho 67516: #ifdef SQLITE_TEST
67517: sqlite3_search_count++;
67518: #endif
1.2.2.1 ! misho 67519: if( u.bc.oc>=OP_SeekGe ){ assert( u.bc.oc==OP_SeekGe || u.bc.oc==OP_SeekGt );
! 67520: if( u.bc.res<0 || (u.bc.res==0 && u.bc.oc==OP_SeekGt) ){
! 67521: rc = sqlite3BtreeNext(u.bc.pC->pCursor, &u.bc.res);
1.2 misho 67522: if( rc!=SQLITE_OK ) goto abort_due_to_error;
1.2.2.1 ! misho 67523: u.bc.pC->rowidIsValid = 0;
1.2 misho 67524: }else{
1.2.2.1 ! misho 67525: u.bc.res = 0;
1.2 misho 67526: }
67527: }else{
1.2.2.1 ! misho 67528: assert( u.bc.oc==OP_SeekLt || u.bc.oc==OP_SeekLe );
! 67529: if( u.bc.res>0 || (u.bc.res==0 && u.bc.oc==OP_SeekLt) ){
! 67530: rc = sqlite3BtreePrevious(u.bc.pC->pCursor, &u.bc.res);
1.2 misho 67531: if( rc!=SQLITE_OK ) goto abort_due_to_error;
1.2.2.1 ! misho 67532: u.bc.pC->rowidIsValid = 0;
1.2 misho 67533: }else{
1.2.2.1 ! misho 67534: /* u.bc.res might be negative because the table is empty. Check to
1.2 misho 67535: ** see if this is the case.
67536: */
1.2.2.1 ! misho 67537: u.bc.res = sqlite3BtreeEof(u.bc.pC->pCursor);
1.2 misho 67538: }
67539: }
67540: assert( pOp->p2>0 );
1.2.2.1 ! misho 67541: if( u.bc.res ){
1.2 misho 67542: pc = pOp->p2 - 1;
67543: }
67544: }else{
67545: /* This happens when attempting to open the sqlite3_master table
67546: ** for read access returns SQLITE_EMPTY. In this case always
67547: ** take the jump (since there are no records in the table).
67548: */
67549: pc = pOp->p2 - 1;
67550: }
67551: break;
67552: }
67553:
67554: /* Opcode: Seek P1 P2 * * *
67555: **
67556: ** P1 is an open table cursor and P2 is a rowid integer. Arrange
67557: ** for P1 to move so that it points to the rowid given by P2.
67558: **
67559: ** This is actually a deferred seek. Nothing actually happens until
67560: ** the cursor is used to read a record. That way, if no reads
67561: ** occur, no unnecessary I/O happens.
67562: */
67563: case OP_Seek: { /* in2 */
1.2.2.1 ! misho 67564: #if 0 /* local variables moved into u.bd */
1.2 misho 67565: VdbeCursor *pC;
1.2.2.1 ! misho 67566: #endif /* local variables moved into u.bd */
1.2 misho 67567:
67568: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 67569: u.bd.pC = p->apCsr[pOp->p1];
! 67570: assert( u.bd.pC!=0 );
! 67571: if( ALWAYS(u.bd.pC->pCursor!=0) ){
! 67572: assert( u.bd.pC->isTable );
! 67573: u.bd.pC->nullRow = 0;
1.2 misho 67574: pIn2 = &aMem[pOp->p2];
1.2.2.1 ! misho 67575: u.bd.pC->movetoTarget = sqlite3VdbeIntValue(pIn2);
! 67576: u.bd.pC->rowidIsValid = 0;
! 67577: u.bd.pC->deferredMoveto = 1;
1.2 misho 67578: }
67579: break;
67580: }
67581:
67582:
67583: /* Opcode: Found P1 P2 P3 P4 *
67584: **
67585: ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If
67586: ** P4>0 then register P3 is the first of P4 registers that form an unpacked
67587: ** record.
67588: **
67589: ** Cursor P1 is on an index btree. If the record identified by P3 and P4
67590: ** is a prefix of any entry in P1 then a jump is made to P2 and
67591: ** P1 is left pointing at the matching entry.
67592: */
67593: /* Opcode: NotFound P1 P2 P3 P4 *
67594: **
67595: ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If
67596: ** P4>0 then register P3 is the first of P4 registers that form an unpacked
67597: ** record.
67598: **
67599: ** Cursor P1 is on an index btree. If the record identified by P3 and P4
67600: ** is not the prefix of any entry in P1 then a jump is made to P2. If P1
67601: ** does contain an entry whose prefix matches the P3/P4 record then control
67602: ** falls through to the next instruction and P1 is left pointing at the
67603: ** matching entry.
67604: **
67605: ** See also: Found, NotExists, IsUnique
67606: */
67607: case OP_NotFound: /* jump, in3 */
67608: case OP_Found: { /* jump, in3 */
1.2.2.1 ! misho 67609: #if 0 /* local variables moved into u.be */
1.2 misho 67610: int alreadyExists;
67611: VdbeCursor *pC;
67612: int res;
67613: char *pFree;
67614: UnpackedRecord *pIdxKey;
67615: UnpackedRecord r;
67616: char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
1.2.2.1 ! misho 67617: #endif /* local variables moved into u.be */
1.2 misho 67618:
67619: #ifdef SQLITE_TEST
67620: sqlite3_found_count++;
67621: #endif
67622:
1.2.2.1 ! misho 67623: u.be.alreadyExists = 0;
1.2 misho 67624: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
67625: assert( pOp->p4type==P4_INT32 );
1.2.2.1 ! misho 67626: u.be.pC = p->apCsr[pOp->p1];
! 67627: assert( u.be.pC!=0 );
1.2 misho 67628: pIn3 = &aMem[pOp->p3];
1.2.2.1 ! misho 67629: if( ALWAYS(u.be.pC->pCursor!=0) ){
1.2 misho 67630:
1.2.2.1 ! misho 67631: assert( u.be.pC->isTable==0 );
1.2 misho 67632: if( pOp->p4.i>0 ){
1.2.2.1 ! misho 67633: u.be.r.pKeyInfo = u.be.pC->pKeyInfo;
! 67634: u.be.r.nField = (u16)pOp->p4.i;
! 67635: u.be.r.aMem = pIn3;
1.2 misho 67636: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 67637: { int i; for(i=0; i<u.be.r.nField; i++) assert( memIsValid(&u.be.r.aMem[i]) ); }
1.2 misho 67638: #endif
1.2.2.1 ! misho 67639: u.be.r.flags = UNPACKED_PREFIX_MATCH;
! 67640: u.be.pIdxKey = &u.be.r;
1.2 misho 67641: }else{
1.2.2.1 ! misho 67642: u.be.pIdxKey = sqlite3VdbeAllocUnpackedRecord(
! 67643: u.be.pC->pKeyInfo, u.be.aTempRec, sizeof(u.be.aTempRec), &u.be.pFree
1.2 misho 67644: );
1.2.2.1 ! misho 67645: if( u.be.pIdxKey==0 ) goto no_mem;
1.2 misho 67646: assert( pIn3->flags & MEM_Blob );
67647: assert( (pIn3->flags & MEM_Zero)==0 ); /* zeroblobs already expanded */
1.2.2.1 ! misho 67648: sqlite3VdbeRecordUnpack(u.be.pC->pKeyInfo, pIn3->n, pIn3->z, u.be.pIdxKey);
! 67649: u.be.pIdxKey->flags |= UNPACKED_PREFIX_MATCH;
1.2 misho 67650: }
1.2.2.1 ! misho 67651: rc = sqlite3BtreeMovetoUnpacked(u.be.pC->pCursor, u.be.pIdxKey, 0, 0, &u.be.res);
1.2 misho 67652: if( pOp->p4.i==0 ){
1.2.2.1 ! misho 67653: sqlite3DbFree(db, u.be.pFree);
1.2 misho 67654: }
67655: if( rc!=SQLITE_OK ){
67656: break;
67657: }
1.2.2.1 ! misho 67658: u.be.alreadyExists = (u.be.res==0);
! 67659: u.be.pC->deferredMoveto = 0;
! 67660: u.be.pC->cacheStatus = CACHE_STALE;
1.2 misho 67661: }
67662: if( pOp->opcode==OP_Found ){
1.2.2.1 ! misho 67663: if( u.be.alreadyExists ) pc = pOp->p2 - 1;
1.2 misho 67664: }else{
1.2.2.1 ! misho 67665: if( !u.be.alreadyExists ) pc = pOp->p2 - 1;
1.2 misho 67666: }
67667: break;
67668: }
67669:
67670: /* Opcode: IsUnique P1 P2 P3 P4 *
67671: **
67672: ** Cursor P1 is open on an index b-tree - that is to say, a btree which
67673: ** no data and where the key are records generated by OP_MakeRecord with
67674: ** the list field being the integer ROWID of the entry that the index
67675: ** entry refers to.
67676: **
67677: ** The P3 register contains an integer record number. Call this record
67678: ** number R. Register P4 is the first in a set of N contiguous registers
67679: ** that make up an unpacked index key that can be used with cursor P1.
67680: ** The value of N can be inferred from the cursor. N includes the rowid
67681: ** value appended to the end of the index record. This rowid value may
67682: ** or may not be the same as R.
67683: **
67684: ** If any of the N registers beginning with register P4 contains a NULL
67685: ** value, jump immediately to P2.
67686: **
67687: ** Otherwise, this instruction checks if cursor P1 contains an entry
67688: ** where the first (N-1) fields match but the rowid value at the end
67689: ** of the index entry is not R. If there is no such entry, control jumps
67690: ** to instruction P2. Otherwise, the rowid of the conflicting index
67691: ** entry is copied to register P3 and control falls through to the next
67692: ** instruction.
67693: **
67694: ** See also: NotFound, NotExists, Found
67695: */
67696: case OP_IsUnique: { /* jump, in3 */
1.2.2.1 ! misho 67697: #if 0 /* local variables moved into u.bf */
1.2 misho 67698: u16 ii;
67699: VdbeCursor *pCx;
67700: BtCursor *pCrsr;
67701: u16 nField;
67702: Mem *aMx;
67703: UnpackedRecord r; /* B-Tree index search key */
67704: i64 R; /* Rowid stored in register P3 */
1.2.2.1 ! misho 67705: #endif /* local variables moved into u.bf */
1.2 misho 67706:
67707: pIn3 = &aMem[pOp->p3];
1.2.2.1 ! misho 67708: u.bf.aMx = &aMem[pOp->p4.i];
1.2 misho 67709: /* Assert that the values of parameters P1 and P4 are in range. */
67710: assert( pOp->p4type==P4_INT32 );
67711: assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem );
67712: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
67713:
67714: /* Find the index cursor. */
1.2.2.1 ! misho 67715: u.bf.pCx = p->apCsr[pOp->p1];
! 67716: assert( u.bf.pCx->deferredMoveto==0 );
! 67717: u.bf.pCx->seekResult = 0;
! 67718: u.bf.pCx->cacheStatus = CACHE_STALE;
! 67719: u.bf.pCrsr = u.bf.pCx->pCursor;
1.2 misho 67720:
67721: /* If any of the values are NULL, take the jump. */
1.2.2.1 ! misho 67722: u.bf.nField = u.bf.pCx->pKeyInfo->nField;
! 67723: for(u.bf.ii=0; u.bf.ii<u.bf.nField; u.bf.ii++){
! 67724: if( u.bf.aMx[u.bf.ii].flags & MEM_Null ){
1.2 misho 67725: pc = pOp->p2 - 1;
1.2.2.1 ! misho 67726: u.bf.pCrsr = 0;
1.2 misho 67727: break;
67728: }
67729: }
1.2.2.1 ! misho 67730: assert( (u.bf.aMx[u.bf.nField].flags & MEM_Null)==0 );
1.2 misho 67731:
1.2.2.1 ! misho 67732: if( u.bf.pCrsr!=0 ){
1.2 misho 67733: /* Populate the index search key. */
1.2.2.1 ! misho 67734: u.bf.r.pKeyInfo = u.bf.pCx->pKeyInfo;
! 67735: u.bf.r.nField = u.bf.nField + 1;
! 67736: u.bf.r.flags = UNPACKED_PREFIX_SEARCH;
! 67737: u.bf.r.aMem = u.bf.aMx;
1.2 misho 67738: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 67739: { int i; for(i=0; i<u.bf.r.nField; i++) assert( memIsValid(&u.bf.r.aMem[i]) ); }
1.2 misho 67740: #endif
67741:
1.2.2.1 ! misho 67742: /* Extract the value of u.bf.R from register P3. */
1.2 misho 67743: sqlite3VdbeMemIntegerify(pIn3);
1.2.2.1 ! misho 67744: u.bf.R = pIn3->u.i;
1.2 misho 67745:
67746: /* Search the B-Tree index. If no conflicting record is found, jump
67747: ** to P2. Otherwise, copy the rowid of the conflicting record to
67748: ** register P3 and fall through to the next instruction. */
1.2.2.1 ! misho 67749: rc = sqlite3BtreeMovetoUnpacked(u.bf.pCrsr, &u.bf.r, 0, 0, &u.bf.pCx->seekResult);
! 67750: if( (u.bf.r.flags & UNPACKED_PREFIX_SEARCH) || u.bf.r.rowid==u.bf.R ){
1.2 misho 67751: pc = pOp->p2 - 1;
67752: }else{
1.2.2.1 ! misho 67753: pIn3->u.i = u.bf.r.rowid;
1.2 misho 67754: }
67755: }
67756: break;
67757: }
67758:
67759: /* Opcode: NotExists P1 P2 P3 * *
67760: **
67761: ** Use the content of register P3 as an integer key. If a record
67762: ** with that key does not exist in table of P1, then jump to P2.
67763: ** If the record does exist, then fall through. The cursor is left
67764: ** pointing to the record if it exists.
67765: **
67766: ** The difference between this operation and NotFound is that this
67767: ** operation assumes the key is an integer and that P1 is a table whereas
67768: ** NotFound assumes key is a blob constructed from MakeRecord and
67769: ** P1 is an index.
67770: **
67771: ** See also: Found, NotFound, IsUnique
67772: */
67773: case OP_NotExists: { /* jump, in3 */
1.2.2.1 ! misho 67774: #if 0 /* local variables moved into u.bg */
1.2 misho 67775: VdbeCursor *pC;
67776: BtCursor *pCrsr;
67777: int res;
67778: u64 iKey;
1.2.2.1 ! misho 67779: #endif /* local variables moved into u.bg */
1.2 misho 67780:
67781: pIn3 = &aMem[pOp->p3];
67782: assert( pIn3->flags & MEM_Int );
67783: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 67784: u.bg.pC = p->apCsr[pOp->p1];
! 67785: assert( u.bg.pC!=0 );
! 67786: assert( u.bg.pC->isTable );
! 67787: assert( u.bg.pC->pseudoTableReg==0 );
! 67788: u.bg.pCrsr = u.bg.pC->pCursor;
! 67789: if( ALWAYS(u.bg.pCrsr!=0) ){
! 67790: u.bg.res = 0;
! 67791: u.bg.iKey = pIn3->u.i;
! 67792: rc = sqlite3BtreeMovetoUnpacked(u.bg.pCrsr, 0, u.bg.iKey, 0, &u.bg.res);
! 67793: u.bg.pC->lastRowid = pIn3->u.i;
! 67794: u.bg.pC->rowidIsValid = u.bg.res==0 ?1:0;
! 67795: u.bg.pC->nullRow = 0;
! 67796: u.bg.pC->cacheStatus = CACHE_STALE;
! 67797: u.bg.pC->deferredMoveto = 0;
! 67798: if( u.bg.res!=0 ){
1.2 misho 67799: pc = pOp->p2 - 1;
1.2.2.1 ! misho 67800: assert( u.bg.pC->rowidIsValid==0 );
1.2 misho 67801: }
1.2.2.1 ! misho 67802: u.bg.pC->seekResult = u.bg.res;
1.2 misho 67803: }else{
67804: /* This happens when an attempt to open a read cursor on the
67805: ** sqlite_master table returns SQLITE_EMPTY.
67806: */
67807: pc = pOp->p2 - 1;
1.2.2.1 ! misho 67808: assert( u.bg.pC->rowidIsValid==0 );
! 67809: u.bg.pC->seekResult = 0;
1.2 misho 67810: }
67811: break;
67812: }
67813:
67814: /* Opcode: Sequence P1 P2 * * *
67815: **
67816: ** Find the next available sequence number for cursor P1.
67817: ** Write the sequence number into register P2.
67818: ** The sequence number on the cursor is incremented after this
67819: ** instruction.
67820: */
67821: case OP_Sequence: { /* out2-prerelease */
67822: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
67823: assert( p->apCsr[pOp->p1]!=0 );
67824: pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
67825: break;
67826: }
67827:
67828:
67829: /* Opcode: NewRowid P1 P2 P3 * *
67830: **
67831: ** Get a new integer record number (a.k.a "rowid") used as the key to a table.
67832: ** The record number is not previously used as a key in the database
67833: ** table that cursor P1 points to. The new record number is written
67834: ** written to register P2.
67835: **
67836: ** If P3>0 then P3 is a register in the root frame of this VDBE that holds
67837: ** the largest previously generated record number. No new record numbers are
67838: ** allowed to be less than this value. When this value reaches its maximum,
67839: ** an SQLITE_FULL error is generated. The P3 register is updated with the '
67840: ** generated record number. This P3 mechanism is used to help implement the
67841: ** AUTOINCREMENT feature.
67842: */
67843: case OP_NewRowid: { /* out2-prerelease */
1.2.2.1 ! misho 67844: #if 0 /* local variables moved into u.bh */
1.2 misho 67845: i64 v; /* The new rowid */
67846: VdbeCursor *pC; /* Cursor of table to get the new rowid */
67847: int res; /* Result of an sqlite3BtreeLast() */
67848: int cnt; /* Counter to limit the number of searches */
67849: Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */
67850: VdbeFrame *pFrame; /* Root frame of VDBE */
1.2.2.1 ! misho 67851: #endif /* local variables moved into u.bh */
1.2 misho 67852:
1.2.2.1 ! misho 67853: u.bh.v = 0;
! 67854: u.bh.res = 0;
1.2 misho 67855: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 67856: u.bh.pC = p->apCsr[pOp->p1];
! 67857: assert( u.bh.pC!=0 );
! 67858: if( NEVER(u.bh.pC->pCursor==0) ){
1.2 misho 67859: /* The zero initialization above is all that is needed */
67860: }else{
67861: /* The next rowid or record number (different terms for the same
67862: ** thing) is obtained in a two-step algorithm.
67863: **
67864: ** First we attempt to find the largest existing rowid and add one
67865: ** to that. But if the largest existing rowid is already the maximum
67866: ** positive integer, we have to fall through to the second
67867: ** probabilistic algorithm
67868: **
67869: ** The second algorithm is to select a rowid at random and see if
67870: ** it already exists in the table. If it does not exist, we have
67871: ** succeeded. If the random rowid does exist, we select a new one
67872: ** and try again, up to 100 times.
67873: */
1.2.2.1 ! misho 67874: assert( u.bh.pC->isTable );
1.2 misho 67875:
67876: #ifdef SQLITE_32BIT_ROWID
67877: # define MAX_ROWID 0x7fffffff
67878: #else
67879: /* Some compilers complain about constants of the form 0x7fffffffffffffff.
67880: ** Others complain about 0x7ffffffffffffffffLL. The following macro seems
67881: ** to provide the constant while making all compilers happy.
67882: */
67883: # define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
67884: #endif
67885:
1.2.2.1 ! misho 67886: if( !u.bh.pC->useRandomRowid ){
! 67887: u.bh.v = sqlite3BtreeGetCachedRowid(u.bh.pC->pCursor);
! 67888: if( u.bh.v==0 ){
! 67889: rc = sqlite3BtreeLast(u.bh.pC->pCursor, &u.bh.res);
1.2 misho 67890: if( rc!=SQLITE_OK ){
67891: goto abort_due_to_error;
67892: }
1.2.2.1 ! misho 67893: if( u.bh.res ){
! 67894: u.bh.v = 1; /* IMP: R-61914-48074 */
1.2 misho 67895: }else{
1.2.2.1 ! misho 67896: assert( sqlite3BtreeCursorIsValid(u.bh.pC->pCursor) );
! 67897: rc = sqlite3BtreeKeySize(u.bh.pC->pCursor, &u.bh.v);
1.2 misho 67898: assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */
1.2.2.1 ! misho 67899: if( u.bh.v>=MAX_ROWID ){
! 67900: u.bh.pC->useRandomRowid = 1;
1.2 misho 67901: }else{
1.2.2.1 ! misho 67902: u.bh.v++; /* IMP: R-29538-34987 */
1.2 misho 67903: }
67904: }
67905: }
67906:
67907: #ifndef SQLITE_OMIT_AUTOINCREMENT
67908: if( pOp->p3 ){
67909: /* Assert that P3 is a valid memory cell. */
67910: assert( pOp->p3>0 );
67911: if( p->pFrame ){
1.2.2.1 ! misho 67912: for(u.bh.pFrame=p->pFrame; u.bh.pFrame->pParent; u.bh.pFrame=u.bh.pFrame->pParent);
1.2 misho 67913: /* Assert that P3 is a valid memory cell. */
1.2.2.1 ! misho 67914: assert( pOp->p3<=u.bh.pFrame->nMem );
! 67915: u.bh.pMem = &u.bh.pFrame->aMem[pOp->p3];
1.2 misho 67916: }else{
67917: /* Assert that P3 is a valid memory cell. */
67918: assert( pOp->p3<=p->nMem );
1.2.2.1 ! misho 67919: u.bh.pMem = &aMem[pOp->p3];
! 67920: memAboutToChange(p, u.bh.pMem);
1.2 misho 67921: }
1.2.2.1 ! misho 67922: assert( memIsValid(u.bh.pMem) );
1.2 misho 67923:
1.2.2.1 ! misho 67924: REGISTER_TRACE(pOp->p3, u.bh.pMem);
! 67925: sqlite3VdbeMemIntegerify(u.bh.pMem);
! 67926: assert( (u.bh.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */
! 67927: if( u.bh.pMem->u.i==MAX_ROWID || u.bh.pC->useRandomRowid ){
1.2 misho 67928: rc = SQLITE_FULL; /* IMP: R-12275-61338 */
67929: goto abort_due_to_error;
67930: }
1.2.2.1 ! misho 67931: if( u.bh.v<u.bh.pMem->u.i+1 ){
! 67932: u.bh.v = u.bh.pMem->u.i + 1;
1.2 misho 67933: }
1.2.2.1 ! misho 67934: u.bh.pMem->u.i = u.bh.v;
1.2 misho 67935: }
67936: #endif
67937:
1.2.2.1 ! misho 67938: sqlite3BtreeSetCachedRowid(u.bh.pC->pCursor, u.bh.v<MAX_ROWID ? u.bh.v+1 : 0);
1.2 misho 67939: }
1.2.2.1 ! misho 67940: if( u.bh.pC->useRandomRowid ){
1.2 misho 67941: /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the
67942: ** largest possible integer (9223372036854775807) then the database
67943: ** engine starts picking positive candidate ROWIDs at random until
67944: ** it finds one that is not previously used. */
67945: assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is
67946: ** an AUTOINCREMENT table. */
67947: /* on the first attempt, simply do one more than previous */
1.2.2.1 ! misho 67948: u.bh.v = lastRowid;
! 67949: u.bh.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
! 67950: u.bh.v++; /* ensure non-zero */
! 67951: u.bh.cnt = 0;
! 67952: while( ((rc = sqlite3BtreeMovetoUnpacked(u.bh.pC->pCursor, 0, (u64)u.bh.v,
! 67953: 0, &u.bh.res))==SQLITE_OK)
! 67954: && (u.bh.res==0)
! 67955: && (++u.bh.cnt<100)){
1.2 misho 67956: /* collision - try another random rowid */
1.2.2.1 ! misho 67957: sqlite3_randomness(sizeof(u.bh.v), &u.bh.v);
! 67958: if( u.bh.cnt<5 ){
1.2 misho 67959: /* try "small" random rowids for the initial attempts */
1.2.2.1 ! misho 67960: u.bh.v &= 0xffffff;
1.2 misho 67961: }else{
1.2.2.1 ! misho 67962: u.bh.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
1.2 misho 67963: }
1.2.2.1 ! misho 67964: u.bh.v++; /* ensure non-zero */
1.2 misho 67965: }
1.2.2.1 ! misho 67966: if( rc==SQLITE_OK && u.bh.res==0 ){
1.2 misho 67967: rc = SQLITE_FULL; /* IMP: R-38219-53002 */
67968: goto abort_due_to_error;
67969: }
1.2.2.1 ! misho 67970: assert( u.bh.v>0 ); /* EV: R-40812-03570 */
1.2 misho 67971: }
1.2.2.1 ! misho 67972: u.bh.pC->rowidIsValid = 0;
! 67973: u.bh.pC->deferredMoveto = 0;
! 67974: u.bh.pC->cacheStatus = CACHE_STALE;
1.2 misho 67975: }
1.2.2.1 ! misho 67976: pOut->u.i = u.bh.v;
1.2 misho 67977: break;
67978: }
67979:
67980: /* Opcode: Insert P1 P2 P3 P4 P5
67981: **
67982: ** Write an entry into the table of cursor P1. A new entry is
67983: ** created if it doesn't already exist or the data for an existing
67984: ** entry is overwritten. The data is the value MEM_Blob stored in register
67985: ** number P2. The key is stored in register P3. The key must
67986: ** be a MEM_Int.
67987: **
67988: ** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is
67989: ** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set,
67990: ** then rowid is stored for subsequent return by the
67991: ** sqlite3_last_insert_rowid() function (otherwise it is unmodified).
67992: **
67993: ** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of
67994: ** the last seek operation (OP_NotExists) was a success, then this
67995: ** operation will not attempt to find the appropriate row before doing
67996: ** the insert but will instead overwrite the row that the cursor is
67997: ** currently pointing to. Presumably, the prior OP_NotExists opcode
67998: ** has already positioned the cursor correctly. This is an optimization
67999: ** that boosts performance by avoiding redundant seeks.
68000: **
68001: ** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an
68002: ** UPDATE operation. Otherwise (if the flag is clear) then this opcode
68003: ** is part of an INSERT operation. The difference is only important to
68004: ** the update hook.
68005: **
68006: ** Parameter P4 may point to a string containing the table-name, or
68007: ** may be NULL. If it is not NULL, then the update-hook
68008: ** (sqlite3.xUpdateCallback) is invoked following a successful insert.
68009: **
68010: ** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically
68011: ** allocated, then ownership of P2 is transferred to the pseudo-cursor
68012: ** and register P2 becomes ephemeral. If the cursor is changed, the
68013: ** value of register P2 will then change. Make sure this does not
68014: ** cause any problems.)
68015: **
68016: ** This instruction only works on tables. The equivalent instruction
68017: ** for indices is OP_IdxInsert.
68018: */
68019: /* Opcode: InsertInt P1 P2 P3 P4 P5
68020: **
68021: ** This works exactly like OP_Insert except that the key is the
68022: ** integer value P3, not the value of the integer stored in register P3.
68023: */
68024: case OP_Insert:
68025: case OP_InsertInt: {
1.2.2.1 ! misho 68026: #if 0 /* local variables moved into u.bi */
1.2 misho 68027: Mem *pData; /* MEM cell holding data for the record to be inserted */
68028: Mem *pKey; /* MEM cell holding key for the record */
68029: i64 iKey; /* The integer ROWID or key for the record to be inserted */
68030: VdbeCursor *pC; /* Cursor to table into which insert is written */
68031: int nZero; /* Number of zero-bytes to append */
68032: int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
68033: const char *zDb; /* database name - used by the update hook */
68034: const char *zTbl; /* Table name - used by the opdate hook */
68035: int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
1.2.2.1 ! misho 68036: #endif /* local variables moved into u.bi */
1.2 misho 68037:
1.2.2.1 ! misho 68038: u.bi.pData = &aMem[pOp->p2];
1.2 misho 68039: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68040: assert( memIsValid(u.bi.pData) );
! 68041: u.bi.pC = p->apCsr[pOp->p1];
! 68042: assert( u.bi.pC!=0 );
! 68043: assert( u.bi.pC->pCursor!=0 );
! 68044: assert( u.bi.pC->pseudoTableReg==0 );
! 68045: assert( u.bi.pC->isTable );
! 68046: REGISTER_TRACE(pOp->p2, u.bi.pData);
1.2 misho 68047:
68048: if( pOp->opcode==OP_Insert ){
1.2.2.1 ! misho 68049: u.bi.pKey = &aMem[pOp->p3];
! 68050: assert( u.bi.pKey->flags & MEM_Int );
! 68051: assert( memIsValid(u.bi.pKey) );
! 68052: REGISTER_TRACE(pOp->p3, u.bi.pKey);
! 68053: u.bi.iKey = u.bi.pKey->u.i;
1.2 misho 68054: }else{
68055: assert( pOp->opcode==OP_InsertInt );
1.2.2.1 ! misho 68056: u.bi.iKey = pOp->p3;
1.2 misho 68057: }
68058:
68059: if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
1.2.2.1 ! misho 68060: if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = u.bi.iKey;
! 68061: if( u.bi.pData->flags & MEM_Null ){
! 68062: u.bi.pData->z = 0;
! 68063: u.bi.pData->n = 0;
! 68064: }else{
! 68065: assert( u.bi.pData->flags & (MEM_Blob|MEM_Str) );
! 68066: }
! 68067: u.bi.seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bi.pC->seekResult : 0);
! 68068: if( u.bi.pData->flags & MEM_Zero ){
! 68069: u.bi.nZero = u.bi.pData->u.nZero;
! 68070: }else{
! 68071: u.bi.nZero = 0;
! 68072: }
! 68073: sqlite3BtreeSetCachedRowid(u.bi.pC->pCursor, 0);
! 68074: rc = sqlite3BtreeInsert(u.bi.pC->pCursor, 0, u.bi.iKey,
! 68075: u.bi.pData->z, u.bi.pData->n, u.bi.nZero,
! 68076: pOp->p5 & OPFLAG_APPEND, u.bi.seekResult
1.2 misho 68077: );
1.2.2.1 ! misho 68078: u.bi.pC->rowidIsValid = 0;
! 68079: u.bi.pC->deferredMoveto = 0;
! 68080: u.bi.pC->cacheStatus = CACHE_STALE;
1.2 misho 68081:
68082: /* Invoke the update-hook if required. */
68083: if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
1.2.2.1 ! misho 68084: u.bi.zDb = db->aDb[u.bi.pC->iDb].zName;
! 68085: u.bi.zTbl = pOp->p4.z;
! 68086: u.bi.op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
! 68087: assert( u.bi.pC->isTable );
! 68088: db->xUpdateCallback(db->pUpdateArg, u.bi.op, u.bi.zDb, u.bi.zTbl, u.bi.iKey);
! 68089: assert( u.bi.pC->iDb>=0 );
1.2 misho 68090: }
68091: break;
68092: }
68093:
68094: /* Opcode: Delete P1 P2 * P4 *
68095: **
68096: ** Delete the record at which the P1 cursor is currently pointing.
68097: **
68098: ** The cursor will be left pointing at either the next or the previous
68099: ** record in the table. If it is left pointing at the next record, then
68100: ** the next Next instruction will be a no-op. Hence it is OK to delete
68101: ** a record from within an Next loop.
68102: **
68103: ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
68104: ** incremented (otherwise not).
68105: **
68106: ** P1 must not be pseudo-table. It has to be a real table with
68107: ** multiple rows.
68108: **
68109: ** If P4 is not NULL, then it is the name of the table that P1 is
68110: ** pointing to. The update hook will be invoked, if it exists.
68111: ** If P4 is not NULL then the P1 cursor must have been positioned
68112: ** using OP_NotFound prior to invoking this opcode.
68113: */
68114: case OP_Delete: {
1.2.2.1 ! misho 68115: #if 0 /* local variables moved into u.bj */
1.2 misho 68116: i64 iKey;
68117: VdbeCursor *pC;
1.2.2.1 ! misho 68118: #endif /* local variables moved into u.bj */
1.2 misho 68119:
1.2.2.1 ! misho 68120: u.bj.iKey = 0;
1.2 misho 68121: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68122: u.bj.pC = p->apCsr[pOp->p1];
! 68123: assert( u.bj.pC!=0 );
! 68124: assert( u.bj.pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
1.2 misho 68125:
1.2.2.1 ! misho 68126: /* If the update-hook will be invoked, set u.bj.iKey to the rowid of the
1.2 misho 68127: ** row being deleted.
68128: */
68129: if( db->xUpdateCallback && pOp->p4.z ){
1.2.2.1 ! misho 68130: assert( u.bj.pC->isTable );
! 68131: assert( u.bj.pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */
! 68132: u.bj.iKey = u.bj.pC->lastRowid;
1.2 misho 68133: }
68134:
68135: /* The OP_Delete opcode always follows an OP_NotExists or OP_Last or
68136: ** OP_Column on the same table without any intervening operations that
1.2.2.1 ! misho 68137: ** might move or invalidate the cursor. Hence cursor u.bj.pC is always pointing
1.2 misho 68138: ** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation
68139: ** below is always a no-op and cannot fail. We will run it anyhow, though,
68140: ** to guard against future changes to the code generator.
68141: **/
1.2.2.1 ! misho 68142: assert( u.bj.pC->deferredMoveto==0 );
! 68143: rc = sqlite3VdbeCursorMoveto(u.bj.pC);
1.2 misho 68144: if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
68145:
1.2.2.1 ! misho 68146: sqlite3BtreeSetCachedRowid(u.bj.pC->pCursor, 0);
! 68147: rc = sqlite3BtreeDelete(u.bj.pC->pCursor);
! 68148: u.bj.pC->cacheStatus = CACHE_STALE;
1.2 misho 68149:
68150: /* Invoke the update-hook if required. */
68151: if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
1.2.2.1 ! misho 68152: const char *zDb = db->aDb[u.bj.pC->iDb].zName;
1.2 misho 68153: const char *zTbl = pOp->p4.z;
1.2.2.1 ! misho 68154: db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, u.bj.iKey);
! 68155: assert( u.bj.pC->iDb>=0 );
1.2 misho 68156: }
68157: if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
68158: break;
68159: }
68160: /* Opcode: ResetCount * * * * *
68161: **
68162: ** The value of the change counter is copied to the database handle
68163: ** change counter (returned by subsequent calls to sqlite3_changes()).
68164: ** Then the VMs internal change counter resets to 0.
68165: ** This is used by trigger programs.
68166: */
68167: case OP_ResetCount: {
68168: sqlite3VdbeSetChanges(db, p->nChange);
68169: p->nChange = 0;
68170: break;
68171: }
68172:
68173: /* Opcode: SorterCompare P1 P2 P3
68174: **
68175: ** P1 is a sorter cursor. This instruction compares the record blob in
68176: ** register P3 with the entry that the sorter cursor currently points to.
68177: ** If, excluding the rowid fields at the end, the two records are a match,
68178: ** fall through to the next instruction. Otherwise, jump to instruction P2.
68179: */
68180: case OP_SorterCompare: {
1.2.2.1 ! misho 68181: #if 0 /* local variables moved into u.bk */
1.2 misho 68182: VdbeCursor *pC;
68183: int res;
1.2.2.1 ! misho 68184: #endif /* local variables moved into u.bk */
1.2 misho 68185:
1.2.2.1 ! misho 68186: u.bk.pC = p->apCsr[pOp->p1];
! 68187: assert( isSorter(u.bk.pC) );
1.2 misho 68188: pIn3 = &aMem[pOp->p3];
1.2.2.1 ! misho 68189: rc = sqlite3VdbeSorterCompare(u.bk.pC, pIn3, &u.bk.res);
! 68190: if( u.bk.res ){
1.2 misho 68191: pc = pOp->p2-1;
68192: }
68193: break;
68194: };
68195:
68196: /* Opcode: SorterData P1 P2 * * *
68197: **
68198: ** Write into register P2 the current sorter data for sorter cursor P1.
68199: */
68200: case OP_SorterData: {
1.2.2.1 ! misho 68201: #if 0 /* local variables moved into u.bl */
1.2 misho 68202: VdbeCursor *pC;
1.2.2.1 ! misho 68203: #endif /* local variables moved into u.bl */
! 68204:
1.2 misho 68205: #ifndef SQLITE_OMIT_MERGE_SORT
68206: pOut = &aMem[pOp->p2];
1.2.2.1 ! misho 68207: u.bl.pC = p->apCsr[pOp->p1];
! 68208: assert( u.bl.pC->isSorter );
! 68209: rc = sqlite3VdbeSorterRowkey(u.bl.pC, pOut);
1.2 misho 68210: #else
68211: pOp->opcode = OP_RowKey;
68212: pc--;
68213: #endif
68214: break;
68215: }
68216:
68217: /* Opcode: RowData P1 P2 * * *
68218: **
68219: ** Write into register P2 the complete row data for cursor P1.
68220: ** There is no interpretation of the data.
68221: ** It is just copied onto the P2 register exactly as
68222: ** it is found in the database file.
68223: **
68224: ** If the P1 cursor must be pointing to a valid row (not a NULL row)
68225: ** of a real table, not a pseudo-table.
68226: */
68227: /* Opcode: RowKey P1 P2 * * *
68228: **
68229: ** Write into register P2 the complete row key for cursor P1.
68230: ** There is no interpretation of the data.
68231: ** The key is copied onto the P3 register exactly as
68232: ** it is found in the database file.
68233: **
68234: ** If the P1 cursor must be pointing to a valid row (not a NULL row)
68235: ** of a real table, not a pseudo-table.
68236: */
68237: case OP_RowKey:
68238: case OP_RowData: {
1.2.2.1 ! misho 68239: #if 0 /* local variables moved into u.bm */
1.2 misho 68240: VdbeCursor *pC;
68241: BtCursor *pCrsr;
68242: u32 n;
68243: i64 n64;
1.2.2.1 ! misho 68244: #endif /* local variables moved into u.bm */
1.2 misho 68245:
68246: pOut = &aMem[pOp->p2];
68247: memAboutToChange(p, pOut);
68248:
68249: /* Note that RowKey and RowData are really exactly the same instruction */
68250: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68251: u.bm.pC = p->apCsr[pOp->p1];
! 68252: assert( u.bm.pC->isSorter==0 );
! 68253: assert( u.bm.pC->isTable || pOp->opcode!=OP_RowData );
! 68254: assert( u.bm.pC->isIndex || pOp->opcode==OP_RowData );
! 68255: assert( u.bm.pC!=0 );
! 68256: assert( u.bm.pC->nullRow==0 );
! 68257: assert( u.bm.pC->pseudoTableReg==0 );
! 68258: assert( u.bm.pC->pCursor!=0 );
! 68259: u.bm.pCrsr = u.bm.pC->pCursor;
! 68260: assert( sqlite3BtreeCursorIsValid(u.bm.pCrsr) );
1.2 misho 68261:
68262: /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or
68263: ** OP_Rewind/Op_Next with no intervening instructions that might invalidate
68264: ** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always
68265: ** a no-op and can never fail. But we leave it in place as a safety.
68266: */
1.2.2.1 ! misho 68267: assert( u.bm.pC->deferredMoveto==0 );
! 68268: rc = sqlite3VdbeCursorMoveto(u.bm.pC);
1.2 misho 68269: if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
68270:
1.2.2.1 ! misho 68271: if( u.bm.pC->isIndex ){
! 68272: assert( !u.bm.pC->isTable );
! 68273: VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bm.pCrsr, &u.bm.n64);
1.2 misho 68274: assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
1.2.2.1 ! misho 68275: if( u.bm.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
1.2 misho 68276: goto too_big;
68277: }
1.2.2.1 ! misho 68278: u.bm.n = (u32)u.bm.n64;
1.2 misho 68279: }else{
1.2.2.1 ! misho 68280: VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bm.pCrsr, &u.bm.n);
1.2 misho 68281: assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
1.2.2.1 ! misho 68282: if( u.bm.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
1.2 misho 68283: goto too_big;
68284: }
68285: }
1.2.2.1 ! misho 68286: if( sqlite3VdbeMemGrow(pOut, u.bm.n, 0) ){
1.2 misho 68287: goto no_mem;
68288: }
1.2.2.1 ! misho 68289: pOut->n = u.bm.n;
1.2 misho 68290: MemSetTypeFlag(pOut, MEM_Blob);
1.2.2.1 ! misho 68291: if( u.bm.pC->isIndex ){
! 68292: rc = sqlite3BtreeKey(u.bm.pCrsr, 0, u.bm.n, pOut->z);
1.2 misho 68293: }else{
1.2.2.1 ! misho 68294: rc = sqlite3BtreeData(u.bm.pCrsr, 0, u.bm.n, pOut->z);
1.2 misho 68295: }
68296: pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */
68297: UPDATE_MAX_BLOBSIZE(pOut);
68298: break;
68299: }
68300:
68301: /* Opcode: Rowid P1 P2 * * *
68302: **
68303: ** Store in register P2 an integer which is the key of the table entry that
68304: ** P1 is currently point to.
68305: **
68306: ** P1 can be either an ordinary table or a virtual table. There used to
68307: ** be a separate OP_VRowid opcode for use with virtual tables, but this
68308: ** one opcode now works for both table types.
68309: */
68310: case OP_Rowid: { /* out2-prerelease */
1.2.2.1 ! misho 68311: #if 0 /* local variables moved into u.bn */
1.2 misho 68312: VdbeCursor *pC;
68313: i64 v;
68314: sqlite3_vtab *pVtab;
68315: const sqlite3_module *pModule;
1.2.2.1 ! misho 68316: #endif /* local variables moved into u.bn */
1.2 misho 68317:
68318: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68319: u.bn.pC = p->apCsr[pOp->p1];
! 68320: assert( u.bn.pC!=0 );
! 68321: assert( u.bn.pC->pseudoTableReg==0 || u.bn.pC->nullRow );
! 68322: if( u.bn.pC->nullRow ){
1.2 misho 68323: pOut->flags = MEM_Null;
68324: break;
1.2.2.1 ! misho 68325: }else if( u.bn.pC->deferredMoveto ){
! 68326: u.bn.v = u.bn.pC->movetoTarget;
1.2 misho 68327: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 68328: }else if( u.bn.pC->pVtabCursor ){
! 68329: u.bn.pVtab = u.bn.pC->pVtabCursor->pVtab;
! 68330: u.bn.pModule = u.bn.pVtab->pModule;
! 68331: assert( u.bn.pModule->xRowid );
! 68332: rc = u.bn.pModule->xRowid(u.bn.pC->pVtabCursor, &u.bn.v);
! 68333: importVtabErrMsg(p, u.bn.pVtab);
1.2 misho 68334: #endif /* SQLITE_OMIT_VIRTUALTABLE */
68335: }else{
1.2.2.1 ! misho 68336: assert( u.bn.pC->pCursor!=0 );
! 68337: rc = sqlite3VdbeCursorMoveto(u.bn.pC);
1.2 misho 68338: if( rc ) goto abort_due_to_error;
1.2.2.1 ! misho 68339: if( u.bn.pC->rowidIsValid ){
! 68340: u.bn.v = u.bn.pC->lastRowid;
1.2 misho 68341: }else{
1.2.2.1 ! misho 68342: rc = sqlite3BtreeKeySize(u.bn.pC->pCursor, &u.bn.v);
1.2 misho 68343: assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */
68344: }
68345: }
1.2.2.1 ! misho 68346: pOut->u.i = u.bn.v;
1.2 misho 68347: break;
68348: }
68349:
68350: /* Opcode: NullRow P1 * * * *
68351: **
68352: ** Move the cursor P1 to a null row. Any OP_Column operations
68353: ** that occur while the cursor is on the null row will always
68354: ** write a NULL.
68355: */
68356: case OP_NullRow: {
1.2.2.1 ! misho 68357: #if 0 /* local variables moved into u.bo */
1.2 misho 68358: VdbeCursor *pC;
1.2.2.1 ! misho 68359: #endif /* local variables moved into u.bo */
1.2 misho 68360:
68361: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68362: u.bo.pC = p->apCsr[pOp->p1];
! 68363: assert( u.bo.pC!=0 );
! 68364: u.bo.pC->nullRow = 1;
! 68365: u.bo.pC->rowidIsValid = 0;
! 68366: assert( u.bo.pC->pCursor || u.bo.pC->pVtabCursor );
! 68367: if( u.bo.pC->pCursor ){
! 68368: sqlite3BtreeClearCursor(u.bo.pC->pCursor);
1.2 misho 68369: }
68370: break;
68371: }
68372:
68373: /* Opcode: Last P1 P2 * * *
68374: **
68375: ** The next use of the Rowid or Column or Next instruction for P1
68376: ** will refer to the last entry in the database table or index.
68377: ** If the table or index is empty and P2>0, then jump immediately to P2.
68378: ** If P2 is 0 or if the table or index is not empty, fall through
68379: ** to the following instruction.
68380: */
68381: case OP_Last: { /* jump */
1.2.2.1 ! misho 68382: #if 0 /* local variables moved into u.bp */
1.2 misho 68383: VdbeCursor *pC;
68384: BtCursor *pCrsr;
68385: int res;
1.2.2.1 ! misho 68386: #endif /* local variables moved into u.bp */
1.2 misho 68387:
68388: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68389: u.bp.pC = p->apCsr[pOp->p1];
! 68390: assert( u.bp.pC!=0 );
! 68391: u.bp.pCrsr = u.bp.pC->pCursor;
! 68392: u.bp.res = 0;
! 68393: if( ALWAYS(u.bp.pCrsr!=0) ){
! 68394: rc = sqlite3BtreeLast(u.bp.pCrsr, &u.bp.res);
1.2 misho 68395: }
1.2.2.1 ! misho 68396: u.bp.pC->nullRow = (u8)u.bp.res;
! 68397: u.bp.pC->deferredMoveto = 0;
! 68398: u.bp.pC->rowidIsValid = 0;
! 68399: u.bp.pC->cacheStatus = CACHE_STALE;
! 68400: if( pOp->p2>0 && u.bp.res ){
1.2 misho 68401: pc = pOp->p2 - 1;
68402: }
68403: break;
68404: }
68405:
68406:
68407: /* Opcode: Sort P1 P2 * * *
68408: **
68409: ** This opcode does exactly the same thing as OP_Rewind except that
68410: ** it increments an undocumented global variable used for testing.
68411: **
68412: ** Sorting is accomplished by writing records into a sorting index,
68413: ** then rewinding that index and playing it back from beginning to
68414: ** end. We use the OP_Sort opcode instead of OP_Rewind to do the
68415: ** rewinding so that the global variable will be incremented and
68416: ** regression tests can determine whether or not the optimizer is
68417: ** correctly optimizing out sorts.
68418: */
68419: case OP_SorterSort: /* jump */
68420: #ifdef SQLITE_OMIT_MERGE_SORT
68421: pOp->opcode = OP_Sort;
68422: #endif
68423: case OP_Sort: { /* jump */
68424: #ifdef SQLITE_TEST
68425: sqlite3_sort_count++;
68426: sqlite3_search_count--;
68427: #endif
68428: p->aCounter[SQLITE_STMTSTATUS_SORT-1]++;
68429: /* Fall through into OP_Rewind */
68430: }
68431: /* Opcode: Rewind P1 P2 * * *
68432: **
68433: ** The next use of the Rowid or Column or Next instruction for P1
68434: ** will refer to the first entry in the database table or index.
68435: ** If the table or index is empty and P2>0, then jump immediately to P2.
68436: ** If P2 is 0 or if the table or index is not empty, fall through
68437: ** to the following instruction.
68438: */
68439: case OP_Rewind: { /* jump */
1.2.2.1 ! misho 68440: #if 0 /* local variables moved into u.bq */
1.2 misho 68441: VdbeCursor *pC;
68442: BtCursor *pCrsr;
68443: int res;
1.2.2.1 ! misho 68444: #endif /* local variables moved into u.bq */
1.2 misho 68445:
68446: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68447: u.bq.pC = p->apCsr[pOp->p1];
! 68448: assert( u.bq.pC!=0 );
! 68449: assert( u.bq.pC->isSorter==(pOp->opcode==OP_SorterSort) );
! 68450: u.bq.res = 1;
! 68451: if( isSorter(u.bq.pC) ){
! 68452: rc = sqlite3VdbeSorterRewind(db, u.bq.pC, &u.bq.res);
! 68453: }else{
! 68454: u.bq.pCrsr = u.bq.pC->pCursor;
! 68455: assert( u.bq.pCrsr );
! 68456: rc = sqlite3BtreeFirst(u.bq.pCrsr, &u.bq.res);
! 68457: u.bq.pC->atFirst = u.bq.res==0 ?1:0;
! 68458: u.bq.pC->deferredMoveto = 0;
! 68459: u.bq.pC->cacheStatus = CACHE_STALE;
! 68460: u.bq.pC->rowidIsValid = 0;
1.2 misho 68461: }
1.2.2.1 ! misho 68462: u.bq.pC->nullRow = (u8)u.bq.res;
1.2 misho 68463: assert( pOp->p2>0 && pOp->p2<p->nOp );
1.2.2.1 ! misho 68464: if( u.bq.res ){
1.2 misho 68465: pc = pOp->p2 - 1;
68466: }
68467: break;
68468: }
68469:
68470: /* Opcode: Next P1 P2 * P4 P5
68471: **
68472: ** Advance cursor P1 so that it points to the next key/data pair in its
68473: ** table or index. If there are no more key/value pairs then fall through
68474: ** to the following instruction. But if the cursor advance was successful,
68475: ** jump immediately to P2.
68476: **
68477: ** The P1 cursor must be for a real table, not a pseudo-table.
68478: **
68479: ** P4 is always of type P4_ADVANCE. The function pointer points to
68480: ** sqlite3BtreeNext().
68481: **
68482: ** If P5 is positive and the jump is taken, then event counter
68483: ** number P5-1 in the prepared statement is incremented.
68484: **
68485: ** See also: Prev
68486: */
68487: /* Opcode: Prev P1 P2 * * P5
68488: **
68489: ** Back up cursor P1 so that it points to the previous key/data pair in its
68490: ** table or index. If there is no previous key/value pairs then fall through
68491: ** to the following instruction. But if the cursor backup was successful,
68492: ** jump immediately to P2.
68493: **
68494: ** The P1 cursor must be for a real table, not a pseudo-table.
68495: **
68496: ** P4 is always of type P4_ADVANCE. The function pointer points to
68497: ** sqlite3BtreePrevious().
68498: **
68499: ** If P5 is positive and the jump is taken, then event counter
68500: ** number P5-1 in the prepared statement is incremented.
68501: */
68502: case OP_SorterNext: /* jump */
68503: #ifdef SQLITE_OMIT_MERGE_SORT
68504: pOp->opcode = OP_Next;
68505: #endif
68506: case OP_Prev: /* jump */
68507: case OP_Next: { /* jump */
1.2.2.1 ! misho 68508: #if 0 /* local variables moved into u.br */
1.2 misho 68509: VdbeCursor *pC;
68510: int res;
1.2.2.1 ! misho 68511: #endif /* local variables moved into u.br */
1.2 misho 68512:
68513: CHECK_FOR_INTERRUPT;
68514: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
68515: assert( pOp->p5<=ArraySize(p->aCounter) );
1.2.2.1 ! misho 68516: u.br.pC = p->apCsr[pOp->p1];
! 68517: if( u.br.pC==0 ){
1.2 misho 68518: break; /* See ticket #2273 */
68519: }
1.2.2.1 ! misho 68520: assert( u.br.pC->isSorter==(pOp->opcode==OP_SorterNext) );
! 68521: if( isSorter(u.br.pC) ){
1.2 misho 68522: assert( pOp->opcode==OP_SorterNext );
1.2.2.1 ! misho 68523: rc = sqlite3VdbeSorterNext(db, u.br.pC, &u.br.res);
1.2 misho 68524: }else{
1.2.2.1 ! misho 68525: u.br.res = 1;
! 68526: assert( u.br.pC->deferredMoveto==0 );
! 68527: assert( u.br.pC->pCursor );
1.2 misho 68528: assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext );
68529: assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious );
1.2.2.1 ! misho 68530: rc = pOp->p4.xAdvance(u.br.pC->pCursor, &u.br.res);
1.2 misho 68531: }
1.2.2.1 ! misho 68532: u.br.pC->nullRow = (u8)u.br.res;
! 68533: u.br.pC->cacheStatus = CACHE_STALE;
! 68534: if( u.br.res==0 ){
1.2 misho 68535: pc = pOp->p2 - 1;
68536: if( pOp->p5 ) p->aCounter[pOp->p5-1]++;
68537: #ifdef SQLITE_TEST
68538: sqlite3_search_count++;
68539: #endif
68540: }
1.2.2.1 ! misho 68541: u.br.pC->rowidIsValid = 0;
1.2 misho 68542: break;
68543: }
68544:
68545: /* Opcode: IdxInsert P1 P2 P3 * P5
68546: **
68547: ** Register P2 holds an SQL index key made using the
68548: ** MakeRecord instructions. This opcode writes that key
68549: ** into the index P1. Data for the entry is nil.
68550: **
68551: ** P3 is a flag that provides a hint to the b-tree layer that this
68552: ** insert is likely to be an append.
68553: **
68554: ** This instruction only works for indices. The equivalent instruction
68555: ** for tables is OP_Insert.
68556: */
68557: case OP_SorterInsert: /* in2 */
68558: #ifdef SQLITE_OMIT_MERGE_SORT
68559: pOp->opcode = OP_IdxInsert;
68560: #endif
68561: case OP_IdxInsert: { /* in2 */
1.2.2.1 ! misho 68562: #if 0 /* local variables moved into u.bs */
1.2 misho 68563: VdbeCursor *pC;
68564: BtCursor *pCrsr;
68565: int nKey;
68566: const char *zKey;
1.2.2.1 ! misho 68567: #endif /* local variables moved into u.bs */
1.2 misho 68568:
68569: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68570: u.bs.pC = p->apCsr[pOp->p1];
! 68571: assert( u.bs.pC!=0 );
! 68572: assert( u.bs.pC->isSorter==(pOp->opcode==OP_SorterInsert) );
1.2 misho 68573: pIn2 = &aMem[pOp->p2];
68574: assert( pIn2->flags & MEM_Blob );
1.2.2.1 ! misho 68575: u.bs.pCrsr = u.bs.pC->pCursor;
! 68576: if( ALWAYS(u.bs.pCrsr!=0) ){
! 68577: assert( u.bs.pC->isTable==0 );
1.2 misho 68578: rc = ExpandBlob(pIn2);
68579: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 68580: if( isSorter(u.bs.pC) ){
! 68581: rc = sqlite3VdbeSorterWrite(db, u.bs.pC, pIn2);
1.2 misho 68582: }else{
1.2.2.1 ! misho 68583: u.bs.nKey = pIn2->n;
! 68584: u.bs.zKey = pIn2->z;
! 68585: rc = sqlite3BtreeInsert(u.bs.pCrsr, u.bs.zKey, u.bs.nKey, "", 0, 0, pOp->p3,
! 68586: ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bs.pC->seekResult : 0)
1.2 misho 68587: );
1.2.2.1 ! misho 68588: assert( u.bs.pC->deferredMoveto==0 );
! 68589: u.bs.pC->cacheStatus = CACHE_STALE;
1.2 misho 68590: }
68591: }
68592: }
68593: break;
68594: }
68595:
68596: /* Opcode: IdxDelete P1 P2 P3 * *
68597: **
68598: ** The content of P3 registers starting at register P2 form
68599: ** an unpacked index key. This opcode removes that entry from the
68600: ** index opened by cursor P1.
68601: */
68602: case OP_IdxDelete: {
1.2.2.1 ! misho 68603: #if 0 /* local variables moved into u.bt */
1.2 misho 68604: VdbeCursor *pC;
68605: BtCursor *pCrsr;
68606: int res;
68607: UnpackedRecord r;
1.2.2.1 ! misho 68608: #endif /* local variables moved into u.bt */
1.2 misho 68609:
68610: assert( pOp->p3>0 );
68611: assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 );
68612: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68613: u.bt.pC = p->apCsr[pOp->p1];
! 68614: assert( u.bt.pC!=0 );
! 68615: u.bt.pCrsr = u.bt.pC->pCursor;
! 68616: if( ALWAYS(u.bt.pCrsr!=0) ){
! 68617: u.bt.r.pKeyInfo = u.bt.pC->pKeyInfo;
! 68618: u.bt.r.nField = (u16)pOp->p3;
! 68619: u.bt.r.flags = 0;
! 68620: u.bt.r.aMem = &aMem[pOp->p2];
1.2 misho 68621: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 68622: { int i; for(i=0; i<u.bt.r.nField; i++) assert( memIsValid(&u.bt.r.aMem[i]) ); }
1.2 misho 68623: #endif
1.2.2.1 ! misho 68624: rc = sqlite3BtreeMovetoUnpacked(u.bt.pCrsr, &u.bt.r, 0, 0, &u.bt.res);
! 68625: if( rc==SQLITE_OK && u.bt.res==0 ){
! 68626: rc = sqlite3BtreeDelete(u.bt.pCrsr);
1.2 misho 68627: }
1.2.2.1 ! misho 68628: assert( u.bt.pC->deferredMoveto==0 );
! 68629: u.bt.pC->cacheStatus = CACHE_STALE;
1.2 misho 68630: }
68631: break;
68632: }
68633:
68634: /* Opcode: IdxRowid P1 P2 * * *
68635: **
68636: ** Write into register P2 an integer which is the last entry in the record at
68637: ** the end of the index key pointed to by cursor P1. This integer should be
68638: ** the rowid of the table entry to which this index entry points.
68639: **
68640: ** See also: Rowid, MakeRecord.
68641: */
68642: case OP_IdxRowid: { /* out2-prerelease */
1.2.2.1 ! misho 68643: #if 0 /* local variables moved into u.bu */
1.2 misho 68644: BtCursor *pCrsr;
68645: VdbeCursor *pC;
68646: i64 rowid;
1.2.2.1 ! misho 68647: #endif /* local variables moved into u.bu */
1.2 misho 68648:
68649: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68650: u.bu.pC = p->apCsr[pOp->p1];
! 68651: assert( u.bu.pC!=0 );
! 68652: u.bu.pCrsr = u.bu.pC->pCursor;
1.2 misho 68653: pOut->flags = MEM_Null;
1.2.2.1 ! misho 68654: if( ALWAYS(u.bu.pCrsr!=0) ){
! 68655: rc = sqlite3VdbeCursorMoveto(u.bu.pC);
1.2 misho 68656: if( NEVER(rc) ) goto abort_due_to_error;
1.2.2.1 ! misho 68657: assert( u.bu.pC->deferredMoveto==0 );
! 68658: assert( u.bu.pC->isTable==0 );
! 68659: if( !u.bu.pC->nullRow ){
! 68660: rc = sqlite3VdbeIdxRowid(db, u.bu.pCrsr, &u.bu.rowid);
1.2 misho 68661: if( rc!=SQLITE_OK ){
68662: goto abort_due_to_error;
68663: }
1.2.2.1 ! misho 68664: pOut->u.i = u.bu.rowid;
1.2 misho 68665: pOut->flags = MEM_Int;
68666: }
68667: }
68668: break;
68669: }
68670:
68671: /* Opcode: IdxGE P1 P2 P3 P4 P5
68672: **
68673: ** The P4 register values beginning with P3 form an unpacked index
68674: ** key that omits the ROWID. Compare this key value against the index
68675: ** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
68676: **
68677: ** If the P1 index entry is greater than or equal to the key value
68678: ** then jump to P2. Otherwise fall through to the next instruction.
68679: **
68680: ** If P5 is non-zero then the key value is increased by an epsilon
68681: ** prior to the comparison. This make the opcode work like IdxGT except
68682: ** that if the key from register P3 is a prefix of the key in the cursor,
68683: ** the result is false whereas it would be true with IdxGT.
68684: */
68685: /* Opcode: IdxLT P1 P2 P3 P4 P5
68686: **
68687: ** The P4 register values beginning with P3 form an unpacked index
68688: ** key that omits the ROWID. Compare this key value against the index
68689: ** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
68690: **
68691: ** If the P1 index entry is less than the key value then jump to P2.
68692: ** Otherwise fall through to the next instruction.
68693: **
68694: ** If P5 is non-zero then the key value is increased by an epsilon prior
68695: ** to the comparison. This makes the opcode work like IdxLE.
68696: */
68697: case OP_IdxLT: /* jump */
68698: case OP_IdxGE: { /* jump */
1.2.2.1 ! misho 68699: #if 0 /* local variables moved into u.bv */
1.2 misho 68700: VdbeCursor *pC;
68701: int res;
68702: UnpackedRecord r;
1.2.2.1 ! misho 68703: #endif /* local variables moved into u.bv */
1.2 misho 68704:
68705: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
1.2.2.1 ! misho 68706: u.bv.pC = p->apCsr[pOp->p1];
! 68707: assert( u.bv.pC!=0 );
! 68708: assert( u.bv.pC->isOrdered );
! 68709: if( ALWAYS(u.bv.pC->pCursor!=0) ){
! 68710: assert( u.bv.pC->deferredMoveto==0 );
1.2 misho 68711: assert( pOp->p5==0 || pOp->p5==1 );
68712: assert( pOp->p4type==P4_INT32 );
1.2.2.1 ! misho 68713: u.bv.r.pKeyInfo = u.bv.pC->pKeyInfo;
! 68714: u.bv.r.nField = (u16)pOp->p4.i;
1.2 misho 68715: if( pOp->p5 ){
1.2.2.1 ! misho 68716: u.bv.r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH;
1.2 misho 68717: }else{
1.2.2.1 ! misho 68718: u.bv.r.flags = UNPACKED_PREFIX_MATCH;
1.2 misho 68719: }
1.2.2.1 ! misho 68720: u.bv.r.aMem = &aMem[pOp->p3];
1.2 misho 68721: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 68722: { int i; for(i=0; i<u.bv.r.nField; i++) assert( memIsValid(&u.bv.r.aMem[i]) ); }
1.2 misho 68723: #endif
1.2.2.1 ! misho 68724: rc = sqlite3VdbeIdxKeyCompare(u.bv.pC, &u.bv.r, &u.bv.res);
1.2 misho 68725: if( pOp->opcode==OP_IdxLT ){
1.2.2.1 ! misho 68726: u.bv.res = -u.bv.res;
1.2 misho 68727: }else{
68728: assert( pOp->opcode==OP_IdxGE );
1.2.2.1 ! misho 68729: u.bv.res++;
1.2 misho 68730: }
1.2.2.1 ! misho 68731: if( u.bv.res>0 ){
1.2 misho 68732: pc = pOp->p2 - 1 ;
68733: }
68734: }
68735: break;
68736: }
68737:
68738: /* Opcode: Destroy P1 P2 P3 * *
68739: **
68740: ** Delete an entire database table or index whose root page in the database
68741: ** file is given by P1.
68742: **
68743: ** The table being destroyed is in the main database file if P3==0. If
68744: ** P3==1 then the table to be clear is in the auxiliary database file
68745: ** that is used to store tables create using CREATE TEMPORARY TABLE.
68746: **
68747: ** If AUTOVACUUM is enabled then it is possible that another root page
68748: ** might be moved into the newly deleted root page in order to keep all
68749: ** root pages contiguous at the beginning of the database. The former
68750: ** value of the root page that moved - its value before the move occurred -
68751: ** is stored in register P2. If no page
68752: ** movement was required (because the table being dropped was already
68753: ** the last one in the database) then a zero is stored in register P2.
68754: ** If AUTOVACUUM is disabled then a zero is stored in register P2.
68755: **
68756: ** See also: Clear
68757: */
68758: case OP_Destroy: { /* out2-prerelease */
1.2.2.1 ! misho 68759: #if 0 /* local variables moved into u.bw */
1.2 misho 68760: int iMoved;
68761: int iCnt;
68762: Vdbe *pVdbe;
68763: int iDb;
1.2.2.1 ! misho 68764: #endif /* local variables moved into u.bw */
! 68765:
1.2 misho 68766: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 68767: u.bw.iCnt = 0;
! 68768: for(u.bw.pVdbe=db->pVdbe; u.bw.pVdbe; u.bw.pVdbe = u.bw.pVdbe->pNext){
! 68769: if( u.bw.pVdbe->magic==VDBE_MAGIC_RUN && u.bw.pVdbe->inVtabMethod<2 && u.bw.pVdbe->pc>=0 ){
! 68770: u.bw.iCnt++;
1.2 misho 68771: }
68772: }
68773: #else
1.2.2.1 ! misho 68774: u.bw.iCnt = db->activeVdbeCnt;
1.2 misho 68775: #endif
68776: pOut->flags = MEM_Null;
1.2.2.1 ! misho 68777: if( u.bw.iCnt>1 ){
1.2 misho 68778: rc = SQLITE_LOCKED;
68779: p->errorAction = OE_Abort;
68780: }else{
1.2.2.1 ! misho 68781: u.bw.iDb = pOp->p3;
! 68782: assert( u.bw.iCnt==1 );
! 68783: assert( (p->btreeMask & (((yDbMask)1)<<u.bw.iDb))!=0 );
! 68784: rc = sqlite3BtreeDropTable(db->aDb[u.bw.iDb].pBt, pOp->p1, &u.bw.iMoved);
1.2 misho 68785: pOut->flags = MEM_Int;
1.2.2.1 ! misho 68786: pOut->u.i = u.bw.iMoved;
1.2 misho 68787: #ifndef SQLITE_OMIT_AUTOVACUUM
1.2.2.1 ! misho 68788: if( rc==SQLITE_OK && u.bw.iMoved!=0 ){
! 68789: sqlite3RootPageMoved(db, u.bw.iDb, u.bw.iMoved, pOp->p1);
1.2 misho 68790: /* All OP_Destroy operations occur on the same btree */
1.2.2.1 ! misho 68791: assert( resetSchemaOnFault==0 || resetSchemaOnFault==u.bw.iDb+1 );
! 68792: resetSchemaOnFault = u.bw.iDb+1;
1.2 misho 68793: }
68794: #endif
68795: }
68796: break;
68797: }
68798:
68799: /* Opcode: Clear P1 P2 P3
68800: **
68801: ** Delete all contents of the database table or index whose root page
68802: ** in the database file is given by P1. But, unlike Destroy, do not
68803: ** remove the table or index from the database file.
68804: **
68805: ** The table being clear is in the main database file if P2==0. If
68806: ** P2==1 then the table to be clear is in the auxiliary database file
68807: ** that is used to store tables create using CREATE TEMPORARY TABLE.
68808: **
68809: ** If the P3 value is non-zero, then the table referred to must be an
68810: ** intkey table (an SQL table, not an index). In this case the row change
68811: ** count is incremented by the number of rows in the table being cleared.
68812: ** If P3 is greater than zero, then the value stored in register P3 is
68813: ** also incremented by the number of rows in the table being cleared.
68814: **
68815: ** See also: Destroy
68816: */
68817: case OP_Clear: {
1.2.2.1 ! misho 68818: #if 0 /* local variables moved into u.bx */
1.2 misho 68819: int nChange;
1.2.2.1 ! misho 68820: #endif /* local variables moved into u.bx */
1.2 misho 68821:
1.2.2.1 ! misho 68822: u.bx.nChange = 0;
1.2 misho 68823: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p2))!=0 );
68824: rc = sqlite3BtreeClearTable(
1.2.2.1 ! misho 68825: db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &u.bx.nChange : 0)
1.2 misho 68826: );
68827: if( pOp->p3 ){
1.2.2.1 ! misho 68828: p->nChange += u.bx.nChange;
1.2 misho 68829: if( pOp->p3>0 ){
68830: assert( memIsValid(&aMem[pOp->p3]) );
68831: memAboutToChange(p, &aMem[pOp->p3]);
1.2.2.1 ! misho 68832: aMem[pOp->p3].u.i += u.bx.nChange;
1.2 misho 68833: }
68834: }
68835: break;
68836: }
68837:
68838: /* Opcode: CreateTable P1 P2 * * *
68839: **
68840: ** Allocate a new table in the main database file if P1==0 or in the
68841: ** auxiliary database file if P1==1 or in an attached database if
68842: ** P1>1. Write the root page number of the new table into
68843: ** register P2
68844: **
68845: ** The difference between a table and an index is this: A table must
68846: ** have a 4-byte integer key and can have arbitrary data. An index
68847: ** has an arbitrary key but no data.
68848: **
68849: ** See also: CreateIndex
68850: */
68851: /* Opcode: CreateIndex P1 P2 * * *
68852: **
68853: ** Allocate a new index in the main database file if P1==0 or in the
68854: ** auxiliary database file if P1==1 or in an attached database if
68855: ** P1>1. Write the root page number of the new table into
68856: ** register P2.
68857: **
68858: ** See documentation on OP_CreateTable for additional information.
68859: */
68860: case OP_CreateIndex: /* out2-prerelease */
68861: case OP_CreateTable: { /* out2-prerelease */
1.2.2.1 ! misho 68862: #if 0 /* local variables moved into u.by */
1.2 misho 68863: int pgno;
68864: int flags;
68865: Db *pDb;
1.2.2.1 ! misho 68866: #endif /* local variables moved into u.by */
1.2 misho 68867:
1.2.2.1 ! misho 68868: u.by.pgno = 0;
1.2 misho 68869: assert( pOp->p1>=0 && pOp->p1<db->nDb );
68870: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
1.2.2.1 ! misho 68871: u.by.pDb = &db->aDb[pOp->p1];
! 68872: assert( u.by.pDb->pBt!=0 );
1.2 misho 68873: if( pOp->opcode==OP_CreateTable ){
1.2.2.1 ! misho 68874: /* u.by.flags = BTREE_INTKEY; */
! 68875: u.by.flags = BTREE_INTKEY;
1.2 misho 68876: }else{
1.2.2.1 ! misho 68877: u.by.flags = BTREE_BLOBKEY;
1.2 misho 68878: }
1.2.2.1 ! misho 68879: rc = sqlite3BtreeCreateTable(u.by.pDb->pBt, &u.by.pgno, u.by.flags);
! 68880: pOut->u.i = u.by.pgno;
1.2 misho 68881: break;
68882: }
68883:
68884: /* Opcode: ParseSchema P1 * * P4 *
68885: **
68886: ** Read and parse all entries from the SQLITE_MASTER table of database P1
68887: ** that match the WHERE clause P4.
68888: **
68889: ** This opcode invokes the parser to create a new virtual machine,
68890: ** then runs the new virtual machine. It is thus a re-entrant opcode.
68891: */
68892: case OP_ParseSchema: {
1.2.2.1 ! misho 68893: #if 0 /* local variables moved into u.bz */
1.2 misho 68894: int iDb;
68895: const char *zMaster;
68896: char *zSql;
68897: InitData initData;
1.2.2.1 ! misho 68898: #endif /* local variables moved into u.bz */
1.2 misho 68899:
68900: /* Any prepared statement that invokes this opcode will hold mutexes
68901: ** on every btree. This is a prerequisite for invoking
68902: ** sqlite3InitCallback().
68903: */
68904: #ifdef SQLITE_DEBUG
1.2.2.1 ! misho 68905: for(u.bz.iDb=0; u.bz.iDb<db->nDb; u.bz.iDb++){
! 68906: assert( u.bz.iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[u.bz.iDb].pBt) );
1.2 misho 68907: }
68908: #endif
68909:
1.2.2.1 ! misho 68910: u.bz.iDb = pOp->p1;
! 68911: assert( u.bz.iDb>=0 && u.bz.iDb<db->nDb );
! 68912: assert( DbHasProperty(db, u.bz.iDb, DB_SchemaLoaded) );
1.2 misho 68913: /* Used to be a conditional */ {
1.2.2.1 ! misho 68914: u.bz.zMaster = SCHEMA_TABLE(u.bz.iDb);
! 68915: u.bz.initData.db = db;
! 68916: u.bz.initData.iDb = pOp->p1;
! 68917: u.bz.initData.pzErrMsg = &p->zErrMsg;
! 68918: u.bz.zSql = sqlite3MPrintf(db,
1.2 misho 68919: "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid",
1.2.2.1 ! misho 68920: db->aDb[u.bz.iDb].zName, u.bz.zMaster, pOp->p4.z);
! 68921: if( u.bz.zSql==0 ){
1.2 misho 68922: rc = SQLITE_NOMEM;
68923: }else{
68924: assert( db->init.busy==0 );
68925: db->init.busy = 1;
1.2.2.1 ! misho 68926: u.bz.initData.rc = SQLITE_OK;
1.2 misho 68927: assert( !db->mallocFailed );
1.2.2.1 ! misho 68928: rc = sqlite3_exec(db, u.bz.zSql, sqlite3InitCallback, &u.bz.initData, 0);
! 68929: if( rc==SQLITE_OK ) rc = u.bz.initData.rc;
! 68930: sqlite3DbFree(db, u.bz.zSql);
1.2 misho 68931: db->init.busy = 0;
68932: }
68933: }
1.2.2.1 ! misho 68934: if( rc ) sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 68935: if( rc==SQLITE_NOMEM ){
68936: goto no_mem;
68937: }
68938: break;
68939: }
68940:
68941: #if !defined(SQLITE_OMIT_ANALYZE)
68942: /* Opcode: LoadAnalysis P1 * * * *
68943: **
68944: ** Read the sqlite_stat1 table for database P1 and load the content
68945: ** of that table into the internal index hash table. This will cause
68946: ** the analysis to be used when preparing all subsequent queries.
68947: */
68948: case OP_LoadAnalysis: {
68949: assert( pOp->p1>=0 && pOp->p1<db->nDb );
68950: rc = sqlite3AnalysisLoad(db, pOp->p1);
68951: break;
68952: }
68953: #endif /* !defined(SQLITE_OMIT_ANALYZE) */
68954:
68955: /* Opcode: DropTable P1 * * P4 *
68956: **
68957: ** Remove the internal (in-memory) data structures that describe
68958: ** the table named P4 in database P1. This is called after a table
68959: ** is dropped in order to keep the internal representation of the
68960: ** schema consistent with what is on disk.
68961: */
68962: case OP_DropTable: {
68963: sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
68964: break;
68965: }
68966:
68967: /* Opcode: DropIndex P1 * * P4 *
68968: **
68969: ** Remove the internal (in-memory) data structures that describe
68970: ** the index named P4 in database P1. This is called after an index
68971: ** is dropped in order to keep the internal representation of the
68972: ** schema consistent with what is on disk.
68973: */
68974: case OP_DropIndex: {
68975: sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
68976: break;
68977: }
68978:
68979: /* Opcode: DropTrigger P1 * * P4 *
68980: **
68981: ** Remove the internal (in-memory) data structures that describe
68982: ** the trigger named P4 in database P1. This is called after a trigger
68983: ** is dropped in order to keep the internal representation of the
68984: ** schema consistent with what is on disk.
68985: */
68986: case OP_DropTrigger: {
68987: sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
68988: break;
68989: }
68990:
68991:
68992: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
68993: /* Opcode: IntegrityCk P1 P2 P3 * P5
68994: **
68995: ** Do an analysis of the currently open database. Store in
68996: ** register P1 the text of an error message describing any problems.
68997: ** If no problems are found, store a NULL in register P1.
68998: **
68999: ** The register P3 contains the maximum number of allowed errors.
69000: ** At most reg(P3) errors will be reported.
69001: ** In other words, the analysis stops as soon as reg(P1) errors are
69002: ** seen. Reg(P1) is updated with the number of errors remaining.
69003: **
69004: ** The root page numbers of all tables in the database are integer
69005: ** stored in reg(P1), reg(P1+1), reg(P1+2), .... There are P2 tables
69006: ** total.
69007: **
69008: ** If P5 is not zero, the check is done on the auxiliary database
69009: ** file, not the main database file.
69010: **
69011: ** This opcode is used to implement the integrity_check pragma.
69012: */
69013: case OP_IntegrityCk: {
1.2.2.1 ! misho 69014: #if 0 /* local variables moved into u.ca */
1.2 misho 69015: int nRoot; /* Number of tables to check. (Number of root pages.) */
69016: int *aRoot; /* Array of rootpage numbers for tables to be checked */
69017: int j; /* Loop counter */
69018: int nErr; /* Number of errors reported */
69019: char *z; /* Text of the error report */
69020: Mem *pnErr; /* Register keeping track of errors remaining */
1.2.2.1 ! misho 69021: #endif /* local variables moved into u.ca */
1.2 misho 69022:
1.2.2.1 ! misho 69023: u.ca.nRoot = pOp->p2;
! 69024: assert( u.ca.nRoot>0 );
! 69025: u.ca.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.ca.nRoot+1) );
! 69026: if( u.ca.aRoot==0 ) goto no_mem;
1.2 misho 69027: assert( pOp->p3>0 && pOp->p3<=p->nMem );
1.2.2.1 ! misho 69028: u.ca.pnErr = &aMem[pOp->p3];
! 69029: assert( (u.ca.pnErr->flags & MEM_Int)!=0 );
! 69030: assert( (u.ca.pnErr->flags & (MEM_Str|MEM_Blob))==0 );
1.2 misho 69031: pIn1 = &aMem[pOp->p1];
1.2.2.1 ! misho 69032: for(u.ca.j=0; u.ca.j<u.ca.nRoot; u.ca.j++){
! 69033: u.ca.aRoot[u.ca.j] = (int)sqlite3VdbeIntValue(&pIn1[u.ca.j]);
1.2 misho 69034: }
1.2.2.1 ! misho 69035: u.ca.aRoot[u.ca.j] = 0;
1.2 misho 69036: assert( pOp->p5<db->nDb );
69037: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p5))!=0 );
1.2.2.1 ! misho 69038: u.ca.z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, u.ca.aRoot, u.ca.nRoot,
! 69039: (int)u.ca.pnErr->u.i, &u.ca.nErr);
! 69040: sqlite3DbFree(db, u.ca.aRoot);
! 69041: u.ca.pnErr->u.i -= u.ca.nErr;
1.2 misho 69042: sqlite3VdbeMemSetNull(pIn1);
1.2.2.1 ! misho 69043: if( u.ca.nErr==0 ){
! 69044: assert( u.ca.z==0 );
! 69045: }else if( u.ca.z==0 ){
1.2 misho 69046: goto no_mem;
69047: }else{
1.2.2.1 ! misho 69048: sqlite3VdbeMemSetStr(pIn1, u.ca.z, -1, SQLITE_UTF8, sqlite3_free);
1.2 misho 69049: }
69050: UPDATE_MAX_BLOBSIZE(pIn1);
69051: sqlite3VdbeChangeEncoding(pIn1, encoding);
69052: break;
69053: }
69054: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
69055:
69056: /* Opcode: RowSetAdd P1 P2 * * *
69057: **
69058: ** Insert the integer value held by register P2 into a boolean index
69059: ** held in register P1.
69060: **
69061: ** An assertion fails if P2 is not an integer.
69062: */
69063: case OP_RowSetAdd: { /* in1, in2 */
69064: pIn1 = &aMem[pOp->p1];
69065: pIn2 = &aMem[pOp->p2];
69066: assert( (pIn2->flags & MEM_Int)!=0 );
69067: if( (pIn1->flags & MEM_RowSet)==0 ){
69068: sqlite3VdbeMemSetRowSet(pIn1);
69069: if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
69070: }
69071: sqlite3RowSetInsert(pIn1->u.pRowSet, pIn2->u.i);
69072: break;
69073: }
69074:
69075: /* Opcode: RowSetRead P1 P2 P3 * *
69076: **
69077: ** Extract the smallest value from boolean index P1 and put that value into
69078: ** register P3. Or, if boolean index P1 is initially empty, leave P3
69079: ** unchanged and jump to instruction P2.
69080: */
69081: case OP_RowSetRead: { /* jump, in1, out3 */
1.2.2.1 ! misho 69082: #if 0 /* local variables moved into u.cb */
1.2 misho 69083: i64 val;
1.2.2.1 ! misho 69084: #endif /* local variables moved into u.cb */
1.2 misho 69085: CHECK_FOR_INTERRUPT;
69086: pIn1 = &aMem[pOp->p1];
69087: if( (pIn1->flags & MEM_RowSet)==0
1.2.2.1 ! misho 69088: || sqlite3RowSetNext(pIn1->u.pRowSet, &u.cb.val)==0
1.2 misho 69089: ){
69090: /* The boolean index is empty */
69091: sqlite3VdbeMemSetNull(pIn1);
69092: pc = pOp->p2 - 1;
69093: }else{
69094: /* A value was pulled from the index */
1.2.2.1 ! misho 69095: sqlite3VdbeMemSetInt64(&aMem[pOp->p3], u.cb.val);
1.2 misho 69096: }
69097: break;
69098: }
69099:
69100: /* Opcode: RowSetTest P1 P2 P3 P4
69101: **
69102: ** Register P3 is assumed to hold a 64-bit integer value. If register P1
69103: ** contains a RowSet object and that RowSet object contains
69104: ** the value held in P3, jump to register P2. Otherwise, insert the
69105: ** integer in P3 into the RowSet and continue on to the
69106: ** next opcode.
69107: **
69108: ** The RowSet object is optimized for the case where successive sets
69109: ** of integers, where each set contains no duplicates. Each set
69110: ** of values is identified by a unique P4 value. The first set
69111: ** must have P4==0, the final set P4=-1. P4 must be either -1 or
69112: ** non-negative. For non-negative values of P4 only the lower 4
69113: ** bits are significant.
69114: **
69115: ** This allows optimizations: (a) when P4==0 there is no need to test
69116: ** the rowset object for P3, as it is guaranteed not to contain it,
69117: ** (b) when P4==-1 there is no need to insert the value, as it will
69118: ** never be tested for, and (c) when a value that is part of set X is
69119: ** inserted, there is no need to search to see if the same value was
69120: ** previously inserted as part of set X (only if it was previously
69121: ** inserted as part of some other set).
69122: */
69123: case OP_RowSetTest: { /* jump, in1, in3 */
1.2.2.1 ! misho 69124: #if 0 /* local variables moved into u.cc */
1.2 misho 69125: int iSet;
69126: int exists;
1.2.2.1 ! misho 69127: #endif /* local variables moved into u.cc */
1.2 misho 69128:
69129: pIn1 = &aMem[pOp->p1];
69130: pIn3 = &aMem[pOp->p3];
1.2.2.1 ! misho 69131: u.cc.iSet = pOp->p4.i;
1.2 misho 69132: assert( pIn3->flags&MEM_Int );
69133:
69134: /* If there is anything other than a rowset object in memory cell P1,
69135: ** delete it now and initialize P1 with an empty rowset
69136: */
69137: if( (pIn1->flags & MEM_RowSet)==0 ){
69138: sqlite3VdbeMemSetRowSet(pIn1);
69139: if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
69140: }
69141:
69142: assert( pOp->p4type==P4_INT32 );
1.2.2.1 ! misho 69143: assert( u.cc.iSet==-1 || u.cc.iSet>=0 );
! 69144: if( u.cc.iSet ){
! 69145: u.cc.exists = sqlite3RowSetTest(pIn1->u.pRowSet,
! 69146: (u8)(u.cc.iSet>=0 ? u.cc.iSet & 0xf : 0xff),
1.2 misho 69147: pIn3->u.i);
1.2.2.1 ! misho 69148: if( u.cc.exists ){
1.2 misho 69149: pc = pOp->p2 - 1;
69150: break;
69151: }
69152: }
1.2.2.1 ! misho 69153: if( u.cc.iSet>=0 ){
1.2 misho 69154: sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
69155: }
69156: break;
69157: }
69158:
69159:
69160: #ifndef SQLITE_OMIT_TRIGGER
69161:
69162: /* Opcode: Program P1 P2 P3 P4 *
69163: **
69164: ** Execute the trigger program passed as P4 (type P4_SUBPROGRAM).
69165: **
69166: ** P1 contains the address of the memory cell that contains the first memory
69167: ** cell in an array of values used as arguments to the sub-program. P2
69168: ** contains the address to jump to if the sub-program throws an IGNORE
69169: ** exception using the RAISE() function. Register P3 contains the address
69170: ** of a memory cell in this (the parent) VM that is used to allocate the
69171: ** memory required by the sub-vdbe at runtime.
69172: **
69173: ** P4 is a pointer to the VM containing the trigger program.
69174: */
69175: case OP_Program: { /* jump */
1.2.2.1 ! misho 69176: #if 0 /* local variables moved into u.cd */
1.2 misho 69177: int nMem; /* Number of memory registers for sub-program */
69178: int nByte; /* Bytes of runtime space required for sub-program */
69179: Mem *pRt; /* Register to allocate runtime space */
69180: Mem *pMem; /* Used to iterate through memory cells */
69181: Mem *pEnd; /* Last memory cell in new array */
69182: VdbeFrame *pFrame; /* New vdbe frame to execute in */
69183: SubProgram *pProgram; /* Sub-program to execute */
69184: void *t; /* Token identifying trigger */
1.2.2.1 ! misho 69185: #endif /* local variables moved into u.cd */
1.2 misho 69186:
1.2.2.1 ! misho 69187: u.cd.pProgram = pOp->p4.pProgram;
! 69188: u.cd.pRt = &aMem[pOp->p3];
! 69189: assert( u.cd.pProgram->nOp>0 );
1.2 misho 69190:
69191: /* If the p5 flag is clear, then recursive invocation of triggers is
69192: ** disabled for backwards compatibility (p5 is set if this sub-program
69193: ** is really a trigger, not a foreign key action, and the flag set
69194: ** and cleared by the "PRAGMA recursive_triggers" command is clear).
69195: **
69196: ** It is recursive invocation of triggers, at the SQL level, that is
69197: ** disabled. In some cases a single trigger may generate more than one
69198: ** SubProgram (if the trigger may be executed with more than one different
69199: ** ON CONFLICT algorithm). SubProgram structures associated with a
69200: ** single trigger all have the same value for the SubProgram.token
69201: ** variable. */
69202: if( pOp->p5 ){
1.2.2.1 ! misho 69203: u.cd.t = u.cd.pProgram->token;
! 69204: for(u.cd.pFrame=p->pFrame; u.cd.pFrame && u.cd.pFrame->token!=u.cd.t; u.cd.pFrame=u.cd.pFrame->pParent);
! 69205: if( u.cd.pFrame ) break;
1.2 misho 69206: }
69207:
69208: if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
69209: rc = SQLITE_ERROR;
69210: sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion");
69211: break;
69212: }
69213:
1.2.2.1 ! misho 69214: /* Register u.cd.pRt is used to store the memory required to save the state
1.2 misho 69215: ** of the current program, and the memory required at runtime to execute
1.2.2.1 ! misho 69216: ** the trigger program. If this trigger has been fired before, then u.cd.pRt
1.2 misho 69217: ** is already allocated. Otherwise, it must be initialized. */
1.2.2.1 ! misho 69218: if( (u.cd.pRt->flags&MEM_Frame)==0 ){
1.2 misho 69219: /* SubProgram.nMem is set to the number of memory cells used by the
69220: ** program stored in SubProgram.aOp. As well as these, one memory
69221: ** cell is required for each cursor used by the program. Set local
1.2.2.1 ! misho 69222: ** variable u.cd.nMem (and later, VdbeFrame.nChildMem) to this value.
1.2 misho 69223: */
1.2.2.1 ! misho 69224: u.cd.nMem = u.cd.pProgram->nMem + u.cd.pProgram->nCsr;
! 69225: u.cd.nByte = ROUND8(sizeof(VdbeFrame))
! 69226: + u.cd.nMem * sizeof(Mem)
! 69227: + u.cd.pProgram->nCsr * sizeof(VdbeCursor *)
! 69228: + u.cd.pProgram->nOnce * sizeof(u8);
! 69229: u.cd.pFrame = sqlite3DbMallocZero(db, u.cd.nByte);
! 69230: if( !u.cd.pFrame ){
1.2 misho 69231: goto no_mem;
69232: }
1.2.2.1 ! misho 69233: sqlite3VdbeMemRelease(u.cd.pRt);
! 69234: u.cd.pRt->flags = MEM_Frame;
! 69235: u.cd.pRt->u.pFrame = u.cd.pFrame;
! 69236:
! 69237: u.cd.pFrame->v = p;
! 69238: u.cd.pFrame->nChildMem = u.cd.nMem;
! 69239: u.cd.pFrame->nChildCsr = u.cd.pProgram->nCsr;
! 69240: u.cd.pFrame->pc = pc;
! 69241: u.cd.pFrame->aMem = p->aMem;
! 69242: u.cd.pFrame->nMem = p->nMem;
! 69243: u.cd.pFrame->apCsr = p->apCsr;
! 69244: u.cd.pFrame->nCursor = p->nCursor;
! 69245: u.cd.pFrame->aOp = p->aOp;
! 69246: u.cd.pFrame->nOp = p->nOp;
! 69247: u.cd.pFrame->token = u.cd.pProgram->token;
! 69248: u.cd.pFrame->aOnceFlag = p->aOnceFlag;
! 69249: u.cd.pFrame->nOnceFlag = p->nOnceFlag;
! 69250:
! 69251: u.cd.pEnd = &VdbeFrameMem(u.cd.pFrame)[u.cd.pFrame->nChildMem];
! 69252: for(u.cd.pMem=VdbeFrameMem(u.cd.pFrame); u.cd.pMem!=u.cd.pEnd; u.cd.pMem++){
! 69253: u.cd.pMem->flags = MEM_Invalid;
! 69254: u.cd.pMem->db = db;
! 69255: }
! 69256: }else{
! 69257: u.cd.pFrame = u.cd.pRt->u.pFrame;
! 69258: assert( u.cd.pProgram->nMem+u.cd.pProgram->nCsr==u.cd.pFrame->nChildMem );
! 69259: assert( u.cd.pProgram->nCsr==u.cd.pFrame->nChildCsr );
! 69260: assert( pc==u.cd.pFrame->pc );
1.2 misho 69261: }
69262:
69263: p->nFrame++;
1.2.2.1 ! misho 69264: u.cd.pFrame->pParent = p->pFrame;
! 69265: u.cd.pFrame->lastRowid = lastRowid;
! 69266: u.cd.pFrame->nChange = p->nChange;
1.2 misho 69267: p->nChange = 0;
1.2.2.1 ! misho 69268: p->pFrame = u.cd.pFrame;
! 69269: p->aMem = aMem = &VdbeFrameMem(u.cd.pFrame)[-1];
! 69270: p->nMem = u.cd.pFrame->nChildMem;
! 69271: p->nCursor = (u16)u.cd.pFrame->nChildCsr;
1.2 misho 69272: p->apCsr = (VdbeCursor **)&aMem[p->nMem+1];
1.2.2.1 ! misho 69273: p->aOp = aOp = u.cd.pProgram->aOp;
! 69274: p->nOp = u.cd.pProgram->nOp;
1.2 misho 69275: p->aOnceFlag = (u8 *)&p->apCsr[p->nCursor];
1.2.2.1 ! misho 69276: p->nOnceFlag = u.cd.pProgram->nOnce;
1.2 misho 69277: pc = -1;
69278: memset(p->aOnceFlag, 0, p->nOnceFlag);
69279:
69280: break;
69281: }
69282:
69283: /* Opcode: Param P1 P2 * * *
69284: **
69285: ** This opcode is only ever present in sub-programs called via the
69286: ** OP_Program instruction. Copy a value currently stored in a memory
69287: ** cell of the calling (parent) frame to cell P2 in the current frames
69288: ** address space. This is used by trigger programs to access the new.*
69289: ** and old.* values.
69290: **
69291: ** The address of the cell in the parent frame is determined by adding
69292: ** the value of the P1 argument to the value of the P1 argument to the
69293: ** calling OP_Program instruction.
69294: */
69295: case OP_Param: { /* out2-prerelease */
1.2.2.1 ! misho 69296: #if 0 /* local variables moved into u.ce */
1.2 misho 69297: VdbeFrame *pFrame;
69298: Mem *pIn;
1.2.2.1 ! misho 69299: #endif /* local variables moved into u.ce */
! 69300: u.ce.pFrame = p->pFrame;
! 69301: u.ce.pIn = &u.ce.pFrame->aMem[pOp->p1 + u.ce.pFrame->aOp[u.ce.pFrame->pc].p1];
! 69302: sqlite3VdbeMemShallowCopy(pOut, u.ce.pIn, MEM_Ephem);
1.2 misho 69303: break;
69304: }
69305:
69306: #endif /* #ifndef SQLITE_OMIT_TRIGGER */
69307:
69308: #ifndef SQLITE_OMIT_FOREIGN_KEY
69309: /* Opcode: FkCounter P1 P2 * * *
69310: **
69311: ** Increment a "constraint counter" by P2 (P2 may be negative or positive).
69312: ** If P1 is non-zero, the database constraint counter is incremented
69313: ** (deferred foreign key constraints). Otherwise, if P1 is zero, the
69314: ** statement counter is incremented (immediate foreign key constraints).
69315: */
69316: case OP_FkCounter: {
69317: if( pOp->p1 ){
69318: db->nDeferredCons += pOp->p2;
69319: }else{
69320: p->nFkConstraint += pOp->p2;
69321: }
69322: break;
69323: }
69324:
69325: /* Opcode: FkIfZero P1 P2 * * *
69326: **
69327: ** This opcode tests if a foreign key constraint-counter is currently zero.
69328: ** If so, jump to instruction P2. Otherwise, fall through to the next
69329: ** instruction.
69330: **
69331: ** If P1 is non-zero, then the jump is taken if the database constraint-counter
69332: ** is zero (the one that counts deferred constraint violations). If P1 is
69333: ** zero, the jump is taken if the statement constraint-counter is zero
69334: ** (immediate foreign key constraint violations).
69335: */
69336: case OP_FkIfZero: { /* jump */
69337: if( pOp->p1 ){
69338: if( db->nDeferredCons==0 ) pc = pOp->p2-1;
69339: }else{
69340: if( p->nFkConstraint==0 ) pc = pOp->p2-1;
69341: }
69342: break;
69343: }
69344: #endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */
69345:
69346: #ifndef SQLITE_OMIT_AUTOINCREMENT
69347: /* Opcode: MemMax P1 P2 * * *
69348: **
69349: ** P1 is a register in the root frame of this VM (the root frame is
69350: ** different from the current frame if this instruction is being executed
69351: ** within a sub-program). Set the value of register P1 to the maximum of
69352: ** its current value and the value in register P2.
69353: **
69354: ** This instruction throws an error if the memory cell is not initially
69355: ** an integer.
69356: */
69357: case OP_MemMax: { /* in2 */
1.2.2.1 ! misho 69358: #if 0 /* local variables moved into u.cf */
1.2 misho 69359: Mem *pIn1;
69360: VdbeFrame *pFrame;
1.2.2.1 ! misho 69361: #endif /* local variables moved into u.cf */
1.2 misho 69362: if( p->pFrame ){
1.2.2.1 ! misho 69363: for(u.cf.pFrame=p->pFrame; u.cf.pFrame->pParent; u.cf.pFrame=u.cf.pFrame->pParent);
! 69364: u.cf.pIn1 = &u.cf.pFrame->aMem[pOp->p1];
1.2 misho 69365: }else{
1.2.2.1 ! misho 69366: u.cf.pIn1 = &aMem[pOp->p1];
1.2 misho 69367: }
1.2.2.1 ! misho 69368: assert( memIsValid(u.cf.pIn1) );
! 69369: sqlite3VdbeMemIntegerify(u.cf.pIn1);
1.2 misho 69370: pIn2 = &aMem[pOp->p2];
69371: sqlite3VdbeMemIntegerify(pIn2);
1.2.2.1 ! misho 69372: if( u.cf.pIn1->u.i<pIn2->u.i){
! 69373: u.cf.pIn1->u.i = pIn2->u.i;
1.2 misho 69374: }
69375: break;
69376: }
69377: #endif /* SQLITE_OMIT_AUTOINCREMENT */
69378:
69379: /* Opcode: IfPos P1 P2 * * *
69380: **
69381: ** If the value of register P1 is 1 or greater, jump to P2.
69382: **
69383: ** It is illegal to use this instruction on a register that does
69384: ** not contain an integer. An assertion fault will result if you try.
69385: */
69386: case OP_IfPos: { /* jump, in1 */
69387: pIn1 = &aMem[pOp->p1];
69388: assert( pIn1->flags&MEM_Int );
69389: if( pIn1->u.i>0 ){
69390: pc = pOp->p2 - 1;
69391: }
69392: break;
69393: }
69394:
69395: /* Opcode: IfNeg P1 P2 * * *
69396: **
69397: ** If the value of register P1 is less than zero, jump to P2.
69398: **
69399: ** It is illegal to use this instruction on a register that does
69400: ** not contain an integer. An assertion fault will result if you try.
69401: */
69402: case OP_IfNeg: { /* jump, in1 */
69403: pIn1 = &aMem[pOp->p1];
69404: assert( pIn1->flags&MEM_Int );
69405: if( pIn1->u.i<0 ){
69406: pc = pOp->p2 - 1;
69407: }
69408: break;
69409: }
69410:
69411: /* Opcode: IfZero P1 P2 P3 * *
69412: **
69413: ** The register P1 must contain an integer. Add literal P3 to the
69414: ** value in register P1. If the result is exactly 0, jump to P2.
69415: **
69416: ** It is illegal to use this instruction on a register that does
69417: ** not contain an integer. An assertion fault will result if you try.
69418: */
69419: case OP_IfZero: { /* jump, in1 */
69420: pIn1 = &aMem[pOp->p1];
69421: assert( pIn1->flags&MEM_Int );
69422: pIn1->u.i += pOp->p3;
69423: if( pIn1->u.i==0 ){
69424: pc = pOp->p2 - 1;
69425: }
69426: break;
69427: }
69428:
69429: /* Opcode: AggStep * P2 P3 P4 P5
69430: **
69431: ** Execute the step function for an aggregate. The
69432: ** function has P5 arguments. P4 is a pointer to the FuncDef
69433: ** structure that specifies the function. Use register
69434: ** P3 as the accumulator.
69435: **
69436: ** The P5 arguments are taken from register P2 and its
69437: ** successors.
69438: */
69439: case OP_AggStep: {
1.2.2.1 ! misho 69440: #if 0 /* local variables moved into u.cg */
1.2 misho 69441: int n;
69442: int i;
69443: Mem *pMem;
69444: Mem *pRec;
69445: sqlite3_context ctx;
69446: sqlite3_value **apVal;
1.2.2.1 ! misho 69447: #endif /* local variables moved into u.cg */
1.2 misho 69448:
1.2.2.1 ! misho 69449: u.cg.n = pOp->p5;
! 69450: assert( u.cg.n>=0 );
! 69451: u.cg.pRec = &aMem[pOp->p2];
! 69452: u.cg.apVal = p->apArg;
! 69453: assert( u.cg.apVal || u.cg.n==0 );
! 69454: for(u.cg.i=0; u.cg.i<u.cg.n; u.cg.i++, u.cg.pRec++){
! 69455: assert( memIsValid(u.cg.pRec) );
! 69456: u.cg.apVal[u.cg.i] = u.cg.pRec;
! 69457: memAboutToChange(p, u.cg.pRec);
! 69458: sqlite3VdbeMemStoreType(u.cg.pRec);
1.2 misho 69459: }
1.2.2.1 ! misho 69460: u.cg.ctx.pFunc = pOp->p4.pFunc;
1.2 misho 69461: assert( pOp->p3>0 && pOp->p3<=p->nMem );
1.2.2.1 ! misho 69462: u.cg.ctx.pMem = u.cg.pMem = &aMem[pOp->p3];
! 69463: u.cg.pMem->n++;
! 69464: u.cg.ctx.s.flags = MEM_Null;
! 69465: u.cg.ctx.s.z = 0;
! 69466: u.cg.ctx.s.zMalloc = 0;
! 69467: u.cg.ctx.s.xDel = 0;
! 69468: u.cg.ctx.s.db = db;
! 69469: u.cg.ctx.isError = 0;
! 69470: u.cg.ctx.pColl = 0;
! 69471: u.cg.ctx.skipFlag = 0;
! 69472: if( u.cg.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
1.2 misho 69473: assert( pOp>p->aOp );
69474: assert( pOp[-1].p4type==P4_COLLSEQ );
69475: assert( pOp[-1].opcode==OP_CollSeq );
1.2.2.1 ! misho 69476: u.cg.ctx.pColl = pOp[-1].p4.pColl;
! 69477: }
! 69478: (u.cg.ctx.pFunc->xStep)(&u.cg.ctx, u.cg.n, u.cg.apVal); /* IMP: R-24505-23230 */
! 69479: if( u.cg.ctx.isError ){
! 69480: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cg.ctx.s));
! 69481: rc = u.cg.ctx.isError;
1.2 misho 69482: }
1.2.2.1 ! misho 69483: if( u.cg.ctx.skipFlag ){
! 69484: assert( pOp[-1].opcode==OP_CollSeq );
! 69485: u.cg.i = pOp[-1].p1;
! 69486: if( u.cg.i ) sqlite3VdbeMemSetInt64(&aMem[u.cg.i], 1);
1.2 misho 69487: }
69488:
1.2.2.1 ! misho 69489: sqlite3VdbeMemRelease(&u.cg.ctx.s);
1.2 misho 69490:
69491: break;
69492: }
69493:
69494: /* Opcode: AggFinal P1 P2 * P4 *
69495: **
69496: ** Execute the finalizer function for an aggregate. P1 is
69497: ** the memory location that is the accumulator for the aggregate.
69498: **
69499: ** P2 is the number of arguments that the step function takes and
69500: ** P4 is a pointer to the FuncDef for this function. The P2
69501: ** argument is not used by this opcode. It is only there to disambiguate
69502: ** functions that can take varying numbers of arguments. The
69503: ** P4 argument is only needed for the degenerate case where
69504: ** the step function was not previously called.
69505: */
69506: case OP_AggFinal: {
1.2.2.1 ! misho 69507: #if 0 /* local variables moved into u.ch */
1.2 misho 69508: Mem *pMem;
1.2.2.1 ! misho 69509: #endif /* local variables moved into u.ch */
1.2 misho 69510: assert( pOp->p1>0 && pOp->p1<=p->nMem );
1.2.2.1 ! misho 69511: u.ch.pMem = &aMem[pOp->p1];
! 69512: assert( (u.ch.pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
! 69513: rc = sqlite3VdbeMemFinalize(u.ch.pMem, pOp->p4.pFunc);
1.2 misho 69514: if( rc ){
1.2.2.1 ! misho 69515: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.ch.pMem));
1.2 misho 69516: }
1.2.2.1 ! misho 69517: sqlite3VdbeChangeEncoding(u.ch.pMem, encoding);
! 69518: UPDATE_MAX_BLOBSIZE(u.ch.pMem);
! 69519: if( sqlite3VdbeMemTooBig(u.ch.pMem) ){
1.2 misho 69520: goto too_big;
69521: }
69522: break;
69523: }
69524:
69525: #ifndef SQLITE_OMIT_WAL
69526: /* Opcode: Checkpoint P1 P2 P3 * *
69527: **
69528: ** Checkpoint database P1. This is a no-op if P1 is not currently in
69529: ** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL
69530: ** or RESTART. Write 1 or 0 into mem[P3] if the checkpoint returns
69531: ** SQLITE_BUSY or not, respectively. Write the number of pages in the
69532: ** WAL after the checkpoint into mem[P3+1] and the number of pages
69533: ** in the WAL that have been checkpointed after the checkpoint
69534: ** completes into mem[P3+2]. However on an error, mem[P3+1] and
69535: ** mem[P3+2] are initialized to -1.
69536: */
69537: case OP_Checkpoint: {
1.2.2.1 ! misho 69538: #if 0 /* local variables moved into u.ci */
1.2 misho 69539: int i; /* Loop counter */
69540: int aRes[3]; /* Results */
69541: Mem *pMem; /* Write results here */
1.2.2.1 ! misho 69542: #endif /* local variables moved into u.ci */
1.2 misho 69543:
1.2.2.1 ! misho 69544: u.ci.aRes[0] = 0;
! 69545: u.ci.aRes[1] = u.ci.aRes[2] = -1;
1.2 misho 69546: assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE
69547: || pOp->p2==SQLITE_CHECKPOINT_FULL
69548: || pOp->p2==SQLITE_CHECKPOINT_RESTART
69549: );
1.2.2.1 ! misho 69550: rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &u.ci.aRes[1], &u.ci.aRes[2]);
1.2 misho 69551: if( rc==SQLITE_BUSY ){
69552: rc = SQLITE_OK;
1.2.2.1 ! misho 69553: u.ci.aRes[0] = 1;
1.2 misho 69554: }
1.2.2.1 ! misho 69555: for(u.ci.i=0, u.ci.pMem = &aMem[pOp->p3]; u.ci.i<3; u.ci.i++, u.ci.pMem++){
! 69556: sqlite3VdbeMemSetInt64(u.ci.pMem, (i64)u.ci.aRes[u.ci.i]);
1.2 misho 69557: }
69558: break;
69559: };
69560: #endif
69561:
69562: #ifndef SQLITE_OMIT_PRAGMA
69563: /* Opcode: JournalMode P1 P2 P3 * P5
69564: **
69565: ** Change the journal mode of database P1 to P3. P3 must be one of the
69566: ** PAGER_JOURNALMODE_XXX values. If changing between the various rollback
69567: ** modes (delete, truncate, persist, off and memory), this is a simple
69568: ** operation. No IO is required.
69569: **
69570: ** If changing into or out of WAL mode the procedure is more complicated.
69571: **
69572: ** Write a string containing the final journal-mode to register P2.
69573: */
69574: case OP_JournalMode: { /* out2-prerelease */
1.2.2.1 ! misho 69575: #if 0 /* local variables moved into u.cj */
1.2 misho 69576: Btree *pBt; /* Btree to change journal mode of */
69577: Pager *pPager; /* Pager associated with pBt */
69578: int eNew; /* New journal mode */
69579: int eOld; /* The old journal mode */
1.2.2.1 ! misho 69580: #ifndef SQLITE_OMIT_WAL
1.2 misho 69581: const char *zFilename; /* Name of database file for pPager */
1.2.2.1 ! misho 69582: #endif
! 69583: #endif /* local variables moved into u.cj */
1.2 misho 69584:
1.2.2.1 ! misho 69585: u.cj.eNew = pOp->p3;
! 69586: assert( u.cj.eNew==PAGER_JOURNALMODE_DELETE
! 69587: || u.cj.eNew==PAGER_JOURNALMODE_TRUNCATE
! 69588: || u.cj.eNew==PAGER_JOURNALMODE_PERSIST
! 69589: || u.cj.eNew==PAGER_JOURNALMODE_OFF
! 69590: || u.cj.eNew==PAGER_JOURNALMODE_MEMORY
! 69591: || u.cj.eNew==PAGER_JOURNALMODE_WAL
! 69592: || u.cj.eNew==PAGER_JOURNALMODE_QUERY
1.2 misho 69593: );
69594: assert( pOp->p1>=0 && pOp->p1<db->nDb );
69595:
1.2.2.1 ! misho 69596: u.cj.pBt = db->aDb[pOp->p1].pBt;
! 69597: u.cj.pPager = sqlite3BtreePager(u.cj.pBt);
! 69598: u.cj.eOld = sqlite3PagerGetJournalMode(u.cj.pPager);
! 69599: if( u.cj.eNew==PAGER_JOURNALMODE_QUERY ) u.cj.eNew = u.cj.eOld;
! 69600: if( !sqlite3PagerOkToChangeJournalMode(u.cj.pPager) ) u.cj.eNew = u.cj.eOld;
1.2 misho 69601:
69602: #ifndef SQLITE_OMIT_WAL
1.2.2.1 ! misho 69603: u.cj.zFilename = sqlite3PagerFilename(u.cj.pPager, 1);
1.2 misho 69604:
69605: /* Do not allow a transition to journal_mode=WAL for a database
69606: ** in temporary storage or if the VFS does not support shared memory
69607: */
1.2.2.1 ! misho 69608: if( u.cj.eNew==PAGER_JOURNALMODE_WAL
! 69609: && (sqlite3Strlen30(u.cj.zFilename)==0 /* Temp file */
! 69610: || !sqlite3PagerWalSupported(u.cj.pPager)) /* No shared-memory support */
1.2 misho 69611: ){
1.2.2.1 ! misho 69612: u.cj.eNew = u.cj.eOld;
1.2 misho 69613: }
69614:
1.2.2.1 ! misho 69615: if( (u.cj.eNew!=u.cj.eOld)
! 69616: && (u.cj.eOld==PAGER_JOURNALMODE_WAL || u.cj.eNew==PAGER_JOURNALMODE_WAL)
1.2 misho 69617: ){
69618: if( !db->autoCommit || db->activeVdbeCnt>1 ){
69619: rc = SQLITE_ERROR;
69620: sqlite3SetString(&p->zErrMsg, db,
69621: "cannot change %s wal mode from within a transaction",
1.2.2.1 ! misho 69622: (u.cj.eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of")
1.2 misho 69623: );
69624: break;
69625: }else{
69626:
1.2.2.1 ! misho 69627: if( u.cj.eOld==PAGER_JOURNALMODE_WAL ){
1.2 misho 69628: /* If leaving WAL mode, close the log file. If successful, the call
69629: ** to PagerCloseWal() checkpoints and deletes the write-ahead-log
69630: ** file. An EXCLUSIVE lock may still be held on the database file
69631: ** after a successful return.
69632: */
1.2.2.1 ! misho 69633: rc = sqlite3PagerCloseWal(u.cj.pPager);
1.2 misho 69634: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 69635: sqlite3PagerSetJournalMode(u.cj.pPager, u.cj.eNew);
1.2 misho 69636: }
1.2.2.1 ! misho 69637: }else if( u.cj.eOld==PAGER_JOURNALMODE_MEMORY ){
1.2 misho 69638: /* Cannot transition directly from MEMORY to WAL. Use mode OFF
69639: ** as an intermediate */
1.2.2.1 ! misho 69640: sqlite3PagerSetJournalMode(u.cj.pPager, PAGER_JOURNALMODE_OFF);
1.2 misho 69641: }
69642:
69643: /* Open a transaction on the database file. Regardless of the journal
69644: ** mode, this transaction always uses a rollback journal.
69645: */
1.2.2.1 ! misho 69646: assert( sqlite3BtreeIsInTrans(u.cj.pBt)==0 );
1.2 misho 69647: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 69648: rc = sqlite3BtreeSetVersion(u.cj.pBt, (u.cj.eNew==PAGER_JOURNALMODE_WAL ? 2 : 1));
1.2 misho 69649: }
69650: }
69651: }
69652: #endif /* ifndef SQLITE_OMIT_WAL */
69653:
69654: if( rc ){
1.2.2.1 ! misho 69655: u.cj.eNew = u.cj.eOld;
1.2 misho 69656: }
1.2.2.1 ! misho 69657: u.cj.eNew = sqlite3PagerSetJournalMode(u.cj.pPager, u.cj.eNew);
1.2 misho 69658:
69659: pOut = &aMem[pOp->p2];
69660: pOut->flags = MEM_Str|MEM_Static|MEM_Term;
1.2.2.1 ! misho 69661: pOut->z = (char *)sqlite3JournalModename(u.cj.eNew);
1.2 misho 69662: pOut->n = sqlite3Strlen30(pOut->z);
69663: pOut->enc = SQLITE_UTF8;
69664: sqlite3VdbeChangeEncoding(pOut, encoding);
69665: break;
69666: };
69667: #endif /* SQLITE_OMIT_PRAGMA */
69668:
69669: #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
69670: /* Opcode: Vacuum * * * * *
69671: **
69672: ** Vacuum the entire database. This opcode will cause other virtual
69673: ** machines to be created and run. It may not be called from within
69674: ** a transaction.
69675: */
69676: case OP_Vacuum: {
69677: rc = sqlite3RunVacuum(&p->zErrMsg, db);
69678: break;
69679: }
69680: #endif
69681:
69682: #if !defined(SQLITE_OMIT_AUTOVACUUM)
69683: /* Opcode: IncrVacuum P1 P2 * * *
69684: **
69685: ** Perform a single step of the incremental vacuum procedure on
69686: ** the P1 database. If the vacuum has finished, jump to instruction
69687: ** P2. Otherwise, fall through to the next instruction.
69688: */
69689: case OP_IncrVacuum: { /* jump */
1.2.2.1 ! misho 69690: #if 0 /* local variables moved into u.ck */
1.2 misho 69691: Btree *pBt;
1.2.2.1 ! misho 69692: #endif /* local variables moved into u.ck */
1.2 misho 69693:
69694: assert( pOp->p1>=0 && pOp->p1<db->nDb );
69695: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
1.2.2.1 ! misho 69696: u.ck.pBt = db->aDb[pOp->p1].pBt;
! 69697: rc = sqlite3BtreeIncrVacuum(u.ck.pBt);
1.2 misho 69698: if( rc==SQLITE_DONE ){
69699: pc = pOp->p2 - 1;
69700: rc = SQLITE_OK;
69701: }
69702: break;
69703: }
69704: #endif
69705:
69706: /* Opcode: Expire P1 * * * *
69707: **
69708: ** Cause precompiled statements to become expired. An expired statement
69709: ** fails with an error code of SQLITE_SCHEMA if it is ever executed
69710: ** (via sqlite3_step()).
69711: **
69712: ** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
69713: ** then only the currently executing statement is affected.
69714: */
69715: case OP_Expire: {
69716: if( !pOp->p1 ){
69717: sqlite3ExpirePreparedStatements(db);
69718: }else{
69719: p->expired = 1;
69720: }
69721: break;
69722: }
69723:
69724: #ifndef SQLITE_OMIT_SHARED_CACHE
69725: /* Opcode: TableLock P1 P2 P3 P4 *
69726: **
69727: ** Obtain a lock on a particular table. This instruction is only used when
69728: ** the shared-cache feature is enabled.
69729: **
69730: ** P1 is the index of the database in sqlite3.aDb[] of the database
69731: ** on which the lock is acquired. A readlock is obtained if P3==0 or
69732: ** a write lock if P3==1.
69733: **
69734: ** P2 contains the root-page of the table to lock.
69735: **
69736: ** P4 contains a pointer to the name of the table being locked. This is only
69737: ** used to generate an error message if the lock cannot be obtained.
69738: */
69739: case OP_TableLock: {
69740: u8 isWriteLock = (u8)pOp->p3;
69741: if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){
69742: int p1 = pOp->p1;
69743: assert( p1>=0 && p1<db->nDb );
69744: assert( (p->btreeMask & (((yDbMask)1)<<p1))!=0 );
69745: assert( isWriteLock==0 || isWriteLock==1 );
69746: rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
69747: if( (rc&0xFF)==SQLITE_LOCKED ){
69748: const char *z = pOp->p4.z;
69749: sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z);
69750: }
69751: }
69752: break;
69753: }
69754: #endif /* SQLITE_OMIT_SHARED_CACHE */
69755:
69756: #ifndef SQLITE_OMIT_VIRTUALTABLE
69757: /* Opcode: VBegin * * * P4 *
69758: **
69759: ** P4 may be a pointer to an sqlite3_vtab structure. If so, call the
69760: ** xBegin method for that table.
69761: **
69762: ** Also, whether or not P4 is set, check that this is not being called from
69763: ** within a callback to a virtual table xSync() method. If it is, the error
69764: ** code will be set to SQLITE_LOCKED.
69765: */
69766: case OP_VBegin: {
1.2.2.1 ! misho 69767: #if 0 /* local variables moved into u.cl */
1.2 misho 69768: VTable *pVTab;
1.2.2.1 ! misho 69769: #endif /* local variables moved into u.cl */
! 69770: u.cl.pVTab = pOp->p4.pVtab;
! 69771: rc = sqlite3VtabBegin(db, u.cl.pVTab);
! 69772: if( u.cl.pVTab ) importVtabErrMsg(p, u.cl.pVTab->pVtab);
1.2 misho 69773: break;
69774: }
69775: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69776:
69777: #ifndef SQLITE_OMIT_VIRTUALTABLE
69778: /* Opcode: VCreate P1 * * P4 *
69779: **
69780: ** P4 is the name of a virtual table in database P1. Call the xCreate method
69781: ** for that table.
69782: */
69783: case OP_VCreate: {
69784: rc = sqlite3VtabCallCreate(db, pOp->p1, pOp->p4.z, &p->zErrMsg);
69785: break;
69786: }
69787: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69788:
69789: #ifndef SQLITE_OMIT_VIRTUALTABLE
69790: /* Opcode: VDestroy P1 * * P4 *
69791: **
69792: ** P4 is the name of a virtual table in database P1. Call the xDestroy method
69793: ** of that table.
69794: */
69795: case OP_VDestroy: {
69796: p->inVtabMethod = 2;
69797: rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z);
69798: p->inVtabMethod = 0;
69799: break;
69800: }
69801: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69802:
69803: #ifndef SQLITE_OMIT_VIRTUALTABLE
69804: /* Opcode: VOpen P1 * * P4 *
69805: **
69806: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
69807: ** P1 is a cursor number. This opcode opens a cursor to the virtual
69808: ** table and stores that cursor in P1.
69809: */
69810: case OP_VOpen: {
1.2.2.1 ! misho 69811: #if 0 /* local variables moved into u.cm */
1.2 misho 69812: VdbeCursor *pCur;
69813: sqlite3_vtab_cursor *pVtabCursor;
69814: sqlite3_vtab *pVtab;
69815: sqlite3_module *pModule;
1.2.2.1 ! misho 69816: #endif /* local variables moved into u.cm */
1.2 misho 69817:
1.2.2.1 ! misho 69818: u.cm.pCur = 0;
! 69819: u.cm.pVtabCursor = 0;
! 69820: u.cm.pVtab = pOp->p4.pVtab->pVtab;
! 69821: u.cm.pModule = (sqlite3_module *)u.cm.pVtab->pModule;
! 69822: assert(u.cm.pVtab && u.cm.pModule);
! 69823: rc = u.cm.pModule->xOpen(u.cm.pVtab, &u.cm.pVtabCursor);
! 69824: importVtabErrMsg(p, u.cm.pVtab);
1.2 misho 69825: if( SQLITE_OK==rc ){
69826: /* Initialize sqlite3_vtab_cursor base class */
1.2.2.1 ! misho 69827: u.cm.pVtabCursor->pVtab = u.cm.pVtab;
1.2 misho 69828:
69829: /* Initialise vdbe cursor object */
1.2.2.1 ! misho 69830: u.cm.pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
! 69831: if( u.cm.pCur ){
! 69832: u.cm.pCur->pVtabCursor = u.cm.pVtabCursor;
! 69833: u.cm.pCur->pModule = u.cm.pVtabCursor->pVtab->pModule;
1.2 misho 69834: }else{
69835: db->mallocFailed = 1;
1.2.2.1 ! misho 69836: u.cm.pModule->xClose(u.cm.pVtabCursor);
1.2 misho 69837: }
69838: }
69839: break;
69840: }
69841: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69842:
69843: #ifndef SQLITE_OMIT_VIRTUALTABLE
69844: /* Opcode: VFilter P1 P2 P3 P4 *
69845: **
69846: ** P1 is a cursor opened using VOpen. P2 is an address to jump to if
69847: ** the filtered result set is empty.
69848: **
69849: ** P4 is either NULL or a string that was generated by the xBestIndex
69850: ** method of the module. The interpretation of the P4 string is left
69851: ** to the module implementation.
69852: **
69853: ** This opcode invokes the xFilter method on the virtual table specified
69854: ** by P1. The integer query plan parameter to xFilter is stored in register
69855: ** P3. Register P3+1 stores the argc parameter to be passed to the
69856: ** xFilter method. Registers P3+2..P3+1+argc are the argc
69857: ** additional parameters which are passed to
69858: ** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
69859: **
69860: ** A jump is made to P2 if the result set after filtering would be empty.
69861: */
69862: case OP_VFilter: { /* jump */
1.2.2.1 ! misho 69863: #if 0 /* local variables moved into u.cn */
1.2 misho 69864: int nArg;
69865: int iQuery;
69866: const sqlite3_module *pModule;
69867: Mem *pQuery;
69868: Mem *pArgc;
69869: sqlite3_vtab_cursor *pVtabCursor;
69870: sqlite3_vtab *pVtab;
69871: VdbeCursor *pCur;
69872: int res;
69873: int i;
69874: Mem **apArg;
1.2.2.1 ! misho 69875: #endif /* local variables moved into u.cn */
1.2 misho 69876:
1.2.2.1 ! misho 69877: u.cn.pQuery = &aMem[pOp->p3];
! 69878: u.cn.pArgc = &u.cn.pQuery[1];
! 69879: u.cn.pCur = p->apCsr[pOp->p1];
! 69880: assert( memIsValid(u.cn.pQuery) );
! 69881: REGISTER_TRACE(pOp->p3, u.cn.pQuery);
! 69882: assert( u.cn.pCur->pVtabCursor );
! 69883: u.cn.pVtabCursor = u.cn.pCur->pVtabCursor;
! 69884: u.cn.pVtab = u.cn.pVtabCursor->pVtab;
! 69885: u.cn.pModule = u.cn.pVtab->pModule;
1.2 misho 69886:
69887: /* Grab the index number and argc parameters */
1.2.2.1 ! misho 69888: assert( (u.cn.pQuery->flags&MEM_Int)!=0 && u.cn.pArgc->flags==MEM_Int );
! 69889: u.cn.nArg = (int)u.cn.pArgc->u.i;
! 69890: u.cn.iQuery = (int)u.cn.pQuery->u.i;
1.2 misho 69891:
69892: /* Invoke the xFilter method */
69893: {
1.2.2.1 ! misho 69894: u.cn.res = 0;
! 69895: u.cn.apArg = p->apArg;
! 69896: for(u.cn.i = 0; u.cn.i<u.cn.nArg; u.cn.i++){
! 69897: u.cn.apArg[u.cn.i] = &u.cn.pArgc[u.cn.i+1];
! 69898: sqlite3VdbeMemStoreType(u.cn.apArg[u.cn.i]);
1.2 misho 69899: }
69900:
69901: p->inVtabMethod = 1;
1.2.2.1 ! misho 69902: rc = u.cn.pModule->xFilter(u.cn.pVtabCursor, u.cn.iQuery, pOp->p4.z, u.cn.nArg, u.cn.apArg);
1.2 misho 69903: p->inVtabMethod = 0;
1.2.2.1 ! misho 69904: importVtabErrMsg(p, u.cn.pVtab);
1.2 misho 69905: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 69906: u.cn.res = u.cn.pModule->xEof(u.cn.pVtabCursor);
1.2 misho 69907: }
69908:
1.2.2.1 ! misho 69909: if( u.cn.res ){
1.2 misho 69910: pc = pOp->p2 - 1;
69911: }
69912: }
1.2.2.1 ! misho 69913: u.cn.pCur->nullRow = 0;
1.2 misho 69914:
69915: break;
69916: }
69917: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69918:
69919: #ifndef SQLITE_OMIT_VIRTUALTABLE
69920: /* Opcode: VColumn P1 P2 P3 * *
69921: **
69922: ** Store the value of the P2-th column of
69923: ** the row of the virtual-table that the
69924: ** P1 cursor is pointing to into register P3.
69925: */
69926: case OP_VColumn: {
1.2.2.1 ! misho 69927: #if 0 /* local variables moved into u.co */
1.2 misho 69928: sqlite3_vtab *pVtab;
69929: const sqlite3_module *pModule;
69930: Mem *pDest;
69931: sqlite3_context sContext;
1.2.2.1 ! misho 69932: #endif /* local variables moved into u.co */
1.2 misho 69933:
69934: VdbeCursor *pCur = p->apCsr[pOp->p1];
69935: assert( pCur->pVtabCursor );
69936: assert( pOp->p3>0 && pOp->p3<=p->nMem );
1.2.2.1 ! misho 69937: u.co.pDest = &aMem[pOp->p3];
! 69938: memAboutToChange(p, u.co.pDest);
1.2 misho 69939: if( pCur->nullRow ){
1.2.2.1 ! misho 69940: sqlite3VdbeMemSetNull(u.co.pDest);
1.2 misho 69941: break;
69942: }
1.2.2.1 ! misho 69943: u.co.pVtab = pCur->pVtabCursor->pVtab;
! 69944: u.co.pModule = u.co.pVtab->pModule;
! 69945: assert( u.co.pModule->xColumn );
! 69946: memset(&u.co.sContext, 0, sizeof(u.co.sContext));
1.2 misho 69947:
69948: /* The output cell may already have a buffer allocated. Move
1.2.2.1 ! misho 69949: ** the current contents to u.co.sContext.s so in case the user-function
1.2 misho 69950: ** can use the already allocated buffer instead of allocating a
69951: ** new one.
69952: */
1.2.2.1 ! misho 69953: sqlite3VdbeMemMove(&u.co.sContext.s, u.co.pDest);
! 69954: MemSetTypeFlag(&u.co.sContext.s, MEM_Null);
1.2 misho 69955:
1.2.2.1 ! misho 69956: rc = u.co.pModule->xColumn(pCur->pVtabCursor, &u.co.sContext, pOp->p2);
! 69957: importVtabErrMsg(p, u.co.pVtab);
! 69958: if( u.co.sContext.isError ){
! 69959: rc = u.co.sContext.isError;
1.2 misho 69960: }
69961:
69962: /* Copy the result of the function to the P3 register. We
69963: ** do this regardless of whether or not an error occurred to ensure any
1.2.2.1 ! misho 69964: ** dynamic allocation in u.co.sContext.s (a Mem struct) is released.
1.2 misho 69965: */
1.2.2.1 ! misho 69966: sqlite3VdbeChangeEncoding(&u.co.sContext.s, encoding);
! 69967: sqlite3VdbeMemMove(u.co.pDest, &u.co.sContext.s);
! 69968: REGISTER_TRACE(pOp->p3, u.co.pDest);
! 69969: UPDATE_MAX_BLOBSIZE(u.co.pDest);
1.2 misho 69970:
1.2.2.1 ! misho 69971: if( sqlite3VdbeMemTooBig(u.co.pDest) ){
1.2 misho 69972: goto too_big;
69973: }
69974: break;
69975: }
69976: #endif /* SQLITE_OMIT_VIRTUALTABLE */
69977:
69978: #ifndef SQLITE_OMIT_VIRTUALTABLE
69979: /* Opcode: VNext P1 P2 * * *
69980: **
69981: ** Advance virtual table P1 to the next row in its result set and
69982: ** jump to instruction P2. Or, if the virtual table has reached
69983: ** the end of its result set, then fall through to the next instruction.
69984: */
69985: case OP_VNext: { /* jump */
1.2.2.1 ! misho 69986: #if 0 /* local variables moved into u.cp */
1.2 misho 69987: sqlite3_vtab *pVtab;
69988: const sqlite3_module *pModule;
69989: int res;
69990: VdbeCursor *pCur;
1.2.2.1 ! misho 69991: #endif /* local variables moved into u.cp */
1.2 misho 69992:
1.2.2.1 ! misho 69993: u.cp.res = 0;
! 69994: u.cp.pCur = p->apCsr[pOp->p1];
! 69995: assert( u.cp.pCur->pVtabCursor );
! 69996: if( u.cp.pCur->nullRow ){
1.2 misho 69997: break;
69998: }
1.2.2.1 ! misho 69999: u.cp.pVtab = u.cp.pCur->pVtabCursor->pVtab;
! 70000: u.cp.pModule = u.cp.pVtab->pModule;
! 70001: assert( u.cp.pModule->xNext );
1.2 misho 70002:
70003: /* Invoke the xNext() method of the module. There is no way for the
70004: ** underlying implementation to return an error if one occurs during
70005: ** xNext(). Instead, if an error occurs, true is returned (indicating that
70006: ** data is available) and the error code returned when xColumn or
70007: ** some other method is next invoked on the save virtual table cursor.
70008: */
70009: p->inVtabMethod = 1;
1.2.2.1 ! misho 70010: rc = u.cp.pModule->xNext(u.cp.pCur->pVtabCursor);
1.2 misho 70011: p->inVtabMethod = 0;
1.2.2.1 ! misho 70012: importVtabErrMsg(p, u.cp.pVtab);
1.2 misho 70013: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 70014: u.cp.res = u.cp.pModule->xEof(u.cp.pCur->pVtabCursor);
1.2 misho 70015: }
70016:
1.2.2.1 ! misho 70017: if( !u.cp.res ){
1.2 misho 70018: /* If there is data, jump to P2 */
70019: pc = pOp->p2 - 1;
70020: }
70021: break;
70022: }
70023: #endif /* SQLITE_OMIT_VIRTUALTABLE */
70024:
70025: #ifndef SQLITE_OMIT_VIRTUALTABLE
70026: /* Opcode: VRename P1 * * P4 *
70027: **
70028: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
70029: ** This opcode invokes the corresponding xRename method. The value
70030: ** in register P1 is passed as the zName argument to the xRename method.
70031: */
70032: case OP_VRename: {
1.2.2.1 ! misho 70033: #if 0 /* local variables moved into u.cq */
1.2 misho 70034: sqlite3_vtab *pVtab;
70035: Mem *pName;
1.2.2.1 ! misho 70036: #endif /* local variables moved into u.cq */
1.2 misho 70037:
1.2.2.1 ! misho 70038: u.cq.pVtab = pOp->p4.pVtab->pVtab;
! 70039: u.cq.pName = &aMem[pOp->p1];
! 70040: assert( u.cq.pVtab->pModule->xRename );
! 70041: assert( memIsValid(u.cq.pName) );
! 70042: REGISTER_TRACE(pOp->p1, u.cq.pName);
! 70043: assert( u.cq.pName->flags & MEM_Str );
! 70044: testcase( u.cq.pName->enc==SQLITE_UTF8 );
! 70045: testcase( u.cq.pName->enc==SQLITE_UTF16BE );
! 70046: testcase( u.cq.pName->enc==SQLITE_UTF16LE );
! 70047: rc = sqlite3VdbeChangeEncoding(u.cq.pName, SQLITE_UTF8);
1.2 misho 70048: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 70049: rc = u.cq.pVtab->pModule->xRename(u.cq.pVtab, u.cq.pName->z);
! 70050: importVtabErrMsg(p, u.cq.pVtab);
1.2 misho 70051: p->expired = 0;
70052: }
70053: break;
70054: }
70055: #endif
70056:
70057: #ifndef SQLITE_OMIT_VIRTUALTABLE
70058: /* Opcode: VUpdate P1 P2 P3 P4 *
70059: **
70060: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
70061: ** This opcode invokes the corresponding xUpdate method. P2 values
70062: ** are contiguous memory cells starting at P3 to pass to the xUpdate
70063: ** invocation. The value in register (P3+P2-1) corresponds to the
70064: ** p2th element of the argv array passed to xUpdate.
70065: **
70066: ** The xUpdate method will do a DELETE or an INSERT or both.
70067: ** The argv[0] element (which corresponds to memory cell P3)
70068: ** is the rowid of a row to delete. If argv[0] is NULL then no
70069: ** deletion occurs. The argv[1] element is the rowid of the new
70070: ** row. This can be NULL to have the virtual table select the new
70071: ** rowid for itself. The subsequent elements in the array are
70072: ** the values of columns in the new row.
70073: **
70074: ** If P2==1 then no insert is performed. argv[0] is the rowid of
70075: ** a row to delete.
70076: **
70077: ** P1 is a boolean flag. If it is set to true and the xUpdate call
70078: ** is successful, then the value returned by sqlite3_last_insert_rowid()
70079: ** is set to the value of the rowid for the row just inserted.
70080: */
70081: case OP_VUpdate: {
1.2.2.1 ! misho 70082: #if 0 /* local variables moved into u.cr */
1.2 misho 70083: sqlite3_vtab *pVtab;
70084: sqlite3_module *pModule;
70085: int nArg;
70086: int i;
70087: sqlite_int64 rowid;
70088: Mem **apArg;
70089: Mem *pX;
1.2.2.1 ! misho 70090: #endif /* local variables moved into u.cr */
1.2 misho 70091:
70092: assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback
70093: || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace
70094: );
1.2.2.1 ! misho 70095: u.cr.pVtab = pOp->p4.pVtab->pVtab;
! 70096: u.cr.pModule = (sqlite3_module *)u.cr.pVtab->pModule;
! 70097: u.cr.nArg = pOp->p2;
1.2 misho 70098: assert( pOp->p4type==P4_VTAB );
1.2.2.1 ! misho 70099: if( ALWAYS(u.cr.pModule->xUpdate) ){
1.2 misho 70100: u8 vtabOnConflict = db->vtabOnConflict;
1.2.2.1 ! misho 70101: u.cr.apArg = p->apArg;
! 70102: u.cr.pX = &aMem[pOp->p3];
! 70103: for(u.cr.i=0; u.cr.i<u.cr.nArg; u.cr.i++){
! 70104: assert( memIsValid(u.cr.pX) );
! 70105: memAboutToChange(p, u.cr.pX);
! 70106: sqlite3VdbeMemStoreType(u.cr.pX);
! 70107: u.cr.apArg[u.cr.i] = u.cr.pX;
! 70108: u.cr.pX++;
1.2 misho 70109: }
70110: db->vtabOnConflict = pOp->p5;
1.2.2.1 ! misho 70111: rc = u.cr.pModule->xUpdate(u.cr.pVtab, u.cr.nArg, u.cr.apArg, &u.cr.rowid);
1.2 misho 70112: db->vtabOnConflict = vtabOnConflict;
1.2.2.1 ! misho 70113: importVtabErrMsg(p, u.cr.pVtab);
1.2 misho 70114: if( rc==SQLITE_OK && pOp->p1 ){
1.2.2.1 ! misho 70115: assert( u.cr.nArg>1 && u.cr.apArg[0] && (u.cr.apArg[0]->flags&MEM_Null) );
! 70116: db->lastRowid = lastRowid = u.cr.rowid;
1.2 misho 70117: }
70118: if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){
70119: if( pOp->p5==OE_Ignore ){
70120: rc = SQLITE_OK;
70121: }else{
70122: p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5);
70123: }
70124: }else{
70125: p->nChange++;
70126: }
70127: }
70128: break;
70129: }
70130: #endif /* SQLITE_OMIT_VIRTUALTABLE */
70131:
70132: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
70133: /* Opcode: Pagecount P1 P2 * * *
70134: **
70135: ** Write the current number of pages in database P1 to memory cell P2.
70136: */
70137: case OP_Pagecount: { /* out2-prerelease */
70138: pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt);
70139: break;
70140: }
70141: #endif
70142:
70143:
70144: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
70145: /* Opcode: MaxPgcnt P1 P2 P3 * *
70146: **
70147: ** Try to set the maximum page count for database P1 to the value in P3.
70148: ** Do not let the maximum page count fall below the current page count and
70149: ** do not change the maximum page count value if P3==0.
70150: **
70151: ** Store the maximum page count after the change in register P2.
70152: */
70153: case OP_MaxPgcnt: { /* out2-prerelease */
70154: unsigned int newMax;
70155: Btree *pBt;
70156:
70157: pBt = db->aDb[pOp->p1].pBt;
70158: newMax = 0;
70159: if( pOp->p3 ){
70160: newMax = sqlite3BtreeLastPage(pBt);
70161: if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3;
70162: }
70163: pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax);
70164: break;
70165: }
70166: #endif
70167:
70168:
70169: #ifndef SQLITE_OMIT_TRACE
70170: /* Opcode: Trace * * * P4 *
70171: **
70172: ** If tracing is enabled (by the sqlite3_trace()) interface, then
70173: ** the UTF-8 string contained in P4 is emitted on the trace callback.
70174: */
70175: case OP_Trace: {
1.2.2.1 ! misho 70176: #if 0 /* local variables moved into u.cs */
1.2 misho 70177: char *zTrace;
70178: char *z;
1.2.2.1 ! misho 70179: #endif /* local variables moved into u.cs */
1.2 misho 70180:
1.2.2.1 ! misho 70181: if( db->xTrace
! 70182: && !p->doingRerun
! 70183: && (u.cs.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0
! 70184: ){
! 70185: u.cs.z = sqlite3VdbeExpandSql(p, u.cs.zTrace);
! 70186: db->xTrace(db->pTraceArg, u.cs.z);
! 70187: sqlite3DbFree(db, u.cs.z);
1.2 misho 70188: }
70189: #ifdef SQLITE_DEBUG
70190: if( (db->flags & SQLITE_SqlTrace)!=0
1.2.2.1 ! misho 70191: && (u.cs.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0
1.2 misho 70192: ){
1.2.2.1 ! misho 70193: sqlite3DebugPrintf("SQL-trace: %s\n", u.cs.zTrace);
1.2 misho 70194: }
70195: #endif /* SQLITE_DEBUG */
70196: break;
70197: }
70198: #endif
70199:
70200:
70201: /* Opcode: Noop * * * * *
70202: **
70203: ** Do nothing. This instruction is often useful as a jump
70204: ** destination.
70205: */
70206: /*
70207: ** The magic Explain opcode are only inserted when explain==2 (which
70208: ** is to say when the EXPLAIN QUERY PLAN syntax is used.)
70209: ** This opcode records information from the optimizer. It is the
70210: ** the same as a no-op. This opcodesnever appears in a real VM program.
70211: */
70212: default: { /* This is really OP_Noop and OP_Explain */
70213: assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain );
70214: break;
70215: }
70216:
70217: /*****************************************************************************
70218: ** The cases of the switch statement above this line should all be indented
70219: ** by 6 spaces. But the left-most 6 spaces have been removed to improve the
70220: ** readability. From this point on down, the normal indentation rules are
70221: ** restored.
70222: *****************************************************************************/
70223: }
70224:
70225: #ifdef VDBE_PROFILE
70226: {
70227: u64 elapsed = sqlite3Hwtime() - start;
70228: pOp->cycles += elapsed;
70229: pOp->cnt++;
70230: #if 0
70231: fprintf(stdout, "%10llu ", elapsed);
70232: sqlite3VdbePrintOp(stdout, origPc, &aOp[origPc]);
70233: #endif
70234: }
70235: #endif
70236:
70237: /* The following code adds nothing to the actual functionality
70238: ** of the program. It is only here for testing and debugging.
70239: ** On the other hand, it does burn CPU cycles every time through
70240: ** the evaluator loop. So we can leave it out when NDEBUG is defined.
70241: */
70242: #ifndef NDEBUG
70243: assert( pc>=-1 && pc<p->nOp );
70244:
70245: #ifdef SQLITE_DEBUG
70246: if( p->trace ){
70247: if( rc!=0 ) fprintf(p->trace,"rc=%d\n",rc);
70248: if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){
70249: registerTrace(p->trace, pOp->p2, &aMem[pOp->p2]);
70250: }
70251: if( pOp->opflags & OPFLG_OUT3 ){
70252: registerTrace(p->trace, pOp->p3, &aMem[pOp->p3]);
70253: }
70254: }
70255: #endif /* SQLITE_DEBUG */
70256: #endif /* NDEBUG */
70257: } /* The end of the for(;;) loop the loops through opcodes */
70258:
70259: /* If we reach this point, it means that execution is finished with
70260: ** an error of some kind.
70261: */
70262: vdbe_error_halt:
70263: assert( rc );
70264: p->rc = rc;
70265: testcase( sqlite3GlobalConfig.xLog!=0 );
70266: sqlite3_log(rc, "statement aborts at %d: [%s] %s",
70267: pc, p->zSql, p->zErrMsg);
70268: sqlite3VdbeHalt(p);
70269: if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
70270: rc = SQLITE_ERROR;
70271: if( resetSchemaOnFault>0 ){
1.2.2.1 ! misho 70272: sqlite3ResetOneSchema(db, resetSchemaOnFault-1);
1.2 misho 70273: }
70274:
70275: /* This is the only way out of this procedure. We have to
70276: ** release the mutexes on btrees that were acquired at the
70277: ** top. */
70278: vdbe_return:
70279: db->lastRowid = lastRowid;
70280: sqlite3VdbeLeave(p);
70281: return rc;
70282:
70283: /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH
70284: ** is encountered.
70285: */
70286: too_big:
70287: sqlite3SetString(&p->zErrMsg, db, "string or blob too big");
70288: rc = SQLITE_TOOBIG;
70289: goto vdbe_error_halt;
70290:
70291: /* Jump to here if a malloc() fails.
70292: */
70293: no_mem:
70294: db->mallocFailed = 1;
70295: sqlite3SetString(&p->zErrMsg, db, "out of memory");
70296: rc = SQLITE_NOMEM;
70297: goto vdbe_error_halt;
70298:
70299: /* Jump to here for any other kind of fatal error. The "rc" variable
70300: ** should hold the error number.
70301: */
70302: abort_due_to_error:
70303: assert( p->zErrMsg==0 );
70304: if( db->mallocFailed ) rc = SQLITE_NOMEM;
70305: if( rc!=SQLITE_IOERR_NOMEM ){
70306: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
70307: }
70308: goto vdbe_error_halt;
70309:
70310: /* Jump to here if the sqlite3_interrupt() API sets the interrupt
70311: ** flag.
70312: */
70313: abort_due_to_interrupt:
70314: assert( db->u1.isInterrupted );
70315: rc = SQLITE_INTERRUPT;
70316: p->rc = rc;
70317: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
70318: goto vdbe_error_halt;
70319: }
70320:
70321: /************** End of vdbe.c ************************************************/
70322: /************** Begin file vdbeblob.c ****************************************/
70323: /*
70324: ** 2007 May 1
70325: **
70326: ** The author disclaims copyright to this source code. In place of
70327: ** a legal notice, here is a blessing:
70328: **
70329: ** May you do good and not evil.
70330: ** May you find forgiveness for yourself and forgive others.
70331: ** May you share freely, never taking more than you give.
70332: **
70333: *************************************************************************
70334: **
70335: ** This file contains code used to implement incremental BLOB I/O.
70336: */
70337:
70338:
70339: #ifndef SQLITE_OMIT_INCRBLOB
70340:
70341: /*
70342: ** Valid sqlite3_blob* handles point to Incrblob structures.
70343: */
70344: typedef struct Incrblob Incrblob;
70345: struct Incrblob {
70346: int flags; /* Copy of "flags" passed to sqlite3_blob_open() */
70347: int nByte; /* Size of open blob, in bytes */
70348: int iOffset; /* Byte offset of blob in cursor data */
70349: int iCol; /* Table column this handle is open on */
70350: BtCursor *pCsr; /* Cursor pointing at blob row */
70351: sqlite3_stmt *pStmt; /* Statement holding cursor open */
70352: sqlite3 *db; /* The associated database */
70353: };
70354:
70355:
70356: /*
70357: ** This function is used by both blob_open() and blob_reopen(). It seeks
70358: ** the b-tree cursor associated with blob handle p to point to row iRow.
70359: ** If successful, SQLITE_OK is returned and subsequent calls to
70360: ** sqlite3_blob_read() or sqlite3_blob_write() access the specified row.
70361: **
70362: ** If an error occurs, or if the specified row does not exist or does not
70363: ** contain a value of type TEXT or BLOB in the column nominated when the
70364: ** blob handle was opened, then an error code is returned and *pzErr may
70365: ** be set to point to a buffer containing an error message. It is the
70366: ** responsibility of the caller to free the error message buffer using
70367: ** sqlite3DbFree().
70368: **
70369: ** If an error does occur, then the b-tree cursor is closed. All subsequent
70370: ** calls to sqlite3_blob_read(), blob_write() or blob_reopen() will
70371: ** immediately return SQLITE_ABORT.
70372: */
70373: static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){
70374: int rc; /* Error code */
70375: char *zErr = 0; /* Error message */
70376: Vdbe *v = (Vdbe *)p->pStmt;
70377:
70378: /* Set the value of the SQL statements only variable to integer iRow.
70379: ** This is done directly instead of using sqlite3_bind_int64() to avoid
70380: ** triggering asserts related to mutexes.
70381: */
70382: assert( v->aVar[0].flags&MEM_Int );
70383: v->aVar[0].u.i = iRow;
70384:
70385: rc = sqlite3_step(p->pStmt);
70386: if( rc==SQLITE_ROW ){
70387: u32 type = v->apCsr[0]->aType[p->iCol];
70388: if( type<12 ){
70389: zErr = sqlite3MPrintf(p->db, "cannot open value of type %s",
70390: type==0?"null": type==7?"real": "integer"
70391: );
70392: rc = SQLITE_ERROR;
70393: sqlite3_finalize(p->pStmt);
70394: p->pStmt = 0;
70395: }else{
70396: p->iOffset = v->apCsr[0]->aOffset[p->iCol];
70397: p->nByte = sqlite3VdbeSerialTypeLen(type);
70398: p->pCsr = v->apCsr[0]->pCursor;
70399: sqlite3BtreeEnterCursor(p->pCsr);
70400: sqlite3BtreeCacheOverflow(p->pCsr);
70401: sqlite3BtreeLeaveCursor(p->pCsr);
70402: }
70403: }
70404:
70405: if( rc==SQLITE_ROW ){
70406: rc = SQLITE_OK;
70407: }else if( p->pStmt ){
70408: rc = sqlite3_finalize(p->pStmt);
70409: p->pStmt = 0;
70410: if( rc==SQLITE_OK ){
70411: zErr = sqlite3MPrintf(p->db, "no such rowid: %lld", iRow);
70412: rc = SQLITE_ERROR;
70413: }else{
70414: zErr = sqlite3MPrintf(p->db, "%s", sqlite3_errmsg(p->db));
70415: }
70416: }
70417:
70418: assert( rc!=SQLITE_OK || zErr==0 );
70419: assert( rc!=SQLITE_ROW && rc!=SQLITE_DONE );
70420:
70421: *pzErr = zErr;
70422: return rc;
70423: }
70424:
70425: /*
70426: ** Open a blob handle.
70427: */
70428: SQLITE_API int sqlite3_blob_open(
70429: sqlite3* db, /* The database connection */
70430: const char *zDb, /* The attached database containing the blob */
70431: const char *zTable, /* The table containing the blob */
70432: const char *zColumn, /* The column containing the blob */
70433: sqlite_int64 iRow, /* The row containing the glob */
70434: int flags, /* True -> read/write access, false -> read-only */
70435: sqlite3_blob **ppBlob /* Handle for accessing the blob returned here */
70436: ){
70437: int nAttempt = 0;
70438: int iCol; /* Index of zColumn in row-record */
70439:
70440: /* This VDBE program seeks a btree cursor to the identified
70441: ** db/table/row entry. The reason for using a vdbe program instead
70442: ** of writing code to use the b-tree layer directly is that the
70443: ** vdbe program will take advantage of the various transaction,
70444: ** locking and error handling infrastructure built into the vdbe.
70445: **
70446: ** After seeking the cursor, the vdbe executes an OP_ResultRow.
70447: ** Code external to the Vdbe then "borrows" the b-tree cursor and
70448: ** uses it to implement the blob_read(), blob_write() and
70449: ** blob_bytes() functions.
70450: **
70451: ** The sqlite3_blob_close() function finalizes the vdbe program,
70452: ** which closes the b-tree cursor and (possibly) commits the
70453: ** transaction.
70454: */
70455: static const VdbeOpList openBlob[] = {
70456: {OP_Transaction, 0, 0, 0}, /* 0: Start a transaction */
70457: {OP_VerifyCookie, 0, 0, 0}, /* 1: Check the schema cookie */
70458: {OP_TableLock, 0, 0, 0}, /* 2: Acquire a read or write lock */
70459:
70460: /* One of the following two instructions is replaced by an OP_Noop. */
70461: {OP_OpenRead, 0, 0, 0}, /* 3: Open cursor 0 for reading */
70462: {OP_OpenWrite, 0, 0, 0}, /* 4: Open cursor 0 for read/write */
70463:
70464: {OP_Variable, 1, 1, 1}, /* 5: Push the rowid to the stack */
70465: {OP_NotExists, 0, 10, 1}, /* 6: Seek the cursor */
70466: {OP_Column, 0, 0, 1}, /* 7 */
70467: {OP_ResultRow, 1, 0, 0}, /* 8 */
70468: {OP_Goto, 0, 5, 0}, /* 9 */
70469: {OP_Close, 0, 0, 0}, /* 10 */
70470: {OP_Halt, 0, 0, 0}, /* 11 */
70471: };
70472:
70473: int rc = SQLITE_OK;
70474: char *zErr = 0;
70475: Table *pTab;
70476: Parse *pParse = 0;
70477: Incrblob *pBlob = 0;
70478:
70479: flags = !!flags; /* flags = (flags ? 1 : 0); */
70480: *ppBlob = 0;
70481:
70482: sqlite3_mutex_enter(db->mutex);
70483:
70484: pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob));
70485: if( !pBlob ) goto blob_open_out;
70486: pParse = sqlite3StackAllocRaw(db, sizeof(*pParse));
70487: if( !pParse ) goto blob_open_out;
70488:
70489: do {
70490: memset(pParse, 0, sizeof(Parse));
70491: pParse->db = db;
70492: sqlite3DbFree(db, zErr);
70493: zErr = 0;
70494:
70495: sqlite3BtreeEnterAll(db);
70496: pTab = sqlite3LocateTable(pParse, 0, zTable, zDb);
70497: if( pTab && IsVirtual(pTab) ){
70498: pTab = 0;
70499: sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable);
70500: }
70501: #ifndef SQLITE_OMIT_VIEW
70502: if( pTab && pTab->pSelect ){
70503: pTab = 0;
70504: sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable);
70505: }
70506: #endif
70507: if( !pTab ){
70508: if( pParse->zErrMsg ){
70509: sqlite3DbFree(db, zErr);
70510: zErr = pParse->zErrMsg;
70511: pParse->zErrMsg = 0;
70512: }
70513: rc = SQLITE_ERROR;
70514: sqlite3BtreeLeaveAll(db);
70515: goto blob_open_out;
70516: }
70517:
70518: /* Now search pTab for the exact column. */
70519: for(iCol=0; iCol<pTab->nCol; iCol++) {
70520: if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){
70521: break;
70522: }
70523: }
70524: if( iCol==pTab->nCol ){
70525: sqlite3DbFree(db, zErr);
70526: zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn);
70527: rc = SQLITE_ERROR;
70528: sqlite3BtreeLeaveAll(db);
70529: goto blob_open_out;
70530: }
70531:
70532: /* If the value is being opened for writing, check that the
70533: ** column is not indexed, and that it is not part of a foreign key.
70534: ** It is against the rules to open a column to which either of these
70535: ** descriptions applies for writing. */
70536: if( flags ){
70537: const char *zFault = 0;
70538: Index *pIdx;
70539: #ifndef SQLITE_OMIT_FOREIGN_KEY
70540: if( db->flags&SQLITE_ForeignKeys ){
70541: /* Check that the column is not part of an FK child key definition. It
70542: ** is not necessary to check if it is part of a parent key, as parent
70543: ** key columns must be indexed. The check below will pick up this
70544: ** case. */
70545: FKey *pFKey;
70546: for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
70547: int j;
70548: for(j=0; j<pFKey->nCol; j++){
70549: if( pFKey->aCol[j].iFrom==iCol ){
70550: zFault = "foreign key";
70551: }
70552: }
70553: }
70554: }
70555: #endif
70556: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
70557: int j;
70558: for(j=0; j<pIdx->nColumn; j++){
70559: if( pIdx->aiColumn[j]==iCol ){
70560: zFault = "indexed";
70561: }
70562: }
70563: }
70564: if( zFault ){
70565: sqlite3DbFree(db, zErr);
70566: zErr = sqlite3MPrintf(db, "cannot open %s column for writing", zFault);
70567: rc = SQLITE_ERROR;
70568: sqlite3BtreeLeaveAll(db);
70569: goto blob_open_out;
70570: }
70571: }
70572:
70573: pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(db);
70574: assert( pBlob->pStmt || db->mallocFailed );
70575: if( pBlob->pStmt ){
70576: Vdbe *v = (Vdbe *)pBlob->pStmt;
70577: int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
70578:
70579: sqlite3VdbeAddOpList(v, sizeof(openBlob)/sizeof(VdbeOpList), openBlob);
70580:
70581:
70582: /* Configure the OP_Transaction */
70583: sqlite3VdbeChangeP1(v, 0, iDb);
70584: sqlite3VdbeChangeP2(v, 0, flags);
70585:
70586: /* Configure the OP_VerifyCookie */
70587: sqlite3VdbeChangeP1(v, 1, iDb);
70588: sqlite3VdbeChangeP2(v, 1, pTab->pSchema->schema_cookie);
70589: sqlite3VdbeChangeP3(v, 1, pTab->pSchema->iGeneration);
70590:
70591: /* Make sure a mutex is held on the table to be accessed */
70592: sqlite3VdbeUsesBtree(v, iDb);
70593:
70594: /* Configure the OP_TableLock instruction */
70595: #ifdef SQLITE_OMIT_SHARED_CACHE
70596: sqlite3VdbeChangeToNoop(v, 2);
70597: #else
70598: sqlite3VdbeChangeP1(v, 2, iDb);
70599: sqlite3VdbeChangeP2(v, 2, pTab->tnum);
70600: sqlite3VdbeChangeP3(v, 2, flags);
70601: sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT);
70602: #endif
70603:
70604: /* Remove either the OP_OpenWrite or OpenRead. Set the P2
70605: ** parameter of the other to pTab->tnum. */
70606: sqlite3VdbeChangeToNoop(v, 4 - flags);
70607: sqlite3VdbeChangeP2(v, 3 + flags, pTab->tnum);
70608: sqlite3VdbeChangeP3(v, 3 + flags, iDb);
70609:
70610: /* Configure the number of columns. Configure the cursor to
70611: ** think that the table has one more column than it really
70612: ** does. An OP_Column to retrieve this imaginary column will
70613: ** always return an SQL NULL. This is useful because it means
70614: ** we can invoke OP_Column to fill in the vdbe cursors type
70615: ** and offset cache without causing any IO.
70616: */
70617: sqlite3VdbeChangeP4(v, 3+flags, SQLITE_INT_TO_PTR(pTab->nCol+1),P4_INT32);
70618: sqlite3VdbeChangeP2(v, 7, pTab->nCol);
70619: if( !db->mallocFailed ){
70620: pParse->nVar = 1;
70621: pParse->nMem = 1;
70622: pParse->nTab = 1;
70623: sqlite3VdbeMakeReady(v, pParse);
70624: }
70625: }
70626:
70627: pBlob->flags = flags;
70628: pBlob->iCol = iCol;
70629: pBlob->db = db;
70630: sqlite3BtreeLeaveAll(db);
70631: if( db->mallocFailed ){
70632: goto blob_open_out;
70633: }
70634: sqlite3_bind_int64(pBlob->pStmt, 1, iRow);
70635: rc = blobSeekToRow(pBlob, iRow, &zErr);
70636: } while( (++nAttempt)<5 && rc==SQLITE_SCHEMA );
70637:
70638: blob_open_out:
70639: if( rc==SQLITE_OK && db->mallocFailed==0 ){
70640: *ppBlob = (sqlite3_blob *)pBlob;
70641: }else{
70642: if( pBlob && pBlob->pStmt ) sqlite3VdbeFinalize((Vdbe *)pBlob->pStmt);
70643: sqlite3DbFree(db, pBlob);
70644: }
70645: sqlite3Error(db, rc, (zErr ? "%s" : 0), zErr);
70646: sqlite3DbFree(db, zErr);
70647: sqlite3StackFree(db, pParse);
70648: rc = sqlite3ApiExit(db, rc);
70649: sqlite3_mutex_leave(db->mutex);
70650: return rc;
70651: }
70652:
70653: /*
70654: ** Close a blob handle that was previously created using
70655: ** sqlite3_blob_open().
70656: */
70657: SQLITE_API int sqlite3_blob_close(sqlite3_blob *pBlob){
70658: Incrblob *p = (Incrblob *)pBlob;
70659: int rc;
70660: sqlite3 *db;
70661:
70662: if( p ){
70663: db = p->db;
70664: sqlite3_mutex_enter(db->mutex);
70665: rc = sqlite3_finalize(p->pStmt);
70666: sqlite3DbFree(db, p);
70667: sqlite3_mutex_leave(db->mutex);
70668: }else{
70669: rc = SQLITE_OK;
70670: }
70671: return rc;
70672: }
70673:
70674: /*
70675: ** Perform a read or write operation on a blob
70676: */
70677: static int blobReadWrite(
70678: sqlite3_blob *pBlob,
70679: void *z,
70680: int n,
70681: int iOffset,
70682: int (*xCall)(BtCursor*, u32, u32, void*)
70683: ){
70684: int rc;
70685: Incrblob *p = (Incrblob *)pBlob;
70686: Vdbe *v;
70687: sqlite3 *db;
70688:
70689: if( p==0 ) return SQLITE_MISUSE_BKPT;
70690: db = p->db;
70691: sqlite3_mutex_enter(db->mutex);
70692: v = (Vdbe*)p->pStmt;
70693:
70694: if( n<0 || iOffset<0 || (iOffset+n)>p->nByte ){
70695: /* Request is out of range. Return a transient error. */
70696: rc = SQLITE_ERROR;
70697: sqlite3Error(db, SQLITE_ERROR, 0);
70698: }else if( v==0 ){
70699: /* If there is no statement handle, then the blob-handle has
70700: ** already been invalidated. Return SQLITE_ABORT in this case.
70701: */
70702: rc = SQLITE_ABORT;
70703: }else{
70704: /* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is
70705: ** returned, clean-up the statement handle.
70706: */
70707: assert( db == v->db );
70708: sqlite3BtreeEnterCursor(p->pCsr);
70709: rc = xCall(p->pCsr, iOffset+p->iOffset, n, z);
70710: sqlite3BtreeLeaveCursor(p->pCsr);
70711: if( rc==SQLITE_ABORT ){
70712: sqlite3VdbeFinalize(v);
70713: p->pStmt = 0;
70714: }else{
70715: db->errCode = rc;
70716: v->rc = rc;
70717: }
70718: }
70719: rc = sqlite3ApiExit(db, rc);
70720: sqlite3_mutex_leave(db->mutex);
70721: return rc;
70722: }
70723:
70724: /*
70725: ** Read data from a blob handle.
70726: */
70727: SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){
70728: return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreeData);
70729: }
70730:
70731: /*
70732: ** Write data to a blob handle.
70733: */
70734: SQLITE_API int sqlite3_blob_write(sqlite3_blob *pBlob, const void *z, int n, int iOffset){
70735: return blobReadWrite(pBlob, (void *)z, n, iOffset, sqlite3BtreePutData);
70736: }
70737:
70738: /*
70739: ** Query a blob handle for the size of the data.
70740: **
70741: ** The Incrblob.nByte field is fixed for the lifetime of the Incrblob
70742: ** so no mutex is required for access.
70743: */
70744: SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *pBlob){
70745: Incrblob *p = (Incrblob *)pBlob;
70746: return (p && p->pStmt) ? p->nByte : 0;
70747: }
70748:
70749: /*
70750: ** Move an existing blob handle to point to a different row of the same
70751: ** database table.
70752: **
70753: ** If an error occurs, or if the specified row does not exist or does not
70754: ** contain a blob or text value, then an error code is returned and the
70755: ** database handle error code and message set. If this happens, then all
70756: ** subsequent calls to sqlite3_blob_xxx() functions (except blob_close())
70757: ** immediately return SQLITE_ABORT.
70758: */
70759: SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){
70760: int rc;
70761: Incrblob *p = (Incrblob *)pBlob;
70762: sqlite3 *db;
70763:
70764: if( p==0 ) return SQLITE_MISUSE_BKPT;
70765: db = p->db;
70766: sqlite3_mutex_enter(db->mutex);
70767:
70768: if( p->pStmt==0 ){
70769: /* If there is no statement handle, then the blob-handle has
70770: ** already been invalidated. Return SQLITE_ABORT in this case.
70771: */
70772: rc = SQLITE_ABORT;
70773: }else{
70774: char *zErr;
70775: rc = blobSeekToRow(p, iRow, &zErr);
70776: if( rc!=SQLITE_OK ){
70777: sqlite3Error(db, rc, (zErr ? "%s" : 0), zErr);
70778: sqlite3DbFree(db, zErr);
70779: }
70780: assert( rc!=SQLITE_SCHEMA );
70781: }
70782:
70783: rc = sqlite3ApiExit(db, rc);
70784: assert( rc==SQLITE_OK || p->pStmt==0 );
70785: sqlite3_mutex_leave(db->mutex);
70786: return rc;
70787: }
70788:
70789: #endif /* #ifndef SQLITE_OMIT_INCRBLOB */
70790:
70791: /************** End of vdbeblob.c ********************************************/
70792: /************** Begin file vdbesort.c ****************************************/
70793: /*
70794: ** 2011 July 9
70795: **
70796: ** The author disclaims copyright to this source code. In place of
70797: ** a legal notice, here is a blessing:
70798: **
70799: ** May you do good and not evil.
70800: ** May you find forgiveness for yourself and forgive others.
70801: ** May you share freely, never taking more than you give.
70802: **
70803: *************************************************************************
70804: ** This file contains code for the VdbeSorter object, used in concert with
70805: ** a VdbeCursor to sort large numbers of keys (as may be required, for
70806: ** example, by CREATE INDEX statements on tables too large to fit in main
70807: ** memory).
70808: */
70809:
70810:
70811: #ifndef SQLITE_OMIT_MERGE_SORT
70812:
70813: typedef struct VdbeSorterIter VdbeSorterIter;
70814: typedef struct SorterRecord SorterRecord;
1.2.2.1 ! misho 70815: typedef struct FileWriter FileWriter;
1.2 misho 70816:
70817: /*
70818: ** NOTES ON DATA STRUCTURE USED FOR N-WAY MERGES:
70819: **
70820: ** As keys are added to the sorter, they are written to disk in a series
70821: ** of sorted packed-memory-arrays (PMAs). The size of each PMA is roughly
70822: ** the same as the cache-size allowed for temporary databases. In order
70823: ** to allow the caller to extract keys from the sorter in sorted order,
70824: ** all PMAs currently stored on disk must be merged together. This comment
70825: ** describes the data structure used to do so. The structure supports
70826: ** merging any number of arrays in a single pass with no redundant comparison
70827: ** operations.
70828: **
70829: ** The aIter[] array contains an iterator for each of the PMAs being merged.
70830: ** An aIter[] iterator either points to a valid key or else is at EOF. For
70831: ** the purposes of the paragraphs below, we assume that the array is actually
70832: ** N elements in size, where N is the smallest power of 2 greater to or equal
70833: ** to the number of iterators being merged. The extra aIter[] elements are
70834: ** treated as if they are empty (always at EOF).
70835: **
70836: ** The aTree[] array is also N elements in size. The value of N is stored in
70837: ** the VdbeSorter.nTree variable.
70838: **
70839: ** The final (N/2) elements of aTree[] contain the results of comparing
70840: ** pairs of iterator keys together. Element i contains the result of
70841: ** comparing aIter[2*i-N] and aIter[2*i-N+1]. Whichever key is smaller, the
70842: ** aTree element is set to the index of it.
70843: **
70844: ** For the purposes of this comparison, EOF is considered greater than any
70845: ** other key value. If the keys are equal (only possible with two EOF
70846: ** values), it doesn't matter which index is stored.
70847: **
70848: ** The (N/4) elements of aTree[] that preceed the final (N/2) described
70849: ** above contains the index of the smallest of each block of 4 iterators.
70850: ** And so on. So that aTree[1] contains the index of the iterator that
70851: ** currently points to the smallest key value. aTree[0] is unused.
70852: **
70853: ** Example:
70854: **
70855: ** aIter[0] -> Banana
70856: ** aIter[1] -> Feijoa
70857: ** aIter[2] -> Elderberry
70858: ** aIter[3] -> Currant
70859: ** aIter[4] -> Grapefruit
70860: ** aIter[5] -> Apple
70861: ** aIter[6] -> Durian
70862: ** aIter[7] -> EOF
70863: **
70864: ** aTree[] = { X, 5 0, 5 0, 3, 5, 6 }
70865: **
70866: ** The current element is "Apple" (the value of the key indicated by
70867: ** iterator 5). When the Next() operation is invoked, iterator 5 will
70868: ** be advanced to the next key in its segment. Say the next key is
70869: ** "Eggplant":
70870: **
70871: ** aIter[5] -> Eggplant
70872: **
70873: ** The contents of aTree[] are updated first by comparing the new iterator
70874: ** 5 key to the current key of iterator 4 (still "Grapefruit"). The iterator
70875: ** 5 value is still smaller, so aTree[6] is set to 5. And so on up the tree.
70876: ** The value of iterator 6 - "Durian" - is now smaller than that of iterator
70877: ** 5, so aTree[3] is set to 6. Key 0 is smaller than key 6 (Banana<Durian),
70878: ** so the value written into element 1 of the array is 0. As follows:
70879: **
70880: ** aTree[] = { X, 0 0, 6 0, 3, 5, 6 }
70881: **
70882: ** In other words, each time we advance to the next sorter element, log2(N)
70883: ** key comparison operations are required, where N is the number of segments
70884: ** being merged (rounded up to the next power of 2).
70885: */
70886: struct VdbeSorter {
1.2.2.1 ! misho 70887: i64 iWriteOff; /* Current write offset within file pTemp1 */
! 70888: i64 iReadOff; /* Current read offset within file pTemp1 */
1.2 misho 70889: int nInMemory; /* Current size of pRecord list as PMA */
70890: int nTree; /* Used size of aTree/aIter (power of 2) */
1.2.2.1 ! misho 70891: int nPMA; /* Number of PMAs stored in pTemp1 */
! 70892: int mnPmaSize; /* Minimum PMA size, in bytes */
! 70893: int mxPmaSize; /* Maximum PMA size, in bytes. 0==no limit */
1.2 misho 70894: VdbeSorterIter *aIter; /* Array of iterators to merge */
70895: int *aTree; /* Current state of incremental merge */
70896: sqlite3_file *pTemp1; /* PMA file 1 */
70897: SorterRecord *pRecord; /* Head of in-memory record list */
70898: UnpackedRecord *pUnpacked; /* Used to unpack keys */
70899: };
70900:
70901: /*
70902: ** The following type is an iterator for a PMA. It caches the current key in
70903: ** variables nKey/aKey. If the iterator is at EOF, pFile==0.
70904: */
70905: struct VdbeSorterIter {
70906: i64 iReadOff; /* Current read offset */
70907: i64 iEof; /* 1 byte past EOF for this iterator */
70908: int nAlloc; /* Bytes of space at aAlloc */
70909: int nKey; /* Number of bytes in key */
1.2.2.1 ! misho 70910: sqlite3_file *pFile; /* File iterator is reading from */
! 70911: u8 *aAlloc; /* Allocated space */
1.2 misho 70912: u8 *aKey; /* Pointer to current key */
1.2.2.1 ! misho 70913: u8 *aBuffer; /* Current read buffer */
! 70914: int nBuffer; /* Size of read buffer in bytes */
! 70915: };
! 70916:
! 70917: /*
! 70918: ** An instance of this structure is used to organize the stream of records
! 70919: ** being written to files by the merge-sort code into aligned, page-sized
! 70920: ** blocks. Doing all I/O in aligned page-sized blocks helps I/O to go
! 70921: ** faster on many operating systems.
! 70922: */
! 70923: struct FileWriter {
! 70924: int eFWErr; /* Non-zero if in an error state */
! 70925: u8 *aBuffer; /* Pointer to write buffer */
! 70926: int nBuffer; /* Size of write buffer in bytes */
! 70927: int iBufStart; /* First byte of buffer to write */
! 70928: int iBufEnd; /* Last byte of buffer to write */
! 70929: i64 iWriteOff; /* Offset of start of buffer in file */
! 70930: sqlite3_file *pFile; /* File to write to */
1.2 misho 70931: };
70932:
70933: /*
70934: ** A structure to store a single record. All in-memory records are connected
70935: ** together into a linked list headed at VdbeSorter.pRecord using the
70936: ** SorterRecord.pNext pointer.
70937: */
70938: struct SorterRecord {
70939: void *pVal;
70940: int nVal;
70941: SorterRecord *pNext;
70942: };
70943:
70944: /* Minimum allowable value for the VdbeSorter.nWorking variable */
70945: #define SORTER_MIN_WORKING 10
70946:
70947: /* Maximum number of segments to merge in a single pass. */
70948: #define SORTER_MAX_MERGE_COUNT 16
70949:
70950: /*
70951: ** Free all memory belonging to the VdbeSorterIter object passed as the second
70952: ** argument. All structure fields are set to zero before returning.
70953: */
70954: static void vdbeSorterIterZero(sqlite3 *db, VdbeSorterIter *pIter){
70955: sqlite3DbFree(db, pIter->aAlloc);
1.2.2.1 ! misho 70956: sqlite3DbFree(db, pIter->aBuffer);
1.2 misho 70957: memset(pIter, 0, sizeof(VdbeSorterIter));
70958: }
70959:
70960: /*
1.2.2.1 ! misho 70961: ** Read nByte bytes of data from the stream of data iterated by object p.
! 70962: ** If successful, set *ppOut to point to a buffer containing the data
! 70963: ** and return SQLITE_OK. Otherwise, if an error occurs, return an SQLite
! 70964: ** error code.
! 70965: **
! 70966: ** The buffer indicated by *ppOut may only be considered valid until the
! 70967: ** next call to this function.
! 70968: */
! 70969: static int vdbeSorterIterRead(
! 70970: sqlite3 *db, /* Database handle (for malloc) */
! 70971: VdbeSorterIter *p, /* Iterator */
! 70972: int nByte, /* Bytes of data to read */
! 70973: u8 **ppOut /* OUT: Pointer to buffer containing data */
! 70974: ){
! 70975: int iBuf; /* Offset within buffer to read from */
! 70976: int nAvail; /* Bytes of data available in buffer */
! 70977: assert( p->aBuffer );
! 70978:
! 70979: /* If there is no more data to be read from the buffer, read the next
! 70980: ** p->nBuffer bytes of data from the file into it. Or, if there are less
! 70981: ** than p->nBuffer bytes remaining in the PMA, read all remaining data. */
! 70982: iBuf = p->iReadOff % p->nBuffer;
! 70983: if( iBuf==0 ){
! 70984: int nRead; /* Bytes to read from disk */
! 70985: int rc; /* sqlite3OsRead() return code */
! 70986:
! 70987: /* Determine how many bytes of data to read. */
! 70988: if( (p->iEof - p->iReadOff) > (i64)p->nBuffer ){
! 70989: nRead = p->nBuffer;
! 70990: }else{
! 70991: nRead = (int)(p->iEof - p->iReadOff);
! 70992: }
! 70993: assert( nRead>0 );
! 70994:
! 70995: /* Read data from the file. Return early if an error occurs. */
! 70996: rc = sqlite3OsRead(p->pFile, p->aBuffer, nRead, p->iReadOff);
! 70997: assert( rc!=SQLITE_IOERR_SHORT_READ );
! 70998: if( rc!=SQLITE_OK ) return rc;
1.2 misho 70999: }
1.2.2.1 ! misho 71000: nAvail = p->nBuffer - iBuf;
1.2 misho 71001:
1.2.2.1 ! misho 71002: if( nByte<=nAvail ){
! 71003: /* The requested data is available in the in-memory buffer. In this
! 71004: ** case there is no need to make a copy of the data, just return a
! 71005: ** pointer into the buffer to the caller. */
! 71006: *ppOut = &p->aBuffer[iBuf];
! 71007: p->iReadOff += nByte;
! 71008: }else{
! 71009: /* The requested data is not all available in the in-memory buffer.
! 71010: ** In this case, allocate space at p->aAlloc[] to copy the requested
! 71011: ** range into. Then return a copy of pointer p->aAlloc to the caller. */
! 71012: int nRem; /* Bytes remaining to copy */
! 71013:
! 71014: /* Extend the p->aAlloc[] allocation if required. */
! 71015: if( p->nAlloc<nByte ){
! 71016: int nNew = p->nAlloc*2;
! 71017: while( nByte>nNew ) nNew = nNew*2;
! 71018: p->aAlloc = sqlite3DbReallocOrFree(db, p->aAlloc, nNew);
! 71019: if( !p->aAlloc ) return SQLITE_NOMEM;
! 71020: p->nAlloc = nNew;
! 71021: }
! 71022:
! 71023: /* Copy as much data as is available in the buffer into the start of
! 71024: ** p->aAlloc[]. */
! 71025: memcpy(p->aAlloc, &p->aBuffer[iBuf], nAvail);
! 71026: p->iReadOff += nAvail;
! 71027: nRem = nByte - nAvail;
! 71028:
! 71029: /* The following loop copies up to p->nBuffer bytes per iteration into
! 71030: ** the p->aAlloc[] buffer. */
! 71031: while( nRem>0 ){
! 71032: int rc; /* vdbeSorterIterRead() return code */
! 71033: int nCopy; /* Number of bytes to copy */
! 71034: u8 *aNext; /* Pointer to buffer to copy data from */
! 71035:
! 71036: nCopy = nRem;
! 71037: if( nRem>p->nBuffer ) nCopy = p->nBuffer;
! 71038: rc = vdbeSorterIterRead(db, p, nCopy, &aNext);
! 71039: if( rc!=SQLITE_OK ) return rc;
! 71040: assert( aNext!=p->aAlloc );
! 71041: memcpy(&p->aAlloc[nByte - nRem], aNext, nCopy);
! 71042: nRem -= nCopy;
1.2 misho 71043: }
1.2.2.1 ! misho 71044:
! 71045: *ppOut = p->aAlloc;
1.2 misho 71046: }
71047:
1.2.2.1 ! misho 71048: return SQLITE_OK;
1.2 misho 71049: }
71050:
71051: /*
1.2.2.1 ! misho 71052: ** Read a varint from the stream of data accessed by p. Set *pnOut to
! 71053: ** the value read.
1.2 misho 71054: */
1.2.2.1 ! misho 71055: static int vdbeSorterIterVarint(sqlite3 *db, VdbeSorterIter *p, u64 *pnOut){
! 71056: int iBuf;
1.2 misho 71057:
1.2.2.1 ! misho 71058: iBuf = p->iReadOff % p->nBuffer;
! 71059: if( iBuf && (p->nBuffer-iBuf)>=9 ){
! 71060: p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut);
! 71061: }else{
! 71062: u8 aVarint[16], *a;
! 71063: int i = 0, rc;
! 71064: do{
! 71065: rc = vdbeSorterIterRead(db, p, 1, &a);
! 71066: if( rc ) return rc;
! 71067: aVarint[(i++)&0xf] = a[0];
! 71068: }while( (a[0]&0x80)!=0 );
! 71069: sqlite3GetVarint(aVarint, pnOut);
! 71070: }
1.2 misho 71071:
1.2.2.1 ! misho 71072: return SQLITE_OK;
1.2 misho 71073: }
71074:
1.2.2.1 ! misho 71075:
1.2 misho 71076: /*
1.2.2.1 ! misho 71077: ** Advance iterator pIter to the next key in its PMA. Return SQLITE_OK if
! 71078: ** no error occurs, or an SQLite error code if one does.
1.2 misho 71079: */
1.2.2.1 ! misho 71080: static int vdbeSorterIterNext(
! 71081: sqlite3 *db, /* Database handle (for sqlite3DbMalloc() ) */
! 71082: VdbeSorterIter *pIter /* Iterator to advance */
1.2 misho 71083: ){
1.2.2.1 ! misho 71084: int rc; /* Return Code */
! 71085: u64 nRec = 0; /* Size of record in bytes */
! 71086:
! 71087: if( pIter->iReadOff>=pIter->iEof ){
! 71088: /* This is an EOF condition */
! 71089: vdbeSorterIterZero(db, pIter);
! 71090: return SQLITE_OK;
! 71091: }
1.2 misho 71092:
1.2.2.1 ! misho 71093: rc = vdbeSorterIterVarint(db, pIter, &nRec);
1.2 misho 71094: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 71095: pIter->nKey = (int)nRec;
! 71096: rc = vdbeSorterIterRead(db, pIter, (int)nRec, &pIter->aKey);
1.2 misho 71097: }
71098:
71099: return rc;
71100: }
71101:
71102: /*
71103: ** Initialize iterator pIter to scan through the PMA stored in file pFile
71104: ** starting at offset iStart and ending at offset iEof-1. This function
71105: ** leaves the iterator pointing to the first key in the PMA (or EOF if the
71106: ** PMA is empty).
71107: */
71108: static int vdbeSorterIterInit(
71109: sqlite3 *db, /* Database handle */
1.2.2.1 ! misho 71110: const VdbeSorter *pSorter, /* Sorter object */
1.2 misho 71111: i64 iStart, /* Start offset in pFile */
71112: VdbeSorterIter *pIter, /* Iterator to populate */
71113: i64 *pnByte /* IN/OUT: Increment this value by PMA size */
71114: ){
1.2.2.1 ! misho 71115: int rc = SQLITE_OK;
! 71116: int nBuf;
! 71117:
! 71118: nBuf = sqlite3BtreeGetPageSize(db->aDb[0].pBt);
1.2 misho 71119:
71120: assert( pSorter->iWriteOff>iStart );
71121: assert( pIter->aAlloc==0 );
1.2.2.1 ! misho 71122: assert( pIter->aBuffer==0 );
1.2 misho 71123: pIter->pFile = pSorter->pTemp1;
71124: pIter->iReadOff = iStart;
71125: pIter->nAlloc = 128;
71126: pIter->aAlloc = (u8 *)sqlite3DbMallocRaw(db, pIter->nAlloc);
1.2.2.1 ! misho 71127: pIter->nBuffer = nBuf;
! 71128: pIter->aBuffer = (u8 *)sqlite3DbMallocRaw(db, nBuf);
! 71129:
! 71130: if( !pIter->aBuffer ){
1.2 misho 71131: rc = SQLITE_NOMEM;
71132: }else{
1.2.2.1 ! misho 71133: int iBuf;
! 71134:
! 71135: iBuf = iStart % nBuf;
! 71136: if( iBuf ){
! 71137: int nRead = nBuf - iBuf;
! 71138: if( (iStart + nRead) > pSorter->iWriteOff ){
! 71139: nRead = (int)(pSorter->iWriteOff - iStart);
! 71140: }
! 71141: rc = sqlite3OsRead(
! 71142: pSorter->pTemp1, &pIter->aBuffer[iBuf], nRead, iStart
! 71143: );
! 71144: assert( rc!=SQLITE_IOERR_SHORT_READ );
! 71145: }
! 71146:
! 71147: if( rc==SQLITE_OK ){
! 71148: u64 nByte; /* Size of PMA in bytes */
! 71149: pIter->iEof = pSorter->iWriteOff;
! 71150: rc = vdbeSorterIterVarint(db, pIter, &nByte);
! 71151: pIter->iEof = pIter->iReadOff + nByte;
! 71152: *pnByte += nByte;
! 71153: }
1.2 misho 71154: }
1.2.2.1 ! misho 71155:
1.2 misho 71156: if( rc==SQLITE_OK ){
71157: rc = vdbeSorterIterNext(db, pIter);
71158: }
71159: return rc;
71160: }
71161:
71162:
71163: /*
71164: ** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2,
71165: ** size nKey2 bytes). Argument pKeyInfo supplies the collation functions
71166: ** used by the comparison. If an error occurs, return an SQLite error code.
71167: ** Otherwise, return SQLITE_OK and set *pRes to a negative, zero or positive
71168: ** value, depending on whether key1 is smaller, equal to or larger than key2.
71169: **
71170: ** If the bOmitRowid argument is non-zero, assume both keys end in a rowid
71171: ** field. For the purposes of the comparison, ignore it. Also, if bOmitRowid
71172: ** is true and key1 contains even a single NULL value, it is considered to
71173: ** be less than key2. Even if key2 also contains NULL values.
71174: **
71175: ** If pKey2 is passed a NULL pointer, then it is assumed that the pCsr->aSpace
71176: ** has been allocated and contains an unpacked record that is used as key2.
71177: */
71178: static void vdbeSorterCompare(
1.2.2.1 ! misho 71179: const VdbeCursor *pCsr, /* Cursor object (for pKeyInfo) */
1.2 misho 71180: int bOmitRowid, /* Ignore rowid field at end of keys */
1.2.2.1 ! misho 71181: const void *pKey1, int nKey1, /* Left side of comparison */
! 71182: const void *pKey2, int nKey2, /* Right side of comparison */
1.2 misho 71183: int *pRes /* OUT: Result of comparison */
71184: ){
71185: KeyInfo *pKeyInfo = pCsr->pKeyInfo;
71186: VdbeSorter *pSorter = pCsr->pSorter;
71187: UnpackedRecord *r2 = pSorter->pUnpacked;
71188: int i;
71189:
71190: if( pKey2 ){
71191: sqlite3VdbeRecordUnpack(pKeyInfo, nKey2, pKey2, r2);
71192: }
71193:
71194: if( bOmitRowid ){
71195: r2->nField = pKeyInfo->nField;
71196: assert( r2->nField>0 );
71197: for(i=0; i<r2->nField; i++){
71198: if( r2->aMem[i].flags & MEM_Null ){
71199: *pRes = -1;
71200: return;
71201: }
71202: }
71203: r2->flags |= UNPACKED_PREFIX_MATCH;
71204: }
71205:
71206: *pRes = sqlite3VdbeRecordCompare(nKey1, pKey1, r2);
71207: }
71208:
71209: /*
71210: ** This function is called to compare two iterator keys when merging
71211: ** multiple b-tree segments. Parameter iOut is the index of the aTree[]
71212: ** value to recalculate.
71213: */
1.2.2.1 ! misho 71214: static int vdbeSorterDoCompare(const VdbeCursor *pCsr, int iOut){
1.2 misho 71215: VdbeSorter *pSorter = pCsr->pSorter;
71216: int i1;
71217: int i2;
71218: int iRes;
71219: VdbeSorterIter *p1;
71220: VdbeSorterIter *p2;
71221:
71222: assert( iOut<pSorter->nTree && iOut>0 );
71223:
71224: if( iOut>=(pSorter->nTree/2) ){
71225: i1 = (iOut - pSorter->nTree/2) * 2;
71226: i2 = i1 + 1;
71227: }else{
71228: i1 = pSorter->aTree[iOut*2];
71229: i2 = pSorter->aTree[iOut*2+1];
71230: }
71231:
71232: p1 = &pSorter->aIter[i1];
71233: p2 = &pSorter->aIter[i2];
71234:
71235: if( p1->pFile==0 ){
71236: iRes = i2;
71237: }else if( p2->pFile==0 ){
71238: iRes = i1;
71239: }else{
71240: int res;
71241: assert( pCsr->pSorter->pUnpacked!=0 ); /* allocated in vdbeSorterMerge() */
71242: vdbeSorterCompare(
71243: pCsr, 0, p1->aKey, p1->nKey, p2->aKey, p2->nKey, &res
71244: );
71245: if( res<=0 ){
71246: iRes = i1;
71247: }else{
71248: iRes = i2;
71249: }
71250: }
71251:
71252: pSorter->aTree[iOut] = iRes;
71253: return SQLITE_OK;
71254: }
71255:
71256: /*
71257: ** Initialize the temporary index cursor just opened as a sorter cursor.
71258: */
71259: SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *db, VdbeCursor *pCsr){
71260: int pgsz; /* Page size of main database */
71261: int mxCache; /* Cache size */
71262: VdbeSorter *pSorter; /* The new sorter */
71263: char *d; /* Dummy */
71264:
71265: assert( pCsr->pKeyInfo && pCsr->pBt==0 );
71266: pCsr->pSorter = pSorter = sqlite3DbMallocZero(db, sizeof(VdbeSorter));
71267: if( pSorter==0 ){
71268: return SQLITE_NOMEM;
71269: }
71270:
71271: pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pCsr->pKeyInfo, 0, 0, &d);
71272: if( pSorter->pUnpacked==0 ) return SQLITE_NOMEM;
71273: assert( pSorter->pUnpacked==(UnpackedRecord *)d );
71274:
71275: if( !sqlite3TempInMemory(db) ){
71276: pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt);
71277: pSorter->mnPmaSize = SORTER_MIN_WORKING * pgsz;
71278: mxCache = db->aDb[0].pSchema->cache_size;
71279: if( mxCache<SORTER_MIN_WORKING ) mxCache = SORTER_MIN_WORKING;
71280: pSorter->mxPmaSize = mxCache * pgsz;
71281: }
71282:
71283: return SQLITE_OK;
71284: }
71285:
71286: /*
71287: ** Free the list of sorted records starting at pRecord.
71288: */
71289: static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){
71290: SorterRecord *p;
71291: SorterRecord *pNext;
71292: for(p=pRecord; p; p=pNext){
71293: pNext = p->pNext;
71294: sqlite3DbFree(db, p);
71295: }
71296: }
71297:
71298: /*
71299: ** Free any cursor components allocated by sqlite3VdbeSorterXXX routines.
71300: */
71301: SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){
71302: VdbeSorter *pSorter = pCsr->pSorter;
71303: if( pSorter ){
71304: if( pSorter->aIter ){
71305: int i;
71306: for(i=0; i<pSorter->nTree; i++){
71307: vdbeSorterIterZero(db, &pSorter->aIter[i]);
71308: }
71309: sqlite3DbFree(db, pSorter->aIter);
71310: }
71311: if( pSorter->pTemp1 ){
71312: sqlite3OsCloseFree(pSorter->pTemp1);
71313: }
71314: vdbeSorterRecordFree(db, pSorter->pRecord);
71315: sqlite3DbFree(db, pSorter->pUnpacked);
71316: sqlite3DbFree(db, pSorter);
71317: pCsr->pSorter = 0;
71318: }
71319: }
71320:
71321: /*
71322: ** Allocate space for a file-handle and open a temporary file. If successful,
71323: ** set *ppFile to point to the malloc'd file-handle and return SQLITE_OK.
71324: ** Otherwise, set *ppFile to 0 and return an SQLite error code.
71325: */
71326: static int vdbeSorterOpenTempFile(sqlite3 *db, sqlite3_file **ppFile){
71327: int dummy;
71328: return sqlite3OsOpenMalloc(db->pVfs, 0, ppFile,
71329: SQLITE_OPEN_TEMP_JOURNAL |
71330: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
71331: SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE, &dummy
71332: );
71333: }
71334:
71335: /*
71336: ** Merge the two sorted lists p1 and p2 into a single list.
71337: ** Set *ppOut to the head of the new list.
71338: */
71339: static void vdbeSorterMerge(
1.2.2.1 ! misho 71340: const VdbeCursor *pCsr, /* For pKeyInfo */
1.2 misho 71341: SorterRecord *p1, /* First list to merge */
71342: SorterRecord *p2, /* Second list to merge */
71343: SorterRecord **ppOut /* OUT: Head of merged list */
71344: ){
71345: SorterRecord *pFinal = 0;
71346: SorterRecord **pp = &pFinal;
71347: void *pVal2 = p2 ? p2->pVal : 0;
71348:
71349: while( p1 && p2 ){
71350: int res;
71351: vdbeSorterCompare(pCsr, 0, p1->pVal, p1->nVal, pVal2, p2->nVal, &res);
71352: if( res<=0 ){
71353: *pp = p1;
71354: pp = &p1->pNext;
71355: p1 = p1->pNext;
71356: pVal2 = 0;
71357: }else{
71358: *pp = p2;
71359: pp = &p2->pNext;
71360: p2 = p2->pNext;
71361: if( p2==0 ) break;
71362: pVal2 = p2->pVal;
71363: }
71364: }
71365: *pp = p1 ? p1 : p2;
71366: *ppOut = pFinal;
71367: }
71368:
71369: /*
71370: ** Sort the linked list of records headed at pCsr->pRecord. Return SQLITE_OK
71371: ** if successful, or an SQLite error code (i.e. SQLITE_NOMEM) if an error
71372: ** occurs.
71373: */
1.2.2.1 ! misho 71374: static int vdbeSorterSort(const VdbeCursor *pCsr){
1.2 misho 71375: int i;
71376: SorterRecord **aSlot;
71377: SorterRecord *p;
71378: VdbeSorter *pSorter = pCsr->pSorter;
71379:
71380: aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *));
71381: if( !aSlot ){
71382: return SQLITE_NOMEM;
71383: }
71384:
71385: p = pSorter->pRecord;
71386: while( p ){
71387: SorterRecord *pNext = p->pNext;
71388: p->pNext = 0;
71389: for(i=0; aSlot[i]; i++){
71390: vdbeSorterMerge(pCsr, p, aSlot[i], &p);
71391: aSlot[i] = 0;
71392: }
71393: aSlot[i] = p;
71394: p = pNext;
71395: }
71396:
1.2.2.1 ! misho 71397: p = 0;
! 71398: for(i=0; i<64; i++){
! 71399: vdbeSorterMerge(pCsr, p, aSlot[i], &p);
! 71400: }
! 71401: pSorter->pRecord = p;
! 71402:
! 71403: sqlite3_free(aSlot);
! 71404: return SQLITE_OK;
! 71405: }
! 71406:
! 71407: /*
! 71408: ** Initialize a file-writer object.
! 71409: */
! 71410: static void fileWriterInit(
! 71411: sqlite3 *db, /* Database (for malloc) */
! 71412: sqlite3_file *pFile, /* File to write to */
! 71413: FileWriter *p, /* Object to populate */
! 71414: i64 iStart /* Offset of pFile to begin writing at */
! 71415: ){
! 71416: int nBuf = sqlite3BtreeGetPageSize(db->aDb[0].pBt);
! 71417:
! 71418: memset(p, 0, sizeof(FileWriter));
! 71419: p->aBuffer = (u8 *)sqlite3DbMallocRaw(db, nBuf);
! 71420: if( !p->aBuffer ){
! 71421: p->eFWErr = SQLITE_NOMEM;
! 71422: }else{
! 71423: p->iBufEnd = p->iBufStart = (iStart % nBuf);
! 71424: p->iWriteOff = iStart - p->iBufStart;
! 71425: p->nBuffer = nBuf;
! 71426: p->pFile = pFile;
! 71427: }
! 71428: }
! 71429:
! 71430: /*
! 71431: ** Write nData bytes of data to the file-write object. Return SQLITE_OK
! 71432: ** if successful, or an SQLite error code if an error occurs.
! 71433: */
! 71434: static void fileWriterWrite(FileWriter *p, u8 *pData, int nData){
! 71435: int nRem = nData;
! 71436: while( nRem>0 && p->eFWErr==0 ){
! 71437: int nCopy = nRem;
! 71438: if( nCopy>(p->nBuffer - p->iBufEnd) ){
! 71439: nCopy = p->nBuffer - p->iBufEnd;
! 71440: }
! 71441:
! 71442: memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy);
! 71443: p->iBufEnd += nCopy;
! 71444: if( p->iBufEnd==p->nBuffer ){
! 71445: p->eFWErr = sqlite3OsWrite(p->pFile,
! 71446: &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart,
! 71447: p->iWriteOff + p->iBufStart
! 71448: );
! 71449: p->iBufStart = p->iBufEnd = 0;
! 71450: p->iWriteOff += p->nBuffer;
! 71451: }
! 71452: assert( p->iBufEnd<p->nBuffer );
! 71453:
! 71454: nRem -= nCopy;
1.2 misho 71455: }
1.2.2.1 ! misho 71456: }
1.2 misho 71457:
1.2.2.1 ! misho 71458: /*
! 71459: ** Flush any buffered data to disk and clean up the file-writer object.
! 71460: ** The results of using the file-writer after this call are undefined.
! 71461: ** Return SQLITE_OK if flushing the buffered data succeeds or is not
! 71462: ** required. Otherwise, return an SQLite error code.
! 71463: **
! 71464: ** Before returning, set *piEof to the offset immediately following the
! 71465: ** last byte written to the file.
! 71466: */
! 71467: static int fileWriterFinish(sqlite3 *db, FileWriter *p, i64 *piEof){
! 71468: int rc;
! 71469: if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){
! 71470: p->eFWErr = sqlite3OsWrite(p->pFile,
! 71471: &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart,
! 71472: p->iWriteOff + p->iBufStart
! 71473: );
! 71474: }
! 71475: *piEof = (p->iWriteOff + p->iBufEnd);
! 71476: sqlite3DbFree(db, p->aBuffer);
! 71477: rc = p->eFWErr;
! 71478: memset(p, 0, sizeof(FileWriter));
! 71479: return rc;
1.2 misho 71480: }
71481:
1.2.2.1 ! misho 71482: /*
! 71483: ** Write value iVal encoded as a varint to the file-write object. Return
! 71484: ** SQLITE_OK if successful, or an SQLite error code if an error occurs.
! 71485: */
! 71486: static void fileWriterWriteVarint(FileWriter *p, u64 iVal){
! 71487: int nByte;
! 71488: u8 aByte[10];
! 71489: nByte = sqlite3PutVarint(aByte, iVal);
! 71490: fileWriterWrite(p, aByte, nByte);
! 71491: }
1.2 misho 71492:
71493: /*
71494: ** Write the current contents of the in-memory linked-list to a PMA. Return
71495: ** SQLITE_OK if successful, or an SQLite error code otherwise.
71496: **
71497: ** The format of a PMA is:
71498: **
71499: ** * A varint. This varint contains the total number of bytes of content
71500: ** in the PMA (not including the varint itself).
71501: **
71502: ** * One or more records packed end-to-end in order of ascending keys.
71503: ** Each record consists of a varint followed by a blob of data (the
71504: ** key). The varint is the number of bytes in the blob of data.
71505: */
1.2.2.1 ! misho 71506: static int vdbeSorterListToPMA(sqlite3 *db, const VdbeCursor *pCsr){
1.2 misho 71507: int rc = SQLITE_OK; /* Return code */
71508: VdbeSorter *pSorter = pCsr->pSorter;
1.2.2.1 ! misho 71509: FileWriter writer;
! 71510:
! 71511: memset(&writer, 0, sizeof(FileWriter));
1.2 misho 71512:
71513: if( pSorter->nInMemory==0 ){
71514: assert( pSorter->pRecord==0 );
71515: return rc;
71516: }
71517:
71518: rc = vdbeSorterSort(pCsr);
71519:
71520: /* If the first temporary PMA file has not been opened, open it now. */
71521: if( rc==SQLITE_OK && pSorter->pTemp1==0 ){
71522: rc = vdbeSorterOpenTempFile(db, &pSorter->pTemp1);
71523: assert( rc!=SQLITE_OK || pSorter->pTemp1 );
71524: assert( pSorter->iWriteOff==0 );
71525: assert( pSorter->nPMA==0 );
71526: }
71527:
71528: if( rc==SQLITE_OK ){
71529: SorterRecord *p;
71530: SorterRecord *pNext = 0;
71531:
1.2.2.1 ! misho 71532: fileWriterInit(db, pSorter->pTemp1, &writer, pSorter->iWriteOff);
1.2 misho 71533: pSorter->nPMA++;
1.2.2.1 ! misho 71534: fileWriterWriteVarint(&writer, pSorter->nInMemory);
! 71535: for(p=pSorter->pRecord; p; p=pNext){
1.2 misho 71536: pNext = p->pNext;
1.2.2.1 ! misho 71537: fileWriterWriteVarint(&writer, p->nVal);
! 71538: fileWriterWrite(&writer, p->pVal, p->nVal);
1.2 misho 71539: sqlite3DbFree(db, p);
71540: }
71541: pSorter->pRecord = p;
1.2.2.1 ! misho 71542: rc = fileWriterFinish(db, &writer, &pSorter->iWriteOff);
1.2 misho 71543: }
71544:
71545: return rc;
71546: }
71547:
71548: /*
71549: ** Add a record to the sorter.
71550: */
71551: SQLITE_PRIVATE int sqlite3VdbeSorterWrite(
71552: sqlite3 *db, /* Database handle */
1.2.2.1 ! misho 71553: const VdbeCursor *pCsr, /* Sorter cursor */
1.2 misho 71554: Mem *pVal /* Memory cell containing record */
71555: ){
71556: VdbeSorter *pSorter = pCsr->pSorter;
71557: int rc = SQLITE_OK; /* Return Code */
71558: SorterRecord *pNew; /* New list element */
71559:
71560: assert( pSorter );
71561: pSorter->nInMemory += sqlite3VarintLen(pVal->n) + pVal->n;
71562:
71563: pNew = (SorterRecord *)sqlite3DbMallocRaw(db, pVal->n + sizeof(SorterRecord));
71564: if( pNew==0 ){
71565: rc = SQLITE_NOMEM;
71566: }else{
71567: pNew->pVal = (void *)&pNew[1];
71568: memcpy(pNew->pVal, pVal->z, pVal->n);
71569: pNew->nVal = pVal->n;
71570: pNew->pNext = pSorter->pRecord;
71571: pSorter->pRecord = pNew;
71572: }
71573:
71574: /* See if the contents of the sorter should now be written out. They
71575: ** are written out when either of the following are true:
71576: **
71577: ** * The total memory allocated for the in-memory list is greater
71578: ** than (page-size * cache-size), or
71579: **
71580: ** * The total memory allocated for the in-memory list is greater
71581: ** than (page-size * 10) and sqlite3HeapNearlyFull() returns true.
71582: */
71583: if( rc==SQLITE_OK && pSorter->mxPmaSize>0 && (
71584: (pSorter->nInMemory>pSorter->mxPmaSize)
71585: || (pSorter->nInMemory>pSorter->mnPmaSize && sqlite3HeapNearlyFull())
71586: )){
1.2.2.1 ! misho 71587: #ifdef SQLITE_DEBUG
! 71588: i64 nExpect = pSorter->iWriteOff
! 71589: + sqlite3VarintLen(pSorter->nInMemory)
! 71590: + pSorter->nInMemory;
! 71591: #endif
1.2 misho 71592: rc = vdbeSorterListToPMA(db, pCsr);
71593: pSorter->nInMemory = 0;
1.2.2.1 ! misho 71594: assert( rc!=SQLITE_OK || (nExpect==pSorter->iWriteOff) );
1.2 misho 71595: }
71596:
71597: return rc;
71598: }
71599:
71600: /*
71601: ** Helper function for sqlite3VdbeSorterRewind().
71602: */
71603: static int vdbeSorterInitMerge(
71604: sqlite3 *db, /* Database handle */
1.2.2.1 ! misho 71605: const VdbeCursor *pCsr, /* Cursor handle for this sorter */
1.2 misho 71606: i64 *pnByte /* Sum of bytes in all opened PMAs */
71607: ){
71608: VdbeSorter *pSorter = pCsr->pSorter;
71609: int rc = SQLITE_OK; /* Return code */
71610: int i; /* Used to iterator through aIter[] */
71611: i64 nByte = 0; /* Total bytes in all opened PMAs */
71612:
71613: /* Initialize the iterators. */
71614: for(i=0; i<SORTER_MAX_MERGE_COUNT; i++){
71615: VdbeSorterIter *pIter = &pSorter->aIter[i];
71616: rc = vdbeSorterIterInit(db, pSorter, pSorter->iReadOff, pIter, &nByte);
71617: pSorter->iReadOff = pIter->iEof;
71618: assert( rc!=SQLITE_OK || pSorter->iReadOff<=pSorter->iWriteOff );
71619: if( rc!=SQLITE_OK || pSorter->iReadOff>=pSorter->iWriteOff ) break;
71620: }
71621:
71622: /* Initialize the aTree[] array. */
71623: for(i=pSorter->nTree-1; rc==SQLITE_OK && i>0; i--){
71624: rc = vdbeSorterDoCompare(pCsr, i);
71625: }
71626:
71627: *pnByte = nByte;
71628: return rc;
71629: }
71630:
71631: /*
71632: ** Once the sorter has been populated, this function is called to prepare
71633: ** for iterating through its contents in sorted order.
71634: */
1.2.2.1 ! misho 71635: SQLITE_PRIVATE int sqlite3VdbeSorterRewind(sqlite3 *db, const VdbeCursor *pCsr, int *pbEof){
1.2 misho 71636: VdbeSorter *pSorter = pCsr->pSorter;
71637: int rc; /* Return code */
71638: sqlite3_file *pTemp2 = 0; /* Second temp file to use */
71639: i64 iWrite2 = 0; /* Write offset for pTemp2 */
71640: int nIter; /* Number of iterators used */
71641: int nByte; /* Bytes of space required for aIter/aTree */
71642: int N = 2; /* Power of 2 >= nIter */
71643:
71644: assert( pSorter );
71645:
71646: /* If no data has been written to disk, then do not do so now. Instead,
71647: ** sort the VdbeSorter.pRecord list. The vdbe layer will read data directly
71648: ** from the in-memory list. */
71649: if( pSorter->nPMA==0 ){
71650: *pbEof = !pSorter->pRecord;
71651: assert( pSorter->aTree==0 );
71652: return vdbeSorterSort(pCsr);
71653: }
71654:
1.2.2.1 ! misho 71655: /* Write the current in-memory list to a PMA. */
1.2 misho 71656: rc = vdbeSorterListToPMA(db, pCsr);
71657: if( rc!=SQLITE_OK ) return rc;
71658:
71659: /* Allocate space for aIter[] and aTree[]. */
71660: nIter = pSorter->nPMA;
71661: if( nIter>SORTER_MAX_MERGE_COUNT ) nIter = SORTER_MAX_MERGE_COUNT;
71662: assert( nIter>0 );
71663: while( N<nIter ) N += N;
71664: nByte = N * (sizeof(int) + sizeof(VdbeSorterIter));
71665: pSorter->aIter = (VdbeSorterIter *)sqlite3DbMallocZero(db, nByte);
71666: if( !pSorter->aIter ) return SQLITE_NOMEM;
71667: pSorter->aTree = (int *)&pSorter->aIter[N];
71668: pSorter->nTree = N;
71669:
71670: do {
71671: int iNew; /* Index of new, merged, PMA */
71672:
71673: for(iNew=0;
71674: rc==SQLITE_OK && iNew*SORTER_MAX_MERGE_COUNT<pSorter->nPMA;
71675: iNew++
71676: ){
1.2.2.1 ! misho 71677: int rc2; /* Return code from fileWriterFinish() */
! 71678: FileWriter writer; /* Object used to write to disk */
1.2 misho 71679: i64 nWrite; /* Number of bytes in new PMA */
71680:
1.2.2.1 ! misho 71681: memset(&writer, 0, sizeof(FileWriter));
! 71682:
1.2 misho 71683: /* If there are SORTER_MAX_MERGE_COUNT or less PMAs in file pTemp1,
71684: ** initialize an iterator for each of them and break out of the loop.
71685: ** These iterators will be incrementally merged as the VDBE layer calls
71686: ** sqlite3VdbeSorterNext().
71687: **
71688: ** Otherwise, if pTemp1 contains more than SORTER_MAX_MERGE_COUNT PMAs,
71689: ** initialize interators for SORTER_MAX_MERGE_COUNT of them. These PMAs
71690: ** are merged into a single PMA that is written to file pTemp2.
71691: */
71692: rc = vdbeSorterInitMerge(db, pCsr, &nWrite);
71693: assert( rc!=SQLITE_OK || pSorter->aIter[ pSorter->aTree[1] ].pFile );
71694: if( rc!=SQLITE_OK || pSorter->nPMA<=SORTER_MAX_MERGE_COUNT ){
71695: break;
71696: }
71697:
71698: /* Open the second temp file, if it is not already open. */
71699: if( pTemp2==0 ){
71700: assert( iWrite2==0 );
71701: rc = vdbeSorterOpenTempFile(db, &pTemp2);
71702: }
71703:
71704: if( rc==SQLITE_OK ){
71705: int bEof = 0;
1.2.2.1 ! misho 71706: fileWriterInit(db, pTemp2, &writer, iWrite2);
! 71707: fileWriterWriteVarint(&writer, nWrite);
1.2 misho 71708: while( rc==SQLITE_OK && bEof==0 ){
71709: VdbeSorterIter *pIter = &pSorter->aIter[ pSorter->aTree[1] ];
71710: assert( pIter->pFile );
1.2.2.1 ! misho 71711:
! 71712: fileWriterWriteVarint(&writer, pIter->nKey);
! 71713: fileWriterWrite(&writer, pIter->aKey, pIter->nKey);
! 71714: rc = sqlite3VdbeSorterNext(db, pCsr, &bEof);
1.2 misho 71715: }
1.2.2.1 ! misho 71716: rc2 = fileWriterFinish(db, &writer, &iWrite2);
! 71717: if( rc==SQLITE_OK ) rc = rc2;
1.2 misho 71718: }
71719: }
71720:
71721: if( pSorter->nPMA<=SORTER_MAX_MERGE_COUNT ){
71722: break;
71723: }else{
71724: sqlite3_file *pTmp = pSorter->pTemp1;
71725: pSorter->nPMA = iNew;
71726: pSorter->pTemp1 = pTemp2;
71727: pTemp2 = pTmp;
71728: pSorter->iWriteOff = iWrite2;
71729: pSorter->iReadOff = 0;
71730: iWrite2 = 0;
71731: }
71732: }while( rc==SQLITE_OK );
71733:
71734: if( pTemp2 ){
71735: sqlite3OsCloseFree(pTemp2);
71736: }
71737: *pbEof = (pSorter->aIter[pSorter->aTree[1]].pFile==0);
71738: return rc;
71739: }
71740:
71741: /*
71742: ** Advance to the next element in the sorter.
71743: */
1.2.2.1 ! misho 71744: SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr, int *pbEof){
1.2 misho 71745: VdbeSorter *pSorter = pCsr->pSorter;
71746: int rc; /* Return code */
71747:
71748: if( pSorter->aTree ){
71749: int iPrev = pSorter->aTree[1];/* Index of iterator to advance */
71750: int i; /* Index of aTree[] to recalculate */
71751:
71752: rc = vdbeSorterIterNext(db, &pSorter->aIter[iPrev]);
71753: for(i=(pSorter->nTree+iPrev)/2; rc==SQLITE_OK && i>0; i=i/2){
71754: rc = vdbeSorterDoCompare(pCsr, i);
71755: }
71756:
71757: *pbEof = (pSorter->aIter[pSorter->aTree[1]].pFile==0);
71758: }else{
71759: SorterRecord *pFree = pSorter->pRecord;
71760: pSorter->pRecord = pFree->pNext;
71761: pFree->pNext = 0;
71762: vdbeSorterRecordFree(db, pFree);
71763: *pbEof = !pSorter->pRecord;
71764: rc = SQLITE_OK;
71765: }
71766: return rc;
71767: }
71768:
71769: /*
71770: ** Return a pointer to a buffer owned by the sorter that contains the
71771: ** current key.
71772: */
71773: static void *vdbeSorterRowkey(
1.2.2.1 ! misho 71774: const VdbeSorter *pSorter, /* Sorter object */
1.2 misho 71775: int *pnKey /* OUT: Size of current key in bytes */
71776: ){
71777: void *pKey;
71778: if( pSorter->aTree ){
71779: VdbeSorterIter *pIter;
71780: pIter = &pSorter->aIter[ pSorter->aTree[1] ];
71781: *pnKey = pIter->nKey;
71782: pKey = pIter->aKey;
71783: }else{
71784: *pnKey = pSorter->pRecord->nVal;
71785: pKey = pSorter->pRecord->pVal;
71786: }
71787: return pKey;
71788: }
71789:
71790: /*
71791: ** Copy the current sorter key into the memory cell pOut.
71792: */
1.2.2.1 ! misho 71793: SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){
1.2 misho 71794: VdbeSorter *pSorter = pCsr->pSorter;
71795: void *pKey; int nKey; /* Sorter key to copy into pOut */
71796:
71797: pKey = vdbeSorterRowkey(pSorter, &nKey);
71798: if( sqlite3VdbeMemGrow(pOut, nKey, 0) ){
71799: return SQLITE_NOMEM;
71800: }
71801: pOut->n = nKey;
71802: MemSetTypeFlag(pOut, MEM_Blob);
71803: memcpy(pOut->z, pKey, nKey);
71804:
71805: return SQLITE_OK;
71806: }
71807:
71808: /*
71809: ** Compare the key in memory cell pVal with the key that the sorter cursor
71810: ** passed as the first argument currently points to. For the purposes of
71811: ** the comparison, ignore the rowid field at the end of each record.
71812: **
71813: ** If an error occurs, return an SQLite error code (i.e. SQLITE_NOMEM).
71814: ** Otherwise, set *pRes to a negative, zero or positive value if the
71815: ** key in pVal is smaller than, equal to or larger than the current sorter
71816: ** key.
71817: */
71818: SQLITE_PRIVATE int sqlite3VdbeSorterCompare(
1.2.2.1 ! misho 71819: const VdbeCursor *pCsr, /* Sorter cursor */
1.2 misho 71820: Mem *pVal, /* Value to compare to current sorter key */
71821: int *pRes /* OUT: Result of comparison */
71822: ){
71823: VdbeSorter *pSorter = pCsr->pSorter;
71824: void *pKey; int nKey; /* Sorter key to compare pVal with */
71825:
71826: pKey = vdbeSorterRowkey(pSorter, &nKey);
71827: vdbeSorterCompare(pCsr, 1, pVal->z, pVal->n, pKey, nKey, pRes);
71828: return SQLITE_OK;
71829: }
71830:
71831: #endif /* #ifndef SQLITE_OMIT_MERGE_SORT */
71832:
71833: /************** End of vdbesort.c ********************************************/
71834: /************** Begin file journal.c *****************************************/
71835: /*
71836: ** 2007 August 22
71837: **
71838: ** The author disclaims copyright to this source code. In place of
71839: ** a legal notice, here is a blessing:
71840: **
71841: ** May you do good and not evil.
71842: ** May you find forgiveness for yourself and forgive others.
71843: ** May you share freely, never taking more than you give.
71844: **
71845: *************************************************************************
71846: **
71847: ** This file implements a special kind of sqlite3_file object used
71848: ** by SQLite to create journal files if the atomic-write optimization
71849: ** is enabled.
71850: **
71851: ** The distinctive characteristic of this sqlite3_file is that the
71852: ** actual on disk file is created lazily. When the file is created,
71853: ** the caller specifies a buffer size for an in-memory buffer to
71854: ** be used to service read() and write() requests. The actual file
71855: ** on disk is not created or populated until either:
71856: **
71857: ** 1) The in-memory representation grows too large for the allocated
71858: ** buffer, or
71859: ** 2) The sqlite3JournalCreate() function is called.
71860: */
71861: #ifdef SQLITE_ENABLE_ATOMIC_WRITE
71862:
71863:
71864: /*
71865: ** A JournalFile object is a subclass of sqlite3_file used by
71866: ** as an open file handle for journal files.
71867: */
71868: struct JournalFile {
71869: sqlite3_io_methods *pMethod; /* I/O methods on journal files */
71870: int nBuf; /* Size of zBuf[] in bytes */
71871: char *zBuf; /* Space to buffer journal writes */
71872: int iSize; /* Amount of zBuf[] currently used */
71873: int flags; /* xOpen flags */
71874: sqlite3_vfs *pVfs; /* The "real" underlying VFS */
71875: sqlite3_file *pReal; /* The "real" underlying file descriptor */
71876: const char *zJournal; /* Name of the journal file */
71877: };
71878: typedef struct JournalFile JournalFile;
71879:
71880: /*
71881: ** If it does not already exists, create and populate the on-disk file
71882: ** for JournalFile p.
71883: */
71884: static int createFile(JournalFile *p){
71885: int rc = SQLITE_OK;
71886: if( !p->pReal ){
71887: sqlite3_file *pReal = (sqlite3_file *)&p[1];
71888: rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0);
71889: if( rc==SQLITE_OK ){
71890: p->pReal = pReal;
71891: if( p->iSize>0 ){
71892: assert(p->iSize<=p->nBuf);
71893: rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0);
71894: }
71895: }
71896: }
71897: return rc;
71898: }
71899:
71900: /*
71901: ** Close the file.
71902: */
71903: static int jrnlClose(sqlite3_file *pJfd){
71904: JournalFile *p = (JournalFile *)pJfd;
71905: if( p->pReal ){
71906: sqlite3OsClose(p->pReal);
71907: }
71908: sqlite3_free(p->zBuf);
71909: return SQLITE_OK;
71910: }
71911:
71912: /*
71913: ** Read data from the file.
71914: */
71915: static int jrnlRead(
71916: sqlite3_file *pJfd, /* The journal file from which to read */
71917: void *zBuf, /* Put the results here */
71918: int iAmt, /* Number of bytes to read */
71919: sqlite_int64 iOfst /* Begin reading at this offset */
71920: ){
71921: int rc = SQLITE_OK;
71922: JournalFile *p = (JournalFile *)pJfd;
71923: if( p->pReal ){
71924: rc = sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst);
71925: }else if( (iAmt+iOfst)>p->iSize ){
71926: rc = SQLITE_IOERR_SHORT_READ;
71927: }else{
71928: memcpy(zBuf, &p->zBuf[iOfst], iAmt);
71929: }
71930: return rc;
71931: }
71932:
71933: /*
71934: ** Write data to the file.
71935: */
71936: static int jrnlWrite(
71937: sqlite3_file *pJfd, /* The journal file into which to write */
71938: const void *zBuf, /* Take data to be written from here */
71939: int iAmt, /* Number of bytes to write */
71940: sqlite_int64 iOfst /* Begin writing at this offset into the file */
71941: ){
71942: int rc = SQLITE_OK;
71943: JournalFile *p = (JournalFile *)pJfd;
71944: if( !p->pReal && (iOfst+iAmt)>p->nBuf ){
71945: rc = createFile(p);
71946: }
71947: if( rc==SQLITE_OK ){
71948: if( p->pReal ){
71949: rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
71950: }else{
71951: memcpy(&p->zBuf[iOfst], zBuf, iAmt);
71952: if( p->iSize<(iOfst+iAmt) ){
71953: p->iSize = (iOfst+iAmt);
71954: }
71955: }
71956: }
71957: return rc;
71958: }
71959:
71960: /*
71961: ** Truncate the file.
71962: */
71963: static int jrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){
71964: int rc = SQLITE_OK;
71965: JournalFile *p = (JournalFile *)pJfd;
71966: if( p->pReal ){
71967: rc = sqlite3OsTruncate(p->pReal, size);
71968: }else if( size<p->iSize ){
71969: p->iSize = size;
71970: }
71971: return rc;
71972: }
71973:
71974: /*
71975: ** Sync the file.
71976: */
71977: static int jrnlSync(sqlite3_file *pJfd, int flags){
71978: int rc;
71979: JournalFile *p = (JournalFile *)pJfd;
71980: if( p->pReal ){
71981: rc = sqlite3OsSync(p->pReal, flags);
71982: }else{
71983: rc = SQLITE_OK;
71984: }
71985: return rc;
71986: }
71987:
71988: /*
71989: ** Query the size of the file in bytes.
71990: */
71991: static int jrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){
71992: int rc = SQLITE_OK;
71993: JournalFile *p = (JournalFile *)pJfd;
71994: if( p->pReal ){
71995: rc = sqlite3OsFileSize(p->pReal, pSize);
71996: }else{
71997: *pSize = (sqlite_int64) p->iSize;
71998: }
71999: return rc;
72000: }
72001:
72002: /*
72003: ** Table of methods for JournalFile sqlite3_file object.
72004: */
72005: static struct sqlite3_io_methods JournalFileMethods = {
72006: 1, /* iVersion */
72007: jrnlClose, /* xClose */
72008: jrnlRead, /* xRead */
72009: jrnlWrite, /* xWrite */
72010: jrnlTruncate, /* xTruncate */
72011: jrnlSync, /* xSync */
72012: jrnlFileSize, /* xFileSize */
72013: 0, /* xLock */
72014: 0, /* xUnlock */
72015: 0, /* xCheckReservedLock */
72016: 0, /* xFileControl */
72017: 0, /* xSectorSize */
72018: 0, /* xDeviceCharacteristics */
72019: 0, /* xShmMap */
72020: 0, /* xShmLock */
72021: 0, /* xShmBarrier */
72022: 0 /* xShmUnmap */
72023: };
72024:
72025: /*
72026: ** Open a journal file.
72027: */
72028: SQLITE_PRIVATE int sqlite3JournalOpen(
72029: sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */
72030: const char *zName, /* Name of the journal file */
72031: sqlite3_file *pJfd, /* Preallocated, blank file handle */
72032: int flags, /* Opening flags */
72033: int nBuf /* Bytes buffered before opening the file */
72034: ){
72035: JournalFile *p = (JournalFile *)pJfd;
72036: memset(p, 0, sqlite3JournalSize(pVfs));
72037: if( nBuf>0 ){
72038: p->zBuf = sqlite3MallocZero(nBuf);
72039: if( !p->zBuf ){
72040: return SQLITE_NOMEM;
72041: }
72042: }else{
72043: return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0);
72044: }
72045: p->pMethod = &JournalFileMethods;
72046: p->nBuf = nBuf;
72047: p->flags = flags;
72048: p->zJournal = zName;
72049: p->pVfs = pVfs;
72050: return SQLITE_OK;
72051: }
72052:
72053: /*
72054: ** If the argument p points to a JournalFile structure, and the underlying
72055: ** file has not yet been created, create it now.
72056: */
72057: SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *p){
72058: if( p->pMethods!=&JournalFileMethods ){
72059: return SQLITE_OK;
72060: }
72061: return createFile((JournalFile *)p);
72062: }
72063:
1.2.2.1 ! misho 72064: /*
! 72065: ** The file-handle passed as the only argument is guaranteed to be an open
! 72066: ** file. It may or may not be of class JournalFile. If the file is a
! 72067: ** JournalFile, and the underlying file on disk has not yet been opened,
! 72068: ** return 0. Otherwise, return 1.
! 72069: */
! 72070: SQLITE_PRIVATE int sqlite3JournalExists(sqlite3_file *p){
! 72071: return (p->pMethods!=&JournalFileMethods || ((JournalFile *)p)->pReal!=0);
! 72072: }
! 72073:
1.2 misho 72074: /*
72075: ** Return the number of bytes required to store a JournalFile that uses vfs
72076: ** pVfs to create the underlying on-disk files.
72077: */
72078: SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){
72079: return (pVfs->szOsFile+sizeof(JournalFile));
72080: }
72081: #endif
72082:
72083: /************** End of journal.c *********************************************/
72084: /************** Begin file memjournal.c **************************************/
72085: /*
72086: ** 2008 October 7
72087: **
72088: ** The author disclaims copyright to this source code. In place of
72089: ** a legal notice, here is a blessing:
72090: **
72091: ** May you do good and not evil.
72092: ** May you find forgiveness for yourself and forgive others.
72093: ** May you share freely, never taking more than you give.
72094: **
72095: *************************************************************************
72096: **
72097: ** This file contains code use to implement an in-memory rollback journal.
72098: ** The in-memory rollback journal is used to journal transactions for
72099: ** ":memory:" databases and when the journal_mode=MEMORY pragma is used.
72100: */
72101:
72102: /* Forward references to internal structures */
72103: typedef struct MemJournal MemJournal;
72104: typedef struct FilePoint FilePoint;
72105: typedef struct FileChunk FileChunk;
72106:
72107: /* Space to hold the rollback journal is allocated in increments of
72108: ** this many bytes.
72109: **
72110: ** The size chosen is a little less than a power of two. That way,
72111: ** the FileChunk object will have a size that almost exactly fills
72112: ** a power-of-two allocation. This mimimizes wasted space in power-of-two
72113: ** memory allocators.
72114: */
72115: #define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*)))
72116:
72117: /* Macro to find the minimum of two numeric values.
72118: */
72119: #ifndef MIN
72120: # define MIN(x,y) ((x)<(y)?(x):(y))
72121: #endif
72122:
72123: /*
72124: ** The rollback journal is composed of a linked list of these structures.
72125: */
72126: struct FileChunk {
72127: FileChunk *pNext; /* Next chunk in the journal */
72128: u8 zChunk[JOURNAL_CHUNKSIZE]; /* Content of this chunk */
72129: };
72130:
72131: /*
72132: ** An instance of this object serves as a cursor into the rollback journal.
72133: ** The cursor can be either for reading or writing.
72134: */
72135: struct FilePoint {
72136: sqlite3_int64 iOffset; /* Offset from the beginning of the file */
72137: FileChunk *pChunk; /* Specific chunk into which cursor points */
72138: };
72139:
72140: /*
72141: ** This subclass is a subclass of sqlite3_file. Each open memory-journal
72142: ** is an instance of this class.
72143: */
72144: struct MemJournal {
72145: sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */
72146: FileChunk *pFirst; /* Head of in-memory chunk-list */
72147: FilePoint endpoint; /* Pointer to the end of the file */
72148: FilePoint readpoint; /* Pointer to the end of the last xRead() */
72149: };
72150:
72151: /*
72152: ** Read data from the in-memory journal file. This is the implementation
72153: ** of the sqlite3_vfs.xRead method.
72154: */
72155: static int memjrnlRead(
72156: sqlite3_file *pJfd, /* The journal file from which to read */
72157: void *zBuf, /* Put the results here */
72158: int iAmt, /* Number of bytes to read */
72159: sqlite_int64 iOfst /* Begin reading at this offset */
72160: ){
72161: MemJournal *p = (MemJournal *)pJfd;
72162: u8 *zOut = zBuf;
72163: int nRead = iAmt;
72164: int iChunkOffset;
72165: FileChunk *pChunk;
72166:
72167: /* SQLite never tries to read past the end of a rollback journal file */
72168: assert( iOfst+iAmt<=p->endpoint.iOffset );
72169:
72170: if( p->readpoint.iOffset!=iOfst || iOfst==0 ){
72171: sqlite3_int64 iOff = 0;
72172: for(pChunk=p->pFirst;
72173: ALWAYS(pChunk) && (iOff+JOURNAL_CHUNKSIZE)<=iOfst;
72174: pChunk=pChunk->pNext
72175: ){
72176: iOff += JOURNAL_CHUNKSIZE;
72177: }
72178: }else{
72179: pChunk = p->readpoint.pChunk;
72180: }
72181:
72182: iChunkOffset = (int)(iOfst%JOURNAL_CHUNKSIZE);
72183: do {
72184: int iSpace = JOURNAL_CHUNKSIZE - iChunkOffset;
72185: int nCopy = MIN(nRead, (JOURNAL_CHUNKSIZE - iChunkOffset));
72186: memcpy(zOut, &pChunk->zChunk[iChunkOffset], nCopy);
72187: zOut += nCopy;
72188: nRead -= iSpace;
72189: iChunkOffset = 0;
72190: } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 );
72191: p->readpoint.iOffset = iOfst+iAmt;
72192: p->readpoint.pChunk = pChunk;
72193:
72194: return SQLITE_OK;
72195: }
72196:
72197: /*
72198: ** Write data to the file.
72199: */
72200: static int memjrnlWrite(
72201: sqlite3_file *pJfd, /* The journal file into which to write */
72202: const void *zBuf, /* Take data to be written from here */
72203: int iAmt, /* Number of bytes to write */
72204: sqlite_int64 iOfst /* Begin writing at this offset into the file */
72205: ){
72206: MemJournal *p = (MemJournal *)pJfd;
72207: int nWrite = iAmt;
72208: u8 *zWrite = (u8 *)zBuf;
72209:
72210: /* An in-memory journal file should only ever be appended to. Random
72211: ** access writes are not required by sqlite.
72212: */
72213: assert( iOfst==p->endpoint.iOffset );
72214: UNUSED_PARAMETER(iOfst);
72215:
72216: while( nWrite>0 ){
72217: FileChunk *pChunk = p->endpoint.pChunk;
72218: int iChunkOffset = (int)(p->endpoint.iOffset%JOURNAL_CHUNKSIZE);
72219: int iSpace = MIN(nWrite, JOURNAL_CHUNKSIZE - iChunkOffset);
72220:
72221: if( iChunkOffset==0 ){
72222: /* New chunk is required to extend the file. */
72223: FileChunk *pNew = sqlite3_malloc(sizeof(FileChunk));
72224: if( !pNew ){
72225: return SQLITE_IOERR_NOMEM;
72226: }
72227: pNew->pNext = 0;
72228: if( pChunk ){
72229: assert( p->pFirst );
72230: pChunk->pNext = pNew;
72231: }else{
72232: assert( !p->pFirst );
72233: p->pFirst = pNew;
72234: }
72235: p->endpoint.pChunk = pNew;
72236: }
72237:
72238: memcpy(&p->endpoint.pChunk->zChunk[iChunkOffset], zWrite, iSpace);
72239: zWrite += iSpace;
72240: nWrite -= iSpace;
72241: p->endpoint.iOffset += iSpace;
72242: }
72243:
72244: return SQLITE_OK;
72245: }
72246:
72247: /*
72248: ** Truncate the file.
72249: */
72250: static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){
72251: MemJournal *p = (MemJournal *)pJfd;
72252: FileChunk *pChunk;
72253: assert(size==0);
72254: UNUSED_PARAMETER(size);
72255: pChunk = p->pFirst;
72256: while( pChunk ){
72257: FileChunk *pTmp = pChunk;
72258: pChunk = pChunk->pNext;
72259: sqlite3_free(pTmp);
72260: }
72261: sqlite3MemJournalOpen(pJfd);
72262: return SQLITE_OK;
72263: }
72264:
72265: /*
72266: ** Close the file.
72267: */
72268: static int memjrnlClose(sqlite3_file *pJfd){
72269: memjrnlTruncate(pJfd, 0);
72270: return SQLITE_OK;
72271: }
72272:
72273:
72274: /*
72275: ** Sync the file.
72276: **
72277: ** Syncing an in-memory journal is a no-op. And, in fact, this routine
72278: ** is never called in a working implementation. This implementation
72279: ** exists purely as a contingency, in case some malfunction in some other
72280: ** part of SQLite causes Sync to be called by mistake.
72281: */
72282: static int memjrnlSync(sqlite3_file *NotUsed, int NotUsed2){
72283: UNUSED_PARAMETER2(NotUsed, NotUsed2);
72284: return SQLITE_OK;
72285: }
72286:
72287: /*
72288: ** Query the size of the file in bytes.
72289: */
72290: static int memjrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){
72291: MemJournal *p = (MemJournal *)pJfd;
72292: *pSize = (sqlite_int64) p->endpoint.iOffset;
72293: return SQLITE_OK;
72294: }
72295:
72296: /*
72297: ** Table of methods for MemJournal sqlite3_file object.
72298: */
72299: static const struct sqlite3_io_methods MemJournalMethods = {
72300: 1, /* iVersion */
72301: memjrnlClose, /* xClose */
72302: memjrnlRead, /* xRead */
72303: memjrnlWrite, /* xWrite */
72304: memjrnlTruncate, /* xTruncate */
72305: memjrnlSync, /* xSync */
72306: memjrnlFileSize, /* xFileSize */
72307: 0, /* xLock */
72308: 0, /* xUnlock */
72309: 0, /* xCheckReservedLock */
72310: 0, /* xFileControl */
72311: 0, /* xSectorSize */
72312: 0, /* xDeviceCharacteristics */
72313: 0, /* xShmMap */
72314: 0, /* xShmLock */
72315: 0, /* xShmBarrier */
72316: 0 /* xShmUnlock */
72317: };
72318:
72319: /*
72320: ** Open a journal file.
72321: */
72322: SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){
72323: MemJournal *p = (MemJournal *)pJfd;
72324: assert( EIGHT_BYTE_ALIGNMENT(p) );
72325: memset(p, 0, sqlite3MemJournalSize());
72326: p->pMethod = (sqlite3_io_methods*)&MemJournalMethods;
72327: }
72328:
72329: /*
72330: ** Return true if the file-handle passed as an argument is
72331: ** an in-memory journal
72332: */
72333: SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *pJfd){
72334: return pJfd->pMethods==&MemJournalMethods;
72335: }
72336:
72337: /*
72338: ** Return the number of bytes required to store a MemJournal file descriptor.
72339: */
72340: SQLITE_PRIVATE int sqlite3MemJournalSize(void){
72341: return sizeof(MemJournal);
72342: }
72343:
72344: /************** End of memjournal.c ******************************************/
72345: /************** Begin file walker.c ******************************************/
72346: /*
72347: ** 2008 August 16
72348: **
72349: ** The author disclaims copyright to this source code. In place of
72350: ** a legal notice, here is a blessing:
72351: **
72352: ** May you do good and not evil.
72353: ** May you find forgiveness for yourself and forgive others.
72354: ** May you share freely, never taking more than you give.
72355: **
72356: *************************************************************************
72357: ** This file contains routines used for walking the parser tree for
72358: ** an SQL statement.
72359: */
72360: /* #include <stdlib.h> */
72361: /* #include <string.h> */
72362:
72363:
72364: /*
72365: ** Walk an expression tree. Invoke the callback once for each node
72366: ** of the expression, while decending. (In other words, the callback
72367: ** is invoked before visiting children.)
72368: **
72369: ** The return value from the callback should be one of the WRC_*
72370: ** constants to specify how to proceed with the walk.
72371: **
72372: ** WRC_Continue Continue descending down the tree.
72373: **
72374: ** WRC_Prune Do not descend into child nodes. But allow
72375: ** the walk to continue with sibling nodes.
72376: **
72377: ** WRC_Abort Do no more callbacks. Unwind the stack and
72378: ** return the top-level walk call.
72379: **
72380: ** The return value from this routine is WRC_Abort to abandon the tree walk
72381: ** and WRC_Continue to continue.
72382: */
72383: SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){
72384: int rc;
72385: if( pExpr==0 ) return WRC_Continue;
72386: testcase( ExprHasProperty(pExpr, EP_TokenOnly) );
72387: testcase( ExprHasProperty(pExpr, EP_Reduced) );
72388: rc = pWalker->xExprCallback(pWalker, pExpr);
72389: if( rc==WRC_Continue
72390: && !ExprHasAnyProperty(pExpr,EP_TokenOnly) ){
72391: if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort;
72392: if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort;
72393: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
72394: if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort;
72395: }else{
72396: if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort;
72397: }
72398: }
72399: return rc & WRC_Abort;
72400: }
72401:
72402: /*
72403: ** Call sqlite3WalkExpr() for every expression in list p or until
72404: ** an abort request is seen.
72405: */
72406: SQLITE_PRIVATE int sqlite3WalkExprList(Walker *pWalker, ExprList *p){
72407: int i;
72408: struct ExprList_item *pItem;
72409: if( p ){
72410: for(i=p->nExpr, pItem=p->a; i>0; i--, pItem++){
72411: if( sqlite3WalkExpr(pWalker, pItem->pExpr) ) return WRC_Abort;
72412: }
72413: }
72414: return WRC_Continue;
72415: }
72416:
72417: /*
72418: ** Walk all expressions associated with SELECT statement p. Do
72419: ** not invoke the SELECT callback on p, but do (of course) invoke
72420: ** any expr callbacks and SELECT callbacks that come from subqueries.
72421: ** Return WRC_Abort or WRC_Continue.
72422: */
72423: SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
72424: if( sqlite3WalkExprList(pWalker, p->pEList) ) return WRC_Abort;
72425: if( sqlite3WalkExpr(pWalker, p->pWhere) ) return WRC_Abort;
72426: if( sqlite3WalkExprList(pWalker, p->pGroupBy) ) return WRC_Abort;
72427: if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort;
72428: if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort;
72429: if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort;
72430: if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort;
72431: return WRC_Continue;
72432: }
72433:
72434: /*
72435: ** Walk the parse trees associated with all subqueries in the
72436: ** FROM clause of SELECT statement p. Do not invoke the select
72437: ** callback on p, but do invoke it on each FROM clause subquery
72438: ** and on any subqueries further down in the tree. Return
72439: ** WRC_Abort or WRC_Continue;
72440: */
72441: SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){
72442: SrcList *pSrc;
72443: int i;
72444: struct SrcList_item *pItem;
72445:
72446: pSrc = p->pSrc;
72447: if( ALWAYS(pSrc) ){
72448: for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
72449: if( sqlite3WalkSelect(pWalker, pItem->pSelect) ){
72450: return WRC_Abort;
72451: }
72452: }
72453: }
72454: return WRC_Continue;
72455: }
72456:
72457: /*
72458: ** Call sqlite3WalkExpr() for every expression in Select statement p.
72459: ** Invoke sqlite3WalkSelect() for subqueries in the FROM clause and
72460: ** on the compound select chain, p->pPrior.
72461: **
72462: ** Return WRC_Continue under normal conditions. Return WRC_Abort if
72463: ** there is an abort request.
72464: **
72465: ** If the Walker does not have an xSelectCallback() then this routine
72466: ** is a no-op returning WRC_Continue.
72467: */
72468: SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){
72469: int rc;
72470: if( p==0 || pWalker->xSelectCallback==0 ) return WRC_Continue;
72471: rc = WRC_Continue;
1.2.2.1 ! misho 72472: pWalker->walkerDepth++;
! 72473: while( p ){
1.2 misho 72474: rc = pWalker->xSelectCallback(pWalker, p);
72475: if( rc ) break;
1.2.2.1 ! misho 72476: if( sqlite3WalkSelectExpr(pWalker, p)
! 72477: || sqlite3WalkSelectFrom(pWalker, p)
! 72478: ){
! 72479: pWalker->walkerDepth--;
! 72480: return WRC_Abort;
! 72481: }
1.2 misho 72482: p = p->pPrior;
72483: }
1.2.2.1 ! misho 72484: pWalker->walkerDepth--;
1.2 misho 72485: return rc & WRC_Abort;
72486: }
72487:
72488: /************** End of walker.c **********************************************/
72489: /************** Begin file resolve.c *****************************************/
72490: /*
72491: ** 2008 August 18
72492: **
72493: ** The author disclaims copyright to this source code. In place of
72494: ** a legal notice, here is a blessing:
72495: **
72496: ** May you do good and not evil.
72497: ** May you find forgiveness for yourself and forgive others.
72498: ** May you share freely, never taking more than you give.
72499: **
72500: *************************************************************************
72501: **
72502: ** This file contains routines used for walking the parser tree and
72503: ** resolve all identifiers by associating them with a particular
72504: ** table and column.
72505: */
72506: /* #include <stdlib.h> */
72507: /* #include <string.h> */
72508:
72509: /*
1.2.2.1 ! misho 72510: ** Walk the expression tree pExpr and increase the aggregate function
! 72511: ** depth (the Expr.op2 field) by N on every TK_AGG_FUNCTION node.
! 72512: ** This needs to occur when copying a TK_AGG_FUNCTION node from an
! 72513: ** outer query into an inner subquery.
! 72514: **
! 72515: ** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..)
! 72516: ** is a helper function - a callback for the tree walker.
! 72517: */
! 72518: static int incrAggDepth(Walker *pWalker, Expr *pExpr){
! 72519: if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.i;
! 72520: return WRC_Continue;
! 72521: }
! 72522: static void incrAggFunctionDepth(Expr *pExpr, int N){
! 72523: if( N>0 ){
! 72524: Walker w;
! 72525: memset(&w, 0, sizeof(w));
! 72526: w.xExprCallback = incrAggDepth;
! 72527: w.u.i = N;
! 72528: sqlite3WalkExpr(&w, pExpr);
! 72529: }
! 72530: }
! 72531:
! 72532: /*
1.2 misho 72533: ** Turn the pExpr expression into an alias for the iCol-th column of the
72534: ** result set in pEList.
72535: **
72536: ** If the result set column is a simple column reference, then this routine
72537: ** makes an exact copy. But for any other kind of expression, this
72538: ** routine make a copy of the result set column as the argument to the
72539: ** TK_AS operator. The TK_AS operator causes the expression to be
72540: ** evaluated just once and then reused for each alias.
72541: **
72542: ** The reason for suppressing the TK_AS term when the expression is a simple
72543: ** column reference is so that the column reference will be recognized as
72544: ** usable by indices within the WHERE clause processing logic.
72545: **
72546: ** Hack: The TK_AS operator is inhibited if zType[0]=='G'. This means
72547: ** that in a GROUP BY clause, the expression is evaluated twice. Hence:
72548: **
72549: ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x
72550: **
72551: ** Is equivalent to:
72552: **
72553: ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5
72554: **
72555: ** The result of random()%5 in the GROUP BY clause is probably different
72556: ** from the result in the result-set. We might fix this someday. Or
72557: ** then again, we might not...
1.2.2.1 ! misho 72558: **
! 72559: ** If the reference is followed by a COLLATE operator, then make sure
! 72560: ** the COLLATE operator is preserved. For example:
! 72561: **
! 72562: ** SELECT a+b, c+d FROM t1 ORDER BY 1 COLLATE nocase;
! 72563: **
! 72564: ** Should be transformed into:
! 72565: **
! 72566: ** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase;
! 72567: **
! 72568: ** The nSubquery parameter specifies how many levels of subquery the
! 72569: ** alias is removed from the original expression. The usually value is
! 72570: ** zero but it might be more if the alias is contained within a subquery
! 72571: ** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION
! 72572: ** structures must be increased by the nSubquery amount.
1.2 misho 72573: */
72574: static void resolveAlias(
72575: Parse *pParse, /* Parsing context */
72576: ExprList *pEList, /* A result set */
72577: int iCol, /* A column in the result set. 0..pEList->nExpr-1 */
72578: Expr *pExpr, /* Transform this into an alias to the result set */
1.2.2.1 ! misho 72579: const char *zType, /* "GROUP" or "ORDER" or "" */
! 72580: int nSubquery /* Number of subqueries that the label is moving */
1.2 misho 72581: ){
72582: Expr *pOrig; /* The iCol-th column of the result set */
72583: Expr *pDup; /* Copy of pOrig */
72584: sqlite3 *db; /* The database connection */
72585:
72586: assert( iCol>=0 && iCol<pEList->nExpr );
72587: pOrig = pEList->a[iCol].pExpr;
72588: assert( pOrig!=0 );
72589: assert( pOrig->flags & EP_Resolved );
72590: db = pParse->db;
1.2.2.1 ! misho 72591: pDup = sqlite3ExprDup(db, pOrig, 0);
! 72592: if( pDup==0 ) return;
1.2 misho 72593: if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){
1.2.2.1 ! misho 72594: incrAggFunctionDepth(pDup, nSubquery);
1.2 misho 72595: pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0);
72596: if( pDup==0 ) return;
72597: if( pEList->a[iCol].iAlias==0 ){
72598: pEList->a[iCol].iAlias = (u16)(++pParse->nAlias);
72599: }
72600: pDup->iTable = pEList->a[iCol].iAlias;
1.2.2.1 ! misho 72601: }
! 72602: if( pExpr->op==TK_COLLATE ){
! 72603: pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
1.2 misho 72604: }
72605:
72606: /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This
72607: ** prevents ExprDelete() from deleting the Expr structure itself,
72608: ** allowing it to be repopulated by the memcpy() on the following line.
1.2.2.1 ! misho 72609: ** The pExpr->u.zToken might point into memory that will be freed by the
! 72610: ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to
! 72611: ** make a copy of the token before doing the sqlite3DbFree().
1.2 misho 72612: */
72613: ExprSetProperty(pExpr, EP_Static);
72614: sqlite3ExprDelete(db, pExpr);
72615: memcpy(pExpr, pDup, sizeof(*pExpr));
1.2.2.1 ! misho 72616: if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){
! 72617: assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 );
! 72618: pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken);
! 72619: pExpr->flags2 |= EP2_MallocedToken;
! 72620: }
1.2 misho 72621: sqlite3DbFree(db, pDup);
72622: }
72623:
72624:
72625: /*
72626: ** Return TRUE if the name zCol occurs anywhere in the USING clause.
72627: **
72628: ** Return FALSE if the USING clause is NULL or if it does not contain
72629: ** zCol.
72630: */
72631: static int nameInUsingClause(IdList *pUsing, const char *zCol){
72632: if( pUsing ){
72633: int k;
72634: for(k=0; k<pUsing->nId; k++){
72635: if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1;
72636: }
72637: }
72638: return 0;
72639: }
72640:
72641:
72642: /*
72643: ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
72644: ** that name in the set of source tables in pSrcList and make the pExpr
72645: ** expression node refer back to that source column. The following changes
72646: ** are made to pExpr:
72647: **
72648: ** pExpr->iDb Set the index in db->aDb[] of the database X
72649: ** (even if X is implied).
72650: ** pExpr->iTable Set to the cursor number for the table obtained
72651: ** from pSrcList.
72652: ** pExpr->pTab Points to the Table structure of X.Y (even if
72653: ** X and/or Y are implied.)
72654: ** pExpr->iColumn Set to the column number within the table.
72655: ** pExpr->op Set to TK_COLUMN.
72656: ** pExpr->pLeft Any expression this points to is deleted
72657: ** pExpr->pRight Any expression this points to is deleted.
72658: **
72659: ** The zDb variable is the name of the database (the "X"). This value may be
72660: ** NULL meaning that name is of the form Y.Z or Z. Any available database
72661: ** can be used. The zTable variable is the name of the table (the "Y"). This
72662: ** value can be NULL if zDb is also NULL. If zTable is NULL it
72663: ** means that the form of the name is Z and that columns from any table
72664: ** can be used.
72665: **
72666: ** If the name cannot be resolved unambiguously, leave an error message
72667: ** in pParse and return WRC_Abort. Return WRC_Prune on success.
72668: */
72669: static int lookupName(
72670: Parse *pParse, /* The parsing context */
72671: const char *zDb, /* Name of the database containing table, or NULL */
72672: const char *zTab, /* Name of table containing column, or NULL */
72673: const char *zCol, /* Name of the column. */
72674: NameContext *pNC, /* The name context used to resolve the name */
72675: Expr *pExpr /* Make this EXPR node point to the selected column */
72676: ){
1.2.2.1 ! misho 72677: int i, j; /* Loop counters */
1.2 misho 72678: int cnt = 0; /* Number of matching column names */
72679: int cntTab = 0; /* Number of matching table names */
1.2.2.1 ! misho 72680: int nSubquery = 0; /* How many levels of subquery */
1.2 misho 72681: sqlite3 *db = pParse->db; /* The database connection */
72682: struct SrcList_item *pItem; /* Use for looping over pSrcList items */
72683: struct SrcList_item *pMatch = 0; /* The matching pSrcList item */
72684: NameContext *pTopNC = pNC; /* First namecontext in the list */
72685: Schema *pSchema = 0; /* Schema of the expression */
72686: int isTrigger = 0;
72687:
72688: assert( pNC ); /* the name context cannot be NULL. */
72689: assert( zCol ); /* The Z in X.Y.Z cannot be NULL */
1.2.2.1 ! misho 72690: assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
1.2 misho 72691:
72692: /* Initialize the node to no-match */
72693: pExpr->iTable = -1;
72694: pExpr->pTab = 0;
72695: ExprSetIrreducible(pExpr);
72696:
72697: /* Start at the inner-most context and move outward until a match is found */
72698: while( pNC && cnt==0 ){
72699: ExprList *pEList;
72700: SrcList *pSrcList = pNC->pSrcList;
72701:
72702: if( pSrcList ){
72703: for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){
72704: Table *pTab;
72705: int iDb;
72706: Column *pCol;
72707:
72708: pTab = pItem->pTab;
72709: assert( pTab!=0 && pTab->zName!=0 );
72710: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
72711: assert( pTab->nCol>0 );
72712: if( zTab ){
72713: if( pItem->zAlias ){
72714: char *zTabName = pItem->zAlias;
72715: if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
72716: }else{
72717: char *zTabName = pTab->zName;
72718: if( NEVER(zTabName==0) || sqlite3StrICmp(zTabName, zTab)!=0 ){
72719: continue;
72720: }
72721: if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){
72722: continue;
72723: }
72724: }
72725: }
72726: if( 0==(cntTab++) ){
72727: pExpr->iTable = pItem->iCursor;
72728: pExpr->pTab = pTab;
72729: pSchema = pTab->pSchema;
72730: pMatch = pItem;
72731: }
72732: for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
72733: if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
72734: /* If there has been exactly one prior match and this match
72735: ** is for the right-hand table of a NATURAL JOIN or is in a
72736: ** USING clause, then skip this match.
72737: */
72738: if( cnt==1 ){
72739: if( pItem->jointype & JT_NATURAL ) continue;
72740: if( nameInUsingClause(pItem->pUsing, zCol) ) continue;
72741: }
72742: cnt++;
72743: pExpr->iTable = pItem->iCursor;
72744: pExpr->pTab = pTab;
72745: pMatch = pItem;
72746: pSchema = pTab->pSchema;
72747: /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
72748: pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j;
72749: break;
72750: }
72751: }
72752: }
72753: }
72754:
72755: #ifndef SQLITE_OMIT_TRIGGER
72756: /* If we have not already resolved the name, then maybe
72757: ** it is a new.* or old.* trigger argument reference
72758: */
72759: if( zDb==0 && zTab!=0 && cnt==0 && pParse->pTriggerTab!=0 ){
72760: int op = pParse->eTriggerOp;
72761: Table *pTab = 0;
72762: assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT );
72763: if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){
72764: pExpr->iTable = 1;
72765: pTab = pParse->pTriggerTab;
72766: }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){
72767: pExpr->iTable = 0;
72768: pTab = pParse->pTriggerTab;
72769: }
72770:
72771: if( pTab ){
72772: int iCol;
72773: pSchema = pTab->pSchema;
72774: cntTab++;
72775: for(iCol=0; iCol<pTab->nCol; iCol++){
72776: Column *pCol = &pTab->aCol[iCol];
72777: if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
72778: if( iCol==pTab->iPKey ){
72779: iCol = -1;
72780: }
72781: break;
72782: }
72783: }
72784: if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) ){
72785: iCol = -1; /* IMP: R-44911-55124 */
72786: }
72787: if( iCol<pTab->nCol ){
72788: cnt++;
72789: if( iCol<0 ){
72790: pExpr->affinity = SQLITE_AFF_INTEGER;
72791: }else if( pExpr->iTable==0 ){
72792: testcase( iCol==31 );
72793: testcase( iCol==32 );
72794: pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
72795: }else{
72796: testcase( iCol==31 );
72797: testcase( iCol==32 );
72798: pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol));
72799: }
72800: pExpr->iColumn = (i16)iCol;
72801: pExpr->pTab = pTab;
72802: isTrigger = 1;
72803: }
72804: }
72805: }
72806: #endif /* !defined(SQLITE_OMIT_TRIGGER) */
72807:
72808: /*
72809: ** Perhaps the name is a reference to the ROWID
72810: */
72811: if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){
72812: cnt = 1;
72813: pExpr->iColumn = -1; /* IMP: R-44911-55124 */
72814: pExpr->affinity = SQLITE_AFF_INTEGER;
72815: }
72816:
72817: /*
72818: ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
72819: ** might refer to an result-set alias. This happens, for example, when
72820: ** we are resolving names in the WHERE clause of the following command:
72821: **
72822: ** SELECT a+b AS x FROM table WHERE x<10;
72823: **
72824: ** In cases like this, replace pExpr with a copy of the expression that
72825: ** forms the result set entry ("a+b" in the example) and return immediately.
72826: ** Note that the expression in the result set should have already been
72827: ** resolved by the time the WHERE clause is resolved.
72828: */
72829: if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){
72830: for(j=0; j<pEList->nExpr; j++){
72831: char *zAs = pEList->a[j].zName;
72832: if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
72833: Expr *pOrig;
72834: assert( pExpr->pLeft==0 && pExpr->pRight==0 );
72835: assert( pExpr->x.pList==0 );
72836: assert( pExpr->x.pSelect==0 );
72837: pOrig = pEList->a[j].pExpr;
1.2.2.1 ! misho 72838: if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){
1.2 misho 72839: sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs);
72840: return WRC_Abort;
72841: }
1.2.2.1 ! misho 72842: resolveAlias(pParse, pEList, j, pExpr, "", nSubquery);
1.2 misho 72843: cnt = 1;
72844: pMatch = 0;
72845: assert( zTab==0 && zDb==0 );
72846: goto lookupname_end;
72847: }
72848: }
72849: }
72850:
72851: /* Advance to the next name context. The loop will exit when either
72852: ** we have a match (cnt>0) or when we run out of name contexts.
72853: */
72854: if( cnt==0 ){
72855: pNC = pNC->pNext;
1.2.2.1 ! misho 72856: nSubquery++;
1.2 misho 72857: }
72858: }
72859:
72860: /*
72861: ** If X and Y are NULL (in other words if only the column name Z is
72862: ** supplied) and the value of Z is enclosed in double-quotes, then
72863: ** Z is a string literal if it doesn't match any column names. In that
72864: ** case, we need to return right away and not make any changes to
72865: ** pExpr.
72866: **
72867: ** Because no reference was made to outer contexts, the pNC->nRef
72868: ** fields are not changed in any context.
72869: */
72870: if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){
72871: pExpr->op = TK_STRING;
72872: pExpr->pTab = 0;
72873: return WRC_Prune;
72874: }
72875:
72876: /*
72877: ** cnt==0 means there was not match. cnt>1 means there were two or
72878: ** more matches. Either way, we have an error.
72879: */
72880: if( cnt!=1 ){
72881: const char *zErr;
72882: zErr = cnt==0 ? "no such column" : "ambiguous column name";
72883: if( zDb ){
72884: sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol);
72885: }else if( zTab ){
72886: sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol);
72887: }else{
72888: sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol);
72889: }
72890: pParse->checkSchema = 1;
72891: pTopNC->nErr++;
72892: }
72893:
72894: /* If a column from a table in pSrcList is referenced, then record
72895: ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes
72896: ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the
72897: ** column number is greater than the number of bits in the bitmask
72898: ** then set the high-order bit of the bitmask.
72899: */
72900: if( pExpr->iColumn>=0 && pMatch!=0 ){
72901: int n = pExpr->iColumn;
72902: testcase( n==BMS-1 );
72903: if( n>=BMS ){
72904: n = BMS-1;
72905: }
72906: assert( pMatch->iCursor==pExpr->iTable );
72907: pMatch->colUsed |= ((Bitmask)1)<<n;
72908: }
72909:
72910: /* Clean up and return
72911: */
72912: sqlite3ExprDelete(db, pExpr->pLeft);
72913: pExpr->pLeft = 0;
72914: sqlite3ExprDelete(db, pExpr->pRight);
72915: pExpr->pRight = 0;
72916: pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN);
72917: lookupname_end:
72918: if( cnt==1 ){
72919: assert( pNC!=0 );
72920: sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList);
72921: /* Increment the nRef value on all name contexts from TopNC up to
72922: ** the point where the name matched. */
72923: for(;;){
72924: assert( pTopNC!=0 );
72925: pTopNC->nRef++;
72926: if( pTopNC==pNC ) break;
72927: pTopNC = pTopNC->pNext;
72928: }
72929: return WRC_Prune;
72930: } else {
72931: return WRC_Abort;
72932: }
72933: }
72934:
72935: /*
72936: ** Allocate and return a pointer to an expression to load the column iCol
72937: ** from datasource iSrc in SrcList pSrc.
72938: */
72939: SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){
72940: Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0);
72941: if( p ){
72942: struct SrcList_item *pItem = &pSrc->a[iSrc];
72943: p->pTab = pItem->pTab;
72944: p->iTable = pItem->iCursor;
72945: if( p->pTab->iPKey==iCol ){
72946: p->iColumn = -1;
72947: }else{
72948: p->iColumn = (ynVar)iCol;
72949: testcase( iCol==BMS );
72950: testcase( iCol==BMS-1 );
72951: pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol);
72952: }
72953: ExprSetProperty(p, EP_Resolved);
72954: }
72955: return p;
72956: }
72957:
72958: /*
72959: ** This routine is callback for sqlite3WalkExpr().
72960: **
72961: ** Resolve symbolic names into TK_COLUMN operators for the current
72962: ** node in the expression tree. Return 0 to continue the search down
72963: ** the tree or 2 to abort the tree walk.
72964: **
72965: ** This routine also does error checking and name resolution for
72966: ** function names. The operator for aggregate functions is changed
72967: ** to TK_AGG_FUNCTION.
72968: */
72969: static int resolveExprStep(Walker *pWalker, Expr *pExpr){
72970: NameContext *pNC;
72971: Parse *pParse;
72972:
72973: pNC = pWalker->u.pNC;
72974: assert( pNC!=0 );
72975: pParse = pNC->pParse;
72976: assert( pParse==pWalker->pParse );
72977:
72978: if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return WRC_Prune;
72979: ExprSetProperty(pExpr, EP_Resolved);
72980: #ifndef NDEBUG
72981: if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){
72982: SrcList *pSrcList = pNC->pSrcList;
72983: int i;
72984: for(i=0; i<pNC->pSrcList->nSrc; i++){
72985: assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab);
72986: }
72987: }
72988: #endif
72989: switch( pExpr->op ){
72990:
72991: #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
72992: /* The special operator TK_ROW means use the rowid for the first
72993: ** column in the FROM clause. This is used by the LIMIT and ORDER BY
72994: ** clause processing on UPDATE and DELETE statements.
72995: */
72996: case TK_ROW: {
72997: SrcList *pSrcList = pNC->pSrcList;
72998: struct SrcList_item *pItem;
72999: assert( pSrcList && pSrcList->nSrc==1 );
73000: pItem = pSrcList->a;
73001: pExpr->op = TK_COLUMN;
73002: pExpr->pTab = pItem->pTab;
73003: pExpr->iTable = pItem->iCursor;
73004: pExpr->iColumn = -1;
73005: pExpr->affinity = SQLITE_AFF_INTEGER;
73006: break;
73007: }
73008: #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */
73009:
73010: /* A lone identifier is the name of a column.
73011: */
73012: case TK_ID: {
73013: return lookupName(pParse, 0, 0, pExpr->u.zToken, pNC, pExpr);
73014: }
73015:
73016: /* A table name and column name: ID.ID
73017: ** Or a database, table and column: ID.ID.ID
73018: */
73019: case TK_DOT: {
73020: const char *zColumn;
73021: const char *zTable;
73022: const char *zDb;
73023: Expr *pRight;
73024:
73025: /* if( pSrcList==0 ) break; */
73026: pRight = pExpr->pRight;
73027: if( pRight->op==TK_ID ){
73028: zDb = 0;
73029: zTable = pExpr->pLeft->u.zToken;
73030: zColumn = pRight->u.zToken;
73031: }else{
73032: assert( pRight->op==TK_DOT );
73033: zDb = pExpr->pLeft->u.zToken;
73034: zTable = pRight->pLeft->u.zToken;
73035: zColumn = pRight->pRight->u.zToken;
73036: }
73037: return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr);
73038: }
73039:
73040: /* Resolve function names
73041: */
73042: case TK_CONST_FUNC:
73043: case TK_FUNCTION: {
73044: ExprList *pList = pExpr->x.pList; /* The argument list */
73045: int n = pList ? pList->nExpr : 0; /* Number of arguments */
73046: int no_such_func = 0; /* True if no such function exists */
73047: int wrong_num_args = 0; /* True if wrong number of arguments */
73048: int is_agg = 0; /* True if is an aggregate function */
73049: int auth; /* Authorization to use the function */
73050: int nId; /* Number of characters in function name */
73051: const char *zId; /* The function name. */
73052: FuncDef *pDef; /* Information about the function */
73053: u8 enc = ENC(pParse->db); /* The database encoding */
73054:
73055: testcase( pExpr->op==TK_CONST_FUNC );
73056: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
73057: zId = pExpr->u.zToken;
73058: nId = sqlite3Strlen30(zId);
73059: pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0);
73060: if( pDef==0 ){
1.2.2.1 ! misho 73061: pDef = sqlite3FindFunction(pParse->db, zId, nId, -2, enc, 0);
1.2 misho 73062: if( pDef==0 ){
73063: no_such_func = 1;
73064: }else{
73065: wrong_num_args = 1;
73066: }
73067: }else{
73068: is_agg = pDef->xFunc==0;
73069: }
73070: #ifndef SQLITE_OMIT_AUTHORIZATION
73071: if( pDef ){
73072: auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0);
73073: if( auth!=SQLITE_OK ){
73074: if( auth==SQLITE_DENY ){
73075: sqlite3ErrorMsg(pParse, "not authorized to use function: %s",
73076: pDef->zName);
73077: pNC->nErr++;
73078: }
73079: pExpr->op = TK_NULL;
73080: return WRC_Prune;
73081: }
73082: }
73083: #endif
1.2.2.1 ! misho 73084: if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){
1.2 misho 73085: sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId);
73086: pNC->nErr++;
73087: is_agg = 0;
73088: }else if( no_such_func ){
73089: sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
73090: pNC->nErr++;
73091: }else if( wrong_num_args ){
73092: sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
73093: nId, zId);
73094: pNC->nErr++;
73095: }
1.2.2.1 ! misho 73096: if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg;
! 73097: sqlite3WalkExprList(pWalker, pList);
1.2 misho 73098: if( is_agg ){
1.2.2.1 ! misho 73099: NameContext *pNC2 = pNC;
1.2 misho 73100: pExpr->op = TK_AGG_FUNCTION;
1.2.2.1 ! misho 73101: pExpr->op2 = 0;
! 73102: while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){
! 73103: pExpr->op2++;
! 73104: pNC2 = pNC2->pNext;
! 73105: }
! 73106: if( pNC2 ) pNC2->ncFlags |= NC_HasAgg;
! 73107: pNC->ncFlags |= NC_AllowAgg;
1.2 misho 73108: }
73109: /* FIX ME: Compute pExpr->affinity based on the expected return
73110: ** type of the function
73111: */
73112: return WRC_Prune;
73113: }
73114: #ifndef SQLITE_OMIT_SUBQUERY
73115: case TK_SELECT:
73116: case TK_EXISTS: testcase( pExpr->op==TK_EXISTS );
73117: #endif
73118: case TK_IN: {
73119: testcase( pExpr->op==TK_IN );
73120: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
73121: int nRef = pNC->nRef;
73122: #ifndef SQLITE_OMIT_CHECK
1.2.2.1 ! misho 73123: if( (pNC->ncFlags & NC_IsCheck)!=0 ){
1.2 misho 73124: sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints");
73125: }
73126: #endif
73127: sqlite3WalkSelect(pWalker, pExpr->x.pSelect);
73128: assert( pNC->nRef>=nRef );
73129: if( nRef!=pNC->nRef ){
73130: ExprSetProperty(pExpr, EP_VarSelect);
73131: }
73132: }
73133: break;
73134: }
73135: #ifndef SQLITE_OMIT_CHECK
73136: case TK_VARIABLE: {
1.2.2.1 ! misho 73137: if( (pNC->ncFlags & NC_IsCheck)!=0 ){
1.2 misho 73138: sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints");
73139: }
73140: break;
73141: }
73142: #endif
73143: }
73144: return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue;
73145: }
73146:
73147: /*
73148: ** pEList is a list of expressions which are really the result set of the
73149: ** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause.
73150: ** This routine checks to see if pE is a simple identifier which corresponds
73151: ** to the AS-name of one of the terms of the expression list. If it is,
73152: ** this routine return an integer between 1 and N where N is the number of
73153: ** elements in pEList, corresponding to the matching entry. If there is
73154: ** no match, or if pE is not a simple identifier, then this routine
73155: ** return 0.
73156: **
73157: ** pEList has been resolved. pE has not.
73158: */
73159: static int resolveAsName(
73160: Parse *pParse, /* Parsing context for error messages */
73161: ExprList *pEList, /* List of expressions to scan */
73162: Expr *pE /* Expression we are trying to match */
73163: ){
73164: int i; /* Loop counter */
73165:
73166: UNUSED_PARAMETER(pParse);
73167:
73168: if( pE->op==TK_ID ){
73169: char *zCol = pE->u.zToken;
73170: for(i=0; i<pEList->nExpr; i++){
73171: char *zAs = pEList->a[i].zName;
73172: if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
73173: return i+1;
73174: }
73175: }
73176: }
73177: return 0;
73178: }
73179:
73180: /*
73181: ** pE is a pointer to an expression which is a single term in the
73182: ** ORDER BY of a compound SELECT. The expression has not been
73183: ** name resolved.
73184: **
73185: ** At the point this routine is called, we already know that the
73186: ** ORDER BY term is not an integer index into the result set. That
73187: ** case is handled by the calling routine.
73188: **
73189: ** Attempt to match pE against result set columns in the left-most
73190: ** SELECT statement. Return the index i of the matching column,
73191: ** as an indication to the caller that it should sort by the i-th column.
73192: ** The left-most column is 1. In other words, the value returned is the
73193: ** same integer value that would be used in the SQL statement to indicate
73194: ** the column.
73195: **
73196: ** If there is no match, return 0. Return -1 if an error occurs.
73197: */
73198: static int resolveOrderByTermToExprList(
73199: Parse *pParse, /* Parsing context for error messages */
73200: Select *pSelect, /* The SELECT statement with the ORDER BY clause */
73201: Expr *pE /* The specific ORDER BY term */
73202: ){
73203: int i; /* Loop counter */
73204: ExprList *pEList; /* The columns of the result set */
73205: NameContext nc; /* Name context for resolving pE */
73206: sqlite3 *db; /* Database connection */
73207: int rc; /* Return code from subprocedures */
73208: u8 savedSuppErr; /* Saved value of db->suppressErr */
73209:
73210: assert( sqlite3ExprIsInteger(pE, &i)==0 );
73211: pEList = pSelect->pEList;
73212:
73213: /* Resolve all names in the ORDER BY term expression
73214: */
73215: memset(&nc, 0, sizeof(nc));
73216: nc.pParse = pParse;
73217: nc.pSrcList = pSelect->pSrc;
73218: nc.pEList = pEList;
1.2.2.1 ! misho 73219: nc.ncFlags = NC_AllowAgg;
1.2 misho 73220: nc.nErr = 0;
73221: db = pParse->db;
73222: savedSuppErr = db->suppressErr;
73223: db->suppressErr = 1;
73224: rc = sqlite3ResolveExprNames(&nc, pE);
73225: db->suppressErr = savedSuppErr;
73226: if( rc ) return 0;
73227:
73228: /* Try to match the ORDER BY expression against an expression
73229: ** in the result set. Return an 1-based index of the matching
73230: ** result-set entry.
73231: */
73232: for(i=0; i<pEList->nExpr; i++){
73233: if( sqlite3ExprCompare(pEList->a[i].pExpr, pE)<2 ){
73234: return i+1;
73235: }
73236: }
73237:
73238: /* If no match, return 0. */
73239: return 0;
73240: }
73241:
73242: /*
73243: ** Generate an ORDER BY or GROUP BY term out-of-range error.
73244: */
73245: static void resolveOutOfRangeError(
73246: Parse *pParse, /* The error context into which to write the error */
73247: const char *zType, /* "ORDER" or "GROUP" */
73248: int i, /* The index (1-based) of the term out of range */
73249: int mx /* Largest permissible value of i */
73250: ){
73251: sqlite3ErrorMsg(pParse,
73252: "%r %s BY term out of range - should be "
73253: "between 1 and %d", i, zType, mx);
73254: }
73255:
73256: /*
73257: ** Analyze the ORDER BY clause in a compound SELECT statement. Modify
73258: ** each term of the ORDER BY clause is a constant integer between 1
73259: ** and N where N is the number of columns in the compound SELECT.
73260: **
73261: ** ORDER BY terms that are already an integer between 1 and N are
73262: ** unmodified. ORDER BY terms that are integers outside the range of
73263: ** 1 through N generate an error. ORDER BY terms that are expressions
73264: ** are matched against result set expressions of compound SELECT
73265: ** beginning with the left-most SELECT and working toward the right.
73266: ** At the first match, the ORDER BY expression is transformed into
73267: ** the integer column number.
73268: **
73269: ** Return the number of errors seen.
73270: */
73271: static int resolveCompoundOrderBy(
73272: Parse *pParse, /* Parsing context. Leave error messages here */
73273: Select *pSelect /* The SELECT statement containing the ORDER BY */
73274: ){
73275: int i;
73276: ExprList *pOrderBy;
73277: ExprList *pEList;
73278: sqlite3 *db;
73279: int moreToDo = 1;
73280:
73281: pOrderBy = pSelect->pOrderBy;
73282: if( pOrderBy==0 ) return 0;
73283: db = pParse->db;
73284: #if SQLITE_MAX_COLUMN
73285: if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
73286: sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause");
73287: return 1;
73288: }
73289: #endif
73290: for(i=0; i<pOrderBy->nExpr; i++){
73291: pOrderBy->a[i].done = 0;
73292: }
73293: pSelect->pNext = 0;
73294: while( pSelect->pPrior ){
73295: pSelect->pPrior->pNext = pSelect;
73296: pSelect = pSelect->pPrior;
73297: }
73298: while( pSelect && moreToDo ){
73299: struct ExprList_item *pItem;
73300: moreToDo = 0;
73301: pEList = pSelect->pEList;
73302: assert( pEList!=0 );
73303: for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
73304: int iCol = -1;
73305: Expr *pE, *pDup;
73306: if( pItem->done ) continue;
1.2.2.1 ! misho 73307: pE = sqlite3ExprSkipCollate(pItem->pExpr);
1.2 misho 73308: if( sqlite3ExprIsInteger(pE, &iCol) ){
73309: if( iCol<=0 || iCol>pEList->nExpr ){
73310: resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
73311: return 1;
73312: }
73313: }else{
73314: iCol = resolveAsName(pParse, pEList, pE);
73315: if( iCol==0 ){
73316: pDup = sqlite3ExprDup(db, pE, 0);
73317: if( !db->mallocFailed ){
73318: assert(pDup);
73319: iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup);
73320: }
73321: sqlite3ExprDelete(db, pDup);
73322: }
73323: }
73324: if( iCol>0 ){
1.2.2.1 ! misho 73325: /* Convert the ORDER BY term into an integer column number iCol,
! 73326: ** taking care to preserve the COLLATE clause if it exists */
! 73327: Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0);
! 73328: if( pNew==0 ) return 1;
! 73329: pNew->flags |= EP_IntValue;
! 73330: pNew->u.iValue = iCol;
! 73331: if( pItem->pExpr==pE ){
! 73332: pItem->pExpr = pNew;
! 73333: }else{
! 73334: assert( pItem->pExpr->op==TK_COLLATE );
! 73335: assert( pItem->pExpr->pLeft==pE );
! 73336: pItem->pExpr->pLeft = pNew;
! 73337: }
1.2 misho 73338: sqlite3ExprDelete(db, pE);
73339: pItem->iOrderByCol = (u16)iCol;
73340: pItem->done = 1;
73341: }else{
73342: moreToDo = 1;
73343: }
73344: }
73345: pSelect = pSelect->pNext;
73346: }
73347: for(i=0; i<pOrderBy->nExpr; i++){
73348: if( pOrderBy->a[i].done==0 ){
73349: sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any "
73350: "column in the result set", i+1);
73351: return 1;
73352: }
73353: }
73354: return 0;
73355: }
73356:
73357: /*
73358: ** Check every term in the ORDER BY or GROUP BY clause pOrderBy of
73359: ** the SELECT statement pSelect. If any term is reference to a
73360: ** result set expression (as determined by the ExprList.a.iCol field)
73361: ** then convert that term into a copy of the corresponding result set
73362: ** column.
73363: **
73364: ** If any errors are detected, add an error message to pParse and
73365: ** return non-zero. Return zero if no errors are seen.
73366: */
73367: SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(
73368: Parse *pParse, /* Parsing context. Leave error messages here */
73369: Select *pSelect, /* The SELECT statement containing the clause */
73370: ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */
73371: const char *zType /* "ORDER" or "GROUP" */
73372: ){
73373: int i;
73374: sqlite3 *db = pParse->db;
73375: ExprList *pEList;
73376: struct ExprList_item *pItem;
73377:
73378: if( pOrderBy==0 || pParse->db->mallocFailed ) return 0;
73379: #if SQLITE_MAX_COLUMN
73380: if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
73381: sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType);
73382: return 1;
73383: }
73384: #endif
73385: pEList = pSelect->pEList;
73386: assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */
73387: for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
73388: if( pItem->iOrderByCol ){
73389: if( pItem->iOrderByCol>pEList->nExpr ){
73390: resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr);
73391: return 1;
73392: }
1.2.2.1 ! misho 73393: resolveAlias(pParse, pEList, pItem->iOrderByCol-1, pItem->pExpr, zType,0);
1.2 misho 73394: }
73395: }
73396: return 0;
73397: }
73398:
73399: /*
73400: ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect.
73401: ** The Name context of the SELECT statement is pNC. zType is either
73402: ** "ORDER" or "GROUP" depending on which type of clause pOrderBy is.
73403: **
73404: ** This routine resolves each term of the clause into an expression.
73405: ** If the order-by term is an integer I between 1 and N (where N is the
73406: ** number of columns in the result set of the SELECT) then the expression
73407: ** in the resolution is a copy of the I-th result-set expression. If
73408: ** the order-by term is an identify that corresponds to the AS-name of
73409: ** a result-set expression, then the term resolves to a copy of the
73410: ** result-set expression. Otherwise, the expression is resolved in
73411: ** the usual way - using sqlite3ResolveExprNames().
73412: **
73413: ** This routine returns the number of errors. If errors occur, then
73414: ** an appropriate error message might be left in pParse. (OOM errors
73415: ** excepted.)
73416: */
73417: static int resolveOrderGroupBy(
73418: NameContext *pNC, /* The name context of the SELECT statement */
73419: Select *pSelect, /* The SELECT statement holding pOrderBy */
73420: ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */
73421: const char *zType /* Either "ORDER" or "GROUP", as appropriate */
73422: ){
1.2.2.1 ! misho 73423: int i, j; /* Loop counters */
1.2 misho 73424: int iCol; /* Column number */
73425: struct ExprList_item *pItem; /* A term of the ORDER BY clause */
73426: Parse *pParse; /* Parsing context */
73427: int nResult; /* Number of terms in the result set */
73428:
73429: if( pOrderBy==0 ) return 0;
73430: nResult = pSelect->pEList->nExpr;
73431: pParse = pNC->pParse;
73432: for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
73433: Expr *pE = pItem->pExpr;
73434: iCol = resolveAsName(pParse, pSelect->pEList, pE);
73435: if( iCol>0 ){
73436: /* If an AS-name match is found, mark this ORDER BY column as being
73437: ** a copy of the iCol-th result-set column. The subsequent call to
73438: ** sqlite3ResolveOrderGroupBy() will convert the expression to a
73439: ** copy of the iCol-th result-set expression. */
73440: pItem->iOrderByCol = (u16)iCol;
73441: continue;
73442: }
1.2.2.1 ! misho 73443: if( sqlite3ExprIsInteger(sqlite3ExprSkipCollate(pE), &iCol) ){
1.2 misho 73444: /* The ORDER BY term is an integer constant. Again, set the column
73445: ** number so that sqlite3ResolveOrderGroupBy() will convert the
73446: ** order-by term to a copy of the result-set expression */
1.2.2.1 ! misho 73447: if( iCol<1 || iCol>0xffff ){
1.2 misho 73448: resolveOutOfRangeError(pParse, zType, i+1, nResult);
73449: return 1;
73450: }
73451: pItem->iOrderByCol = (u16)iCol;
73452: continue;
73453: }
73454:
73455: /* Otherwise, treat the ORDER BY term as an ordinary expression */
73456: pItem->iOrderByCol = 0;
73457: if( sqlite3ResolveExprNames(pNC, pE) ){
73458: return 1;
73459: }
1.2.2.1 ! misho 73460: for(j=0; j<pSelect->pEList->nExpr; j++){
! 73461: if( sqlite3ExprCompare(pE, pSelect->pEList->a[j].pExpr)==0 ){
! 73462: pItem->iOrderByCol = j+1;
! 73463: }
! 73464: }
1.2 misho 73465: }
73466: return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType);
73467: }
73468:
73469: /*
73470: ** Resolve names in the SELECT statement p and all of its descendents.
73471: */
73472: static int resolveSelectStep(Walker *pWalker, Select *p){
73473: NameContext *pOuterNC; /* Context that contains this SELECT */
73474: NameContext sNC; /* Name context of this SELECT */
73475: int isCompound; /* True if p is a compound select */
73476: int nCompound; /* Number of compound terms processed so far */
73477: Parse *pParse; /* Parsing context */
73478: ExprList *pEList; /* Result set expression list */
73479: int i; /* Loop counter */
73480: ExprList *pGroupBy; /* The GROUP BY clause */
73481: Select *pLeftmost; /* Left-most of SELECT of a compound */
73482: sqlite3 *db; /* Database connection */
73483:
73484:
73485: assert( p!=0 );
73486: if( p->selFlags & SF_Resolved ){
73487: return WRC_Prune;
73488: }
73489: pOuterNC = pWalker->u.pNC;
73490: pParse = pWalker->pParse;
73491: db = pParse->db;
73492:
73493: /* Normally sqlite3SelectExpand() will be called first and will have
73494: ** already expanded this SELECT. However, if this is a subquery within
73495: ** an expression, sqlite3ResolveExprNames() will be called without a
73496: ** prior call to sqlite3SelectExpand(). When that happens, let
73497: ** sqlite3SelectPrep() do all of the processing for this SELECT.
73498: ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and
73499: ** this routine in the correct order.
73500: */
73501: if( (p->selFlags & SF_Expanded)==0 ){
73502: sqlite3SelectPrep(pParse, p, pOuterNC);
73503: return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune;
73504: }
73505:
73506: isCompound = p->pPrior!=0;
73507: nCompound = 0;
73508: pLeftmost = p;
73509: while( p ){
73510: assert( (p->selFlags & SF_Expanded)!=0 );
73511: assert( (p->selFlags & SF_Resolved)==0 );
73512: p->selFlags |= SF_Resolved;
73513:
73514: /* Resolve the expressions in the LIMIT and OFFSET clauses. These
73515: ** are not allowed to refer to any names, so pass an empty NameContext.
73516: */
73517: memset(&sNC, 0, sizeof(sNC));
73518: sNC.pParse = pParse;
73519: if( sqlite3ResolveExprNames(&sNC, p->pLimit) ||
73520: sqlite3ResolveExprNames(&sNC, p->pOffset) ){
73521: return WRC_Abort;
73522: }
73523:
73524: /* Set up the local name-context to pass to sqlite3ResolveExprNames() to
73525: ** resolve the result-set expression list.
73526: */
1.2.2.1 ! misho 73527: sNC.ncFlags = NC_AllowAgg;
1.2 misho 73528: sNC.pSrcList = p->pSrc;
73529: sNC.pNext = pOuterNC;
73530:
73531: /* Resolve names in the result set. */
73532: pEList = p->pEList;
73533: assert( pEList!=0 );
73534: for(i=0; i<pEList->nExpr; i++){
73535: Expr *pX = pEList->a[i].pExpr;
73536: if( sqlite3ResolveExprNames(&sNC, pX) ){
73537: return WRC_Abort;
73538: }
73539: }
73540:
73541: /* Recursively resolve names in all subqueries
73542: */
73543: for(i=0; i<p->pSrc->nSrc; i++){
73544: struct SrcList_item *pItem = &p->pSrc->a[i];
73545: if( pItem->pSelect ){
73546: NameContext *pNC; /* Used to iterate name contexts */
73547: int nRef = 0; /* Refcount for pOuterNC and outer contexts */
73548: const char *zSavedContext = pParse->zAuthContext;
73549:
73550: /* Count the total number of references to pOuterNC and all of its
73551: ** parent contexts. After resolving references to expressions in
73552: ** pItem->pSelect, check if this value has changed. If so, then
73553: ** SELECT statement pItem->pSelect must be correlated. Set the
73554: ** pItem->isCorrelated flag if this is the case. */
73555: for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef;
73556:
73557: if( pItem->zName ) pParse->zAuthContext = pItem->zName;
73558: sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC);
73559: pParse->zAuthContext = zSavedContext;
73560: if( pParse->nErr || db->mallocFailed ) return WRC_Abort;
73561:
73562: for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef;
73563: assert( pItem->isCorrelated==0 && nRef<=0 );
73564: pItem->isCorrelated = (nRef!=0);
73565: }
73566: }
73567:
73568: /* If there are no aggregate functions in the result-set, and no GROUP BY
73569: ** expression, do not allow aggregates in any of the other expressions.
73570: */
73571: assert( (p->selFlags & SF_Aggregate)==0 );
73572: pGroupBy = p->pGroupBy;
1.2.2.1 ! misho 73573: if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){
1.2 misho 73574: p->selFlags |= SF_Aggregate;
73575: }else{
1.2.2.1 ! misho 73576: sNC.ncFlags &= ~NC_AllowAgg;
1.2 misho 73577: }
73578:
73579: /* If a HAVING clause is present, then there must be a GROUP BY clause.
73580: */
73581: if( p->pHaving && !pGroupBy ){
73582: sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING");
73583: return WRC_Abort;
73584: }
73585:
73586: /* Add the expression list to the name-context before parsing the
73587: ** other expressions in the SELECT statement. This is so that
73588: ** expressions in the WHERE clause (etc.) can refer to expressions by
73589: ** aliases in the result set.
73590: **
73591: ** Minor point: If this is the case, then the expression will be
73592: ** re-evaluated for each reference to it.
73593: */
73594: sNC.pEList = p->pEList;
73595: if( sqlite3ResolveExprNames(&sNC, p->pWhere) ||
73596: sqlite3ResolveExprNames(&sNC, p->pHaving)
73597: ){
73598: return WRC_Abort;
73599: }
73600:
73601: /* The ORDER BY and GROUP BY clauses may not refer to terms in
73602: ** outer queries
73603: */
73604: sNC.pNext = 0;
1.2.2.1 ! misho 73605: sNC.ncFlags |= NC_AllowAgg;
1.2 misho 73606:
73607: /* Process the ORDER BY clause for singleton SELECT statements.
73608: ** The ORDER BY clause for compounds SELECT statements is handled
73609: ** below, after all of the result-sets for all of the elements of
73610: ** the compound have been resolved.
73611: */
73612: if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){
73613: return WRC_Abort;
73614: }
73615: if( db->mallocFailed ){
73616: return WRC_Abort;
73617: }
73618:
73619: /* Resolve the GROUP BY clause. At the same time, make sure
73620: ** the GROUP BY clause does not contain aggregate functions.
73621: */
73622: if( pGroupBy ){
73623: struct ExprList_item *pItem;
73624:
73625: if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){
73626: return WRC_Abort;
73627: }
73628: for(i=0, pItem=pGroupBy->a; i<pGroupBy->nExpr; i++, pItem++){
73629: if( ExprHasProperty(pItem->pExpr, EP_Agg) ){
73630: sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in "
73631: "the GROUP BY clause");
73632: return WRC_Abort;
73633: }
73634: }
73635: }
73636:
73637: /* Advance to the next term of the compound
73638: */
73639: p = p->pPrior;
73640: nCompound++;
73641: }
73642:
73643: /* Resolve the ORDER BY on a compound SELECT after all terms of
73644: ** the compound have been resolved.
73645: */
73646: if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){
73647: return WRC_Abort;
73648: }
73649:
73650: return WRC_Prune;
73651: }
73652:
73653: /*
73654: ** This routine walks an expression tree and resolves references to
73655: ** table columns and result-set columns. At the same time, do error
73656: ** checking on function usage and set a flag if any aggregate functions
73657: ** are seen.
73658: **
73659: ** To resolve table columns references we look for nodes (or subtrees) of the
73660: ** form X.Y.Z or Y.Z or just Z where
73661: **
73662: ** X: The name of a database. Ex: "main" or "temp" or
73663: ** the symbolic name assigned to an ATTACH-ed database.
73664: **
73665: ** Y: The name of a table in a FROM clause. Or in a trigger
73666: ** one of the special names "old" or "new".
73667: **
73668: ** Z: The name of a column in table Y.
73669: **
73670: ** The node at the root of the subtree is modified as follows:
73671: **
73672: ** Expr.op Changed to TK_COLUMN
73673: ** Expr.pTab Points to the Table object for X.Y
73674: ** Expr.iColumn The column index in X.Y. -1 for the rowid.
73675: ** Expr.iTable The VDBE cursor number for X.Y
73676: **
73677: **
73678: ** To resolve result-set references, look for expression nodes of the
73679: ** form Z (with no X and Y prefix) where the Z matches the right-hand
73680: ** size of an AS clause in the result-set of a SELECT. The Z expression
73681: ** is replaced by a copy of the left-hand side of the result-set expression.
73682: ** Table-name and function resolution occurs on the substituted expression
73683: ** tree. For example, in:
73684: **
73685: ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x;
73686: **
73687: ** The "x" term of the order by is replaced by "a+b" to render:
73688: **
73689: ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b;
73690: **
73691: ** Function calls are checked to make sure that the function is
73692: ** defined and that the correct number of arguments are specified.
1.2.2.1 ! misho 73693: ** If the function is an aggregate function, then the NC_HasAgg flag is
1.2 misho 73694: ** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION.
73695: ** If an expression contains aggregate functions then the EP_Agg
73696: ** property on the expression is set.
73697: **
73698: ** An error message is left in pParse if anything is amiss. The number
73699: ** if errors is returned.
73700: */
73701: SQLITE_PRIVATE int sqlite3ResolveExprNames(
73702: NameContext *pNC, /* Namespace to resolve expressions in. */
73703: Expr *pExpr /* The expression to be analyzed. */
73704: ){
1.2.2.1 ! misho 73705: u8 savedHasAgg;
1.2 misho 73706: Walker w;
73707:
73708: if( pExpr==0 ) return 0;
73709: #if SQLITE_MAX_EXPR_DEPTH>0
73710: {
73711: Parse *pParse = pNC->pParse;
73712: if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){
73713: return 1;
73714: }
73715: pParse->nHeight += pExpr->nHeight;
73716: }
73717: #endif
1.2.2.1 ! misho 73718: savedHasAgg = pNC->ncFlags & NC_HasAgg;
! 73719: pNC->ncFlags &= ~NC_HasAgg;
1.2 misho 73720: w.xExprCallback = resolveExprStep;
73721: w.xSelectCallback = resolveSelectStep;
73722: w.pParse = pNC->pParse;
73723: w.u.pNC = pNC;
73724: sqlite3WalkExpr(&w, pExpr);
73725: #if SQLITE_MAX_EXPR_DEPTH>0
73726: pNC->pParse->nHeight -= pExpr->nHeight;
73727: #endif
73728: if( pNC->nErr>0 || w.pParse->nErr>0 ){
73729: ExprSetProperty(pExpr, EP_Error);
73730: }
1.2.2.1 ! misho 73731: if( pNC->ncFlags & NC_HasAgg ){
1.2 misho 73732: ExprSetProperty(pExpr, EP_Agg);
73733: }else if( savedHasAgg ){
1.2.2.1 ! misho 73734: pNC->ncFlags |= NC_HasAgg;
1.2 misho 73735: }
73736: return ExprHasProperty(pExpr, EP_Error);
73737: }
73738:
73739:
73740: /*
73741: ** Resolve all names in all expressions of a SELECT and in all
73742: ** decendents of the SELECT, including compounds off of p->pPrior,
73743: ** subqueries in expressions, and subqueries used as FROM clause
73744: ** terms.
73745: **
73746: ** See sqlite3ResolveExprNames() for a description of the kinds of
73747: ** transformations that occur.
73748: **
73749: ** All SELECT statements should have been expanded using
73750: ** sqlite3SelectExpand() prior to invoking this routine.
73751: */
73752: SQLITE_PRIVATE void sqlite3ResolveSelectNames(
73753: Parse *pParse, /* The parser context */
73754: Select *p, /* The SELECT statement being coded. */
73755: NameContext *pOuterNC /* Name context for parent SELECT statement */
73756: ){
73757: Walker w;
73758:
73759: assert( p!=0 );
73760: w.xExprCallback = resolveExprStep;
73761: w.xSelectCallback = resolveSelectStep;
73762: w.pParse = pParse;
73763: w.u.pNC = pOuterNC;
73764: sqlite3WalkSelect(&w, p);
73765: }
73766:
73767: /************** End of resolve.c *********************************************/
73768: /************** Begin file expr.c ********************************************/
73769: /*
73770: ** 2001 September 15
73771: **
73772: ** The author disclaims copyright to this source code. In place of
73773: ** a legal notice, here is a blessing:
73774: **
73775: ** May you do good and not evil.
73776: ** May you find forgiveness for yourself and forgive others.
73777: ** May you share freely, never taking more than you give.
73778: **
73779: *************************************************************************
73780: ** This file contains routines used for analyzing expressions and
73781: ** for generating VDBE code that evaluates expressions in SQLite.
73782: */
73783:
73784: /*
73785: ** Return the 'affinity' of the expression pExpr if any.
73786: **
73787: ** If pExpr is a column, a reference to a column via an 'AS' alias,
73788: ** or a sub-select with a column as the return value, then the
73789: ** affinity of that column is returned. Otherwise, 0x00 is returned,
73790: ** indicating no affinity for the expression.
73791: **
73792: ** i.e. the WHERE clause expresssions in the following statements all
73793: ** have an affinity:
73794: **
73795: ** CREATE TABLE t1(a);
73796: ** SELECT * FROM t1 WHERE a;
73797: ** SELECT a AS b FROM t1 WHERE b;
73798: ** SELECT * FROM t1 WHERE (select a from t1);
73799: */
73800: SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){
1.2.2.1 ! misho 73801: int op;
! 73802: pExpr = sqlite3ExprSkipCollate(pExpr);
! 73803: op = pExpr->op;
1.2 misho 73804: if( op==TK_SELECT ){
73805: assert( pExpr->flags&EP_xIsSelect );
73806: return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr);
73807: }
73808: #ifndef SQLITE_OMIT_CAST
73809: if( op==TK_CAST ){
73810: assert( !ExprHasProperty(pExpr, EP_IntValue) );
73811: return sqlite3AffinityType(pExpr->u.zToken);
73812: }
73813: #endif
73814: if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER)
73815: && pExpr->pTab!=0
73816: ){
73817: /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally
73818: ** a TK_COLUMN but was previously evaluated and cached in a register */
73819: int j = pExpr->iColumn;
73820: if( j<0 ) return SQLITE_AFF_INTEGER;
73821: assert( pExpr->pTab && j<pExpr->pTab->nCol );
73822: return pExpr->pTab->aCol[j].affinity;
73823: }
73824: return pExpr->affinity;
73825: }
73826:
73827: /*
1.2.2.1 ! misho 73828: ** Set the collating sequence for expression pExpr to be the collating
! 73829: ** sequence named by pToken. Return a pointer to a new Expr node that
! 73830: ** implements the COLLATE operator.
! 73831: **
! 73832: ** If a memory allocation error occurs, that fact is recorded in pParse->db
! 73833: ** and the pExpr parameter is returned unchanged.
1.2 misho 73834: */
1.2.2.1 ! misho 73835: SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr *pExpr, Token *pCollName){
! 73836: if( pCollName->n>0 ){
! 73837: Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, 1);
! 73838: if( pNew ){
! 73839: pNew->pLeft = pExpr;
! 73840: pNew->flags |= EP_Collate;
! 73841: pExpr = pNew;
! 73842: }
1.2 misho 73843: }
73844: return pExpr;
73845: }
1.2.2.1 ! misho 73846: SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){
! 73847: Token s;
! 73848: assert( zC!=0 );
! 73849: s.z = zC;
! 73850: s.n = sqlite3Strlen30(s.z);
! 73851: return sqlite3ExprAddCollateToken(pParse, pExpr, &s);
! 73852: }
1.2 misho 73853:
73854: /*
1.2.2.1 ! misho 73855: ** Skip over any TK_COLLATE and/or TK_AS operators at the root of
! 73856: ** an expression.
1.2 misho 73857: */
1.2.2.1 ! misho 73858: SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){
! 73859: while( pExpr && (pExpr->op==TK_COLLATE || pExpr->op==TK_AS) ){
! 73860: pExpr = pExpr->pLeft;
! 73861: }
1.2 misho 73862: return pExpr;
73863: }
73864:
73865: /*
1.2.2.1 ! misho 73866: ** Return the collation sequence for the expression pExpr. If
! 73867: ** there is no defined collating sequence, return NULL.
! 73868: **
! 73869: ** The collating sequence might be determined by a COLLATE operator
! 73870: ** or by the presence of a column with a defined collating sequence.
! 73871: ** COLLATE operators take first precedence. Left operands take
! 73872: ** precedence over right operands.
1.2 misho 73873: */
73874: SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){
1.2.2.1 ! misho 73875: sqlite3 *db = pParse->db;
1.2 misho 73876: CollSeq *pColl = 0;
73877: Expr *p = pExpr;
73878: while( p ){
1.2.2.1 ! misho 73879: int op = p->op;
! 73880: if( op==TK_CAST || op==TK_UPLUS ){
! 73881: p = p->pLeft;
! 73882: continue;
! 73883: }
! 73884: assert( op!=TK_REGISTER || p->op2!=TK_COLLATE );
! 73885: if( op==TK_COLLATE ){
! 73886: if( db->init.busy ){
! 73887: /* Do not report errors when parsing while the schema */
! 73888: pColl = sqlite3FindCollSeq(db, ENC(db), p->u.zToken, 0);
! 73889: }else{
! 73890: pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken);
! 73891: }
! 73892: break;
! 73893: }
! 73894: if( p->pTab!=0
! 73895: && (op==TK_AGG_COLUMN || op==TK_COLUMN
! 73896: || op==TK_REGISTER || op==TK_TRIGGER)
! 73897: ){
1.2 misho 73898: /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally
73899: ** a TK_COLUMN but was previously evaluated and cached in a register */
73900: int j = p->iColumn;
73901: if( j>=0 ){
1.2.2.1 ! misho 73902: const char *zColl = p->pTab->aCol[j].zColl;
1.2 misho 73903: pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
73904: }
73905: break;
73906: }
1.2.2.1 ! misho 73907: if( p->flags & EP_Collate ){
! 73908: if( ALWAYS(p->pLeft) && (p->pLeft->flags & EP_Collate)!=0 ){
! 73909: p = p->pLeft;
! 73910: }else{
! 73911: p = p->pRight;
! 73912: }
! 73913: }else{
1.2 misho 73914: break;
73915: }
73916: }
73917: if( sqlite3CheckCollSeq(pParse, pColl) ){
73918: pColl = 0;
73919: }
73920: return pColl;
73921: }
73922:
73923: /*
73924: ** pExpr is an operand of a comparison operator. aff2 is the
73925: ** type affinity of the other operand. This routine returns the
73926: ** type affinity that should be used for the comparison operator.
73927: */
73928: SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){
73929: char aff1 = sqlite3ExprAffinity(pExpr);
73930: if( aff1 && aff2 ){
73931: /* Both sides of the comparison are columns. If one has numeric
73932: ** affinity, use that. Otherwise use no affinity.
73933: */
73934: if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){
73935: return SQLITE_AFF_NUMERIC;
73936: }else{
73937: return SQLITE_AFF_NONE;
73938: }
73939: }else if( !aff1 && !aff2 ){
73940: /* Neither side of the comparison is a column. Compare the
73941: ** results directly.
73942: */
73943: return SQLITE_AFF_NONE;
73944: }else{
73945: /* One side is a column, the other is not. Use the columns affinity. */
73946: assert( aff1==0 || aff2==0 );
73947: return (aff1 + aff2);
73948: }
73949: }
73950:
73951: /*
73952: ** pExpr is a comparison operator. Return the type affinity that should
73953: ** be applied to both operands prior to doing the comparison.
73954: */
73955: static char comparisonAffinity(Expr *pExpr){
73956: char aff;
73957: assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT ||
73958: pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
73959: pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT );
73960: assert( pExpr->pLeft );
73961: aff = sqlite3ExprAffinity(pExpr->pLeft);
73962: if( pExpr->pRight ){
73963: aff = sqlite3CompareAffinity(pExpr->pRight, aff);
73964: }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){
73965: aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff);
73966: }else if( !aff ){
73967: aff = SQLITE_AFF_NONE;
73968: }
73969: return aff;
73970: }
73971:
73972: /*
73973: ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc.
73974: ** idx_affinity is the affinity of an indexed column. Return true
73975: ** if the index with affinity idx_affinity may be used to implement
73976: ** the comparison in pExpr.
73977: */
73978: SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
73979: char aff = comparisonAffinity(pExpr);
73980: switch( aff ){
73981: case SQLITE_AFF_NONE:
73982: return 1;
73983: case SQLITE_AFF_TEXT:
73984: return idx_affinity==SQLITE_AFF_TEXT;
73985: default:
73986: return sqlite3IsNumericAffinity(idx_affinity);
73987: }
73988: }
73989:
73990: /*
73991: ** Return the P5 value that should be used for a binary comparison
73992: ** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2.
73993: */
73994: static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
73995: u8 aff = (char)sqlite3ExprAffinity(pExpr2);
73996: aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull;
73997: return aff;
73998: }
73999:
74000: /*
74001: ** Return a pointer to the collation sequence that should be used by
74002: ** a binary comparison operator comparing pLeft and pRight.
74003: **
74004: ** If the left hand expression has a collating sequence type, then it is
74005: ** used. Otherwise the collation sequence for the right hand expression
74006: ** is used, or the default (BINARY) if neither expression has a collating
74007: ** type.
74008: **
74009: ** Argument pRight (but not pLeft) may be a null pointer. In this case,
74010: ** it is not considered.
74011: */
74012: SQLITE_PRIVATE CollSeq *sqlite3BinaryCompareCollSeq(
74013: Parse *pParse,
74014: Expr *pLeft,
74015: Expr *pRight
74016: ){
74017: CollSeq *pColl;
74018: assert( pLeft );
1.2.2.1 ! misho 74019: if( pLeft->flags & EP_Collate ){
! 74020: pColl = sqlite3ExprCollSeq(pParse, pLeft);
! 74021: }else if( pRight && (pRight->flags & EP_Collate)!=0 ){
! 74022: pColl = sqlite3ExprCollSeq(pParse, pRight);
1.2 misho 74023: }else{
74024: pColl = sqlite3ExprCollSeq(pParse, pLeft);
74025: if( !pColl ){
74026: pColl = sqlite3ExprCollSeq(pParse, pRight);
74027: }
74028: }
74029: return pColl;
74030: }
74031:
74032: /*
74033: ** Generate code for a comparison operator.
74034: */
74035: static int codeCompare(
74036: Parse *pParse, /* The parsing (and code generating) context */
74037: Expr *pLeft, /* The left operand */
74038: Expr *pRight, /* The right operand */
74039: int opcode, /* The comparison opcode */
74040: int in1, int in2, /* Register holding operands */
74041: int dest, /* Jump here if true. */
74042: int jumpIfNull /* If true, jump if either operand is NULL */
74043: ){
74044: int p5;
74045: int addr;
74046: CollSeq *p4;
74047:
74048: p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight);
74049: p5 = binaryCompareP5(pLeft, pRight, jumpIfNull);
74050: addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1,
74051: (void*)p4, P4_COLLSEQ);
74052: sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5);
74053: return addr;
74054: }
74055:
74056: #if SQLITE_MAX_EXPR_DEPTH>0
74057: /*
74058: ** Check that argument nHeight is less than or equal to the maximum
74059: ** expression depth allowed. If it is not, leave an error message in
74060: ** pParse.
74061: */
74062: SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){
74063: int rc = SQLITE_OK;
74064: int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH];
74065: if( nHeight>mxHeight ){
74066: sqlite3ErrorMsg(pParse,
74067: "Expression tree is too large (maximum depth %d)", mxHeight
74068: );
74069: rc = SQLITE_ERROR;
74070: }
74071: return rc;
74072: }
74073:
74074: /* The following three functions, heightOfExpr(), heightOfExprList()
74075: ** and heightOfSelect(), are used to determine the maximum height
74076: ** of any expression tree referenced by the structure passed as the
74077: ** first argument.
74078: **
74079: ** If this maximum height is greater than the current value pointed
74080: ** to by pnHeight, the second parameter, then set *pnHeight to that
74081: ** value.
74082: */
74083: static void heightOfExpr(Expr *p, int *pnHeight){
74084: if( p ){
74085: if( p->nHeight>*pnHeight ){
74086: *pnHeight = p->nHeight;
74087: }
74088: }
74089: }
74090: static void heightOfExprList(ExprList *p, int *pnHeight){
74091: if( p ){
74092: int i;
74093: for(i=0; i<p->nExpr; i++){
74094: heightOfExpr(p->a[i].pExpr, pnHeight);
74095: }
74096: }
74097: }
74098: static void heightOfSelect(Select *p, int *pnHeight){
74099: if( p ){
74100: heightOfExpr(p->pWhere, pnHeight);
74101: heightOfExpr(p->pHaving, pnHeight);
74102: heightOfExpr(p->pLimit, pnHeight);
74103: heightOfExpr(p->pOffset, pnHeight);
74104: heightOfExprList(p->pEList, pnHeight);
74105: heightOfExprList(p->pGroupBy, pnHeight);
74106: heightOfExprList(p->pOrderBy, pnHeight);
74107: heightOfSelect(p->pPrior, pnHeight);
74108: }
74109: }
74110:
74111: /*
74112: ** Set the Expr.nHeight variable in the structure passed as an
74113: ** argument. An expression with no children, Expr.pList or
74114: ** Expr.pSelect member has a height of 1. Any other expression
74115: ** has a height equal to the maximum height of any other
74116: ** referenced Expr plus one.
74117: */
74118: static void exprSetHeight(Expr *p){
74119: int nHeight = 0;
74120: heightOfExpr(p->pLeft, &nHeight);
74121: heightOfExpr(p->pRight, &nHeight);
74122: if( ExprHasProperty(p, EP_xIsSelect) ){
74123: heightOfSelect(p->x.pSelect, &nHeight);
74124: }else{
74125: heightOfExprList(p->x.pList, &nHeight);
74126: }
74127: p->nHeight = nHeight + 1;
74128: }
74129:
74130: /*
74131: ** Set the Expr.nHeight variable using the exprSetHeight() function. If
74132: ** the height is greater than the maximum allowed expression depth,
74133: ** leave an error in pParse.
74134: */
74135: SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p){
74136: exprSetHeight(p);
74137: sqlite3ExprCheckHeight(pParse, p->nHeight);
74138: }
74139:
74140: /*
74141: ** Return the maximum height of any expression tree referenced
74142: ** by the select statement passed as an argument.
74143: */
74144: SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){
74145: int nHeight = 0;
74146: heightOfSelect(p, &nHeight);
74147: return nHeight;
74148: }
74149: #else
74150: #define exprSetHeight(y)
74151: #endif /* SQLITE_MAX_EXPR_DEPTH>0 */
74152:
74153: /*
74154: ** This routine is the core allocator for Expr nodes.
74155: **
74156: ** Construct a new expression node and return a pointer to it. Memory
74157: ** for this node and for the pToken argument is a single allocation
74158: ** obtained from sqlite3DbMalloc(). The calling function
74159: ** is responsible for making sure the node eventually gets freed.
74160: **
74161: ** If dequote is true, then the token (if it exists) is dequoted.
74162: ** If dequote is false, no dequoting is performance. The deQuote
74163: ** parameter is ignored if pToken is NULL or if the token does not
74164: ** appear to be quoted. If the quotes were of the form "..." (double-quotes)
74165: ** then the EP_DblQuoted flag is set on the expression node.
74166: **
74167: ** Special case: If op==TK_INTEGER and pToken points to a string that
74168: ** can be translated into a 32-bit integer, then the token is not
74169: ** stored in u.zToken. Instead, the integer values is written
74170: ** into u.iValue and the EP_IntValue flag is set. No extra storage
74171: ** is allocated to hold the integer text and the dequote flag is ignored.
74172: */
74173: SQLITE_PRIVATE Expr *sqlite3ExprAlloc(
74174: sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */
74175: int op, /* Expression opcode */
74176: const Token *pToken, /* Token argument. Might be NULL */
74177: int dequote /* True to dequote */
74178: ){
74179: Expr *pNew;
74180: int nExtra = 0;
74181: int iValue = 0;
74182:
74183: if( pToken ){
74184: if( op!=TK_INTEGER || pToken->z==0
74185: || sqlite3GetInt32(pToken->z, &iValue)==0 ){
74186: nExtra = pToken->n+1;
74187: assert( iValue>=0 );
74188: }
74189: }
74190: pNew = sqlite3DbMallocZero(db, sizeof(Expr)+nExtra);
74191: if( pNew ){
74192: pNew->op = (u8)op;
74193: pNew->iAgg = -1;
74194: if( pToken ){
74195: if( nExtra==0 ){
74196: pNew->flags |= EP_IntValue;
74197: pNew->u.iValue = iValue;
74198: }else{
74199: int c;
74200: pNew->u.zToken = (char*)&pNew[1];
74201: assert( pToken->z!=0 || pToken->n==0 );
74202: if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n);
74203: pNew->u.zToken[pToken->n] = 0;
74204: if( dequote && nExtra>=3
74205: && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){
74206: sqlite3Dequote(pNew->u.zToken);
74207: if( c=='"' ) pNew->flags |= EP_DblQuoted;
74208: }
74209: }
74210: }
74211: #if SQLITE_MAX_EXPR_DEPTH>0
74212: pNew->nHeight = 1;
74213: #endif
74214: }
74215: return pNew;
74216: }
74217:
74218: /*
74219: ** Allocate a new expression node from a zero-terminated token that has
74220: ** already been dequoted.
74221: */
74222: SQLITE_PRIVATE Expr *sqlite3Expr(
74223: sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */
74224: int op, /* Expression opcode */
74225: const char *zToken /* Token argument. Might be NULL */
74226: ){
74227: Token x;
74228: x.z = zToken;
74229: x.n = zToken ? sqlite3Strlen30(zToken) : 0;
74230: return sqlite3ExprAlloc(db, op, &x, 0);
74231: }
74232:
74233: /*
74234: ** Attach subtrees pLeft and pRight to the Expr node pRoot.
74235: **
74236: ** If pRoot==NULL that means that a memory allocation error has occurred.
74237: ** In that case, delete the subtrees pLeft and pRight.
74238: */
74239: SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(
74240: sqlite3 *db,
74241: Expr *pRoot,
74242: Expr *pLeft,
74243: Expr *pRight
74244: ){
74245: if( pRoot==0 ){
74246: assert( db->mallocFailed );
74247: sqlite3ExprDelete(db, pLeft);
74248: sqlite3ExprDelete(db, pRight);
74249: }else{
74250: if( pRight ){
74251: pRoot->pRight = pRight;
1.2.2.1 ! misho 74252: pRoot->flags |= EP_Collate & pRight->flags;
1.2 misho 74253: }
74254: if( pLeft ){
74255: pRoot->pLeft = pLeft;
1.2.2.1 ! misho 74256: pRoot->flags |= EP_Collate & pLeft->flags;
1.2 misho 74257: }
74258: exprSetHeight(pRoot);
74259: }
74260: }
74261:
74262: /*
74263: ** Allocate a Expr node which joins as many as two subtrees.
74264: **
74265: ** One or both of the subtrees can be NULL. Return a pointer to the new
74266: ** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed,
74267: ** free the subtrees and return NULL.
74268: */
74269: SQLITE_PRIVATE Expr *sqlite3PExpr(
74270: Parse *pParse, /* Parsing context */
74271: int op, /* Expression opcode */
74272: Expr *pLeft, /* Left operand */
74273: Expr *pRight, /* Right operand */
74274: const Token *pToken /* Argument token */
74275: ){
1.2.2.1 ! misho 74276: Expr *p;
! 74277: if( op==TK_AND && pLeft && pRight ){
! 74278: /* Take advantage of short-circuit false optimization for AND */
! 74279: p = sqlite3ExprAnd(pParse->db, pLeft, pRight);
! 74280: }else{
! 74281: p = sqlite3ExprAlloc(pParse->db, op, pToken, 1);
! 74282: sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight);
! 74283: }
1.2 misho 74284: if( p ) {
74285: sqlite3ExprCheckHeight(pParse, p->nHeight);
74286: }
74287: return p;
74288: }
74289:
74290: /*
1.2.2.1 ! misho 74291: ** Return 1 if an expression must be FALSE in all cases and 0 if the
! 74292: ** expression might be true. This is an optimization. If is OK to
! 74293: ** return 0 here even if the expression really is always false (a
! 74294: ** false negative). But it is a bug to return 1 if the expression
! 74295: ** might be true in some rare circumstances (a false positive.)
! 74296: **
! 74297: ** Note that if the expression is part of conditional for a
! 74298: ** LEFT JOIN, then we cannot determine at compile-time whether or not
! 74299: ** is it true or false, so always return 0.
! 74300: */
! 74301: static int exprAlwaysFalse(Expr *p){
! 74302: int v = 0;
! 74303: if( ExprHasProperty(p, EP_FromJoin) ) return 0;
! 74304: if( !sqlite3ExprIsInteger(p, &v) ) return 0;
! 74305: return v==0;
! 74306: }
! 74307:
! 74308: /*
1.2 misho 74309: ** Join two expressions using an AND operator. If either expression is
74310: ** NULL, then just return the other expression.
1.2.2.1 ! misho 74311: **
! 74312: ** If one side or the other of the AND is known to be false, then instead
! 74313: ** of returning an AND expression, just return a constant expression with
! 74314: ** a value of false.
1.2 misho 74315: */
74316: SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){
74317: if( pLeft==0 ){
74318: return pRight;
74319: }else if( pRight==0 ){
74320: return pLeft;
1.2.2.1 ! misho 74321: }else if( exprAlwaysFalse(pLeft) || exprAlwaysFalse(pRight) ){
! 74322: sqlite3ExprDelete(db, pLeft);
! 74323: sqlite3ExprDelete(db, pRight);
! 74324: return sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[0], 0);
1.2 misho 74325: }else{
74326: Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0);
74327: sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight);
74328: return pNew;
74329: }
74330: }
74331:
74332: /*
74333: ** Construct a new expression node for a function with multiple
74334: ** arguments.
74335: */
74336: SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){
74337: Expr *pNew;
74338: sqlite3 *db = pParse->db;
74339: assert( pToken );
74340: pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1);
74341: if( pNew==0 ){
74342: sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */
74343: return 0;
74344: }
74345: pNew->x.pList = pList;
74346: assert( !ExprHasProperty(pNew, EP_xIsSelect) );
74347: sqlite3ExprSetHeight(pParse, pNew);
74348: return pNew;
74349: }
74350:
74351: /*
74352: ** Assign a variable number to an expression that encodes a wildcard
74353: ** in the original SQL statement.
74354: **
74355: ** Wildcards consisting of a single "?" are assigned the next sequential
74356: ** variable number.
74357: **
74358: ** Wildcards of the form "?nnn" are assigned the number "nnn". We make
74359: ** sure "nnn" is not too be to avoid a denial of service attack when
74360: ** the SQL statement comes from an external source.
74361: **
74362: ** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number
74363: ** as the previous instance of the same wildcard. Or if this is the first
74364: ** instance of the wildcard, the next sequenial variable number is
74365: ** assigned.
74366: */
74367: SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){
74368: sqlite3 *db = pParse->db;
74369: const char *z;
74370:
74371: if( pExpr==0 ) return;
74372: assert( !ExprHasAnyProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) );
74373: z = pExpr->u.zToken;
74374: assert( z!=0 );
74375: assert( z[0]!=0 );
74376: if( z[1]==0 ){
74377: /* Wildcard of the form "?". Assign the next variable number */
74378: assert( z[0]=='?' );
74379: pExpr->iColumn = (ynVar)(++pParse->nVar);
74380: }else{
74381: ynVar x = 0;
74382: u32 n = sqlite3Strlen30(z);
74383: if( z[0]=='?' ){
74384: /* Wildcard of the form "?nnn". Convert "nnn" to an integer and
74385: ** use it as the variable number */
74386: i64 i;
74387: int bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8);
74388: pExpr->iColumn = x = (ynVar)i;
74389: testcase( i==0 );
74390: testcase( i==1 );
74391: testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 );
74392: testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] );
74393: if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
74394: sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d",
74395: db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]);
74396: x = 0;
74397: }
74398: if( i>pParse->nVar ){
74399: pParse->nVar = (int)i;
74400: }
74401: }else{
74402: /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable
74403: ** number as the prior appearance of the same name, or if the name
74404: ** has never appeared before, reuse the same variable number
74405: */
74406: ynVar i;
74407: for(i=0; i<pParse->nzVar; i++){
74408: if( pParse->azVar[i] && memcmp(pParse->azVar[i],z,n+1)==0 ){
74409: pExpr->iColumn = x = (ynVar)i+1;
74410: break;
74411: }
74412: }
74413: if( x==0 ) x = pExpr->iColumn = (ynVar)(++pParse->nVar);
74414: }
74415: if( x>0 ){
74416: if( x>pParse->nzVar ){
74417: char **a;
74418: a = sqlite3DbRealloc(db, pParse->azVar, x*sizeof(a[0]));
74419: if( a==0 ) return; /* Error reported through db->mallocFailed */
74420: pParse->azVar = a;
74421: memset(&a[pParse->nzVar], 0, (x-pParse->nzVar)*sizeof(a[0]));
74422: pParse->nzVar = x;
74423: }
74424: if( z[0]!='?' || pParse->azVar[x-1]==0 ){
74425: sqlite3DbFree(db, pParse->azVar[x-1]);
74426: pParse->azVar[x-1] = sqlite3DbStrNDup(db, z, n);
74427: }
74428: }
74429: }
74430: if( !pParse->nErr && pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){
74431: sqlite3ErrorMsg(pParse, "too many SQL variables");
74432: }
74433: }
74434:
74435: /*
74436: ** Recursively delete an expression tree.
74437: */
74438: SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){
74439: if( p==0 ) return;
74440: /* Sanity check: Assert that the IntValue is non-negative if it exists */
74441: assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 );
74442: if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
74443: sqlite3ExprDelete(db, p->pLeft);
74444: sqlite3ExprDelete(db, p->pRight);
74445: if( !ExprHasProperty(p, EP_Reduced) && (p->flags2 & EP2_MallocedToken)!=0 ){
74446: sqlite3DbFree(db, p->u.zToken);
74447: }
74448: if( ExprHasProperty(p, EP_xIsSelect) ){
74449: sqlite3SelectDelete(db, p->x.pSelect);
74450: }else{
74451: sqlite3ExprListDelete(db, p->x.pList);
74452: }
74453: }
74454: if( !ExprHasProperty(p, EP_Static) ){
74455: sqlite3DbFree(db, p);
74456: }
74457: }
74458:
74459: /*
74460: ** Return the number of bytes allocated for the expression structure
74461: ** passed as the first argument. This is always one of EXPR_FULLSIZE,
74462: ** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE.
74463: */
74464: static int exprStructSize(Expr *p){
74465: if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE;
74466: if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE;
74467: return EXPR_FULLSIZE;
74468: }
74469:
74470: /*
74471: ** The dupedExpr*Size() routines each return the number of bytes required
74472: ** to store a copy of an expression or expression tree. They differ in
74473: ** how much of the tree is measured.
74474: **
74475: ** dupedExprStructSize() Size of only the Expr structure
74476: ** dupedExprNodeSize() Size of Expr + space for token
74477: ** dupedExprSize() Expr + token + subtree components
74478: **
74479: ***************************************************************************
74480: **
74481: ** The dupedExprStructSize() function returns two values OR-ed together:
74482: ** (1) the space required for a copy of the Expr structure only and
74483: ** (2) the EP_xxx flags that indicate what the structure size should be.
74484: ** The return values is always one of:
74485: **
74486: ** EXPR_FULLSIZE
74487: ** EXPR_REDUCEDSIZE | EP_Reduced
74488: ** EXPR_TOKENONLYSIZE | EP_TokenOnly
74489: **
74490: ** The size of the structure can be found by masking the return value
74491: ** of this routine with 0xfff. The flags can be found by masking the
74492: ** return value with EP_Reduced|EP_TokenOnly.
74493: **
74494: ** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size
74495: ** (unreduced) Expr objects as they or originally constructed by the parser.
74496: ** During expression analysis, extra information is computed and moved into
74497: ** later parts of teh Expr object and that extra information might get chopped
74498: ** off if the expression is reduced. Note also that it does not work to
74499: ** make a EXPRDUP_REDUCE copy of a reduced expression. It is only legal
74500: ** to reduce a pristine expression tree from the parser. The implementation
74501: ** of dupedExprStructSize() contain multiple assert() statements that attempt
74502: ** to enforce this constraint.
74503: */
74504: static int dupedExprStructSize(Expr *p, int flags){
74505: int nSize;
74506: assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
74507: if( 0==(flags&EXPRDUP_REDUCE) ){
74508: nSize = EXPR_FULLSIZE;
74509: }else{
74510: assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) );
74511: assert( !ExprHasProperty(p, EP_FromJoin) );
74512: assert( (p->flags2 & EP2_MallocedToken)==0 );
74513: assert( (p->flags2 & EP2_Irreducible)==0 );
1.2.2.1 ! misho 74514: if( p->pLeft || p->pRight || p->x.pList ){
1.2 misho 74515: nSize = EXPR_REDUCEDSIZE | EP_Reduced;
74516: }else{
74517: nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly;
74518: }
74519: }
74520: return nSize;
74521: }
74522:
74523: /*
74524: ** This function returns the space in bytes required to store the copy
74525: ** of the Expr structure and a copy of the Expr.u.zToken string (if that
74526: ** string is defined.)
74527: */
74528: static int dupedExprNodeSize(Expr *p, int flags){
74529: int nByte = dupedExprStructSize(p, flags) & 0xfff;
74530: if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
74531: nByte += sqlite3Strlen30(p->u.zToken)+1;
74532: }
74533: return ROUND8(nByte);
74534: }
74535:
74536: /*
74537: ** Return the number of bytes required to create a duplicate of the
74538: ** expression passed as the first argument. The second argument is a
74539: ** mask containing EXPRDUP_XXX flags.
74540: **
74541: ** The value returned includes space to create a copy of the Expr struct
74542: ** itself and the buffer referred to by Expr.u.zToken, if any.
74543: **
74544: ** If the EXPRDUP_REDUCE flag is set, then the return value includes
74545: ** space to duplicate all Expr nodes in the tree formed by Expr.pLeft
74546: ** and Expr.pRight variables (but not for any structures pointed to or
74547: ** descended from the Expr.x.pList or Expr.x.pSelect variables).
74548: */
74549: static int dupedExprSize(Expr *p, int flags){
74550: int nByte = 0;
74551: if( p ){
74552: nByte = dupedExprNodeSize(p, flags);
74553: if( flags&EXPRDUP_REDUCE ){
74554: nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags);
74555: }
74556: }
74557: return nByte;
74558: }
74559:
74560: /*
74561: ** This function is similar to sqlite3ExprDup(), except that if pzBuffer
74562: ** is not NULL then *pzBuffer is assumed to point to a buffer large enough
74563: ** to store the copy of expression p, the copies of p->u.zToken
74564: ** (if applicable), and the copies of the p->pLeft and p->pRight expressions,
74565: ** if any. Before returning, *pzBuffer is set to the first byte passed the
74566: ** portion of the buffer copied into by this function.
74567: */
74568: static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){
74569: Expr *pNew = 0; /* Value to return */
74570: if( p ){
74571: const int isReduced = (flags&EXPRDUP_REDUCE);
74572: u8 *zAlloc;
74573: u32 staticFlag = 0;
74574:
74575: assert( pzBuffer==0 || isReduced );
74576:
74577: /* Figure out where to write the new Expr structure. */
74578: if( pzBuffer ){
74579: zAlloc = *pzBuffer;
74580: staticFlag = EP_Static;
74581: }else{
74582: zAlloc = sqlite3DbMallocRaw(db, dupedExprSize(p, flags));
74583: }
74584: pNew = (Expr *)zAlloc;
74585:
74586: if( pNew ){
74587: /* Set nNewSize to the size allocated for the structure pointed to
74588: ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or
74589: ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed
74590: ** by the copy of the p->u.zToken string (if any).
74591: */
74592: const unsigned nStructSize = dupedExprStructSize(p, flags);
74593: const int nNewSize = nStructSize & 0xfff;
74594: int nToken;
74595: if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
74596: nToken = sqlite3Strlen30(p->u.zToken) + 1;
74597: }else{
74598: nToken = 0;
74599: }
74600: if( isReduced ){
74601: assert( ExprHasProperty(p, EP_Reduced)==0 );
74602: memcpy(zAlloc, p, nNewSize);
74603: }else{
74604: int nSize = exprStructSize(p);
74605: memcpy(zAlloc, p, nSize);
74606: memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize);
74607: }
74608:
74609: /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */
74610: pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static);
74611: pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly);
74612: pNew->flags |= staticFlag;
74613:
74614: /* Copy the p->u.zToken string, if any. */
74615: if( nToken ){
74616: char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize];
74617: memcpy(zToken, p->u.zToken, nToken);
74618: }
74619:
74620: if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){
74621: /* Fill in the pNew->x.pSelect or pNew->x.pList member. */
74622: if( ExprHasProperty(p, EP_xIsSelect) ){
74623: pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced);
74624: }else{
74625: pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced);
74626: }
74627: }
74628:
74629: /* Fill in pNew->pLeft and pNew->pRight. */
74630: if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly) ){
74631: zAlloc += dupedExprNodeSize(p, flags);
74632: if( ExprHasProperty(pNew, EP_Reduced) ){
74633: pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc);
74634: pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc);
74635: }
74636: if( pzBuffer ){
74637: *pzBuffer = zAlloc;
74638: }
74639: }else{
74640: pNew->flags2 = 0;
74641: if( !ExprHasAnyProperty(p, EP_TokenOnly) ){
74642: pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0);
74643: pNew->pRight = sqlite3ExprDup(db, p->pRight, 0);
74644: }
74645: }
74646:
74647: }
74648: }
74649: return pNew;
74650: }
74651:
74652: /*
74653: ** The following group of routines make deep copies of expressions,
74654: ** expression lists, ID lists, and select statements. The copies can
74655: ** be deleted (by being passed to their respective ...Delete() routines)
74656: ** without effecting the originals.
74657: **
74658: ** The expression list, ID, and source lists return by sqlite3ExprListDup(),
74659: ** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded
74660: ** by subsequent calls to sqlite*ListAppend() routines.
74661: **
74662: ** Any tables that the SrcList might point to are not duplicated.
74663: **
74664: ** The flags parameter contains a combination of the EXPRDUP_XXX flags.
74665: ** If the EXPRDUP_REDUCE flag is set, then the structure returned is a
74666: ** truncated version of the usual Expr structure that will be stored as
74667: ** part of the in-memory representation of the database schema.
74668: */
74669: SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){
74670: return exprDup(db, p, flags, 0);
74671: }
74672: SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
74673: ExprList *pNew;
74674: struct ExprList_item *pItem, *pOldItem;
74675: int i;
74676: if( p==0 ) return 0;
74677: pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) );
74678: if( pNew==0 ) return 0;
74679: pNew->iECursor = 0;
1.2.2.1 ! misho 74680: pNew->nExpr = i = p->nExpr;
! 74681: if( (flags & EXPRDUP_REDUCE)==0 ) for(i=1; i<p->nExpr; i+=i){}
! 74682: pNew->a = pItem = sqlite3DbMallocRaw(db, i*sizeof(p->a[0]) );
1.2 misho 74683: if( pItem==0 ){
74684: sqlite3DbFree(db, pNew);
74685: return 0;
74686: }
74687: pOldItem = p->a;
74688: for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
74689: Expr *pOldExpr = pOldItem->pExpr;
74690: pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags);
74691: pItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
74692: pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan);
74693: pItem->sortOrder = pOldItem->sortOrder;
74694: pItem->done = 0;
74695: pItem->iOrderByCol = pOldItem->iOrderByCol;
74696: pItem->iAlias = pOldItem->iAlias;
74697: }
74698: return pNew;
74699: }
74700:
74701: /*
74702: ** If cursors, triggers, views and subqueries are all omitted from
74703: ** the build, then none of the following routines, except for
74704: ** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes
74705: ** called with a NULL argument.
74706: */
74707: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \
74708: || !defined(SQLITE_OMIT_SUBQUERY)
74709: SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){
74710: SrcList *pNew;
74711: int i;
74712: int nByte;
74713: if( p==0 ) return 0;
74714: nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
74715: pNew = sqlite3DbMallocRaw(db, nByte );
74716: if( pNew==0 ) return 0;
74717: pNew->nSrc = pNew->nAlloc = p->nSrc;
74718: for(i=0; i<p->nSrc; i++){
74719: struct SrcList_item *pNewItem = &pNew->a[i];
74720: struct SrcList_item *pOldItem = &p->a[i];
74721: Table *pTab;
1.2.2.1 ! misho 74722: pNewItem->pSchema = pOldItem->pSchema;
1.2 misho 74723: pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase);
74724: pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
74725: pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias);
74726: pNewItem->jointype = pOldItem->jointype;
74727: pNewItem->iCursor = pOldItem->iCursor;
74728: pNewItem->addrFillSub = pOldItem->addrFillSub;
74729: pNewItem->regReturn = pOldItem->regReturn;
74730: pNewItem->isCorrelated = pOldItem->isCorrelated;
1.2.2.1 ! misho 74731: pNewItem->viaCoroutine = pOldItem->viaCoroutine;
1.2 misho 74732: pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex);
74733: pNewItem->notIndexed = pOldItem->notIndexed;
74734: pNewItem->pIndex = pOldItem->pIndex;
74735: pTab = pNewItem->pTab = pOldItem->pTab;
74736: if( pTab ){
74737: pTab->nRef++;
74738: }
74739: pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags);
74740: pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags);
74741: pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing);
74742: pNewItem->colUsed = pOldItem->colUsed;
74743: }
74744: return pNew;
74745: }
74746: SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
74747: IdList *pNew;
74748: int i;
74749: if( p==0 ) return 0;
74750: pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) );
74751: if( pNew==0 ) return 0;
1.2.2.1 ! misho 74752: pNew->nId = p->nId;
1.2 misho 74753: pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) );
74754: if( pNew->a==0 ){
74755: sqlite3DbFree(db, pNew);
74756: return 0;
74757: }
1.2.2.1 ! misho 74758: /* Note that because the size of the allocation for p->a[] is not
! 74759: ** necessarily a power of two, sqlite3IdListAppend() may not be called
! 74760: ** on the duplicate created by this function. */
1.2 misho 74761: for(i=0; i<p->nId; i++){
74762: struct IdList_item *pNewItem = &pNew->a[i];
74763: struct IdList_item *pOldItem = &p->a[i];
74764: pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
74765: pNewItem->idx = pOldItem->idx;
74766: }
74767: return pNew;
74768: }
74769: SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
74770: Select *pNew, *pPrior;
74771: if( p==0 ) return 0;
74772: pNew = sqlite3DbMallocRaw(db, sizeof(*p) );
74773: if( pNew==0 ) return 0;
74774: pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags);
74775: pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags);
74776: pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags);
74777: pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags);
74778: pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags);
74779: pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags);
74780: pNew->op = p->op;
74781: pNew->pPrior = pPrior = sqlite3SelectDup(db, p->pPrior, flags);
74782: if( pPrior ) pPrior->pNext = pNew;
74783: pNew->pNext = 0;
74784: pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
74785: pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
74786: pNew->iLimit = 0;
74787: pNew->iOffset = 0;
74788: pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
74789: pNew->pRightmost = 0;
74790: pNew->addrOpenEphm[0] = -1;
74791: pNew->addrOpenEphm[1] = -1;
74792: pNew->addrOpenEphm[2] = -1;
74793: return pNew;
74794: }
74795: #else
74796: SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){
74797: assert( p==0 );
74798: return 0;
74799: }
74800: #endif
74801:
74802:
74803: /*
74804: ** Add a new element to the end of an expression list. If pList is
74805: ** initially NULL, then create a new expression list.
74806: **
74807: ** If a memory allocation error occurs, the entire list is freed and
74808: ** NULL is returned. If non-NULL is returned, then it is guaranteed
74809: ** that the new entry was successfully appended.
74810: */
74811: SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(
74812: Parse *pParse, /* Parsing context */
74813: ExprList *pList, /* List to which to append. Might be NULL */
74814: Expr *pExpr /* Expression to be appended. Might be NULL */
74815: ){
74816: sqlite3 *db = pParse->db;
74817: if( pList==0 ){
74818: pList = sqlite3DbMallocZero(db, sizeof(ExprList) );
74819: if( pList==0 ){
74820: goto no_mem;
74821: }
1.2.2.1 ! misho 74822: pList->a = sqlite3DbMallocRaw(db, sizeof(pList->a[0]));
! 74823: if( pList->a==0 ) goto no_mem;
! 74824: }else if( (pList->nExpr & (pList->nExpr-1))==0 ){
1.2 misho 74825: struct ExprList_item *a;
1.2.2.1 ! misho 74826: assert( pList->nExpr>0 );
! 74827: a = sqlite3DbRealloc(db, pList->a, pList->nExpr*2*sizeof(pList->a[0]));
1.2 misho 74828: if( a==0 ){
74829: goto no_mem;
74830: }
74831: pList->a = a;
74832: }
74833: assert( pList->a!=0 );
74834: if( 1 ){
74835: struct ExprList_item *pItem = &pList->a[pList->nExpr++];
74836: memset(pItem, 0, sizeof(*pItem));
74837: pItem->pExpr = pExpr;
74838: }
74839: return pList;
74840:
74841: no_mem:
74842: /* Avoid leaking memory if malloc has failed. */
74843: sqlite3ExprDelete(db, pExpr);
74844: sqlite3ExprListDelete(db, pList);
74845: return 0;
74846: }
74847:
74848: /*
74849: ** Set the ExprList.a[].zName element of the most recently added item
74850: ** on the expression list.
74851: **
74852: ** pList might be NULL following an OOM error. But pName should never be
74853: ** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag
74854: ** is set.
74855: */
74856: SQLITE_PRIVATE void sqlite3ExprListSetName(
74857: Parse *pParse, /* Parsing context */
74858: ExprList *pList, /* List to which to add the span. */
74859: Token *pName, /* Name to be added */
74860: int dequote /* True to cause the name to be dequoted */
74861: ){
74862: assert( pList!=0 || pParse->db->mallocFailed!=0 );
74863: if( pList ){
74864: struct ExprList_item *pItem;
74865: assert( pList->nExpr>0 );
74866: pItem = &pList->a[pList->nExpr-1];
74867: assert( pItem->zName==0 );
74868: pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n);
74869: if( dequote && pItem->zName ) sqlite3Dequote(pItem->zName);
74870: }
74871: }
74872:
74873: /*
74874: ** Set the ExprList.a[].zSpan element of the most recently added item
74875: ** on the expression list.
74876: **
74877: ** pList might be NULL following an OOM error. But pSpan should never be
74878: ** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag
74879: ** is set.
74880: */
74881: SQLITE_PRIVATE void sqlite3ExprListSetSpan(
74882: Parse *pParse, /* Parsing context */
74883: ExprList *pList, /* List to which to add the span. */
74884: ExprSpan *pSpan /* The span to be added */
74885: ){
74886: sqlite3 *db = pParse->db;
74887: assert( pList!=0 || db->mallocFailed!=0 );
74888: if( pList ){
74889: struct ExprList_item *pItem = &pList->a[pList->nExpr-1];
74890: assert( pList->nExpr>0 );
74891: assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr );
74892: sqlite3DbFree(db, pItem->zSpan);
74893: pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
74894: (int)(pSpan->zEnd - pSpan->zStart));
74895: }
74896: }
74897:
74898: /*
74899: ** If the expression list pEList contains more than iLimit elements,
74900: ** leave an error message in pParse.
74901: */
74902: SQLITE_PRIVATE void sqlite3ExprListCheckLength(
74903: Parse *pParse,
74904: ExprList *pEList,
74905: const char *zObject
74906: ){
74907: int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN];
74908: testcase( pEList && pEList->nExpr==mx );
74909: testcase( pEList && pEList->nExpr==mx+1 );
74910: if( pEList && pEList->nExpr>mx ){
74911: sqlite3ErrorMsg(pParse, "too many columns in %s", zObject);
74912: }
74913: }
74914:
74915: /*
74916: ** Delete an entire expression list.
74917: */
74918: SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
74919: int i;
74920: struct ExprList_item *pItem;
74921: if( pList==0 ) return;
1.2.2.1 ! misho 74922: assert( pList->a!=0 || pList->nExpr==0 );
1.2 misho 74923: for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
74924: sqlite3ExprDelete(db, pItem->pExpr);
74925: sqlite3DbFree(db, pItem->zName);
74926: sqlite3DbFree(db, pItem->zSpan);
74927: }
74928: sqlite3DbFree(db, pList->a);
74929: sqlite3DbFree(db, pList);
74930: }
74931:
74932: /*
74933: ** These routines are Walker callbacks. Walker.u.pi is a pointer
74934: ** to an integer. These routines are checking an expression to see
74935: ** if it is a constant. Set *Walker.u.pi to 0 if the expression is
74936: ** not constant.
74937: **
74938: ** These callback routines are used to implement the following:
74939: **
74940: ** sqlite3ExprIsConstant()
74941: ** sqlite3ExprIsConstantNotJoin()
74942: ** sqlite3ExprIsConstantOrFunction()
74943: **
74944: */
74945: static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){
74946:
74947: /* If pWalker->u.i is 3 then any term of the expression that comes from
74948: ** the ON or USING clauses of a join disqualifies the expression
74949: ** from being considered constant. */
74950: if( pWalker->u.i==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){
74951: pWalker->u.i = 0;
74952: return WRC_Abort;
74953: }
74954:
74955: switch( pExpr->op ){
74956: /* Consider functions to be constant if all their arguments are constant
74957: ** and pWalker->u.i==2 */
74958: case TK_FUNCTION:
74959: if( pWalker->u.i==2 ) return 0;
74960: /* Fall through */
74961: case TK_ID:
74962: case TK_COLUMN:
74963: case TK_AGG_FUNCTION:
74964: case TK_AGG_COLUMN:
74965: testcase( pExpr->op==TK_ID );
74966: testcase( pExpr->op==TK_COLUMN );
74967: testcase( pExpr->op==TK_AGG_FUNCTION );
74968: testcase( pExpr->op==TK_AGG_COLUMN );
74969: pWalker->u.i = 0;
74970: return WRC_Abort;
74971: default:
74972: testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */
74973: testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */
74974: return WRC_Continue;
74975: }
74976: }
74977: static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){
74978: UNUSED_PARAMETER(NotUsed);
74979: pWalker->u.i = 0;
74980: return WRC_Abort;
74981: }
74982: static int exprIsConst(Expr *p, int initFlag){
74983: Walker w;
74984: w.u.i = initFlag;
74985: w.xExprCallback = exprNodeIsConstant;
74986: w.xSelectCallback = selectNodeIsConstant;
74987: sqlite3WalkExpr(&w, p);
74988: return w.u.i;
74989: }
74990:
74991: /*
74992: ** Walk an expression tree. Return 1 if the expression is constant
74993: ** and 0 if it involves variables or function calls.
74994: **
74995: ** For the purposes of this function, a double-quoted string (ex: "abc")
74996: ** is considered a variable but a single-quoted string (ex: 'abc') is
74997: ** a constant.
74998: */
74999: SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr *p){
75000: return exprIsConst(p, 1);
75001: }
75002:
75003: /*
75004: ** Walk an expression tree. Return 1 if the expression is constant
75005: ** that does no originate from the ON or USING clauses of a join.
75006: ** Return 0 if it involves variables or function calls or terms from
75007: ** an ON or USING clause.
75008: */
75009: SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){
75010: return exprIsConst(p, 3);
75011: }
75012:
75013: /*
75014: ** Walk an expression tree. Return 1 if the expression is constant
75015: ** or a function call with constant arguments. Return and 0 if there
75016: ** are any variables.
75017: **
75018: ** For the purposes of this function, a double-quoted string (ex: "abc")
75019: ** is considered a variable but a single-quoted string (ex: 'abc') is
75020: ** a constant.
75021: */
75022: SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p){
75023: return exprIsConst(p, 2);
75024: }
75025:
75026: /*
75027: ** If the expression p codes a constant integer that is small enough
75028: ** to fit in a 32-bit integer, return 1 and put the value of the integer
75029: ** in *pValue. If the expression is not an integer or if it is too big
75030: ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
75031: */
75032: SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){
75033: int rc = 0;
75034:
75035: /* If an expression is an integer literal that fits in a signed 32-bit
75036: ** integer, then the EP_IntValue flag will have already been set */
75037: assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0
75038: || sqlite3GetInt32(p->u.zToken, &rc)==0 );
75039:
75040: if( p->flags & EP_IntValue ){
75041: *pValue = p->u.iValue;
75042: return 1;
75043: }
75044: switch( p->op ){
75045: case TK_UPLUS: {
75046: rc = sqlite3ExprIsInteger(p->pLeft, pValue);
75047: break;
75048: }
75049: case TK_UMINUS: {
75050: int v;
75051: if( sqlite3ExprIsInteger(p->pLeft, &v) ){
75052: *pValue = -v;
75053: rc = 1;
75054: }
75055: break;
75056: }
75057: default: break;
75058: }
75059: return rc;
75060: }
75061:
75062: /*
75063: ** Return FALSE if there is no chance that the expression can be NULL.
75064: **
75065: ** If the expression might be NULL or if the expression is too complex
75066: ** to tell return TRUE.
75067: **
75068: ** This routine is used as an optimization, to skip OP_IsNull opcodes
75069: ** when we know that a value cannot be NULL. Hence, a false positive
75070: ** (returning TRUE when in fact the expression can never be NULL) might
75071: ** be a small performance hit but is otherwise harmless. On the other
75072: ** hand, a false negative (returning FALSE when the result could be NULL)
75073: ** will likely result in an incorrect answer. So when in doubt, return
75074: ** TRUE.
75075: */
75076: SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){
75077: u8 op;
75078: while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; }
75079: op = p->op;
75080: if( op==TK_REGISTER ) op = p->op2;
75081: switch( op ){
75082: case TK_INTEGER:
75083: case TK_STRING:
75084: case TK_FLOAT:
75085: case TK_BLOB:
75086: return 0;
75087: default:
75088: return 1;
75089: }
75090: }
75091:
75092: /*
75093: ** Generate an OP_IsNull instruction that tests register iReg and jumps
75094: ** to location iDest if the value in iReg is NULL. The value in iReg
75095: ** was computed by pExpr. If we can look at pExpr at compile-time and
75096: ** determine that it can never generate a NULL, then the OP_IsNull operation
75097: ** can be omitted.
75098: */
75099: SQLITE_PRIVATE void sqlite3ExprCodeIsNullJump(
75100: Vdbe *v, /* The VDBE under construction */
75101: const Expr *pExpr, /* Only generate OP_IsNull if this expr can be NULL */
75102: int iReg, /* Test the value in this register for NULL */
75103: int iDest /* Jump here if the value is null */
75104: ){
75105: if( sqlite3ExprCanBeNull(pExpr) ){
75106: sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest);
75107: }
75108: }
75109:
75110: /*
75111: ** Return TRUE if the given expression is a constant which would be
75112: ** unchanged by OP_Affinity with the affinity given in the second
75113: ** argument.
75114: **
75115: ** This routine is used to determine if the OP_Affinity operation
75116: ** can be omitted. When in doubt return FALSE. A false negative
75117: ** is harmless. A false positive, however, can result in the wrong
75118: ** answer.
75119: */
75120: SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){
75121: u8 op;
75122: if( aff==SQLITE_AFF_NONE ) return 1;
75123: while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; }
75124: op = p->op;
75125: if( op==TK_REGISTER ) op = p->op2;
75126: switch( op ){
75127: case TK_INTEGER: {
75128: return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC;
75129: }
75130: case TK_FLOAT: {
75131: return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC;
75132: }
75133: case TK_STRING: {
75134: return aff==SQLITE_AFF_TEXT;
75135: }
75136: case TK_BLOB: {
75137: return 1;
75138: }
75139: case TK_COLUMN: {
75140: assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */
75141: return p->iColumn<0
75142: && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC);
75143: }
75144: default: {
75145: return 0;
75146: }
75147: }
75148: }
75149:
75150: /*
75151: ** Return TRUE if the given string is a row-id column name.
75152: */
75153: SQLITE_PRIVATE int sqlite3IsRowid(const char *z){
75154: if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1;
75155: if( sqlite3StrICmp(z, "ROWID")==0 ) return 1;
75156: if( sqlite3StrICmp(z, "OID")==0 ) return 1;
75157: return 0;
75158: }
75159:
75160: /*
75161: ** Return true if we are able to the IN operator optimization on a
75162: ** query of the form
75163: **
75164: ** x IN (SELECT ...)
75165: **
75166: ** Where the SELECT... clause is as specified by the parameter to this
75167: ** routine.
75168: **
75169: ** The Select object passed in has already been preprocessed and no
75170: ** errors have been found.
75171: */
75172: #ifndef SQLITE_OMIT_SUBQUERY
75173: static int isCandidateForInOpt(Select *p){
75174: SrcList *pSrc;
75175: ExprList *pEList;
75176: Table *pTab;
75177: if( p==0 ) return 0; /* right-hand side of IN is SELECT */
75178: if( p->pPrior ) return 0; /* Not a compound SELECT */
75179: if( p->selFlags & (SF_Distinct|SF_Aggregate) ){
75180: testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
75181: testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
75182: return 0; /* No DISTINCT keyword and no aggregate functions */
75183: }
75184: assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */
75185: if( p->pLimit ) return 0; /* Has no LIMIT clause */
75186: assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */
75187: if( p->pWhere ) return 0; /* Has no WHERE clause */
75188: pSrc = p->pSrc;
75189: assert( pSrc!=0 );
75190: if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */
75191: if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */
75192: pTab = pSrc->a[0].pTab;
75193: if( NEVER(pTab==0) ) return 0;
75194: assert( pTab->pSelect==0 ); /* FROM clause is not a view */
75195: if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */
75196: pEList = p->pEList;
75197: if( pEList->nExpr!=1 ) return 0; /* One column in the result set */
75198: if( pEList->a[0].pExpr->op!=TK_COLUMN ) return 0; /* Result is a column */
75199: return 1;
75200: }
75201: #endif /* SQLITE_OMIT_SUBQUERY */
75202:
75203: /*
75204: ** Code an OP_Once instruction and allocate space for its flag. Return the
75205: ** address of the new instruction.
75206: */
75207: SQLITE_PRIVATE int sqlite3CodeOnce(Parse *pParse){
75208: Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
75209: return sqlite3VdbeAddOp1(v, OP_Once, pParse->nOnce++);
75210: }
75211:
75212: /*
75213: ** This function is used by the implementation of the IN (...) operator.
1.2.2.1 ! misho 75214: ** The pX parameter is the expression on the RHS of the IN operator, which
! 75215: ** might be either a list of expressions or a subquery.
! 75216: **
! 75217: ** The job of this routine is to find or create a b-tree object that can
! 75218: ** be used either to test for membership in the RHS set or to iterate through
! 75219: ** all members of the RHS set, skipping duplicates.
! 75220: **
! 75221: ** A cursor is opened on the b-tree object that the RHS of the IN operator
! 75222: ** and pX->iTable is set to the index of that cursor.
1.2 misho 75223: **
75224: ** The returned value of this function indicates the b-tree type, as follows:
75225: **
75226: ** IN_INDEX_ROWID - The cursor was opened on a database table.
75227: ** IN_INDEX_INDEX - The cursor was opened on a database index.
75228: ** IN_INDEX_EPH - The cursor was opened on a specially created and
75229: ** populated epheremal table.
75230: **
1.2.2.1 ! misho 75231: ** An existing b-tree might be used if the RHS expression pX is a simple
! 75232: ** subquery such as:
1.2 misho 75233: **
75234: ** SELECT <column> FROM <table>
75235: **
1.2.2.1 ! misho 75236: ** If the RHS of the IN operator is a list or a more complex subquery, then
! 75237: ** an ephemeral table might need to be generated from the RHS and then
! 75238: ** pX->iTable made to point to the ephermeral table instead of an
! 75239: ** existing table.
! 75240: **
1.2 misho 75241: ** If the prNotFound parameter is 0, then the b-tree will be used to iterate
75242: ** through the set members, skipping any duplicates. In this case an
75243: ** epheremal table must be used unless the selected <column> is guaranteed
75244: ** to be unique - either because it is an INTEGER PRIMARY KEY or it
75245: ** has a UNIQUE constraint or UNIQUE index.
75246: **
75247: ** If the prNotFound parameter is not 0, then the b-tree will be used
75248: ** for fast set membership tests. In this case an epheremal table must
75249: ** be used unless <column> is an INTEGER PRIMARY KEY or an index can
75250: ** be found with <column> as its left-most column.
75251: **
75252: ** When the b-tree is being used for membership tests, the calling function
75253: ** needs to know whether or not the structure contains an SQL NULL
75254: ** value in order to correctly evaluate expressions like "X IN (Y, Z)".
75255: ** If there is any chance that the (...) might contain a NULL value at
75256: ** runtime, then a register is allocated and the register number written
75257: ** to *prNotFound. If there is no chance that the (...) contains a
75258: ** NULL value, then *prNotFound is left unchanged.
75259: **
75260: ** If a register is allocated and its location stored in *prNotFound, then
75261: ** its initial value is NULL. If the (...) does not remain constant
75262: ** for the duration of the query (i.e. the SELECT within the (...)
75263: ** is a correlated subquery) then the value of the allocated register is
75264: ** reset to NULL each time the subquery is rerun. This allows the
75265: ** caller to use vdbe code equivalent to the following:
75266: **
75267: ** if( register==NULL ){
75268: ** has_null = <test if data structure contains null>
75269: ** register = 1
75270: ** }
75271: **
75272: ** in order to avoid running the <test if data structure contains null>
75273: ** test more often than is necessary.
75274: */
75275: #ifndef SQLITE_OMIT_SUBQUERY
75276: SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
75277: Select *p; /* SELECT to the right of IN operator */
75278: int eType = 0; /* Type of RHS table. IN_INDEX_* */
75279: int iTab = pParse->nTab++; /* Cursor of the RHS table */
75280: int mustBeUnique = (prNotFound==0); /* True if RHS must be unique */
75281: Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
75282:
75283: assert( pX->op==TK_IN );
75284:
75285: /* Check to see if an existing table or index can be used to
75286: ** satisfy the query. This is preferable to generating a new
75287: ** ephemeral table.
75288: */
75289: p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
75290: if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){
75291: sqlite3 *db = pParse->db; /* Database connection */
75292: Table *pTab; /* Table <table>. */
75293: Expr *pExpr; /* Expression <column> */
75294: int iCol; /* Index of column <column> */
75295: int iDb; /* Database idx for pTab */
75296:
75297: assert( p ); /* Because of isCandidateForInOpt(p) */
75298: assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */
75299: assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */
75300: assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */
75301: pTab = p->pSrc->a[0].pTab;
75302: pExpr = p->pEList->a[0].pExpr;
75303: iCol = pExpr->iColumn;
75304:
75305: /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
75306: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
75307: sqlite3CodeVerifySchema(pParse, iDb);
75308: sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
75309:
75310: /* This function is only called from two places. In both cases the vdbe
75311: ** has already been allocated. So assume sqlite3GetVdbe() is always
75312: ** successful here.
75313: */
75314: assert(v);
75315: if( iCol<0 ){
75316: int iAddr;
75317:
75318: iAddr = sqlite3CodeOnce(pParse);
75319:
75320: sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
75321: eType = IN_INDEX_ROWID;
75322:
75323: sqlite3VdbeJumpHere(v, iAddr);
75324: }else{
75325: Index *pIdx; /* Iterator variable */
75326:
75327: /* The collation sequence used by the comparison. If an index is to
75328: ** be used in place of a temp-table, it must be ordered according
75329: ** to this collation sequence. */
75330: CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr);
75331:
75332: /* Check that the affinity that will be used to perform the
75333: ** comparison is the same as the affinity of the column. If
75334: ** it is not, it is not possible to use any index.
75335: */
1.2.2.1 ! misho 75336: int affinity_ok = sqlite3IndexAffinityOk(pX, pTab->aCol[iCol].affinity);
1.2 misho 75337:
75338: for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){
75339: if( (pIdx->aiColumn[0]==iCol)
75340: && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq
75341: && (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None))
75342: ){
75343: int iAddr;
75344: char *pKey;
75345:
75346: pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx);
75347: iAddr = sqlite3CodeOnce(pParse);
75348:
75349: sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pIdx->tnum, iDb,
75350: pKey,P4_KEYINFO_HANDOFF);
75351: VdbeComment((v, "%s", pIdx->zName));
75352: eType = IN_INDEX_INDEX;
75353:
75354: sqlite3VdbeJumpHere(v, iAddr);
75355: if( prNotFound && !pTab->aCol[iCol].notNull ){
75356: *prNotFound = ++pParse->nMem;
75357: sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound);
75358: }
75359: }
75360: }
75361: }
75362: }
75363:
75364: if( eType==0 ){
75365: /* Could not found an existing table or index to use as the RHS b-tree.
75366: ** We will have to generate an ephemeral table to do the job.
75367: */
75368: double savedNQueryLoop = pParse->nQueryLoop;
75369: int rMayHaveNull = 0;
75370: eType = IN_INDEX_EPH;
75371: if( prNotFound ){
75372: *prNotFound = rMayHaveNull = ++pParse->nMem;
75373: sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound);
75374: }else{
75375: testcase( pParse->nQueryLoop>(double)1 );
75376: pParse->nQueryLoop = (double)1;
75377: if( pX->pLeft->iColumn<0 && !ExprHasAnyProperty(pX, EP_xIsSelect) ){
75378: eType = IN_INDEX_ROWID;
75379: }
75380: }
75381: sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID);
75382: pParse->nQueryLoop = savedNQueryLoop;
75383: }else{
75384: pX->iTable = iTab;
75385: }
75386: return eType;
75387: }
75388: #endif
75389:
75390: /*
75391: ** Generate code for scalar subqueries used as a subquery expression, EXISTS,
75392: ** or IN operators. Examples:
75393: **
75394: ** (SELECT a FROM b) -- subquery
75395: ** EXISTS (SELECT a FROM b) -- EXISTS subquery
75396: ** x IN (4,5,11) -- IN operator with list on right-hand side
75397: ** x IN (SELECT a FROM b) -- IN operator with subquery on the right
75398: **
75399: ** The pExpr parameter describes the expression that contains the IN
75400: ** operator or subquery.
75401: **
75402: ** If parameter isRowid is non-zero, then expression pExpr is guaranteed
75403: ** to be of the form "<rowid> IN (?, ?, ?)", where <rowid> is a reference
75404: ** to some integer key column of a table B-Tree. In this case, use an
75405: ** intkey B-Tree to store the set of IN(...) values instead of the usual
75406: ** (slower) variable length keys B-Tree.
75407: **
75408: ** If rMayHaveNull is non-zero, that means that the operation is an IN
75409: ** (not a SELECT or EXISTS) and that the RHS might contains NULLs.
75410: ** Furthermore, the IN is in a WHERE clause and that we really want
75411: ** to iterate over the RHS of the IN operator in order to quickly locate
75412: ** all corresponding LHS elements. All this routine does is initialize
75413: ** the register given by rMayHaveNull to NULL. Calling routines will take
75414: ** care of changing this register value to non-NULL if the RHS is NULL-free.
75415: **
75416: ** If rMayHaveNull is zero, that means that the subquery is being used
75417: ** for membership testing only. There is no need to initialize any
75418: ** registers to indicate the presense or absence of NULLs on the RHS.
75419: **
75420: ** For a SELECT or EXISTS operator, return the register that holds the
75421: ** result. For IN operators or if an error occurs, the return value is 0.
75422: */
75423: #ifndef SQLITE_OMIT_SUBQUERY
75424: SQLITE_PRIVATE int sqlite3CodeSubselect(
75425: Parse *pParse, /* Parsing context */
75426: Expr *pExpr, /* The IN, SELECT, or EXISTS operator */
75427: int rMayHaveNull, /* Register that records whether NULLs exist in RHS */
75428: int isRowid /* If true, LHS of IN operator is a rowid */
75429: ){
75430: int testAddr = -1; /* One-time test address */
75431: int rReg = 0; /* Register storing resulting */
75432: Vdbe *v = sqlite3GetVdbe(pParse);
75433: if( NEVER(v==0) ) return 0;
75434: sqlite3ExprCachePush(pParse);
75435:
75436: /* This code must be run in its entirety every time it is encountered
75437: ** if any of the following is true:
75438: **
75439: ** * The right-hand side is a correlated subquery
75440: ** * The right-hand side is an expression list containing variables
75441: ** * We are inside a trigger
75442: **
75443: ** If all of the above are false, then we can run this code just once
75444: ** save the results, and reuse the same result on subsequent invocations.
75445: */
75446: if( !ExprHasAnyProperty(pExpr, EP_VarSelect) ){
75447: testAddr = sqlite3CodeOnce(pParse);
75448: }
75449:
75450: #ifndef SQLITE_OMIT_EXPLAIN
75451: if( pParse->explain==2 ){
75452: char *zMsg = sqlite3MPrintf(
75453: pParse->db, "EXECUTE %s%s SUBQUERY %d", testAddr>=0?"":"CORRELATED ",
75454: pExpr->op==TK_IN?"LIST":"SCALAR", pParse->iNextSelectId
75455: );
75456: sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
75457: }
75458: #endif
75459:
75460: switch( pExpr->op ){
75461: case TK_IN: {
75462: char affinity; /* Affinity of the LHS of the IN */
75463: KeyInfo keyInfo; /* Keyinfo for the generated table */
1.2.2.1 ! misho 75464: static u8 sortOrder = 0; /* Fake aSortOrder for keyInfo */
1.2 misho 75465: int addr; /* Address of OP_OpenEphemeral instruction */
75466: Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */
75467:
75468: if( rMayHaveNull ){
75469: sqlite3VdbeAddOp2(v, OP_Null, 0, rMayHaveNull);
75470: }
75471:
75472: affinity = sqlite3ExprAffinity(pLeft);
75473:
75474: /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
75475: ** expression it is handled the same way. An ephemeral table is
75476: ** filled with single-field index keys representing the results
75477: ** from the SELECT or the <exprlist>.
75478: **
75479: ** If the 'x' expression is a column value, or the SELECT...
75480: ** statement returns a column value, then the affinity of that
75481: ** column is used to build the index keys. If both 'x' and the
75482: ** SELECT... statement are columns, then numeric affinity is used
75483: ** if either column has NUMERIC or INTEGER affinity. If neither
75484: ** 'x' nor the SELECT... statement are columns, then numeric affinity
75485: ** is used.
75486: */
75487: pExpr->iTable = pParse->nTab++;
75488: addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid);
75489: if( rMayHaveNull==0 ) sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
75490: memset(&keyInfo, 0, sizeof(keyInfo));
75491: keyInfo.nField = 1;
1.2.2.1 ! misho 75492: keyInfo.aSortOrder = &sortOrder;
1.2 misho 75493:
75494: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
75495: /* Case 1: expr IN (SELECT ...)
75496: **
75497: ** Generate code to write the results of the select into the temporary
75498: ** table allocated and opened above.
75499: */
75500: SelectDest dest;
75501: ExprList *pEList;
75502:
75503: assert( !isRowid );
75504: sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable);
1.2.2.1 ! misho 75505: dest.affSdst = (u8)affinity;
1.2 misho 75506: assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );
75507: pExpr->x.pSelect->iLimit = 0;
75508: if( sqlite3Select(pParse, pExpr->x.pSelect, &dest) ){
75509: return 0;
75510: }
75511: pEList = pExpr->x.pSelect->pEList;
75512: if( ALWAYS(pEList!=0 && pEList->nExpr>0) ){
75513: keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft,
75514: pEList->a[0].pExpr);
75515: }
75516: }else if( ALWAYS(pExpr->x.pList!=0) ){
75517: /* Case 2: expr IN (exprlist)
75518: **
75519: ** For each expression, build an index key from the evaluation and
75520: ** store it in the temporary table. If <expr> is a column, then use
75521: ** that columns affinity when building index keys. If <expr> is not
75522: ** a column, use numeric affinity.
75523: */
75524: int i;
75525: ExprList *pList = pExpr->x.pList;
75526: struct ExprList_item *pItem;
75527: int r1, r2, r3;
75528:
75529: if( !affinity ){
75530: affinity = SQLITE_AFF_NONE;
75531: }
75532: keyInfo.aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft);
1.2.2.1 ! misho 75533: keyInfo.aSortOrder = &sortOrder;
1.2 misho 75534:
75535: /* Loop through each expression in <exprlist>. */
75536: r1 = sqlite3GetTempReg(pParse);
75537: r2 = sqlite3GetTempReg(pParse);
75538: sqlite3VdbeAddOp2(v, OP_Null, 0, r2);
75539: for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){
75540: Expr *pE2 = pItem->pExpr;
75541: int iValToIns;
75542:
75543: /* If the expression is not constant then we will need to
75544: ** disable the test that was generated above that makes sure
75545: ** this code only executes once. Because for a non-constant
75546: ** expression we need to rerun this code each time.
75547: */
75548: if( testAddr>=0 && !sqlite3ExprIsConstant(pE2) ){
75549: sqlite3VdbeChangeToNoop(v, testAddr);
75550: testAddr = -1;
75551: }
75552:
75553: /* Evaluate the expression and insert it into the temp table */
75554: if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){
75555: sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns);
75556: }else{
75557: r3 = sqlite3ExprCodeTarget(pParse, pE2, r1);
75558: if( isRowid ){
75559: sqlite3VdbeAddOp2(v, OP_MustBeInt, r3,
75560: sqlite3VdbeCurrentAddr(v)+2);
75561: sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3);
75562: }else{
75563: sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1);
75564: sqlite3ExprCacheAffinityChange(pParse, r3, 1);
75565: sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2);
75566: }
75567: }
75568: }
75569: sqlite3ReleaseTempReg(pParse, r1);
75570: sqlite3ReleaseTempReg(pParse, r2);
75571: }
75572: if( !isRowid ){
75573: sqlite3VdbeChangeP4(v, addr, (void *)&keyInfo, P4_KEYINFO);
75574: }
75575: break;
75576: }
75577:
75578: case TK_EXISTS:
75579: case TK_SELECT:
75580: default: {
75581: /* If this has to be a scalar SELECT. Generate code to put the
75582: ** value of this select in a memory cell and record the number
75583: ** of the memory cell in iColumn. If this is an EXISTS, write
75584: ** an integer 0 (not exists) or 1 (exists) into a memory cell
75585: ** and record that memory cell in iColumn.
75586: */
75587: Select *pSel; /* SELECT statement to encode */
75588: SelectDest dest; /* How to deal with SELECt result */
75589:
75590: testcase( pExpr->op==TK_EXISTS );
75591: testcase( pExpr->op==TK_SELECT );
75592: assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT );
75593:
75594: assert( ExprHasProperty(pExpr, EP_xIsSelect) );
75595: pSel = pExpr->x.pSelect;
75596: sqlite3SelectDestInit(&dest, 0, ++pParse->nMem);
75597: if( pExpr->op==TK_SELECT ){
75598: dest.eDest = SRT_Mem;
1.2.2.1 ! misho 75599: sqlite3VdbeAddOp2(v, OP_Null, 0, dest.iSDParm);
1.2 misho 75600: VdbeComment((v, "Init subquery result"));
75601: }else{
75602: dest.eDest = SRT_Exists;
1.2.2.1 ! misho 75603: sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm);
1.2 misho 75604: VdbeComment((v, "Init EXISTS result"));
75605: }
75606: sqlite3ExprDelete(pParse->db, pSel->pLimit);
75607: pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0,
75608: &sqlite3IntTokens[1]);
75609: pSel->iLimit = 0;
75610: if( sqlite3Select(pParse, pSel, &dest) ){
75611: return 0;
75612: }
1.2.2.1 ! misho 75613: rReg = dest.iSDParm;
1.2 misho 75614: ExprSetIrreducible(pExpr);
75615: break;
75616: }
75617: }
75618:
75619: if( testAddr>=0 ){
75620: sqlite3VdbeJumpHere(v, testAddr);
75621: }
75622: sqlite3ExprCachePop(pParse, 1);
75623:
75624: return rReg;
75625: }
75626: #endif /* SQLITE_OMIT_SUBQUERY */
75627:
75628: #ifndef SQLITE_OMIT_SUBQUERY
75629: /*
75630: ** Generate code for an IN expression.
75631: **
75632: ** x IN (SELECT ...)
75633: ** x IN (value, value, ...)
75634: **
75635: ** The left-hand side (LHS) is a scalar expression. The right-hand side (RHS)
75636: ** is an array of zero or more values. The expression is true if the LHS is
75637: ** contained within the RHS. The value of the expression is unknown (NULL)
75638: ** if the LHS is NULL or if the LHS is not contained within the RHS and the
75639: ** RHS contains one or more NULL values.
75640: **
75641: ** This routine generates code will jump to destIfFalse if the LHS is not
75642: ** contained within the RHS. If due to NULLs we cannot determine if the LHS
75643: ** is contained in the RHS then jump to destIfNull. If the LHS is contained
75644: ** within the RHS then fall through.
75645: */
75646: static void sqlite3ExprCodeIN(
75647: Parse *pParse, /* Parsing and code generating context */
75648: Expr *pExpr, /* The IN expression */
75649: int destIfFalse, /* Jump here if LHS is not contained in the RHS */
75650: int destIfNull /* Jump here if the results are unknown due to NULLs */
75651: ){
75652: int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */
75653: char affinity; /* Comparison affinity to use */
75654: int eType; /* Type of the RHS */
75655: int r1; /* Temporary use register */
75656: Vdbe *v; /* Statement under construction */
75657:
75658: /* Compute the RHS. After this step, the table with cursor
75659: ** pExpr->iTable will contains the values that make up the RHS.
75660: */
75661: v = pParse->pVdbe;
75662: assert( v!=0 ); /* OOM detected prior to this routine */
75663: VdbeNoopComment((v, "begin IN expr"));
75664: eType = sqlite3FindInIndex(pParse, pExpr, &rRhsHasNull);
75665:
75666: /* Figure out the affinity to use to create a key from the results
75667: ** of the expression. affinityStr stores a static string suitable for
75668: ** P4 of OP_MakeRecord.
75669: */
75670: affinity = comparisonAffinity(pExpr);
75671:
75672: /* Code the LHS, the <expr> from "<expr> IN (...)".
75673: */
75674: sqlite3ExprCachePush(pParse);
75675: r1 = sqlite3GetTempReg(pParse);
75676: sqlite3ExprCode(pParse, pExpr->pLeft, r1);
75677:
75678: /* If the LHS is NULL, then the result is either false or NULL depending
75679: ** on whether the RHS is empty or not, respectively.
75680: */
75681: if( destIfNull==destIfFalse ){
75682: /* Shortcut for the common case where the false and NULL outcomes are
75683: ** the same. */
75684: sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull);
75685: }else{
75686: int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1);
75687: sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse);
75688: sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull);
75689: sqlite3VdbeJumpHere(v, addr1);
75690: }
75691:
75692: if( eType==IN_INDEX_ROWID ){
75693: /* In this case, the RHS is the ROWID of table b-tree
75694: */
75695: sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse);
75696: sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1);
75697: }else{
75698: /* In this case, the RHS is an index b-tree.
75699: */
75700: sqlite3VdbeAddOp4(v, OP_Affinity, r1, 1, 0, &affinity, 1);
75701:
75702: /* If the set membership test fails, then the result of the
75703: ** "x IN (...)" expression must be either 0 or NULL. If the set
75704: ** contains no NULL values, then the result is 0. If the set
75705: ** contains one or more NULL values, then the result of the
75706: ** expression is also NULL.
75707: */
75708: if( rRhsHasNull==0 || destIfFalse==destIfNull ){
75709: /* This branch runs if it is known at compile time that the RHS
75710: ** cannot contain NULL values. This happens as the result
75711: ** of a "NOT NULL" constraint in the database schema.
75712: **
75713: ** Also run this branch if NULL is equivalent to FALSE
75714: ** for this particular IN operator.
75715: */
75716: sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1);
75717:
75718: }else{
75719: /* In this branch, the RHS of the IN might contain a NULL and
75720: ** the presence of a NULL on the RHS makes a difference in the
75721: ** outcome.
75722: */
75723: int j1, j2, j3;
75724:
75725: /* First check to see if the LHS is contained in the RHS. If so,
75726: ** then the presence of NULLs in the RHS does not matter, so jump
75727: ** over all of the code that follows.
75728: */
75729: j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1);
75730:
75731: /* Here we begin generating code that runs if the LHS is not
75732: ** contained within the RHS. Generate additional code that
75733: ** tests the RHS for NULLs. If the RHS contains a NULL then
75734: ** jump to destIfNull. If there are no NULLs in the RHS then
75735: ** jump to destIfFalse.
75736: */
75737: j2 = sqlite3VdbeAddOp1(v, OP_NotNull, rRhsHasNull);
75738: j3 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1);
75739: sqlite3VdbeAddOp2(v, OP_Integer, -1, rRhsHasNull);
75740: sqlite3VdbeJumpHere(v, j3);
75741: sqlite3VdbeAddOp2(v, OP_AddImm, rRhsHasNull, 1);
75742: sqlite3VdbeJumpHere(v, j2);
75743:
75744: /* Jump to the appropriate target depending on whether or not
75745: ** the RHS contains a NULL
75746: */
75747: sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull);
75748: sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse);
75749:
75750: /* The OP_Found at the top of this branch jumps here when true,
75751: ** causing the overall IN expression evaluation to fall through.
75752: */
75753: sqlite3VdbeJumpHere(v, j1);
75754: }
75755: }
75756: sqlite3ReleaseTempReg(pParse, r1);
75757: sqlite3ExprCachePop(pParse, 1);
75758: VdbeComment((v, "end IN expr"));
75759: }
75760: #endif /* SQLITE_OMIT_SUBQUERY */
75761:
75762: /*
75763: ** Duplicate an 8-byte value
75764: */
75765: static char *dup8bytes(Vdbe *v, const char *in){
75766: char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8);
75767: if( out ){
75768: memcpy(out, in, 8);
75769: }
75770: return out;
75771: }
75772:
75773: #ifndef SQLITE_OMIT_FLOATING_POINT
75774: /*
75775: ** Generate an instruction that will put the floating point
75776: ** value described by z[0..n-1] into register iMem.
75777: **
75778: ** The z[] string will probably not be zero-terminated. But the
75779: ** z[n] character is guaranteed to be something that does not look
75780: ** like the continuation of the number.
75781: */
75782: static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
75783: if( ALWAYS(z!=0) ){
75784: double value;
75785: char *zV;
75786: sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
75787: assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
75788: if( negateFlag ) value = -value;
75789: zV = dup8bytes(v, (char*)&value);
75790: sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
75791: }
75792: }
75793: #endif
75794:
75795:
75796: /*
75797: ** Generate an instruction that will put the integer describe by
75798: ** text z[0..n-1] into register iMem.
75799: **
75800: ** Expr.u.zToken is always UTF8 and zero-terminated.
75801: */
75802: static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
75803: Vdbe *v = pParse->pVdbe;
75804: if( pExpr->flags & EP_IntValue ){
75805: int i = pExpr->u.iValue;
75806: assert( i>=0 );
75807: if( negFlag ) i = -i;
75808: sqlite3VdbeAddOp2(v, OP_Integer, i, iMem);
75809: }else{
75810: int c;
75811: i64 value;
75812: const char *z = pExpr->u.zToken;
75813: assert( z!=0 );
75814: c = sqlite3Atoi64(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
75815: if( c==0 || (c==2 && negFlag) ){
75816: char *zV;
75817: if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; }
75818: zV = dup8bytes(v, (char*)&value);
75819: sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64);
75820: }else{
75821: #ifdef SQLITE_OMIT_FLOATING_POINT
75822: sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
75823: #else
75824: codeReal(v, z, negFlag, iMem);
75825: #endif
75826: }
75827: }
75828: }
75829:
75830: /*
75831: ** Clear a cache entry.
75832: */
75833: static void cacheEntryClear(Parse *pParse, struct yColCache *p){
75834: if( p->tempReg ){
75835: if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){
75836: pParse->aTempReg[pParse->nTempReg++] = p->iReg;
75837: }
75838: p->tempReg = 0;
75839: }
75840: }
75841:
75842:
75843: /*
75844: ** Record in the column cache that a particular column from a
75845: ** particular table is stored in a particular register.
75846: */
75847: SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){
75848: int i;
75849: int minLru;
75850: int idxLru;
75851: struct yColCache *p;
75852:
75853: assert( iReg>0 ); /* Register numbers are always positive */
75854: assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */
75855:
75856: /* The SQLITE_ColumnCache flag disables the column cache. This is used
75857: ** for testing only - to verify that SQLite always gets the same answer
75858: ** with and without the column cache.
75859: */
1.2.2.1 ! misho 75860: if( OptimizationDisabled(pParse->db, SQLITE_ColumnCache) ) return;
1.2 misho 75861:
75862: /* First replace any existing entry.
75863: **
75864: ** Actually, the way the column cache is currently used, we are guaranteed
75865: ** that the object will never already be in cache. Verify this guarantee.
75866: */
75867: #ifndef NDEBUG
75868: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75869: assert( p->iReg==0 || p->iTable!=iTab || p->iColumn!=iCol );
75870: }
75871: #endif
75872:
75873: /* Find an empty slot and replace it */
75874: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75875: if( p->iReg==0 ){
75876: p->iLevel = pParse->iCacheLevel;
75877: p->iTable = iTab;
75878: p->iColumn = iCol;
75879: p->iReg = iReg;
75880: p->tempReg = 0;
75881: p->lru = pParse->iCacheCnt++;
75882: return;
75883: }
75884: }
75885:
75886: /* Replace the last recently used */
75887: minLru = 0x7fffffff;
75888: idxLru = -1;
75889: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75890: if( p->lru<minLru ){
75891: idxLru = i;
75892: minLru = p->lru;
75893: }
75894: }
75895: if( ALWAYS(idxLru>=0) ){
75896: p = &pParse->aColCache[idxLru];
75897: p->iLevel = pParse->iCacheLevel;
75898: p->iTable = iTab;
75899: p->iColumn = iCol;
75900: p->iReg = iReg;
75901: p->tempReg = 0;
75902: p->lru = pParse->iCacheCnt++;
75903: return;
75904: }
75905: }
75906:
75907: /*
75908: ** Indicate that registers between iReg..iReg+nReg-1 are being overwritten.
75909: ** Purge the range of registers from the column cache.
75910: */
75911: SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){
75912: int i;
75913: int iLast = iReg + nReg - 1;
75914: struct yColCache *p;
75915: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75916: int r = p->iReg;
75917: if( r>=iReg && r<=iLast ){
75918: cacheEntryClear(pParse, p);
75919: p->iReg = 0;
75920: }
75921: }
75922: }
75923:
75924: /*
75925: ** Remember the current column cache context. Any new entries added
75926: ** added to the column cache after this call are removed when the
75927: ** corresponding pop occurs.
75928: */
75929: SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){
75930: pParse->iCacheLevel++;
75931: }
75932:
75933: /*
75934: ** Remove from the column cache any entries that were added since the
75935: ** the previous N Push operations. In other words, restore the cache
75936: ** to the state it was in N Pushes ago.
75937: */
75938: SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse, int N){
75939: int i;
75940: struct yColCache *p;
75941: assert( N>0 );
75942: assert( pParse->iCacheLevel>=N );
75943: pParse->iCacheLevel -= N;
75944: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75945: if( p->iReg && p->iLevel>pParse->iCacheLevel ){
75946: cacheEntryClear(pParse, p);
75947: p->iReg = 0;
75948: }
75949: }
75950: }
75951:
75952: /*
75953: ** When a cached column is reused, make sure that its register is
75954: ** no longer available as a temp register. ticket #3879: that same
75955: ** register might be in the cache in multiple places, so be sure to
75956: ** get them all.
75957: */
75958: static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){
75959: int i;
75960: struct yColCache *p;
75961: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
75962: if( p->iReg==iReg ){
75963: p->tempReg = 0;
75964: }
75965: }
75966: }
75967:
75968: /*
75969: ** Generate code to extract the value of the iCol-th column of a table.
75970: */
75971: SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(
75972: Vdbe *v, /* The VDBE under construction */
75973: Table *pTab, /* The table containing the value */
75974: int iTabCur, /* The cursor for this table */
75975: int iCol, /* Index of the column to extract */
75976: int regOut /* Extract the valud into this register */
75977: ){
75978: if( iCol<0 || iCol==pTab->iPKey ){
75979: sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut);
75980: }else{
75981: int op = IsVirtual(pTab) ? OP_VColumn : OP_Column;
75982: sqlite3VdbeAddOp3(v, op, iTabCur, iCol, regOut);
75983: }
75984: if( iCol>=0 ){
75985: sqlite3ColumnDefault(v, pTab, iCol, regOut);
75986: }
75987: }
75988:
75989: /*
75990: ** Generate code that will extract the iColumn-th column from
75991: ** table pTab and store the column value in a register. An effort
75992: ** is made to store the column value in register iReg, but this is
75993: ** not guaranteed. The location of the column value is returned.
75994: **
75995: ** There must be an open cursor to pTab in iTable when this routine
75996: ** is called. If iColumn<0 then code is generated that extracts the rowid.
75997: */
75998: SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(
75999: Parse *pParse, /* Parsing and code generating context */
76000: Table *pTab, /* Description of the table we are reading from */
76001: int iColumn, /* Index of the table column */
76002: int iTable, /* The cursor pointing to the table */
1.2.2.1 ! misho 76003: int iReg, /* Store results here */
! 76004: u8 p5 /* P5 value for OP_Column */
1.2 misho 76005: ){
76006: Vdbe *v = pParse->pVdbe;
76007: int i;
76008: struct yColCache *p;
76009:
76010: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
76011: if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){
76012: p->lru = pParse->iCacheCnt++;
76013: sqlite3ExprCachePinRegister(pParse, p->iReg);
76014: return p->iReg;
76015: }
76016: }
76017: assert( v!=0 );
76018: sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg);
1.2.2.1 ! misho 76019: if( p5 ){
! 76020: sqlite3VdbeChangeP5(v, p5);
! 76021: }else{
! 76022: sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg);
! 76023: }
1.2 misho 76024: return iReg;
76025: }
76026:
76027: /*
76028: ** Clear all column cache entries.
76029: */
76030: SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){
76031: int i;
76032: struct yColCache *p;
76033:
76034: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
76035: if( p->iReg ){
76036: cacheEntryClear(pParse, p);
76037: p->iReg = 0;
76038: }
76039: }
76040: }
76041:
76042: /*
76043: ** Record the fact that an affinity change has occurred on iCount
76044: ** registers starting with iStart.
76045: */
76046: SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){
76047: sqlite3ExprCacheRemove(pParse, iStart, iCount);
76048: }
76049:
76050: /*
76051: ** Generate code to move content from registers iFrom...iFrom+nReg-1
76052: ** over to iTo..iTo+nReg-1. Keep the column cache up-to-date.
76053: */
76054: SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){
76055: int i;
76056: struct yColCache *p;
1.2.2.1 ! misho 76057: assert( iFrom>=iTo+nReg || iFrom+nReg<=iTo );
! 76058: sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg-1);
1.2 misho 76059: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
76060: int x = p->iReg;
76061: if( x>=iFrom && x<iFrom+nReg ){
76062: p->iReg += iTo-iFrom;
76063: }
76064: }
76065: }
76066:
76067: #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
76068: /*
76069: ** Return true if any register in the range iFrom..iTo (inclusive)
76070: ** is used as part of the column cache.
76071: **
76072: ** This routine is used within assert() and testcase() macros only
76073: ** and does not appear in a normal build.
76074: */
76075: static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){
76076: int i;
76077: struct yColCache *p;
76078: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
76079: int r = p->iReg;
76080: if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/
76081: }
76082: return 0;
76083: }
76084: #endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */
76085:
76086: /*
76087: ** Generate code into the current Vdbe to evaluate the given
76088: ** expression. Attempt to store the results in register "target".
76089: ** Return the register where results are stored.
76090: **
76091: ** With this routine, there is no guarantee that results will
76092: ** be stored in target. The result might be stored in some other
76093: ** register if it is convenient to do so. The calling function
76094: ** must check the return code and move the results to the desired
76095: ** register.
76096: */
76097: SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
76098: Vdbe *v = pParse->pVdbe; /* The VM under construction */
76099: int op; /* The opcode being coded */
76100: int inReg = target; /* Results stored in register inReg */
76101: int regFree1 = 0; /* If non-zero free this temporary register */
76102: int regFree2 = 0; /* If non-zero free this temporary register */
76103: int r1, r2, r3, r4; /* Various register numbers */
76104: sqlite3 *db = pParse->db; /* The database connection */
76105:
76106: assert( target>0 && target<=pParse->nMem );
76107: if( v==0 ){
76108: assert( pParse->db->mallocFailed );
76109: return 0;
76110: }
76111:
76112: if( pExpr==0 ){
76113: op = TK_NULL;
76114: }else{
76115: op = pExpr->op;
76116: }
76117: switch( op ){
76118: case TK_AGG_COLUMN: {
76119: AggInfo *pAggInfo = pExpr->pAggInfo;
76120: struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg];
76121: if( !pAggInfo->directMode ){
76122: assert( pCol->iMem>0 );
76123: inReg = pCol->iMem;
76124: break;
76125: }else if( pAggInfo->useSortingIdx ){
76126: sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
76127: pCol->iSorterColumn, target);
76128: break;
76129: }
76130: /* Otherwise, fall thru into the TK_COLUMN case */
76131: }
76132: case TK_COLUMN: {
76133: if( pExpr->iTable<0 ){
76134: /* This only happens when coding check constraints */
76135: assert( pParse->ckBase>0 );
76136: inReg = pExpr->iColumn + pParse->ckBase;
76137: }else{
76138: inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
1.2.2.1 ! misho 76139: pExpr->iColumn, pExpr->iTable, target,
! 76140: pExpr->op2);
1.2 misho 76141: }
76142: break;
76143: }
76144: case TK_INTEGER: {
76145: codeInteger(pParse, pExpr, 0, target);
76146: break;
76147: }
76148: #ifndef SQLITE_OMIT_FLOATING_POINT
76149: case TK_FLOAT: {
76150: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76151: codeReal(v, pExpr->u.zToken, 0, target);
76152: break;
76153: }
76154: #endif
76155: case TK_STRING: {
76156: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76157: sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0);
76158: break;
76159: }
76160: case TK_NULL: {
76161: sqlite3VdbeAddOp2(v, OP_Null, 0, target);
76162: break;
76163: }
76164: #ifndef SQLITE_OMIT_BLOB_LITERAL
76165: case TK_BLOB: {
76166: int n;
76167: const char *z;
76168: char *zBlob;
76169: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76170: assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' );
76171: assert( pExpr->u.zToken[1]=='\'' );
76172: z = &pExpr->u.zToken[2];
76173: n = sqlite3Strlen30(z) - 1;
76174: assert( z[n]=='\'' );
76175: zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n);
76176: sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC);
76177: break;
76178: }
76179: #endif
76180: case TK_VARIABLE: {
76181: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76182: assert( pExpr->u.zToken!=0 );
76183: assert( pExpr->u.zToken[0]!=0 );
76184: sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target);
76185: if( pExpr->u.zToken[1]!=0 ){
76186: assert( pExpr->u.zToken[0]=='?'
76187: || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 );
76188: sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC);
76189: }
76190: break;
76191: }
76192: case TK_REGISTER: {
76193: inReg = pExpr->iTable;
76194: break;
76195: }
76196: case TK_AS: {
76197: inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
76198: break;
76199: }
76200: #ifndef SQLITE_OMIT_CAST
76201: case TK_CAST: {
76202: /* Expressions of the form: CAST(pLeft AS token) */
76203: int aff, to_op;
76204: inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
76205: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76206: aff = sqlite3AffinityType(pExpr->u.zToken);
76207: to_op = aff - SQLITE_AFF_TEXT + OP_ToText;
76208: assert( to_op==OP_ToText || aff!=SQLITE_AFF_TEXT );
76209: assert( to_op==OP_ToBlob || aff!=SQLITE_AFF_NONE );
76210: assert( to_op==OP_ToNumeric || aff!=SQLITE_AFF_NUMERIC );
76211: assert( to_op==OP_ToInt || aff!=SQLITE_AFF_INTEGER );
76212: assert( to_op==OP_ToReal || aff!=SQLITE_AFF_REAL );
76213: testcase( to_op==OP_ToText );
76214: testcase( to_op==OP_ToBlob );
76215: testcase( to_op==OP_ToNumeric );
76216: testcase( to_op==OP_ToInt );
76217: testcase( to_op==OP_ToReal );
76218: if( inReg!=target ){
76219: sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
76220: inReg = target;
76221: }
76222: sqlite3VdbeAddOp1(v, to_op, inReg);
76223: testcase( usedAsColumnCache(pParse, inReg, inReg) );
76224: sqlite3ExprCacheAffinityChange(pParse, inReg, 1);
76225: break;
76226: }
76227: #endif /* SQLITE_OMIT_CAST */
76228: case TK_LT:
76229: case TK_LE:
76230: case TK_GT:
76231: case TK_GE:
76232: case TK_NE:
76233: case TK_EQ: {
76234: assert( TK_LT==OP_Lt );
76235: assert( TK_LE==OP_Le );
76236: assert( TK_GT==OP_Gt );
76237: assert( TK_GE==OP_Ge );
76238: assert( TK_EQ==OP_Eq );
76239: assert( TK_NE==OP_Ne );
76240: testcase( op==TK_LT );
76241: testcase( op==TK_LE );
76242: testcase( op==TK_GT );
76243: testcase( op==TK_GE );
76244: testcase( op==TK_EQ );
76245: testcase( op==TK_NE );
76246: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
76247: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
76248: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
76249: r1, r2, inReg, SQLITE_STOREP2);
76250: testcase( regFree1==0 );
76251: testcase( regFree2==0 );
76252: break;
76253: }
76254: case TK_IS:
76255: case TK_ISNOT: {
76256: testcase( op==TK_IS );
76257: testcase( op==TK_ISNOT );
76258: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
76259: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
76260: op = (op==TK_IS) ? TK_EQ : TK_NE;
76261: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
76262: r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ);
76263: testcase( regFree1==0 );
76264: testcase( regFree2==0 );
76265: break;
76266: }
76267: case TK_AND:
76268: case TK_OR:
76269: case TK_PLUS:
76270: case TK_STAR:
76271: case TK_MINUS:
76272: case TK_REM:
76273: case TK_BITAND:
76274: case TK_BITOR:
76275: case TK_SLASH:
76276: case TK_LSHIFT:
76277: case TK_RSHIFT:
76278: case TK_CONCAT: {
76279: assert( TK_AND==OP_And );
76280: assert( TK_OR==OP_Or );
76281: assert( TK_PLUS==OP_Add );
76282: assert( TK_MINUS==OP_Subtract );
76283: assert( TK_REM==OP_Remainder );
76284: assert( TK_BITAND==OP_BitAnd );
76285: assert( TK_BITOR==OP_BitOr );
76286: assert( TK_SLASH==OP_Divide );
76287: assert( TK_LSHIFT==OP_ShiftLeft );
76288: assert( TK_RSHIFT==OP_ShiftRight );
76289: assert( TK_CONCAT==OP_Concat );
76290: testcase( op==TK_AND );
76291: testcase( op==TK_OR );
76292: testcase( op==TK_PLUS );
76293: testcase( op==TK_MINUS );
76294: testcase( op==TK_REM );
76295: testcase( op==TK_BITAND );
76296: testcase( op==TK_BITOR );
76297: testcase( op==TK_SLASH );
76298: testcase( op==TK_LSHIFT );
76299: testcase( op==TK_RSHIFT );
76300: testcase( op==TK_CONCAT );
76301: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
76302: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
76303: sqlite3VdbeAddOp3(v, op, r2, r1, target);
76304: testcase( regFree1==0 );
76305: testcase( regFree2==0 );
76306: break;
76307: }
76308: case TK_UMINUS: {
76309: Expr *pLeft = pExpr->pLeft;
76310: assert( pLeft );
76311: if( pLeft->op==TK_INTEGER ){
76312: codeInteger(pParse, pLeft, 1, target);
76313: #ifndef SQLITE_OMIT_FLOATING_POINT
76314: }else if( pLeft->op==TK_FLOAT ){
76315: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76316: codeReal(v, pLeft->u.zToken, 1, target);
76317: #endif
76318: }else{
76319: regFree1 = r1 = sqlite3GetTempReg(pParse);
76320: sqlite3VdbeAddOp2(v, OP_Integer, 0, r1);
76321: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2);
76322: sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target);
76323: testcase( regFree2==0 );
76324: }
76325: inReg = target;
76326: break;
76327: }
76328: case TK_BITNOT:
76329: case TK_NOT: {
76330: assert( TK_BITNOT==OP_BitNot );
76331: assert( TK_NOT==OP_Not );
76332: testcase( op==TK_BITNOT );
76333: testcase( op==TK_NOT );
76334: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
76335: testcase( regFree1==0 );
76336: inReg = target;
76337: sqlite3VdbeAddOp2(v, op, r1, inReg);
76338: break;
76339: }
76340: case TK_ISNULL:
76341: case TK_NOTNULL: {
76342: int addr;
76343: assert( TK_ISNULL==OP_IsNull );
76344: assert( TK_NOTNULL==OP_NotNull );
76345: testcase( op==TK_ISNULL );
76346: testcase( op==TK_NOTNULL );
76347: sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
76348: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
76349: testcase( regFree1==0 );
76350: addr = sqlite3VdbeAddOp1(v, op, r1);
76351: sqlite3VdbeAddOp2(v, OP_AddImm, target, -1);
76352: sqlite3VdbeJumpHere(v, addr);
76353: break;
76354: }
76355: case TK_AGG_FUNCTION: {
76356: AggInfo *pInfo = pExpr->pAggInfo;
76357: if( pInfo==0 ){
76358: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76359: sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
76360: }else{
76361: inReg = pInfo->aFunc[pExpr->iAgg].iMem;
76362: }
76363: break;
76364: }
76365: case TK_CONST_FUNC:
76366: case TK_FUNCTION: {
76367: ExprList *pFarg; /* List of function arguments */
76368: int nFarg; /* Number of function arguments */
76369: FuncDef *pDef; /* The function definition object */
76370: int nId; /* Length of the function name in bytes */
76371: const char *zId; /* The function name */
76372: int constMask = 0; /* Mask of function arguments that are constant */
76373: int i; /* Loop counter */
76374: u8 enc = ENC(db); /* The text encoding used by this database */
76375: CollSeq *pColl = 0; /* A collating sequence */
76376:
76377: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
76378: testcase( op==TK_CONST_FUNC );
76379: testcase( op==TK_FUNCTION );
76380: if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){
76381: pFarg = 0;
76382: }else{
76383: pFarg = pExpr->x.pList;
76384: }
76385: nFarg = pFarg ? pFarg->nExpr : 0;
76386: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76387: zId = pExpr->u.zToken;
76388: nId = sqlite3Strlen30(zId);
76389: pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0);
76390: if( pDef==0 ){
76391: sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId);
76392: break;
76393: }
76394:
76395: /* Attempt a direct implementation of the built-in COALESCE() and
76396: ** IFNULL() functions. This avoids unnecessary evalation of
76397: ** arguments past the first non-NULL argument.
76398: */
76399: if( pDef->flags & SQLITE_FUNC_COALESCE ){
76400: int endCoalesce = sqlite3VdbeMakeLabel(v);
76401: assert( nFarg>=2 );
76402: sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target);
76403: for(i=1; i<nFarg; i++){
76404: sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce);
76405: sqlite3ExprCacheRemove(pParse, target, 1);
76406: sqlite3ExprCachePush(pParse);
76407: sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target);
76408: sqlite3ExprCachePop(pParse, 1);
76409: }
76410: sqlite3VdbeResolveLabel(v, endCoalesce);
76411: break;
76412: }
76413:
76414:
76415: if( pFarg ){
76416: r1 = sqlite3GetTempRange(pParse, nFarg);
1.2.2.1 ! misho 76417:
! 76418: /* For length() and typeof() functions with a column argument,
! 76419: ** set the P5 parameter to the OP_Column opcode to OPFLAG_LENGTHARG
! 76420: ** or OPFLAG_TYPEOFARG respectively, to avoid unnecessary data
! 76421: ** loading.
! 76422: */
! 76423: if( (pDef->flags & (SQLITE_FUNC_LENGTH|SQLITE_FUNC_TYPEOF))!=0 ){
! 76424: u8 exprOp;
! 76425: assert( nFarg==1 );
! 76426: assert( pFarg->a[0].pExpr!=0 );
! 76427: exprOp = pFarg->a[0].pExpr->op;
! 76428: if( exprOp==TK_COLUMN || exprOp==TK_AGG_COLUMN ){
! 76429: assert( SQLITE_FUNC_LENGTH==OPFLAG_LENGTHARG );
! 76430: assert( SQLITE_FUNC_TYPEOF==OPFLAG_TYPEOFARG );
! 76431: testcase( pDef->flags==SQLITE_FUNC_LENGTH );
! 76432: pFarg->a[0].pExpr->op2 = pDef->flags;
! 76433: }
! 76434: }
! 76435:
1.2 misho 76436: sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */
76437: sqlite3ExprCodeExprList(pParse, pFarg, r1, 1);
76438: sqlite3ExprCachePop(pParse, 1); /* Ticket 2ea2425d34be */
76439: }else{
76440: r1 = 0;
76441: }
76442: #ifndef SQLITE_OMIT_VIRTUALTABLE
76443: /* Possibly overload the function if the first argument is
76444: ** a virtual table column.
76445: **
76446: ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the
76447: ** second argument, not the first, as the argument to test to
76448: ** see if it is a column in a virtual table. This is done because
76449: ** the left operand of infix functions (the operand we want to
76450: ** control overloading) ends up as the second argument to the
76451: ** function. The expression "A glob B" is equivalent to
76452: ** "glob(B,A). We want to use the A in "A glob B" to test
76453: ** for function overloading. But we use the B term in "glob(B,A)".
76454: */
76455: if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){
76456: pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr);
76457: }else if( nFarg>0 ){
76458: pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr);
76459: }
76460: #endif
76461: for(i=0; i<nFarg; i++){
76462: if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){
76463: constMask |= (1<<i);
76464: }
76465: if( (pDef->flags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){
76466: pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr);
76467: }
76468: }
76469: if( pDef->flags & SQLITE_FUNC_NEEDCOLL ){
76470: if( !pColl ) pColl = db->pDfltColl;
76471: sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ);
76472: }
76473: sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target,
76474: (char*)pDef, P4_FUNCDEF);
76475: sqlite3VdbeChangeP5(v, (u8)nFarg);
76476: if( nFarg ){
76477: sqlite3ReleaseTempRange(pParse, r1, nFarg);
76478: }
76479: break;
76480: }
76481: #ifndef SQLITE_OMIT_SUBQUERY
76482: case TK_EXISTS:
76483: case TK_SELECT: {
76484: testcase( op==TK_EXISTS );
76485: testcase( op==TK_SELECT );
76486: inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0);
76487: break;
76488: }
76489: case TK_IN: {
76490: int destIfFalse = sqlite3VdbeMakeLabel(v);
76491: int destIfNull = sqlite3VdbeMakeLabel(v);
76492: sqlite3VdbeAddOp2(v, OP_Null, 0, target);
76493: sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
76494: sqlite3VdbeAddOp2(v, OP_Integer, 1, target);
76495: sqlite3VdbeResolveLabel(v, destIfFalse);
76496: sqlite3VdbeAddOp2(v, OP_AddImm, target, 0);
76497: sqlite3VdbeResolveLabel(v, destIfNull);
76498: break;
76499: }
76500: #endif /* SQLITE_OMIT_SUBQUERY */
76501:
76502:
76503: /*
76504: ** x BETWEEN y AND z
76505: **
76506: ** This is equivalent to
76507: **
76508: ** x>=y AND x<=z
76509: **
76510: ** X is stored in pExpr->pLeft.
76511: ** Y is stored in pExpr->pList->a[0].pExpr.
76512: ** Z is stored in pExpr->pList->a[1].pExpr.
76513: */
76514: case TK_BETWEEN: {
76515: Expr *pLeft = pExpr->pLeft;
76516: struct ExprList_item *pLItem = pExpr->x.pList->a;
76517: Expr *pRight = pLItem->pExpr;
76518:
76519: r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1);
76520: r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2);
76521: testcase( regFree1==0 );
76522: testcase( regFree2==0 );
76523: r3 = sqlite3GetTempReg(pParse);
76524: r4 = sqlite3GetTempReg(pParse);
76525: codeCompare(pParse, pLeft, pRight, OP_Ge,
76526: r1, r2, r3, SQLITE_STOREP2);
76527: pLItem++;
76528: pRight = pLItem->pExpr;
76529: sqlite3ReleaseTempReg(pParse, regFree2);
76530: r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2);
76531: testcase( regFree2==0 );
76532: codeCompare(pParse, pLeft, pRight, OP_Le, r1, r2, r4, SQLITE_STOREP2);
76533: sqlite3VdbeAddOp3(v, OP_And, r3, r4, target);
76534: sqlite3ReleaseTempReg(pParse, r3);
76535: sqlite3ReleaseTempReg(pParse, r4);
76536: break;
76537: }
1.2.2.1 ! misho 76538: case TK_COLLATE:
1.2 misho 76539: case TK_UPLUS: {
76540: inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
76541: break;
76542: }
76543:
76544: case TK_TRIGGER: {
76545: /* If the opcode is TK_TRIGGER, then the expression is a reference
76546: ** to a column in the new.* or old.* pseudo-tables available to
76547: ** trigger programs. In this case Expr.iTable is set to 1 for the
76548: ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn
76549: ** is set to the column of the pseudo-table to read, or to -1 to
76550: ** read the rowid field.
76551: **
76552: ** The expression is implemented using an OP_Param opcode. The p1
76553: ** parameter is set to 0 for an old.rowid reference, or to (i+1)
76554: ** to reference another column of the old.* pseudo-table, where
76555: ** i is the index of the column. For a new.rowid reference, p1 is
76556: ** set to (n+1), where n is the number of columns in each pseudo-table.
76557: ** For a reference to any other column in the new.* pseudo-table, p1
76558: ** is set to (n+2+i), where n and i are as defined previously. For
76559: ** example, if the table on which triggers are being fired is
76560: ** declared as:
76561: **
76562: ** CREATE TABLE t1(a, b);
76563: **
76564: ** Then p1 is interpreted as follows:
76565: **
76566: ** p1==0 -> old.rowid p1==3 -> new.rowid
76567: ** p1==1 -> old.a p1==4 -> new.a
76568: ** p1==2 -> old.b p1==5 -> new.b
76569: */
76570: Table *pTab = pExpr->pTab;
76571: int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn;
76572:
76573: assert( pExpr->iTable==0 || pExpr->iTable==1 );
76574: assert( pExpr->iColumn>=-1 && pExpr->iColumn<pTab->nCol );
76575: assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey );
76576: assert( p1>=0 && p1<(pTab->nCol*2+2) );
76577:
76578: sqlite3VdbeAddOp2(v, OP_Param, p1, target);
76579: VdbeComment((v, "%s.%s -> $%d",
76580: (pExpr->iTable ? "new" : "old"),
76581: (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName),
76582: target
76583: ));
76584:
76585: #ifndef SQLITE_OMIT_FLOATING_POINT
76586: /* If the column has REAL affinity, it may currently be stored as an
76587: ** integer. Use OP_RealAffinity to make sure it is really real. */
76588: if( pExpr->iColumn>=0
76589: && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL
76590: ){
76591: sqlite3VdbeAddOp1(v, OP_RealAffinity, target);
76592: }
76593: #endif
76594: break;
76595: }
76596:
76597:
76598: /*
76599: ** Form A:
76600: ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END
76601: **
76602: ** Form B:
76603: ** CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END
76604: **
76605: ** Form A is can be transformed into the equivalent form B as follows:
76606: ** CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ...
76607: ** WHEN x=eN THEN rN ELSE y END
76608: **
76609: ** X (if it exists) is in pExpr->pLeft.
76610: ** Y is in pExpr->pRight. The Y is also optional. If there is no
76611: ** ELSE clause and no other term matches, then the result of the
76612: ** exprssion is NULL.
76613: ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1].
76614: **
76615: ** The result of the expression is the Ri for the first matching Ei,
76616: ** or if there is no matching Ei, the ELSE term Y, or if there is
76617: ** no ELSE term, NULL.
76618: */
76619: default: assert( op==TK_CASE ); {
76620: int endLabel; /* GOTO label for end of CASE stmt */
76621: int nextCase; /* GOTO label for next WHEN clause */
76622: int nExpr; /* 2x number of WHEN terms */
76623: int i; /* Loop counter */
76624: ExprList *pEList; /* List of WHEN terms */
76625: struct ExprList_item *aListelem; /* Array of WHEN terms */
76626: Expr opCompare; /* The X==Ei expression */
76627: Expr cacheX; /* Cached expression X */
76628: Expr *pX; /* The X expression */
76629: Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */
76630: VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; )
76631:
76632: assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList );
76633: assert((pExpr->x.pList->nExpr % 2) == 0);
76634: assert(pExpr->x.pList->nExpr > 0);
76635: pEList = pExpr->x.pList;
76636: aListelem = pEList->a;
76637: nExpr = pEList->nExpr;
76638: endLabel = sqlite3VdbeMakeLabel(v);
76639: if( (pX = pExpr->pLeft)!=0 ){
76640: cacheX = *pX;
76641: testcase( pX->op==TK_COLUMN );
76642: testcase( pX->op==TK_REGISTER );
76643: cacheX.iTable = sqlite3ExprCodeTemp(pParse, pX, ®Free1);
76644: testcase( regFree1==0 );
76645: cacheX.op = TK_REGISTER;
76646: opCompare.op = TK_EQ;
76647: opCompare.pLeft = &cacheX;
76648: pTest = &opCompare;
76649: /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001:
76650: ** The value in regFree1 might get SCopy-ed into the file result.
76651: ** So make sure that the regFree1 register is not reused for other
76652: ** purposes and possibly overwritten. */
76653: regFree1 = 0;
76654: }
76655: for(i=0; i<nExpr; i=i+2){
76656: sqlite3ExprCachePush(pParse);
76657: if( pX ){
76658: assert( pTest!=0 );
76659: opCompare.pRight = aListelem[i].pExpr;
76660: }else{
76661: pTest = aListelem[i].pExpr;
76662: }
76663: nextCase = sqlite3VdbeMakeLabel(v);
76664: testcase( pTest->op==TK_COLUMN );
76665: sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL);
76666: testcase( aListelem[i+1].pExpr->op==TK_COLUMN );
76667: testcase( aListelem[i+1].pExpr->op==TK_REGISTER );
76668: sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target);
76669: sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel);
76670: sqlite3ExprCachePop(pParse, 1);
76671: sqlite3VdbeResolveLabel(v, nextCase);
76672: }
76673: if( pExpr->pRight ){
76674: sqlite3ExprCachePush(pParse);
76675: sqlite3ExprCode(pParse, pExpr->pRight, target);
76676: sqlite3ExprCachePop(pParse, 1);
76677: }else{
76678: sqlite3VdbeAddOp2(v, OP_Null, 0, target);
76679: }
76680: assert( db->mallocFailed || pParse->nErr>0
76681: || pParse->iCacheLevel==iCacheLevel );
76682: sqlite3VdbeResolveLabel(v, endLabel);
76683: break;
76684: }
76685: #ifndef SQLITE_OMIT_TRIGGER
76686: case TK_RAISE: {
76687: assert( pExpr->affinity==OE_Rollback
76688: || pExpr->affinity==OE_Abort
76689: || pExpr->affinity==OE_Fail
76690: || pExpr->affinity==OE_Ignore
76691: );
76692: if( !pParse->pTriggerTab ){
76693: sqlite3ErrorMsg(pParse,
76694: "RAISE() may only be used within a trigger-program");
76695: return 0;
76696: }
76697: if( pExpr->affinity==OE_Abort ){
76698: sqlite3MayAbort(pParse);
76699: }
76700: assert( !ExprHasProperty(pExpr, EP_IntValue) );
76701: if( pExpr->affinity==OE_Ignore ){
76702: sqlite3VdbeAddOp4(
76703: v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0);
76704: }else{
76705: sqlite3HaltConstraint(pParse, pExpr->affinity, pExpr->u.zToken, 0);
76706: }
76707:
76708: break;
76709: }
76710: #endif
76711: }
76712: sqlite3ReleaseTempReg(pParse, regFree1);
76713: sqlite3ReleaseTempReg(pParse, regFree2);
76714: return inReg;
76715: }
76716:
76717: /*
76718: ** Generate code to evaluate an expression and store the results
76719: ** into a register. Return the register number where the results
76720: ** are stored.
76721: **
76722: ** If the register is a temporary register that can be deallocated,
76723: ** then write its number into *pReg. If the result register is not
76724: ** a temporary, then set *pReg to zero.
76725: */
76726: SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){
76727: int r1 = sqlite3GetTempReg(pParse);
76728: int r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
76729: if( r2==r1 ){
76730: *pReg = r1;
76731: }else{
76732: sqlite3ReleaseTempReg(pParse, r1);
76733: *pReg = 0;
76734: }
76735: return r2;
76736: }
76737:
76738: /*
76739: ** Generate code that will evaluate expression pExpr and store the
76740: ** results in register target. The results are guaranteed to appear
76741: ** in register target.
76742: */
76743: SQLITE_PRIVATE int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){
76744: int inReg;
76745:
76746: assert( target>0 && target<=pParse->nMem );
76747: if( pExpr && pExpr->op==TK_REGISTER ){
76748: sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target);
76749: }else{
76750: inReg = sqlite3ExprCodeTarget(pParse, pExpr, target);
76751: assert( pParse->pVdbe || pParse->db->mallocFailed );
76752: if( inReg!=target && pParse->pVdbe ){
76753: sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target);
76754: }
76755: }
76756: return target;
76757: }
76758:
76759: /*
76760: ** Generate code that evalutes the given expression and puts the result
76761: ** in register target.
76762: **
76763: ** Also make a copy of the expression results into another "cache" register
76764: ** and modify the expression so that the next time it is evaluated,
76765: ** the result is a copy of the cache register.
76766: **
76767: ** This routine is used for expressions that are used multiple
76768: ** times. They are evaluated once and the results of the expression
76769: ** are reused.
76770: */
76771: SQLITE_PRIVATE int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){
76772: Vdbe *v = pParse->pVdbe;
76773: int inReg;
76774: inReg = sqlite3ExprCode(pParse, pExpr, target);
76775: assert( target>0 );
76776: /* This routine is called for terms to INSERT or UPDATE. And the only
76777: ** other place where expressions can be converted into TK_REGISTER is
76778: ** in WHERE clause processing. So as currently implemented, there is
76779: ** no way for a TK_REGISTER to exist here. But it seems prudent to
76780: ** keep the ALWAYS() in case the conditions above change with future
76781: ** modifications or enhancements. */
76782: if( ALWAYS(pExpr->op!=TK_REGISTER) ){
76783: int iMem;
76784: iMem = ++pParse->nMem;
76785: sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem);
76786: pExpr->iTable = iMem;
76787: pExpr->op2 = pExpr->op;
76788: pExpr->op = TK_REGISTER;
76789: }
76790: return inReg;
76791: }
76792:
76793: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
76794: /*
76795: ** Generate a human-readable explanation of an expression tree.
76796: */
76797: SQLITE_PRIVATE void sqlite3ExplainExpr(Vdbe *pOut, Expr *pExpr){
76798: int op; /* The opcode being coded */
76799: const char *zBinOp = 0; /* Binary operator */
76800: const char *zUniOp = 0; /* Unary operator */
76801: if( pExpr==0 ){
76802: op = TK_NULL;
76803: }else{
76804: op = pExpr->op;
76805: }
76806: switch( op ){
76807: case TK_AGG_COLUMN: {
76808: sqlite3ExplainPrintf(pOut, "AGG{%d:%d}",
76809: pExpr->iTable, pExpr->iColumn);
76810: break;
76811: }
76812: case TK_COLUMN: {
76813: if( pExpr->iTable<0 ){
76814: /* This only happens when coding check constraints */
76815: sqlite3ExplainPrintf(pOut, "COLUMN(%d)", pExpr->iColumn);
76816: }else{
76817: sqlite3ExplainPrintf(pOut, "{%d:%d}",
76818: pExpr->iTable, pExpr->iColumn);
76819: }
76820: break;
76821: }
76822: case TK_INTEGER: {
76823: if( pExpr->flags & EP_IntValue ){
76824: sqlite3ExplainPrintf(pOut, "%d", pExpr->u.iValue);
76825: }else{
76826: sqlite3ExplainPrintf(pOut, "%s", pExpr->u.zToken);
76827: }
76828: break;
76829: }
76830: #ifndef SQLITE_OMIT_FLOATING_POINT
76831: case TK_FLOAT: {
76832: sqlite3ExplainPrintf(pOut,"%s", pExpr->u.zToken);
76833: break;
76834: }
76835: #endif
76836: case TK_STRING: {
76837: sqlite3ExplainPrintf(pOut,"%Q", pExpr->u.zToken);
76838: break;
76839: }
76840: case TK_NULL: {
76841: sqlite3ExplainPrintf(pOut,"NULL");
76842: break;
76843: }
76844: #ifndef SQLITE_OMIT_BLOB_LITERAL
76845: case TK_BLOB: {
76846: sqlite3ExplainPrintf(pOut,"%s", pExpr->u.zToken);
76847: break;
76848: }
76849: #endif
76850: case TK_VARIABLE: {
76851: sqlite3ExplainPrintf(pOut,"VARIABLE(%s,%d)",
76852: pExpr->u.zToken, pExpr->iColumn);
76853: break;
76854: }
76855: case TK_REGISTER: {
76856: sqlite3ExplainPrintf(pOut,"REGISTER(%d)", pExpr->iTable);
76857: break;
76858: }
76859: case TK_AS: {
76860: sqlite3ExplainExpr(pOut, pExpr->pLeft);
76861: break;
76862: }
76863: #ifndef SQLITE_OMIT_CAST
76864: case TK_CAST: {
76865: /* Expressions of the form: CAST(pLeft AS token) */
76866: const char *zAff = "unk";
76867: switch( sqlite3AffinityType(pExpr->u.zToken) ){
76868: case SQLITE_AFF_TEXT: zAff = "TEXT"; break;
76869: case SQLITE_AFF_NONE: zAff = "NONE"; break;
76870: case SQLITE_AFF_NUMERIC: zAff = "NUMERIC"; break;
76871: case SQLITE_AFF_INTEGER: zAff = "INTEGER"; break;
76872: case SQLITE_AFF_REAL: zAff = "REAL"; break;
76873: }
76874: sqlite3ExplainPrintf(pOut, "CAST-%s(", zAff);
76875: sqlite3ExplainExpr(pOut, pExpr->pLeft);
76876: sqlite3ExplainPrintf(pOut, ")");
76877: break;
76878: }
76879: #endif /* SQLITE_OMIT_CAST */
76880: case TK_LT: zBinOp = "LT"; break;
76881: case TK_LE: zBinOp = "LE"; break;
76882: case TK_GT: zBinOp = "GT"; break;
76883: case TK_GE: zBinOp = "GE"; break;
76884: case TK_NE: zBinOp = "NE"; break;
76885: case TK_EQ: zBinOp = "EQ"; break;
76886: case TK_IS: zBinOp = "IS"; break;
76887: case TK_ISNOT: zBinOp = "ISNOT"; break;
76888: case TK_AND: zBinOp = "AND"; break;
76889: case TK_OR: zBinOp = "OR"; break;
76890: case TK_PLUS: zBinOp = "ADD"; break;
76891: case TK_STAR: zBinOp = "MUL"; break;
76892: case TK_MINUS: zBinOp = "SUB"; break;
76893: case TK_REM: zBinOp = "REM"; break;
76894: case TK_BITAND: zBinOp = "BITAND"; break;
76895: case TK_BITOR: zBinOp = "BITOR"; break;
76896: case TK_SLASH: zBinOp = "DIV"; break;
76897: case TK_LSHIFT: zBinOp = "LSHIFT"; break;
76898: case TK_RSHIFT: zBinOp = "RSHIFT"; break;
76899: case TK_CONCAT: zBinOp = "CONCAT"; break;
76900:
76901: case TK_UMINUS: zUniOp = "UMINUS"; break;
76902: case TK_UPLUS: zUniOp = "UPLUS"; break;
76903: case TK_BITNOT: zUniOp = "BITNOT"; break;
76904: case TK_NOT: zUniOp = "NOT"; break;
76905: case TK_ISNULL: zUniOp = "ISNULL"; break;
76906: case TK_NOTNULL: zUniOp = "NOTNULL"; break;
76907:
1.2.2.1 ! misho 76908: case TK_COLLATE: {
! 76909: sqlite3ExplainExpr(pOut, pExpr->pLeft);
! 76910: sqlite3ExplainPrintf(pOut,".COLLATE(%s)",pExpr->u.zToken);
! 76911: break;
! 76912: }
! 76913:
1.2 misho 76914: case TK_AGG_FUNCTION:
76915: case TK_CONST_FUNC:
76916: case TK_FUNCTION: {
76917: ExprList *pFarg; /* List of function arguments */
76918: if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){
76919: pFarg = 0;
76920: }else{
76921: pFarg = pExpr->x.pList;
76922: }
1.2.2.1 ! misho 76923: if( op==TK_AGG_FUNCTION ){
! 76924: sqlite3ExplainPrintf(pOut, "AGG_FUNCTION%d:%s(",
! 76925: pExpr->op2, pExpr->u.zToken);
! 76926: }else{
! 76927: sqlite3ExplainPrintf(pOut, "FUNCTION:%s(", pExpr->u.zToken);
! 76928: }
1.2 misho 76929: if( pFarg ){
76930: sqlite3ExplainExprList(pOut, pFarg);
76931: }
76932: sqlite3ExplainPrintf(pOut, ")");
76933: break;
76934: }
76935: #ifndef SQLITE_OMIT_SUBQUERY
76936: case TK_EXISTS: {
76937: sqlite3ExplainPrintf(pOut, "EXISTS(");
76938: sqlite3ExplainSelect(pOut, pExpr->x.pSelect);
76939: sqlite3ExplainPrintf(pOut,")");
76940: break;
76941: }
76942: case TK_SELECT: {
76943: sqlite3ExplainPrintf(pOut, "(");
76944: sqlite3ExplainSelect(pOut, pExpr->x.pSelect);
76945: sqlite3ExplainPrintf(pOut, ")");
76946: break;
76947: }
76948: case TK_IN: {
76949: sqlite3ExplainPrintf(pOut, "IN(");
76950: sqlite3ExplainExpr(pOut, pExpr->pLeft);
76951: sqlite3ExplainPrintf(pOut, ",");
76952: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
76953: sqlite3ExplainSelect(pOut, pExpr->x.pSelect);
76954: }else{
76955: sqlite3ExplainExprList(pOut, pExpr->x.pList);
76956: }
76957: sqlite3ExplainPrintf(pOut, ")");
76958: break;
76959: }
76960: #endif /* SQLITE_OMIT_SUBQUERY */
76961:
76962: /*
76963: ** x BETWEEN y AND z
76964: **
76965: ** This is equivalent to
76966: **
76967: ** x>=y AND x<=z
76968: **
76969: ** X is stored in pExpr->pLeft.
76970: ** Y is stored in pExpr->pList->a[0].pExpr.
76971: ** Z is stored in pExpr->pList->a[1].pExpr.
76972: */
76973: case TK_BETWEEN: {
76974: Expr *pX = pExpr->pLeft;
76975: Expr *pY = pExpr->x.pList->a[0].pExpr;
76976: Expr *pZ = pExpr->x.pList->a[1].pExpr;
76977: sqlite3ExplainPrintf(pOut, "BETWEEN(");
76978: sqlite3ExplainExpr(pOut, pX);
76979: sqlite3ExplainPrintf(pOut, ",");
76980: sqlite3ExplainExpr(pOut, pY);
76981: sqlite3ExplainPrintf(pOut, ",");
76982: sqlite3ExplainExpr(pOut, pZ);
76983: sqlite3ExplainPrintf(pOut, ")");
76984: break;
76985: }
76986: case TK_TRIGGER: {
76987: /* If the opcode is TK_TRIGGER, then the expression is a reference
76988: ** to a column in the new.* or old.* pseudo-tables available to
76989: ** trigger programs. In this case Expr.iTable is set to 1 for the
76990: ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn
76991: ** is set to the column of the pseudo-table to read, or to -1 to
76992: ** read the rowid field.
76993: */
76994: sqlite3ExplainPrintf(pOut, "%s(%d)",
76995: pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn);
76996: break;
76997: }
76998: case TK_CASE: {
76999: sqlite3ExplainPrintf(pOut, "CASE(");
77000: sqlite3ExplainExpr(pOut, pExpr->pLeft);
77001: sqlite3ExplainPrintf(pOut, ",");
77002: sqlite3ExplainExprList(pOut, pExpr->x.pList);
77003: break;
77004: }
77005: #ifndef SQLITE_OMIT_TRIGGER
77006: case TK_RAISE: {
77007: const char *zType = "unk";
77008: switch( pExpr->affinity ){
77009: case OE_Rollback: zType = "rollback"; break;
77010: case OE_Abort: zType = "abort"; break;
77011: case OE_Fail: zType = "fail"; break;
77012: case OE_Ignore: zType = "ignore"; break;
77013: }
77014: sqlite3ExplainPrintf(pOut, "RAISE-%s(%s)", zType, pExpr->u.zToken);
77015: break;
77016: }
77017: #endif
77018: }
77019: if( zBinOp ){
77020: sqlite3ExplainPrintf(pOut,"%s(", zBinOp);
77021: sqlite3ExplainExpr(pOut, pExpr->pLeft);
77022: sqlite3ExplainPrintf(pOut,",");
77023: sqlite3ExplainExpr(pOut, pExpr->pRight);
77024: sqlite3ExplainPrintf(pOut,")");
77025: }else if( zUniOp ){
77026: sqlite3ExplainPrintf(pOut,"%s(", zUniOp);
77027: sqlite3ExplainExpr(pOut, pExpr->pLeft);
77028: sqlite3ExplainPrintf(pOut,")");
77029: }
77030: }
77031: #endif /* defined(SQLITE_ENABLE_TREE_EXPLAIN) */
77032:
77033: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
77034: /*
77035: ** Generate a human-readable explanation of an expression list.
77036: */
77037: SQLITE_PRIVATE void sqlite3ExplainExprList(Vdbe *pOut, ExprList *pList){
77038: int i;
77039: if( pList==0 || pList->nExpr==0 ){
77040: sqlite3ExplainPrintf(pOut, "(empty-list)");
77041: return;
77042: }else if( pList->nExpr==1 ){
77043: sqlite3ExplainExpr(pOut, pList->a[0].pExpr);
77044: }else{
77045: sqlite3ExplainPush(pOut);
77046: for(i=0; i<pList->nExpr; i++){
77047: sqlite3ExplainPrintf(pOut, "item[%d] = ", i);
77048: sqlite3ExplainPush(pOut);
77049: sqlite3ExplainExpr(pOut, pList->a[i].pExpr);
77050: sqlite3ExplainPop(pOut);
77051: if( i<pList->nExpr-1 ){
77052: sqlite3ExplainNL(pOut);
77053: }
77054: }
77055: sqlite3ExplainPop(pOut);
77056: }
77057: }
77058: #endif /* SQLITE_DEBUG */
77059:
77060: /*
77061: ** Return TRUE if pExpr is an constant expression that is appropriate
77062: ** for factoring out of a loop. Appropriate expressions are:
77063: **
77064: ** * Any expression that evaluates to two or more opcodes.
77065: **
77066: ** * Any OP_Integer, OP_Real, OP_String, OP_Blob, OP_Null,
77067: ** or OP_Variable that does not need to be placed in a
77068: ** specific register.
77069: **
77070: ** There is no point in factoring out single-instruction constant
77071: ** expressions that need to be placed in a particular register.
77072: ** We could factor them out, but then we would end up adding an
77073: ** OP_SCopy instruction to move the value into the correct register
77074: ** later. We might as well just use the original instruction and
77075: ** avoid the OP_SCopy.
77076: */
77077: static int isAppropriateForFactoring(Expr *p){
77078: if( !sqlite3ExprIsConstantNotJoin(p) ){
77079: return 0; /* Only constant expressions are appropriate for factoring */
77080: }
77081: if( (p->flags & EP_FixedDest)==0 ){
77082: return 1; /* Any constant without a fixed destination is appropriate */
77083: }
77084: while( p->op==TK_UPLUS ) p = p->pLeft;
77085: switch( p->op ){
77086: #ifndef SQLITE_OMIT_BLOB_LITERAL
77087: case TK_BLOB:
77088: #endif
77089: case TK_VARIABLE:
77090: case TK_INTEGER:
77091: case TK_FLOAT:
77092: case TK_NULL:
77093: case TK_STRING: {
77094: testcase( p->op==TK_BLOB );
77095: testcase( p->op==TK_VARIABLE );
77096: testcase( p->op==TK_INTEGER );
77097: testcase( p->op==TK_FLOAT );
77098: testcase( p->op==TK_NULL );
77099: testcase( p->op==TK_STRING );
77100: /* Single-instruction constants with a fixed destination are
77101: ** better done in-line. If we factor them, they will just end
77102: ** up generating an OP_SCopy to move the value to the destination
77103: ** register. */
77104: return 0;
77105: }
77106: case TK_UMINUS: {
77107: if( p->pLeft->op==TK_FLOAT || p->pLeft->op==TK_INTEGER ){
77108: return 0;
77109: }
77110: break;
77111: }
77112: default: {
77113: break;
77114: }
77115: }
77116: return 1;
77117: }
77118:
77119: /*
77120: ** If pExpr is a constant expression that is appropriate for
77121: ** factoring out of a loop, then evaluate the expression
77122: ** into a register and convert the expression into a TK_REGISTER
77123: ** expression.
77124: */
77125: static int evalConstExpr(Walker *pWalker, Expr *pExpr){
77126: Parse *pParse = pWalker->pParse;
77127: switch( pExpr->op ){
77128: case TK_IN:
77129: case TK_REGISTER: {
77130: return WRC_Prune;
77131: }
1.2.2.1 ! misho 77132: case TK_COLLATE: {
! 77133: return WRC_Continue;
! 77134: }
1.2 misho 77135: case TK_FUNCTION:
77136: case TK_AGG_FUNCTION:
77137: case TK_CONST_FUNC: {
77138: /* The arguments to a function have a fixed destination.
77139: ** Mark them this way to avoid generated unneeded OP_SCopy
77140: ** instructions.
77141: */
77142: ExprList *pList = pExpr->x.pList;
77143: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
77144: if( pList ){
77145: int i = pList->nExpr;
77146: struct ExprList_item *pItem = pList->a;
77147: for(; i>0; i--, pItem++){
77148: if( ALWAYS(pItem->pExpr) ) pItem->pExpr->flags |= EP_FixedDest;
77149: }
77150: }
77151: break;
77152: }
77153: }
77154: if( isAppropriateForFactoring(pExpr) ){
77155: int r1 = ++pParse->nMem;
1.2.2.1 ! misho 77156: int r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
! 77157: /* If r2!=r1, it means that register r1 is never used. That is harmless
! 77158: ** but suboptimal, so we want to know about the situation to fix it.
! 77159: ** Hence the following assert: */
! 77160: assert( r2==r1 );
1.2 misho 77161: pExpr->op2 = pExpr->op;
77162: pExpr->op = TK_REGISTER;
77163: pExpr->iTable = r2;
77164: return WRC_Prune;
77165: }
77166: return WRC_Continue;
77167: }
77168:
77169: /*
77170: ** Preevaluate constant subexpressions within pExpr and store the
77171: ** results in registers. Modify pExpr so that the constant subexpresions
77172: ** are TK_REGISTER opcodes that refer to the precomputed values.
77173: **
77174: ** This routine is a no-op if the jump to the cookie-check code has
77175: ** already occur. Since the cookie-check jump is generated prior to
77176: ** any other serious processing, this check ensures that there is no
77177: ** way to accidently bypass the constant initializations.
77178: **
77179: ** This routine is also a no-op if the SQLITE_FactorOutConst optimization
77180: ** is disabled via the sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS)
77181: ** interface. This allows test logic to verify that the same answer is
77182: ** obtained for queries regardless of whether or not constants are
77183: ** precomputed into registers or if they are inserted in-line.
77184: */
77185: SQLITE_PRIVATE void sqlite3ExprCodeConstants(Parse *pParse, Expr *pExpr){
77186: Walker w;
77187: if( pParse->cookieGoto ) return;
1.2.2.1 ! misho 77188: if( OptimizationDisabled(pParse->db, SQLITE_FactorOutConst) ) return;
1.2 misho 77189: w.xExprCallback = evalConstExpr;
77190: w.xSelectCallback = 0;
77191: w.pParse = pParse;
77192: sqlite3WalkExpr(&w, pExpr);
77193: }
77194:
77195:
77196: /*
77197: ** Generate code that pushes the value of every element of the given
77198: ** expression list into a sequence of registers beginning at target.
77199: **
77200: ** Return the number of elements evaluated.
77201: */
77202: SQLITE_PRIVATE int sqlite3ExprCodeExprList(
77203: Parse *pParse, /* Parsing context */
77204: ExprList *pList, /* The expression list to be coded */
77205: int target, /* Where to write results */
77206: int doHardCopy /* Make a hard copy of every element */
77207: ){
77208: struct ExprList_item *pItem;
77209: int i, n;
77210: assert( pList!=0 );
77211: assert( target>0 );
77212: assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */
77213: n = pList->nExpr;
77214: for(pItem=pList->a, i=0; i<n; i++, pItem++){
77215: Expr *pExpr = pItem->pExpr;
77216: int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
77217: if( inReg!=target+i ){
77218: sqlite3VdbeAddOp2(pParse->pVdbe, doHardCopy ? OP_Copy : OP_SCopy,
77219: inReg, target+i);
77220: }
77221: }
77222: return n;
77223: }
77224:
77225: /*
77226: ** Generate code for a BETWEEN operator.
77227: **
77228: ** x BETWEEN y AND z
77229: **
77230: ** The above is equivalent to
77231: **
77232: ** x>=y AND x<=z
77233: **
77234: ** Code it as such, taking care to do the common subexpression
77235: ** elementation of x.
77236: */
77237: static void exprCodeBetween(
77238: Parse *pParse, /* Parsing and code generating context */
77239: Expr *pExpr, /* The BETWEEN expression */
77240: int dest, /* Jump here if the jump is taken */
77241: int jumpIfTrue, /* Take the jump if the BETWEEN is true */
77242: int jumpIfNull /* Take the jump if the BETWEEN is NULL */
77243: ){
77244: Expr exprAnd; /* The AND operator in x>=y AND x<=z */
77245: Expr compLeft; /* The x>=y term */
77246: Expr compRight; /* The x<=z term */
77247: Expr exprX; /* The x subexpression */
77248: int regFree1 = 0; /* Temporary use register */
77249:
77250: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
77251: exprX = *pExpr->pLeft;
77252: exprAnd.op = TK_AND;
77253: exprAnd.pLeft = &compLeft;
77254: exprAnd.pRight = &compRight;
77255: compLeft.op = TK_GE;
77256: compLeft.pLeft = &exprX;
77257: compLeft.pRight = pExpr->x.pList->a[0].pExpr;
77258: compRight.op = TK_LE;
77259: compRight.pLeft = &exprX;
77260: compRight.pRight = pExpr->x.pList->a[1].pExpr;
77261: exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, ®Free1);
77262: exprX.op = TK_REGISTER;
77263: if( jumpIfTrue ){
77264: sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull);
77265: }else{
77266: sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull);
77267: }
77268: sqlite3ReleaseTempReg(pParse, regFree1);
77269:
77270: /* Ensure adequate test coverage */
77271: testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1==0 );
77272: testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1!=0 );
77273: testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1==0 );
77274: testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1!=0 );
77275: testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1==0 );
77276: testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1!=0 );
77277: testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1==0 );
77278: testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1!=0 );
77279: }
77280:
77281: /*
77282: ** Generate code for a boolean expression such that a jump is made
77283: ** to the label "dest" if the expression is true but execution
77284: ** continues straight thru if the expression is false.
77285: **
77286: ** If the expression evaluates to NULL (neither true nor false), then
77287: ** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL.
77288: **
77289: ** This code depends on the fact that certain token values (ex: TK_EQ)
77290: ** are the same as opcode values (ex: OP_Eq) that implement the corresponding
77291: ** operation. Special comments in vdbe.c and the mkopcodeh.awk script in
77292: ** the make process cause these values to align. Assert()s in the code
77293: ** below verify that the numbers are aligned correctly.
77294: */
77295: SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
77296: Vdbe *v = pParse->pVdbe;
77297: int op = 0;
77298: int regFree1 = 0;
77299: int regFree2 = 0;
77300: int r1, r2;
77301:
77302: assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
77303: if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */
77304: if( NEVER(pExpr==0) ) return; /* No way this can happen */
77305: op = pExpr->op;
77306: switch( op ){
77307: case TK_AND: {
77308: int d2 = sqlite3VdbeMakeLabel(v);
77309: testcase( jumpIfNull==0 );
77310: sqlite3ExprCachePush(pParse);
77311: sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL);
77312: sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
77313: sqlite3VdbeResolveLabel(v, d2);
77314: sqlite3ExprCachePop(pParse, 1);
77315: break;
77316: }
77317: case TK_OR: {
77318: testcase( jumpIfNull==0 );
77319: sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
77320: sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
77321: break;
77322: }
77323: case TK_NOT: {
77324: testcase( jumpIfNull==0 );
77325: sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
77326: break;
77327: }
77328: case TK_LT:
77329: case TK_LE:
77330: case TK_GT:
77331: case TK_GE:
77332: case TK_NE:
77333: case TK_EQ: {
77334: assert( TK_LT==OP_Lt );
77335: assert( TK_LE==OP_Le );
77336: assert( TK_GT==OP_Gt );
77337: assert( TK_GE==OP_Ge );
77338: assert( TK_EQ==OP_Eq );
77339: assert( TK_NE==OP_Ne );
77340: testcase( op==TK_LT );
77341: testcase( op==TK_LE );
77342: testcase( op==TK_GT );
77343: testcase( op==TK_GE );
77344: testcase( op==TK_EQ );
77345: testcase( op==TK_NE );
77346: testcase( jumpIfNull==0 );
77347: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77348: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
77349: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
77350: r1, r2, dest, jumpIfNull);
77351: testcase( regFree1==0 );
77352: testcase( regFree2==0 );
77353: break;
77354: }
77355: case TK_IS:
77356: case TK_ISNOT: {
77357: testcase( op==TK_IS );
77358: testcase( op==TK_ISNOT );
77359: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77360: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
77361: op = (op==TK_IS) ? TK_EQ : TK_NE;
77362: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
77363: r1, r2, dest, SQLITE_NULLEQ);
77364: testcase( regFree1==0 );
77365: testcase( regFree2==0 );
77366: break;
77367: }
77368: case TK_ISNULL:
77369: case TK_NOTNULL: {
77370: assert( TK_ISNULL==OP_IsNull );
77371: assert( TK_NOTNULL==OP_NotNull );
77372: testcase( op==TK_ISNULL );
77373: testcase( op==TK_NOTNULL );
77374: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77375: sqlite3VdbeAddOp2(v, op, r1, dest);
77376: testcase( regFree1==0 );
77377: break;
77378: }
77379: case TK_BETWEEN: {
77380: testcase( jumpIfNull==0 );
77381: exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull);
77382: break;
77383: }
77384: #ifndef SQLITE_OMIT_SUBQUERY
77385: case TK_IN: {
77386: int destIfFalse = sqlite3VdbeMakeLabel(v);
77387: int destIfNull = jumpIfNull ? dest : destIfFalse;
77388: sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull);
77389: sqlite3VdbeAddOp2(v, OP_Goto, 0, dest);
77390: sqlite3VdbeResolveLabel(v, destIfFalse);
77391: break;
77392: }
77393: #endif
77394: default: {
77395: r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1);
77396: sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0);
77397: testcase( regFree1==0 );
77398: testcase( jumpIfNull==0 );
77399: break;
77400: }
77401: }
77402: sqlite3ReleaseTempReg(pParse, regFree1);
77403: sqlite3ReleaseTempReg(pParse, regFree2);
77404: }
77405:
77406: /*
77407: ** Generate code for a boolean expression such that a jump is made
77408: ** to the label "dest" if the expression is false but execution
77409: ** continues straight thru if the expression is true.
77410: **
77411: ** If the expression evaluates to NULL (neither true nor false) then
77412: ** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull
77413: ** is 0.
77414: */
77415: SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
77416: Vdbe *v = pParse->pVdbe;
77417: int op = 0;
77418: int regFree1 = 0;
77419: int regFree2 = 0;
77420: int r1, r2;
77421:
77422: assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 );
77423: if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */
77424: if( pExpr==0 ) return;
77425:
77426: /* The value of pExpr->op and op are related as follows:
77427: **
77428: ** pExpr->op op
77429: ** --------- ----------
77430: ** TK_ISNULL OP_NotNull
77431: ** TK_NOTNULL OP_IsNull
77432: ** TK_NE OP_Eq
77433: ** TK_EQ OP_Ne
77434: ** TK_GT OP_Le
77435: ** TK_LE OP_Gt
77436: ** TK_GE OP_Lt
77437: ** TK_LT OP_Ge
77438: **
77439: ** For other values of pExpr->op, op is undefined and unused.
77440: ** The value of TK_ and OP_ constants are arranged such that we
77441: ** can compute the mapping above using the following expression.
77442: ** Assert()s verify that the computation is correct.
77443: */
77444: op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1);
77445:
77446: /* Verify correct alignment of TK_ and OP_ constants
77447: */
77448: assert( pExpr->op!=TK_ISNULL || op==OP_NotNull );
77449: assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull );
77450: assert( pExpr->op!=TK_NE || op==OP_Eq );
77451: assert( pExpr->op!=TK_EQ || op==OP_Ne );
77452: assert( pExpr->op!=TK_LT || op==OP_Ge );
77453: assert( pExpr->op!=TK_LE || op==OP_Gt );
77454: assert( pExpr->op!=TK_GT || op==OP_Le );
77455: assert( pExpr->op!=TK_GE || op==OP_Lt );
77456:
77457: switch( pExpr->op ){
77458: case TK_AND: {
77459: testcase( jumpIfNull==0 );
77460: sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
77461: sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
77462: break;
77463: }
77464: case TK_OR: {
77465: int d2 = sqlite3VdbeMakeLabel(v);
77466: testcase( jumpIfNull==0 );
77467: sqlite3ExprCachePush(pParse);
77468: sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL);
77469: sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
77470: sqlite3VdbeResolveLabel(v, d2);
77471: sqlite3ExprCachePop(pParse, 1);
77472: break;
77473: }
77474: case TK_NOT: {
77475: testcase( jumpIfNull==0 );
77476: sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
77477: break;
77478: }
77479: case TK_LT:
77480: case TK_LE:
77481: case TK_GT:
77482: case TK_GE:
77483: case TK_NE:
77484: case TK_EQ: {
77485: testcase( op==TK_LT );
77486: testcase( op==TK_LE );
77487: testcase( op==TK_GT );
77488: testcase( op==TK_GE );
77489: testcase( op==TK_EQ );
77490: testcase( op==TK_NE );
77491: testcase( jumpIfNull==0 );
77492: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77493: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
77494: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
77495: r1, r2, dest, jumpIfNull);
77496: testcase( regFree1==0 );
77497: testcase( regFree2==0 );
77498: break;
77499: }
77500: case TK_IS:
77501: case TK_ISNOT: {
77502: testcase( pExpr->op==TK_IS );
77503: testcase( pExpr->op==TK_ISNOT );
77504: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77505: r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2);
77506: op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ;
77507: codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op,
77508: r1, r2, dest, SQLITE_NULLEQ);
77509: testcase( regFree1==0 );
77510: testcase( regFree2==0 );
77511: break;
77512: }
77513: case TK_ISNULL:
77514: case TK_NOTNULL: {
77515: testcase( op==TK_ISNULL );
77516: testcase( op==TK_NOTNULL );
77517: r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
77518: sqlite3VdbeAddOp2(v, op, r1, dest);
77519: testcase( regFree1==0 );
77520: break;
77521: }
77522: case TK_BETWEEN: {
77523: testcase( jumpIfNull==0 );
77524: exprCodeBetween(pParse, pExpr, dest, 0, jumpIfNull);
77525: break;
77526: }
77527: #ifndef SQLITE_OMIT_SUBQUERY
77528: case TK_IN: {
77529: if( jumpIfNull ){
77530: sqlite3ExprCodeIN(pParse, pExpr, dest, dest);
77531: }else{
77532: int destIfNull = sqlite3VdbeMakeLabel(v);
77533: sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull);
77534: sqlite3VdbeResolveLabel(v, destIfNull);
77535: }
77536: break;
77537: }
77538: #endif
77539: default: {
77540: r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1);
77541: sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0);
77542: testcase( regFree1==0 );
77543: testcase( jumpIfNull==0 );
77544: break;
77545: }
77546: }
77547: sqlite3ReleaseTempReg(pParse, regFree1);
77548: sqlite3ReleaseTempReg(pParse, regFree2);
77549: }
77550:
77551: /*
77552: ** Do a deep comparison of two expression trees. Return 0 if the two
77553: ** expressions are completely identical. Return 1 if they differ only
77554: ** by a COLLATE operator at the top level. Return 2 if there are differences
77555: ** other than the top-level COLLATE operator.
77556: **
77557: ** Sometimes this routine will return 2 even if the two expressions
77558: ** really are equivalent. If we cannot prove that the expressions are
77559: ** identical, we return 2 just to be safe. So if this routine
77560: ** returns 2, then you do not really know for certain if the two
77561: ** expressions are the same. But if you get a 0 or 1 return, then you
77562: ** can be sure the expressions are the same. In the places where
77563: ** this routine is used, it does not hurt to get an extra 2 - that
77564: ** just might result in some slightly slower code. But returning
77565: ** an incorrect 0 or 1 could lead to a malfunction.
77566: */
77567: SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB){
77568: if( pA==0||pB==0 ){
77569: return pB==pA ? 0 : 2;
77570: }
77571: assert( !ExprHasAnyProperty(pA, EP_TokenOnly|EP_Reduced) );
77572: assert( !ExprHasAnyProperty(pB, EP_TokenOnly|EP_Reduced) );
77573: if( ExprHasProperty(pA, EP_xIsSelect) || ExprHasProperty(pB, EP_xIsSelect) ){
77574: return 2;
77575: }
77576: if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2;
1.2.2.1 ! misho 77577: if( pA->op!=pB->op ){
! 77578: if( pA->op==TK_COLLATE && sqlite3ExprCompare(pA->pLeft, pB)<2 ){
! 77579: return 1;
! 77580: }
! 77581: if( pB->op==TK_COLLATE && sqlite3ExprCompare(pA, pB->pLeft)<2 ){
! 77582: return 1;
! 77583: }
! 77584: return 2;
! 77585: }
1.2 misho 77586: if( sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 2;
77587: if( sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 2;
77588: if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList) ) return 2;
77589: if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 2;
77590: if( ExprHasProperty(pA, EP_IntValue) ){
77591: if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){
77592: return 2;
77593: }
1.2.2.1 ! misho 77594: }else if( pA->op!=TK_COLUMN && ALWAYS(pA->op!=TK_AGG_COLUMN) && pA->u.zToken){
1.2 misho 77595: if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2;
77596: if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){
1.2.2.1 ! misho 77597: return pA->op==TK_COLLATE ? 1 : 2;
1.2 misho 77598: }
77599: }
77600: return 0;
77601: }
77602:
77603: /*
77604: ** Compare two ExprList objects. Return 0 if they are identical and
77605: ** non-zero if they differ in any way.
77606: **
77607: ** This routine might return non-zero for equivalent ExprLists. The
77608: ** only consequence will be disabled optimizations. But this routine
77609: ** must never return 0 if the two ExprList objects are different, or
77610: ** a malfunction will result.
77611: **
77612: ** Two NULL pointers are considered to be the same. But a NULL pointer
77613: ** always differs from a non-NULL pointer.
77614: */
77615: SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB){
77616: int i;
77617: if( pA==0 && pB==0 ) return 0;
77618: if( pA==0 || pB==0 ) return 1;
77619: if( pA->nExpr!=pB->nExpr ) return 1;
77620: for(i=0; i<pA->nExpr; i++){
77621: Expr *pExprA = pA->a[i].pExpr;
77622: Expr *pExprB = pB->a[i].pExpr;
77623: if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1;
77624: if( sqlite3ExprCompare(pExprA, pExprB) ) return 1;
77625: }
77626: return 0;
77627: }
77628:
77629: /*
1.2.2.1 ! misho 77630: ** An instance of the following structure is used by the tree walker
! 77631: ** to count references to table columns in the arguments of an
! 77632: ** aggregate function, in order to implement the
! 77633: ** sqlite3FunctionThisSrc() routine.
! 77634: */
! 77635: struct SrcCount {
! 77636: SrcList *pSrc; /* One particular FROM clause in a nested query */
! 77637: int nThis; /* Number of references to columns in pSrcList */
! 77638: int nOther; /* Number of references to columns in other FROM clauses */
! 77639: };
! 77640:
! 77641: /*
! 77642: ** Count the number of references to columns.
! 77643: */
! 77644: static int exprSrcCount(Walker *pWalker, Expr *pExpr){
! 77645: /* The NEVER() on the second term is because sqlite3FunctionUsesThisSrc()
! 77646: ** is always called before sqlite3ExprAnalyzeAggregates() and so the
! 77647: ** TK_COLUMNs have not yet been converted into TK_AGG_COLUMN. If
! 77648: ** sqlite3FunctionUsesThisSrc() is used differently in the future, the
! 77649: ** NEVER() will need to be removed. */
! 77650: if( pExpr->op==TK_COLUMN || NEVER(pExpr->op==TK_AGG_COLUMN) ){
! 77651: int i;
! 77652: struct SrcCount *p = pWalker->u.pSrcCount;
! 77653: SrcList *pSrc = p->pSrc;
! 77654: for(i=0; i<pSrc->nSrc; i++){
! 77655: if( pExpr->iTable==pSrc->a[i].iCursor ) break;
! 77656: }
! 77657: if( i<pSrc->nSrc ){
! 77658: p->nThis++;
! 77659: }else{
! 77660: p->nOther++;
! 77661: }
! 77662: }
! 77663: return WRC_Continue;
! 77664: }
! 77665:
! 77666: /*
! 77667: ** Determine if any of the arguments to the pExpr Function reference
! 77668: ** pSrcList. Return true if they do. Also return true if the function
! 77669: ** has no arguments or has only constant arguments. Return false if pExpr
! 77670: ** references columns but not columns of tables found in pSrcList.
! 77671: */
! 77672: SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){
! 77673: Walker w;
! 77674: struct SrcCount cnt;
! 77675: assert( pExpr->op==TK_AGG_FUNCTION );
! 77676: memset(&w, 0, sizeof(w));
! 77677: w.xExprCallback = exprSrcCount;
! 77678: w.u.pSrcCount = &cnt;
! 77679: cnt.pSrc = pSrcList;
! 77680: cnt.nThis = 0;
! 77681: cnt.nOther = 0;
! 77682: sqlite3WalkExprList(&w, pExpr->x.pList);
! 77683: return cnt.nThis>0 || cnt.nOther==0;
! 77684: }
! 77685:
! 77686: /*
1.2 misho 77687: ** Add a new element to the pAggInfo->aCol[] array. Return the index of
77688: ** the new element. Return a negative number if malloc fails.
77689: */
77690: static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){
77691: int i;
77692: pInfo->aCol = sqlite3ArrayAllocate(
77693: db,
77694: pInfo->aCol,
77695: sizeof(pInfo->aCol[0]),
77696: &pInfo->nColumn,
77697: &i
77698: );
77699: return i;
77700: }
77701:
77702: /*
77703: ** Add a new element to the pAggInfo->aFunc[] array. Return the index of
77704: ** the new element. Return a negative number if malloc fails.
77705: */
77706: static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){
77707: int i;
77708: pInfo->aFunc = sqlite3ArrayAllocate(
77709: db,
77710: pInfo->aFunc,
77711: sizeof(pInfo->aFunc[0]),
77712: &pInfo->nFunc,
77713: &i
77714: );
77715: return i;
77716: }
77717:
77718: /*
77719: ** This is the xExprCallback for a tree walker. It is used to
77720: ** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates
77721: ** for additional information.
77722: */
77723: static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
77724: int i;
77725: NameContext *pNC = pWalker->u.pNC;
77726: Parse *pParse = pNC->pParse;
77727: SrcList *pSrcList = pNC->pSrcList;
77728: AggInfo *pAggInfo = pNC->pAggInfo;
77729:
77730: switch( pExpr->op ){
77731: case TK_AGG_COLUMN:
77732: case TK_COLUMN: {
77733: testcase( pExpr->op==TK_AGG_COLUMN );
77734: testcase( pExpr->op==TK_COLUMN );
77735: /* Check to see if the column is in one of the tables in the FROM
77736: ** clause of the aggregate query */
77737: if( ALWAYS(pSrcList!=0) ){
77738: struct SrcList_item *pItem = pSrcList->a;
77739: for(i=0; i<pSrcList->nSrc; i++, pItem++){
77740: struct AggInfo_col *pCol;
77741: assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
77742: if( pExpr->iTable==pItem->iCursor ){
77743: /* If we reach this point, it means that pExpr refers to a table
77744: ** that is in the FROM clause of the aggregate query.
77745: **
77746: ** Make an entry for the column in pAggInfo->aCol[] if there
77747: ** is not an entry there already.
77748: */
77749: int k;
77750: pCol = pAggInfo->aCol;
77751: for(k=0; k<pAggInfo->nColumn; k++, pCol++){
77752: if( pCol->iTable==pExpr->iTable &&
77753: pCol->iColumn==pExpr->iColumn ){
77754: break;
77755: }
77756: }
77757: if( (k>=pAggInfo->nColumn)
77758: && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0
77759: ){
77760: pCol = &pAggInfo->aCol[k];
77761: pCol->pTab = pExpr->pTab;
77762: pCol->iTable = pExpr->iTable;
77763: pCol->iColumn = pExpr->iColumn;
77764: pCol->iMem = ++pParse->nMem;
77765: pCol->iSorterColumn = -1;
77766: pCol->pExpr = pExpr;
77767: if( pAggInfo->pGroupBy ){
77768: int j, n;
77769: ExprList *pGB = pAggInfo->pGroupBy;
77770: struct ExprList_item *pTerm = pGB->a;
77771: n = pGB->nExpr;
77772: for(j=0; j<n; j++, pTerm++){
77773: Expr *pE = pTerm->pExpr;
77774: if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable &&
77775: pE->iColumn==pExpr->iColumn ){
77776: pCol->iSorterColumn = j;
77777: break;
77778: }
77779: }
77780: }
77781: if( pCol->iSorterColumn<0 ){
77782: pCol->iSorterColumn = pAggInfo->nSortingColumn++;
77783: }
77784: }
77785: /* There is now an entry for pExpr in pAggInfo->aCol[] (either
77786: ** because it was there before or because we just created it).
77787: ** Convert the pExpr to be a TK_AGG_COLUMN referring to that
77788: ** pAggInfo->aCol[] entry.
77789: */
77790: ExprSetIrreducible(pExpr);
77791: pExpr->pAggInfo = pAggInfo;
77792: pExpr->op = TK_AGG_COLUMN;
77793: pExpr->iAgg = (i16)k;
77794: break;
77795: } /* endif pExpr->iTable==pItem->iCursor */
77796: } /* end loop over pSrcList */
77797: }
77798: return WRC_Prune;
77799: }
77800: case TK_AGG_FUNCTION: {
1.2.2.1 ! misho 77801: if( (pNC->ncFlags & NC_InAggFunc)==0
! 77802: && pWalker->walkerDepth==pExpr->op2
! 77803: ){
1.2 misho 77804: /* Check to see if pExpr is a duplicate of another aggregate
77805: ** function that is already in the pAggInfo structure
77806: */
77807: struct AggInfo_func *pItem = pAggInfo->aFunc;
77808: for(i=0; i<pAggInfo->nFunc; i++, pItem++){
77809: if( sqlite3ExprCompare(pItem->pExpr, pExpr)==0 ){
77810: break;
77811: }
77812: }
77813: if( i>=pAggInfo->nFunc ){
77814: /* pExpr is original. Make a new entry in pAggInfo->aFunc[]
77815: */
77816: u8 enc = ENC(pParse->db);
77817: i = addAggInfoFunc(pParse->db, pAggInfo);
77818: if( i>=0 ){
77819: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
77820: pItem = &pAggInfo->aFunc[i];
77821: pItem->pExpr = pExpr;
77822: pItem->iMem = ++pParse->nMem;
77823: assert( !ExprHasProperty(pExpr, EP_IntValue) );
77824: pItem->pFunc = sqlite3FindFunction(pParse->db,
77825: pExpr->u.zToken, sqlite3Strlen30(pExpr->u.zToken),
77826: pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0);
77827: if( pExpr->flags & EP_Distinct ){
77828: pItem->iDistinct = pParse->nTab++;
77829: }else{
77830: pItem->iDistinct = -1;
77831: }
77832: }
77833: }
77834: /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry
77835: */
77836: assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) );
77837: ExprSetIrreducible(pExpr);
77838: pExpr->iAgg = (i16)i;
77839: pExpr->pAggInfo = pAggInfo;
77840: return WRC_Prune;
1.2.2.1 ! misho 77841: }else{
! 77842: return WRC_Continue;
1.2 misho 77843: }
77844: }
77845: }
77846: return WRC_Continue;
77847: }
77848: static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){
1.2.2.1 ! misho 77849: UNUSED_PARAMETER(pWalker);
! 77850: UNUSED_PARAMETER(pSelect);
! 77851: return WRC_Continue;
1.2 misho 77852: }
77853:
77854: /*
1.2.2.1 ! misho 77855: ** Analyze the pExpr expression looking for aggregate functions and
! 77856: ** for variables that need to be added to AggInfo object that pNC->pAggInfo
! 77857: ** points to. Additional entries are made on the AggInfo object as
! 77858: ** necessary.
1.2 misho 77859: **
77860: ** This routine should only be called after the expression has been
77861: ** analyzed by sqlite3ResolveExprNames().
77862: */
77863: SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
77864: Walker w;
1.2.2.1 ! misho 77865: memset(&w, 0, sizeof(w));
1.2 misho 77866: w.xExprCallback = analyzeAggregate;
77867: w.xSelectCallback = analyzeAggregatesInSelect;
77868: w.u.pNC = pNC;
77869: assert( pNC->pSrcList!=0 );
77870: sqlite3WalkExpr(&w, pExpr);
77871: }
77872:
77873: /*
77874: ** Call sqlite3ExprAnalyzeAggregates() for every expression in an
77875: ** expression list. Return the number of errors.
77876: **
77877: ** If an error is found, the analysis is cut short.
77878: */
77879: SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){
77880: struct ExprList_item *pItem;
77881: int i;
77882: if( pList ){
77883: for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
77884: sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr);
77885: }
77886: }
77887: }
77888:
77889: /*
77890: ** Allocate a single new register for use to hold some intermediate result.
77891: */
77892: SQLITE_PRIVATE int sqlite3GetTempReg(Parse *pParse){
77893: if( pParse->nTempReg==0 ){
77894: return ++pParse->nMem;
77895: }
77896: return pParse->aTempReg[--pParse->nTempReg];
77897: }
77898:
77899: /*
77900: ** Deallocate a register, making available for reuse for some other
77901: ** purpose.
77902: **
77903: ** If a register is currently being used by the column cache, then
77904: ** the dallocation is deferred until the column cache line that uses
77905: ** the register becomes stale.
77906: */
77907: SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){
77908: if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){
77909: int i;
77910: struct yColCache *p;
77911: for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){
77912: if( p->iReg==iReg ){
77913: p->tempReg = 1;
77914: return;
77915: }
77916: }
77917: pParse->aTempReg[pParse->nTempReg++] = iReg;
77918: }
77919: }
77920:
77921: /*
77922: ** Allocate or deallocate a block of nReg consecutive registers
77923: */
77924: SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){
77925: int i, n;
77926: i = pParse->iRangeReg;
77927: n = pParse->nRangeReg;
77928: if( nReg<=n ){
77929: assert( !usedAsColumnCache(pParse, i, i+n-1) );
77930: pParse->iRangeReg += nReg;
77931: pParse->nRangeReg -= nReg;
77932: }else{
77933: i = pParse->nMem+1;
77934: pParse->nMem += nReg;
77935: }
77936: return i;
77937: }
77938: SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
77939: sqlite3ExprCacheRemove(pParse, iReg, nReg);
77940: if( nReg>pParse->nRangeReg ){
77941: pParse->nRangeReg = nReg;
77942: pParse->iRangeReg = iReg;
77943: }
77944: }
77945:
77946: /*
77947: ** Mark all temporary registers as being unavailable for reuse.
77948: */
77949: SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){
77950: pParse->nTempReg = 0;
77951: pParse->nRangeReg = 0;
77952: }
77953:
77954: /************** End of expr.c ************************************************/
77955: /************** Begin file alter.c *******************************************/
77956: /*
77957: ** 2005 February 15
77958: **
77959: ** The author disclaims copyright to this source code. In place of
77960: ** a legal notice, here is a blessing:
77961: **
77962: ** May you do good and not evil.
77963: ** May you find forgiveness for yourself and forgive others.
77964: ** May you share freely, never taking more than you give.
77965: **
77966: *************************************************************************
77967: ** This file contains C code routines that used to generate VDBE code
77968: ** that implements the ALTER TABLE command.
77969: */
77970:
77971: /*
77972: ** The code in this file only exists if we are not omitting the
77973: ** ALTER TABLE logic from the build.
77974: */
77975: #ifndef SQLITE_OMIT_ALTERTABLE
77976:
77977:
77978: /*
77979: ** This function is used by SQL generated to implement the
77980: ** ALTER TABLE command. The first argument is the text of a CREATE TABLE or
77981: ** CREATE INDEX command. The second is a table name. The table name in
77982: ** the CREATE TABLE or CREATE INDEX statement is replaced with the third
77983: ** argument and the result returned. Examples:
77984: **
77985: ** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def')
77986: ** -> 'CREATE TABLE def(a, b, c)'
77987: **
77988: ** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def')
77989: ** -> 'CREATE INDEX i ON def(a, b, c)'
77990: */
77991: static void renameTableFunc(
77992: sqlite3_context *context,
77993: int NotUsed,
77994: sqlite3_value **argv
77995: ){
77996: unsigned char const *zSql = sqlite3_value_text(argv[0]);
77997: unsigned char const *zTableName = sqlite3_value_text(argv[1]);
77998:
77999: int token;
78000: Token tname;
78001: unsigned char const *zCsr = zSql;
78002: int len = 0;
78003: char *zRet;
78004:
78005: sqlite3 *db = sqlite3_context_db_handle(context);
78006:
78007: UNUSED_PARAMETER(NotUsed);
78008:
78009: /* The principle used to locate the table name in the CREATE TABLE
78010: ** statement is that the table name is the first non-space token that
78011: ** is immediately followed by a TK_LP or TK_USING token.
78012: */
78013: if( zSql ){
78014: do {
78015: if( !*zCsr ){
78016: /* Ran out of input before finding an opening bracket. Return NULL. */
78017: return;
78018: }
78019:
78020: /* Store the token that zCsr points to in tname. */
78021: tname.z = (char*)zCsr;
78022: tname.n = len;
78023:
78024: /* Advance zCsr to the next token. Store that token type in 'token',
78025: ** and its length in 'len' (to be used next iteration of this loop).
78026: */
78027: do {
78028: zCsr += len;
78029: len = sqlite3GetToken(zCsr, &token);
78030: } while( token==TK_SPACE );
78031: assert( len>0 );
78032: } while( token!=TK_LP && token!=TK_USING );
78033:
78034: zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql,
78035: zTableName, tname.z+tname.n);
78036: sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
78037: }
78038: }
78039:
78040: /*
78041: ** This C function implements an SQL user function that is used by SQL code
78042: ** generated by the ALTER TABLE ... RENAME command to modify the definition
78043: ** of any foreign key constraints that use the table being renamed as the
78044: ** parent table. It is passed three arguments:
78045: **
78046: ** 1) The complete text of the CREATE TABLE statement being modified,
78047: ** 2) The old name of the table being renamed, and
78048: ** 3) The new name of the table being renamed.
78049: **
78050: ** It returns the new CREATE TABLE statement. For example:
78051: **
78052: ** sqlite_rename_parent('CREATE TABLE t1(a REFERENCES t2)', 't2', 't3')
78053: ** -> 'CREATE TABLE t1(a REFERENCES t3)'
78054: */
78055: #ifndef SQLITE_OMIT_FOREIGN_KEY
78056: static void renameParentFunc(
78057: sqlite3_context *context,
78058: int NotUsed,
78059: sqlite3_value **argv
78060: ){
78061: sqlite3 *db = sqlite3_context_db_handle(context);
78062: char *zOutput = 0;
78063: char *zResult;
78064: unsigned char const *zInput = sqlite3_value_text(argv[0]);
78065: unsigned char const *zOld = sqlite3_value_text(argv[1]);
78066: unsigned char const *zNew = sqlite3_value_text(argv[2]);
78067:
78068: unsigned const char *z; /* Pointer to token */
78069: int n; /* Length of token z */
78070: int token; /* Type of token */
78071:
78072: UNUSED_PARAMETER(NotUsed);
78073: for(z=zInput; *z; z=z+n){
78074: n = sqlite3GetToken(z, &token);
78075: if( token==TK_REFERENCES ){
78076: char *zParent;
78077: do {
78078: z += n;
78079: n = sqlite3GetToken(z, &token);
78080: }while( token==TK_SPACE );
78081:
78082: zParent = sqlite3DbStrNDup(db, (const char *)z, n);
78083: if( zParent==0 ) break;
78084: sqlite3Dequote(zParent);
78085: if( 0==sqlite3StrICmp((const char *)zOld, zParent) ){
78086: char *zOut = sqlite3MPrintf(db, "%s%.*s\"%w\"",
78087: (zOutput?zOutput:""), z-zInput, zInput, (const char *)zNew
78088: );
78089: sqlite3DbFree(db, zOutput);
78090: zOutput = zOut;
78091: zInput = &z[n];
78092: }
78093: sqlite3DbFree(db, zParent);
78094: }
78095: }
78096:
78097: zResult = sqlite3MPrintf(db, "%s%s", (zOutput?zOutput:""), zInput),
78098: sqlite3_result_text(context, zResult, -1, SQLITE_DYNAMIC);
78099: sqlite3DbFree(db, zOutput);
78100: }
78101: #endif
78102:
78103: #ifndef SQLITE_OMIT_TRIGGER
78104: /* This function is used by SQL generated to implement the
78105: ** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER
78106: ** statement. The second is a table name. The table name in the CREATE
78107: ** TRIGGER statement is replaced with the third argument and the result
78108: ** returned. This is analagous to renameTableFunc() above, except for CREATE
78109: ** TRIGGER, not CREATE INDEX and CREATE TABLE.
78110: */
78111: static void renameTriggerFunc(
78112: sqlite3_context *context,
78113: int NotUsed,
78114: sqlite3_value **argv
78115: ){
78116: unsigned char const *zSql = sqlite3_value_text(argv[0]);
78117: unsigned char const *zTableName = sqlite3_value_text(argv[1]);
78118:
78119: int token;
78120: Token tname;
78121: int dist = 3;
78122: unsigned char const *zCsr = zSql;
78123: int len = 0;
78124: char *zRet;
78125: sqlite3 *db = sqlite3_context_db_handle(context);
78126:
78127: UNUSED_PARAMETER(NotUsed);
78128:
78129: /* The principle used to locate the table name in the CREATE TRIGGER
78130: ** statement is that the table name is the first token that is immediatedly
78131: ** preceded by either TK_ON or TK_DOT and immediatedly followed by one
78132: ** of TK_WHEN, TK_BEGIN or TK_FOR.
78133: */
78134: if( zSql ){
78135: do {
78136:
78137: if( !*zCsr ){
78138: /* Ran out of input before finding the table name. Return NULL. */
78139: return;
78140: }
78141:
78142: /* Store the token that zCsr points to in tname. */
78143: tname.z = (char*)zCsr;
78144: tname.n = len;
78145:
78146: /* Advance zCsr to the next token. Store that token type in 'token',
78147: ** and its length in 'len' (to be used next iteration of this loop).
78148: */
78149: do {
78150: zCsr += len;
78151: len = sqlite3GetToken(zCsr, &token);
78152: }while( token==TK_SPACE );
78153: assert( len>0 );
78154:
78155: /* Variable 'dist' stores the number of tokens read since the most
78156: ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN
78157: ** token is read and 'dist' equals 2, the condition stated above
78158: ** to be met.
78159: **
78160: ** Note that ON cannot be a database, table or column name, so
78161: ** there is no need to worry about syntax like
78162: ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc.
78163: */
78164: dist++;
78165: if( token==TK_DOT || token==TK_ON ){
78166: dist = 0;
78167: }
78168: } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) );
78169:
78170: /* Variable tname now contains the token that is the old table-name
78171: ** in the CREATE TRIGGER statement.
78172: */
78173: zRet = sqlite3MPrintf(db, "%.*s\"%w\"%s", ((u8*)tname.z) - zSql, zSql,
78174: zTableName, tname.z+tname.n);
78175: sqlite3_result_text(context, zRet, -1, SQLITE_DYNAMIC);
78176: }
78177: }
78178: #endif /* !SQLITE_OMIT_TRIGGER */
78179:
78180: /*
78181: ** Register built-in functions used to help implement ALTER TABLE
78182: */
78183: SQLITE_PRIVATE void sqlite3AlterFunctions(void){
78184: static SQLITE_WSD FuncDef aAlterTableFuncs[] = {
78185: FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc),
78186: #ifndef SQLITE_OMIT_TRIGGER
78187: FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc),
78188: #endif
78189: #ifndef SQLITE_OMIT_FOREIGN_KEY
78190: FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc),
78191: #endif
78192: };
78193: int i;
78194: FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
78195: FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAlterTableFuncs);
78196:
78197: for(i=0; i<ArraySize(aAlterTableFuncs); i++){
78198: sqlite3FuncDefInsert(pHash, &aFunc[i]);
78199: }
78200: }
78201:
78202: /*
78203: ** This function is used to create the text of expressions of the form:
78204: **
78205: ** name=<constant1> OR name=<constant2> OR ...
78206: **
78207: ** If argument zWhere is NULL, then a pointer string containing the text
78208: ** "name=<constant>" is returned, where <constant> is the quoted version
78209: ** of the string passed as argument zConstant. The returned buffer is
78210: ** allocated using sqlite3DbMalloc(). It is the responsibility of the
78211: ** caller to ensure that it is eventually freed.
78212: **
78213: ** If argument zWhere is not NULL, then the string returned is
78214: ** "<where> OR name=<constant>", where <where> is the contents of zWhere.
78215: ** In this case zWhere is passed to sqlite3DbFree() before returning.
78216: **
78217: */
78218: static char *whereOrName(sqlite3 *db, char *zWhere, char *zConstant){
78219: char *zNew;
78220: if( !zWhere ){
78221: zNew = sqlite3MPrintf(db, "name=%Q", zConstant);
78222: }else{
78223: zNew = sqlite3MPrintf(db, "%s OR name=%Q", zWhere, zConstant);
78224: sqlite3DbFree(db, zWhere);
78225: }
78226: return zNew;
78227: }
78228:
78229: #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
78230: /*
78231: ** Generate the text of a WHERE expression which can be used to select all
78232: ** tables that have foreign key constraints that refer to table pTab (i.e.
78233: ** constraints for which pTab is the parent table) from the sqlite_master
78234: ** table.
78235: */
78236: static char *whereForeignKeys(Parse *pParse, Table *pTab){
78237: FKey *p;
78238: char *zWhere = 0;
78239: for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
78240: zWhere = whereOrName(pParse->db, zWhere, p->pFrom->zName);
78241: }
78242: return zWhere;
78243: }
78244: #endif
78245:
78246: /*
78247: ** Generate the text of a WHERE expression which can be used to select all
78248: ** temporary triggers on table pTab from the sqlite_temp_master table. If
78249: ** table pTab has no temporary triggers, or is itself stored in the
78250: ** temporary database, NULL is returned.
78251: */
78252: static char *whereTempTriggers(Parse *pParse, Table *pTab){
78253: Trigger *pTrig;
78254: char *zWhere = 0;
78255: const Schema *pTempSchema = pParse->db->aDb[1].pSchema; /* Temp db schema */
78256:
78257: /* If the table is not located in the temp-db (in which case NULL is
78258: ** returned, loop through the tables list of triggers. For each trigger
78259: ** that is not part of the temp-db schema, add a clause to the WHERE
78260: ** expression being built up in zWhere.
78261: */
78262: if( pTab->pSchema!=pTempSchema ){
78263: sqlite3 *db = pParse->db;
78264: for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
78265: if( pTrig->pSchema==pTempSchema ){
78266: zWhere = whereOrName(db, zWhere, pTrig->zName);
78267: }
78268: }
78269: }
78270: if( zWhere ){
78271: char *zNew = sqlite3MPrintf(pParse->db, "type='trigger' AND (%s)", zWhere);
78272: sqlite3DbFree(pParse->db, zWhere);
78273: zWhere = zNew;
78274: }
78275: return zWhere;
78276: }
78277:
78278: /*
78279: ** Generate code to drop and reload the internal representation of table
78280: ** pTab from the database, including triggers and temporary triggers.
78281: ** Argument zName is the name of the table in the database schema at
78282: ** the time the generated code is executed. This can be different from
78283: ** pTab->zName if this function is being called to code part of an
78284: ** "ALTER TABLE RENAME TO" statement.
78285: */
78286: static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){
78287: Vdbe *v;
78288: char *zWhere;
78289: int iDb; /* Index of database containing pTab */
78290: #ifndef SQLITE_OMIT_TRIGGER
78291: Trigger *pTrig;
78292: #endif
78293:
78294: v = sqlite3GetVdbe(pParse);
78295: if( NEVER(v==0) ) return;
78296: assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
78297: iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
78298: assert( iDb>=0 );
78299:
78300: #ifndef SQLITE_OMIT_TRIGGER
78301: /* Drop any table triggers from the internal schema. */
78302: for(pTrig=sqlite3TriggerList(pParse, pTab); pTrig; pTrig=pTrig->pNext){
78303: int iTrigDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
78304: assert( iTrigDb==iDb || iTrigDb==1 );
78305: sqlite3VdbeAddOp4(v, OP_DropTrigger, iTrigDb, 0, 0, pTrig->zName, 0);
78306: }
78307: #endif
78308:
78309: /* Drop the table and index from the internal schema. */
78310: sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
78311:
78312: /* Reload the table, index and permanent trigger schemas. */
78313: zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName);
78314: if( !zWhere ) return;
78315: sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
78316:
78317: #ifndef SQLITE_OMIT_TRIGGER
78318: /* Now, if the table is not stored in the temp database, reload any temp
78319: ** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined.
78320: */
78321: if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
78322: sqlite3VdbeAddParseSchemaOp(v, 1, zWhere);
78323: }
78324: #endif
78325: }
78326:
78327: /*
78328: ** Parameter zName is the name of a table that is about to be altered
78329: ** (either with ALTER TABLE ... RENAME TO or ALTER TABLE ... ADD COLUMN).
78330: ** If the table is a system table, this function leaves an error message
78331: ** in pParse->zErr (system tables may not be altered) and returns non-zero.
78332: **
78333: ** Or, if zName is not a system table, zero is returned.
78334: */
78335: static int isSystemTable(Parse *pParse, const char *zName){
78336: if( sqlite3Strlen30(zName)>6 && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
78337: sqlite3ErrorMsg(pParse, "table %s may not be altered", zName);
78338: return 1;
78339: }
78340: return 0;
78341: }
78342:
78343: /*
78344: ** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy"
78345: ** command.
78346: */
78347: SQLITE_PRIVATE void sqlite3AlterRenameTable(
78348: Parse *pParse, /* Parser context. */
78349: SrcList *pSrc, /* The table to rename. */
78350: Token *pName /* The new table name. */
78351: ){
78352: int iDb; /* Database that contains the table */
78353: char *zDb; /* Name of database iDb */
78354: Table *pTab; /* Table being renamed */
78355: char *zName = 0; /* NULL-terminated version of pName */
78356: sqlite3 *db = pParse->db; /* Database connection */
78357: int nTabName; /* Number of UTF-8 characters in zTabName */
78358: const char *zTabName; /* Original name of the table */
78359: Vdbe *v;
78360: #ifndef SQLITE_OMIT_TRIGGER
78361: char *zWhere = 0; /* Where clause to locate temp triggers */
78362: #endif
78363: VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */
78364: int savedDbFlags; /* Saved value of db->flags */
78365:
78366: savedDbFlags = db->flags;
78367: if( NEVER(db->mallocFailed) ) goto exit_rename_table;
78368: assert( pSrc->nSrc==1 );
78369: assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
78370:
1.2.2.1 ! misho 78371: pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
1.2 misho 78372: if( !pTab ) goto exit_rename_table;
78373: iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
78374: zDb = db->aDb[iDb].zName;
78375: db->flags |= SQLITE_PreferBuiltin;
78376:
78377: /* Get a NULL terminated version of the new table name. */
78378: zName = sqlite3NameFromToken(db, pName);
78379: if( !zName ) goto exit_rename_table;
78380:
78381: /* Check that a table or index named 'zName' does not already exist
78382: ** in database iDb. If so, this is an error.
78383: */
78384: if( sqlite3FindTable(db, zName, zDb) || sqlite3FindIndex(db, zName, zDb) ){
78385: sqlite3ErrorMsg(pParse,
78386: "there is already another table or index with this name: %s", zName);
78387: goto exit_rename_table;
78388: }
78389:
78390: /* Make sure it is not a system table being altered, or a reserved name
78391: ** that the table is being renamed to.
78392: */
78393: if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){
78394: goto exit_rename_table;
78395: }
78396: if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto
78397: exit_rename_table;
78398: }
78399:
78400: #ifndef SQLITE_OMIT_VIEW
78401: if( pTab->pSelect ){
78402: sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName);
78403: goto exit_rename_table;
78404: }
78405: #endif
78406:
78407: #ifndef SQLITE_OMIT_AUTHORIZATION
78408: /* Invoke the authorization callback. */
78409: if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
78410: goto exit_rename_table;
78411: }
78412: #endif
78413:
78414: #ifndef SQLITE_OMIT_VIRTUALTABLE
78415: if( sqlite3ViewGetColumnNames(pParse, pTab) ){
78416: goto exit_rename_table;
78417: }
78418: if( IsVirtual(pTab) ){
78419: pVTab = sqlite3GetVTable(db, pTab);
78420: if( pVTab->pVtab->pModule->xRename==0 ){
78421: pVTab = 0;
78422: }
78423: }
78424: #endif
78425:
78426: /* Begin a transaction and code the VerifyCookie for database iDb.
78427: ** Then modify the schema cookie (since the ALTER TABLE modifies the
78428: ** schema). Open a statement transaction if the table is a virtual
78429: ** table.
78430: */
78431: v = sqlite3GetVdbe(pParse);
78432: if( v==0 ){
78433: goto exit_rename_table;
78434: }
78435: sqlite3BeginWriteOperation(pParse, pVTab!=0, iDb);
78436: sqlite3ChangeCookie(pParse, iDb);
78437:
78438: /* If this is a virtual table, invoke the xRename() function if
78439: ** one is defined. The xRename() callback will modify the names
78440: ** of any resources used by the v-table implementation (including other
78441: ** SQLite tables) that are identified by the name of the virtual table.
78442: */
78443: #ifndef SQLITE_OMIT_VIRTUALTABLE
78444: if( pVTab ){
78445: int i = ++pParse->nMem;
78446: sqlite3VdbeAddOp4(v, OP_String8, 0, i, 0, zName, 0);
78447: sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB);
78448: sqlite3MayAbort(pParse);
78449: }
78450: #endif
78451:
78452: /* figure out how many UTF-8 characters are in zName */
78453: zTabName = pTab->zName;
78454: nTabName = sqlite3Utf8CharLen(zTabName, -1);
78455:
78456: #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
78457: if( db->flags&SQLITE_ForeignKeys ){
78458: /* If foreign-key support is enabled, rewrite the CREATE TABLE
78459: ** statements corresponding to all child tables of foreign key constraints
78460: ** for which the renamed table is the parent table. */
78461: if( (zWhere=whereForeignKeys(pParse, pTab))!=0 ){
78462: sqlite3NestedParse(pParse,
78463: "UPDATE \"%w\".%s SET "
78464: "sql = sqlite_rename_parent(sql, %Q, %Q) "
78465: "WHERE %s;", zDb, SCHEMA_TABLE(iDb), zTabName, zName, zWhere);
78466: sqlite3DbFree(db, zWhere);
78467: }
78468: }
78469: #endif
78470:
78471: /* Modify the sqlite_master table to use the new table name. */
78472: sqlite3NestedParse(pParse,
78473: "UPDATE %Q.%s SET "
78474: #ifdef SQLITE_OMIT_TRIGGER
78475: "sql = sqlite_rename_table(sql, %Q), "
78476: #else
78477: "sql = CASE "
78478: "WHEN type = 'trigger' THEN sqlite_rename_trigger(sql, %Q)"
78479: "ELSE sqlite_rename_table(sql, %Q) END, "
78480: #endif
78481: "tbl_name = %Q, "
78482: "name = CASE "
78483: "WHEN type='table' THEN %Q "
78484: "WHEN name LIKE 'sqlite_autoindex%%' AND type='index' THEN "
78485: "'sqlite_autoindex_' || %Q || substr(name,%d+18) "
78486: "ELSE name END "
1.2.2.1 ! misho 78487: "WHERE tbl_name=%Q COLLATE nocase AND "
1.2 misho 78488: "(type='table' OR type='index' OR type='trigger');",
78489: zDb, SCHEMA_TABLE(iDb), zName, zName, zName,
78490: #ifndef SQLITE_OMIT_TRIGGER
78491: zName,
78492: #endif
78493: zName, nTabName, zTabName
78494: );
78495:
78496: #ifndef SQLITE_OMIT_AUTOINCREMENT
78497: /* If the sqlite_sequence table exists in this database, then update
78498: ** it with the new table name.
78499: */
78500: if( sqlite3FindTable(db, "sqlite_sequence", zDb) ){
78501: sqlite3NestedParse(pParse,
78502: "UPDATE \"%w\".sqlite_sequence set name = %Q WHERE name = %Q",
78503: zDb, zName, pTab->zName);
78504: }
78505: #endif
78506:
78507: #ifndef SQLITE_OMIT_TRIGGER
78508: /* If there are TEMP triggers on this table, modify the sqlite_temp_master
78509: ** table. Don't do this if the table being ALTERed is itself located in
78510: ** the temp database.
78511: */
78512: if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
78513: sqlite3NestedParse(pParse,
78514: "UPDATE sqlite_temp_master SET "
78515: "sql = sqlite_rename_trigger(sql, %Q), "
78516: "tbl_name = %Q "
78517: "WHERE %s;", zName, zName, zWhere);
78518: sqlite3DbFree(db, zWhere);
78519: }
78520: #endif
78521:
78522: #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
78523: if( db->flags&SQLITE_ForeignKeys ){
78524: FKey *p;
78525: for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
78526: Table *pFrom = p->pFrom;
78527: if( pFrom!=pTab ){
78528: reloadTableSchema(pParse, p->pFrom, pFrom->zName);
78529: }
78530: }
78531: }
78532: #endif
78533:
78534: /* Drop and reload the internal table schema. */
78535: reloadTableSchema(pParse, pTab, zName);
78536:
78537: exit_rename_table:
78538: sqlite3SrcListDelete(db, pSrc);
78539: sqlite3DbFree(db, zName);
78540: db->flags = savedDbFlags;
78541: }
78542:
78543:
78544: /*
78545: ** Generate code to make sure the file format number is at least minFormat.
78546: ** The generated code will increase the file format number if necessary.
78547: */
78548: SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){
78549: Vdbe *v;
78550: v = sqlite3GetVdbe(pParse);
78551: /* The VDBE should have been allocated before this routine is called.
78552: ** If that allocation failed, we would have quit before reaching this
78553: ** point */
78554: if( ALWAYS(v) ){
78555: int r1 = sqlite3GetTempReg(pParse);
78556: int r2 = sqlite3GetTempReg(pParse);
78557: int j1;
78558: sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT);
78559: sqlite3VdbeUsesBtree(v, iDb);
78560: sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2);
78561: j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1);
78562: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2);
78563: sqlite3VdbeJumpHere(v, j1);
78564: sqlite3ReleaseTempReg(pParse, r1);
78565: sqlite3ReleaseTempReg(pParse, r2);
78566: }
78567: }
78568:
78569: /*
78570: ** This function is called after an "ALTER TABLE ... ADD" statement
78571: ** has been parsed. Argument pColDef contains the text of the new
78572: ** column definition.
78573: **
78574: ** The Table structure pParse->pNewTable was extended to include
78575: ** the new column during parsing.
78576: */
78577: SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
78578: Table *pNew; /* Copy of pParse->pNewTable */
78579: Table *pTab; /* Table being altered */
78580: int iDb; /* Database number */
78581: const char *zDb; /* Database name */
78582: const char *zTab; /* Table name */
78583: char *zCol; /* Null-terminated column definition */
78584: Column *pCol; /* The new column */
78585: Expr *pDflt; /* Default value for the new column */
78586: sqlite3 *db; /* The database connection; */
78587:
78588: db = pParse->db;
78589: if( pParse->nErr || db->mallocFailed ) return;
78590: pNew = pParse->pNewTable;
78591: assert( pNew );
78592:
78593: assert( sqlite3BtreeHoldsAllMutexes(db) );
78594: iDb = sqlite3SchemaToIndex(db, pNew->pSchema);
78595: zDb = db->aDb[iDb].zName;
78596: zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */
78597: pCol = &pNew->aCol[pNew->nCol-1];
78598: pDflt = pCol->pDflt;
78599: pTab = sqlite3FindTable(db, zTab, zDb);
78600: assert( pTab );
78601:
78602: #ifndef SQLITE_OMIT_AUTHORIZATION
78603: /* Invoke the authorization callback. */
78604: if( sqlite3AuthCheck(pParse, SQLITE_ALTER_TABLE, zDb, pTab->zName, 0) ){
78605: return;
78606: }
78607: #endif
78608:
78609: /* If the default value for the new column was specified with a
78610: ** literal NULL, then set pDflt to 0. This simplifies checking
78611: ** for an SQL NULL default below.
78612: */
78613: if( pDflt && pDflt->op==TK_NULL ){
78614: pDflt = 0;
78615: }
78616:
78617: /* Check that the new column is not specified as PRIMARY KEY or UNIQUE.
78618: ** If there is a NOT NULL constraint, then the default value for the
78619: ** column must not be NULL.
78620: */
1.2.2.1 ! misho 78621: if( pCol->colFlags & COLFLAG_PRIMKEY ){
1.2 misho 78622: sqlite3ErrorMsg(pParse, "Cannot add a PRIMARY KEY column");
78623: return;
78624: }
78625: if( pNew->pIndex ){
78626: sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column");
78627: return;
78628: }
78629: if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){
78630: sqlite3ErrorMsg(pParse,
78631: "Cannot add a REFERENCES column with non-NULL default value");
78632: return;
78633: }
78634: if( pCol->notNull && !pDflt ){
78635: sqlite3ErrorMsg(pParse,
78636: "Cannot add a NOT NULL column with default value NULL");
78637: return;
78638: }
78639:
78640: /* Ensure the default expression is something that sqlite3ValueFromExpr()
78641: ** can handle (i.e. not CURRENT_TIME etc.)
78642: */
78643: if( pDflt ){
78644: sqlite3_value *pVal;
78645: if( sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_NONE, &pVal) ){
78646: db->mallocFailed = 1;
78647: return;
78648: }
78649: if( !pVal ){
78650: sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default");
78651: return;
78652: }
78653: sqlite3ValueFree(pVal);
78654: }
78655:
78656: /* Modify the CREATE TABLE statement. */
78657: zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n);
78658: if( zCol ){
78659: char *zEnd = &zCol[pColDef->n-1];
78660: int savedDbFlags = db->flags;
78661: while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){
78662: *zEnd-- = '\0';
78663: }
78664: db->flags |= SQLITE_PreferBuiltin;
78665: sqlite3NestedParse(pParse,
78666: "UPDATE \"%w\".%s SET "
78667: "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) "
78668: "WHERE type = 'table' AND name = %Q",
78669: zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1,
78670: zTab
78671: );
78672: sqlite3DbFree(db, zCol);
78673: db->flags = savedDbFlags;
78674: }
78675:
78676: /* If the default value of the new column is NULL, then set the file
78677: ** format to 2. If the default value of the new column is not NULL,
78678: ** the file format becomes 3.
78679: */
78680: sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2);
78681:
78682: /* Reload the schema of the modified table. */
78683: reloadTableSchema(pParse, pTab, pTab->zName);
78684: }
78685:
78686: /*
78687: ** This function is called by the parser after the table-name in
78688: ** an "ALTER TABLE <table-name> ADD" statement is parsed. Argument
78689: ** pSrc is the full-name of the table being altered.
78690: **
78691: ** This routine makes a (partial) copy of the Table structure
78692: ** for the table being altered and sets Parse.pNewTable to point
78693: ** to it. Routines called by the parser as the column definition
78694: ** is parsed (i.e. sqlite3AddColumn()) add the new Column data to
78695: ** the copy. The copy of the Table structure is deleted by tokenize.c
78696: ** after parsing is finished.
78697: **
78698: ** Routine sqlite3AlterFinishAddColumn() will be called to complete
78699: ** coding the "ALTER TABLE ... ADD" statement.
78700: */
78701: SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){
78702: Table *pNew;
78703: Table *pTab;
78704: Vdbe *v;
78705: int iDb;
78706: int i;
78707: int nAlloc;
78708: sqlite3 *db = pParse->db;
78709:
78710: /* Look up the table being altered. */
78711: assert( pParse->pNewTable==0 );
78712: assert( sqlite3BtreeHoldsAllMutexes(db) );
78713: if( db->mallocFailed ) goto exit_begin_add_column;
1.2.2.1 ! misho 78714: pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]);
1.2 misho 78715: if( !pTab ) goto exit_begin_add_column;
78716:
78717: #ifndef SQLITE_OMIT_VIRTUALTABLE
78718: if( IsVirtual(pTab) ){
78719: sqlite3ErrorMsg(pParse, "virtual tables may not be altered");
78720: goto exit_begin_add_column;
78721: }
78722: #endif
78723:
78724: /* Make sure this is not an attempt to ALTER a view. */
78725: if( pTab->pSelect ){
78726: sqlite3ErrorMsg(pParse, "Cannot add a column to a view");
78727: goto exit_begin_add_column;
78728: }
78729: if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){
78730: goto exit_begin_add_column;
78731: }
78732:
78733: assert( pTab->addColOffset>0 );
78734: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
78735:
78736: /* Put a copy of the Table struct in Parse.pNewTable for the
78737: ** sqlite3AddColumn() function and friends to modify. But modify
78738: ** the name by adding an "sqlite_altertab_" prefix. By adding this
78739: ** prefix, we insure that the name will not collide with an existing
78740: ** table because user table are not allowed to have the "sqlite_"
78741: ** prefix on their name.
78742: */
78743: pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table));
78744: if( !pNew ) goto exit_begin_add_column;
78745: pParse->pNewTable = pNew;
78746: pNew->nRef = 1;
78747: pNew->nCol = pTab->nCol;
78748: assert( pNew->nCol>0 );
78749: nAlloc = (((pNew->nCol-1)/8)*8)+8;
78750: assert( nAlloc>=pNew->nCol && nAlloc%8==0 && nAlloc-pNew->nCol<8 );
78751: pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc);
78752: pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName);
78753: if( !pNew->aCol || !pNew->zName ){
78754: db->mallocFailed = 1;
78755: goto exit_begin_add_column;
78756: }
78757: memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol);
78758: for(i=0; i<pNew->nCol; i++){
78759: Column *pCol = &pNew->aCol[i];
78760: pCol->zName = sqlite3DbStrDup(db, pCol->zName);
78761: pCol->zColl = 0;
78762: pCol->zType = 0;
78763: pCol->pDflt = 0;
78764: pCol->zDflt = 0;
78765: }
78766: pNew->pSchema = db->aDb[iDb].pSchema;
78767: pNew->addColOffset = pTab->addColOffset;
78768: pNew->nRef = 1;
78769:
78770: /* Begin a transaction and increment the schema cookie. */
78771: sqlite3BeginWriteOperation(pParse, 0, iDb);
78772: v = sqlite3GetVdbe(pParse);
78773: if( !v ) goto exit_begin_add_column;
78774: sqlite3ChangeCookie(pParse, iDb);
78775:
78776: exit_begin_add_column:
78777: sqlite3SrcListDelete(db, pSrc);
78778: return;
78779: }
78780: #endif /* SQLITE_ALTER_TABLE */
78781:
78782: /************** End of alter.c ***********************************************/
78783: /************** Begin file analyze.c *****************************************/
78784: /*
78785: ** 2005 July 8
78786: **
78787: ** The author disclaims copyright to this source code. In place of
78788: ** a legal notice, here is a blessing:
78789: **
78790: ** May you do good and not evil.
78791: ** May you find forgiveness for yourself and forgive others.
78792: ** May you share freely, never taking more than you give.
78793: **
78794: *************************************************************************
78795: ** This file contains code associated with the ANALYZE command.
78796: **
78797: ** The ANALYZE command gather statistics about the content of tables
78798: ** and indices. These statistics are made available to the query planner
78799: ** to help it make better decisions about how to perform queries.
78800: **
78801: ** The following system tables are or have been supported:
78802: **
78803: ** CREATE TABLE sqlite_stat1(tbl, idx, stat);
78804: ** CREATE TABLE sqlite_stat2(tbl, idx, sampleno, sample);
78805: ** CREATE TABLE sqlite_stat3(tbl, idx, nEq, nLt, nDLt, sample);
78806: **
78807: ** Additional tables might be added in future releases of SQLite.
78808: ** The sqlite_stat2 table is not created or used unless the SQLite version
78809: ** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled
78810: ** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated.
78811: ** The sqlite_stat2 table is superceded by sqlite_stat3, which is only
78812: ** created and used by SQLite versions 3.7.9 and later and with
78813: ** SQLITE_ENABLE_STAT3 defined. The fucntionality of sqlite_stat3
78814: ** is a superset of sqlite_stat2.
78815: **
78816: ** Format of sqlite_stat1:
78817: **
78818: ** There is normally one row per index, with the index identified by the
78819: ** name in the idx column. The tbl column is the name of the table to
78820: ** which the index belongs. In each such row, the stat column will be
78821: ** a string consisting of a list of integers. The first integer in this
78822: ** list is the number of rows in the index and in the table. The second
78823: ** integer is the average number of rows in the index that have the same
78824: ** value in the first column of the index. The third integer is the average
78825: ** number of rows in the index that have the same value for the first two
78826: ** columns. The N-th integer (for N>1) is the average number of rows in
78827: ** the index which have the same value for the first N-1 columns. For
78828: ** a K-column index, there will be K+1 integers in the stat column. If
78829: ** the index is unique, then the last integer will be 1.
78830: **
78831: ** The list of integers in the stat column can optionally be followed
78832: ** by the keyword "unordered". The "unordered" keyword, if it is present,
78833: ** must be separated from the last integer by a single space. If the
78834: ** "unordered" keyword is present, then the query planner assumes that
78835: ** the index is unordered and will not use the index for a range query.
78836: **
78837: ** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat
78838: ** column contains a single integer which is the (estimated) number of
78839: ** rows in the table identified by sqlite_stat1.tbl.
78840: **
78841: ** Format of sqlite_stat2:
78842: **
78843: ** The sqlite_stat2 is only created and is only used if SQLite is compiled
78844: ** with SQLITE_ENABLE_STAT2 and if the SQLite version number is between
78845: ** 3.6.18 and 3.7.8. The "stat2" table contains additional information
78846: ** about the distribution of keys within an index. The index is identified by
78847: ** the "idx" column and the "tbl" column is the name of the table to which
78848: ** the index belongs. There are usually 10 rows in the sqlite_stat2
78849: ** table for each index.
78850: **
78851: ** The sqlite_stat2 entries for an index that have sampleno between 0 and 9
78852: ** inclusive are samples of the left-most key value in the index taken at
78853: ** evenly spaced points along the index. Let the number of samples be S
78854: ** (10 in the standard build) and let C be the number of rows in the index.
78855: ** Then the sampled rows are given by:
78856: **
78857: ** rownumber = (i*C*2 + C)/(S*2)
78858: **
78859: ** For i between 0 and S-1. Conceptually, the index space is divided into
78860: ** S uniform buckets and the samples are the middle row from each bucket.
78861: **
78862: ** The format for sqlite_stat2 is recorded here for legacy reference. This
78863: ** version of SQLite does not support sqlite_stat2. It neither reads nor
78864: ** writes the sqlite_stat2 table. This version of SQLite only supports
78865: ** sqlite_stat3.
78866: **
78867: ** Format for sqlite_stat3:
78868: **
78869: ** The sqlite_stat3 is an enhancement to sqlite_stat2. A new name is
78870: ** used to avoid compatibility problems.
78871: **
78872: ** The format of the sqlite_stat3 table is similar to the format of
78873: ** the sqlite_stat2 table. There are multiple entries for each index.
78874: ** The idx column names the index and the tbl column is the table of the
78875: ** index. If the idx and tbl columns are the same, then the sample is
78876: ** of the INTEGER PRIMARY KEY. The sample column is a value taken from
78877: ** the left-most column of the index. The nEq column is the approximate
78878: ** number of entires in the index whose left-most column exactly matches
78879: ** the sample. nLt is the approximate number of entires whose left-most
78880: ** column is less than the sample. The nDLt column is the approximate
78881: ** number of distinct left-most entries in the index that are less than
78882: ** the sample.
78883: **
78884: ** Future versions of SQLite might change to store a string containing
78885: ** multiple integers values in the nDLt column of sqlite_stat3. The first
78886: ** integer will be the number of prior index entires that are distinct in
78887: ** the left-most column. The second integer will be the number of prior index
78888: ** entries that are distinct in the first two columns. The third integer
78889: ** will be the number of prior index entries that are distinct in the first
78890: ** three columns. And so forth. With that extension, the nDLt field is
78891: ** similar in function to the sqlite_stat1.stat field.
78892: **
78893: ** There can be an arbitrary number of sqlite_stat3 entries per index.
78894: ** The ANALYZE command will typically generate sqlite_stat3 tables
78895: ** that contain between 10 and 40 samples which are distributed across
78896: ** the key space, though not uniformly, and which include samples with
78897: ** largest possible nEq values.
78898: */
78899: #ifndef SQLITE_OMIT_ANALYZE
78900:
78901: /*
78902: ** This routine generates code that opens the sqlite_stat1 table for
78903: ** writing with cursor iStatCur. If the library was built with the
78904: ** SQLITE_ENABLE_STAT3 macro defined, then the sqlite_stat3 table is
78905: ** opened for writing using cursor (iStatCur+1)
78906: **
78907: ** If the sqlite_stat1 tables does not previously exist, it is created.
78908: ** Similarly, if the sqlite_stat3 table does not exist and the library
78909: ** is compiled with SQLITE_ENABLE_STAT3 defined, it is created.
78910: **
78911: ** Argument zWhere may be a pointer to a buffer containing a table name,
78912: ** or it may be a NULL pointer. If it is not NULL, then all entries in
78913: ** the sqlite_stat1 and (if applicable) sqlite_stat3 tables associated
78914: ** with the named table are deleted. If zWhere==0, then code is generated
78915: ** to delete all stat table entries.
78916: */
78917: static void openStatTable(
78918: Parse *pParse, /* Parsing context */
78919: int iDb, /* The database we are looking in */
78920: int iStatCur, /* Open the sqlite_stat1 table on this cursor */
78921: const char *zWhere, /* Delete entries for this table or index */
78922: const char *zWhereType /* Either "tbl" or "idx" */
78923: ){
78924: static const struct {
78925: const char *zName;
78926: const char *zCols;
78927: } aTable[] = {
78928: { "sqlite_stat1", "tbl,idx,stat" },
78929: #ifdef SQLITE_ENABLE_STAT3
78930: { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" },
78931: #endif
78932: };
78933:
78934: int aRoot[] = {0, 0};
78935: u8 aCreateTbl[] = {0, 0};
78936:
78937: int i;
78938: sqlite3 *db = pParse->db;
78939: Db *pDb;
78940: Vdbe *v = sqlite3GetVdbe(pParse);
78941: if( v==0 ) return;
78942: assert( sqlite3BtreeHoldsAllMutexes(db) );
78943: assert( sqlite3VdbeDb(v)==db );
78944: pDb = &db->aDb[iDb];
78945:
78946: /* Create new statistic tables if they do not exist, or clear them
78947: ** if they do already exist.
78948: */
78949: for(i=0; i<ArraySize(aTable); i++){
78950: const char *zTab = aTable[i].zName;
78951: Table *pStat;
78952: if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){
78953: /* The sqlite_stat[12] table does not exist. Create it. Note that a
78954: ** side-effect of the CREATE TABLE statement is to leave the rootpage
78955: ** of the new table in register pParse->regRoot. This is important
78956: ** because the OpenWrite opcode below will be needing it. */
78957: sqlite3NestedParse(pParse,
78958: "CREATE TABLE %Q.%s(%s)", pDb->zName, zTab, aTable[i].zCols
78959: );
78960: aRoot[i] = pParse->regRoot;
1.2.2.1 ! misho 78961: aCreateTbl[i] = OPFLAG_P2ISREG;
1.2 misho 78962: }else{
78963: /* The table already exists. If zWhere is not NULL, delete all entries
78964: ** associated with the table zWhere. If zWhere is NULL, delete the
78965: ** entire contents of the table. */
78966: aRoot[i] = pStat->tnum;
78967: sqlite3TableLock(pParse, iDb, aRoot[i], 1, zTab);
78968: if( zWhere ){
78969: sqlite3NestedParse(pParse,
78970: "DELETE FROM %Q.%s WHERE %s=%Q", pDb->zName, zTab, zWhereType, zWhere
78971: );
78972: }else{
78973: /* The sqlite_stat[12] table already exists. Delete all rows. */
78974: sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb);
78975: }
78976: }
78977: }
78978:
78979: /* Open the sqlite_stat[13] tables for writing. */
78980: for(i=0; i<ArraySize(aTable); i++){
78981: sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur+i, aRoot[i], iDb);
78982: sqlite3VdbeChangeP4(v, -1, (char *)3, P4_INT32);
78983: sqlite3VdbeChangeP5(v, aCreateTbl[i]);
78984: }
78985: }
78986:
78987: /*
78988: ** Recommended number of samples for sqlite_stat3
78989: */
78990: #ifndef SQLITE_STAT3_SAMPLES
78991: # define SQLITE_STAT3_SAMPLES 24
78992: #endif
78993:
78994: /*
78995: ** Three SQL functions - stat3_init(), stat3_push(), and stat3_pop() -
78996: ** share an instance of the following structure to hold their state
78997: ** information.
78998: */
78999: typedef struct Stat3Accum Stat3Accum;
79000: struct Stat3Accum {
79001: tRowcnt nRow; /* Number of rows in the entire table */
79002: tRowcnt nPSample; /* How often to do a periodic sample */
79003: int iMin; /* Index of entry with minimum nEq and hash */
79004: int mxSample; /* Maximum number of samples to accumulate */
79005: int nSample; /* Current number of samples */
79006: u32 iPrn; /* Pseudo-random number used for sampling */
79007: struct Stat3Sample {
79008: i64 iRowid; /* Rowid in main table of the key */
79009: tRowcnt nEq; /* sqlite_stat3.nEq */
79010: tRowcnt nLt; /* sqlite_stat3.nLt */
79011: tRowcnt nDLt; /* sqlite_stat3.nDLt */
79012: u8 isPSample; /* True if a periodic sample */
79013: u32 iHash; /* Tiebreaker hash */
79014: } *a; /* An array of samples */
79015: };
79016:
79017: #ifdef SQLITE_ENABLE_STAT3
79018: /*
79019: ** Implementation of the stat3_init(C,S) SQL function. The two parameters
79020: ** are the number of rows in the table or index (C) and the number of samples
79021: ** to accumulate (S).
79022: **
79023: ** This routine allocates the Stat3Accum object.
79024: **
79025: ** The return value is the Stat3Accum object (P).
79026: */
79027: static void stat3Init(
79028: sqlite3_context *context,
79029: int argc,
79030: sqlite3_value **argv
79031: ){
79032: Stat3Accum *p;
79033: tRowcnt nRow;
79034: int mxSample;
79035: int n;
79036:
79037: UNUSED_PARAMETER(argc);
79038: nRow = (tRowcnt)sqlite3_value_int64(argv[0]);
79039: mxSample = sqlite3_value_int(argv[1]);
79040: n = sizeof(*p) + sizeof(p->a[0])*mxSample;
1.2.2.1 ! misho 79041: p = sqlite3MallocZero( n );
1.2 misho 79042: if( p==0 ){
79043: sqlite3_result_error_nomem(context);
79044: return;
79045: }
79046: p->a = (struct Stat3Sample*)&p[1];
79047: p->nRow = nRow;
79048: p->mxSample = mxSample;
79049: p->nPSample = p->nRow/(mxSample/3+1) + 1;
79050: sqlite3_randomness(sizeof(p->iPrn), &p->iPrn);
79051: sqlite3_result_blob(context, p, sizeof(p), sqlite3_free);
79052: }
79053: static const FuncDef stat3InitFuncdef = {
79054: 2, /* nArg */
79055: SQLITE_UTF8, /* iPrefEnc */
79056: 0, /* flags */
79057: 0, /* pUserData */
79058: 0, /* pNext */
79059: stat3Init, /* xFunc */
79060: 0, /* xStep */
79061: 0, /* xFinalize */
79062: "stat3_init", /* zName */
79063: 0, /* pHash */
79064: 0 /* pDestructor */
79065: };
79066:
79067:
79068: /*
79069: ** Implementation of the stat3_push(nEq,nLt,nDLt,rowid,P) SQL function. The
79070: ** arguments describe a single key instance. This routine makes the
79071: ** decision about whether or not to retain this key for the sqlite_stat3
79072: ** table.
79073: **
79074: ** The return value is NULL.
79075: */
79076: static void stat3Push(
79077: sqlite3_context *context,
79078: int argc,
79079: sqlite3_value **argv
79080: ){
79081: Stat3Accum *p = (Stat3Accum*)sqlite3_value_blob(argv[4]);
79082: tRowcnt nEq = sqlite3_value_int64(argv[0]);
79083: tRowcnt nLt = sqlite3_value_int64(argv[1]);
79084: tRowcnt nDLt = sqlite3_value_int64(argv[2]);
79085: i64 rowid = sqlite3_value_int64(argv[3]);
79086: u8 isPSample = 0;
79087: u8 doInsert = 0;
79088: int iMin = p->iMin;
79089: struct Stat3Sample *pSample;
79090: int i;
79091: u32 h;
79092:
79093: UNUSED_PARAMETER(context);
79094: UNUSED_PARAMETER(argc);
79095: if( nEq==0 ) return;
79096: h = p->iPrn = p->iPrn*1103515245 + 12345;
79097: if( (nLt/p->nPSample)!=((nEq+nLt)/p->nPSample) ){
79098: doInsert = isPSample = 1;
79099: }else if( p->nSample<p->mxSample ){
79100: doInsert = 1;
79101: }else{
79102: if( nEq>p->a[iMin].nEq || (nEq==p->a[iMin].nEq && h>p->a[iMin].iHash) ){
79103: doInsert = 1;
79104: }
79105: }
79106: if( !doInsert ) return;
79107: if( p->nSample==p->mxSample ){
79108: assert( p->nSample - iMin - 1 >= 0 );
79109: memmove(&p->a[iMin], &p->a[iMin+1], sizeof(p->a[0])*(p->nSample-iMin-1));
79110: pSample = &p->a[p->nSample-1];
79111: }else{
79112: pSample = &p->a[p->nSample++];
79113: }
79114: pSample->iRowid = rowid;
79115: pSample->nEq = nEq;
79116: pSample->nLt = nLt;
79117: pSample->nDLt = nDLt;
79118: pSample->iHash = h;
79119: pSample->isPSample = isPSample;
79120:
79121: /* Find the new minimum */
79122: if( p->nSample==p->mxSample ){
79123: pSample = p->a;
79124: i = 0;
79125: while( pSample->isPSample ){
79126: i++;
79127: pSample++;
79128: assert( i<p->nSample );
79129: }
79130: nEq = pSample->nEq;
79131: h = pSample->iHash;
79132: iMin = i;
79133: for(i++, pSample++; i<p->nSample; i++, pSample++){
79134: if( pSample->isPSample ) continue;
79135: if( pSample->nEq<nEq
79136: || (pSample->nEq==nEq && pSample->iHash<h)
79137: ){
79138: iMin = i;
79139: nEq = pSample->nEq;
79140: h = pSample->iHash;
79141: }
79142: }
79143: p->iMin = iMin;
79144: }
79145: }
79146: static const FuncDef stat3PushFuncdef = {
79147: 5, /* nArg */
79148: SQLITE_UTF8, /* iPrefEnc */
79149: 0, /* flags */
79150: 0, /* pUserData */
79151: 0, /* pNext */
79152: stat3Push, /* xFunc */
79153: 0, /* xStep */
79154: 0, /* xFinalize */
79155: "stat3_push", /* zName */
79156: 0, /* pHash */
79157: 0 /* pDestructor */
79158: };
79159:
79160: /*
79161: ** Implementation of the stat3_get(P,N,...) SQL function. This routine is
79162: ** used to query the results. Content is returned for the Nth sqlite_stat3
79163: ** row where N is between 0 and S-1 and S is the number of samples. The
79164: ** value returned depends on the number of arguments.
79165: **
79166: ** argc==2 result: rowid
79167: ** argc==3 result: nEq
79168: ** argc==4 result: nLt
79169: ** argc==5 result: nDLt
79170: */
79171: static void stat3Get(
79172: sqlite3_context *context,
79173: int argc,
79174: sqlite3_value **argv
79175: ){
79176: int n = sqlite3_value_int(argv[1]);
79177: Stat3Accum *p = (Stat3Accum*)sqlite3_value_blob(argv[0]);
79178:
79179: assert( p!=0 );
79180: if( p->nSample<=n ) return;
79181: switch( argc ){
79182: case 2: sqlite3_result_int64(context, p->a[n].iRowid); break;
79183: case 3: sqlite3_result_int64(context, p->a[n].nEq); break;
79184: case 4: sqlite3_result_int64(context, p->a[n].nLt); break;
79185: default: sqlite3_result_int64(context, p->a[n].nDLt); break;
79186: }
79187: }
79188: static const FuncDef stat3GetFuncdef = {
79189: -1, /* nArg */
79190: SQLITE_UTF8, /* iPrefEnc */
79191: 0, /* flags */
79192: 0, /* pUserData */
79193: 0, /* pNext */
79194: stat3Get, /* xFunc */
79195: 0, /* xStep */
79196: 0, /* xFinalize */
79197: "stat3_get", /* zName */
79198: 0, /* pHash */
79199: 0 /* pDestructor */
79200: };
79201: #endif /* SQLITE_ENABLE_STAT3 */
79202:
79203:
79204:
79205:
79206: /*
79207: ** Generate code to do an analysis of all indices associated with
79208: ** a single table.
79209: */
79210: static void analyzeOneTable(
79211: Parse *pParse, /* Parser context */
79212: Table *pTab, /* Table whose indices are to be analyzed */
79213: Index *pOnlyIdx, /* If not NULL, only analyze this one index */
79214: int iStatCur, /* Index of VdbeCursor that writes the sqlite_stat1 table */
79215: int iMem /* Available memory locations begin here */
79216: ){
79217: sqlite3 *db = pParse->db; /* Database handle */
79218: Index *pIdx; /* An index to being analyzed */
79219: int iIdxCur; /* Cursor open on index being analyzed */
79220: Vdbe *v; /* The virtual machine being built up */
79221: int i; /* Loop counter */
79222: int topOfLoop; /* The top of the loop */
79223: int endOfLoop; /* The end of the loop */
79224: int jZeroRows = -1; /* Jump from here if number of rows is zero */
79225: int iDb; /* Index of database containing pTab */
79226: int regTabname = iMem++; /* Register containing table name */
79227: int regIdxname = iMem++; /* Register containing index name */
79228: int regStat1 = iMem++; /* The stat column of sqlite_stat1 */
79229: #ifdef SQLITE_ENABLE_STAT3
79230: int regNumEq = regStat1; /* Number of instances. Same as regStat1 */
79231: int regNumLt = iMem++; /* Number of keys less than regSample */
79232: int regNumDLt = iMem++; /* Number of distinct keys less than regSample */
79233: int regSample = iMem++; /* The next sample value */
79234: int regRowid = regSample; /* Rowid of a sample */
79235: int regAccum = iMem++; /* Register to hold Stat3Accum object */
79236: int regLoop = iMem++; /* Loop counter */
79237: int regCount = iMem++; /* Number of rows in the table or index */
79238: int regTemp1 = iMem++; /* Intermediate register */
79239: int regTemp2 = iMem++; /* Intermediate register */
79240: int once = 1; /* One-time initialization */
79241: int shortJump = 0; /* Instruction address */
79242: int iTabCur = pParse->nTab++; /* Table cursor */
79243: #endif
79244: int regCol = iMem++; /* Content of a column in analyzed table */
79245: int regRec = iMem++; /* Register holding completed record */
79246: int regTemp = iMem++; /* Temporary use register */
79247: int regNewRowid = iMem++; /* Rowid for the inserted record */
79248:
79249:
79250: v = sqlite3GetVdbe(pParse);
79251: if( v==0 || NEVER(pTab==0) ){
79252: return;
79253: }
79254: if( pTab->tnum==0 ){
79255: /* Do not gather statistics on views or virtual tables */
79256: return;
79257: }
79258: if( memcmp(pTab->zName, "sqlite_", 7)==0 ){
79259: /* Do not gather statistics on system tables */
79260: return;
79261: }
79262: assert( sqlite3BtreeHoldsAllMutexes(db) );
79263: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
79264: assert( iDb>=0 );
79265: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
79266: #ifndef SQLITE_OMIT_AUTHORIZATION
79267: if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0,
79268: db->aDb[iDb].zName ) ){
79269: return;
79270: }
79271: #endif
79272:
79273: /* Establish a read-lock on the table at the shared-cache level. */
79274: sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
79275:
79276: iIdxCur = pParse->nTab++;
79277: sqlite3VdbeAddOp4(v, OP_String8, 0, regTabname, 0, pTab->zName, 0);
79278: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
79279: int nCol;
79280: KeyInfo *pKey;
79281: int addrIfNot = 0; /* address of OP_IfNot */
79282: int *aChngAddr; /* Array of jump instruction addresses */
79283:
79284: if( pOnlyIdx && pOnlyIdx!=pIdx ) continue;
79285: VdbeNoopComment((v, "Begin analysis of %s", pIdx->zName));
79286: nCol = pIdx->nColumn;
79287: aChngAddr = sqlite3DbMallocRaw(db, sizeof(int)*nCol);
79288: if( aChngAddr==0 ) continue;
79289: pKey = sqlite3IndexKeyinfo(pParse, pIdx);
79290: if( iMem+1+(nCol*2)>pParse->nMem ){
79291: pParse->nMem = iMem+1+(nCol*2);
79292: }
79293:
79294: /* Open a cursor to the index to be analyzed. */
79295: assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) );
79296: sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb,
79297: (char *)pKey, P4_KEYINFO_HANDOFF);
79298: VdbeComment((v, "%s", pIdx->zName));
79299:
79300: /* Populate the register containing the index name. */
79301: sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, pIdx->zName, 0);
79302:
79303: #ifdef SQLITE_ENABLE_STAT3
79304: if( once ){
79305: once = 0;
79306: sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead);
79307: }
79308: sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regCount);
79309: sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_STAT3_SAMPLES, regTemp1);
79310: sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumEq);
79311: sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumLt);
79312: sqlite3VdbeAddOp2(v, OP_Integer, -1, regNumDLt);
79313: sqlite3VdbeAddOp3(v, OP_Null, 0, regSample, regAccum);
79314: sqlite3VdbeAddOp4(v, OP_Function, 1, regCount, regAccum,
79315: (char*)&stat3InitFuncdef, P4_FUNCDEF);
79316: sqlite3VdbeChangeP5(v, 2);
79317: #endif /* SQLITE_ENABLE_STAT3 */
79318:
79319: /* The block of memory cells initialized here is used as follows.
79320: **
79321: ** iMem:
79322: ** The total number of rows in the table.
79323: **
79324: ** iMem+1 .. iMem+nCol:
79325: ** Number of distinct entries in index considering the
79326: ** left-most N columns only, where N is between 1 and nCol,
79327: ** inclusive.
79328: **
79329: ** iMem+nCol+1 .. Mem+2*nCol:
79330: ** Previous value of indexed columns, from left to right.
79331: **
79332: ** Cells iMem through iMem+nCol are initialized to 0. The others are
79333: ** initialized to contain an SQL NULL.
79334: */
79335: for(i=0; i<=nCol; i++){
79336: sqlite3VdbeAddOp2(v, OP_Integer, 0, iMem+i);
79337: }
79338: for(i=0; i<nCol; i++){
79339: sqlite3VdbeAddOp2(v, OP_Null, 0, iMem+nCol+i+1);
79340: }
79341:
79342: /* Start the analysis loop. This loop runs through all the entries in
79343: ** the index b-tree. */
79344: endOfLoop = sqlite3VdbeMakeLabel(v);
79345: sqlite3VdbeAddOp2(v, OP_Rewind, iIdxCur, endOfLoop);
79346: topOfLoop = sqlite3VdbeCurrentAddr(v);
79347: sqlite3VdbeAddOp2(v, OP_AddImm, iMem, 1); /* Increment row counter */
79348:
79349: for(i=0; i<nCol; i++){
79350: CollSeq *pColl;
79351: sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regCol);
79352: if( i==0 ){
79353: /* Always record the very first row */
79354: addrIfNot = sqlite3VdbeAddOp1(v, OP_IfNot, iMem+1);
79355: }
79356: assert( pIdx->azColl!=0 );
79357: assert( pIdx->azColl[i]!=0 );
79358: pColl = sqlite3LocateCollSeq(pParse, pIdx->azColl[i]);
79359: aChngAddr[i] = sqlite3VdbeAddOp4(v, OP_Ne, regCol, 0, iMem+nCol+i+1,
79360: (char*)pColl, P4_COLLSEQ);
79361: sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
79362: VdbeComment((v, "jump if column %d changed", i));
79363: #ifdef SQLITE_ENABLE_STAT3
79364: if( i==0 ){
79365: sqlite3VdbeAddOp2(v, OP_AddImm, regNumEq, 1);
79366: VdbeComment((v, "incr repeat count"));
79367: }
79368: #endif
79369: }
79370: sqlite3VdbeAddOp2(v, OP_Goto, 0, endOfLoop);
79371: for(i=0; i<nCol; i++){
79372: sqlite3VdbeJumpHere(v, aChngAddr[i]); /* Set jump dest for the OP_Ne */
79373: if( i==0 ){
79374: sqlite3VdbeJumpHere(v, addrIfNot); /* Jump dest for OP_IfNot */
79375: #ifdef SQLITE_ENABLE_STAT3
79376: sqlite3VdbeAddOp4(v, OP_Function, 1, regNumEq, regTemp2,
79377: (char*)&stat3PushFuncdef, P4_FUNCDEF);
79378: sqlite3VdbeChangeP5(v, 5);
79379: sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, pIdx->nColumn, regRowid);
79380: sqlite3VdbeAddOp3(v, OP_Add, regNumEq, regNumLt, regNumLt);
79381: sqlite3VdbeAddOp2(v, OP_AddImm, regNumDLt, 1);
79382: sqlite3VdbeAddOp2(v, OP_Integer, 1, regNumEq);
79383: #endif
79384: }
79385: sqlite3VdbeAddOp2(v, OP_AddImm, iMem+i+1, 1);
79386: sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, iMem+nCol+i+1);
79387: }
79388: sqlite3DbFree(db, aChngAddr);
79389:
79390: /* Always jump here after updating the iMem+1...iMem+1+nCol counters */
79391: sqlite3VdbeResolveLabel(v, endOfLoop);
79392:
79393: sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, topOfLoop);
79394: sqlite3VdbeAddOp1(v, OP_Close, iIdxCur);
79395: #ifdef SQLITE_ENABLE_STAT3
79396: sqlite3VdbeAddOp4(v, OP_Function, 1, regNumEq, regTemp2,
79397: (char*)&stat3PushFuncdef, P4_FUNCDEF);
79398: sqlite3VdbeChangeP5(v, 5);
79399: sqlite3VdbeAddOp2(v, OP_Integer, -1, regLoop);
79400: shortJump =
79401: sqlite3VdbeAddOp2(v, OP_AddImm, regLoop, 1);
79402: sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regTemp1,
79403: (char*)&stat3GetFuncdef, P4_FUNCDEF);
79404: sqlite3VdbeChangeP5(v, 2);
79405: sqlite3VdbeAddOp1(v, OP_IsNull, regTemp1);
79406: sqlite3VdbeAddOp3(v, OP_NotExists, iTabCur, shortJump, regTemp1);
79407: sqlite3VdbeAddOp3(v, OP_Column, iTabCur, pIdx->aiColumn[0], regSample);
79408: sqlite3ColumnDefault(v, pTab, pIdx->aiColumn[0], regSample);
79409: sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumEq,
79410: (char*)&stat3GetFuncdef, P4_FUNCDEF);
79411: sqlite3VdbeChangeP5(v, 3);
79412: sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumLt,
79413: (char*)&stat3GetFuncdef, P4_FUNCDEF);
79414: sqlite3VdbeChangeP5(v, 4);
79415: sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumDLt,
79416: (char*)&stat3GetFuncdef, P4_FUNCDEF);
79417: sqlite3VdbeChangeP5(v, 5);
79418: sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 6, regRec, "bbbbbb", 0);
79419: sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regNewRowid);
79420: sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regNewRowid);
79421: sqlite3VdbeAddOp2(v, OP_Goto, 0, shortJump);
79422: sqlite3VdbeJumpHere(v, shortJump+2);
79423: #endif
79424:
79425: /* Store the results in sqlite_stat1.
79426: **
79427: ** The result is a single row of the sqlite_stat1 table. The first
79428: ** two columns are the names of the table and index. The third column
79429: ** is a string composed of a list of integer statistics about the
79430: ** index. The first integer in the list is the total number of entries
79431: ** in the index. There is one additional integer in the list for each
79432: ** column of the table. This additional integer is a guess of how many
79433: ** rows of the table the index will select. If D is the count of distinct
79434: ** values and K is the total number of rows, then the integer is computed
79435: ** as:
79436: **
79437: ** I = (K+D-1)/D
79438: **
79439: ** If K==0 then no entry is made into the sqlite_stat1 table.
79440: ** If K>0 then it is always the case the D>0 so division by zero
79441: ** is never possible.
79442: */
79443: sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regStat1);
79444: if( jZeroRows<0 ){
79445: jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, iMem);
79446: }
79447: for(i=0; i<nCol; i++){
79448: sqlite3VdbeAddOp4(v, OP_String8, 0, regTemp, 0, " ", 0);
79449: sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regStat1, regStat1);
79450: sqlite3VdbeAddOp3(v, OP_Add, iMem, iMem+i+1, regTemp);
79451: sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1);
79452: sqlite3VdbeAddOp3(v, OP_Divide, iMem+i+1, regTemp, regTemp);
79453: sqlite3VdbeAddOp1(v, OP_ToInt, regTemp);
79454: sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regStat1, regStat1);
79455: }
79456: sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0);
79457: sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
79458: sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regNewRowid);
79459: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
79460: }
79461:
79462: /* If the table has no indices, create a single sqlite_stat1 entry
79463: ** containing NULL as the index name and the row count as the content.
79464: */
79465: if( pTab->pIndex==0 ){
79466: sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pTab->tnum, iDb);
79467: VdbeComment((v, "%s", pTab->zName));
79468: sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat1);
79469: sqlite3VdbeAddOp1(v, OP_Close, iIdxCur);
79470: jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1);
79471: }else{
79472: sqlite3VdbeJumpHere(v, jZeroRows);
79473: jZeroRows = sqlite3VdbeAddOp0(v, OP_Goto);
79474: }
79475: sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname);
79476: sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0);
79477: sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
79478: sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regNewRowid);
79479: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
79480: if( pParse->nMem<regRec ) pParse->nMem = regRec;
79481: sqlite3VdbeJumpHere(v, jZeroRows);
79482: }
79483:
79484:
79485: /*
79486: ** Generate code that will cause the most recent index analysis to
79487: ** be loaded into internal hash tables where is can be used.
79488: */
79489: static void loadAnalysis(Parse *pParse, int iDb){
79490: Vdbe *v = sqlite3GetVdbe(pParse);
79491: if( v ){
79492: sqlite3VdbeAddOp1(v, OP_LoadAnalysis, iDb);
79493: }
79494: }
79495:
79496: /*
79497: ** Generate code that will do an analysis of an entire database
79498: */
79499: static void analyzeDatabase(Parse *pParse, int iDb){
79500: sqlite3 *db = pParse->db;
79501: Schema *pSchema = db->aDb[iDb].pSchema; /* Schema of database iDb */
79502: HashElem *k;
79503: int iStatCur;
79504: int iMem;
79505:
79506: sqlite3BeginWriteOperation(pParse, 0, iDb);
79507: iStatCur = pParse->nTab;
79508: pParse->nTab += 3;
79509: openStatTable(pParse, iDb, iStatCur, 0, 0);
79510: iMem = pParse->nMem+1;
79511: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
79512: for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){
79513: Table *pTab = (Table*)sqliteHashData(k);
79514: analyzeOneTable(pParse, pTab, 0, iStatCur, iMem);
79515: }
79516: loadAnalysis(pParse, iDb);
79517: }
79518:
79519: /*
79520: ** Generate code that will do an analysis of a single table in
79521: ** a database. If pOnlyIdx is not NULL then it is a single index
79522: ** in pTab that should be analyzed.
79523: */
79524: static void analyzeTable(Parse *pParse, Table *pTab, Index *pOnlyIdx){
79525: int iDb;
79526: int iStatCur;
79527:
79528: assert( pTab!=0 );
79529: assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
79530: iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
79531: sqlite3BeginWriteOperation(pParse, 0, iDb);
79532: iStatCur = pParse->nTab;
79533: pParse->nTab += 3;
79534: if( pOnlyIdx ){
79535: openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx");
79536: }else{
79537: openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl");
79538: }
79539: analyzeOneTable(pParse, pTab, pOnlyIdx, iStatCur, pParse->nMem+1);
79540: loadAnalysis(pParse, iDb);
79541: }
79542:
79543: /*
79544: ** Generate code for the ANALYZE command. The parser calls this routine
79545: ** when it recognizes an ANALYZE command.
79546: **
79547: ** ANALYZE -- 1
79548: ** ANALYZE <database> -- 2
79549: ** ANALYZE ?<database>.?<tablename> -- 3
79550: **
79551: ** Form 1 causes all indices in all attached databases to be analyzed.
79552: ** Form 2 analyzes all indices the single database named.
79553: ** Form 3 analyzes all indices associated with the named table.
79554: */
79555: SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){
79556: sqlite3 *db = pParse->db;
79557: int iDb;
79558: int i;
79559: char *z, *zDb;
79560: Table *pTab;
79561: Index *pIdx;
79562: Token *pTableName;
79563:
79564: /* Read the database schema. If an error occurs, leave an error message
79565: ** and code in pParse and return NULL. */
79566: assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
79567: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
79568: return;
79569: }
79570:
79571: assert( pName2!=0 || pName1==0 );
79572: if( pName1==0 ){
79573: /* Form 1: Analyze everything */
79574: for(i=0; i<db->nDb; i++){
79575: if( i==1 ) continue; /* Do not analyze the TEMP database */
79576: analyzeDatabase(pParse, i);
79577: }
79578: }else if( pName2->n==0 ){
79579: /* Form 2: Analyze the database or table named */
79580: iDb = sqlite3FindDb(db, pName1);
79581: if( iDb>=0 ){
79582: analyzeDatabase(pParse, iDb);
79583: }else{
79584: z = sqlite3NameFromToken(db, pName1);
79585: if( z ){
79586: if( (pIdx = sqlite3FindIndex(db, z, 0))!=0 ){
79587: analyzeTable(pParse, pIdx->pTable, pIdx);
79588: }else if( (pTab = sqlite3LocateTable(pParse, 0, z, 0))!=0 ){
79589: analyzeTable(pParse, pTab, 0);
79590: }
79591: sqlite3DbFree(db, z);
79592: }
79593: }
79594: }else{
79595: /* Form 3: Analyze the fully qualified table name */
79596: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName);
79597: if( iDb>=0 ){
79598: zDb = db->aDb[iDb].zName;
79599: z = sqlite3NameFromToken(db, pTableName);
79600: if( z ){
79601: if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){
79602: analyzeTable(pParse, pIdx->pTable, pIdx);
79603: }else if( (pTab = sqlite3LocateTable(pParse, 0, z, zDb))!=0 ){
79604: analyzeTable(pParse, pTab, 0);
79605: }
79606: sqlite3DbFree(db, z);
79607: }
79608: }
79609: }
79610: }
79611:
79612: /*
79613: ** Used to pass information from the analyzer reader through to the
79614: ** callback routine.
79615: */
79616: typedef struct analysisInfo analysisInfo;
79617: struct analysisInfo {
79618: sqlite3 *db;
79619: const char *zDatabase;
79620: };
79621:
79622: /*
79623: ** This callback is invoked once for each index when reading the
79624: ** sqlite_stat1 table.
79625: **
79626: ** argv[0] = name of the table
79627: ** argv[1] = name of the index (might be NULL)
79628: ** argv[2] = results of analysis - on integer for each column
79629: **
79630: ** Entries for which argv[1]==NULL simply record the number of rows in
79631: ** the table.
79632: */
79633: static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
79634: analysisInfo *pInfo = (analysisInfo*)pData;
79635: Index *pIndex;
79636: Table *pTable;
79637: int i, c, n;
79638: tRowcnt v;
79639: const char *z;
79640:
79641: assert( argc==3 );
79642: UNUSED_PARAMETER2(NotUsed, argc);
79643:
79644: if( argv==0 || argv[0]==0 || argv[2]==0 ){
79645: return 0;
79646: }
79647: pTable = sqlite3FindTable(pInfo->db, argv[0], pInfo->zDatabase);
79648: if( pTable==0 ){
79649: return 0;
79650: }
79651: if( argv[1] ){
79652: pIndex = sqlite3FindIndex(pInfo->db, argv[1], pInfo->zDatabase);
79653: }else{
79654: pIndex = 0;
79655: }
79656: n = pIndex ? pIndex->nColumn : 0;
79657: z = argv[2];
79658: for(i=0; *z && i<=n; i++){
79659: v = 0;
79660: while( (c=z[0])>='0' && c<='9' ){
79661: v = v*10 + c - '0';
79662: z++;
79663: }
79664: if( i==0 ) pTable->nRowEst = v;
79665: if( pIndex==0 ) break;
79666: pIndex->aiRowEst[i] = v;
79667: if( *z==' ' ) z++;
79668: if( memcmp(z, "unordered", 10)==0 ){
79669: pIndex->bUnordered = 1;
79670: break;
79671: }
79672: }
79673: return 0;
79674: }
79675:
79676: /*
79677: ** If the Index.aSample variable is not NULL, delete the aSample[] array
79678: ** and its contents.
79679: */
79680: SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
79681: #ifdef SQLITE_ENABLE_STAT3
79682: if( pIdx->aSample ){
79683: int j;
79684: for(j=0; j<pIdx->nSample; j++){
79685: IndexSample *p = &pIdx->aSample[j];
79686: if( p->eType==SQLITE_TEXT || p->eType==SQLITE_BLOB ){
79687: sqlite3DbFree(db, p->u.z);
79688: }
79689: }
79690: sqlite3DbFree(db, pIdx->aSample);
79691: }
79692: if( db && db->pnBytesFreed==0 ){
79693: pIdx->nSample = 0;
79694: pIdx->aSample = 0;
79695: }
79696: #else
79697: UNUSED_PARAMETER(db);
79698: UNUSED_PARAMETER(pIdx);
79699: #endif
79700: }
79701:
79702: #ifdef SQLITE_ENABLE_STAT3
79703: /*
79704: ** Load content from the sqlite_stat3 table into the Index.aSample[]
79705: ** arrays of all indices.
79706: */
79707: static int loadStat3(sqlite3 *db, const char *zDb){
79708: int rc; /* Result codes from subroutines */
79709: sqlite3_stmt *pStmt = 0; /* An SQL statement being run */
79710: char *zSql; /* Text of the SQL statement */
79711: Index *pPrevIdx = 0; /* Previous index in the loop */
79712: int idx = 0; /* slot in pIdx->aSample[] for next sample */
79713: int eType; /* Datatype of a sample */
79714: IndexSample *pSample; /* A slot in pIdx->aSample[] */
79715:
1.2.2.1 ! misho 79716: assert( db->lookaside.bEnabled==0 );
1.2 misho 79717: if( !sqlite3FindTable(db, "sqlite_stat3", zDb) ){
79718: return SQLITE_OK;
79719: }
79720:
79721: zSql = sqlite3MPrintf(db,
79722: "SELECT idx,count(*) FROM %Q.sqlite_stat3"
79723: " GROUP BY idx", zDb);
79724: if( !zSql ){
79725: return SQLITE_NOMEM;
79726: }
79727: rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
79728: sqlite3DbFree(db, zSql);
79729: if( rc ) return rc;
79730:
79731: while( sqlite3_step(pStmt)==SQLITE_ROW ){
79732: char *zIndex; /* Index name */
79733: Index *pIdx; /* Pointer to the index object */
79734: int nSample; /* Number of samples */
79735:
79736: zIndex = (char *)sqlite3_column_text(pStmt, 0);
79737: if( zIndex==0 ) continue;
79738: nSample = sqlite3_column_int(pStmt, 1);
79739: pIdx = sqlite3FindIndex(db, zIndex, zDb);
79740: if( pIdx==0 ) continue;
79741: assert( pIdx->nSample==0 );
79742: pIdx->nSample = nSample;
1.2.2.1 ! misho 79743: pIdx->aSample = sqlite3DbMallocZero(db, nSample*sizeof(IndexSample));
1.2 misho 79744: pIdx->avgEq = pIdx->aiRowEst[1];
79745: if( pIdx->aSample==0 ){
79746: db->mallocFailed = 1;
79747: sqlite3_finalize(pStmt);
79748: return SQLITE_NOMEM;
79749: }
79750: }
79751: rc = sqlite3_finalize(pStmt);
79752: if( rc ) return rc;
79753:
79754: zSql = sqlite3MPrintf(db,
79755: "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat3", zDb);
79756: if( !zSql ){
79757: return SQLITE_NOMEM;
79758: }
79759: rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
79760: sqlite3DbFree(db, zSql);
79761: if( rc ) return rc;
79762:
79763: while( sqlite3_step(pStmt)==SQLITE_ROW ){
79764: char *zIndex; /* Index name */
79765: Index *pIdx; /* Pointer to the index object */
79766: int i; /* Loop counter */
79767: tRowcnt sumEq; /* Sum of the nEq values */
79768:
79769: zIndex = (char *)sqlite3_column_text(pStmt, 0);
79770: if( zIndex==0 ) continue;
79771: pIdx = sqlite3FindIndex(db, zIndex, zDb);
79772: if( pIdx==0 ) continue;
79773: if( pIdx==pPrevIdx ){
79774: idx++;
79775: }else{
79776: pPrevIdx = pIdx;
79777: idx = 0;
79778: }
79779: assert( idx<pIdx->nSample );
79780: pSample = &pIdx->aSample[idx];
79781: pSample->nEq = (tRowcnt)sqlite3_column_int64(pStmt, 1);
79782: pSample->nLt = (tRowcnt)sqlite3_column_int64(pStmt, 2);
79783: pSample->nDLt = (tRowcnt)sqlite3_column_int64(pStmt, 3);
79784: if( idx==pIdx->nSample-1 ){
79785: if( pSample->nDLt>0 ){
79786: for(i=0, sumEq=0; i<=idx-1; i++) sumEq += pIdx->aSample[i].nEq;
79787: pIdx->avgEq = (pSample->nLt - sumEq)/pSample->nDLt;
79788: }
79789: if( pIdx->avgEq<=0 ) pIdx->avgEq = 1;
79790: }
79791: eType = sqlite3_column_type(pStmt, 4);
79792: pSample->eType = (u8)eType;
79793: switch( eType ){
79794: case SQLITE_INTEGER: {
79795: pSample->u.i = sqlite3_column_int64(pStmt, 4);
79796: break;
79797: }
79798: case SQLITE_FLOAT: {
79799: pSample->u.r = sqlite3_column_double(pStmt, 4);
79800: break;
79801: }
79802: case SQLITE_NULL: {
79803: break;
79804: }
79805: default: assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); {
79806: const char *z = (const char *)(
79807: (eType==SQLITE_BLOB) ?
79808: sqlite3_column_blob(pStmt, 4):
79809: sqlite3_column_text(pStmt, 4)
79810: );
79811: int n = z ? sqlite3_column_bytes(pStmt, 4) : 0;
79812: pSample->nByte = n;
79813: if( n < 1){
79814: pSample->u.z = 0;
79815: }else{
1.2.2.1 ! misho 79816: pSample->u.z = sqlite3DbMallocRaw(db, n);
1.2 misho 79817: if( pSample->u.z==0 ){
79818: db->mallocFailed = 1;
79819: sqlite3_finalize(pStmt);
79820: return SQLITE_NOMEM;
79821: }
79822: memcpy(pSample->u.z, z, n);
79823: }
79824: }
79825: }
79826: }
79827: return sqlite3_finalize(pStmt);
79828: }
79829: #endif /* SQLITE_ENABLE_STAT3 */
79830:
79831: /*
79832: ** Load the content of the sqlite_stat1 and sqlite_stat3 tables. The
79833: ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[]
79834: ** arrays. The contents of sqlite_stat3 are used to populate the
79835: ** Index.aSample[] arrays.
79836: **
79837: ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR
79838: ** is returned. In this case, even if SQLITE_ENABLE_STAT3 was defined
79839: ** during compilation and the sqlite_stat3 table is present, no data is
79840: ** read from it.
79841: **
79842: ** If SQLITE_ENABLE_STAT3 was defined during compilation and the
79843: ** sqlite_stat3 table is not present in the database, SQLITE_ERROR is
79844: ** returned. However, in this case, data is read from the sqlite_stat1
79845: ** table (if it is present) before returning.
79846: **
79847: ** If an OOM error occurs, this function always sets db->mallocFailed.
79848: ** This means if the caller does not care about other errors, the return
79849: ** code may be ignored.
79850: */
79851: SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
79852: analysisInfo sInfo;
79853: HashElem *i;
79854: char *zSql;
79855: int rc;
79856:
79857: assert( iDb>=0 && iDb<db->nDb );
79858: assert( db->aDb[iDb].pBt!=0 );
79859:
79860: /* Clear any prior statistics */
79861: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
79862: for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){
79863: Index *pIdx = sqliteHashData(i);
79864: sqlite3DefaultRowEst(pIdx);
79865: #ifdef SQLITE_ENABLE_STAT3
79866: sqlite3DeleteIndexSamples(db, pIdx);
79867: pIdx->aSample = 0;
79868: #endif
79869: }
79870:
79871: /* Check to make sure the sqlite_stat1 table exists */
79872: sInfo.db = db;
79873: sInfo.zDatabase = db->aDb[iDb].zName;
79874: if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){
79875: return SQLITE_ERROR;
79876: }
79877:
79878: /* Load new statistics out of the sqlite_stat1 table */
79879: zSql = sqlite3MPrintf(db,
79880: "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase);
79881: if( zSql==0 ){
79882: rc = SQLITE_NOMEM;
79883: }else{
79884: rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
79885: sqlite3DbFree(db, zSql);
79886: }
79887:
79888:
79889: /* Load the statistics from the sqlite_stat3 table. */
79890: #ifdef SQLITE_ENABLE_STAT3
79891: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 79892: int lookasideEnabled = db->lookaside.bEnabled;
! 79893: db->lookaside.bEnabled = 0;
1.2 misho 79894: rc = loadStat3(db, sInfo.zDatabase);
1.2.2.1 ! misho 79895: db->lookaside.bEnabled = lookasideEnabled;
1.2 misho 79896: }
79897: #endif
79898:
79899: if( rc==SQLITE_NOMEM ){
79900: db->mallocFailed = 1;
79901: }
79902: return rc;
79903: }
79904:
79905:
79906: #endif /* SQLITE_OMIT_ANALYZE */
79907:
79908: /************** End of analyze.c *********************************************/
79909: /************** Begin file attach.c ******************************************/
79910: /*
79911: ** 2003 April 6
79912: **
79913: ** The author disclaims copyright to this source code. In place of
79914: ** a legal notice, here is a blessing:
79915: **
79916: ** May you do good and not evil.
79917: ** May you find forgiveness for yourself and forgive others.
79918: ** May you share freely, never taking more than you give.
79919: **
79920: *************************************************************************
79921: ** This file contains code used to implement the ATTACH and DETACH commands.
79922: */
79923:
79924: #ifndef SQLITE_OMIT_ATTACH
79925: /*
79926: ** Resolve an expression that was part of an ATTACH or DETACH statement. This
79927: ** is slightly different from resolving a normal SQL expression, because simple
79928: ** identifiers are treated as strings, not possible column names or aliases.
79929: **
79930: ** i.e. if the parser sees:
79931: **
79932: ** ATTACH DATABASE abc AS def
79933: **
79934: ** it treats the two expressions as literal strings 'abc' and 'def' instead of
79935: ** looking for columns of the same name.
79936: **
79937: ** This only applies to the root node of pExpr, so the statement:
79938: **
79939: ** ATTACH DATABASE abc||def AS 'db2'
79940: **
79941: ** will fail because neither abc or def can be resolved.
79942: */
79943: static int resolveAttachExpr(NameContext *pName, Expr *pExpr)
79944: {
79945: int rc = SQLITE_OK;
79946: if( pExpr ){
79947: if( pExpr->op!=TK_ID ){
79948: rc = sqlite3ResolveExprNames(pName, pExpr);
79949: if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){
79950: sqlite3ErrorMsg(pName->pParse, "invalid name: \"%s\"", pExpr->u.zToken);
79951: return SQLITE_ERROR;
79952: }
79953: }else{
79954: pExpr->op = TK_STRING;
79955: }
79956: }
79957: return rc;
79958: }
79959:
79960: /*
79961: ** An SQL user-function registered to do the work of an ATTACH statement. The
79962: ** three arguments to the function come directly from an attach statement:
79963: **
79964: ** ATTACH DATABASE x AS y KEY z
79965: **
79966: ** SELECT sqlite_attach(x, y, z)
79967: **
79968: ** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the
79969: ** third argument.
79970: */
79971: static void attachFunc(
79972: sqlite3_context *context,
79973: int NotUsed,
79974: sqlite3_value **argv
79975: ){
79976: int i;
79977: int rc = 0;
79978: sqlite3 *db = sqlite3_context_db_handle(context);
79979: const char *zName;
79980: const char *zFile;
79981: char *zPath = 0;
79982: char *zErr = 0;
79983: unsigned int flags;
79984: Db *aNew;
79985: char *zErrDyn = 0;
79986: sqlite3_vfs *pVfs;
79987:
79988: UNUSED_PARAMETER(NotUsed);
79989:
79990: zFile = (const char *)sqlite3_value_text(argv[0]);
79991: zName = (const char *)sqlite3_value_text(argv[1]);
79992: if( zFile==0 ) zFile = "";
79993: if( zName==0 ) zName = "";
79994:
79995: /* Check for the following errors:
79996: **
79997: ** * Too many attached databases,
79998: ** * Transaction currently open
79999: ** * Specified database name already being used.
80000: */
80001: if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){
80002: zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d",
80003: db->aLimit[SQLITE_LIMIT_ATTACHED]
80004: );
80005: goto attach_error;
80006: }
80007: if( !db->autoCommit ){
80008: zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction");
80009: goto attach_error;
80010: }
80011: for(i=0; i<db->nDb; i++){
80012: char *z = db->aDb[i].zName;
80013: assert( z && zName );
80014: if( sqlite3StrICmp(z, zName)==0 ){
80015: zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName);
80016: goto attach_error;
80017: }
80018: }
80019:
80020: /* Allocate the new entry in the db->aDb[] array and initialise the schema
80021: ** hash tables.
80022: */
80023: if( db->aDb==db->aDbStatic ){
80024: aNew = sqlite3DbMallocRaw(db, sizeof(db->aDb[0])*3 );
80025: if( aNew==0 ) return;
80026: memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2);
80027: }else{
80028: aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) );
80029: if( aNew==0 ) return;
80030: }
80031: db->aDb = aNew;
80032: aNew = &db->aDb[db->nDb];
80033: memset(aNew, 0, sizeof(*aNew));
80034:
80035: /* Open the database file. If the btree is successfully opened, use
80036: ** it to obtain the database schema. At this point the schema may
80037: ** or may not be initialised.
80038: */
80039: flags = db->openFlags;
80040: rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr);
80041: if( rc!=SQLITE_OK ){
80042: if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
80043: sqlite3_result_error(context, zErr, -1);
80044: sqlite3_free(zErr);
80045: return;
80046: }
80047: assert( pVfs );
80048: flags |= SQLITE_OPEN_MAIN_DB;
80049: rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags);
80050: sqlite3_free( zPath );
80051: db->nDb++;
80052: if( rc==SQLITE_CONSTRAINT ){
80053: rc = SQLITE_ERROR;
80054: zErrDyn = sqlite3MPrintf(db, "database is already attached");
80055: }else if( rc==SQLITE_OK ){
80056: Pager *pPager;
80057: aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt);
80058: if( !aNew->pSchema ){
80059: rc = SQLITE_NOMEM;
80060: }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){
80061: zErrDyn = sqlite3MPrintf(db,
80062: "attached databases must use the same text encoding as main database");
80063: rc = SQLITE_ERROR;
80064: }
80065: pPager = sqlite3BtreePager(aNew->pBt);
80066: sqlite3PagerLockingMode(pPager, db->dfltLockMode);
80067: sqlite3BtreeSecureDelete(aNew->pBt,
80068: sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) );
80069: }
80070: aNew->safety_level = 3;
80071: aNew->zName = sqlite3DbStrDup(db, zName);
80072: if( rc==SQLITE_OK && aNew->zName==0 ){
80073: rc = SQLITE_NOMEM;
80074: }
80075:
80076:
80077: #ifdef SQLITE_HAS_CODEC
80078: if( rc==SQLITE_OK ){
80079: extern int sqlite3CodecAttach(sqlite3*, int, const void*, int);
80080: extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*);
80081: int nKey;
80082: char *zKey;
80083: int t = sqlite3_value_type(argv[2]);
80084: switch( t ){
80085: case SQLITE_INTEGER:
80086: case SQLITE_FLOAT:
80087: zErrDyn = sqlite3DbStrDup(db, "Invalid key value");
80088: rc = SQLITE_ERROR;
80089: break;
80090:
80091: case SQLITE_TEXT:
80092: case SQLITE_BLOB:
80093: nKey = sqlite3_value_bytes(argv[2]);
80094: zKey = (char *)sqlite3_value_blob(argv[2]);
80095: rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);
80096: break;
80097:
80098: case SQLITE_NULL:
80099: /* No key specified. Use the key from the main database */
80100: sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);
80101: if( nKey>0 || sqlite3BtreeGetReserve(db->aDb[0].pBt)>0 ){
80102: rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey);
80103: }
80104: break;
80105: }
80106: }
80107: #endif
80108:
80109: /* If the file was opened successfully, read the schema for the new database.
80110: ** If this fails, or if opening the file failed, then close the file and
80111: ** remove the entry from the db->aDb[] array. i.e. put everything back the way
80112: ** we found it.
80113: */
80114: if( rc==SQLITE_OK ){
80115: sqlite3BtreeEnterAll(db);
80116: rc = sqlite3Init(db, &zErrDyn);
80117: sqlite3BtreeLeaveAll(db);
80118: }
80119: if( rc ){
80120: int iDb = db->nDb - 1;
80121: assert( iDb>=2 );
80122: if( db->aDb[iDb].pBt ){
80123: sqlite3BtreeClose(db->aDb[iDb].pBt);
80124: db->aDb[iDb].pBt = 0;
80125: db->aDb[iDb].pSchema = 0;
80126: }
1.2.2.1 ! misho 80127: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 80128: db->nDb = iDb;
80129: if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
80130: db->mallocFailed = 1;
80131: sqlite3DbFree(db, zErrDyn);
80132: zErrDyn = sqlite3MPrintf(db, "out of memory");
80133: }else if( zErrDyn==0 ){
80134: zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile);
80135: }
80136: goto attach_error;
80137: }
80138:
80139: return;
80140:
80141: attach_error:
80142: /* Return an error if we get here */
80143: if( zErrDyn ){
80144: sqlite3_result_error(context, zErrDyn, -1);
80145: sqlite3DbFree(db, zErrDyn);
80146: }
80147: if( rc ) sqlite3_result_error_code(context, rc);
80148: }
80149:
80150: /*
80151: ** An SQL user-function registered to do the work of an DETACH statement. The
80152: ** three arguments to the function come directly from a detach statement:
80153: **
80154: ** DETACH DATABASE x
80155: **
80156: ** SELECT sqlite_detach(x)
80157: */
80158: static void detachFunc(
80159: sqlite3_context *context,
80160: int NotUsed,
80161: sqlite3_value **argv
80162: ){
80163: const char *zName = (const char *)sqlite3_value_text(argv[0]);
80164: sqlite3 *db = sqlite3_context_db_handle(context);
80165: int i;
80166: Db *pDb = 0;
80167: char zErr[128];
80168:
80169: UNUSED_PARAMETER(NotUsed);
80170:
80171: if( zName==0 ) zName = "";
80172: for(i=0; i<db->nDb; i++){
80173: pDb = &db->aDb[i];
80174: if( pDb->pBt==0 ) continue;
80175: if( sqlite3StrICmp(pDb->zName, zName)==0 ) break;
80176: }
80177:
80178: if( i>=db->nDb ){
80179: sqlite3_snprintf(sizeof(zErr),zErr, "no such database: %s", zName);
80180: goto detach_error;
80181: }
80182: if( i<2 ){
80183: sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName);
80184: goto detach_error;
80185: }
80186: if( !db->autoCommit ){
80187: sqlite3_snprintf(sizeof(zErr), zErr,
80188: "cannot DETACH database within transaction");
80189: goto detach_error;
80190: }
80191: if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){
80192: sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName);
80193: goto detach_error;
80194: }
80195:
80196: sqlite3BtreeClose(pDb->pBt);
80197: pDb->pBt = 0;
80198: pDb->pSchema = 0;
1.2.2.1 ! misho 80199: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 80200: return;
80201:
80202: detach_error:
80203: sqlite3_result_error(context, zErr, -1);
80204: }
80205:
80206: /*
80207: ** This procedure generates VDBE code for a single invocation of either the
80208: ** sqlite_detach() or sqlite_attach() SQL user functions.
80209: */
80210: static void codeAttach(
80211: Parse *pParse, /* The parser context */
80212: int type, /* Either SQLITE_ATTACH or SQLITE_DETACH */
80213: FuncDef const *pFunc,/* FuncDef wrapper for detachFunc() or attachFunc() */
80214: Expr *pAuthArg, /* Expression to pass to authorization callback */
80215: Expr *pFilename, /* Name of database file */
80216: Expr *pDbname, /* Name of the database to use internally */
80217: Expr *pKey /* Database key for encryption extension */
80218: ){
80219: int rc;
80220: NameContext sName;
80221: Vdbe *v;
80222: sqlite3* db = pParse->db;
80223: int regArgs;
80224:
80225: memset(&sName, 0, sizeof(NameContext));
80226: sName.pParse = pParse;
80227:
80228: if(
80229: SQLITE_OK!=(rc = resolveAttachExpr(&sName, pFilename)) ||
80230: SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) ||
80231: SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey))
80232: ){
80233: pParse->nErr++;
80234: goto attach_end;
80235: }
80236:
80237: #ifndef SQLITE_OMIT_AUTHORIZATION
80238: if( pAuthArg ){
80239: char *zAuthArg;
80240: if( pAuthArg->op==TK_STRING ){
80241: zAuthArg = pAuthArg->u.zToken;
80242: }else{
80243: zAuthArg = 0;
80244: }
80245: rc = sqlite3AuthCheck(pParse, type, zAuthArg, 0, 0);
80246: if(rc!=SQLITE_OK ){
80247: goto attach_end;
80248: }
80249: }
80250: #endif /* SQLITE_OMIT_AUTHORIZATION */
80251:
80252:
80253: v = sqlite3GetVdbe(pParse);
80254: regArgs = sqlite3GetTempRange(pParse, 4);
80255: sqlite3ExprCode(pParse, pFilename, regArgs);
80256: sqlite3ExprCode(pParse, pDbname, regArgs+1);
80257: sqlite3ExprCode(pParse, pKey, regArgs+2);
80258:
80259: assert( v || db->mallocFailed );
80260: if( v ){
80261: sqlite3VdbeAddOp3(v, OP_Function, 0, regArgs+3-pFunc->nArg, regArgs+3);
80262: assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg );
80263: sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg));
80264: sqlite3VdbeChangeP4(v, -1, (char *)pFunc, P4_FUNCDEF);
80265:
80266: /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this
80267: ** statement only). For DETACH, set it to false (expire all existing
80268: ** statements).
80269: */
80270: sqlite3VdbeAddOp1(v, OP_Expire, (type==SQLITE_ATTACH));
80271: }
80272:
80273: attach_end:
80274: sqlite3ExprDelete(db, pFilename);
80275: sqlite3ExprDelete(db, pDbname);
80276: sqlite3ExprDelete(db, pKey);
80277: }
80278:
80279: /*
80280: ** Called by the parser to compile a DETACH statement.
80281: **
80282: ** DETACH pDbname
80283: */
80284: SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){
80285: static const FuncDef detach_func = {
80286: 1, /* nArg */
80287: SQLITE_UTF8, /* iPrefEnc */
80288: 0, /* flags */
80289: 0, /* pUserData */
80290: 0, /* pNext */
80291: detachFunc, /* xFunc */
80292: 0, /* xStep */
80293: 0, /* xFinalize */
80294: "sqlite_detach", /* zName */
80295: 0, /* pHash */
80296: 0 /* pDestructor */
80297: };
80298: codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname);
80299: }
80300:
80301: /*
80302: ** Called by the parser to compile an ATTACH statement.
80303: **
80304: ** ATTACH p AS pDbname KEY pKey
80305: */
80306: SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){
80307: static const FuncDef attach_func = {
80308: 3, /* nArg */
80309: SQLITE_UTF8, /* iPrefEnc */
80310: 0, /* flags */
80311: 0, /* pUserData */
80312: 0, /* pNext */
80313: attachFunc, /* xFunc */
80314: 0, /* xStep */
80315: 0, /* xFinalize */
80316: "sqlite_attach", /* zName */
80317: 0, /* pHash */
80318: 0 /* pDestructor */
80319: };
80320: codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey);
80321: }
80322: #endif /* SQLITE_OMIT_ATTACH */
80323:
80324: /*
80325: ** Initialize a DbFixer structure. This routine must be called prior
80326: ** to passing the structure to one of the sqliteFixAAAA() routines below.
80327: **
80328: ** The return value indicates whether or not fixation is required. TRUE
80329: ** means we do need to fix the database references, FALSE means we do not.
80330: */
80331: SQLITE_PRIVATE int sqlite3FixInit(
80332: DbFixer *pFix, /* The fixer to be initialized */
80333: Parse *pParse, /* Error messages will be written here */
80334: int iDb, /* This is the database that must be used */
80335: const char *zType, /* "view", "trigger", or "index" */
80336: const Token *pName /* Name of the view, trigger, or index */
80337: ){
80338: sqlite3 *db;
80339:
80340: if( NEVER(iDb<0) || iDb==1 ) return 0;
80341: db = pParse->db;
80342: assert( db->nDb>iDb );
80343: pFix->pParse = pParse;
80344: pFix->zDb = db->aDb[iDb].zName;
1.2.2.1 ! misho 80345: pFix->pSchema = db->aDb[iDb].pSchema;
1.2 misho 80346: pFix->zType = zType;
80347: pFix->pName = pName;
80348: return 1;
80349: }
80350:
80351: /*
80352: ** The following set of routines walk through the parse tree and assign
80353: ** a specific database to all table references where the database name
80354: ** was left unspecified in the original SQL statement. The pFix structure
80355: ** must have been initialized by a prior call to sqlite3FixInit().
80356: **
80357: ** These routines are used to make sure that an index, trigger, or
80358: ** view in one database does not refer to objects in a different database.
80359: ** (Exception: indices, triggers, and views in the TEMP database are
80360: ** allowed to refer to anything.) If a reference is explicitly made
80361: ** to an object in a different database, an error message is added to
80362: ** pParse->zErrMsg and these routines return non-zero. If everything
80363: ** checks out, these routines return 0.
80364: */
80365: SQLITE_PRIVATE int sqlite3FixSrcList(
80366: DbFixer *pFix, /* Context of the fixation */
80367: SrcList *pList /* The Source list to check and modify */
80368: ){
80369: int i;
80370: const char *zDb;
80371: struct SrcList_item *pItem;
80372:
80373: if( NEVER(pList==0) ) return 0;
80374: zDb = pFix->zDb;
80375: for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
1.2.2.1 ! misho 80376: if( pItem->zDatabase && sqlite3StrICmp(pItem->zDatabase, zDb) ){
1.2 misho 80377: sqlite3ErrorMsg(pFix->pParse,
80378: "%s %T cannot reference objects in database %s",
80379: pFix->zType, pFix->pName, pItem->zDatabase);
80380: return 1;
80381: }
1.2.2.1 ! misho 80382: sqlite3DbFree(pFix->pParse->db, pItem->zDatabase);
! 80383: pItem->zDatabase = 0;
! 80384: pItem->pSchema = pFix->pSchema;
1.2 misho 80385: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
80386: if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1;
80387: if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1;
80388: #endif
80389: }
80390: return 0;
80391: }
80392: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
80393: SQLITE_PRIVATE int sqlite3FixSelect(
80394: DbFixer *pFix, /* Context of the fixation */
80395: Select *pSelect /* The SELECT statement to be fixed to one database */
80396: ){
80397: while( pSelect ){
80398: if( sqlite3FixExprList(pFix, pSelect->pEList) ){
80399: return 1;
80400: }
80401: if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){
80402: return 1;
80403: }
80404: if( sqlite3FixExpr(pFix, pSelect->pWhere) ){
80405: return 1;
80406: }
80407: if( sqlite3FixExpr(pFix, pSelect->pHaving) ){
80408: return 1;
80409: }
80410: pSelect = pSelect->pPrior;
80411: }
80412: return 0;
80413: }
80414: SQLITE_PRIVATE int sqlite3FixExpr(
80415: DbFixer *pFix, /* Context of the fixation */
80416: Expr *pExpr /* The expression to be fixed to one database */
80417: ){
80418: while( pExpr ){
80419: if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ) break;
80420: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
80421: if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1;
80422: }else{
80423: if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1;
80424: }
80425: if( sqlite3FixExpr(pFix, pExpr->pRight) ){
80426: return 1;
80427: }
80428: pExpr = pExpr->pLeft;
80429: }
80430: return 0;
80431: }
80432: SQLITE_PRIVATE int sqlite3FixExprList(
80433: DbFixer *pFix, /* Context of the fixation */
80434: ExprList *pList /* The expression to be fixed to one database */
80435: ){
80436: int i;
80437: struct ExprList_item *pItem;
80438: if( pList==0 ) return 0;
80439: for(i=0, pItem=pList->a; i<pList->nExpr; i++, pItem++){
80440: if( sqlite3FixExpr(pFix, pItem->pExpr) ){
80441: return 1;
80442: }
80443: }
80444: return 0;
80445: }
80446: #endif
80447:
80448: #ifndef SQLITE_OMIT_TRIGGER
80449: SQLITE_PRIVATE int sqlite3FixTriggerStep(
80450: DbFixer *pFix, /* Context of the fixation */
80451: TriggerStep *pStep /* The trigger step be fixed to one database */
80452: ){
80453: while( pStep ){
80454: if( sqlite3FixSelect(pFix, pStep->pSelect) ){
80455: return 1;
80456: }
80457: if( sqlite3FixExpr(pFix, pStep->pWhere) ){
80458: return 1;
80459: }
80460: if( sqlite3FixExprList(pFix, pStep->pExprList) ){
80461: return 1;
80462: }
80463: pStep = pStep->pNext;
80464: }
80465: return 0;
80466: }
80467: #endif
80468:
80469: /************** End of attach.c **********************************************/
80470: /************** Begin file auth.c ********************************************/
80471: /*
80472: ** 2003 January 11
80473: **
80474: ** The author disclaims copyright to this source code. In place of
80475: ** a legal notice, here is a blessing:
80476: **
80477: ** May you do good and not evil.
80478: ** May you find forgiveness for yourself and forgive others.
80479: ** May you share freely, never taking more than you give.
80480: **
80481: *************************************************************************
80482: ** This file contains code used to implement the sqlite3_set_authorizer()
80483: ** API. This facility is an optional feature of the library. Embedded
80484: ** systems that do not need this facility may omit it by recompiling
80485: ** the library with -DSQLITE_OMIT_AUTHORIZATION=1
80486: */
80487:
80488: /*
80489: ** All of the code in this file may be omitted by defining a single
80490: ** macro.
80491: */
80492: #ifndef SQLITE_OMIT_AUTHORIZATION
80493:
80494: /*
80495: ** Set or clear the access authorization function.
80496: **
80497: ** The access authorization function is be called during the compilation
80498: ** phase to verify that the user has read and/or write access permission on
80499: ** various fields of the database. The first argument to the auth function
80500: ** is a copy of the 3rd argument to this routine. The second argument
80501: ** to the auth function is one of these constants:
80502: **
80503: ** SQLITE_CREATE_INDEX
80504: ** SQLITE_CREATE_TABLE
80505: ** SQLITE_CREATE_TEMP_INDEX
80506: ** SQLITE_CREATE_TEMP_TABLE
80507: ** SQLITE_CREATE_TEMP_TRIGGER
80508: ** SQLITE_CREATE_TEMP_VIEW
80509: ** SQLITE_CREATE_TRIGGER
80510: ** SQLITE_CREATE_VIEW
80511: ** SQLITE_DELETE
80512: ** SQLITE_DROP_INDEX
80513: ** SQLITE_DROP_TABLE
80514: ** SQLITE_DROP_TEMP_INDEX
80515: ** SQLITE_DROP_TEMP_TABLE
80516: ** SQLITE_DROP_TEMP_TRIGGER
80517: ** SQLITE_DROP_TEMP_VIEW
80518: ** SQLITE_DROP_TRIGGER
80519: ** SQLITE_DROP_VIEW
80520: ** SQLITE_INSERT
80521: ** SQLITE_PRAGMA
80522: ** SQLITE_READ
80523: ** SQLITE_SELECT
80524: ** SQLITE_TRANSACTION
80525: ** SQLITE_UPDATE
80526: **
80527: ** The third and fourth arguments to the auth function are the name of
80528: ** the table and the column that are being accessed. The auth function
80529: ** should return either SQLITE_OK, SQLITE_DENY, or SQLITE_IGNORE. If
80530: ** SQLITE_OK is returned, it means that access is allowed. SQLITE_DENY
80531: ** means that the SQL statement will never-run - the sqlite3_exec() call
80532: ** will return with an error. SQLITE_IGNORE means that the SQL statement
80533: ** should run but attempts to read the specified column will return NULL
80534: ** and attempts to write the column will be ignored.
80535: **
80536: ** Setting the auth function to NULL disables this hook. The default
80537: ** setting of the auth function is NULL.
80538: */
80539: SQLITE_API int sqlite3_set_authorizer(
80540: sqlite3 *db,
80541: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),
80542: void *pArg
80543: ){
80544: sqlite3_mutex_enter(db->mutex);
80545: db->xAuth = xAuth;
80546: db->pAuthArg = pArg;
80547: sqlite3ExpirePreparedStatements(db);
80548: sqlite3_mutex_leave(db->mutex);
80549: return SQLITE_OK;
80550: }
80551:
80552: /*
80553: ** Write an error message into pParse->zErrMsg that explains that the
80554: ** user-supplied authorization function returned an illegal value.
80555: */
80556: static void sqliteAuthBadReturnCode(Parse *pParse){
80557: sqlite3ErrorMsg(pParse, "authorizer malfunction");
80558: pParse->rc = SQLITE_ERROR;
80559: }
80560:
80561: /*
80562: ** Invoke the authorization callback for permission to read column zCol from
80563: ** table zTab in database zDb. This function assumes that an authorization
80564: ** callback has been registered (i.e. that sqlite3.xAuth is not NULL).
80565: **
80566: ** If SQLITE_IGNORE is returned and pExpr is not NULL, then pExpr is changed
80567: ** to an SQL NULL expression. Otherwise, if pExpr is NULL, then SQLITE_IGNORE
80568: ** is treated as SQLITE_DENY. In this case an error is left in pParse.
80569: */
80570: SQLITE_PRIVATE int sqlite3AuthReadCol(
80571: Parse *pParse, /* The parser context */
80572: const char *zTab, /* Table name */
80573: const char *zCol, /* Column name */
80574: int iDb /* Index of containing database. */
80575: ){
80576: sqlite3 *db = pParse->db; /* Database handle */
80577: char *zDb = db->aDb[iDb].zName; /* Name of attached database */
80578: int rc; /* Auth callback return code */
80579:
80580: rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext);
80581: if( rc==SQLITE_DENY ){
80582: if( db->nDb>2 || iDb!=0 ){
80583: sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited",zDb,zTab,zCol);
80584: }else{
80585: sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited", zTab, zCol);
80586: }
80587: pParse->rc = SQLITE_AUTH;
80588: }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){
80589: sqliteAuthBadReturnCode(pParse);
80590: }
80591: return rc;
80592: }
80593:
80594: /*
80595: ** The pExpr should be a TK_COLUMN expression. The table referred to
80596: ** is in pTabList or else it is the NEW or OLD table of a trigger.
80597: ** Check to see if it is OK to read this particular column.
80598: **
80599: ** If the auth function returns SQLITE_IGNORE, change the TK_COLUMN
80600: ** instruction into a TK_NULL. If the auth function returns SQLITE_DENY,
80601: ** then generate an error.
80602: */
80603: SQLITE_PRIVATE void sqlite3AuthRead(
80604: Parse *pParse, /* The parser context */
80605: Expr *pExpr, /* The expression to check authorization on */
80606: Schema *pSchema, /* The schema of the expression */
80607: SrcList *pTabList /* All table that pExpr might refer to */
80608: ){
80609: sqlite3 *db = pParse->db;
80610: Table *pTab = 0; /* The table being read */
80611: const char *zCol; /* Name of the column of the table */
80612: int iSrc; /* Index in pTabList->a[] of table being read */
80613: int iDb; /* The index of the database the expression refers to */
80614: int iCol; /* Index of column in table */
80615:
80616: if( db->xAuth==0 ) return;
80617: iDb = sqlite3SchemaToIndex(pParse->db, pSchema);
80618: if( iDb<0 ){
80619: /* An attempt to read a column out of a subquery or other
80620: ** temporary table. */
80621: return;
80622: }
80623:
80624: assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER );
80625: if( pExpr->op==TK_TRIGGER ){
80626: pTab = pParse->pTriggerTab;
80627: }else{
80628: assert( pTabList );
80629: for(iSrc=0; ALWAYS(iSrc<pTabList->nSrc); iSrc++){
80630: if( pExpr->iTable==pTabList->a[iSrc].iCursor ){
80631: pTab = pTabList->a[iSrc].pTab;
80632: break;
80633: }
80634: }
80635: }
80636: iCol = pExpr->iColumn;
80637: if( NEVER(pTab==0) ) return;
80638:
80639: if( iCol>=0 ){
80640: assert( iCol<pTab->nCol );
80641: zCol = pTab->aCol[iCol].zName;
80642: }else if( pTab->iPKey>=0 ){
80643: assert( pTab->iPKey<pTab->nCol );
80644: zCol = pTab->aCol[pTab->iPKey].zName;
80645: }else{
80646: zCol = "ROWID";
80647: }
80648: assert( iDb>=0 && iDb<db->nDb );
80649: if( SQLITE_IGNORE==sqlite3AuthReadCol(pParse, pTab->zName, zCol, iDb) ){
80650: pExpr->op = TK_NULL;
80651: }
80652: }
80653:
80654: /*
80655: ** Do an authorization check using the code and arguments given. Return
80656: ** either SQLITE_OK (zero) or SQLITE_IGNORE or SQLITE_DENY. If SQLITE_DENY
80657: ** is returned, then the error count and error message in pParse are
80658: ** modified appropriately.
80659: */
80660: SQLITE_PRIVATE int sqlite3AuthCheck(
80661: Parse *pParse,
80662: int code,
80663: const char *zArg1,
80664: const char *zArg2,
80665: const char *zArg3
80666: ){
80667: sqlite3 *db = pParse->db;
80668: int rc;
80669:
80670: /* Don't do any authorization checks if the database is initialising
80671: ** or if the parser is being invoked from within sqlite3_declare_vtab.
80672: */
80673: if( db->init.busy || IN_DECLARE_VTAB ){
80674: return SQLITE_OK;
80675: }
80676:
80677: if( db->xAuth==0 ){
80678: return SQLITE_OK;
80679: }
80680: rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext);
80681: if( rc==SQLITE_DENY ){
80682: sqlite3ErrorMsg(pParse, "not authorized");
80683: pParse->rc = SQLITE_AUTH;
80684: }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){
80685: rc = SQLITE_DENY;
80686: sqliteAuthBadReturnCode(pParse);
80687: }
80688: return rc;
80689: }
80690:
80691: /*
80692: ** Push an authorization context. After this routine is called, the
80693: ** zArg3 argument to authorization callbacks will be zContext until
80694: ** popped. Or if pParse==0, this routine is a no-op.
80695: */
80696: SQLITE_PRIVATE void sqlite3AuthContextPush(
80697: Parse *pParse,
80698: AuthContext *pContext,
80699: const char *zContext
80700: ){
80701: assert( pParse );
80702: pContext->pParse = pParse;
80703: pContext->zAuthContext = pParse->zAuthContext;
80704: pParse->zAuthContext = zContext;
80705: }
80706:
80707: /*
80708: ** Pop an authorization context that was previously pushed
80709: ** by sqlite3AuthContextPush
80710: */
80711: SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){
80712: if( pContext->pParse ){
80713: pContext->pParse->zAuthContext = pContext->zAuthContext;
80714: pContext->pParse = 0;
80715: }
80716: }
80717:
80718: #endif /* SQLITE_OMIT_AUTHORIZATION */
80719:
80720: /************** End of auth.c ************************************************/
80721: /************** Begin file build.c *******************************************/
80722: /*
80723: ** 2001 September 15
80724: **
80725: ** The author disclaims copyright to this source code. In place of
80726: ** a legal notice, here is a blessing:
80727: **
80728: ** May you do good and not evil.
80729: ** May you find forgiveness for yourself and forgive others.
80730: ** May you share freely, never taking more than you give.
80731: **
80732: *************************************************************************
80733: ** This file contains C code routines that are called by the SQLite parser
80734: ** when syntax rules are reduced. The routines in this file handle the
80735: ** following kinds of SQL syntax:
80736: **
80737: ** CREATE TABLE
80738: ** DROP TABLE
80739: ** CREATE INDEX
80740: ** DROP INDEX
80741: ** creating ID lists
80742: ** BEGIN TRANSACTION
80743: ** COMMIT
80744: ** ROLLBACK
80745: */
80746:
80747: /*
80748: ** This routine is called when a new SQL statement is beginning to
80749: ** be parsed. Initialize the pParse structure as needed.
80750: */
80751: SQLITE_PRIVATE void sqlite3BeginParse(Parse *pParse, int explainFlag){
80752: pParse->explain = (u8)explainFlag;
80753: pParse->nVar = 0;
80754: }
80755:
80756: #ifndef SQLITE_OMIT_SHARED_CACHE
80757: /*
80758: ** The TableLock structure is only used by the sqlite3TableLock() and
80759: ** codeTableLocks() functions.
80760: */
80761: struct TableLock {
80762: int iDb; /* The database containing the table to be locked */
80763: int iTab; /* The root page of the table to be locked */
80764: u8 isWriteLock; /* True for write lock. False for a read lock */
80765: const char *zName; /* Name of the table */
80766: };
80767:
80768: /*
80769: ** Record the fact that we want to lock a table at run-time.
80770: **
80771: ** The table to be locked has root page iTab and is found in database iDb.
80772: ** A read or a write lock can be taken depending on isWritelock.
80773: **
80774: ** This routine just records the fact that the lock is desired. The
80775: ** code to make the lock occur is generated by a later call to
80776: ** codeTableLocks() which occurs during sqlite3FinishCoding().
80777: */
80778: SQLITE_PRIVATE void sqlite3TableLock(
80779: Parse *pParse, /* Parsing context */
80780: int iDb, /* Index of the database containing the table to lock */
80781: int iTab, /* Root page number of the table to be locked */
80782: u8 isWriteLock, /* True for a write lock */
80783: const char *zName /* Name of the table to be locked */
80784: ){
80785: Parse *pToplevel = sqlite3ParseToplevel(pParse);
80786: int i;
80787: int nBytes;
80788: TableLock *p;
80789: assert( iDb>=0 );
80790:
80791: for(i=0; i<pToplevel->nTableLock; i++){
80792: p = &pToplevel->aTableLock[i];
80793: if( p->iDb==iDb && p->iTab==iTab ){
80794: p->isWriteLock = (p->isWriteLock || isWriteLock);
80795: return;
80796: }
80797: }
80798:
80799: nBytes = sizeof(TableLock) * (pToplevel->nTableLock+1);
80800: pToplevel->aTableLock =
80801: sqlite3DbReallocOrFree(pToplevel->db, pToplevel->aTableLock, nBytes);
80802: if( pToplevel->aTableLock ){
80803: p = &pToplevel->aTableLock[pToplevel->nTableLock++];
80804: p->iDb = iDb;
80805: p->iTab = iTab;
80806: p->isWriteLock = isWriteLock;
80807: p->zName = zName;
80808: }else{
80809: pToplevel->nTableLock = 0;
80810: pToplevel->db->mallocFailed = 1;
80811: }
80812: }
80813:
80814: /*
80815: ** Code an OP_TableLock instruction for each table locked by the
80816: ** statement (configured by calls to sqlite3TableLock()).
80817: */
80818: static void codeTableLocks(Parse *pParse){
80819: int i;
80820: Vdbe *pVdbe;
80821:
80822: pVdbe = sqlite3GetVdbe(pParse);
80823: assert( pVdbe!=0 ); /* sqlite3GetVdbe cannot fail: VDBE already allocated */
80824:
80825: for(i=0; i<pParse->nTableLock; i++){
80826: TableLock *p = &pParse->aTableLock[i];
80827: int p1 = p->iDb;
80828: sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock,
80829: p->zName, P4_STATIC);
80830: }
80831: }
80832: #else
80833: #define codeTableLocks(x)
80834: #endif
80835:
80836: /*
80837: ** This routine is called after a single SQL statement has been
80838: ** parsed and a VDBE program to execute that statement has been
80839: ** prepared. This routine puts the finishing touches on the
80840: ** VDBE program and resets the pParse structure for the next
80841: ** parse.
80842: **
80843: ** Note that if an error occurred, it might be the case that
80844: ** no VDBE code was generated.
80845: */
80846: SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){
80847: sqlite3 *db;
80848: Vdbe *v;
80849:
1.2.2.1 ! misho 80850: assert( pParse->pToplevel==0 );
1.2 misho 80851: db = pParse->db;
80852: if( db->mallocFailed ) return;
80853: if( pParse->nested ) return;
80854: if( pParse->nErr ) return;
80855:
80856: /* Begin by generating some termination code at the end of the
80857: ** vdbe program
80858: */
80859: v = sqlite3GetVdbe(pParse);
80860: assert( !pParse->isMultiWrite
80861: || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort));
80862: if( v ){
80863: sqlite3VdbeAddOp0(v, OP_Halt);
80864:
80865: /* The cookie mask contains one bit for each database file open.
80866: ** (Bit 0 is for main, bit 1 is for temp, and so forth.) Bits are
80867: ** set for each database that is used. Generate code to start a
80868: ** transaction on each used database and to verify the schema cookie
80869: ** on each used database.
80870: */
80871: if( pParse->cookieGoto>0 ){
80872: yDbMask mask;
80873: int iDb;
80874: sqlite3VdbeJumpHere(v, pParse->cookieGoto-1);
80875: for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
80876: if( (mask & pParse->cookieMask)==0 ) continue;
80877: sqlite3VdbeUsesBtree(v, iDb);
80878: sqlite3VdbeAddOp2(v,OP_Transaction, iDb, (mask & pParse->writeMask)!=0);
80879: if( db->init.busy==0 ){
80880: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
80881: sqlite3VdbeAddOp3(v, OP_VerifyCookie,
80882: iDb, pParse->cookieValue[iDb],
80883: db->aDb[iDb].pSchema->iGeneration);
80884: }
80885: }
80886: #ifndef SQLITE_OMIT_VIRTUALTABLE
80887: {
80888: int i;
80889: for(i=0; i<pParse->nVtabLock; i++){
80890: char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]);
80891: sqlite3VdbeAddOp4(v, OP_VBegin, 0, 0, 0, vtab, P4_VTAB);
80892: }
80893: pParse->nVtabLock = 0;
80894: }
80895: #endif
80896:
80897: /* Once all the cookies have been verified and transactions opened,
80898: ** obtain the required table-locks. This is a no-op unless the
80899: ** shared-cache feature is enabled.
80900: */
80901: codeTableLocks(pParse);
80902:
80903: /* Initialize any AUTOINCREMENT data structures required.
80904: */
80905: sqlite3AutoincrementBegin(pParse);
80906:
80907: /* Finally, jump back to the beginning of the executable code. */
80908: sqlite3VdbeAddOp2(v, OP_Goto, 0, pParse->cookieGoto);
80909: }
80910: }
80911:
80912:
80913: /* Get the VDBE program ready for execution
80914: */
80915: if( v && ALWAYS(pParse->nErr==0) && !db->mallocFailed ){
80916: #ifdef SQLITE_DEBUG
80917: FILE *trace = (db->flags & SQLITE_VdbeTrace)!=0 ? stdout : 0;
80918: sqlite3VdbeTrace(v, trace);
80919: #endif
80920: assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */
80921: /* A minimum of one cursor is required if autoincrement is used
80922: * See ticket [a696379c1f08866] */
80923: if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1;
80924: sqlite3VdbeMakeReady(v, pParse);
80925: pParse->rc = SQLITE_DONE;
80926: pParse->colNamesSet = 0;
80927: }else{
80928: pParse->rc = SQLITE_ERROR;
80929: }
80930: pParse->nTab = 0;
80931: pParse->nMem = 0;
80932: pParse->nSet = 0;
80933: pParse->nVar = 0;
80934: pParse->cookieMask = 0;
80935: pParse->cookieGoto = 0;
80936: }
80937:
80938: /*
80939: ** Run the parser and code generator recursively in order to generate
80940: ** code for the SQL statement given onto the end of the pParse context
80941: ** currently under construction. When the parser is run recursively
80942: ** this way, the final OP_Halt is not appended and other initialization
80943: ** and finalization steps are omitted because those are handling by the
80944: ** outermost parser.
80945: **
80946: ** Not everything is nestable. This facility is designed to permit
80947: ** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use
80948: ** care if you decide to try to use this routine for some other purposes.
80949: */
80950: SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){
80951: va_list ap;
80952: char *zSql;
80953: char *zErrMsg = 0;
80954: sqlite3 *db = pParse->db;
80955: # define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar))
80956: char saveBuf[SAVE_SZ];
80957:
80958: if( pParse->nErr ) return;
80959: assert( pParse->nested<10 ); /* Nesting should only be of limited depth */
80960: va_start(ap, zFormat);
80961: zSql = sqlite3VMPrintf(db, zFormat, ap);
80962: va_end(ap);
80963: if( zSql==0 ){
80964: return; /* A malloc must have failed */
80965: }
80966: pParse->nested++;
80967: memcpy(saveBuf, &pParse->nVar, SAVE_SZ);
80968: memset(&pParse->nVar, 0, SAVE_SZ);
80969: sqlite3RunParser(pParse, zSql, &zErrMsg);
80970: sqlite3DbFree(db, zErrMsg);
80971: sqlite3DbFree(db, zSql);
80972: memcpy(&pParse->nVar, saveBuf, SAVE_SZ);
80973: pParse->nested--;
80974: }
80975:
80976: /*
80977: ** Locate the in-memory structure that describes a particular database
80978: ** table given the name of that table and (optionally) the name of the
80979: ** database containing the table. Return NULL if not found.
80980: **
80981: ** If zDatabase is 0, all databases are searched for the table and the
80982: ** first matching table is returned. (No checking for duplicate table
80983: ** names is done.) The search order is TEMP first, then MAIN, then any
80984: ** auxiliary databases added using the ATTACH command.
80985: **
80986: ** See also sqlite3LocateTable().
80987: */
80988: SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){
80989: Table *p = 0;
80990: int i;
80991: int nName;
80992: assert( zName!=0 );
80993: nName = sqlite3Strlen30(zName);
80994: /* All mutexes are required for schema access. Make sure we hold them. */
80995: assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) );
80996: for(i=OMIT_TEMPDB; i<db->nDb; i++){
80997: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
80998: if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue;
80999: assert( sqlite3SchemaMutexHeld(db, j, 0) );
81000: p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName, nName);
81001: if( p ) break;
81002: }
81003: return p;
81004: }
81005:
81006: /*
81007: ** Locate the in-memory structure that describes a particular database
81008: ** table given the name of that table and (optionally) the name of the
81009: ** database containing the table. Return NULL if not found. Also leave an
81010: ** error message in pParse->zErrMsg.
81011: **
81012: ** The difference between this routine and sqlite3FindTable() is that this
81013: ** routine leaves an error message in pParse->zErrMsg where
81014: ** sqlite3FindTable() does not.
81015: */
81016: SQLITE_PRIVATE Table *sqlite3LocateTable(
81017: Parse *pParse, /* context in which to report errors */
81018: int isView, /* True if looking for a VIEW rather than a TABLE */
81019: const char *zName, /* Name of the table we are looking for */
81020: const char *zDbase /* Name of the database. Might be NULL */
81021: ){
81022: Table *p;
81023:
81024: /* Read the database schema. If an error occurs, leave an error message
81025: ** and code in pParse and return NULL. */
81026: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
81027: return 0;
81028: }
81029:
81030: p = sqlite3FindTable(pParse->db, zName, zDbase);
81031: if( p==0 ){
81032: const char *zMsg = isView ? "no such view" : "no such table";
81033: if( zDbase ){
81034: sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName);
81035: }else{
81036: sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName);
81037: }
81038: pParse->checkSchema = 1;
81039: }
81040: return p;
81041: }
81042:
81043: /*
1.2.2.1 ! misho 81044: ** Locate the table identified by *p.
! 81045: **
! 81046: ** This is a wrapper around sqlite3LocateTable(). The difference between
! 81047: ** sqlite3LocateTable() and this function is that this function restricts
! 81048: ** the search to schema (p->pSchema) if it is not NULL. p->pSchema may be
! 81049: ** non-NULL if it is part of a view or trigger program definition. See
! 81050: ** sqlite3FixSrcList() for details.
! 81051: */
! 81052: SQLITE_PRIVATE Table *sqlite3LocateTableItem(
! 81053: Parse *pParse,
! 81054: int isView,
! 81055: struct SrcList_item *p
! 81056: ){
! 81057: const char *zDb;
! 81058: assert( p->pSchema==0 || p->zDatabase==0 );
! 81059: if( p->pSchema ){
! 81060: int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema);
! 81061: zDb = pParse->db->aDb[iDb].zName;
! 81062: }else{
! 81063: zDb = p->zDatabase;
! 81064: }
! 81065: return sqlite3LocateTable(pParse, isView, p->zName, zDb);
! 81066: }
! 81067:
! 81068: /*
1.2 misho 81069: ** Locate the in-memory structure that describes
81070: ** a particular index given the name of that index
81071: ** and the name of the database that contains the index.
81072: ** Return NULL if not found.
81073: **
81074: ** If zDatabase is 0, all databases are searched for the
81075: ** table and the first matching index is returned. (No checking
81076: ** for duplicate index names is done.) The search order is
81077: ** TEMP first, then MAIN, then any auxiliary databases added
81078: ** using the ATTACH command.
81079: */
81080: SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const char *zDb){
81081: Index *p = 0;
81082: int i;
81083: int nName = sqlite3Strlen30(zName);
81084: /* All mutexes are required for schema access. Make sure we hold them. */
81085: assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
81086: for(i=OMIT_TEMPDB; i<db->nDb; i++){
81087: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
81088: Schema *pSchema = db->aDb[j].pSchema;
81089: assert( pSchema );
81090: if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue;
81091: assert( sqlite3SchemaMutexHeld(db, j, 0) );
81092: p = sqlite3HashFind(&pSchema->idxHash, zName, nName);
81093: if( p ) break;
81094: }
81095: return p;
81096: }
81097:
81098: /*
81099: ** Reclaim the memory used by an index
81100: */
81101: static void freeIndex(sqlite3 *db, Index *p){
81102: #ifndef SQLITE_OMIT_ANALYZE
81103: sqlite3DeleteIndexSamples(db, p);
81104: #endif
81105: sqlite3DbFree(db, p->zColAff);
81106: sqlite3DbFree(db, p);
81107: }
81108:
81109: /*
81110: ** For the index called zIdxName which is found in the database iDb,
81111: ** unlike that index from its Table then remove the index from
81112: ** the index hash table and free all memory structures associated
81113: ** with the index.
81114: */
81115: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char *zIdxName){
81116: Index *pIndex;
81117: int len;
81118: Hash *pHash;
81119:
81120: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
81121: pHash = &db->aDb[iDb].pSchema->idxHash;
81122: len = sqlite3Strlen30(zIdxName);
81123: pIndex = sqlite3HashInsert(pHash, zIdxName, len, 0);
81124: if( ALWAYS(pIndex) ){
81125: if( pIndex->pTable->pIndex==pIndex ){
81126: pIndex->pTable->pIndex = pIndex->pNext;
81127: }else{
81128: Index *p;
81129: /* Justification of ALWAYS(); The index must be on the list of
81130: ** indices. */
81131: p = pIndex->pTable->pIndex;
81132: while( ALWAYS(p) && p->pNext!=pIndex ){ p = p->pNext; }
81133: if( ALWAYS(p && p->pNext==pIndex) ){
81134: p->pNext = pIndex->pNext;
81135: }
81136: }
81137: freeIndex(db, pIndex);
81138: }
81139: db->flags |= SQLITE_InternChanges;
81140: }
81141:
81142: /*
1.2.2.1 ! misho 81143: ** Look through the list of open database files in db->aDb[] and if
! 81144: ** any have been closed, remove them from the list. Reallocate the
! 81145: ** db->aDb[] structure to a smaller size, if possible.
! 81146: **
! 81147: ** Entry 0 (the "main" database) and entry 1 (the "temp" database)
! 81148: ** are never candidates for being collapsed.
1.2 misho 81149: */
1.2.2.1 ! misho 81150: SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){
1.2 misho 81151: int i, j;
81152: for(i=j=2; i<db->nDb; i++){
81153: struct Db *pDb = &db->aDb[i];
81154: if( pDb->pBt==0 ){
81155: sqlite3DbFree(db, pDb->zName);
81156: pDb->zName = 0;
81157: continue;
81158: }
81159: if( j<i ){
81160: db->aDb[j] = db->aDb[i];
81161: }
81162: j++;
81163: }
81164: memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j]));
81165: db->nDb = j;
81166: if( db->nDb<=2 && db->aDb!=db->aDbStatic ){
81167: memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0]));
81168: sqlite3DbFree(db, db->aDb);
81169: db->aDb = db->aDbStatic;
81170: }
81171: }
81172:
81173: /*
1.2.2.1 ! misho 81174: ** Reset the schema for the database at index iDb. Also reset the
! 81175: ** TEMP schema.
! 81176: */
! 81177: SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){
! 81178: Db *pDb;
! 81179: assert( iDb<db->nDb );
! 81180:
! 81181: /* Case 1: Reset the single schema identified by iDb */
! 81182: pDb = &db->aDb[iDb];
! 81183: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 81184: assert( pDb->pSchema!=0 );
! 81185: sqlite3SchemaClear(pDb->pSchema);
! 81186:
! 81187: /* If any database other than TEMP is reset, then also reset TEMP
! 81188: ** since TEMP might be holding triggers that reference tables in the
! 81189: ** other database.
! 81190: */
! 81191: if( iDb!=1 ){
! 81192: pDb = &db->aDb[1];
! 81193: assert( pDb->pSchema!=0 );
! 81194: sqlite3SchemaClear(pDb->pSchema);
! 81195: }
! 81196: return;
! 81197: }
! 81198:
! 81199: /*
! 81200: ** Erase all schema information from all attached databases (including
! 81201: ** "main" and "temp") for a single database connection.
! 81202: */
! 81203: SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){
! 81204: int i;
! 81205: sqlite3BtreeEnterAll(db);
! 81206: for(i=0; i<db->nDb; i++){
! 81207: Db *pDb = &db->aDb[i];
! 81208: if( pDb->pSchema ){
! 81209: sqlite3SchemaClear(pDb->pSchema);
! 81210: }
! 81211: }
! 81212: db->flags &= ~SQLITE_InternChanges;
! 81213: sqlite3VtabUnlockList(db);
! 81214: sqlite3BtreeLeaveAll(db);
! 81215: sqlite3CollapseDatabaseArray(db);
! 81216: }
! 81217:
! 81218: /*
1.2 misho 81219: ** This routine is called when a commit occurs.
81220: */
81221: SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){
81222: db->flags &= ~SQLITE_InternChanges;
81223: }
81224:
81225: /*
81226: ** Delete memory allocated for the column names of a table or view (the
81227: ** Table.aCol[] array).
81228: */
81229: static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){
81230: int i;
81231: Column *pCol;
81232: assert( pTable!=0 );
81233: if( (pCol = pTable->aCol)!=0 ){
81234: for(i=0; i<pTable->nCol; i++, pCol++){
81235: sqlite3DbFree(db, pCol->zName);
81236: sqlite3ExprDelete(db, pCol->pDflt);
81237: sqlite3DbFree(db, pCol->zDflt);
81238: sqlite3DbFree(db, pCol->zType);
81239: sqlite3DbFree(db, pCol->zColl);
81240: }
81241: sqlite3DbFree(db, pTable->aCol);
81242: }
81243: }
81244:
81245: /*
81246: ** Remove the memory data structures associated with the given
81247: ** Table. No changes are made to disk by this routine.
81248: **
81249: ** This routine just deletes the data structure. It does not unlink
81250: ** the table data structure from the hash table. But it does destroy
81251: ** memory structures of the indices and foreign keys associated with
81252: ** the table.
1.2.2.1 ! misho 81253: **
! 81254: ** The db parameter is optional. It is needed if the Table object
! 81255: ** contains lookaside memory. (Table objects in the schema do not use
! 81256: ** lookaside memory, but some ephemeral Table objects do.) Or the
! 81257: ** db parameter can be used with db->pnBytesFreed to measure the memory
! 81258: ** used by the Table object.
1.2 misho 81259: */
81260: SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){
81261: Index *pIndex, *pNext;
1.2.2.1 ! misho 81262: TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */
1.2 misho 81263:
81264: assert( !pTable || pTable->nRef>0 );
81265:
81266: /* Do not delete the table until the reference count reaches zero. */
81267: if( !pTable ) return;
81268: if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return;
81269:
1.2.2.1 ! misho 81270: /* Record the number of outstanding lookaside allocations in schema Tables
! 81271: ** prior to doing any free() operations. Since schema Tables do not use
! 81272: ** lookaside, this number should not change. */
! 81273: TESTONLY( nLookaside = (db && (pTable->tabFlags & TF_Ephemeral)==0) ?
! 81274: db->lookaside.nOut : 0 );
! 81275:
1.2 misho 81276: /* Delete all indices associated with this table. */
81277: for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
81278: pNext = pIndex->pNext;
81279: assert( pIndex->pSchema==pTable->pSchema );
81280: if( !db || db->pnBytesFreed==0 ){
81281: char *zName = pIndex->zName;
81282: TESTONLY ( Index *pOld = ) sqlite3HashInsert(
1.2.2.1 ! misho 81283: &pIndex->pSchema->idxHash, zName, sqlite3Strlen30(zName), 0
1.2 misho 81284: );
81285: assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
81286: assert( pOld==pIndex || pOld==0 );
81287: }
81288: freeIndex(db, pIndex);
81289: }
81290:
81291: /* Delete any foreign keys attached to this table. */
81292: sqlite3FkDelete(db, pTable);
81293:
81294: /* Delete the Table structure itself.
81295: */
81296: sqliteDeleteColumnNames(db, pTable);
81297: sqlite3DbFree(db, pTable->zName);
81298: sqlite3DbFree(db, pTable->zColAff);
81299: sqlite3SelectDelete(db, pTable->pSelect);
81300: #ifndef SQLITE_OMIT_CHECK
1.2.2.1 ! misho 81301: sqlite3ExprListDelete(db, pTable->pCheck);
1.2 misho 81302: #endif
81303: #ifndef SQLITE_OMIT_VIRTUALTABLE
81304: sqlite3VtabClear(db, pTable);
81305: #endif
81306: sqlite3DbFree(db, pTable);
1.2.2.1 ! misho 81307:
! 81308: /* Verify that no lookaside memory was used by schema tables */
! 81309: assert( nLookaside==0 || nLookaside==db->lookaside.nOut );
1.2 misho 81310: }
81311:
81312: /*
81313: ** Unlink the given table from the hash tables and the delete the
81314: ** table structure with all its indices and foreign keys.
81315: */
81316: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char *zTabName){
81317: Table *p;
81318: Db *pDb;
81319:
81320: assert( db!=0 );
81321: assert( iDb>=0 && iDb<db->nDb );
81322: assert( zTabName );
81323: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
81324: testcase( zTabName[0]==0 ); /* Zero-length table names are allowed */
81325: pDb = &db->aDb[iDb];
81326: p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName,
81327: sqlite3Strlen30(zTabName),0);
81328: sqlite3DeleteTable(db, p);
81329: db->flags |= SQLITE_InternChanges;
81330: }
81331:
81332: /*
81333: ** Given a token, return a string that consists of the text of that
81334: ** token. Space to hold the returned string
81335: ** is obtained from sqliteMalloc() and must be freed by the calling
81336: ** function.
81337: **
81338: ** Any quotation marks (ex: "name", 'name', [name], or `name`) that
81339: ** surround the body of the token are removed.
81340: **
81341: ** Tokens are often just pointers into the original SQL text and so
81342: ** are not \000 terminated and are not persistent. The returned string
81343: ** is \000 terminated and is persistent.
81344: */
81345: SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){
81346: char *zName;
81347: if( pName ){
81348: zName = sqlite3DbStrNDup(db, (char*)pName->z, pName->n);
81349: sqlite3Dequote(zName);
81350: }else{
81351: zName = 0;
81352: }
81353: return zName;
81354: }
81355:
81356: /*
81357: ** Open the sqlite_master table stored in database number iDb for
81358: ** writing. The table is opened using cursor 0.
81359: */
81360: SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *p, int iDb){
81361: Vdbe *v = sqlite3GetVdbe(p);
81362: sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb));
81363: sqlite3VdbeAddOp3(v, OP_OpenWrite, 0, MASTER_ROOT, iDb);
81364: sqlite3VdbeChangeP4(v, -1, (char *)5, P4_INT32); /* 5 column table */
81365: if( p->nTab==0 ){
81366: p->nTab = 1;
81367: }
81368: }
81369:
81370: /*
81371: ** Parameter zName points to a nul-terminated buffer containing the name
81372: ** of a database ("main", "temp" or the name of an attached db). This
81373: ** function returns the index of the named database in db->aDb[], or
81374: ** -1 if the named db cannot be found.
81375: */
81376: SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){
81377: int i = -1; /* Database number */
81378: if( zName ){
81379: Db *pDb;
81380: int n = sqlite3Strlen30(zName);
81381: for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){
81382: if( (!OMIT_TEMPDB || i!=1 ) && n==sqlite3Strlen30(pDb->zName) &&
81383: 0==sqlite3StrICmp(pDb->zName, zName) ){
81384: break;
81385: }
81386: }
81387: }
81388: return i;
81389: }
81390:
81391: /*
81392: ** The token *pName contains the name of a database (either "main" or
81393: ** "temp" or the name of an attached db). This routine returns the
81394: ** index of the named database in db->aDb[], or -1 if the named db
81395: ** does not exist.
81396: */
81397: SQLITE_PRIVATE int sqlite3FindDb(sqlite3 *db, Token *pName){
81398: int i; /* Database number */
81399: char *zName; /* Name we are searching for */
81400: zName = sqlite3NameFromToken(db, pName);
81401: i = sqlite3FindDbName(db, zName);
81402: sqlite3DbFree(db, zName);
81403: return i;
81404: }
81405:
81406: /* The table or view or trigger name is passed to this routine via tokens
81407: ** pName1 and pName2. If the table name was fully qualified, for example:
81408: **
81409: ** CREATE TABLE xxx.yyy (...);
81410: **
81411: ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
81412: ** the table name is not fully qualified, i.e.:
81413: **
81414: ** CREATE TABLE yyy(...);
81415: **
81416: ** Then pName1 is set to "yyy" and pName2 is "".
81417: **
81418: ** This routine sets the *ppUnqual pointer to point at the token (pName1 or
81419: ** pName2) that stores the unqualified table name. The index of the
81420: ** database "xxx" is returned.
81421: */
81422: SQLITE_PRIVATE int sqlite3TwoPartName(
81423: Parse *pParse, /* Parsing and code generating context */
81424: Token *pName1, /* The "xxx" in the name "xxx.yyy" or "xxx" */
81425: Token *pName2, /* The "yyy" in the name "xxx.yyy" */
81426: Token **pUnqual /* Write the unqualified object name here */
81427: ){
81428: int iDb; /* Database holding the object */
81429: sqlite3 *db = pParse->db;
81430:
81431: if( ALWAYS(pName2!=0) && pName2->n>0 ){
81432: if( db->init.busy ) {
81433: sqlite3ErrorMsg(pParse, "corrupt database");
81434: pParse->nErr++;
81435: return -1;
81436: }
81437: *pUnqual = pName2;
81438: iDb = sqlite3FindDb(db, pName1);
81439: if( iDb<0 ){
81440: sqlite3ErrorMsg(pParse, "unknown database %T", pName1);
81441: pParse->nErr++;
81442: return -1;
81443: }
81444: }else{
81445: assert( db->init.iDb==0 || db->init.busy );
81446: iDb = db->init.iDb;
81447: *pUnqual = pName1;
81448: }
81449: return iDb;
81450: }
81451:
81452: /*
81453: ** This routine is used to check if the UTF-8 string zName is a legal
81454: ** unqualified name for a new schema object (table, index, view or
81455: ** trigger). All names are legal except those that begin with the string
81456: ** "sqlite_" (in upper, lower or mixed case). This portion of the namespace
81457: ** is reserved for internal use.
81458: */
81459: SQLITE_PRIVATE int sqlite3CheckObjectName(Parse *pParse, const char *zName){
81460: if( !pParse->db->init.busy && pParse->nested==0
81461: && (pParse->db->flags & SQLITE_WriteSchema)==0
81462: && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){
81463: sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName);
81464: return SQLITE_ERROR;
81465: }
81466: return SQLITE_OK;
81467: }
81468:
81469: /*
81470: ** Begin constructing a new table representation in memory. This is
81471: ** the first of several action routines that get called in response
81472: ** to a CREATE TABLE statement. In particular, this routine is called
81473: ** after seeing tokens "CREATE" and "TABLE" and the table name. The isTemp
81474: ** flag is true if the table should be stored in the auxiliary database
81475: ** file instead of in the main database file. This is normally the case
81476: ** when the "TEMP" or "TEMPORARY" keyword occurs in between
81477: ** CREATE and TABLE.
81478: **
81479: ** The new table record is initialized and put in pParse->pNewTable.
81480: ** As more of the CREATE TABLE statement is parsed, additional action
81481: ** routines will be called to add more information to this record.
81482: ** At the end of the CREATE TABLE statement, the sqlite3EndTable() routine
81483: ** is called to complete the construction of the new table record.
81484: */
81485: SQLITE_PRIVATE void sqlite3StartTable(
81486: Parse *pParse, /* Parser context */
81487: Token *pName1, /* First part of the name of the table or view */
81488: Token *pName2, /* Second part of the name of the table or view */
81489: int isTemp, /* True if this is a TEMP table */
81490: int isView, /* True if this is a VIEW */
81491: int isVirtual, /* True if this is a VIRTUAL table */
81492: int noErr /* Do nothing if table already exists */
81493: ){
81494: Table *pTable;
81495: char *zName = 0; /* The name of the new table */
81496: sqlite3 *db = pParse->db;
81497: Vdbe *v;
81498: int iDb; /* Database number to create the table in */
81499: Token *pName; /* Unqualified name of the table to create */
81500:
81501: /* The table or view name to create is passed to this routine via tokens
81502: ** pName1 and pName2. If the table name was fully qualified, for example:
81503: **
81504: ** CREATE TABLE xxx.yyy (...);
81505: **
81506: ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if
81507: ** the table name is not fully qualified, i.e.:
81508: **
81509: ** CREATE TABLE yyy(...);
81510: **
81511: ** Then pName1 is set to "yyy" and pName2 is "".
81512: **
81513: ** The call below sets the pName pointer to point at the token (pName1 or
81514: ** pName2) that stores the unqualified table name. The variable iDb is
81515: ** set to the index of the database that the table or view is to be
81516: ** created in.
81517: */
81518: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
81519: if( iDb<0 ) return;
81520: if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){
81521: /* If creating a temp table, the name may not be qualified. Unless
81522: ** the database name is "temp" anyway. */
81523: sqlite3ErrorMsg(pParse, "temporary table name must be unqualified");
81524: return;
81525: }
81526: if( !OMIT_TEMPDB && isTemp ) iDb = 1;
81527:
81528: pParse->sNameToken = *pName;
81529: zName = sqlite3NameFromToken(db, pName);
81530: if( zName==0 ) return;
81531: if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
81532: goto begin_table_error;
81533: }
81534: if( db->init.iDb==1 ) isTemp = 1;
81535: #ifndef SQLITE_OMIT_AUTHORIZATION
81536: assert( (isTemp & 1)==isTemp );
81537: {
81538: int code;
81539: char *zDb = db->aDb[iDb].zName;
81540: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){
81541: goto begin_table_error;
81542: }
81543: if( isView ){
81544: if( !OMIT_TEMPDB && isTemp ){
81545: code = SQLITE_CREATE_TEMP_VIEW;
81546: }else{
81547: code = SQLITE_CREATE_VIEW;
81548: }
81549: }else{
81550: if( !OMIT_TEMPDB && isTemp ){
81551: code = SQLITE_CREATE_TEMP_TABLE;
81552: }else{
81553: code = SQLITE_CREATE_TABLE;
81554: }
81555: }
81556: if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){
81557: goto begin_table_error;
81558: }
81559: }
81560: #endif
81561:
81562: /* Make sure the new table name does not collide with an existing
81563: ** index or table name in the same database. Issue an error message if
81564: ** it does. The exception is if the statement being parsed was passed
81565: ** to an sqlite3_declare_vtab() call. In that case only the column names
81566: ** and types will be used, so there is no need to test for namespace
81567: ** collisions.
81568: */
81569: if( !IN_DECLARE_VTAB ){
81570: char *zDb = db->aDb[iDb].zName;
81571: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
81572: goto begin_table_error;
81573: }
81574: pTable = sqlite3FindTable(db, zName, zDb);
81575: if( pTable ){
81576: if( !noErr ){
81577: sqlite3ErrorMsg(pParse, "table %T already exists", pName);
81578: }else{
81579: assert( !db->init.busy );
81580: sqlite3CodeVerifySchema(pParse, iDb);
81581: }
81582: goto begin_table_error;
81583: }
81584: if( sqlite3FindIndex(db, zName, zDb)!=0 ){
81585: sqlite3ErrorMsg(pParse, "there is already an index named %s", zName);
81586: goto begin_table_error;
81587: }
81588: }
81589:
81590: pTable = sqlite3DbMallocZero(db, sizeof(Table));
81591: if( pTable==0 ){
81592: db->mallocFailed = 1;
81593: pParse->rc = SQLITE_NOMEM;
81594: pParse->nErr++;
81595: goto begin_table_error;
81596: }
81597: pTable->zName = zName;
81598: pTable->iPKey = -1;
81599: pTable->pSchema = db->aDb[iDb].pSchema;
81600: pTable->nRef = 1;
81601: pTable->nRowEst = 1000000;
81602: assert( pParse->pNewTable==0 );
81603: pParse->pNewTable = pTable;
81604:
81605: /* If this is the magic sqlite_sequence table used by autoincrement,
81606: ** then record a pointer to this table in the main database structure
81607: ** so that INSERT can find the table easily.
81608: */
81609: #ifndef SQLITE_OMIT_AUTOINCREMENT
81610: if( !pParse->nested && strcmp(zName, "sqlite_sequence")==0 ){
81611: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
81612: pTable->pSchema->pSeqTab = pTable;
81613: }
81614: #endif
81615:
81616: /* Begin generating the code that will insert the table record into
81617: ** the SQLITE_MASTER table. Note in particular that we must go ahead
81618: ** and allocate the record number for the table entry now. Before any
81619: ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause
81620: ** indices to be created and the table record must come before the
81621: ** indices. Hence, the record number for the table must be allocated
81622: ** now.
81623: */
81624: if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){
81625: int j1;
81626: int fileFormat;
81627: int reg1, reg2, reg3;
81628: sqlite3BeginWriteOperation(pParse, 0, iDb);
81629:
81630: #ifndef SQLITE_OMIT_VIRTUALTABLE
81631: if( isVirtual ){
81632: sqlite3VdbeAddOp0(v, OP_VBegin);
81633: }
81634: #endif
81635:
81636: /* If the file format and encoding in the database have not been set,
81637: ** set them now.
81638: */
81639: reg1 = pParse->regRowid = ++pParse->nMem;
81640: reg2 = pParse->regRoot = ++pParse->nMem;
81641: reg3 = ++pParse->nMem;
81642: sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT);
81643: sqlite3VdbeUsesBtree(v, iDb);
81644: j1 = sqlite3VdbeAddOp1(v, OP_If, reg3);
81645: fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ?
81646: 1 : SQLITE_MAX_FILE_FORMAT;
81647: sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3);
81648: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3);
81649: sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3);
81650: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3);
81651: sqlite3VdbeJumpHere(v, j1);
81652:
81653: /* This just creates a place-holder record in the sqlite_master table.
81654: ** The record created does not contain anything yet. It will be replaced
81655: ** by the real entry in code generated at sqlite3EndTable().
81656: **
81657: ** The rowid for the new entry is left in register pParse->regRowid.
81658: ** The root page number of the new table is left in reg pParse->regRoot.
81659: ** The rowid and root page number values are needed by the code that
81660: ** sqlite3EndTable will generate.
81661: */
81662: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
81663: if( isView || isVirtual ){
81664: sqlite3VdbeAddOp2(v, OP_Integer, 0, reg2);
81665: }else
81666: #endif
81667: {
81668: sqlite3VdbeAddOp2(v, OP_CreateTable, iDb, reg2);
81669: }
81670: sqlite3OpenMasterTable(pParse, iDb);
81671: sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1);
81672: sqlite3VdbeAddOp2(v, OP_Null, 0, reg3);
81673: sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1);
81674: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
81675: sqlite3VdbeAddOp0(v, OP_Close);
81676: }
81677:
81678: /* Normal (non-error) return. */
81679: return;
81680:
81681: /* If an error occurs, we jump here */
81682: begin_table_error:
81683: sqlite3DbFree(db, zName);
81684: return;
81685: }
81686:
81687: /*
81688: ** This macro is used to compare two strings in a case-insensitive manner.
81689: ** It is slightly faster than calling sqlite3StrICmp() directly, but
81690: ** produces larger code.
81691: **
81692: ** WARNING: This macro is not compatible with the strcmp() family. It
81693: ** returns true if the two strings are equal, otherwise false.
81694: */
81695: #define STRICMP(x, y) (\
81696: sqlite3UpperToLower[*(unsigned char *)(x)]== \
81697: sqlite3UpperToLower[*(unsigned char *)(y)] \
81698: && sqlite3StrICmp((x)+1,(y)+1)==0 )
81699:
81700: /*
81701: ** Add a new column to the table currently being constructed.
81702: **
81703: ** The parser calls this routine once for each column declaration
81704: ** in a CREATE TABLE statement. sqlite3StartTable() gets called
81705: ** first to get things going. Then this routine is called for each
81706: ** column.
81707: */
81708: SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){
81709: Table *p;
81710: int i;
81711: char *z;
81712: Column *pCol;
81713: sqlite3 *db = pParse->db;
81714: if( (p = pParse->pNewTable)==0 ) return;
81715: #if SQLITE_MAX_COLUMN
81716: if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){
81717: sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName);
81718: return;
81719: }
81720: #endif
81721: z = sqlite3NameFromToken(db, pName);
81722: if( z==0 ) return;
81723: for(i=0; i<p->nCol; i++){
81724: if( STRICMP(z, p->aCol[i].zName) ){
81725: sqlite3ErrorMsg(pParse, "duplicate column name: %s", z);
81726: sqlite3DbFree(db, z);
81727: return;
81728: }
81729: }
81730: if( (p->nCol & 0x7)==0 ){
81731: Column *aNew;
81732: aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0]));
81733: if( aNew==0 ){
81734: sqlite3DbFree(db, z);
81735: return;
81736: }
81737: p->aCol = aNew;
81738: }
81739: pCol = &p->aCol[p->nCol];
81740: memset(pCol, 0, sizeof(p->aCol[0]));
81741: pCol->zName = z;
81742:
81743: /* If there is no type specified, columns have the default affinity
81744: ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will
81745: ** be called next to set pCol->affinity correctly.
81746: */
81747: pCol->affinity = SQLITE_AFF_NONE;
81748: p->nCol++;
81749: }
81750:
81751: /*
81752: ** This routine is called by the parser while in the middle of
81753: ** parsing a CREATE TABLE statement. A "NOT NULL" constraint has
81754: ** been seen on a column. This routine sets the notNull flag on
81755: ** the column currently under construction.
81756: */
81757: SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){
81758: Table *p;
81759: p = pParse->pNewTable;
81760: if( p==0 || NEVER(p->nCol<1) ) return;
81761: p->aCol[p->nCol-1].notNull = (u8)onError;
81762: }
81763:
81764: /*
81765: ** Scan the column type name zType (length nType) and return the
81766: ** associated affinity type.
81767: **
81768: ** This routine does a case-independent search of zType for the
81769: ** substrings in the following table. If one of the substrings is
81770: ** found, the corresponding affinity is returned. If zType contains
81771: ** more than one of the substrings, entries toward the top of
81772: ** the table take priority. For example, if zType is 'BLOBINT',
81773: ** SQLITE_AFF_INTEGER is returned.
81774: **
81775: ** Substring | Affinity
81776: ** --------------------------------
81777: ** 'INT' | SQLITE_AFF_INTEGER
81778: ** 'CHAR' | SQLITE_AFF_TEXT
81779: ** 'CLOB' | SQLITE_AFF_TEXT
81780: ** 'TEXT' | SQLITE_AFF_TEXT
81781: ** 'BLOB' | SQLITE_AFF_NONE
81782: ** 'REAL' | SQLITE_AFF_REAL
81783: ** 'FLOA' | SQLITE_AFF_REAL
81784: ** 'DOUB' | SQLITE_AFF_REAL
81785: **
81786: ** If none of the substrings in the above table are found,
81787: ** SQLITE_AFF_NUMERIC is returned.
81788: */
81789: SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn){
81790: u32 h = 0;
81791: char aff = SQLITE_AFF_NUMERIC;
81792:
81793: if( zIn ) while( zIn[0] ){
81794: h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff];
81795: zIn++;
81796: if( h==(('c'<<24)+('h'<<16)+('a'<<8)+'r') ){ /* CHAR */
81797: aff = SQLITE_AFF_TEXT;
81798: }else if( h==(('c'<<24)+('l'<<16)+('o'<<8)+'b') ){ /* CLOB */
81799: aff = SQLITE_AFF_TEXT;
81800: }else if( h==(('t'<<24)+('e'<<16)+('x'<<8)+'t') ){ /* TEXT */
81801: aff = SQLITE_AFF_TEXT;
81802: }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */
81803: && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){
81804: aff = SQLITE_AFF_NONE;
81805: #ifndef SQLITE_OMIT_FLOATING_POINT
81806: }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */
81807: && aff==SQLITE_AFF_NUMERIC ){
81808: aff = SQLITE_AFF_REAL;
81809: }else if( h==(('f'<<24)+('l'<<16)+('o'<<8)+'a') /* FLOA */
81810: && aff==SQLITE_AFF_NUMERIC ){
81811: aff = SQLITE_AFF_REAL;
81812: }else if( h==(('d'<<24)+('o'<<16)+('u'<<8)+'b') /* DOUB */
81813: && aff==SQLITE_AFF_NUMERIC ){
81814: aff = SQLITE_AFF_REAL;
81815: #endif
81816: }else if( (h&0x00FFFFFF)==(('i'<<16)+('n'<<8)+'t') ){ /* INT */
81817: aff = SQLITE_AFF_INTEGER;
81818: break;
81819: }
81820: }
81821:
81822: return aff;
81823: }
81824:
81825: /*
81826: ** This routine is called by the parser while in the middle of
81827: ** parsing a CREATE TABLE statement. The pFirst token is the first
81828: ** token in the sequence of tokens that describe the type of the
81829: ** column currently under construction. pLast is the last token
81830: ** in the sequence. Use this information to construct a string
81831: ** that contains the typename of the column and store that string
81832: ** in zType.
81833: */
81834: SQLITE_PRIVATE void sqlite3AddColumnType(Parse *pParse, Token *pType){
81835: Table *p;
81836: Column *pCol;
81837:
81838: p = pParse->pNewTable;
81839: if( p==0 || NEVER(p->nCol<1) ) return;
81840: pCol = &p->aCol[p->nCol-1];
81841: assert( pCol->zType==0 );
81842: pCol->zType = sqlite3NameFromToken(pParse->db, pType);
81843: pCol->affinity = sqlite3AffinityType(pCol->zType);
81844: }
81845:
81846: /*
81847: ** The expression is the default value for the most recently added column
81848: ** of the table currently under construction.
81849: **
81850: ** Default value expressions must be constant. Raise an exception if this
81851: ** is not the case.
81852: **
81853: ** This routine is called by the parser while in the middle of
81854: ** parsing a CREATE TABLE statement.
81855: */
81856: SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){
81857: Table *p;
81858: Column *pCol;
81859: sqlite3 *db = pParse->db;
81860: p = pParse->pNewTable;
81861: if( p!=0 ){
81862: pCol = &(p->aCol[p->nCol-1]);
81863: if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr) ){
81864: sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant",
81865: pCol->zName);
81866: }else{
81867: /* A copy of pExpr is used instead of the original, as pExpr contains
81868: ** tokens that point to volatile memory. The 'span' of the expression
81869: ** is required by pragma table_info.
81870: */
81871: sqlite3ExprDelete(db, pCol->pDflt);
81872: pCol->pDflt = sqlite3ExprDup(db, pSpan->pExpr, EXPRDUP_REDUCE);
81873: sqlite3DbFree(db, pCol->zDflt);
81874: pCol->zDflt = sqlite3DbStrNDup(db, (char*)pSpan->zStart,
81875: (int)(pSpan->zEnd - pSpan->zStart));
81876: }
81877: }
81878: sqlite3ExprDelete(db, pSpan->pExpr);
81879: }
81880:
81881: /*
81882: ** Designate the PRIMARY KEY for the table. pList is a list of names
81883: ** of columns that form the primary key. If pList is NULL, then the
81884: ** most recently added column of the table is the primary key.
81885: **
81886: ** A table can have at most one primary key. If the table already has
81887: ** a primary key (and this is the second primary key) then create an
81888: ** error.
81889: **
81890: ** If the PRIMARY KEY is on a single column whose datatype is INTEGER,
81891: ** then we will try to use that column as the rowid. Set the Table.iPKey
81892: ** field of the table under construction to be the index of the
81893: ** INTEGER PRIMARY KEY column. Table.iPKey is set to -1 if there is
81894: ** no INTEGER PRIMARY KEY.
81895: **
81896: ** If the key is not an INTEGER PRIMARY KEY, then create a unique
81897: ** index for the key. No index is created for INTEGER PRIMARY KEYs.
81898: */
81899: SQLITE_PRIVATE void sqlite3AddPrimaryKey(
81900: Parse *pParse, /* Parsing context */
81901: ExprList *pList, /* List of field names to be indexed */
81902: int onError, /* What to do with a uniqueness conflict */
81903: int autoInc, /* True if the AUTOINCREMENT keyword is present */
81904: int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */
81905: ){
81906: Table *pTab = pParse->pNewTable;
81907: char *zType = 0;
81908: int iCol = -1, i;
81909: if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit;
81910: if( pTab->tabFlags & TF_HasPrimaryKey ){
81911: sqlite3ErrorMsg(pParse,
81912: "table \"%s\" has more than one primary key", pTab->zName);
81913: goto primary_key_exit;
81914: }
81915: pTab->tabFlags |= TF_HasPrimaryKey;
81916: if( pList==0 ){
81917: iCol = pTab->nCol - 1;
1.2.2.1 ! misho 81918: pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY;
1.2 misho 81919: }else{
81920: for(i=0; i<pList->nExpr; i++){
81921: for(iCol=0; iCol<pTab->nCol; iCol++){
81922: if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){
81923: break;
81924: }
81925: }
81926: if( iCol<pTab->nCol ){
1.2.2.1 ! misho 81927: pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY;
1.2 misho 81928: }
81929: }
81930: if( pList->nExpr>1 ) iCol = -1;
81931: }
81932: if( iCol>=0 && iCol<pTab->nCol ){
81933: zType = pTab->aCol[iCol].zType;
81934: }
81935: if( zType && sqlite3StrICmp(zType, "INTEGER")==0
81936: && sortOrder==SQLITE_SO_ASC ){
81937: pTab->iPKey = iCol;
81938: pTab->keyConf = (u8)onError;
81939: assert( autoInc==0 || autoInc==1 );
81940: pTab->tabFlags |= autoInc*TF_Autoincrement;
81941: }else if( autoInc ){
81942: #ifndef SQLITE_OMIT_AUTOINCREMENT
81943: sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an "
81944: "INTEGER PRIMARY KEY");
81945: #endif
81946: }else{
81947: Index *p;
81948: p = sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, 0, sortOrder, 0);
81949: if( p ){
81950: p->autoIndex = 2;
81951: }
81952: pList = 0;
81953: }
81954:
81955: primary_key_exit:
81956: sqlite3ExprListDelete(pParse->db, pList);
81957: return;
81958: }
81959:
81960: /*
81961: ** Add a new CHECK constraint to the table currently under construction.
81962: */
81963: SQLITE_PRIVATE void sqlite3AddCheckConstraint(
81964: Parse *pParse, /* Parsing context */
81965: Expr *pCheckExpr /* The check expression */
81966: ){
81967: #ifndef SQLITE_OMIT_CHECK
81968: Table *pTab = pParse->pNewTable;
81969: if( pTab && !IN_DECLARE_VTAB ){
1.2.2.1 ! misho 81970: pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr);
! 81971: if( pParse->constraintName.n ){
! 81972: sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1);
! 81973: }
1.2 misho 81974: }else
81975: #endif
81976: {
1.2.2.1 ! misho 81977: sqlite3ExprDelete(pParse->db, pCheckExpr);
1.2 misho 81978: }
81979: }
81980:
81981: /*
81982: ** Set the collation function of the most recently parsed table column
81983: ** to the CollSeq given.
81984: */
81985: SQLITE_PRIVATE void sqlite3AddCollateType(Parse *pParse, Token *pToken){
81986: Table *p;
81987: int i;
81988: char *zColl; /* Dequoted name of collation sequence */
81989: sqlite3 *db;
81990:
81991: if( (p = pParse->pNewTable)==0 ) return;
81992: i = p->nCol-1;
81993: db = pParse->db;
81994: zColl = sqlite3NameFromToken(db, pToken);
81995: if( !zColl ) return;
81996:
81997: if( sqlite3LocateCollSeq(pParse, zColl) ){
81998: Index *pIdx;
81999: p->aCol[i].zColl = zColl;
82000:
82001: /* If the column is declared as "<name> PRIMARY KEY COLLATE <type>",
82002: ** then an index may have been created on this column before the
82003: ** collation type was added. Correct this if it is the case.
82004: */
82005: for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){
82006: assert( pIdx->nColumn==1 );
82007: if( pIdx->aiColumn[0]==i ){
82008: pIdx->azColl[0] = p->aCol[i].zColl;
82009: }
82010: }
82011: }else{
82012: sqlite3DbFree(db, zColl);
82013: }
82014: }
82015:
82016: /*
82017: ** This function returns the collation sequence for database native text
82018: ** encoding identified by the string zName, length nName.
82019: **
82020: ** If the requested collation sequence is not available, or not available
82021: ** in the database native encoding, the collation factory is invoked to
82022: ** request it. If the collation factory does not supply such a sequence,
82023: ** and the sequence is available in another text encoding, then that is
82024: ** returned instead.
82025: **
82026: ** If no versions of the requested collations sequence are available, or
82027: ** another error occurs, NULL is returned and an error message written into
82028: ** pParse.
82029: **
82030: ** This routine is a wrapper around sqlite3FindCollSeq(). This routine
82031: ** invokes the collation factory if the named collation cannot be found
82032: ** and generates an error message.
82033: **
82034: ** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq()
82035: */
82036: SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){
82037: sqlite3 *db = pParse->db;
82038: u8 enc = ENC(db);
82039: u8 initbusy = db->init.busy;
82040: CollSeq *pColl;
82041:
82042: pColl = sqlite3FindCollSeq(db, enc, zName, initbusy);
82043: if( !initbusy && (!pColl || !pColl->xCmp) ){
1.2.2.1 ! misho 82044: pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName);
1.2 misho 82045: }
82046:
82047: return pColl;
82048: }
82049:
82050:
82051: /*
82052: ** Generate code that will increment the schema cookie.
82053: **
82054: ** The schema cookie is used to determine when the schema for the
82055: ** database changes. After each schema change, the cookie value
82056: ** changes. When a process first reads the schema it records the
82057: ** cookie. Thereafter, whenever it goes to access the database,
82058: ** it checks the cookie to make sure the schema has not changed
82059: ** since it was last read.
82060: **
82061: ** This plan is not completely bullet-proof. It is possible for
82062: ** the schema to change multiple times and for the cookie to be
82063: ** set back to prior value. But schema changes are infrequent
82064: ** and the probability of hitting the same cookie value is only
82065: ** 1 chance in 2^32. So we're safe enough.
82066: */
82067: SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){
82068: int r1 = sqlite3GetTempReg(pParse);
82069: sqlite3 *db = pParse->db;
82070: Vdbe *v = pParse->pVdbe;
82071: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
82072: sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1);
82073: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1);
82074: sqlite3ReleaseTempReg(pParse, r1);
82075: }
82076:
82077: /*
82078: ** Measure the number of characters needed to output the given
82079: ** identifier. The number returned includes any quotes used
82080: ** but does not include the null terminator.
82081: **
82082: ** The estimate is conservative. It might be larger that what is
82083: ** really needed.
82084: */
82085: static int identLength(const char *z){
82086: int n;
82087: for(n=0; *z; n++, z++){
82088: if( *z=='"' ){ n++; }
82089: }
82090: return n + 2;
82091: }
82092:
82093: /*
82094: ** The first parameter is a pointer to an output buffer. The second
82095: ** parameter is a pointer to an integer that contains the offset at
82096: ** which to write into the output buffer. This function copies the
82097: ** nul-terminated string pointed to by the third parameter, zSignedIdent,
82098: ** to the specified offset in the buffer and updates *pIdx to refer
82099: ** to the first byte after the last byte written before returning.
82100: **
82101: ** If the string zSignedIdent consists entirely of alpha-numeric
82102: ** characters, does not begin with a digit and is not an SQL keyword,
82103: ** then it is copied to the output buffer exactly as it is. Otherwise,
82104: ** it is quoted using double-quotes.
82105: */
82106: static void identPut(char *z, int *pIdx, char *zSignedIdent){
82107: unsigned char *zIdent = (unsigned char*)zSignedIdent;
82108: int i, j, needQuote;
82109: i = *pIdx;
82110:
82111: for(j=0; zIdent[j]; j++){
82112: if( !sqlite3Isalnum(zIdent[j]) && zIdent[j]!='_' ) break;
82113: }
82114: needQuote = sqlite3Isdigit(zIdent[0]) || sqlite3KeywordCode(zIdent, j)!=TK_ID;
82115: if( !needQuote ){
82116: needQuote = zIdent[j];
82117: }
82118:
82119: if( needQuote ) z[i++] = '"';
82120: for(j=0; zIdent[j]; j++){
82121: z[i++] = zIdent[j];
82122: if( zIdent[j]=='"' ) z[i++] = '"';
82123: }
82124: if( needQuote ) z[i++] = '"';
82125: z[i] = 0;
82126: *pIdx = i;
82127: }
82128:
82129: /*
82130: ** Generate a CREATE TABLE statement appropriate for the given
82131: ** table. Memory to hold the text of the statement is obtained
82132: ** from sqliteMalloc() and must be freed by the calling function.
82133: */
82134: static char *createTableStmt(sqlite3 *db, Table *p){
82135: int i, k, n;
82136: char *zStmt;
82137: char *zSep, *zSep2, *zEnd;
82138: Column *pCol;
82139: n = 0;
82140: for(pCol = p->aCol, i=0; i<p->nCol; i++, pCol++){
82141: n += identLength(pCol->zName) + 5;
82142: }
82143: n += identLength(p->zName);
82144: if( n<50 ){
82145: zSep = "";
82146: zSep2 = ",";
82147: zEnd = ")";
82148: }else{
82149: zSep = "\n ";
82150: zSep2 = ",\n ";
82151: zEnd = "\n)";
82152: }
82153: n += 35 + 6*p->nCol;
82154: zStmt = sqlite3DbMallocRaw(0, n);
82155: if( zStmt==0 ){
82156: db->mallocFailed = 1;
82157: return 0;
82158: }
82159: sqlite3_snprintf(n, zStmt, "CREATE TABLE ");
82160: k = sqlite3Strlen30(zStmt);
82161: identPut(zStmt, &k, p->zName);
82162: zStmt[k++] = '(';
82163: for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){
82164: static const char * const azType[] = {
82165: /* SQLITE_AFF_TEXT */ " TEXT",
82166: /* SQLITE_AFF_NONE */ "",
82167: /* SQLITE_AFF_NUMERIC */ " NUM",
82168: /* SQLITE_AFF_INTEGER */ " INT",
82169: /* SQLITE_AFF_REAL */ " REAL"
82170: };
82171: int len;
82172: const char *zType;
82173:
82174: sqlite3_snprintf(n-k, &zStmt[k], zSep);
82175: k += sqlite3Strlen30(&zStmt[k]);
82176: zSep = zSep2;
82177: identPut(zStmt, &k, pCol->zName);
82178: assert( pCol->affinity-SQLITE_AFF_TEXT >= 0 );
82179: assert( pCol->affinity-SQLITE_AFF_TEXT < ArraySize(azType) );
82180: testcase( pCol->affinity==SQLITE_AFF_TEXT );
82181: testcase( pCol->affinity==SQLITE_AFF_NONE );
82182: testcase( pCol->affinity==SQLITE_AFF_NUMERIC );
82183: testcase( pCol->affinity==SQLITE_AFF_INTEGER );
82184: testcase( pCol->affinity==SQLITE_AFF_REAL );
82185:
82186: zType = azType[pCol->affinity - SQLITE_AFF_TEXT];
82187: len = sqlite3Strlen30(zType);
82188: assert( pCol->affinity==SQLITE_AFF_NONE
82189: || pCol->affinity==sqlite3AffinityType(zType) );
82190: memcpy(&zStmt[k], zType, len);
82191: k += len;
82192: assert( k<=n );
82193: }
82194: sqlite3_snprintf(n-k, &zStmt[k], "%s", zEnd);
82195: return zStmt;
82196: }
82197:
82198: /*
82199: ** This routine is called to report the final ")" that terminates
82200: ** a CREATE TABLE statement.
82201: **
82202: ** The table structure that other action routines have been building
82203: ** is added to the internal hash tables, assuming no errors have
82204: ** occurred.
82205: **
82206: ** An entry for the table is made in the master table on disk, unless
82207: ** this is a temporary table or db->init.busy==1. When db->init.busy==1
82208: ** it means we are reading the sqlite_master table because we just
82209: ** connected to the database or because the sqlite_master table has
82210: ** recently changed, so the entry for this table already exists in
82211: ** the sqlite_master table. We do not want to create it again.
82212: **
82213: ** If the pSelect argument is not NULL, it means that this routine
82214: ** was called to create a table generated from a
82215: ** "CREATE TABLE ... AS SELECT ..." statement. The column names of
82216: ** the new table will match the result set of the SELECT.
82217: */
82218: SQLITE_PRIVATE void sqlite3EndTable(
82219: Parse *pParse, /* Parse context */
82220: Token *pCons, /* The ',' token after the last column defn. */
82221: Token *pEnd, /* The final ')' token in the CREATE TABLE */
82222: Select *pSelect /* Select from a "CREATE ... AS SELECT" */
82223: ){
82224: Table *p;
82225: sqlite3 *db = pParse->db;
82226: int iDb;
82227:
82228: if( (pEnd==0 && pSelect==0) || db->mallocFailed ){
82229: return;
82230: }
82231: p = pParse->pNewTable;
82232: if( p==0 ) return;
82233:
82234: assert( !db->init.busy || !pSelect );
82235:
82236: iDb = sqlite3SchemaToIndex(db, p->pSchema);
82237:
82238: #ifndef SQLITE_OMIT_CHECK
82239: /* Resolve names in all CHECK constraint expressions.
82240: */
82241: if( p->pCheck ){
82242: SrcList sSrc; /* Fake SrcList for pParse->pNewTable */
82243: NameContext sNC; /* Name context for pParse->pNewTable */
1.2.2.1 ! misho 82244: ExprList *pList; /* List of all CHECK constraints */
! 82245: int i; /* Loop counter */
1.2 misho 82246:
82247: memset(&sNC, 0, sizeof(sNC));
82248: memset(&sSrc, 0, sizeof(sSrc));
82249: sSrc.nSrc = 1;
82250: sSrc.a[0].zName = p->zName;
82251: sSrc.a[0].pTab = p;
82252: sSrc.a[0].iCursor = -1;
82253: sNC.pParse = pParse;
82254: sNC.pSrcList = &sSrc;
1.2.2.1 ! misho 82255: sNC.ncFlags = NC_IsCheck;
! 82256: pList = p->pCheck;
! 82257: for(i=0; i<pList->nExpr; i++){
! 82258: if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){
! 82259: return;
! 82260: }
1.2 misho 82261: }
82262: }
82263: #endif /* !defined(SQLITE_OMIT_CHECK) */
82264:
82265: /* If the db->init.busy is 1 it means we are reading the SQL off the
82266: ** "sqlite_master" or "sqlite_temp_master" table on the disk.
82267: ** So do not write to the disk again. Extract the root page number
82268: ** for the table from the db->init.newTnum field. (The page number
82269: ** should have been put there by the sqliteOpenCb routine.)
82270: */
82271: if( db->init.busy ){
82272: p->tnum = db->init.newTnum;
82273: }
82274:
82275: /* If not initializing, then create a record for the new table
82276: ** in the SQLITE_MASTER table of the database.
82277: **
82278: ** If this is a TEMPORARY table, write the entry into the auxiliary
82279: ** file instead of into the main database file.
82280: */
82281: if( !db->init.busy ){
82282: int n;
82283: Vdbe *v;
82284: char *zType; /* "view" or "table" */
82285: char *zType2; /* "VIEW" or "TABLE" */
82286: char *zStmt; /* Text of the CREATE TABLE or CREATE VIEW statement */
82287:
82288: v = sqlite3GetVdbe(pParse);
82289: if( NEVER(v==0) ) return;
82290:
82291: sqlite3VdbeAddOp1(v, OP_Close, 0);
82292:
82293: /*
82294: ** Initialize zType for the new view or table.
82295: */
82296: if( p->pSelect==0 ){
82297: /* A regular table */
82298: zType = "table";
82299: zType2 = "TABLE";
82300: #ifndef SQLITE_OMIT_VIEW
82301: }else{
82302: /* A view */
82303: zType = "view";
82304: zType2 = "VIEW";
82305: #endif
82306: }
82307:
82308: /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT
82309: ** statement to populate the new table. The root-page number for the
82310: ** new table is in register pParse->regRoot.
82311: **
82312: ** Once the SELECT has been coded by sqlite3Select(), it is in a
82313: ** suitable state to query for the column names and types to be used
82314: ** by the new table.
82315: **
82316: ** A shared-cache write-lock is not required to write to the new table,
82317: ** as a schema-lock must have already been obtained to create it. Since
82318: ** a schema-lock excludes all other database users, the write-lock would
82319: ** be redundant.
82320: */
82321: if( pSelect ){
82322: SelectDest dest;
82323: Table *pSelTab;
82324:
82325: assert(pParse->nTab==1);
82326: sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb);
1.2.2.1 ! misho 82327: sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG);
1.2 misho 82328: pParse->nTab = 2;
82329: sqlite3SelectDestInit(&dest, SRT_Table, 1);
82330: sqlite3Select(pParse, pSelect, &dest);
82331: sqlite3VdbeAddOp1(v, OP_Close, 1);
82332: if( pParse->nErr==0 ){
82333: pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect);
82334: if( pSelTab==0 ) return;
82335: assert( p->aCol==0 );
82336: p->nCol = pSelTab->nCol;
82337: p->aCol = pSelTab->aCol;
82338: pSelTab->nCol = 0;
82339: pSelTab->aCol = 0;
82340: sqlite3DeleteTable(db, pSelTab);
82341: }
82342: }
82343:
82344: /* Compute the complete text of the CREATE statement */
82345: if( pSelect ){
82346: zStmt = createTableStmt(db, p);
82347: }else{
82348: n = (int)(pEnd->z - pParse->sNameToken.z) + 1;
82349: zStmt = sqlite3MPrintf(db,
82350: "CREATE %s %.*s", zType2, n, pParse->sNameToken.z
82351: );
82352: }
82353:
82354: /* A slot for the record has already been allocated in the
82355: ** SQLITE_MASTER table. We just need to update that slot with all
82356: ** the information we've collected.
82357: */
82358: sqlite3NestedParse(pParse,
82359: "UPDATE %Q.%s "
82360: "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q "
82361: "WHERE rowid=#%d",
82362: db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
82363: zType,
82364: p->zName,
82365: p->zName,
82366: pParse->regRoot,
82367: zStmt,
82368: pParse->regRowid
82369: );
82370: sqlite3DbFree(db, zStmt);
82371: sqlite3ChangeCookie(pParse, iDb);
82372:
82373: #ifndef SQLITE_OMIT_AUTOINCREMENT
82374: /* Check to see if we need to create an sqlite_sequence table for
82375: ** keeping track of autoincrement keys.
82376: */
82377: if( p->tabFlags & TF_Autoincrement ){
82378: Db *pDb = &db->aDb[iDb];
82379: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
82380: if( pDb->pSchema->pSeqTab==0 ){
82381: sqlite3NestedParse(pParse,
82382: "CREATE TABLE %Q.sqlite_sequence(name,seq)",
82383: pDb->zName
82384: );
82385: }
82386: }
82387: #endif
82388:
82389: /* Reparse everything to update our internal data structures */
82390: sqlite3VdbeAddParseSchemaOp(v, iDb,
82391: sqlite3MPrintf(db, "tbl_name='%q'", p->zName));
82392: }
82393:
82394:
82395: /* Add the table to the in-memory representation of the database.
82396: */
82397: if( db->init.busy ){
82398: Table *pOld;
82399: Schema *pSchema = p->pSchema;
82400: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
82401: pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName,
82402: sqlite3Strlen30(p->zName),p);
82403: if( pOld ){
82404: assert( p==pOld ); /* Malloc must have failed inside HashInsert() */
82405: db->mallocFailed = 1;
82406: return;
82407: }
82408: pParse->pNewTable = 0;
82409: db->flags |= SQLITE_InternChanges;
82410:
82411: #ifndef SQLITE_OMIT_ALTERTABLE
82412: if( !p->pSelect ){
82413: const char *zName = (const char *)pParse->sNameToken.z;
82414: int nName;
82415: assert( !pSelect && pCons && pEnd );
82416: if( pCons->z==0 ){
82417: pCons = pEnd;
82418: }
82419: nName = (int)((const char *)pCons->z - zName);
82420: p->addColOffset = 13 + sqlite3Utf8CharLen(zName, nName);
82421: }
82422: #endif
82423: }
82424: }
82425:
82426: #ifndef SQLITE_OMIT_VIEW
82427: /*
82428: ** The parser calls this routine in order to create a new VIEW
82429: */
82430: SQLITE_PRIVATE void sqlite3CreateView(
82431: Parse *pParse, /* The parsing context */
82432: Token *pBegin, /* The CREATE token that begins the statement */
82433: Token *pName1, /* The token that holds the name of the view */
82434: Token *pName2, /* The token that holds the name of the view */
82435: Select *pSelect, /* A SELECT statement that will become the new view */
82436: int isTemp, /* TRUE for a TEMPORARY view */
82437: int noErr /* Suppress error messages if VIEW already exists */
82438: ){
82439: Table *p;
82440: int n;
82441: const char *z;
82442: Token sEnd;
82443: DbFixer sFix;
82444: Token *pName = 0;
82445: int iDb;
82446: sqlite3 *db = pParse->db;
82447:
82448: if( pParse->nVar>0 ){
82449: sqlite3ErrorMsg(pParse, "parameters are not allowed in views");
82450: sqlite3SelectDelete(db, pSelect);
82451: return;
82452: }
82453: sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr);
82454: p = pParse->pNewTable;
82455: if( p==0 || pParse->nErr ){
82456: sqlite3SelectDelete(db, pSelect);
82457: return;
82458: }
82459: sqlite3TwoPartName(pParse, pName1, pName2, &pName);
82460: iDb = sqlite3SchemaToIndex(db, p->pSchema);
82461: if( sqlite3FixInit(&sFix, pParse, iDb, "view", pName)
82462: && sqlite3FixSelect(&sFix, pSelect)
82463: ){
82464: sqlite3SelectDelete(db, pSelect);
82465: return;
82466: }
82467:
82468: /* Make a copy of the entire SELECT statement that defines the view.
82469: ** This will force all the Expr.token.z values to be dynamically
82470: ** allocated rather than point to the input string - which means that
82471: ** they will persist after the current sqlite3_exec() call returns.
82472: */
82473: p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
82474: sqlite3SelectDelete(db, pSelect);
82475: if( db->mallocFailed ){
82476: return;
82477: }
82478: if( !db->init.busy ){
82479: sqlite3ViewGetColumnNames(pParse, p);
82480: }
82481:
82482: /* Locate the end of the CREATE VIEW statement. Make sEnd point to
82483: ** the end.
82484: */
82485: sEnd = pParse->sLastToken;
82486: if( ALWAYS(sEnd.z[0]!=0) && sEnd.z[0]!=';' ){
82487: sEnd.z += sEnd.n;
82488: }
82489: sEnd.n = 0;
82490: n = (int)(sEnd.z - pBegin->z);
82491: z = pBegin->z;
82492: while( ALWAYS(n>0) && sqlite3Isspace(z[n-1]) ){ n--; }
82493: sEnd.z = &z[n-1];
82494: sEnd.n = 1;
82495:
82496: /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */
82497: sqlite3EndTable(pParse, 0, &sEnd, 0);
82498: return;
82499: }
82500: #endif /* SQLITE_OMIT_VIEW */
82501:
82502: #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
82503: /*
82504: ** The Table structure pTable is really a VIEW. Fill in the names of
82505: ** the columns of the view in the pTable structure. Return the number
82506: ** of errors. If an error is seen leave an error message in pParse->zErrMsg.
82507: */
82508: SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
82509: Table *pSelTab; /* A fake table from which we get the result set */
82510: Select *pSel; /* Copy of the SELECT that implements the view */
82511: int nErr = 0; /* Number of errors encountered */
82512: int n; /* Temporarily holds the number of cursors assigned */
82513: sqlite3 *db = pParse->db; /* Database connection for malloc errors */
82514: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
82515:
82516: assert( pTable );
82517:
82518: #ifndef SQLITE_OMIT_VIRTUALTABLE
82519: if( sqlite3VtabCallConnect(pParse, pTable) ){
82520: return SQLITE_ERROR;
82521: }
82522: if( IsVirtual(pTable) ) return 0;
82523: #endif
82524:
82525: #ifndef SQLITE_OMIT_VIEW
82526: /* A positive nCol means the columns names for this view are
82527: ** already known.
82528: */
82529: if( pTable->nCol>0 ) return 0;
82530:
82531: /* A negative nCol is a special marker meaning that we are currently
82532: ** trying to compute the column names. If we enter this routine with
82533: ** a negative nCol, it means two or more views form a loop, like this:
82534: **
82535: ** CREATE VIEW one AS SELECT * FROM two;
82536: ** CREATE VIEW two AS SELECT * FROM one;
82537: **
82538: ** Actually, the error above is now caught prior to reaching this point.
82539: ** But the following test is still important as it does come up
82540: ** in the following:
82541: **
82542: ** CREATE TABLE main.ex1(a);
82543: ** CREATE TEMP VIEW ex1 AS SELECT a FROM ex1;
82544: ** SELECT * FROM temp.ex1;
82545: */
82546: if( pTable->nCol<0 ){
82547: sqlite3ErrorMsg(pParse, "view %s is circularly defined", pTable->zName);
82548: return 1;
82549: }
82550: assert( pTable->nCol>=0 );
82551:
82552: /* If we get this far, it means we need to compute the table names.
82553: ** Note that the call to sqlite3ResultSetOfSelect() will expand any
82554: ** "*" elements in the results set of the view and will assign cursors
82555: ** to the elements of the FROM clause. But we do not want these changes
82556: ** to be permanent. So the computation is done on a copy of the SELECT
82557: ** statement that defines the view.
82558: */
82559: assert( pTable->pSelect );
82560: pSel = sqlite3SelectDup(db, pTable->pSelect, 0);
82561: if( pSel ){
82562: u8 enableLookaside = db->lookaside.bEnabled;
82563: n = pParse->nTab;
82564: sqlite3SrcListAssignCursors(pParse, pSel->pSrc);
82565: pTable->nCol = -1;
82566: db->lookaside.bEnabled = 0;
82567: #ifndef SQLITE_OMIT_AUTHORIZATION
82568: xAuth = db->xAuth;
82569: db->xAuth = 0;
82570: pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
82571: db->xAuth = xAuth;
82572: #else
82573: pSelTab = sqlite3ResultSetOfSelect(pParse, pSel);
82574: #endif
82575: db->lookaside.bEnabled = enableLookaside;
82576: pParse->nTab = n;
82577: if( pSelTab ){
82578: assert( pTable->aCol==0 );
82579: pTable->nCol = pSelTab->nCol;
82580: pTable->aCol = pSelTab->aCol;
82581: pSelTab->nCol = 0;
82582: pSelTab->aCol = 0;
82583: sqlite3DeleteTable(db, pSelTab);
82584: assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) );
82585: pTable->pSchema->flags |= DB_UnresetViews;
82586: }else{
82587: pTable->nCol = 0;
82588: nErr++;
82589: }
82590: sqlite3SelectDelete(db, pSel);
82591: } else {
82592: nErr++;
82593: }
82594: #endif /* SQLITE_OMIT_VIEW */
82595: return nErr;
82596: }
82597: #endif /* !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) */
82598:
82599: #ifndef SQLITE_OMIT_VIEW
82600: /*
82601: ** Clear the column names from every VIEW in database idx.
82602: */
82603: static void sqliteViewResetAll(sqlite3 *db, int idx){
82604: HashElem *i;
82605: assert( sqlite3SchemaMutexHeld(db, idx, 0) );
82606: if( !DbHasProperty(db, idx, DB_UnresetViews) ) return;
82607: for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){
82608: Table *pTab = sqliteHashData(i);
82609: if( pTab->pSelect ){
82610: sqliteDeleteColumnNames(db, pTab);
82611: pTab->aCol = 0;
82612: pTab->nCol = 0;
82613: }
82614: }
82615: DbClearProperty(db, idx, DB_UnresetViews);
82616: }
82617: #else
82618: # define sqliteViewResetAll(A,B)
82619: #endif /* SQLITE_OMIT_VIEW */
82620:
82621: /*
82622: ** This function is called by the VDBE to adjust the internal schema
82623: ** used by SQLite when the btree layer moves a table root page. The
82624: ** root-page of a table or index in database iDb has changed from iFrom
82625: ** to iTo.
82626: **
82627: ** Ticket #1728: The symbol table might still contain information
82628: ** on tables and/or indices that are the process of being deleted.
82629: ** If you are unlucky, one of those deleted indices or tables might
82630: ** have the same rootpage number as the real table or index that is
82631: ** being moved. So we cannot stop searching after the first match
82632: ** because the first match might be for one of the deleted indices
82633: ** or tables and not the table/index that is actually being moved.
82634: ** We must continue looping until all tables and indices with
82635: ** rootpage==iFrom have been converted to have a rootpage of iTo
82636: ** in order to be certain that we got the right one.
82637: */
82638: #ifndef SQLITE_OMIT_AUTOVACUUM
82639: SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){
82640: HashElem *pElem;
82641: Hash *pHash;
82642: Db *pDb;
82643:
82644: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
82645: pDb = &db->aDb[iDb];
82646: pHash = &pDb->pSchema->tblHash;
82647: for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
82648: Table *pTab = sqliteHashData(pElem);
82649: if( pTab->tnum==iFrom ){
82650: pTab->tnum = iTo;
82651: }
82652: }
82653: pHash = &pDb->pSchema->idxHash;
82654: for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
82655: Index *pIdx = sqliteHashData(pElem);
82656: if( pIdx->tnum==iFrom ){
82657: pIdx->tnum = iTo;
82658: }
82659: }
82660: }
82661: #endif
82662:
82663: /*
82664: ** Write code to erase the table with root-page iTable from database iDb.
82665: ** Also write code to modify the sqlite_master table and internal schema
82666: ** if a root-page of another table is moved by the btree-layer whilst
82667: ** erasing iTable (this can happen with an auto-vacuum database).
82668: */
82669: static void destroyRootPage(Parse *pParse, int iTable, int iDb){
82670: Vdbe *v = sqlite3GetVdbe(pParse);
82671: int r1 = sqlite3GetTempReg(pParse);
82672: sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb);
82673: sqlite3MayAbort(pParse);
82674: #ifndef SQLITE_OMIT_AUTOVACUUM
82675: /* OP_Destroy stores an in integer r1. If this integer
82676: ** is non-zero, then it is the root page number of a table moved to
82677: ** location iTable. The following code modifies the sqlite_master table to
82678: ** reflect this.
82679: **
82680: ** The "#NNN" in the SQL is a special constant that means whatever value
82681: ** is in register NNN. See grammar rules associated with the TK_REGISTER
82682: ** token for additional information.
82683: */
82684: sqlite3NestedParse(pParse,
82685: "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d",
82686: pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable, r1, r1);
82687: #endif
82688: sqlite3ReleaseTempReg(pParse, r1);
82689: }
82690:
82691: /*
82692: ** Write VDBE code to erase table pTab and all associated indices on disk.
82693: ** Code to update the sqlite_master tables and internal schema definitions
82694: ** in case a root-page belonging to another table is moved by the btree layer
82695: ** is also added (this can happen with an auto-vacuum database).
82696: */
82697: static void destroyTable(Parse *pParse, Table *pTab){
82698: #ifdef SQLITE_OMIT_AUTOVACUUM
82699: Index *pIdx;
82700: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
82701: destroyRootPage(pParse, pTab->tnum, iDb);
82702: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
82703: destroyRootPage(pParse, pIdx->tnum, iDb);
82704: }
82705: #else
82706: /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM
82707: ** is not defined), then it is important to call OP_Destroy on the
82708: ** table and index root-pages in order, starting with the numerically
82709: ** largest root-page number. This guarantees that none of the root-pages
82710: ** to be destroyed is relocated by an earlier OP_Destroy. i.e. if the
82711: ** following were coded:
82712: **
82713: ** OP_Destroy 4 0
82714: ** ...
82715: ** OP_Destroy 5 0
82716: **
82717: ** and root page 5 happened to be the largest root-page number in the
82718: ** database, then root page 5 would be moved to page 4 by the
82719: ** "OP_Destroy 4 0" opcode. The subsequent "OP_Destroy 5 0" would hit
82720: ** a free-list page.
82721: */
82722: int iTab = pTab->tnum;
82723: int iDestroyed = 0;
82724:
82725: while( 1 ){
82726: Index *pIdx;
82727: int iLargest = 0;
82728:
82729: if( iDestroyed==0 || iTab<iDestroyed ){
82730: iLargest = iTab;
82731: }
82732: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
82733: int iIdx = pIdx->tnum;
82734: assert( pIdx->pSchema==pTab->pSchema );
82735: if( (iDestroyed==0 || (iIdx<iDestroyed)) && iIdx>iLargest ){
82736: iLargest = iIdx;
82737: }
82738: }
82739: if( iLargest==0 ){
82740: return;
82741: }else{
82742: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
1.2.2.1 ! misho 82743: assert( iDb>=0 && iDb<pParse->db->nDb );
1.2 misho 82744: destroyRootPage(pParse, iLargest, iDb);
82745: iDestroyed = iLargest;
82746: }
82747: }
82748: #endif
82749: }
82750:
82751: /*
82752: ** Remove entries from the sqlite_statN tables (for N in (1,2,3))
82753: ** after a DROP INDEX or DROP TABLE command.
82754: */
82755: static void sqlite3ClearStatTables(
82756: Parse *pParse, /* The parsing context */
82757: int iDb, /* The database number */
82758: const char *zType, /* "idx" or "tbl" */
82759: const char *zName /* Name of index or table */
82760: ){
82761: int i;
82762: const char *zDbName = pParse->db->aDb[iDb].zName;
82763: for(i=1; i<=3; i++){
82764: char zTab[24];
82765: sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i);
82766: if( sqlite3FindTable(pParse->db, zTab, zDbName) ){
82767: sqlite3NestedParse(pParse,
82768: "DELETE FROM %Q.%s WHERE %s=%Q",
82769: zDbName, zTab, zType, zName
82770: );
82771: }
82772: }
82773: }
82774:
82775: /*
82776: ** Generate code to drop a table.
82777: */
82778: SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){
82779: Vdbe *v;
82780: sqlite3 *db = pParse->db;
82781: Trigger *pTrigger;
82782: Db *pDb = &db->aDb[iDb];
82783:
82784: v = sqlite3GetVdbe(pParse);
82785: assert( v!=0 );
82786: sqlite3BeginWriteOperation(pParse, 1, iDb);
82787:
82788: #ifndef SQLITE_OMIT_VIRTUALTABLE
82789: if( IsVirtual(pTab) ){
82790: sqlite3VdbeAddOp0(v, OP_VBegin);
82791: }
82792: #endif
82793:
82794: /* Drop all triggers associated with the table being dropped. Code
82795: ** is generated to remove entries from sqlite_master and/or
82796: ** sqlite_temp_master if required.
82797: */
82798: pTrigger = sqlite3TriggerList(pParse, pTab);
82799: while( pTrigger ){
82800: assert( pTrigger->pSchema==pTab->pSchema ||
82801: pTrigger->pSchema==db->aDb[1].pSchema );
82802: sqlite3DropTriggerPtr(pParse, pTrigger);
82803: pTrigger = pTrigger->pNext;
82804: }
82805:
82806: #ifndef SQLITE_OMIT_AUTOINCREMENT
82807: /* Remove any entries of the sqlite_sequence table associated with
82808: ** the table being dropped. This is done before the table is dropped
82809: ** at the btree level, in case the sqlite_sequence table needs to
82810: ** move as a result of the drop (can happen in auto-vacuum mode).
82811: */
82812: if( pTab->tabFlags & TF_Autoincrement ){
82813: sqlite3NestedParse(pParse,
82814: "DELETE FROM %Q.sqlite_sequence WHERE name=%Q",
82815: pDb->zName, pTab->zName
82816: );
82817: }
82818: #endif
82819:
82820: /* Drop all SQLITE_MASTER table and index entries that refer to the
82821: ** table. The program name loops through the master table and deletes
82822: ** every row that refers to a table of the same name as the one being
82823: ** dropped. Triggers are handled seperately because a trigger can be
82824: ** created in the temp database that refers to a table in another
82825: ** database.
82826: */
82827: sqlite3NestedParse(pParse,
82828: "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
82829: pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
82830: if( !isView && !IsVirtual(pTab) ){
82831: destroyTable(pParse, pTab);
82832: }
82833:
82834: /* Remove the table entry from SQLite's internal schema and modify
82835: ** the schema cookie.
82836: */
82837: if( IsVirtual(pTab) ){
82838: sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0);
82839: }
82840: sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
82841: sqlite3ChangeCookie(pParse, iDb);
82842: sqliteViewResetAll(db, iDb);
82843: }
82844:
82845: /*
82846: ** This routine is called to do the work of a DROP TABLE statement.
82847: ** pName is the name of the table to be dropped.
82848: */
82849: SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
82850: Table *pTab;
82851: Vdbe *v;
82852: sqlite3 *db = pParse->db;
82853: int iDb;
82854:
82855: if( db->mallocFailed ){
82856: goto exit_drop_table;
82857: }
82858: assert( pParse->nErr==0 );
82859: assert( pName->nSrc==1 );
82860: if( noErr ) db->suppressErr++;
1.2.2.1 ! misho 82861: pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]);
1.2 misho 82862: if( noErr ) db->suppressErr--;
82863:
82864: if( pTab==0 ){
82865: if( noErr ) sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
82866: goto exit_drop_table;
82867: }
82868: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
82869: assert( iDb>=0 && iDb<db->nDb );
82870:
82871: /* If pTab is a virtual table, call ViewGetColumnNames() to ensure
82872: ** it is initialized.
82873: */
82874: if( IsVirtual(pTab) && sqlite3ViewGetColumnNames(pParse, pTab) ){
82875: goto exit_drop_table;
82876: }
82877: #ifndef SQLITE_OMIT_AUTHORIZATION
82878: {
82879: int code;
82880: const char *zTab = SCHEMA_TABLE(iDb);
82881: const char *zDb = db->aDb[iDb].zName;
82882: const char *zArg2 = 0;
82883: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){
82884: goto exit_drop_table;
82885: }
82886: if( isView ){
82887: if( !OMIT_TEMPDB && iDb==1 ){
82888: code = SQLITE_DROP_TEMP_VIEW;
82889: }else{
82890: code = SQLITE_DROP_VIEW;
82891: }
82892: #ifndef SQLITE_OMIT_VIRTUALTABLE
82893: }else if( IsVirtual(pTab) ){
82894: code = SQLITE_DROP_VTABLE;
82895: zArg2 = sqlite3GetVTable(db, pTab)->pMod->zName;
82896: #endif
82897: }else{
82898: if( !OMIT_TEMPDB && iDb==1 ){
82899: code = SQLITE_DROP_TEMP_TABLE;
82900: }else{
82901: code = SQLITE_DROP_TABLE;
82902: }
82903: }
82904: if( sqlite3AuthCheck(pParse, code, pTab->zName, zArg2, zDb) ){
82905: goto exit_drop_table;
82906: }
82907: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
82908: goto exit_drop_table;
82909: }
82910: }
82911: #endif
82912: if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
82913: && sqlite3StrNICmp(pTab->zName, "sqlite_stat", 11)!=0 ){
82914: sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
82915: goto exit_drop_table;
82916: }
82917:
82918: #ifndef SQLITE_OMIT_VIEW
82919: /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used
82920: ** on a table.
82921: */
82922: if( isView && pTab->pSelect==0 ){
82923: sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName);
82924: goto exit_drop_table;
82925: }
82926: if( !isView && pTab->pSelect ){
82927: sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName);
82928: goto exit_drop_table;
82929: }
82930: #endif
82931:
82932: /* Generate code to remove the table from the master table
82933: ** on disk.
82934: */
82935: v = sqlite3GetVdbe(pParse);
82936: if( v ){
82937: sqlite3BeginWriteOperation(pParse, 1, iDb);
82938: sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName);
82939: sqlite3FkDropTable(pParse, pName, pTab);
82940: sqlite3CodeDropTable(pParse, pTab, iDb, isView);
82941: }
82942:
82943: exit_drop_table:
82944: sqlite3SrcListDelete(db, pName);
82945: }
82946:
82947: /*
82948: ** This routine is called to create a new foreign key on the table
82949: ** currently under construction. pFromCol determines which columns
82950: ** in the current table point to the foreign key. If pFromCol==0 then
82951: ** connect the key to the last column inserted. pTo is the name of
82952: ** the table referred to. pToCol is a list of tables in the other
82953: ** pTo table that the foreign key points to. flags contains all
82954: ** information about the conflict resolution algorithms specified
82955: ** in the ON DELETE, ON UPDATE and ON INSERT clauses.
82956: **
82957: ** An FKey structure is created and added to the table currently
82958: ** under construction in the pParse->pNewTable field.
82959: **
82960: ** The foreign key is set for IMMEDIATE processing. A subsequent call
82961: ** to sqlite3DeferForeignKey() might change this to DEFERRED.
82962: */
82963: SQLITE_PRIVATE void sqlite3CreateForeignKey(
82964: Parse *pParse, /* Parsing context */
82965: ExprList *pFromCol, /* Columns in this table that point to other table */
82966: Token *pTo, /* Name of the other table */
82967: ExprList *pToCol, /* Columns in the other table */
82968: int flags /* Conflict resolution algorithms. */
82969: ){
82970: sqlite3 *db = pParse->db;
82971: #ifndef SQLITE_OMIT_FOREIGN_KEY
82972: FKey *pFKey = 0;
82973: FKey *pNextTo;
82974: Table *p = pParse->pNewTable;
82975: int nByte;
82976: int i;
82977: int nCol;
82978: char *z;
82979:
82980: assert( pTo!=0 );
82981: if( p==0 || IN_DECLARE_VTAB ) goto fk_end;
82982: if( pFromCol==0 ){
82983: int iCol = p->nCol-1;
82984: if( NEVER(iCol<0) ) goto fk_end;
82985: if( pToCol && pToCol->nExpr!=1 ){
82986: sqlite3ErrorMsg(pParse, "foreign key on %s"
82987: " should reference only one column of table %T",
82988: p->aCol[iCol].zName, pTo);
82989: goto fk_end;
82990: }
82991: nCol = 1;
82992: }else if( pToCol && pToCol->nExpr!=pFromCol->nExpr ){
82993: sqlite3ErrorMsg(pParse,
82994: "number of columns in foreign key does not match the number of "
82995: "columns in the referenced table");
82996: goto fk_end;
82997: }else{
82998: nCol = pFromCol->nExpr;
82999: }
83000: nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1;
83001: if( pToCol ){
83002: for(i=0; i<pToCol->nExpr; i++){
83003: nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1;
83004: }
83005: }
83006: pFKey = sqlite3DbMallocZero(db, nByte );
83007: if( pFKey==0 ){
83008: goto fk_end;
83009: }
83010: pFKey->pFrom = p;
83011: pFKey->pNextFrom = p->pFKey;
83012: z = (char*)&pFKey->aCol[nCol];
83013: pFKey->zTo = z;
83014: memcpy(z, pTo->z, pTo->n);
83015: z[pTo->n] = 0;
83016: sqlite3Dequote(z);
83017: z += pTo->n+1;
83018: pFKey->nCol = nCol;
83019: if( pFromCol==0 ){
83020: pFKey->aCol[0].iFrom = p->nCol-1;
83021: }else{
83022: for(i=0; i<nCol; i++){
83023: int j;
83024: for(j=0; j<p->nCol; j++){
83025: if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){
83026: pFKey->aCol[i].iFrom = j;
83027: break;
83028: }
83029: }
83030: if( j>=p->nCol ){
83031: sqlite3ErrorMsg(pParse,
83032: "unknown column \"%s\" in foreign key definition",
83033: pFromCol->a[i].zName);
83034: goto fk_end;
83035: }
83036: }
83037: }
83038: if( pToCol ){
83039: for(i=0; i<nCol; i++){
83040: int n = sqlite3Strlen30(pToCol->a[i].zName);
83041: pFKey->aCol[i].zCol = z;
83042: memcpy(z, pToCol->a[i].zName, n);
83043: z[n] = 0;
83044: z += n+1;
83045: }
83046: }
83047: pFKey->isDeferred = 0;
83048: pFKey->aAction[0] = (u8)(flags & 0xff); /* ON DELETE action */
83049: pFKey->aAction[1] = (u8)((flags >> 8 ) & 0xff); /* ON UPDATE action */
83050:
83051: assert( sqlite3SchemaMutexHeld(db, 0, p->pSchema) );
83052: pNextTo = (FKey *)sqlite3HashInsert(&p->pSchema->fkeyHash,
83053: pFKey->zTo, sqlite3Strlen30(pFKey->zTo), (void *)pFKey
83054: );
83055: if( pNextTo==pFKey ){
83056: db->mallocFailed = 1;
83057: goto fk_end;
83058: }
83059: if( pNextTo ){
83060: assert( pNextTo->pPrevTo==0 );
83061: pFKey->pNextTo = pNextTo;
83062: pNextTo->pPrevTo = pFKey;
83063: }
83064:
83065: /* Link the foreign key to the table as the last step.
83066: */
83067: p->pFKey = pFKey;
83068: pFKey = 0;
83069:
83070: fk_end:
83071: sqlite3DbFree(db, pFKey);
83072: #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
83073: sqlite3ExprListDelete(db, pFromCol);
83074: sqlite3ExprListDelete(db, pToCol);
83075: }
83076:
83077: /*
83078: ** This routine is called when an INITIALLY IMMEDIATE or INITIALLY DEFERRED
83079: ** clause is seen as part of a foreign key definition. The isDeferred
83080: ** parameter is 1 for INITIALLY DEFERRED and 0 for INITIALLY IMMEDIATE.
83081: ** The behavior of the most recently created foreign key is adjusted
83082: ** accordingly.
83083: */
83084: SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){
83085: #ifndef SQLITE_OMIT_FOREIGN_KEY
83086: Table *pTab;
83087: FKey *pFKey;
83088: if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return;
83089: assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */
83090: pFKey->isDeferred = (u8)isDeferred;
83091: #endif
83092: }
83093:
83094: /*
83095: ** Generate code that will erase and refill index *pIdx. This is
83096: ** used to initialize a newly created index or to recompute the
83097: ** content of an index in response to a REINDEX command.
83098: **
83099: ** if memRootPage is not negative, it means that the index is newly
83100: ** created. The register specified by memRootPage contains the
83101: ** root page number of the index. If memRootPage is negative, then
83102: ** the index already exists and must be cleared before being refilled and
83103: ** the root page number of the index is taken from pIndex->tnum.
83104: */
83105: static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
83106: Table *pTab = pIndex->pTable; /* The table that is indexed */
83107: int iTab = pParse->nTab++; /* Btree cursor used for pTab */
83108: int iIdx = pParse->nTab++; /* Btree cursor used for pIndex */
83109: int iSorter; /* Cursor opened by OpenSorter (if in use) */
83110: int addr1; /* Address of top of loop */
83111: int addr2; /* Address to jump to for next iteration */
83112: int tnum; /* Root page of index */
83113: Vdbe *v; /* Generate code into this virtual machine */
83114: KeyInfo *pKey; /* KeyInfo for index */
83115: #ifdef SQLITE_OMIT_MERGE_SORT
83116: int regIdxKey; /* Registers containing the index key */
83117: #endif
83118: int regRecord; /* Register holding assemblied index record */
83119: sqlite3 *db = pParse->db; /* The database connection */
83120: int iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
83121:
83122: #ifndef SQLITE_OMIT_AUTHORIZATION
83123: if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0,
83124: db->aDb[iDb].zName ) ){
83125: return;
83126: }
83127: #endif
83128:
83129: /* Require a write-lock on the table to perform this operation */
83130: sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName);
83131:
83132: v = sqlite3GetVdbe(pParse);
83133: if( v==0 ) return;
83134: if( memRootPage>=0 ){
83135: tnum = memRootPage;
83136: }else{
83137: tnum = pIndex->tnum;
83138: sqlite3VdbeAddOp2(v, OP_Clear, tnum, iDb);
83139: }
83140: pKey = sqlite3IndexKeyinfo(pParse, pIndex);
83141: sqlite3VdbeAddOp4(v, OP_OpenWrite, iIdx, tnum, iDb,
83142: (char *)pKey, P4_KEYINFO_HANDOFF);
1.2.2.1 ! misho 83143: sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0));
1.2 misho 83144:
83145: #ifndef SQLITE_OMIT_MERGE_SORT
83146: /* Open the sorter cursor if we are to use one. */
83147: iSorter = pParse->nTab++;
83148: sqlite3VdbeAddOp4(v, OP_SorterOpen, iSorter, 0, 0, (char*)pKey, P4_KEYINFO);
83149: #else
83150: iSorter = iTab;
83151: #endif
83152:
83153: /* Open the table. Loop through all rows of the table, inserting index
83154: ** records into the sorter. */
83155: sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead);
83156: addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
83157: regRecord = sqlite3GetTempReg(pParse);
83158:
83159: #ifndef SQLITE_OMIT_MERGE_SORT
83160: sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
83161: sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord);
83162: sqlite3VdbeAddOp2(v, OP_Next, iTab, addr1+1);
83163: sqlite3VdbeJumpHere(v, addr1);
83164: addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0);
83165: if( pIndex->onError!=OE_None ){
83166: int j2 = sqlite3VdbeCurrentAddr(v) + 3;
83167: sqlite3VdbeAddOp2(v, OP_Goto, 0, j2);
83168: addr2 = sqlite3VdbeCurrentAddr(v);
83169: sqlite3VdbeAddOp3(v, OP_SorterCompare, iSorter, j2, regRecord);
83170: sqlite3HaltConstraint(
83171: pParse, OE_Abort, "indexed columns are not unique", P4_STATIC
83172: );
83173: }else{
83174: addr2 = sqlite3VdbeCurrentAddr(v);
83175: }
83176: sqlite3VdbeAddOp2(v, OP_SorterData, iSorter, regRecord);
83177: sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1);
83178: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
83179: #else
83180: regIdxKey = sqlite3GenerateIndexKey(pParse, pIndex, iTab, regRecord, 1);
83181: addr2 = addr1 + 1;
83182: if( pIndex->onError!=OE_None ){
83183: const int regRowid = regIdxKey + pIndex->nColumn;
83184: const int j2 = sqlite3VdbeCurrentAddr(v) + 2;
83185: void * const pRegKey = SQLITE_INT_TO_PTR(regIdxKey);
83186:
83187: /* The registers accessed by the OP_IsUnique opcode were allocated
83188: ** using sqlite3GetTempRange() inside of the sqlite3GenerateIndexKey()
83189: ** call above. Just before that function was freed they were released
83190: ** (made available to the compiler for reuse) using
83191: ** sqlite3ReleaseTempRange(). So in some ways having the OP_IsUnique
83192: ** opcode use the values stored within seems dangerous. However, since
83193: ** we can be sure that no other temp registers have been allocated
83194: ** since sqlite3ReleaseTempRange() was called, it is safe to do so.
83195: */
83196: sqlite3VdbeAddOp4(v, OP_IsUnique, iIdx, j2, regRowid, pRegKey, P4_INT32);
83197: sqlite3HaltConstraint(
83198: pParse, OE_Abort, "indexed columns are not unique", P4_STATIC);
83199: }
83200: sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 0);
83201: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
83202: #endif
83203: sqlite3ReleaseTempReg(pParse, regRecord);
83204: sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2);
83205: sqlite3VdbeJumpHere(v, addr1);
83206:
83207: sqlite3VdbeAddOp1(v, OP_Close, iTab);
83208: sqlite3VdbeAddOp1(v, OP_Close, iIdx);
83209: sqlite3VdbeAddOp1(v, OP_Close, iSorter);
83210: }
83211:
83212: /*
83213: ** Create a new index for an SQL table. pName1.pName2 is the name of the index
83214: ** and pTblList is the name of the table that is to be indexed. Both will
83215: ** be NULL for a primary key or an index that is created to satisfy a
83216: ** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable
83217: ** as the table to be indexed. pParse->pNewTable is a table that is
83218: ** currently being constructed by a CREATE TABLE statement.
83219: **
83220: ** pList is a list of columns to be indexed. pList will be NULL if this
83221: ** is a primary key or unique-constraint on the most recent column added
83222: ** to the table currently under construction.
83223: **
83224: ** If the index is created successfully, return a pointer to the new Index
83225: ** structure. This is used by sqlite3AddPrimaryKey() to mark the index
83226: ** as the tables primary key (Index.autoIndex==2).
83227: */
83228: SQLITE_PRIVATE Index *sqlite3CreateIndex(
83229: Parse *pParse, /* All information about this parse */
83230: Token *pName1, /* First part of index name. May be NULL */
83231: Token *pName2, /* Second part of index name. May be NULL */
83232: SrcList *pTblName, /* Table to index. Use pParse->pNewTable if 0 */
83233: ExprList *pList, /* A list of columns to be indexed */
83234: int onError, /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
83235: Token *pStart, /* The CREATE token that begins this statement */
83236: Token *pEnd, /* The ")" that closes the CREATE INDEX statement */
83237: int sortOrder, /* Sort order of primary key when pList==NULL */
83238: int ifNotExist /* Omit error if index already exists */
83239: ){
83240: Index *pRet = 0; /* Pointer to return */
83241: Table *pTab = 0; /* Table to be indexed */
83242: Index *pIndex = 0; /* The index to be created */
83243: char *zName = 0; /* Name of the index */
83244: int nName; /* Number of characters in zName */
83245: int i, j;
83246: Token nullId; /* Fake token for an empty ID list */
83247: DbFixer sFix; /* For assigning database names to pTable */
83248: int sortOrderMask; /* 1 to honor DESC in index. 0 to ignore. */
83249: sqlite3 *db = pParse->db;
83250: Db *pDb; /* The specific table containing the indexed database */
83251: int iDb; /* Index of the database that is being written */
83252: Token *pName = 0; /* Unqualified name of the index to create */
83253: struct ExprList_item *pListItem; /* For looping over pList */
83254: int nCol;
83255: int nExtra = 0;
83256: char *zExtra;
83257:
83258: assert( pStart==0 || pEnd!=0 ); /* pEnd must be non-NULL if pStart is */
83259: assert( pParse->nErr==0 ); /* Never called with prior errors */
83260: if( db->mallocFailed || IN_DECLARE_VTAB ){
83261: goto exit_create_index;
83262: }
83263: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
83264: goto exit_create_index;
83265: }
83266:
83267: /*
83268: ** Find the table that is to be indexed. Return early if not found.
83269: */
83270: if( pTblName!=0 ){
83271:
83272: /* Use the two-part index name to determine the database
83273: ** to search for the table. 'Fix' the table name to this db
83274: ** before looking up the table.
83275: */
83276: assert( pName1 && pName2 );
83277: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
83278: if( iDb<0 ) goto exit_create_index;
83279: assert( pName && pName->z );
83280:
83281: #ifndef SQLITE_OMIT_TEMPDB
1.2.2.1 ! misho 83282: /* If the index name was unqualified, check if the table
1.2 misho 83283: ** is a temp table. If so, set the database to 1. Do not do this
83284: ** if initialising a database schema.
83285: */
83286: if( !db->init.busy ){
83287: pTab = sqlite3SrcListLookup(pParse, pTblName);
83288: if( pName2->n==0 && pTab && pTab->pSchema==db->aDb[1].pSchema ){
83289: iDb = 1;
83290: }
83291: }
83292: #endif
83293:
83294: if( sqlite3FixInit(&sFix, pParse, iDb, "index", pName) &&
83295: sqlite3FixSrcList(&sFix, pTblName)
83296: ){
83297: /* Because the parser constructs pTblName from a single identifier,
83298: ** sqlite3FixSrcList can never fail. */
83299: assert(0);
83300: }
1.2.2.1 ! misho 83301: pTab = sqlite3LocateTableItem(pParse, 0, &pTblName->a[0]);
! 83302: assert( db->mallocFailed==0 || pTab==0 );
! 83303: if( pTab==0 ) goto exit_create_index;
1.2 misho 83304: assert( db->aDb[iDb].pSchema==pTab->pSchema );
83305: }else{
83306: assert( pName==0 );
83307: assert( pStart==0 );
83308: pTab = pParse->pNewTable;
83309: if( !pTab ) goto exit_create_index;
83310: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
83311: }
83312: pDb = &db->aDb[iDb];
83313:
83314: assert( pTab!=0 );
83315: assert( pParse->nErr==0 );
83316: if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0
83317: && memcmp(&pTab->zName[7],"altertab_",9)!=0 ){
83318: sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName);
83319: goto exit_create_index;
83320: }
83321: #ifndef SQLITE_OMIT_VIEW
83322: if( pTab->pSelect ){
83323: sqlite3ErrorMsg(pParse, "views may not be indexed");
83324: goto exit_create_index;
83325: }
83326: #endif
83327: #ifndef SQLITE_OMIT_VIRTUALTABLE
83328: if( IsVirtual(pTab) ){
83329: sqlite3ErrorMsg(pParse, "virtual tables may not be indexed");
83330: goto exit_create_index;
83331: }
83332: #endif
83333:
83334: /*
83335: ** Find the name of the index. Make sure there is not already another
83336: ** index or table with the same name.
83337: **
83338: ** Exception: If we are reading the names of permanent indices from the
83339: ** sqlite_master table (because some other process changed the schema) and
83340: ** one of the index names collides with the name of a temporary table or
83341: ** index, then we will continue to process this index.
83342: **
83343: ** If pName==0 it means that we are
83344: ** dealing with a primary key or UNIQUE constraint. We have to invent our
83345: ** own name.
83346: */
83347: if( pName ){
83348: zName = sqlite3NameFromToken(db, pName);
83349: if( zName==0 ) goto exit_create_index;
83350: assert( pName->z!=0 );
83351: if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
83352: goto exit_create_index;
83353: }
83354: if( !db->init.busy ){
83355: if( sqlite3FindTable(db, zName, 0)!=0 ){
83356: sqlite3ErrorMsg(pParse, "there is already a table named %s", zName);
83357: goto exit_create_index;
83358: }
83359: }
83360: if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){
83361: if( !ifNotExist ){
83362: sqlite3ErrorMsg(pParse, "index %s already exists", zName);
83363: }else{
83364: assert( !db->init.busy );
83365: sqlite3CodeVerifySchema(pParse, iDb);
83366: }
83367: goto exit_create_index;
83368: }
83369: }else{
83370: int n;
83371: Index *pLoop;
83372: for(pLoop=pTab->pIndex, n=1; pLoop; pLoop=pLoop->pNext, n++){}
83373: zName = sqlite3MPrintf(db, "sqlite_autoindex_%s_%d", pTab->zName, n);
83374: if( zName==0 ){
83375: goto exit_create_index;
83376: }
83377: }
83378:
83379: /* Check for authorization to create an index.
83380: */
83381: #ifndef SQLITE_OMIT_AUTHORIZATION
83382: {
83383: const char *zDb = pDb->zName;
83384: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){
83385: goto exit_create_index;
83386: }
83387: i = SQLITE_CREATE_INDEX;
83388: if( !OMIT_TEMPDB && iDb==1 ) i = SQLITE_CREATE_TEMP_INDEX;
83389: if( sqlite3AuthCheck(pParse, i, zName, pTab->zName, zDb) ){
83390: goto exit_create_index;
83391: }
83392: }
83393: #endif
83394:
83395: /* If pList==0, it means this routine was called to make a primary
83396: ** key out of the last column added to the table under construction.
83397: ** So create a fake list to simulate this.
83398: */
83399: if( pList==0 ){
83400: nullId.z = pTab->aCol[pTab->nCol-1].zName;
83401: nullId.n = sqlite3Strlen30((char*)nullId.z);
83402: pList = sqlite3ExprListAppend(pParse, 0, 0);
83403: if( pList==0 ) goto exit_create_index;
83404: sqlite3ExprListSetName(pParse, pList, &nullId, 0);
83405: pList->a[0].sortOrder = (u8)sortOrder;
83406: }
83407:
83408: /* Figure out how many bytes of space are required to store explicitly
83409: ** specified collation sequence names.
83410: */
83411: for(i=0; i<pList->nExpr; i++){
83412: Expr *pExpr = pList->a[i].pExpr;
83413: if( pExpr ){
1.2.2.1 ! misho 83414: CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr);
! 83415: if( pColl ){
1.2 misho 83416: nExtra += (1 + sqlite3Strlen30(pColl->zName));
83417: }
83418: }
83419: }
83420:
83421: /*
83422: ** Allocate the index structure.
83423: */
83424: nName = sqlite3Strlen30(zName);
83425: nCol = pList->nExpr;
83426: pIndex = sqlite3DbMallocZero(db,
83427: ROUND8(sizeof(Index)) + /* Index structure */
83428: ROUND8(sizeof(tRowcnt)*(nCol+1)) + /* Index.aiRowEst */
83429: sizeof(char *)*nCol + /* Index.azColl */
83430: sizeof(int)*nCol + /* Index.aiColumn */
83431: sizeof(u8)*nCol + /* Index.aSortOrder */
83432: nName + 1 + /* Index.zName */
83433: nExtra /* Collation sequence names */
83434: );
83435: if( db->mallocFailed ){
83436: goto exit_create_index;
83437: }
83438: zExtra = (char*)pIndex;
83439: pIndex->aiRowEst = (tRowcnt*)&zExtra[ROUND8(sizeof(Index))];
83440: pIndex->azColl = (char**)
83441: ((char*)pIndex->aiRowEst + ROUND8(sizeof(tRowcnt)*nCol+1));
83442: assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowEst) );
83443: assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) );
83444: pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]);
83445: pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]);
83446: pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]);
83447: zExtra = (char *)(&pIndex->zName[nName+1]);
83448: memcpy(pIndex->zName, zName, nName+1);
83449: pIndex->pTable = pTab;
83450: pIndex->nColumn = pList->nExpr;
83451: pIndex->onError = (u8)onError;
83452: pIndex->autoIndex = (u8)(pName==0);
83453: pIndex->pSchema = db->aDb[iDb].pSchema;
83454: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
83455:
83456: /* Check to see if we should honor DESC requests on index columns
83457: */
83458: if( pDb->pSchema->file_format>=4 ){
83459: sortOrderMask = -1; /* Honor DESC */
83460: }else{
83461: sortOrderMask = 0; /* Ignore DESC */
83462: }
83463:
83464: /* Scan the names of the columns of the table to be indexed and
83465: ** load the column indices into the Index structure. Report an error
83466: ** if any column is not found.
83467: **
83468: ** TODO: Add a test to make sure that the same column is not named
83469: ** more than once within the same index. Only the first instance of
83470: ** the column will ever be used by the optimizer. Note that using the
83471: ** same column more than once cannot be an error because that would
83472: ** break backwards compatibility - it needs to be a warning.
83473: */
83474: for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
83475: const char *zColName = pListItem->zName;
83476: Column *pTabCol;
83477: int requestedSortOrder;
1.2.2.1 ! misho 83478: CollSeq *pColl; /* Collating sequence */
1.2 misho 83479: char *zColl; /* Collation sequence name */
83480:
83481: for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){
83482: if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break;
83483: }
83484: if( j>=pTab->nCol ){
83485: sqlite3ErrorMsg(pParse, "table %s has no column named %s",
83486: pTab->zName, zColName);
83487: pParse->checkSchema = 1;
83488: goto exit_create_index;
83489: }
83490: pIndex->aiColumn[i] = j;
1.2.2.1 ! misho 83491: if( pListItem->pExpr
! 83492: && (pColl = sqlite3ExprCollSeq(pParse, pListItem->pExpr))!=0
! 83493: ){
1.2 misho 83494: int nColl;
1.2.2.1 ! misho 83495: zColl = pColl->zName;
1.2 misho 83496: nColl = sqlite3Strlen30(zColl) + 1;
83497: assert( nExtra>=nColl );
83498: memcpy(zExtra, zColl, nColl);
83499: zColl = zExtra;
83500: zExtra += nColl;
83501: nExtra -= nColl;
83502: }else{
83503: zColl = pTab->aCol[j].zColl;
83504: if( !zColl ){
1.2.2.1 ! misho 83505: zColl = "BINARY";
1.2 misho 83506: }
83507: }
83508: if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){
83509: goto exit_create_index;
83510: }
83511: pIndex->azColl[i] = zColl;
83512: requestedSortOrder = pListItem->sortOrder & sortOrderMask;
83513: pIndex->aSortOrder[i] = (u8)requestedSortOrder;
83514: }
83515: sqlite3DefaultRowEst(pIndex);
83516:
83517: if( pTab==pParse->pNewTable ){
83518: /* This routine has been called to create an automatic index as a
83519: ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or
83520: ** a PRIMARY KEY or UNIQUE clause following the column definitions.
83521: ** i.e. one of:
83522: **
83523: ** CREATE TABLE t(x PRIMARY KEY, y);
83524: ** CREATE TABLE t(x, y, UNIQUE(x, y));
83525: **
83526: ** Either way, check to see if the table already has such an index. If
83527: ** so, don't bother creating this one. This only applies to
83528: ** automatically created indices. Users can do as they wish with
83529: ** explicit indices.
83530: **
83531: ** Two UNIQUE or PRIMARY KEY constraints are considered equivalent
83532: ** (and thus suppressing the second one) even if they have different
83533: ** sort orders.
83534: **
83535: ** If there are different collating sequences or if the columns of
83536: ** the constraint occur in different orders, then the constraints are
83537: ** considered distinct and both result in separate indices.
83538: */
83539: Index *pIdx;
83540: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
83541: int k;
83542: assert( pIdx->onError!=OE_None );
83543: assert( pIdx->autoIndex );
83544: assert( pIndex->onError!=OE_None );
83545:
83546: if( pIdx->nColumn!=pIndex->nColumn ) continue;
83547: for(k=0; k<pIdx->nColumn; k++){
83548: const char *z1;
83549: const char *z2;
83550: if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break;
83551: z1 = pIdx->azColl[k];
83552: z2 = pIndex->azColl[k];
83553: if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break;
83554: }
83555: if( k==pIdx->nColumn ){
83556: if( pIdx->onError!=pIndex->onError ){
83557: /* This constraint creates the same index as a previous
83558: ** constraint specified somewhere in the CREATE TABLE statement.
83559: ** However the ON CONFLICT clauses are different. If both this
83560: ** constraint and the previous equivalent constraint have explicit
83561: ** ON CONFLICT clauses this is an error. Otherwise, use the
83562: ** explicitly specified behaviour for the index.
83563: */
83564: if( !(pIdx->onError==OE_Default || pIndex->onError==OE_Default) ){
83565: sqlite3ErrorMsg(pParse,
83566: "conflicting ON CONFLICT clauses specified", 0);
83567: }
83568: if( pIdx->onError==OE_Default ){
83569: pIdx->onError = pIndex->onError;
83570: }
83571: }
83572: goto exit_create_index;
83573: }
83574: }
83575: }
83576:
83577: /* Link the new Index structure to its table and to the other
83578: ** in-memory database structures.
83579: */
83580: if( db->init.busy ){
83581: Index *p;
83582: assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) );
83583: p = sqlite3HashInsert(&pIndex->pSchema->idxHash,
83584: pIndex->zName, sqlite3Strlen30(pIndex->zName),
83585: pIndex);
83586: if( p ){
83587: assert( p==pIndex ); /* Malloc must have failed */
83588: db->mallocFailed = 1;
83589: goto exit_create_index;
83590: }
83591: db->flags |= SQLITE_InternChanges;
83592: if( pTblName!=0 ){
83593: pIndex->tnum = db->init.newTnum;
83594: }
83595: }
83596:
83597: /* If the db->init.busy is 0 then create the index on disk. This
83598: ** involves writing the index into the master table and filling in the
83599: ** index with the current table contents.
83600: **
83601: ** The db->init.busy is 0 when the user first enters a CREATE INDEX
83602: ** command. db->init.busy is 1 when a database is opened and
83603: ** CREATE INDEX statements are read out of the master table. In
83604: ** the latter case the index already exists on disk, which is why
83605: ** we don't want to recreate it.
83606: **
83607: ** If pTblName==0 it means this index is generated as a primary key
83608: ** or UNIQUE constraint of a CREATE TABLE statement. Since the table
83609: ** has just been created, it contains no data and the index initialization
83610: ** step can be skipped.
83611: */
83612: else{ /* if( db->init.busy==0 ) */
83613: Vdbe *v;
83614: char *zStmt;
83615: int iMem = ++pParse->nMem;
83616:
83617: v = sqlite3GetVdbe(pParse);
83618: if( v==0 ) goto exit_create_index;
83619:
83620:
83621: /* Create the rootpage for the index
83622: */
83623: sqlite3BeginWriteOperation(pParse, 1, iDb);
83624: sqlite3VdbeAddOp2(v, OP_CreateIndex, iDb, iMem);
83625:
83626: /* Gather the complete text of the CREATE INDEX statement into
83627: ** the zStmt variable
83628: */
83629: if( pStart ){
83630: assert( pEnd!=0 );
83631: /* A named index with an explicit CREATE INDEX statement */
83632: zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
83633: onError==OE_None ? "" : " UNIQUE",
83634: (int)(pEnd->z - pName->z) + 1,
83635: pName->z);
83636: }else{
83637: /* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
83638: /* zStmt = sqlite3MPrintf(""); */
83639: zStmt = 0;
83640: }
83641:
83642: /* Add an entry in sqlite_master for this index
83643: */
83644: sqlite3NestedParse(pParse,
83645: "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);",
83646: db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
83647: pIndex->zName,
83648: pTab->zName,
83649: iMem,
83650: zStmt
83651: );
83652: sqlite3DbFree(db, zStmt);
83653:
83654: /* Fill the index with data and reparse the schema. Code an OP_Expire
83655: ** to invalidate all pre-compiled statements.
83656: */
83657: if( pTblName ){
83658: sqlite3RefillIndex(pParse, pIndex, iMem);
83659: sqlite3ChangeCookie(pParse, iDb);
83660: sqlite3VdbeAddParseSchemaOp(v, iDb,
83661: sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
83662: sqlite3VdbeAddOp1(v, OP_Expire, 0);
83663: }
83664: }
83665:
83666: /* When adding an index to the list of indices for a table, make
83667: ** sure all indices labeled OE_Replace come after all those labeled
83668: ** OE_Ignore. This is necessary for the correct constraint check
83669: ** processing (in sqlite3GenerateConstraintChecks()) as part of
83670: ** UPDATE and INSERT statements.
83671: */
83672: if( db->init.busy || pTblName==0 ){
83673: if( onError!=OE_Replace || pTab->pIndex==0
83674: || pTab->pIndex->onError==OE_Replace){
83675: pIndex->pNext = pTab->pIndex;
83676: pTab->pIndex = pIndex;
83677: }else{
83678: Index *pOther = pTab->pIndex;
83679: while( pOther->pNext && pOther->pNext->onError!=OE_Replace ){
83680: pOther = pOther->pNext;
83681: }
83682: pIndex->pNext = pOther->pNext;
83683: pOther->pNext = pIndex;
83684: }
83685: pRet = pIndex;
83686: pIndex = 0;
83687: }
83688:
83689: /* Clean up before exiting */
83690: exit_create_index:
83691: if( pIndex ){
83692: sqlite3DbFree(db, pIndex->zColAff);
83693: sqlite3DbFree(db, pIndex);
83694: }
83695: sqlite3ExprListDelete(db, pList);
83696: sqlite3SrcListDelete(db, pTblName);
83697: sqlite3DbFree(db, zName);
83698: return pRet;
83699: }
83700:
83701: /*
83702: ** Fill the Index.aiRowEst[] array with default information - information
83703: ** to be used when we have not run the ANALYZE command.
83704: **
83705: ** aiRowEst[0] is suppose to contain the number of elements in the index.
83706: ** Since we do not know, guess 1 million. aiRowEst[1] is an estimate of the
83707: ** number of rows in the table that match any particular value of the
83708: ** first column of the index. aiRowEst[2] is an estimate of the number
83709: ** of rows that match any particular combiniation of the first 2 columns
83710: ** of the index. And so forth. It must always be the case that
83711: *
83712: ** aiRowEst[N]<=aiRowEst[N-1]
83713: ** aiRowEst[N]>=1
83714: **
83715: ** Apart from that, we have little to go on besides intuition as to
83716: ** how aiRowEst[] should be initialized. The numbers generated here
83717: ** are based on typical values found in actual indices.
83718: */
83719: SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){
83720: tRowcnt *a = pIdx->aiRowEst;
83721: int i;
83722: tRowcnt n;
83723: assert( a!=0 );
83724: a[0] = pIdx->pTable->nRowEst;
83725: if( a[0]<10 ) a[0] = 10;
83726: n = 10;
83727: for(i=1; i<=pIdx->nColumn; i++){
83728: a[i] = n;
83729: if( n>5 ) n--;
83730: }
83731: if( pIdx->onError!=OE_None ){
83732: a[pIdx->nColumn] = 1;
83733: }
83734: }
83735:
83736: /*
83737: ** This routine will drop an existing named index. This routine
83738: ** implements the DROP INDEX statement.
83739: */
83740: SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
83741: Index *pIndex;
83742: Vdbe *v;
83743: sqlite3 *db = pParse->db;
83744: int iDb;
83745:
83746: assert( pParse->nErr==0 ); /* Never called with prior errors */
83747: if( db->mallocFailed ){
83748: goto exit_drop_index;
83749: }
83750: assert( pName->nSrc==1 );
83751: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
83752: goto exit_drop_index;
83753: }
83754: pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
83755: if( pIndex==0 ){
83756: if( !ifExists ){
83757: sqlite3ErrorMsg(pParse, "no such index: %S", pName, 0);
83758: }else{
83759: sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
83760: }
83761: pParse->checkSchema = 1;
83762: goto exit_drop_index;
83763: }
83764: if( pIndex->autoIndex ){
83765: sqlite3ErrorMsg(pParse, "index associated with UNIQUE "
83766: "or PRIMARY KEY constraint cannot be dropped", 0);
83767: goto exit_drop_index;
83768: }
83769: iDb = sqlite3SchemaToIndex(db, pIndex->pSchema);
83770: #ifndef SQLITE_OMIT_AUTHORIZATION
83771: {
83772: int code = SQLITE_DROP_INDEX;
83773: Table *pTab = pIndex->pTable;
83774: const char *zDb = db->aDb[iDb].zName;
83775: const char *zTab = SCHEMA_TABLE(iDb);
83776: if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
83777: goto exit_drop_index;
83778: }
83779: if( !OMIT_TEMPDB && iDb ) code = SQLITE_DROP_TEMP_INDEX;
83780: if( sqlite3AuthCheck(pParse, code, pIndex->zName, pTab->zName, zDb) ){
83781: goto exit_drop_index;
83782: }
83783: }
83784: #endif
83785:
83786: /* Generate code to remove the index and from the master table */
83787: v = sqlite3GetVdbe(pParse);
83788: if( v ){
83789: sqlite3BeginWriteOperation(pParse, 1, iDb);
83790: sqlite3NestedParse(pParse,
83791: "DELETE FROM %Q.%s WHERE name=%Q AND type='index'",
83792: db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pIndex->zName
83793: );
83794: sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName);
83795: sqlite3ChangeCookie(pParse, iDb);
83796: destroyRootPage(pParse, pIndex->tnum, iDb);
83797: sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0);
83798: }
83799:
83800: exit_drop_index:
83801: sqlite3SrcListDelete(db, pName);
83802: }
83803:
83804: /*
1.2.2.1 ! misho 83805: ** pArray is a pointer to an array of objects. Each object in the
! 83806: ** array is szEntry bytes in size. This routine uses sqlite3DbRealloc()
! 83807: ** to extend the array so that there is space for a new object at the end.
! 83808: **
! 83809: ** When this function is called, *pnEntry contains the current size of
! 83810: ** the array (in entries - so the allocation is ((*pnEntry) * szEntry) bytes
! 83811: ** in total).
! 83812: **
! 83813: ** If the realloc() is successful (i.e. if no OOM condition occurs), the
! 83814: ** space allocated for the new object is zeroed, *pnEntry updated to
! 83815: ** reflect the new size of the array and a pointer to the new allocation
! 83816: ** returned. *pIdx is set to the index of the new array entry in this case.
! 83817: **
! 83818: ** Otherwise, if the realloc() fails, *pIdx is set to -1, *pnEntry remains
! 83819: ** unchanged and a copy of pArray returned.
1.2 misho 83820: */
83821: SQLITE_PRIVATE void *sqlite3ArrayAllocate(
83822: sqlite3 *db, /* Connection to notify of malloc failures */
83823: void *pArray, /* Array of objects. Might be reallocated */
83824: int szEntry, /* Size of each object in the array */
83825: int *pnEntry, /* Number of objects currently in use */
83826: int *pIdx /* Write the index of a new slot here */
83827: ){
83828: char *z;
1.2.2.1 ! misho 83829: int n = *pnEntry;
! 83830: if( (n & (n-1))==0 ){
! 83831: int sz = (n==0) ? 1 : 2*n;
! 83832: void *pNew = sqlite3DbRealloc(db, pArray, sz*szEntry);
1.2 misho 83833: if( pNew==0 ){
83834: *pIdx = -1;
83835: return pArray;
83836: }
83837: pArray = pNew;
83838: }
83839: z = (char*)pArray;
1.2.2.1 ! misho 83840: memset(&z[n * szEntry], 0, szEntry);
! 83841: *pIdx = n;
1.2 misho 83842: ++*pnEntry;
83843: return pArray;
83844: }
83845:
83846: /*
83847: ** Append a new element to the given IdList. Create a new IdList if
83848: ** need be.
83849: **
83850: ** A new IdList is returned, or NULL if malloc() fails.
83851: */
83852: SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3 *db, IdList *pList, Token *pToken){
83853: int i;
83854: if( pList==0 ){
83855: pList = sqlite3DbMallocZero(db, sizeof(IdList) );
83856: if( pList==0 ) return 0;
83857: }
83858: pList->a = sqlite3ArrayAllocate(
83859: db,
83860: pList->a,
83861: sizeof(pList->a[0]),
83862: &pList->nId,
83863: &i
83864: );
83865: if( i<0 ){
83866: sqlite3IdListDelete(db, pList);
83867: return 0;
83868: }
83869: pList->a[i].zName = sqlite3NameFromToken(db, pToken);
83870: return pList;
83871: }
83872:
83873: /*
83874: ** Delete an IdList.
83875: */
83876: SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){
83877: int i;
83878: if( pList==0 ) return;
83879: for(i=0; i<pList->nId; i++){
83880: sqlite3DbFree(db, pList->a[i].zName);
83881: }
83882: sqlite3DbFree(db, pList->a);
83883: sqlite3DbFree(db, pList);
83884: }
83885:
83886: /*
83887: ** Return the index in pList of the identifier named zId. Return -1
83888: ** if not found.
83889: */
83890: SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){
83891: int i;
83892: if( pList==0 ) return -1;
83893: for(i=0; i<pList->nId; i++){
83894: if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i;
83895: }
83896: return -1;
83897: }
83898:
83899: /*
83900: ** Expand the space allocated for the given SrcList object by
83901: ** creating nExtra new slots beginning at iStart. iStart is zero based.
83902: ** New slots are zeroed.
83903: **
83904: ** For example, suppose a SrcList initially contains two entries: A,B.
83905: ** To append 3 new entries onto the end, do this:
83906: **
83907: ** sqlite3SrcListEnlarge(db, pSrclist, 3, 2);
83908: **
83909: ** After the call above it would contain: A, B, nil, nil, nil.
83910: ** If the iStart argument had been 1 instead of 2, then the result
83911: ** would have been: A, nil, nil, nil, B. To prepend the new slots,
83912: ** the iStart value would be 0. The result then would
83913: ** be: nil, nil, nil, A, B.
83914: **
83915: ** If a memory allocation fails the SrcList is unchanged. The
83916: ** db->mallocFailed flag will be set to true.
83917: */
83918: SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(
83919: sqlite3 *db, /* Database connection to notify of OOM errors */
83920: SrcList *pSrc, /* The SrcList to be enlarged */
83921: int nExtra, /* Number of new slots to add to pSrc->a[] */
83922: int iStart /* Index in pSrc->a[] of first new slot */
83923: ){
83924: int i;
83925:
83926: /* Sanity checking on calling parameters */
83927: assert( iStart>=0 );
83928: assert( nExtra>=1 );
83929: assert( pSrc!=0 );
83930: assert( iStart<=pSrc->nSrc );
83931:
83932: /* Allocate additional space if needed */
83933: if( pSrc->nSrc+nExtra>pSrc->nAlloc ){
83934: SrcList *pNew;
83935: int nAlloc = pSrc->nSrc+nExtra;
83936: int nGot;
83937: pNew = sqlite3DbRealloc(db, pSrc,
83938: sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) );
83939: if( pNew==0 ){
83940: assert( db->mallocFailed );
83941: return pSrc;
83942: }
83943: pSrc = pNew;
83944: nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1;
83945: pSrc->nAlloc = (u16)nGot;
83946: }
83947:
83948: /* Move existing slots that come after the newly inserted slots
83949: ** out of the way */
83950: for(i=pSrc->nSrc-1; i>=iStart; i--){
83951: pSrc->a[i+nExtra] = pSrc->a[i];
83952: }
83953: pSrc->nSrc += (i16)nExtra;
83954:
83955: /* Zero the newly allocated slots */
83956: memset(&pSrc->a[iStart], 0, sizeof(pSrc->a[0])*nExtra);
83957: for(i=iStart; i<iStart+nExtra; i++){
83958: pSrc->a[i].iCursor = -1;
83959: }
83960:
83961: /* Return a pointer to the enlarged SrcList */
83962: return pSrc;
83963: }
83964:
83965:
83966: /*
83967: ** Append a new table name to the given SrcList. Create a new SrcList if
83968: ** need be. A new entry is created in the SrcList even if pTable is NULL.
83969: **
83970: ** A SrcList is returned, or NULL if there is an OOM error. The returned
83971: ** SrcList might be the same as the SrcList that was input or it might be
83972: ** a new one. If an OOM error does occurs, then the prior value of pList
83973: ** that is input to this routine is automatically freed.
83974: **
83975: ** If pDatabase is not null, it means that the table has an optional
83976: ** database name prefix. Like this: "database.table". The pDatabase
83977: ** points to the table name and the pTable points to the database name.
83978: ** The SrcList.a[].zName field is filled with the table name which might
83979: ** come from pTable (if pDatabase is NULL) or from pDatabase.
83980: ** SrcList.a[].zDatabase is filled with the database name from pTable,
83981: ** or with NULL if no database is specified.
83982: **
83983: ** In other words, if call like this:
83984: **
83985: ** sqlite3SrcListAppend(D,A,B,0);
83986: **
83987: ** Then B is a table name and the database name is unspecified. If called
83988: ** like this:
83989: **
83990: ** sqlite3SrcListAppend(D,A,B,C);
83991: **
83992: ** Then C is the table name and B is the database name. If C is defined
83993: ** then so is B. In other words, we never have a case where:
83994: **
83995: ** sqlite3SrcListAppend(D,A,0,C);
83996: **
83997: ** Both pTable and pDatabase are assumed to be quoted. They are dequoted
83998: ** before being added to the SrcList.
83999: */
84000: SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(
84001: sqlite3 *db, /* Connection to notify of malloc failures */
84002: SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */
84003: Token *pTable, /* Table to append */
84004: Token *pDatabase /* Database of the table */
84005: ){
84006: struct SrcList_item *pItem;
84007: assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */
84008: if( pList==0 ){
84009: pList = sqlite3DbMallocZero(db, sizeof(SrcList) );
84010: if( pList==0 ) return 0;
84011: pList->nAlloc = 1;
84012: }
84013: pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc);
84014: if( db->mallocFailed ){
84015: sqlite3SrcListDelete(db, pList);
84016: return 0;
84017: }
84018: pItem = &pList->a[pList->nSrc-1];
84019: if( pDatabase && pDatabase->z==0 ){
84020: pDatabase = 0;
84021: }
84022: if( pDatabase ){
84023: Token *pTemp = pDatabase;
84024: pDatabase = pTable;
84025: pTable = pTemp;
84026: }
84027: pItem->zName = sqlite3NameFromToken(db, pTable);
84028: pItem->zDatabase = sqlite3NameFromToken(db, pDatabase);
84029: return pList;
84030: }
84031:
84032: /*
84033: ** Assign VdbeCursor index numbers to all tables in a SrcList
84034: */
84035: SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){
84036: int i;
84037: struct SrcList_item *pItem;
84038: assert(pList || pParse->db->mallocFailed );
84039: if( pList ){
84040: for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
84041: if( pItem->iCursor>=0 ) break;
84042: pItem->iCursor = pParse->nTab++;
84043: if( pItem->pSelect ){
84044: sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc);
84045: }
84046: }
84047: }
84048: }
84049:
84050: /*
84051: ** Delete an entire SrcList including all its substructure.
84052: */
84053: SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
84054: int i;
84055: struct SrcList_item *pItem;
84056: if( pList==0 ) return;
84057: for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
84058: sqlite3DbFree(db, pItem->zDatabase);
84059: sqlite3DbFree(db, pItem->zName);
84060: sqlite3DbFree(db, pItem->zAlias);
84061: sqlite3DbFree(db, pItem->zIndex);
84062: sqlite3DeleteTable(db, pItem->pTab);
84063: sqlite3SelectDelete(db, pItem->pSelect);
84064: sqlite3ExprDelete(db, pItem->pOn);
84065: sqlite3IdListDelete(db, pItem->pUsing);
84066: }
84067: sqlite3DbFree(db, pList);
84068: }
84069:
84070: /*
84071: ** This routine is called by the parser to add a new term to the
84072: ** end of a growing FROM clause. The "p" parameter is the part of
84073: ** the FROM clause that has already been constructed. "p" is NULL
84074: ** if this is the first term of the FROM clause. pTable and pDatabase
84075: ** are the name of the table and database named in the FROM clause term.
84076: ** pDatabase is NULL if the database name qualifier is missing - the
84077: ** usual case. If the term has a alias, then pAlias points to the
84078: ** alias token. If the term is a subquery, then pSubquery is the
84079: ** SELECT statement that the subquery encodes. The pTable and
84080: ** pDatabase parameters are NULL for subqueries. The pOn and pUsing
84081: ** parameters are the content of the ON and USING clauses.
84082: **
84083: ** Return a new SrcList which encodes is the FROM with the new
84084: ** term added.
84085: */
84086: SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(
84087: Parse *pParse, /* Parsing context */
84088: SrcList *p, /* The left part of the FROM clause already seen */
84089: Token *pTable, /* Name of the table to add to the FROM clause */
84090: Token *pDatabase, /* Name of the database containing pTable */
84091: Token *pAlias, /* The right-hand side of the AS subexpression */
84092: Select *pSubquery, /* A subquery used in place of a table name */
84093: Expr *pOn, /* The ON clause of a join */
84094: IdList *pUsing /* The USING clause of a join */
84095: ){
84096: struct SrcList_item *pItem;
84097: sqlite3 *db = pParse->db;
84098: if( !p && (pOn || pUsing) ){
84099: sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s",
84100: (pOn ? "ON" : "USING")
84101: );
84102: goto append_from_error;
84103: }
84104: p = sqlite3SrcListAppend(db, p, pTable, pDatabase);
84105: if( p==0 || NEVER(p->nSrc==0) ){
84106: goto append_from_error;
84107: }
84108: pItem = &p->a[p->nSrc-1];
84109: assert( pAlias!=0 );
84110: if( pAlias->n ){
84111: pItem->zAlias = sqlite3NameFromToken(db, pAlias);
84112: }
84113: pItem->pSelect = pSubquery;
84114: pItem->pOn = pOn;
84115: pItem->pUsing = pUsing;
84116: return p;
84117:
84118: append_from_error:
84119: assert( p==0 );
84120: sqlite3ExprDelete(db, pOn);
84121: sqlite3IdListDelete(db, pUsing);
84122: sqlite3SelectDelete(db, pSubquery);
84123: return 0;
84124: }
84125:
84126: /*
84127: ** Add an INDEXED BY or NOT INDEXED clause to the most recently added
84128: ** element of the source-list passed as the second argument.
84129: */
84130: SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){
84131: assert( pIndexedBy!=0 );
84132: if( p && ALWAYS(p->nSrc>0) ){
84133: struct SrcList_item *pItem = &p->a[p->nSrc-1];
84134: assert( pItem->notIndexed==0 && pItem->zIndex==0 );
84135: if( pIndexedBy->n==1 && !pIndexedBy->z ){
84136: /* A "NOT INDEXED" clause was supplied. See parse.y
84137: ** construct "indexed_opt" for details. */
84138: pItem->notIndexed = 1;
84139: }else{
84140: pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy);
84141: }
84142: }
84143: }
84144:
84145: /*
84146: ** When building up a FROM clause in the parser, the join operator
84147: ** is initially attached to the left operand. But the code generator
84148: ** expects the join operator to be on the right operand. This routine
84149: ** Shifts all join operators from left to right for an entire FROM
84150: ** clause.
84151: **
84152: ** Example: Suppose the join is like this:
84153: **
84154: ** A natural cross join B
84155: **
84156: ** The operator is "natural cross join". The A and B operands are stored
84157: ** in p->a[0] and p->a[1], respectively. The parser initially stores the
84158: ** operator with A. This routine shifts that operator over to B.
84159: */
84160: SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){
84161: if( p ){
84162: int i;
84163: assert( p->a || p->nSrc==0 );
84164: for(i=p->nSrc-1; i>0; i--){
84165: p->a[i].jointype = p->a[i-1].jointype;
84166: }
84167: p->a[0].jointype = 0;
84168: }
84169: }
84170:
84171: /*
84172: ** Begin a transaction
84173: */
84174: SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){
84175: sqlite3 *db;
84176: Vdbe *v;
84177: int i;
84178:
84179: assert( pParse!=0 );
84180: db = pParse->db;
84181: assert( db!=0 );
84182: /* if( db->aDb[0].pBt==0 ) return; */
84183: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){
84184: return;
84185: }
84186: v = sqlite3GetVdbe(pParse);
84187: if( !v ) return;
84188: if( type!=TK_DEFERRED ){
84189: for(i=0; i<db->nDb; i++){
84190: sqlite3VdbeAddOp2(v, OP_Transaction, i, (type==TK_EXCLUSIVE)+1);
84191: sqlite3VdbeUsesBtree(v, i);
84192: }
84193: }
84194: sqlite3VdbeAddOp2(v, OP_AutoCommit, 0, 0);
84195: }
84196:
84197: /*
84198: ** Commit a transaction
84199: */
84200: SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){
84201: Vdbe *v;
84202:
84203: assert( pParse!=0 );
84204: assert( pParse->db!=0 );
84205: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){
84206: return;
84207: }
84208: v = sqlite3GetVdbe(pParse);
84209: if( v ){
84210: sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 0);
84211: }
84212: }
84213:
84214: /*
84215: ** Rollback a transaction
84216: */
84217: SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){
84218: Vdbe *v;
84219:
84220: assert( pParse!=0 );
84221: assert( pParse->db!=0 );
84222: if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){
84223: return;
84224: }
84225: v = sqlite3GetVdbe(pParse);
84226: if( v ){
84227: sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1);
84228: }
84229: }
84230:
84231: /*
84232: ** This function is called by the parser when it parses a command to create,
84233: ** release or rollback an SQL savepoint.
84234: */
84235: SQLITE_PRIVATE void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
84236: char *zName = sqlite3NameFromToken(pParse->db, pName);
84237: if( zName ){
84238: Vdbe *v = sqlite3GetVdbe(pParse);
84239: #ifndef SQLITE_OMIT_AUTHORIZATION
84240: static const char * const az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
84241: assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
84242: #endif
84243: if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
84244: sqlite3DbFree(pParse->db, zName);
84245: return;
84246: }
84247: sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC);
84248: }
84249: }
84250:
84251: /*
84252: ** Make sure the TEMP database is open and available for use. Return
84253: ** the number of errors. Leave any error messages in the pParse structure.
84254: */
84255: SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){
84256: sqlite3 *db = pParse->db;
84257: if( db->aDb[1].pBt==0 && !pParse->explain ){
84258: int rc;
84259: Btree *pBt;
84260: static const int flags =
84261: SQLITE_OPEN_READWRITE |
84262: SQLITE_OPEN_CREATE |
84263: SQLITE_OPEN_EXCLUSIVE |
84264: SQLITE_OPEN_DELETEONCLOSE |
84265: SQLITE_OPEN_TEMP_DB;
84266:
84267: rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pBt, 0, flags);
84268: if( rc!=SQLITE_OK ){
84269: sqlite3ErrorMsg(pParse, "unable to open a temporary database "
84270: "file for storing temporary tables");
84271: pParse->rc = rc;
84272: return 1;
84273: }
84274: db->aDb[1].pBt = pBt;
84275: assert( db->aDb[1].pSchema );
84276: if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){
84277: db->mallocFailed = 1;
84278: return 1;
84279: }
84280: }
84281: return 0;
84282: }
84283:
84284: /*
84285: ** Generate VDBE code that will verify the schema cookie and start
84286: ** a read-transaction for all named database files.
84287: **
84288: ** It is important that all schema cookies be verified and all
84289: ** read transactions be started before anything else happens in
84290: ** the VDBE program. But this routine can be called after much other
84291: ** code has been generated. So here is what we do:
84292: **
84293: ** The first time this routine is called, we code an OP_Goto that
84294: ** will jump to a subroutine at the end of the program. Then we
84295: ** record every database that needs its schema verified in the
84296: ** pParse->cookieMask field. Later, after all other code has been
84297: ** generated, the subroutine that does the cookie verifications and
84298: ** starts the transactions will be coded and the OP_Goto P2 value
84299: ** will be made to point to that subroutine. The generation of the
84300: ** cookie verification subroutine code happens in sqlite3FinishCoding().
84301: **
84302: ** If iDb<0 then code the OP_Goto only - don't set flag to verify the
84303: ** schema on any databases. This can be used to position the OP_Goto
84304: ** early in the code, before we know if any database tables will be used.
84305: */
84306: SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
84307: Parse *pToplevel = sqlite3ParseToplevel(pParse);
84308:
1.2.2.1 ! misho 84309: #ifndef SQLITE_OMIT_TRIGGER
! 84310: if( pToplevel!=pParse ){
! 84311: /* This branch is taken if a trigger is currently being coded. In this
! 84312: ** case, set cookieGoto to a non-zero value to show that this function
! 84313: ** has been called. This is used by the sqlite3ExprCodeConstants()
! 84314: ** function. */
! 84315: pParse->cookieGoto = -1;
! 84316: }
! 84317: #endif
1.2 misho 84318: if( pToplevel->cookieGoto==0 ){
84319: Vdbe *v = sqlite3GetVdbe(pToplevel);
84320: if( v==0 ) return; /* This only happens if there was a prior error */
84321: pToplevel->cookieGoto = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0)+1;
84322: }
84323: if( iDb>=0 ){
84324: sqlite3 *db = pToplevel->db;
84325: yDbMask mask;
84326:
84327: assert( iDb<db->nDb );
84328: assert( db->aDb[iDb].pBt!=0 || iDb==1 );
84329: assert( iDb<SQLITE_MAX_ATTACHED+2 );
84330: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
84331: mask = ((yDbMask)1)<<iDb;
84332: if( (pToplevel->cookieMask & mask)==0 ){
84333: pToplevel->cookieMask |= mask;
84334: pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
84335: if( !OMIT_TEMPDB && iDb==1 ){
84336: sqlite3OpenTempDatabase(pToplevel);
84337: }
84338: }
84339: }
84340: }
84341:
84342: /*
84343: ** If argument zDb is NULL, then call sqlite3CodeVerifySchema() for each
84344: ** attached database. Otherwise, invoke it for the database named zDb only.
84345: */
84346: SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb){
84347: sqlite3 *db = pParse->db;
84348: int i;
84349: for(i=0; i<db->nDb; i++){
84350: Db *pDb = &db->aDb[i];
84351: if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zName)) ){
84352: sqlite3CodeVerifySchema(pParse, i);
84353: }
84354: }
84355: }
84356:
84357: /*
84358: ** Generate VDBE code that prepares for doing an operation that
84359: ** might change the database.
84360: **
84361: ** This routine starts a new transaction if we are not already within
84362: ** a transaction. If we are already within a transaction, then a checkpoint
84363: ** is set if the setStatement parameter is true. A checkpoint should
84364: ** be set for operations that might fail (due to a constraint) part of
84365: ** the way through and which will need to undo some writes without having to
84366: ** rollback the whole transaction. For operations where all constraints
84367: ** can be checked before any changes are made to the database, it is never
84368: ** necessary to undo a write and the checkpoint should not be set.
84369: */
84370: SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
84371: Parse *pToplevel = sqlite3ParseToplevel(pParse);
84372: sqlite3CodeVerifySchema(pParse, iDb);
84373: pToplevel->writeMask |= ((yDbMask)1)<<iDb;
84374: pToplevel->isMultiWrite |= setStatement;
84375: }
84376:
84377: /*
84378: ** Indicate that the statement currently under construction might write
84379: ** more than one entry (example: deleting one row then inserting another,
84380: ** inserting multiple rows in a table, or inserting a row and index entries.)
84381: ** If an abort occurs after some of these writes have completed, then it will
84382: ** be necessary to undo the completed writes.
84383: */
84384: SQLITE_PRIVATE void sqlite3MultiWrite(Parse *pParse){
84385: Parse *pToplevel = sqlite3ParseToplevel(pParse);
84386: pToplevel->isMultiWrite = 1;
84387: }
84388:
84389: /*
84390: ** The code generator calls this routine if is discovers that it is
84391: ** possible to abort a statement prior to completion. In order to
84392: ** perform this abort without corrupting the database, we need to make
84393: ** sure that the statement is protected by a statement transaction.
84394: **
84395: ** Technically, we only need to set the mayAbort flag if the
84396: ** isMultiWrite flag was previously set. There is a time dependency
84397: ** such that the abort must occur after the multiwrite. This makes
84398: ** some statements involving the REPLACE conflict resolution algorithm
84399: ** go a little faster. But taking advantage of this time dependency
84400: ** makes it more difficult to prove that the code is correct (in
84401: ** particular, it prevents us from writing an effective
84402: ** implementation of sqlite3AssertMayAbort()) and so we have chosen
84403: ** to take the safe route and skip the optimization.
84404: */
84405: SQLITE_PRIVATE void sqlite3MayAbort(Parse *pParse){
84406: Parse *pToplevel = sqlite3ParseToplevel(pParse);
84407: pToplevel->mayAbort = 1;
84408: }
84409:
84410: /*
84411: ** Code an OP_Halt that causes the vdbe to return an SQLITE_CONSTRAINT
84412: ** error. The onError parameter determines which (if any) of the statement
84413: ** and/or current transaction is rolled back.
84414: */
84415: SQLITE_PRIVATE void sqlite3HaltConstraint(Parse *pParse, int onError, char *p4, int p4type){
84416: Vdbe *v = sqlite3GetVdbe(pParse);
84417: if( onError==OE_Abort ){
84418: sqlite3MayAbort(pParse);
84419: }
84420: sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CONSTRAINT, onError, 0, p4, p4type);
84421: }
84422:
84423: /*
84424: ** Check to see if pIndex uses the collating sequence pColl. Return
84425: ** true if it does and false if it does not.
84426: */
84427: #ifndef SQLITE_OMIT_REINDEX
84428: static int collationMatch(const char *zColl, Index *pIndex){
84429: int i;
84430: assert( zColl!=0 );
84431: for(i=0; i<pIndex->nColumn; i++){
84432: const char *z = pIndex->azColl[i];
84433: assert( z!=0 );
84434: if( 0==sqlite3StrICmp(z, zColl) ){
84435: return 1;
84436: }
84437: }
84438: return 0;
84439: }
84440: #endif
84441:
84442: /*
84443: ** Recompute all indices of pTab that use the collating sequence pColl.
84444: ** If pColl==0 then recompute all indices of pTab.
84445: */
84446: #ifndef SQLITE_OMIT_REINDEX
84447: static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){
84448: Index *pIndex; /* An index associated with pTab */
84449:
84450: for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
84451: if( zColl==0 || collationMatch(zColl, pIndex) ){
84452: int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
84453: sqlite3BeginWriteOperation(pParse, 0, iDb);
84454: sqlite3RefillIndex(pParse, pIndex, -1);
84455: }
84456: }
84457: }
84458: #endif
84459:
84460: /*
84461: ** Recompute all indices of all tables in all databases where the
84462: ** indices use the collating sequence pColl. If pColl==0 then recompute
84463: ** all indices everywhere.
84464: */
84465: #ifndef SQLITE_OMIT_REINDEX
84466: static void reindexDatabases(Parse *pParse, char const *zColl){
84467: Db *pDb; /* A single database */
84468: int iDb; /* The database index number */
84469: sqlite3 *db = pParse->db; /* The database connection */
84470: HashElem *k; /* For looping over tables in pDb */
84471: Table *pTab; /* A table in the database */
84472:
84473: assert( sqlite3BtreeHoldsAllMutexes(db) ); /* Needed for schema access */
84474: for(iDb=0, pDb=db->aDb; iDb<db->nDb; iDb++, pDb++){
84475: assert( pDb!=0 );
84476: for(k=sqliteHashFirst(&pDb->pSchema->tblHash); k; k=sqliteHashNext(k)){
84477: pTab = (Table*)sqliteHashData(k);
84478: reindexTable(pParse, pTab, zColl);
84479: }
84480: }
84481: }
84482: #endif
84483:
84484: /*
84485: ** Generate code for the REINDEX command.
84486: **
84487: ** REINDEX -- 1
84488: ** REINDEX <collation> -- 2
84489: ** REINDEX ?<database>.?<tablename> -- 3
84490: ** REINDEX ?<database>.?<indexname> -- 4
84491: **
84492: ** Form 1 causes all indices in all attached databases to be rebuilt.
84493: ** Form 2 rebuilds all indices in all databases that use the named
84494: ** collating function. Forms 3 and 4 rebuild the named index or all
84495: ** indices associated with the named table.
84496: */
84497: #ifndef SQLITE_OMIT_REINDEX
84498: SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){
84499: CollSeq *pColl; /* Collating sequence to be reindexed, or NULL */
84500: char *z; /* Name of a table or index */
84501: const char *zDb; /* Name of the database */
84502: Table *pTab; /* A table in the database */
84503: Index *pIndex; /* An index associated with pTab */
84504: int iDb; /* The database index number */
84505: sqlite3 *db = pParse->db; /* The database connection */
84506: Token *pObjName; /* Name of the table or index to be reindexed */
84507:
84508: /* Read the database schema. If an error occurs, leave an error message
84509: ** and code in pParse and return NULL. */
84510: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
84511: return;
84512: }
84513:
84514: if( pName1==0 ){
84515: reindexDatabases(pParse, 0);
84516: return;
84517: }else if( NEVER(pName2==0) || pName2->z==0 ){
84518: char *zColl;
84519: assert( pName1->z );
84520: zColl = sqlite3NameFromToken(pParse->db, pName1);
84521: if( !zColl ) return;
84522: pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0);
84523: if( pColl ){
84524: reindexDatabases(pParse, zColl);
84525: sqlite3DbFree(db, zColl);
84526: return;
84527: }
84528: sqlite3DbFree(db, zColl);
84529: }
84530: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
84531: if( iDb<0 ) return;
84532: z = sqlite3NameFromToken(db, pObjName);
84533: if( z==0 ) return;
84534: zDb = db->aDb[iDb].zName;
84535: pTab = sqlite3FindTable(db, z, zDb);
84536: if( pTab ){
84537: reindexTable(pParse, pTab, 0);
84538: sqlite3DbFree(db, z);
84539: return;
84540: }
84541: pIndex = sqlite3FindIndex(db, z, zDb);
84542: sqlite3DbFree(db, z);
84543: if( pIndex ){
84544: sqlite3BeginWriteOperation(pParse, 0, iDb);
84545: sqlite3RefillIndex(pParse, pIndex, -1);
84546: return;
84547: }
84548: sqlite3ErrorMsg(pParse, "unable to identify the object to be reindexed");
84549: }
84550: #endif
84551:
84552: /*
84553: ** Return a dynamicly allocated KeyInfo structure that can be used
84554: ** with OP_OpenRead or OP_OpenWrite to access database index pIdx.
84555: **
84556: ** If successful, a pointer to the new structure is returned. In this case
84557: ** the caller is responsible for calling sqlite3DbFree(db, ) on the returned
84558: ** pointer. If an error occurs (out of memory or missing collation
84559: ** sequence), NULL is returned and the state of pParse updated to reflect
84560: ** the error.
84561: */
84562: SQLITE_PRIVATE KeyInfo *sqlite3IndexKeyinfo(Parse *pParse, Index *pIdx){
84563: int i;
84564: int nCol = pIdx->nColumn;
84565: int nBytes = sizeof(KeyInfo) + (nCol-1)*sizeof(CollSeq*) + nCol;
84566: sqlite3 *db = pParse->db;
84567: KeyInfo *pKey = (KeyInfo *)sqlite3DbMallocZero(db, nBytes);
84568:
84569: if( pKey ){
84570: pKey->db = pParse->db;
84571: pKey->aSortOrder = (u8 *)&(pKey->aColl[nCol]);
84572: assert( &pKey->aSortOrder[nCol]==&(((u8 *)pKey)[nBytes]) );
84573: for(i=0; i<nCol; i++){
84574: char *zColl = pIdx->azColl[i];
84575: assert( zColl );
84576: pKey->aColl[i] = sqlite3LocateCollSeq(pParse, zColl);
84577: pKey->aSortOrder[i] = pIdx->aSortOrder[i];
84578: }
84579: pKey->nField = (u16)nCol;
84580: }
84581:
84582: if( pParse->nErr ){
84583: sqlite3DbFree(db, pKey);
84584: pKey = 0;
84585: }
84586: return pKey;
84587: }
84588:
84589: /************** End of build.c ***********************************************/
84590: /************** Begin file callback.c ****************************************/
84591: /*
84592: ** 2005 May 23
84593: **
84594: ** The author disclaims copyright to this source code. In place of
84595: ** a legal notice, here is a blessing:
84596: **
84597: ** May you do good and not evil.
84598: ** May you find forgiveness for yourself and forgive others.
84599: ** May you share freely, never taking more than you give.
84600: **
84601: *************************************************************************
84602: **
84603: ** This file contains functions used to access the internal hash tables
84604: ** of user defined functions and collation sequences.
84605: */
84606:
84607:
84608: /*
84609: ** Invoke the 'collation needed' callback to request a collation sequence
84610: ** in the encoding enc of name zName, length nName.
84611: */
84612: static void callCollNeeded(sqlite3 *db, int enc, const char *zName){
84613: assert( !db->xCollNeeded || !db->xCollNeeded16 );
84614: if( db->xCollNeeded ){
84615: char *zExternal = sqlite3DbStrDup(db, zName);
84616: if( !zExternal ) return;
84617: db->xCollNeeded(db->pCollNeededArg, db, enc, zExternal);
84618: sqlite3DbFree(db, zExternal);
84619: }
84620: #ifndef SQLITE_OMIT_UTF16
84621: if( db->xCollNeeded16 ){
84622: char const *zExternal;
84623: sqlite3_value *pTmp = sqlite3ValueNew(db);
84624: sqlite3ValueSetStr(pTmp, -1, zName, SQLITE_UTF8, SQLITE_STATIC);
84625: zExternal = sqlite3ValueText(pTmp, SQLITE_UTF16NATIVE);
84626: if( zExternal ){
84627: db->xCollNeeded16(db->pCollNeededArg, db, (int)ENC(db), zExternal);
84628: }
84629: sqlite3ValueFree(pTmp);
84630: }
84631: #endif
84632: }
84633:
84634: /*
84635: ** This routine is called if the collation factory fails to deliver a
84636: ** collation function in the best encoding but there may be other versions
84637: ** of this collation function (for other text encodings) available. Use one
84638: ** of these instead if they exist. Avoid a UTF-8 <-> UTF-16 conversion if
84639: ** possible.
84640: */
84641: static int synthCollSeq(sqlite3 *db, CollSeq *pColl){
84642: CollSeq *pColl2;
84643: char *z = pColl->zName;
84644: int i;
84645: static const u8 aEnc[] = { SQLITE_UTF16BE, SQLITE_UTF16LE, SQLITE_UTF8 };
84646: for(i=0; i<3; i++){
84647: pColl2 = sqlite3FindCollSeq(db, aEnc[i], z, 0);
84648: if( pColl2->xCmp!=0 ){
84649: memcpy(pColl, pColl2, sizeof(CollSeq));
84650: pColl->xDel = 0; /* Do not copy the destructor */
84651: return SQLITE_OK;
84652: }
84653: }
84654: return SQLITE_ERROR;
84655: }
84656:
84657: /*
84658: ** This function is responsible for invoking the collation factory callback
84659: ** or substituting a collation sequence of a different encoding when the
84660: ** requested collation sequence is not available in the desired encoding.
84661: **
84662: ** If it is not NULL, then pColl must point to the database native encoding
84663: ** collation sequence with name zName, length nName.
84664: **
84665: ** The return value is either the collation sequence to be used in database
84666: ** db for collation type name zName, length nName, or NULL, if no collation
1.2.2.1 ! misho 84667: ** sequence can be found. If no collation is found, leave an error message.
1.2 misho 84668: **
84669: ** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq()
84670: */
84671: SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(
1.2.2.1 ! misho 84672: Parse *pParse, /* Parsing context */
1.2 misho 84673: u8 enc, /* The desired encoding for the collating sequence */
84674: CollSeq *pColl, /* Collating sequence with native encoding, or NULL */
84675: const char *zName /* Collating sequence name */
84676: ){
84677: CollSeq *p;
1.2.2.1 ! misho 84678: sqlite3 *db = pParse->db;
1.2 misho 84679:
84680: p = pColl;
84681: if( !p ){
84682: p = sqlite3FindCollSeq(db, enc, zName, 0);
84683: }
84684: if( !p || !p->xCmp ){
84685: /* No collation sequence of this type for this encoding is registered.
84686: ** Call the collation factory to see if it can supply us with one.
84687: */
84688: callCollNeeded(db, enc, zName);
84689: p = sqlite3FindCollSeq(db, enc, zName, 0);
84690: }
84691: if( p && !p->xCmp && synthCollSeq(db, p) ){
84692: p = 0;
84693: }
84694: assert( !p || p->xCmp );
1.2.2.1 ! misho 84695: if( p==0 ){
! 84696: sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName);
! 84697: }
1.2 misho 84698: return p;
84699: }
84700:
84701: /*
84702: ** This routine is called on a collation sequence before it is used to
84703: ** check that it is defined. An undefined collation sequence exists when
84704: ** a database is loaded that contains references to collation sequences
84705: ** that have not been defined by sqlite3_create_collation() etc.
84706: **
84707: ** If required, this routine calls the 'collation needed' callback to
84708: ** request a definition of the collating sequence. If this doesn't work,
84709: ** an equivalent collating sequence that uses a text encoding different
84710: ** from the main database is substituted, if one is available.
84711: */
84712: SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){
84713: if( pColl ){
84714: const char *zName = pColl->zName;
84715: sqlite3 *db = pParse->db;
1.2.2.1 ! misho 84716: CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName);
1.2 misho 84717: if( !p ){
84718: return SQLITE_ERROR;
84719: }
84720: assert( p==pColl );
84721: }
84722: return SQLITE_OK;
84723: }
84724:
84725:
84726:
84727: /*
84728: ** Locate and return an entry from the db.aCollSeq hash table. If the entry
84729: ** specified by zName and nName is not found and parameter 'create' is
84730: ** true, then create a new entry. Otherwise return NULL.
84731: **
84732: ** Each pointer stored in the sqlite3.aCollSeq hash table contains an
84733: ** array of three CollSeq structures. The first is the collation sequence
84734: ** prefferred for UTF-8, the second UTF-16le, and the third UTF-16be.
84735: **
84736: ** Stored immediately after the three collation sequences is a copy of
84737: ** the collation sequence name. A pointer to this string is stored in
84738: ** each collation sequence structure.
84739: */
84740: static CollSeq *findCollSeqEntry(
84741: sqlite3 *db, /* Database connection */
84742: const char *zName, /* Name of the collating sequence */
84743: int create /* Create a new entry if true */
84744: ){
84745: CollSeq *pColl;
84746: int nName = sqlite3Strlen30(zName);
84747: pColl = sqlite3HashFind(&db->aCollSeq, zName, nName);
84748:
84749: if( 0==pColl && create ){
84750: pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName + 1 );
84751: if( pColl ){
84752: CollSeq *pDel = 0;
84753: pColl[0].zName = (char*)&pColl[3];
84754: pColl[0].enc = SQLITE_UTF8;
84755: pColl[1].zName = (char*)&pColl[3];
84756: pColl[1].enc = SQLITE_UTF16LE;
84757: pColl[2].zName = (char*)&pColl[3];
84758: pColl[2].enc = SQLITE_UTF16BE;
84759: memcpy(pColl[0].zName, zName, nName);
84760: pColl[0].zName[nName] = 0;
84761: pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, nName, pColl);
84762:
84763: /* If a malloc() failure occurred in sqlite3HashInsert(), it will
84764: ** return the pColl pointer to be deleted (because it wasn't added
84765: ** to the hash table).
84766: */
84767: assert( pDel==0 || pDel==pColl );
84768: if( pDel!=0 ){
84769: db->mallocFailed = 1;
84770: sqlite3DbFree(db, pDel);
84771: pColl = 0;
84772: }
84773: }
84774: }
84775: return pColl;
84776: }
84777:
84778: /*
84779: ** Parameter zName points to a UTF-8 encoded string nName bytes long.
84780: ** Return the CollSeq* pointer for the collation sequence named zName
84781: ** for the encoding 'enc' from the database 'db'.
84782: **
84783: ** If the entry specified is not found and 'create' is true, then create a
84784: ** new entry. Otherwise return NULL.
84785: **
84786: ** A separate function sqlite3LocateCollSeq() is a wrapper around
84787: ** this routine. sqlite3LocateCollSeq() invokes the collation factory
84788: ** if necessary and generates an error message if the collating sequence
84789: ** cannot be found.
84790: **
84791: ** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq()
84792: */
84793: SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(
84794: sqlite3 *db,
84795: u8 enc,
84796: const char *zName,
84797: int create
84798: ){
84799: CollSeq *pColl;
84800: if( zName ){
84801: pColl = findCollSeqEntry(db, zName, create);
84802: }else{
84803: pColl = db->pDfltColl;
84804: }
84805: assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
84806: assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE );
84807: if( pColl ) pColl += enc-1;
84808: return pColl;
84809: }
84810:
84811: /* During the search for the best function definition, this procedure
84812: ** is called to test how well the function passed as the first argument
84813: ** matches the request for a function with nArg arguments in a system
84814: ** that uses encoding enc. The value returned indicates how well the
84815: ** request is matched. A higher value indicates a better match.
84816: **
1.2.2.1 ! misho 84817: ** If nArg is -1 that means to only return a match (non-zero) if p->nArg
! 84818: ** is also -1. In other words, we are searching for a function that
! 84819: ** takes a variable number of arguments.
! 84820: **
! 84821: ** If nArg is -2 that means that we are searching for any function
! 84822: ** regardless of the number of arguments it uses, so return a positive
! 84823: ** match score for any
! 84824: **
1.2 misho 84825: ** The returned value is always between 0 and 6, as follows:
84826: **
1.2.2.1 ! misho 84827: ** 0: Not a match.
! 84828: ** 1: UTF8/16 conversion required and function takes any number of arguments.
! 84829: ** 2: UTF16 byte order change required and function takes any number of args.
! 84830: ** 3: encoding matches and function takes any number of arguments
! 84831: ** 4: UTF8/16 conversion required - argument count matches exactly
! 84832: ** 5: UTF16 byte order conversion required - argument count matches exactly
! 84833: ** 6: Perfect match: encoding and argument count match exactly.
! 84834: **
! 84835: ** If nArg==(-2) then any function with a non-null xStep or xFunc is
! 84836: ** a perfect match and any function with both xStep and xFunc NULL is
! 84837: ** a non-match.
! 84838: */
! 84839: #define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */
! 84840: static int matchQuality(
! 84841: FuncDef *p, /* The function we are evaluating for match quality */
! 84842: int nArg, /* Desired number of arguments. (-1)==any */
! 84843: u8 enc /* Desired text encoding */
! 84844: ){
! 84845: int match;
! 84846:
! 84847: /* nArg of -2 is a special case */
! 84848: if( nArg==(-2) ) return (p->xFunc==0 && p->xStep==0) ? 0 : FUNC_PERFECT_MATCH;
! 84849:
! 84850: /* Wrong number of arguments means "no match" */
! 84851: if( p->nArg!=nArg && p->nArg>=0 ) return 0;
! 84852:
! 84853: /* Give a better score to a function with a specific number of arguments
! 84854: ** than to function that accepts any number of arguments. */
! 84855: if( p->nArg==nArg ){
! 84856: match = 4;
! 84857: }else{
1.2 misho 84858: match = 1;
84859: }
1.2.2.1 ! misho 84860:
! 84861: /* Bonus points if the text encoding matches */
! 84862: if( enc==p->iPrefEnc ){
! 84863: match += 2; /* Exact encoding match */
! 84864: }else if( (enc & p->iPrefEnc & 2)!=0 ){
! 84865: match += 1; /* Both are UTF16, but with different byte orders */
! 84866: }
! 84867:
1.2 misho 84868: return match;
84869: }
84870:
84871: /*
84872: ** Search a FuncDefHash for a function with the given name. Return
84873: ** a pointer to the matching FuncDef if found, or 0 if there is no match.
84874: */
84875: static FuncDef *functionSearch(
84876: FuncDefHash *pHash, /* Hash table to search */
84877: int h, /* Hash of the name */
84878: const char *zFunc, /* Name of function */
84879: int nFunc /* Number of bytes in zFunc */
84880: ){
84881: FuncDef *p;
84882: for(p=pHash->a[h]; p; p=p->pHash){
84883: if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 && p->zName[nFunc]==0 ){
84884: return p;
84885: }
84886: }
84887: return 0;
84888: }
84889:
84890: /*
84891: ** Insert a new FuncDef into a FuncDefHash hash table.
84892: */
84893: SQLITE_PRIVATE void sqlite3FuncDefInsert(
84894: FuncDefHash *pHash, /* The hash table into which to insert */
84895: FuncDef *pDef /* The function definition to insert */
84896: ){
84897: FuncDef *pOther;
84898: int nName = sqlite3Strlen30(pDef->zName);
84899: u8 c1 = (u8)pDef->zName[0];
84900: int h = (sqlite3UpperToLower[c1] + nName) % ArraySize(pHash->a);
84901: pOther = functionSearch(pHash, h, pDef->zName, nName);
84902: if( pOther ){
84903: assert( pOther!=pDef && pOther->pNext!=pDef );
84904: pDef->pNext = pOther->pNext;
84905: pOther->pNext = pDef;
84906: }else{
84907: pDef->pNext = 0;
84908: pDef->pHash = pHash->a[h];
84909: pHash->a[h] = pDef;
84910: }
84911: }
84912:
84913:
84914:
84915: /*
84916: ** Locate a user function given a name, a number of arguments and a flag
84917: ** indicating whether the function prefers UTF-16 over UTF-8. Return a
84918: ** pointer to the FuncDef structure that defines that function, or return
84919: ** NULL if the function does not exist.
84920: **
84921: ** If the createFlag argument is true, then a new (blank) FuncDef
84922: ** structure is created and liked into the "db" structure if a
1.2.2.1 ! misho 84923: ** no matching function previously existed.
! 84924: **
! 84925: ** If nArg is -2, then the first valid function found is returned. A
! 84926: ** function is valid if either xFunc or xStep is non-zero. The nArg==(-2)
! 84927: ** case is used to see if zName is a valid function name for some number
! 84928: ** of arguments. If nArg is -2, then createFlag must be 0.
1.2 misho 84929: **
84930: ** If createFlag is false, then a function with the required name and
84931: ** number of arguments may be returned even if the eTextRep flag does not
84932: ** match that requested.
84933: */
84934: SQLITE_PRIVATE FuncDef *sqlite3FindFunction(
84935: sqlite3 *db, /* An open database */
84936: const char *zName, /* Name of the function. Not null-terminated */
84937: int nName, /* Number of characters in the name */
84938: int nArg, /* Number of arguments. -1 means any number */
84939: u8 enc, /* Preferred text encoding */
1.2.2.1 ! misho 84940: u8 createFlag /* Create new entry if true and does not otherwise exist */
1.2 misho 84941: ){
84942: FuncDef *p; /* Iterator variable */
84943: FuncDef *pBest = 0; /* Best match found so far */
84944: int bestScore = 0; /* Score of best match */
84945: int h; /* Hash value */
84946:
1.2.2.1 ! misho 84947: assert( nArg>=(-2) );
! 84948: assert( nArg>=(-1) || createFlag==0 );
1.2 misho 84949: assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE );
84950: h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a);
84951:
84952: /* First search for a match amongst the application-defined functions.
84953: */
84954: p = functionSearch(&db->aFunc, h, zName, nName);
84955: while( p ){
84956: int score = matchQuality(p, nArg, enc);
84957: if( score>bestScore ){
84958: pBest = p;
84959: bestScore = score;
84960: }
84961: p = p->pNext;
84962: }
84963:
84964: /* If no match is found, search the built-in functions.
84965: **
84966: ** If the SQLITE_PreferBuiltin flag is set, then search the built-in
84967: ** functions even if a prior app-defined function was found. And give
84968: ** priority to built-in functions.
84969: **
84970: ** Except, if createFlag is true, that means that we are trying to
84971: ** install a new function. Whatever FuncDef structure is returned it will
84972: ** have fields overwritten with new information appropriate for the
84973: ** new function. But the FuncDefs for built-in functions are read-only.
84974: ** So we must not search for built-ins when creating a new function.
84975: */
84976: if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){
84977: FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
84978: bestScore = 0;
84979: p = functionSearch(pHash, h, zName, nName);
84980: while( p ){
84981: int score = matchQuality(p, nArg, enc);
84982: if( score>bestScore ){
84983: pBest = p;
84984: bestScore = score;
84985: }
84986: p = p->pNext;
84987: }
84988: }
84989:
84990: /* If the createFlag parameter is true and the search did not reveal an
84991: ** exact match for the name, number of arguments and encoding, then add a
84992: ** new entry to the hash table and return it.
84993: */
1.2.2.1 ! misho 84994: if( createFlag && bestScore<FUNC_PERFECT_MATCH &&
1.2 misho 84995: (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){
84996: pBest->zName = (char *)&pBest[1];
84997: pBest->nArg = (u16)nArg;
84998: pBest->iPrefEnc = enc;
84999: memcpy(pBest->zName, zName, nName);
85000: pBest->zName[nName] = 0;
85001: sqlite3FuncDefInsert(&db->aFunc, pBest);
85002: }
85003:
85004: if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){
85005: return pBest;
85006: }
85007: return 0;
85008: }
85009:
85010: /*
85011: ** Free all resources held by the schema structure. The void* argument points
85012: ** at a Schema struct. This function does not call sqlite3DbFree(db, ) on the
85013: ** pointer itself, it just cleans up subsidiary resources (i.e. the contents
85014: ** of the schema hash tables).
85015: **
85016: ** The Schema.cache_size variable is not cleared.
85017: */
85018: SQLITE_PRIVATE void sqlite3SchemaClear(void *p){
85019: Hash temp1;
85020: Hash temp2;
85021: HashElem *pElem;
85022: Schema *pSchema = (Schema *)p;
85023:
85024: temp1 = pSchema->tblHash;
85025: temp2 = pSchema->trigHash;
85026: sqlite3HashInit(&pSchema->trigHash);
85027: sqlite3HashClear(&pSchema->idxHash);
85028: for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
85029: sqlite3DeleteTrigger(0, (Trigger*)sqliteHashData(pElem));
85030: }
85031: sqlite3HashClear(&temp2);
85032: sqlite3HashInit(&pSchema->tblHash);
85033: for(pElem=sqliteHashFirst(&temp1); pElem; pElem=sqliteHashNext(pElem)){
85034: Table *pTab = sqliteHashData(pElem);
85035: sqlite3DeleteTable(0, pTab);
85036: }
85037: sqlite3HashClear(&temp1);
85038: sqlite3HashClear(&pSchema->fkeyHash);
85039: pSchema->pSeqTab = 0;
85040: if( pSchema->flags & DB_SchemaLoaded ){
85041: pSchema->iGeneration++;
85042: pSchema->flags &= ~DB_SchemaLoaded;
85043: }
85044: }
85045:
85046: /*
85047: ** Find and return the schema associated with a BTree. Create
85048: ** a new one if necessary.
85049: */
85050: SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){
85051: Schema * p;
85052: if( pBt ){
85053: p = (Schema *)sqlite3BtreeSchema(pBt, sizeof(Schema), sqlite3SchemaClear);
85054: }else{
85055: p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema));
85056: }
85057: if( !p ){
85058: db->mallocFailed = 1;
85059: }else if ( 0==p->file_format ){
85060: sqlite3HashInit(&p->tblHash);
85061: sqlite3HashInit(&p->idxHash);
85062: sqlite3HashInit(&p->trigHash);
85063: sqlite3HashInit(&p->fkeyHash);
85064: p->enc = SQLITE_UTF8;
85065: }
85066: return p;
85067: }
85068:
85069: /************** End of callback.c ********************************************/
85070: /************** Begin file delete.c ******************************************/
85071: /*
85072: ** 2001 September 15
85073: **
85074: ** The author disclaims copyright to this source code. In place of
85075: ** a legal notice, here is a blessing:
85076: **
85077: ** May you do good and not evil.
85078: ** May you find forgiveness for yourself and forgive others.
85079: ** May you share freely, never taking more than you give.
85080: **
85081: *************************************************************************
85082: ** This file contains C code routines that are called by the parser
85083: ** in order to generate code for DELETE FROM statements.
85084: */
85085:
85086: /*
85087: ** While a SrcList can in general represent multiple tables and subqueries
85088: ** (as in the FROM clause of a SELECT statement) in this case it contains
85089: ** the name of a single table, as one might find in an INSERT, DELETE,
85090: ** or UPDATE statement. Look up that table in the symbol table and
85091: ** return a pointer. Set an error message and return NULL if the table
85092: ** name is not found or if any other error occurs.
85093: **
85094: ** The following fields are initialized appropriate in pSrc:
85095: **
85096: ** pSrc->a[0].pTab Pointer to the Table object
85097: ** pSrc->a[0].pIndex Pointer to the INDEXED BY index, if there is one
85098: **
85099: */
85100: SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){
85101: struct SrcList_item *pItem = pSrc->a;
85102: Table *pTab;
85103: assert( pItem && pSrc->nSrc==1 );
1.2.2.1 ! misho 85104: pTab = sqlite3LocateTableItem(pParse, 0, pItem);
1.2 misho 85105: sqlite3DeleteTable(pParse->db, pItem->pTab);
85106: pItem->pTab = pTab;
85107: if( pTab ){
85108: pTab->nRef++;
85109: }
85110: if( sqlite3IndexedByLookup(pParse, pItem) ){
85111: pTab = 0;
85112: }
85113: return pTab;
85114: }
85115:
85116: /*
85117: ** Check to make sure the given table is writable. If it is not
85118: ** writable, generate an error message and return 1. If it is
85119: ** writable return 0;
85120: */
85121: SQLITE_PRIVATE int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){
85122: /* A table is not writable under the following circumstances:
85123: **
85124: ** 1) It is a virtual table and no implementation of the xUpdate method
85125: ** has been provided, or
85126: ** 2) It is a system table (i.e. sqlite_master), this call is not
85127: ** part of a nested parse and writable_schema pragma has not
85128: ** been specified.
85129: **
85130: ** In either case leave an error message in pParse and return non-zero.
85131: */
85132: if( ( IsVirtual(pTab)
85133: && sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 )
85134: || ( (pTab->tabFlags & TF_Readonly)!=0
85135: && (pParse->db->flags & SQLITE_WriteSchema)==0
85136: && pParse->nested==0 )
85137: ){
85138: sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName);
85139: return 1;
85140: }
85141:
85142: #ifndef SQLITE_OMIT_VIEW
85143: if( !viewOk && pTab->pSelect ){
85144: sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName);
85145: return 1;
85146: }
85147: #endif
85148: return 0;
85149: }
85150:
85151:
85152: #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
85153: /*
85154: ** Evaluate a view and store its result in an ephemeral table. The
85155: ** pWhere argument is an optional WHERE clause that restricts the
85156: ** set of rows in the view that are to be added to the ephemeral table.
85157: */
85158: SQLITE_PRIVATE void sqlite3MaterializeView(
85159: Parse *pParse, /* Parsing context */
85160: Table *pView, /* View definition */
85161: Expr *pWhere, /* Optional WHERE clause to be added */
85162: int iCur /* Cursor number for ephemerial table */
85163: ){
85164: SelectDest dest;
85165: Select *pDup;
85166: sqlite3 *db = pParse->db;
85167:
85168: pDup = sqlite3SelectDup(db, pView->pSelect, 0);
85169: if( pWhere ){
85170: SrcList *pFrom;
85171:
85172: pWhere = sqlite3ExprDup(db, pWhere, 0);
85173: pFrom = sqlite3SrcListAppend(db, 0, 0, 0);
85174: if( pFrom ){
85175: assert( pFrom->nSrc==1 );
85176: pFrom->a[0].zAlias = sqlite3DbStrDup(db, pView->zName);
85177: pFrom->a[0].pSelect = pDup;
85178: assert( pFrom->a[0].pOn==0 );
85179: assert( pFrom->a[0].pUsing==0 );
85180: }else{
85181: sqlite3SelectDelete(db, pDup);
85182: }
85183: pDup = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0);
1.2.2.1 ! misho 85184: if( pDup ) pDup->selFlags |= SF_Materialize;
1.2 misho 85185: }
85186: sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur);
85187: sqlite3Select(pParse, pDup, &dest);
85188: sqlite3SelectDelete(db, pDup);
85189: }
85190: #endif /* !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) */
85191:
85192: #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
85193: /*
85194: ** Generate an expression tree to implement the WHERE, ORDER BY,
85195: ** and LIMIT/OFFSET portion of DELETE and UPDATE statements.
85196: **
85197: ** DELETE FROM table_wxyz WHERE a<5 ORDER BY a LIMIT 1;
85198: ** \__________________________/
85199: ** pLimitWhere (pInClause)
85200: */
85201: SQLITE_PRIVATE Expr *sqlite3LimitWhere(
85202: Parse *pParse, /* The parser context */
85203: SrcList *pSrc, /* the FROM clause -- which tables to scan */
85204: Expr *pWhere, /* The WHERE clause. May be null */
85205: ExprList *pOrderBy, /* The ORDER BY clause. May be null */
85206: Expr *pLimit, /* The LIMIT clause. May be null */
85207: Expr *pOffset, /* The OFFSET clause. May be null */
85208: char *zStmtType /* Either DELETE or UPDATE. For error messages. */
85209: ){
85210: Expr *pWhereRowid = NULL; /* WHERE rowid .. */
85211: Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */
85212: Expr *pSelectRowid = NULL; /* SELECT rowid ... */
85213: ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */
85214: SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */
85215: Select *pSelect = NULL; /* Complete SELECT tree */
85216:
85217: /* Check that there isn't an ORDER BY without a LIMIT clause.
85218: */
85219: if( pOrderBy && (pLimit == 0) ) {
85220: sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType);
85221: goto limit_where_cleanup_2;
85222: }
85223:
85224: /* We only need to generate a select expression if there
85225: ** is a limit/offset term to enforce.
85226: */
85227: if( pLimit == 0 ) {
85228: /* if pLimit is null, pOffset will always be null as well. */
85229: assert( pOffset == 0 );
85230: return pWhere;
85231: }
85232:
85233: /* Generate a select expression tree to enforce the limit/offset
85234: ** term for the DELETE or UPDATE statement. For example:
85235: ** DELETE FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
85236: ** becomes:
85237: ** DELETE FROM table_a WHERE rowid IN (
85238: ** SELECT rowid FROM table_a WHERE col1=1 ORDER BY col2 LIMIT 1 OFFSET 1
85239: ** );
85240: */
85241:
85242: pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
85243: if( pSelectRowid == 0 ) goto limit_where_cleanup_2;
85244: pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid);
85245: if( pEList == 0 ) goto limit_where_cleanup_2;
85246:
85247: /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree
85248: ** and the SELECT subtree. */
85249: pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0);
85250: if( pSelectSrc == 0 ) {
85251: sqlite3ExprListDelete(pParse->db, pEList);
85252: goto limit_where_cleanup_2;
85253: }
85254:
85255: /* generate the SELECT expression tree. */
85256: pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0,
85257: pOrderBy,0,pLimit,pOffset);
85258: if( pSelect == 0 ) return 0;
85259:
85260: /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */
85261: pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0);
85262: if( pWhereRowid == 0 ) goto limit_where_cleanup_1;
85263: pInClause = sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0);
85264: if( pInClause == 0 ) goto limit_where_cleanup_1;
85265:
85266: pInClause->x.pSelect = pSelect;
85267: pInClause->flags |= EP_xIsSelect;
85268: sqlite3ExprSetHeight(pParse, pInClause);
85269: return pInClause;
85270:
85271: /* something went wrong. clean up anything allocated. */
85272: limit_where_cleanup_1:
85273: sqlite3SelectDelete(pParse->db, pSelect);
85274: return 0;
85275:
85276: limit_where_cleanup_2:
85277: sqlite3ExprDelete(pParse->db, pWhere);
85278: sqlite3ExprListDelete(pParse->db, pOrderBy);
85279: sqlite3ExprDelete(pParse->db, pLimit);
85280: sqlite3ExprDelete(pParse->db, pOffset);
85281: return 0;
85282: }
85283: #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */
85284:
85285: /*
85286: ** Generate code for a DELETE FROM statement.
85287: **
85288: ** DELETE FROM table_wxyz WHERE a<5 AND b NOT NULL;
85289: ** \________/ \________________/
85290: ** pTabList pWhere
85291: */
85292: SQLITE_PRIVATE void sqlite3DeleteFrom(
85293: Parse *pParse, /* The parser context */
85294: SrcList *pTabList, /* The table from which we should delete things */
85295: Expr *pWhere /* The WHERE clause. May be null */
85296: ){
85297: Vdbe *v; /* The virtual database engine */
85298: Table *pTab; /* The table from which records will be deleted */
85299: const char *zDb; /* Name of database holding pTab */
85300: int end, addr = 0; /* A couple addresses of generated code */
85301: int i; /* Loop counter */
85302: WhereInfo *pWInfo; /* Information about the WHERE clause */
85303: Index *pIdx; /* For looping over indices of the table */
85304: int iCur; /* VDBE Cursor number for pTab */
85305: sqlite3 *db; /* Main database structure */
85306: AuthContext sContext; /* Authorization context */
85307: NameContext sNC; /* Name context to resolve expressions in */
85308: int iDb; /* Database number */
85309: int memCnt = -1; /* Memory cell used for change counting */
85310: int rcauth; /* Value returned by authorization callback */
85311:
85312: #ifndef SQLITE_OMIT_TRIGGER
85313: int isView; /* True if attempting to delete from a view */
85314: Trigger *pTrigger; /* List of table triggers, if required */
85315: #endif
85316:
85317: memset(&sContext, 0, sizeof(sContext));
85318: db = pParse->db;
85319: if( pParse->nErr || db->mallocFailed ){
85320: goto delete_from_cleanup;
85321: }
85322: assert( pTabList->nSrc==1 );
85323:
85324: /* Locate the table which we want to delete. This table has to be
85325: ** put in an SrcList structure because some of the subroutines we
85326: ** will be calling are designed to work with multiple tables and expect
85327: ** an SrcList* parameter instead of just a Table* parameter.
85328: */
85329: pTab = sqlite3SrcListLookup(pParse, pTabList);
85330: if( pTab==0 ) goto delete_from_cleanup;
85331:
85332: /* Figure out if we have any triggers and if the table being
85333: ** deleted from is a view
85334: */
85335: #ifndef SQLITE_OMIT_TRIGGER
85336: pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
85337: isView = pTab->pSelect!=0;
85338: #else
85339: # define pTrigger 0
85340: # define isView 0
85341: #endif
85342: #ifdef SQLITE_OMIT_VIEW
85343: # undef isView
85344: # define isView 0
85345: #endif
85346:
85347: /* If pTab is really a view, make sure it has been initialized.
85348: */
85349: if( sqlite3ViewGetColumnNames(pParse, pTab) ){
85350: goto delete_from_cleanup;
85351: }
85352:
85353: if( sqlite3IsReadOnly(pParse, pTab, (pTrigger?1:0)) ){
85354: goto delete_from_cleanup;
85355: }
85356: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
85357: assert( iDb<db->nDb );
85358: zDb = db->aDb[iDb].zName;
85359: rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb);
85360: assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE );
85361: if( rcauth==SQLITE_DENY ){
85362: goto delete_from_cleanup;
85363: }
85364: assert(!isView || pTrigger);
85365:
85366: /* Assign cursor number to the table and all its indices.
85367: */
85368: assert( pTabList->nSrc==1 );
85369: iCur = pTabList->a[0].iCursor = pParse->nTab++;
85370: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
85371: pParse->nTab++;
85372: }
85373:
85374: /* Start the view context
85375: */
85376: if( isView ){
85377: sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
85378: }
85379:
85380: /* Begin generating code.
85381: */
85382: v = sqlite3GetVdbe(pParse);
85383: if( v==0 ){
85384: goto delete_from_cleanup;
85385: }
85386: if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
85387: sqlite3BeginWriteOperation(pParse, 1, iDb);
85388:
85389: /* If we are trying to delete from a view, realize that view into
85390: ** a ephemeral table.
85391: */
85392: #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
85393: if( isView ){
85394: sqlite3MaterializeView(pParse, pTab, pWhere, iCur);
85395: }
85396: #endif
85397:
85398: /* Resolve the column names in the WHERE clause.
85399: */
85400: memset(&sNC, 0, sizeof(sNC));
85401: sNC.pParse = pParse;
85402: sNC.pSrcList = pTabList;
85403: if( sqlite3ResolveExprNames(&sNC, pWhere) ){
85404: goto delete_from_cleanup;
85405: }
85406:
85407: /* Initialize the counter of the number of rows deleted, if
85408: ** we are counting rows.
85409: */
85410: if( db->flags & SQLITE_CountRows ){
85411: memCnt = ++pParse->nMem;
85412: sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt);
85413: }
85414:
85415: #ifndef SQLITE_OMIT_TRUNCATE_OPTIMIZATION
85416: /* Special case: A DELETE without a WHERE clause deletes everything.
85417: ** It is easier just to erase the whole table. Prior to version 3.6.5,
85418: ** this optimization caused the row change count (the value returned by
85419: ** API function sqlite3_count_changes) to be set incorrectly. */
85420: if( rcauth==SQLITE_OK && pWhere==0 && !pTrigger && !IsVirtual(pTab)
85421: && 0==sqlite3FkRequired(pParse, pTab, 0, 0)
85422: ){
85423: assert( !isView );
85424: sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt,
85425: pTab->zName, P4_STATIC);
85426: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
85427: assert( pIdx->pSchema==pTab->pSchema );
85428: sqlite3VdbeAddOp2(v, OP_Clear, pIdx->tnum, iDb);
85429: }
85430: }else
85431: #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
85432: /* The usual case: There is a WHERE clause so we have to scan through
85433: ** the table and pick which records to delete.
85434: */
85435: {
85436: int iRowSet = ++pParse->nMem; /* Register for rowset of rows to delete */
85437: int iRowid = ++pParse->nMem; /* Used for storing rowid values. */
85438: int regRowid; /* Actual register containing rowids */
85439:
85440: /* Collect rowids of every row to be deleted.
85441: */
85442: sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet);
85443: pWInfo = sqlite3WhereBegin(
1.2.2.1 ! misho 85444: pParse, pTabList, pWhere, 0, 0, WHERE_DUPLICATES_OK, 0
1.2 misho 85445: );
85446: if( pWInfo==0 ) goto delete_from_cleanup;
1.2.2.1 ! misho 85447: regRowid = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, iRowid, 0);
1.2 misho 85448: sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, regRowid);
85449: if( db->flags & SQLITE_CountRows ){
85450: sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
85451: }
85452: sqlite3WhereEnd(pWInfo);
85453:
85454: /* Delete every item whose key was written to the list during the
85455: ** database scan. We have to delete items after the scan is complete
85456: ** because deleting an item can change the scan order. */
85457: end = sqlite3VdbeMakeLabel(v);
85458:
85459: /* Unless this is a view, open cursors for the table we are
85460: ** deleting from and all its indices. If this is a view, then the
85461: ** only effect this statement has is to fire the INSTEAD OF
85462: ** triggers. */
85463: if( !isView ){
85464: sqlite3OpenTableAndIndices(pParse, pTab, iCur, OP_OpenWrite);
85465: }
85466:
85467: addr = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, end, iRowid);
85468:
85469: /* Delete the row */
85470: #ifndef SQLITE_OMIT_VIRTUALTABLE
85471: if( IsVirtual(pTab) ){
85472: const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
85473: sqlite3VtabMakeWritable(pParse, pTab);
85474: sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iRowid, pVTab, P4_VTAB);
85475: sqlite3VdbeChangeP5(v, OE_Abort);
85476: sqlite3MayAbort(pParse);
85477: }else
85478: #endif
85479: {
85480: int count = (pParse->nested==0); /* True to count changes */
85481: sqlite3GenerateRowDelete(pParse, pTab, iCur, iRowid, count, pTrigger, OE_Default);
85482: }
85483:
85484: /* End of the delete loop */
85485: sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
85486: sqlite3VdbeResolveLabel(v, end);
85487:
85488: /* Close the cursors open on the table and its indexes. */
85489: if( !isView && !IsVirtual(pTab) ){
85490: for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
85491: sqlite3VdbeAddOp2(v, OP_Close, iCur + i, pIdx->tnum);
85492: }
85493: sqlite3VdbeAddOp1(v, OP_Close, iCur);
85494: }
85495: }
85496:
85497: /* Update the sqlite_sequence table by storing the content of the
85498: ** maximum rowid counter values recorded while inserting into
85499: ** autoincrement tables.
85500: */
85501: if( pParse->nested==0 && pParse->pTriggerTab==0 ){
85502: sqlite3AutoincrementEnd(pParse);
85503: }
85504:
85505: /* Return the number of rows that were deleted. If this routine is
85506: ** generating code because of a call to sqlite3NestedParse(), do not
85507: ** invoke the callback function.
85508: */
85509: if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
85510: sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1);
85511: sqlite3VdbeSetNumCols(v, 1);
85512: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC);
85513: }
85514:
85515: delete_from_cleanup:
85516: sqlite3AuthContextPop(&sContext);
85517: sqlite3SrcListDelete(db, pTabList);
85518: sqlite3ExprDelete(db, pWhere);
85519: return;
85520: }
85521: /* Make sure "isView" and other macros defined above are undefined. Otherwise
85522: ** thely may interfere with compilation of other functions in this file
85523: ** (or in another file, if this file becomes part of the amalgamation). */
85524: #ifdef isView
85525: #undef isView
85526: #endif
85527: #ifdef pTrigger
85528: #undef pTrigger
85529: #endif
85530:
85531: /*
85532: ** This routine generates VDBE code that causes a single row of a
85533: ** single table to be deleted.
85534: **
85535: ** The VDBE must be in a particular state when this routine is called.
85536: ** These are the requirements:
85537: **
85538: ** 1. A read/write cursor pointing to pTab, the table containing the row
85539: ** to be deleted, must be opened as cursor number $iCur.
85540: **
85541: ** 2. Read/write cursors for all indices of pTab must be open as
85542: ** cursor number base+i for the i-th index.
85543: **
85544: ** 3. The record number of the row to be deleted must be stored in
85545: ** memory cell iRowid.
85546: **
85547: ** This routine generates code to remove both the table record and all
85548: ** index entries that point to that record.
85549: */
85550: SQLITE_PRIVATE void sqlite3GenerateRowDelete(
85551: Parse *pParse, /* Parsing context */
85552: Table *pTab, /* Table containing the row to be deleted */
85553: int iCur, /* Cursor number for the table */
85554: int iRowid, /* Memory cell that contains the rowid to delete */
85555: int count, /* If non-zero, increment the row change counter */
85556: Trigger *pTrigger, /* List of triggers to (potentially) fire */
85557: int onconf /* Default ON CONFLICT policy for triggers */
85558: ){
85559: Vdbe *v = pParse->pVdbe; /* Vdbe */
85560: int iOld = 0; /* First register in OLD.* array */
85561: int iLabel; /* Label resolved to end of generated code */
85562:
85563: /* Vdbe is guaranteed to have been allocated by this stage. */
85564: assert( v );
85565:
85566: /* Seek cursor iCur to the row to delete. If this row no longer exists
85567: ** (this can happen if a trigger program has already deleted it), do
85568: ** not attempt to delete it or fire any DELETE triggers. */
85569: iLabel = sqlite3VdbeMakeLabel(v);
85570: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, iLabel, iRowid);
85571:
85572: /* If there are any triggers to fire, allocate a range of registers to
85573: ** use for the old.* references in the triggers. */
85574: if( sqlite3FkRequired(pParse, pTab, 0, 0) || pTrigger ){
85575: u32 mask; /* Mask of OLD.* columns in use */
85576: int iCol; /* Iterator used while populating OLD.* */
85577:
85578: /* TODO: Could use temporary registers here. Also could attempt to
85579: ** avoid copying the contents of the rowid register. */
85580: mask = sqlite3TriggerColmask(
85581: pParse, pTrigger, 0, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onconf
85582: );
85583: mask |= sqlite3FkOldmask(pParse, pTab);
85584: iOld = pParse->nMem+1;
85585: pParse->nMem += (1 + pTab->nCol);
85586:
85587: /* Populate the OLD.* pseudo-table register array. These values will be
85588: ** used by any BEFORE and AFTER triggers that exist. */
85589: sqlite3VdbeAddOp2(v, OP_Copy, iRowid, iOld);
85590: for(iCol=0; iCol<pTab->nCol; iCol++){
85591: if( mask==0xffffffff || mask&(1<<iCol) ){
85592: sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, iOld+iCol+1);
85593: }
85594: }
85595:
85596: /* Invoke BEFORE DELETE trigger programs. */
85597: sqlite3CodeRowTrigger(pParse, pTrigger,
85598: TK_DELETE, 0, TRIGGER_BEFORE, pTab, iOld, onconf, iLabel
85599: );
85600:
85601: /* Seek the cursor to the row to be deleted again. It may be that
85602: ** the BEFORE triggers coded above have already removed the row
85603: ** being deleted. Do not attempt to delete the row a second time, and
85604: ** do not fire AFTER triggers. */
85605: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, iLabel, iRowid);
85606:
85607: /* Do FK processing. This call checks that any FK constraints that
85608: ** refer to this table (i.e. constraints attached to other tables)
85609: ** are not violated by deleting this row. */
85610: sqlite3FkCheck(pParse, pTab, iOld, 0);
85611: }
85612:
85613: /* Delete the index and table entries. Skip this step if pTab is really
85614: ** a view (in which case the only effect of the DELETE statement is to
85615: ** fire the INSTEAD OF triggers). */
85616: if( pTab->pSelect==0 ){
85617: sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, 0);
85618: sqlite3VdbeAddOp2(v, OP_Delete, iCur, (count?OPFLAG_NCHANGE:0));
85619: if( count ){
85620: sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT);
85621: }
85622: }
85623:
85624: /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
85625: ** handle rows (possibly in other tables) that refer via a foreign key
85626: ** to the row just deleted. */
85627: sqlite3FkActions(pParse, pTab, 0, iOld);
85628:
85629: /* Invoke AFTER DELETE trigger programs. */
85630: sqlite3CodeRowTrigger(pParse, pTrigger,
85631: TK_DELETE, 0, TRIGGER_AFTER, pTab, iOld, onconf, iLabel
85632: );
85633:
85634: /* Jump here if the row had already been deleted before any BEFORE
85635: ** trigger programs were invoked. Or if a trigger program throws a
85636: ** RAISE(IGNORE) exception. */
85637: sqlite3VdbeResolveLabel(v, iLabel);
85638: }
85639:
85640: /*
85641: ** This routine generates VDBE code that causes the deletion of all
85642: ** index entries associated with a single row of a single table.
85643: **
85644: ** The VDBE must be in a particular state when this routine is called.
85645: ** These are the requirements:
85646: **
85647: ** 1. A read/write cursor pointing to pTab, the table containing the row
85648: ** to be deleted, must be opened as cursor number "iCur".
85649: **
85650: ** 2. Read/write cursors for all indices of pTab must be open as
85651: ** cursor number iCur+i for the i-th index.
85652: **
85653: ** 3. The "iCur" cursor must be pointing to the row that is to be
85654: ** deleted.
85655: */
85656: SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(
85657: Parse *pParse, /* Parsing and code generating context */
85658: Table *pTab, /* Table containing the row to be deleted */
85659: int iCur, /* Cursor number for the table */
85660: int *aRegIdx /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */
85661: ){
85662: int i;
85663: Index *pIdx;
85664: int r1;
85665:
85666: for(i=1, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){
85667: if( aRegIdx!=0 && aRegIdx[i-1]==0 ) continue;
85668: r1 = sqlite3GenerateIndexKey(pParse, pIdx, iCur, 0, 0);
85669: sqlite3VdbeAddOp3(pParse->pVdbe, OP_IdxDelete, iCur+i, r1,pIdx->nColumn+1);
85670: }
85671: }
85672:
85673: /*
85674: ** Generate code that will assemble an index key and put it in register
85675: ** regOut. The key with be for index pIdx which is an index on pTab.
85676: ** iCur is the index of a cursor open on the pTab table and pointing to
85677: ** the entry that needs indexing.
85678: **
85679: ** Return a register number which is the first in a block of
85680: ** registers that holds the elements of the index key. The
85681: ** block of registers has already been deallocated by the time
85682: ** this routine returns.
85683: */
85684: SQLITE_PRIVATE int sqlite3GenerateIndexKey(
85685: Parse *pParse, /* Parsing context */
85686: Index *pIdx, /* The index for which to generate a key */
85687: int iCur, /* Cursor number for the pIdx->pTable table */
85688: int regOut, /* Write the new index key to this register */
85689: int doMakeRec /* Run the OP_MakeRecord instruction if true */
85690: ){
85691: Vdbe *v = pParse->pVdbe;
85692: int j;
85693: Table *pTab = pIdx->pTable;
85694: int regBase;
85695: int nCol;
85696:
85697: nCol = pIdx->nColumn;
85698: regBase = sqlite3GetTempRange(pParse, nCol+1);
85699: sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regBase+nCol);
85700: for(j=0; j<nCol; j++){
85701: int idx = pIdx->aiColumn[j];
85702: if( idx==pTab->iPKey ){
85703: sqlite3VdbeAddOp2(v, OP_SCopy, regBase+nCol, regBase+j);
85704: }else{
85705: sqlite3VdbeAddOp3(v, OP_Column, iCur, idx, regBase+j);
85706: sqlite3ColumnDefault(v, pTab, idx, -1);
85707: }
85708: }
85709: if( doMakeRec ){
85710: const char *zAff;
1.2.2.1 ! misho 85711: if( pTab->pSelect
! 85712: || OptimizationDisabled(pParse->db, SQLITE_IdxRealAsInt)
! 85713: ){
1.2 misho 85714: zAff = 0;
85715: }else{
85716: zAff = sqlite3IndexAffinityStr(v, pIdx);
85717: }
85718: sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut);
85719: sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT);
85720: }
85721: sqlite3ReleaseTempRange(pParse, regBase, nCol+1);
85722: return regBase;
85723: }
85724:
85725: /************** End of delete.c **********************************************/
85726: /************** Begin file func.c ********************************************/
85727: /*
85728: ** 2002 February 23
85729: **
85730: ** The author disclaims copyright to this source code. In place of
85731: ** a legal notice, here is a blessing:
85732: **
85733: ** May you do good and not evil.
85734: ** May you find forgiveness for yourself and forgive others.
85735: ** May you share freely, never taking more than you give.
85736: **
85737: *************************************************************************
85738: ** This file contains the C functions that implement various SQL
85739: ** functions of SQLite.
85740: **
85741: ** There is only one exported symbol in this file - the function
85742: ** sqliteRegisterBuildinFunctions() found at the bottom of the file.
85743: ** All other code has file scope.
85744: */
85745: /* #include <stdlib.h> */
85746: /* #include <assert.h> */
85747:
85748: /*
85749: ** Return the collating function associated with a function.
85750: */
85751: static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){
85752: return context->pColl;
85753: }
85754:
85755: /*
1.2.2.1 ! misho 85756: ** Indicate that the accumulator load should be skipped on this
! 85757: ** iteration of the aggregate loop.
! 85758: */
! 85759: static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){
! 85760: context->skipFlag = 1;
! 85761: }
! 85762:
! 85763: /*
1.2 misho 85764: ** Implementation of the non-aggregate min() and max() functions
85765: */
85766: static void minmaxFunc(
85767: sqlite3_context *context,
85768: int argc,
85769: sqlite3_value **argv
85770: ){
85771: int i;
85772: int mask; /* 0 for min() or 0xffffffff for max() */
85773: int iBest;
85774: CollSeq *pColl;
85775:
85776: assert( argc>1 );
85777: mask = sqlite3_user_data(context)==0 ? 0 : -1;
85778: pColl = sqlite3GetFuncCollSeq(context);
85779: assert( pColl );
85780: assert( mask==-1 || mask==0 );
85781: iBest = 0;
85782: if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
85783: for(i=1; i<argc; i++){
85784: if( sqlite3_value_type(argv[i])==SQLITE_NULL ) return;
85785: if( (sqlite3MemCompare(argv[iBest], argv[i], pColl)^mask)>=0 ){
85786: testcase( mask==0 );
85787: iBest = i;
85788: }
85789: }
85790: sqlite3_result_value(context, argv[iBest]);
85791: }
85792:
85793: /*
85794: ** Return the type of the argument.
85795: */
85796: static void typeofFunc(
85797: sqlite3_context *context,
85798: int NotUsed,
85799: sqlite3_value **argv
85800: ){
85801: const char *z = 0;
85802: UNUSED_PARAMETER(NotUsed);
85803: switch( sqlite3_value_type(argv[0]) ){
85804: case SQLITE_INTEGER: z = "integer"; break;
85805: case SQLITE_TEXT: z = "text"; break;
85806: case SQLITE_FLOAT: z = "real"; break;
85807: case SQLITE_BLOB: z = "blob"; break;
85808: default: z = "null"; break;
85809: }
85810: sqlite3_result_text(context, z, -1, SQLITE_STATIC);
85811: }
85812:
85813:
85814: /*
85815: ** Implementation of the length() function
85816: */
85817: static void lengthFunc(
85818: sqlite3_context *context,
85819: int argc,
85820: sqlite3_value **argv
85821: ){
85822: int len;
85823:
85824: assert( argc==1 );
85825: UNUSED_PARAMETER(argc);
85826: switch( sqlite3_value_type(argv[0]) ){
85827: case SQLITE_BLOB:
85828: case SQLITE_INTEGER:
85829: case SQLITE_FLOAT: {
85830: sqlite3_result_int(context, sqlite3_value_bytes(argv[0]));
85831: break;
85832: }
85833: case SQLITE_TEXT: {
85834: const unsigned char *z = sqlite3_value_text(argv[0]);
85835: if( z==0 ) return;
85836: len = 0;
85837: while( *z ){
85838: len++;
85839: SQLITE_SKIP_UTF8(z);
85840: }
85841: sqlite3_result_int(context, len);
85842: break;
85843: }
85844: default: {
85845: sqlite3_result_null(context);
85846: break;
85847: }
85848: }
85849: }
85850:
85851: /*
85852: ** Implementation of the abs() function.
85853: **
85854: ** IMP: R-23979-26855 The abs(X) function returns the absolute value of
85855: ** the numeric argument X.
85856: */
85857: static void absFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
85858: assert( argc==1 );
85859: UNUSED_PARAMETER(argc);
85860: switch( sqlite3_value_type(argv[0]) ){
85861: case SQLITE_INTEGER: {
85862: i64 iVal = sqlite3_value_int64(argv[0]);
85863: if( iVal<0 ){
85864: if( (iVal<<1)==0 ){
85865: /* IMP: R-35460-15084 If X is the integer -9223372036854775807 then
85866: ** abs(X) throws an integer overflow error since there is no
85867: ** equivalent positive 64-bit two complement value. */
85868: sqlite3_result_error(context, "integer overflow", -1);
85869: return;
85870: }
85871: iVal = -iVal;
85872: }
85873: sqlite3_result_int64(context, iVal);
85874: break;
85875: }
85876: case SQLITE_NULL: {
85877: /* IMP: R-37434-19929 Abs(X) returns NULL if X is NULL. */
85878: sqlite3_result_null(context);
85879: break;
85880: }
85881: default: {
85882: /* Because sqlite3_value_double() returns 0.0 if the argument is not
85883: ** something that can be converted into a number, we have:
85884: ** IMP: R-57326-31541 Abs(X) return 0.0 if X is a string or blob that
85885: ** cannot be converted to a numeric value.
85886: */
85887: double rVal = sqlite3_value_double(argv[0]);
85888: if( rVal<0 ) rVal = -rVal;
85889: sqlite3_result_double(context, rVal);
85890: break;
85891: }
85892: }
85893: }
85894:
85895: /*
1.2.2.1 ! misho 85896: ** Implementation of the instr() function.
! 85897: **
! 85898: ** instr(haystack,needle) finds the first occurrence of needle
! 85899: ** in haystack and returns the number of previous characters plus 1,
! 85900: ** or 0 if needle does not occur within haystack.
! 85901: **
! 85902: ** If both haystack and needle are BLOBs, then the result is one more than
! 85903: ** the number of bytes in haystack prior to the first occurrence of needle,
! 85904: ** or 0 if needle never occurs in haystack.
! 85905: */
! 85906: static void instrFunc(
! 85907: sqlite3_context *context,
! 85908: int argc,
! 85909: sqlite3_value **argv
! 85910: ){
! 85911: const unsigned char *zHaystack;
! 85912: const unsigned char *zNeedle;
! 85913: int nHaystack;
! 85914: int nNeedle;
! 85915: int typeHaystack, typeNeedle;
! 85916: int N = 1;
! 85917: int isText;
! 85918:
! 85919: UNUSED_PARAMETER(argc);
! 85920: typeHaystack = sqlite3_value_type(argv[0]);
! 85921: typeNeedle = sqlite3_value_type(argv[1]);
! 85922: if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return;
! 85923: nHaystack = sqlite3_value_bytes(argv[0]);
! 85924: nNeedle = sqlite3_value_bytes(argv[1]);
! 85925: if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){
! 85926: zHaystack = sqlite3_value_blob(argv[0]);
! 85927: zNeedle = sqlite3_value_blob(argv[1]);
! 85928: isText = 0;
! 85929: }else{
! 85930: zHaystack = sqlite3_value_text(argv[0]);
! 85931: zNeedle = sqlite3_value_text(argv[1]);
! 85932: isText = 1;
! 85933: }
! 85934: while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){
! 85935: N++;
! 85936: do{
! 85937: nHaystack--;
! 85938: zHaystack++;
! 85939: }while( isText && (zHaystack[0]&0xc0)==0x80 );
! 85940: }
! 85941: if( nNeedle>nHaystack ) N = 0;
! 85942: sqlite3_result_int(context, N);
! 85943: }
! 85944:
! 85945: /*
1.2 misho 85946: ** Implementation of the substr() function.
85947: **
85948: ** substr(x,p1,p2) returns p2 characters of x[] beginning with p1.
85949: ** p1 is 1-indexed. So substr(x,1,1) returns the first character
85950: ** of x. If x is text, then we actually count UTF-8 characters.
85951: ** If x is a blob, then we count bytes.
85952: **
85953: ** If p1 is negative, then we begin abs(p1) from the end of x[].
85954: **
85955: ** If p2 is negative, return the p2 characters preceeding p1.
85956: */
85957: static void substrFunc(
85958: sqlite3_context *context,
85959: int argc,
85960: sqlite3_value **argv
85961: ){
85962: const unsigned char *z;
85963: const unsigned char *z2;
85964: int len;
85965: int p0type;
85966: i64 p1, p2;
85967: int negP2 = 0;
85968:
85969: assert( argc==3 || argc==2 );
85970: if( sqlite3_value_type(argv[1])==SQLITE_NULL
85971: || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL)
85972: ){
85973: return;
85974: }
85975: p0type = sqlite3_value_type(argv[0]);
85976: p1 = sqlite3_value_int(argv[1]);
85977: if( p0type==SQLITE_BLOB ){
85978: len = sqlite3_value_bytes(argv[0]);
85979: z = sqlite3_value_blob(argv[0]);
85980: if( z==0 ) return;
85981: assert( len==sqlite3_value_bytes(argv[0]) );
85982: }else{
85983: z = sqlite3_value_text(argv[0]);
85984: if( z==0 ) return;
85985: len = 0;
85986: if( p1<0 ){
85987: for(z2=z; *z2; len++){
85988: SQLITE_SKIP_UTF8(z2);
85989: }
85990: }
85991: }
85992: if( argc==3 ){
85993: p2 = sqlite3_value_int(argv[2]);
85994: if( p2<0 ){
85995: p2 = -p2;
85996: negP2 = 1;
85997: }
85998: }else{
85999: p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH];
86000: }
86001: if( p1<0 ){
86002: p1 += len;
86003: if( p1<0 ){
86004: p2 += p1;
86005: if( p2<0 ) p2 = 0;
86006: p1 = 0;
86007: }
86008: }else if( p1>0 ){
86009: p1--;
86010: }else if( p2>0 ){
86011: p2--;
86012: }
86013: if( negP2 ){
86014: p1 -= p2;
86015: if( p1<0 ){
86016: p2 += p1;
86017: p1 = 0;
86018: }
86019: }
86020: assert( p1>=0 && p2>=0 );
86021: if( p0type!=SQLITE_BLOB ){
86022: while( *z && p1 ){
86023: SQLITE_SKIP_UTF8(z);
86024: p1--;
86025: }
86026: for(z2=z; *z2 && p2; p2--){
86027: SQLITE_SKIP_UTF8(z2);
86028: }
86029: sqlite3_result_text(context, (char*)z, (int)(z2-z), SQLITE_TRANSIENT);
86030: }else{
86031: if( p1+p2>len ){
86032: p2 = len-p1;
86033: if( p2<0 ) p2 = 0;
86034: }
86035: sqlite3_result_blob(context, (char*)&z[p1], (int)p2, SQLITE_TRANSIENT);
86036: }
86037: }
86038:
86039: /*
86040: ** Implementation of the round() function
86041: */
86042: #ifndef SQLITE_OMIT_FLOATING_POINT
86043: static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
86044: int n = 0;
86045: double r;
86046: char *zBuf;
86047: assert( argc==1 || argc==2 );
86048: if( argc==2 ){
86049: if( SQLITE_NULL==sqlite3_value_type(argv[1]) ) return;
86050: n = sqlite3_value_int(argv[1]);
86051: if( n>30 ) n = 30;
86052: if( n<0 ) n = 0;
86053: }
86054: if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
86055: r = sqlite3_value_double(argv[0]);
86056: /* If Y==0 and X will fit in a 64-bit int,
86057: ** handle the rounding directly,
86058: ** otherwise use printf.
86059: */
86060: if( n==0 && r>=0 && r<LARGEST_INT64-1 ){
86061: r = (double)((sqlite_int64)(r+0.5));
86062: }else if( n==0 && r<0 && (-r)<LARGEST_INT64-1 ){
86063: r = -(double)((sqlite_int64)((-r)+0.5));
86064: }else{
86065: zBuf = sqlite3_mprintf("%.*f",n,r);
86066: if( zBuf==0 ){
86067: sqlite3_result_error_nomem(context);
86068: return;
86069: }
86070: sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8);
86071: sqlite3_free(zBuf);
86072: }
86073: sqlite3_result_double(context, r);
86074: }
86075: #endif
86076:
86077: /*
86078: ** Allocate nByte bytes of space using sqlite3_malloc(). If the
86079: ** allocation fails, call sqlite3_result_error_nomem() to notify
86080: ** the database handle that malloc() has failed and return NULL.
86081: ** If nByte is larger than the maximum string or blob length, then
86082: ** raise an SQLITE_TOOBIG exception and return NULL.
86083: */
86084: static void *contextMalloc(sqlite3_context *context, i64 nByte){
86085: char *z;
86086: sqlite3 *db = sqlite3_context_db_handle(context);
86087: assert( nByte>0 );
86088: testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH] );
86089: testcase( nByte==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
86090: if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
86091: sqlite3_result_error_toobig(context);
86092: z = 0;
86093: }else{
86094: z = sqlite3Malloc((int)nByte);
86095: if( !z ){
86096: sqlite3_result_error_nomem(context);
86097: }
86098: }
86099: return z;
86100: }
86101:
86102: /*
86103: ** Implementation of the upper() and lower() SQL functions.
86104: */
86105: static void upperFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
86106: char *z1;
86107: const char *z2;
86108: int i, n;
86109: UNUSED_PARAMETER(argc);
86110: z2 = (char*)sqlite3_value_text(argv[0]);
86111: n = sqlite3_value_bytes(argv[0]);
86112: /* Verify that the call to _bytes() does not invalidate the _text() pointer */
86113: assert( z2==(char*)sqlite3_value_text(argv[0]) );
86114: if( z2 ){
86115: z1 = contextMalloc(context, ((i64)n)+1);
86116: if( z1 ){
86117: for(i=0; i<n; i++){
86118: z1[i] = (char)sqlite3Toupper(z2[i]);
86119: }
86120: sqlite3_result_text(context, z1, n, sqlite3_free);
86121: }
86122: }
86123: }
86124: static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
86125: char *z1;
86126: const char *z2;
86127: int i, n;
86128: UNUSED_PARAMETER(argc);
86129: z2 = (char*)sqlite3_value_text(argv[0]);
86130: n = sqlite3_value_bytes(argv[0]);
86131: /* Verify that the call to _bytes() does not invalidate the _text() pointer */
86132: assert( z2==(char*)sqlite3_value_text(argv[0]) );
86133: if( z2 ){
86134: z1 = contextMalloc(context, ((i64)n)+1);
86135: if( z1 ){
86136: for(i=0; i<n; i++){
86137: z1[i] = sqlite3Tolower(z2[i]);
86138: }
86139: sqlite3_result_text(context, z1, n, sqlite3_free);
86140: }
86141: }
86142: }
86143:
86144: /*
1.2.2.1 ! misho 86145: ** The COALESCE() and IFNULL() functions are implemented as VDBE code so
! 86146: ** that unused argument values do not have to be computed. However, we
! 86147: ** still need some kind of function implementation for this routines in
! 86148: ** the function table. That function implementation will never be called
! 86149: ** so it doesn't matter what the implementation is. We might as well use
! 86150: ** the "version()" function as a substitute.
1.2 misho 86151: */
86152: #define ifnullFunc versionFunc /* Substitute function - never called */
86153:
86154: /*
86155: ** Implementation of random(). Return a random integer.
86156: */
86157: static void randomFunc(
86158: sqlite3_context *context,
86159: int NotUsed,
86160: sqlite3_value **NotUsed2
86161: ){
86162: sqlite_int64 r;
86163: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86164: sqlite3_randomness(sizeof(r), &r);
86165: if( r<0 ){
86166: /* We need to prevent a random number of 0x8000000000000000
86167: ** (or -9223372036854775808) since when you do abs() of that
86168: ** number of you get the same value back again. To do this
86169: ** in a way that is testable, mask the sign bit off of negative
86170: ** values, resulting in a positive value. Then take the
86171: ** 2s complement of that positive value. The end result can
86172: ** therefore be no less than -9223372036854775807.
86173: */
1.2.2.1 ! misho 86174: r = -(r & LARGEST_INT64);
1.2 misho 86175: }
86176: sqlite3_result_int64(context, r);
86177: }
86178:
86179: /*
86180: ** Implementation of randomblob(N). Return a random blob
86181: ** that is N bytes long.
86182: */
86183: static void randomBlob(
86184: sqlite3_context *context,
86185: int argc,
86186: sqlite3_value **argv
86187: ){
86188: int n;
86189: unsigned char *p;
86190: assert( argc==1 );
86191: UNUSED_PARAMETER(argc);
86192: n = sqlite3_value_int(argv[0]);
86193: if( n<1 ){
86194: n = 1;
86195: }
86196: p = contextMalloc(context, n);
86197: if( p ){
86198: sqlite3_randomness(n, p);
86199: sqlite3_result_blob(context, (char*)p, n, sqlite3_free);
86200: }
86201: }
86202:
86203: /*
86204: ** Implementation of the last_insert_rowid() SQL function. The return
86205: ** value is the same as the sqlite3_last_insert_rowid() API function.
86206: */
86207: static void last_insert_rowid(
86208: sqlite3_context *context,
86209: int NotUsed,
86210: sqlite3_value **NotUsed2
86211: ){
86212: sqlite3 *db = sqlite3_context_db_handle(context);
86213: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86214: /* IMP: R-51513-12026 The last_insert_rowid() SQL function is a
86215: ** wrapper around the sqlite3_last_insert_rowid() C/C++ interface
86216: ** function. */
86217: sqlite3_result_int64(context, sqlite3_last_insert_rowid(db));
86218: }
86219:
86220: /*
86221: ** Implementation of the changes() SQL function.
86222: **
86223: ** IMP: R-62073-11209 The changes() SQL function is a wrapper
86224: ** around the sqlite3_changes() C/C++ function and hence follows the same
86225: ** rules for counting changes.
86226: */
86227: static void changes(
86228: sqlite3_context *context,
86229: int NotUsed,
86230: sqlite3_value **NotUsed2
86231: ){
86232: sqlite3 *db = sqlite3_context_db_handle(context);
86233: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86234: sqlite3_result_int(context, sqlite3_changes(db));
86235: }
86236:
86237: /*
86238: ** Implementation of the total_changes() SQL function. The return value is
86239: ** the same as the sqlite3_total_changes() API function.
86240: */
86241: static void total_changes(
86242: sqlite3_context *context,
86243: int NotUsed,
86244: sqlite3_value **NotUsed2
86245: ){
86246: sqlite3 *db = sqlite3_context_db_handle(context);
86247: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86248: /* IMP: R-52756-41993 This function is a wrapper around the
86249: ** sqlite3_total_changes() C/C++ interface. */
86250: sqlite3_result_int(context, sqlite3_total_changes(db));
86251: }
86252:
86253: /*
86254: ** A structure defining how to do GLOB-style comparisons.
86255: */
86256: struct compareInfo {
86257: u8 matchAll;
86258: u8 matchOne;
86259: u8 matchSet;
86260: u8 noCase;
86261: };
86262:
86263: /*
86264: ** For LIKE and GLOB matching on EBCDIC machines, assume that every
86265: ** character is exactly one byte in size. Also, all characters are
86266: ** able to participate in upper-case-to-lower-case mappings in EBCDIC
86267: ** whereas only characters less than 0x80 do in ASCII.
86268: */
86269: #if defined(SQLITE_EBCDIC)
1.2.2.1 ! misho 86270: # define sqlite3Utf8Read(A) (*((*A)++))
1.2 misho 86271: # define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
86272: #else
86273: # define GlogUpperToLower(A) if( !((A)&~0x7f) ){ A = sqlite3UpperToLower[A]; }
86274: #endif
86275:
86276: static const struct compareInfo globInfo = { '*', '?', '[', 0 };
86277: /* The correct SQL-92 behavior is for the LIKE operator to ignore
86278: ** case. Thus 'a' LIKE 'A' would be true. */
86279: static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 };
86280: /* If SQLITE_CASE_SENSITIVE_LIKE is defined, then the LIKE operator
86281: ** is case sensitive causing 'a' LIKE 'A' to be false */
86282: static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 };
86283:
86284: /*
86285: ** Compare two UTF-8 strings for equality where the first string can
86286: ** potentially be a "glob" expression. Return true (1) if they
86287: ** are the same and false (0) if they are different.
86288: **
86289: ** Globbing rules:
86290: **
86291: ** '*' Matches any sequence of zero or more characters.
86292: **
86293: ** '?' Matches exactly one character.
86294: **
86295: ** [...] Matches one character from the enclosed list of
86296: ** characters.
86297: **
86298: ** [^...] Matches one character not in the enclosed list.
86299: **
86300: ** With the [...] and [^...] matching, a ']' character can be included
86301: ** in the list by making it the first character after '[' or '^'. A
86302: ** range of characters can be specified using '-'. Example:
86303: ** "[a-z]" matches any single lower-case letter. To match a '-', make
86304: ** it the last character in the list.
86305: **
86306: ** This routine is usually quick, but can be N**2 in the worst case.
86307: **
86308: ** Hints: to match '*' or '?', put them in "[]". Like this:
86309: **
86310: ** abc[*]xyz Matches "abc*xyz" only
86311: */
86312: static int patternCompare(
86313: const u8 *zPattern, /* The glob pattern */
86314: const u8 *zString, /* The string to compare against the glob */
86315: const struct compareInfo *pInfo, /* Information about how to do the compare */
86316: u32 esc /* The escape character */
86317: ){
86318: u32 c, c2;
86319: int invert;
86320: int seen;
86321: u8 matchOne = pInfo->matchOne;
86322: u8 matchAll = pInfo->matchAll;
86323: u8 matchSet = pInfo->matchSet;
86324: u8 noCase = pInfo->noCase;
86325: int prevEscape = 0; /* True if the previous character was 'escape' */
86326:
1.2.2.1 ! misho 86327: while( (c = sqlite3Utf8Read(&zPattern))!=0 ){
! 86328: if( c==matchAll && !prevEscape ){
! 86329: while( (c=sqlite3Utf8Read(&zPattern)) == matchAll
1.2 misho 86330: || c == matchOne ){
1.2.2.1 ! misho 86331: if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){
1.2 misho 86332: return 0;
86333: }
86334: }
86335: if( c==0 ){
86336: return 1;
86337: }else if( c==esc ){
1.2.2.1 ! misho 86338: c = sqlite3Utf8Read(&zPattern);
1.2 misho 86339: if( c==0 ){
86340: return 0;
86341: }
86342: }else if( c==matchSet ){
86343: assert( esc==0 ); /* This is GLOB, not LIKE */
86344: assert( matchSet<0x80 ); /* '[' is a single-byte character */
86345: while( *zString && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){
86346: SQLITE_SKIP_UTF8(zString);
86347: }
86348: return *zString!=0;
86349: }
1.2.2.1 ! misho 86350: while( (c2 = sqlite3Utf8Read(&zString))!=0 ){
1.2 misho 86351: if( noCase ){
86352: GlogUpperToLower(c2);
86353: GlogUpperToLower(c);
86354: while( c2 != 0 && c2 != c ){
1.2.2.1 ! misho 86355: c2 = sqlite3Utf8Read(&zString);
1.2 misho 86356: GlogUpperToLower(c2);
86357: }
86358: }else{
86359: while( c2 != 0 && c2 != c ){
1.2.2.1 ! misho 86360: c2 = sqlite3Utf8Read(&zString);
1.2 misho 86361: }
86362: }
86363: if( c2==0 ) return 0;
86364: if( patternCompare(zPattern,zString,pInfo,esc) ) return 1;
86365: }
86366: return 0;
1.2.2.1 ! misho 86367: }else if( c==matchOne && !prevEscape ){
! 86368: if( sqlite3Utf8Read(&zString)==0 ){
1.2 misho 86369: return 0;
86370: }
86371: }else if( c==matchSet ){
86372: u32 prior_c = 0;
86373: assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
86374: seen = 0;
86375: invert = 0;
1.2.2.1 ! misho 86376: c = sqlite3Utf8Read(&zString);
1.2 misho 86377: if( c==0 ) return 0;
1.2.2.1 ! misho 86378: c2 = sqlite3Utf8Read(&zPattern);
1.2 misho 86379: if( c2=='^' ){
86380: invert = 1;
1.2.2.1 ! misho 86381: c2 = sqlite3Utf8Read(&zPattern);
1.2 misho 86382: }
86383: if( c2==']' ){
86384: if( c==']' ) seen = 1;
1.2.2.1 ! misho 86385: c2 = sqlite3Utf8Read(&zPattern);
1.2 misho 86386: }
86387: while( c2 && c2!=']' ){
86388: if( c2=='-' && zPattern[0]!=']' && zPattern[0]!=0 && prior_c>0 ){
1.2.2.1 ! misho 86389: c2 = sqlite3Utf8Read(&zPattern);
1.2 misho 86390: if( c>=prior_c && c<=c2 ) seen = 1;
86391: prior_c = 0;
86392: }else{
86393: if( c==c2 ){
86394: seen = 1;
86395: }
86396: prior_c = c2;
86397: }
1.2.2.1 ! misho 86398: c2 = sqlite3Utf8Read(&zPattern);
1.2 misho 86399: }
86400: if( c2==0 || (seen ^ invert)==0 ){
86401: return 0;
86402: }
86403: }else if( esc==c && !prevEscape ){
86404: prevEscape = 1;
86405: }else{
1.2.2.1 ! misho 86406: c2 = sqlite3Utf8Read(&zString);
1.2 misho 86407: if( noCase ){
86408: GlogUpperToLower(c);
86409: GlogUpperToLower(c2);
86410: }
86411: if( c!=c2 ){
86412: return 0;
86413: }
86414: prevEscape = 0;
86415: }
86416: }
86417: return *zString==0;
86418: }
86419:
86420: /*
86421: ** Count the number of times that the LIKE operator (or GLOB which is
86422: ** just a variation of LIKE) gets called. This is used for testing
86423: ** only.
86424: */
86425: #ifdef SQLITE_TEST
86426: SQLITE_API int sqlite3_like_count = 0;
86427: #endif
86428:
86429:
86430: /*
86431: ** Implementation of the like() SQL function. This function implements
86432: ** the build-in LIKE operator. The first argument to the function is the
86433: ** pattern and the second argument is the string. So, the SQL statements:
86434: **
86435: ** A LIKE B
86436: **
86437: ** is implemented as like(B,A).
86438: **
86439: ** This same function (with a different compareInfo structure) computes
86440: ** the GLOB operator.
86441: */
86442: static void likeFunc(
86443: sqlite3_context *context,
86444: int argc,
86445: sqlite3_value **argv
86446: ){
86447: const unsigned char *zA, *zB;
86448: u32 escape = 0;
86449: int nPat;
86450: sqlite3 *db = sqlite3_context_db_handle(context);
86451:
86452: zB = sqlite3_value_text(argv[0]);
86453: zA = sqlite3_value_text(argv[1]);
86454:
86455: /* Limit the length of the LIKE or GLOB pattern to avoid problems
86456: ** of deep recursion and N*N behavior in patternCompare().
86457: */
86458: nPat = sqlite3_value_bytes(argv[0]);
86459: testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] );
86460: testcase( nPat==db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]+1 );
86461: if( nPat > db->aLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH] ){
86462: sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
86463: return;
86464: }
86465: assert( zB==sqlite3_value_text(argv[0]) ); /* Encoding did not change */
86466:
86467: if( argc==3 ){
86468: /* The escape character string must consist of a single UTF-8 character.
86469: ** Otherwise, return an error.
86470: */
86471: const unsigned char *zEsc = sqlite3_value_text(argv[2]);
86472: if( zEsc==0 ) return;
86473: if( sqlite3Utf8CharLen((char*)zEsc, -1)!=1 ){
86474: sqlite3_result_error(context,
86475: "ESCAPE expression must be a single character", -1);
86476: return;
86477: }
1.2.2.1 ! misho 86478: escape = sqlite3Utf8Read(&zEsc);
1.2 misho 86479: }
86480: if( zA && zB ){
86481: struct compareInfo *pInfo = sqlite3_user_data(context);
86482: #ifdef SQLITE_TEST
86483: sqlite3_like_count++;
86484: #endif
86485:
86486: sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape));
86487: }
86488: }
86489:
86490: /*
86491: ** Implementation of the NULLIF(x,y) function. The result is the first
86492: ** argument if the arguments are different. The result is NULL if the
86493: ** arguments are equal to each other.
86494: */
86495: static void nullifFunc(
86496: sqlite3_context *context,
86497: int NotUsed,
86498: sqlite3_value **argv
86499: ){
86500: CollSeq *pColl = sqlite3GetFuncCollSeq(context);
86501: UNUSED_PARAMETER(NotUsed);
86502: if( sqlite3MemCompare(argv[0], argv[1], pColl)!=0 ){
86503: sqlite3_result_value(context, argv[0]);
86504: }
86505: }
86506:
86507: /*
86508: ** Implementation of the sqlite_version() function. The result is the version
86509: ** of the SQLite library that is running.
86510: */
86511: static void versionFunc(
86512: sqlite3_context *context,
86513: int NotUsed,
86514: sqlite3_value **NotUsed2
86515: ){
86516: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86517: /* IMP: R-48699-48617 This function is an SQL wrapper around the
86518: ** sqlite3_libversion() C-interface. */
86519: sqlite3_result_text(context, sqlite3_libversion(), -1, SQLITE_STATIC);
86520: }
86521:
86522: /*
86523: ** Implementation of the sqlite_source_id() function. The result is a string
86524: ** that identifies the particular version of the source code used to build
86525: ** SQLite.
86526: */
86527: static void sourceidFunc(
86528: sqlite3_context *context,
86529: int NotUsed,
86530: sqlite3_value **NotUsed2
86531: ){
86532: UNUSED_PARAMETER2(NotUsed, NotUsed2);
86533: /* IMP: R-24470-31136 This function is an SQL wrapper around the
86534: ** sqlite3_sourceid() C interface. */
86535: sqlite3_result_text(context, sqlite3_sourceid(), -1, SQLITE_STATIC);
86536: }
86537:
86538: /*
86539: ** Implementation of the sqlite_log() function. This is a wrapper around
86540: ** sqlite3_log(). The return value is NULL. The function exists purely for
86541: ** its side-effects.
86542: */
86543: static void errlogFunc(
86544: sqlite3_context *context,
86545: int argc,
86546: sqlite3_value **argv
86547: ){
86548: UNUSED_PARAMETER(argc);
86549: UNUSED_PARAMETER(context);
86550: sqlite3_log(sqlite3_value_int(argv[0]), "%s", sqlite3_value_text(argv[1]));
86551: }
86552:
86553: /*
86554: ** Implementation of the sqlite_compileoption_used() function.
86555: ** The result is an integer that identifies if the compiler option
86556: ** was used to build SQLite.
86557: */
86558: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
86559: static void compileoptionusedFunc(
86560: sqlite3_context *context,
86561: int argc,
86562: sqlite3_value **argv
86563: ){
86564: const char *zOptName;
86565: assert( argc==1 );
86566: UNUSED_PARAMETER(argc);
86567: /* IMP: R-39564-36305 The sqlite_compileoption_used() SQL
86568: ** function is a wrapper around the sqlite3_compileoption_used() C/C++
86569: ** function.
86570: */
86571: if( (zOptName = (const char*)sqlite3_value_text(argv[0]))!=0 ){
86572: sqlite3_result_int(context, sqlite3_compileoption_used(zOptName));
86573: }
86574: }
86575: #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
86576:
86577: /*
86578: ** Implementation of the sqlite_compileoption_get() function.
86579: ** The result is a string that identifies the compiler options
86580: ** used to build SQLite.
86581: */
86582: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
86583: static void compileoptiongetFunc(
86584: sqlite3_context *context,
86585: int argc,
86586: sqlite3_value **argv
86587: ){
86588: int n;
86589: assert( argc==1 );
86590: UNUSED_PARAMETER(argc);
86591: /* IMP: R-04922-24076 The sqlite_compileoption_get() SQL function
86592: ** is a wrapper around the sqlite3_compileoption_get() C/C++ function.
86593: */
86594: n = sqlite3_value_int(argv[0]);
86595: sqlite3_result_text(context, sqlite3_compileoption_get(n), -1, SQLITE_STATIC);
86596: }
86597: #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
86598:
86599: /* Array for converting from half-bytes (nybbles) into ASCII hex
86600: ** digits. */
86601: static const char hexdigits[] = {
86602: '0', '1', '2', '3', '4', '5', '6', '7',
86603: '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
86604: };
86605:
86606: /*
86607: ** EXPERIMENTAL - This is not an official function. The interface may
86608: ** change. This function may disappear. Do not write code that depends
86609: ** on this function.
86610: **
86611: ** Implementation of the QUOTE() function. This function takes a single
86612: ** argument. If the argument is numeric, the return value is the same as
86613: ** the argument. If the argument is NULL, the return value is the string
86614: ** "NULL". Otherwise, the argument is enclosed in single quotes with
86615: ** single-quote escapes.
86616: */
86617: static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
86618: assert( argc==1 );
86619: UNUSED_PARAMETER(argc);
86620: switch( sqlite3_value_type(argv[0]) ){
86621: case SQLITE_FLOAT: {
1.2.2.1 ! misho 86622: double r1, r2;
! 86623: char zBuf[50];
! 86624: r1 = sqlite3_value_double(argv[0]);
! 86625: sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1);
! 86626: sqlite3AtoF(zBuf, &r2, 20, SQLITE_UTF8);
! 86627: if( r1!=r2 ){
! 86628: sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.20e", r1);
! 86629: }
! 86630: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
! 86631: break;
! 86632: }
! 86633: case SQLITE_INTEGER: {
1.2 misho 86634: sqlite3_result_value(context, argv[0]);
86635: break;
86636: }
86637: case SQLITE_BLOB: {
86638: char *zText = 0;
86639: char const *zBlob = sqlite3_value_blob(argv[0]);
86640: int nBlob = sqlite3_value_bytes(argv[0]);
86641: assert( zBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
86642: zText = (char *)contextMalloc(context, (2*(i64)nBlob)+4);
86643: if( zText ){
86644: int i;
86645: for(i=0; i<nBlob; i++){
86646: zText[(i*2)+2] = hexdigits[(zBlob[i]>>4)&0x0F];
86647: zText[(i*2)+3] = hexdigits[(zBlob[i])&0x0F];
86648: }
86649: zText[(nBlob*2)+2] = '\'';
86650: zText[(nBlob*2)+3] = '\0';
86651: zText[0] = 'X';
86652: zText[1] = '\'';
86653: sqlite3_result_text(context, zText, -1, SQLITE_TRANSIENT);
86654: sqlite3_free(zText);
86655: }
86656: break;
86657: }
86658: case SQLITE_TEXT: {
86659: int i,j;
86660: u64 n;
86661: const unsigned char *zArg = sqlite3_value_text(argv[0]);
86662: char *z;
86663:
86664: if( zArg==0 ) return;
86665: for(i=0, n=0; zArg[i]; i++){ if( zArg[i]=='\'' ) n++; }
86666: z = contextMalloc(context, ((i64)i)+((i64)n)+3);
86667: if( z ){
86668: z[0] = '\'';
86669: for(i=0, j=1; zArg[i]; i++){
86670: z[j++] = zArg[i];
86671: if( zArg[i]=='\'' ){
86672: z[j++] = '\'';
86673: }
86674: }
86675: z[j++] = '\'';
86676: z[j] = 0;
86677: sqlite3_result_text(context, z, j, sqlite3_free);
86678: }
86679: break;
86680: }
86681: default: {
86682: assert( sqlite3_value_type(argv[0])==SQLITE_NULL );
86683: sqlite3_result_text(context, "NULL", 4, SQLITE_STATIC);
86684: break;
86685: }
86686: }
86687: }
86688:
86689: /*
86690: ** The hex() function. Interpret the argument as a blob. Return
86691: ** a hexadecimal rendering as text.
86692: */
86693: static void hexFunc(
86694: sqlite3_context *context,
86695: int argc,
86696: sqlite3_value **argv
86697: ){
86698: int i, n;
86699: const unsigned char *pBlob;
86700: char *zHex, *z;
86701: assert( argc==1 );
86702: UNUSED_PARAMETER(argc);
86703: pBlob = sqlite3_value_blob(argv[0]);
86704: n = sqlite3_value_bytes(argv[0]);
86705: assert( pBlob==sqlite3_value_blob(argv[0]) ); /* No encoding change */
86706: z = zHex = contextMalloc(context, ((i64)n)*2 + 1);
86707: if( zHex ){
86708: for(i=0; i<n; i++, pBlob++){
86709: unsigned char c = *pBlob;
86710: *(z++) = hexdigits[(c>>4)&0xf];
86711: *(z++) = hexdigits[c&0xf];
86712: }
86713: *z = 0;
86714: sqlite3_result_text(context, zHex, n*2, sqlite3_free);
86715: }
86716: }
86717:
86718: /*
86719: ** The zeroblob(N) function returns a zero-filled blob of size N bytes.
86720: */
86721: static void zeroblobFunc(
86722: sqlite3_context *context,
86723: int argc,
86724: sqlite3_value **argv
86725: ){
86726: i64 n;
86727: sqlite3 *db = sqlite3_context_db_handle(context);
86728: assert( argc==1 );
86729: UNUSED_PARAMETER(argc);
86730: n = sqlite3_value_int64(argv[0]);
86731: testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] );
86732: testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
86733: if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){
86734: sqlite3_result_error_toobig(context);
86735: }else{
86736: sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */
86737: }
86738: }
86739:
86740: /*
86741: ** The replace() function. Three arguments are all strings: call
86742: ** them A, B, and C. The result is also a string which is derived
86743: ** from A by replacing every occurance of B with C. The match
86744: ** must be exact. Collating sequences are not used.
86745: */
86746: static void replaceFunc(
86747: sqlite3_context *context,
86748: int argc,
86749: sqlite3_value **argv
86750: ){
86751: const unsigned char *zStr; /* The input string A */
86752: const unsigned char *zPattern; /* The pattern string B */
86753: const unsigned char *zRep; /* The replacement string C */
86754: unsigned char *zOut; /* The output */
86755: int nStr; /* Size of zStr */
86756: int nPattern; /* Size of zPattern */
86757: int nRep; /* Size of zRep */
86758: i64 nOut; /* Maximum size of zOut */
86759: int loopLimit; /* Last zStr[] that might match zPattern[] */
86760: int i, j; /* Loop counters */
86761:
86762: assert( argc==3 );
86763: UNUSED_PARAMETER(argc);
86764: zStr = sqlite3_value_text(argv[0]);
86765: if( zStr==0 ) return;
86766: nStr = sqlite3_value_bytes(argv[0]);
86767: assert( zStr==sqlite3_value_text(argv[0]) ); /* No encoding change */
86768: zPattern = sqlite3_value_text(argv[1]);
86769: if( zPattern==0 ){
86770: assert( sqlite3_value_type(argv[1])==SQLITE_NULL
86771: || sqlite3_context_db_handle(context)->mallocFailed );
86772: return;
86773: }
86774: if( zPattern[0]==0 ){
86775: assert( sqlite3_value_type(argv[1])!=SQLITE_NULL );
86776: sqlite3_result_value(context, argv[0]);
86777: return;
86778: }
86779: nPattern = sqlite3_value_bytes(argv[1]);
86780: assert( zPattern==sqlite3_value_text(argv[1]) ); /* No encoding change */
86781: zRep = sqlite3_value_text(argv[2]);
86782: if( zRep==0 ) return;
86783: nRep = sqlite3_value_bytes(argv[2]);
86784: assert( zRep==sqlite3_value_text(argv[2]) );
86785: nOut = nStr + 1;
86786: assert( nOut<SQLITE_MAX_LENGTH );
86787: zOut = contextMalloc(context, (i64)nOut);
86788: if( zOut==0 ){
86789: return;
86790: }
86791: loopLimit = nStr - nPattern;
86792: for(i=j=0; i<=loopLimit; i++){
86793: if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
86794: zOut[j++] = zStr[i];
86795: }else{
86796: u8 *zOld;
86797: sqlite3 *db = sqlite3_context_db_handle(context);
86798: nOut += nRep - nPattern;
86799: testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
86800: testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
86801: if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
86802: sqlite3_result_error_toobig(context);
86803: sqlite3_free(zOut);
86804: return;
86805: }
86806: zOld = zOut;
86807: zOut = sqlite3_realloc(zOut, (int)nOut);
86808: if( zOut==0 ){
86809: sqlite3_result_error_nomem(context);
86810: sqlite3_free(zOld);
86811: return;
86812: }
86813: memcpy(&zOut[j], zRep, nRep);
86814: j += nRep;
86815: i += nPattern-1;
86816: }
86817: }
86818: assert( j+nStr-i+1==nOut );
86819: memcpy(&zOut[j], &zStr[i], nStr-i);
86820: j += nStr - i;
86821: assert( j<=nOut );
86822: zOut[j] = 0;
86823: sqlite3_result_text(context, (char*)zOut, j, sqlite3_free);
86824: }
86825:
86826: /*
86827: ** Implementation of the TRIM(), LTRIM(), and RTRIM() functions.
86828: ** The userdata is 0x1 for left trim, 0x2 for right trim, 0x3 for both.
86829: */
86830: static void trimFunc(
86831: sqlite3_context *context,
86832: int argc,
86833: sqlite3_value **argv
86834: ){
86835: const unsigned char *zIn; /* Input string */
86836: const unsigned char *zCharSet; /* Set of characters to trim */
86837: int nIn; /* Number of bytes in input */
86838: int flags; /* 1: trimleft 2: trimright 3: trim */
86839: int i; /* Loop counter */
86840: unsigned char *aLen = 0; /* Length of each character in zCharSet */
86841: unsigned char **azChar = 0; /* Individual characters in zCharSet */
86842: int nChar; /* Number of characters in zCharSet */
86843:
86844: if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
86845: return;
86846: }
86847: zIn = sqlite3_value_text(argv[0]);
86848: if( zIn==0 ) return;
86849: nIn = sqlite3_value_bytes(argv[0]);
86850: assert( zIn==sqlite3_value_text(argv[0]) );
86851: if( argc==1 ){
86852: static const unsigned char lenOne[] = { 1 };
86853: static unsigned char * const azOne[] = { (u8*)" " };
86854: nChar = 1;
86855: aLen = (u8*)lenOne;
86856: azChar = (unsigned char **)azOne;
86857: zCharSet = 0;
86858: }else if( (zCharSet = sqlite3_value_text(argv[1]))==0 ){
86859: return;
86860: }else{
86861: const unsigned char *z;
86862: for(z=zCharSet, nChar=0; *z; nChar++){
86863: SQLITE_SKIP_UTF8(z);
86864: }
86865: if( nChar>0 ){
86866: azChar = contextMalloc(context, ((i64)nChar)*(sizeof(char*)+1));
86867: if( azChar==0 ){
86868: return;
86869: }
86870: aLen = (unsigned char*)&azChar[nChar];
86871: for(z=zCharSet, nChar=0; *z; nChar++){
86872: azChar[nChar] = (unsigned char *)z;
86873: SQLITE_SKIP_UTF8(z);
86874: aLen[nChar] = (u8)(z - azChar[nChar]);
86875: }
86876: }
86877: }
86878: if( nChar>0 ){
86879: flags = SQLITE_PTR_TO_INT(sqlite3_user_data(context));
86880: if( flags & 1 ){
86881: while( nIn>0 ){
86882: int len = 0;
86883: for(i=0; i<nChar; i++){
86884: len = aLen[i];
86885: if( len<=nIn && memcmp(zIn, azChar[i], len)==0 ) break;
86886: }
86887: if( i>=nChar ) break;
86888: zIn += len;
86889: nIn -= len;
86890: }
86891: }
86892: if( flags & 2 ){
86893: while( nIn>0 ){
86894: int len = 0;
86895: for(i=0; i<nChar; i++){
86896: len = aLen[i];
86897: if( len<=nIn && memcmp(&zIn[nIn-len],azChar[i],len)==0 ) break;
86898: }
86899: if( i>=nChar ) break;
86900: nIn -= len;
86901: }
86902: }
86903: if( zCharSet ){
86904: sqlite3_free(azChar);
86905: }
86906: }
86907: sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
86908: }
86909:
86910:
86911: /* IMP: R-25361-16150 This function is omitted from SQLite by default. It
86912: ** is only available if the SQLITE_SOUNDEX compile-time option is used
86913: ** when SQLite is built.
86914: */
86915: #ifdef SQLITE_SOUNDEX
86916: /*
86917: ** Compute the soundex encoding of a word.
86918: **
86919: ** IMP: R-59782-00072 The soundex(X) function returns a string that is the
86920: ** soundex encoding of the string X.
86921: */
86922: static void soundexFunc(
86923: sqlite3_context *context,
86924: int argc,
86925: sqlite3_value **argv
86926: ){
86927: char zResult[8];
86928: const u8 *zIn;
86929: int i, j;
86930: static const unsigned char iCode[] = {
86931: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86932: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86933: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86934: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86935: 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
86936: 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
86937: 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0,
86938: 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0,
86939: };
86940: assert( argc==1 );
86941: zIn = (u8*)sqlite3_value_text(argv[0]);
86942: if( zIn==0 ) zIn = (u8*)"";
86943: for(i=0; zIn[i] && !sqlite3Isalpha(zIn[i]); i++){}
86944: if( zIn[i] ){
86945: u8 prevcode = iCode[zIn[i]&0x7f];
86946: zResult[0] = sqlite3Toupper(zIn[i]);
86947: for(j=1; j<4 && zIn[i]; i++){
86948: int code = iCode[zIn[i]&0x7f];
86949: if( code>0 ){
86950: if( code!=prevcode ){
86951: prevcode = code;
86952: zResult[j++] = code + '0';
86953: }
86954: }else{
86955: prevcode = 0;
86956: }
86957: }
86958: while( j<4 ){
86959: zResult[j++] = '0';
86960: }
86961: zResult[j] = 0;
86962: sqlite3_result_text(context, zResult, 4, SQLITE_TRANSIENT);
86963: }else{
86964: /* IMP: R-64894-50321 The string "?000" is returned if the argument
86965: ** is NULL or contains no ASCII alphabetic characters. */
86966: sqlite3_result_text(context, "?000", 4, SQLITE_STATIC);
86967: }
86968: }
86969: #endif /* SQLITE_SOUNDEX */
86970:
86971: #ifndef SQLITE_OMIT_LOAD_EXTENSION
86972: /*
86973: ** A function that loads a shared-library extension then returns NULL.
86974: */
86975: static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){
86976: const char *zFile = (const char *)sqlite3_value_text(argv[0]);
86977: const char *zProc;
86978: sqlite3 *db = sqlite3_context_db_handle(context);
86979: char *zErrMsg = 0;
86980:
86981: if( argc==2 ){
86982: zProc = (const char *)sqlite3_value_text(argv[1]);
86983: }else{
86984: zProc = 0;
86985: }
86986: if( zFile && sqlite3_load_extension(db, zFile, zProc, &zErrMsg) ){
86987: sqlite3_result_error(context, zErrMsg, -1);
86988: sqlite3_free(zErrMsg);
86989: }
86990: }
86991: #endif
86992:
86993:
86994: /*
86995: ** An instance of the following structure holds the context of a
86996: ** sum() or avg() aggregate computation.
86997: */
86998: typedef struct SumCtx SumCtx;
86999: struct SumCtx {
87000: double rSum; /* Floating point sum */
87001: i64 iSum; /* Integer sum */
87002: i64 cnt; /* Number of elements summed */
87003: u8 overflow; /* True if integer overflow seen */
87004: u8 approx; /* True if non-integer value was input to the sum */
87005: };
87006:
87007: /*
87008: ** Routines used to compute the sum, average, and total.
87009: **
87010: ** The SUM() function follows the (broken) SQL standard which means
87011: ** that it returns NULL if it sums over no inputs. TOTAL returns
87012: ** 0.0 in that case. In addition, TOTAL always returns a float where
87013: ** SUM might return an integer if it never encounters a floating point
87014: ** value. TOTAL never fails, but SUM might through an exception if
87015: ** it overflows an integer.
87016: */
87017: static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
87018: SumCtx *p;
87019: int type;
87020: assert( argc==1 );
87021: UNUSED_PARAMETER(argc);
87022: p = sqlite3_aggregate_context(context, sizeof(*p));
87023: type = sqlite3_value_numeric_type(argv[0]);
87024: if( p && type!=SQLITE_NULL ){
87025: p->cnt++;
87026: if( type==SQLITE_INTEGER ){
87027: i64 v = sqlite3_value_int64(argv[0]);
87028: p->rSum += v;
87029: if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){
87030: p->overflow = 1;
87031: }
87032: }else{
87033: p->rSum += sqlite3_value_double(argv[0]);
87034: p->approx = 1;
87035: }
87036: }
87037: }
87038: static void sumFinalize(sqlite3_context *context){
87039: SumCtx *p;
87040: p = sqlite3_aggregate_context(context, 0);
87041: if( p && p->cnt>0 ){
87042: if( p->overflow ){
87043: sqlite3_result_error(context,"integer overflow",-1);
87044: }else if( p->approx ){
87045: sqlite3_result_double(context, p->rSum);
87046: }else{
87047: sqlite3_result_int64(context, p->iSum);
87048: }
87049: }
87050: }
87051: static void avgFinalize(sqlite3_context *context){
87052: SumCtx *p;
87053: p = sqlite3_aggregate_context(context, 0);
87054: if( p && p->cnt>0 ){
87055: sqlite3_result_double(context, p->rSum/(double)p->cnt);
87056: }
87057: }
87058: static void totalFinalize(sqlite3_context *context){
87059: SumCtx *p;
87060: p = sqlite3_aggregate_context(context, 0);
87061: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
87062: sqlite3_result_double(context, p ? p->rSum : (double)0);
87063: }
87064:
87065: /*
87066: ** The following structure keeps track of state information for the
87067: ** count() aggregate function.
87068: */
87069: typedef struct CountCtx CountCtx;
87070: struct CountCtx {
87071: i64 n;
87072: };
87073:
87074: /*
87075: ** Routines to implement the count() aggregate function.
87076: */
87077: static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){
87078: CountCtx *p;
87079: p = sqlite3_aggregate_context(context, sizeof(*p));
87080: if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){
87081: p->n++;
87082: }
87083:
87084: #ifndef SQLITE_OMIT_DEPRECATED
87085: /* The sqlite3_aggregate_count() function is deprecated. But just to make
87086: ** sure it still operates correctly, verify that its count agrees with our
87087: ** internal count when using count(*) and when the total count can be
87088: ** expressed as a 32-bit integer. */
87089: assert( argc==1 || p==0 || p->n>0x7fffffff
87090: || p->n==sqlite3_aggregate_count(context) );
87091: #endif
87092: }
87093: static void countFinalize(sqlite3_context *context){
87094: CountCtx *p;
87095: p = sqlite3_aggregate_context(context, 0);
87096: sqlite3_result_int64(context, p ? p->n : 0);
87097: }
87098:
87099: /*
87100: ** Routines to implement min() and max() aggregate functions.
87101: */
87102: static void minmaxStep(
87103: sqlite3_context *context,
87104: int NotUsed,
87105: sqlite3_value **argv
87106: ){
87107: Mem *pArg = (Mem *)argv[0];
87108: Mem *pBest;
87109: UNUSED_PARAMETER(NotUsed);
87110:
87111: pBest = (Mem *)sqlite3_aggregate_context(context, sizeof(*pBest));
87112: if( !pBest ) return;
87113:
1.2.2.1 ! misho 87114: if( sqlite3_value_type(argv[0])==SQLITE_NULL ){
! 87115: if( pBest->flags ) sqlite3SkipAccumulatorLoad(context);
! 87116: }else if( pBest->flags ){
1.2 misho 87117: int max;
87118: int cmp;
87119: CollSeq *pColl = sqlite3GetFuncCollSeq(context);
87120: /* This step function is used for both the min() and max() aggregates,
87121: ** the only difference between the two being that the sense of the
87122: ** comparison is inverted. For the max() aggregate, the
87123: ** sqlite3_user_data() function returns (void *)-1. For min() it
87124: ** returns (void *)db, where db is the sqlite3* database pointer.
87125: ** Therefore the next statement sets variable 'max' to 1 for the max()
87126: ** aggregate, or 0 for min().
87127: */
87128: max = sqlite3_user_data(context)!=0;
87129: cmp = sqlite3MemCompare(pBest, pArg, pColl);
87130: if( (max && cmp<0) || (!max && cmp>0) ){
87131: sqlite3VdbeMemCopy(pBest, pArg);
1.2.2.1 ! misho 87132: }else{
! 87133: sqlite3SkipAccumulatorLoad(context);
1.2 misho 87134: }
87135: }else{
87136: sqlite3VdbeMemCopy(pBest, pArg);
87137: }
87138: }
87139: static void minMaxFinalize(sqlite3_context *context){
87140: sqlite3_value *pRes;
87141: pRes = (sqlite3_value *)sqlite3_aggregate_context(context, 0);
87142: if( pRes ){
1.2.2.1 ! misho 87143: if( pRes->flags ){
1.2 misho 87144: sqlite3_result_value(context, pRes);
87145: }
87146: sqlite3VdbeMemRelease(pRes);
87147: }
87148: }
87149:
87150: /*
87151: ** group_concat(EXPR, ?SEPARATOR?)
87152: */
87153: static void groupConcatStep(
87154: sqlite3_context *context,
87155: int argc,
87156: sqlite3_value **argv
87157: ){
87158: const char *zVal;
87159: StrAccum *pAccum;
87160: const char *zSep;
87161: int nVal, nSep;
87162: assert( argc==1 || argc==2 );
87163: if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
87164: pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
87165:
87166: if( pAccum ){
87167: sqlite3 *db = sqlite3_context_db_handle(context);
87168: int firstTerm = pAccum->useMalloc==0;
87169: pAccum->useMalloc = 2;
87170: pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH];
87171: if( !firstTerm ){
87172: if( argc==2 ){
87173: zSep = (char*)sqlite3_value_text(argv[1]);
87174: nSep = sqlite3_value_bytes(argv[1]);
87175: }else{
87176: zSep = ",";
87177: nSep = 1;
87178: }
87179: sqlite3StrAccumAppend(pAccum, zSep, nSep);
87180: }
87181: zVal = (char*)sqlite3_value_text(argv[0]);
87182: nVal = sqlite3_value_bytes(argv[0]);
87183: sqlite3StrAccumAppend(pAccum, zVal, nVal);
87184: }
87185: }
87186: static void groupConcatFinalize(sqlite3_context *context){
87187: StrAccum *pAccum;
87188: pAccum = sqlite3_aggregate_context(context, 0);
87189: if( pAccum ){
87190: if( pAccum->tooBig ){
87191: sqlite3_result_error_toobig(context);
87192: }else if( pAccum->mallocFailed ){
87193: sqlite3_result_error_nomem(context);
87194: }else{
87195: sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1,
87196: sqlite3_free);
87197: }
87198: }
87199: }
87200:
87201: /*
87202: ** This routine does per-connection function registration. Most
87203: ** of the built-in functions above are part of the global function set.
87204: ** This routine only deals with those that are not global.
87205: */
87206: SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
87207: int rc = sqlite3_overload_function(db, "MATCH", 2);
87208: assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
87209: if( rc==SQLITE_NOMEM ){
87210: db->mallocFailed = 1;
87211: }
87212: }
87213:
87214: /*
87215: ** Set the LIKEOPT flag on the 2-argument function with the given name.
87216: */
87217: static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){
87218: FuncDef *pDef;
87219: pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName),
87220: 2, SQLITE_UTF8, 0);
87221: if( ALWAYS(pDef) ){
87222: pDef->flags = flagVal;
87223: }
87224: }
87225:
87226: /*
87227: ** Register the built-in LIKE and GLOB functions. The caseSensitive
87228: ** parameter determines whether or not the LIKE operator is case
87229: ** sensitive. GLOB is always case sensitive.
87230: */
87231: SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
87232: struct compareInfo *pInfo;
87233: if( caseSensitive ){
87234: pInfo = (struct compareInfo*)&likeInfoAlt;
87235: }else{
87236: pInfo = (struct compareInfo*)&likeInfoNorm;
87237: }
87238: sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
87239: sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0);
87240: sqlite3CreateFunc(db, "glob", 2, SQLITE_UTF8,
87241: (struct compareInfo*)&globInfo, likeFunc, 0, 0, 0);
87242: setLikeOptFlag(db, "glob", SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE);
87243: setLikeOptFlag(db, "like",
87244: caseSensitive ? (SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE) : SQLITE_FUNC_LIKE);
87245: }
87246:
87247: /*
87248: ** pExpr points to an expression which implements a function. If
87249: ** it is appropriate to apply the LIKE optimization to that function
87250: ** then set aWc[0] through aWc[2] to the wildcard characters and
87251: ** return TRUE. If the function is not a LIKE-style function then
87252: ** return FALSE.
87253: */
87254: SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){
87255: FuncDef *pDef;
87256: if( pExpr->op!=TK_FUNCTION
87257: || !pExpr->x.pList
87258: || pExpr->x.pList->nExpr!=2
87259: ){
87260: return 0;
87261: }
87262: assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
87263: pDef = sqlite3FindFunction(db, pExpr->u.zToken,
87264: sqlite3Strlen30(pExpr->u.zToken),
87265: 2, SQLITE_UTF8, 0);
87266: if( NEVER(pDef==0) || (pDef->flags & SQLITE_FUNC_LIKE)==0 ){
87267: return 0;
87268: }
87269:
87270: /* The memcpy() statement assumes that the wildcard characters are
87271: ** the first three statements in the compareInfo structure. The
87272: ** asserts() that follow verify that assumption
87273: */
87274: memcpy(aWc, pDef->pUserData, 3);
87275: assert( (char*)&likeInfoAlt == (char*)&likeInfoAlt.matchAll );
87276: assert( &((char*)&likeInfoAlt)[1] == (char*)&likeInfoAlt.matchOne );
87277: assert( &((char*)&likeInfoAlt)[2] == (char*)&likeInfoAlt.matchSet );
87278: *pIsNocase = (pDef->flags & SQLITE_FUNC_CASE)==0;
87279: return 1;
87280: }
87281:
87282: /*
87283: ** All all of the FuncDef structures in the aBuiltinFunc[] array above
87284: ** to the global function hash table. This occurs at start-time (as
87285: ** a consequence of calling sqlite3_initialize()).
87286: **
87287: ** After this routine runs
87288: */
87289: SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){
87290: /*
87291: ** The following array holds FuncDef structures for all of the functions
87292: ** defined in this file.
87293: **
87294: ** The array cannot be constant since changes are made to the
87295: ** FuncDef.pHash elements at start-time. The elements of this array
87296: ** are read-only after initialization is complete.
87297: */
87298: static SQLITE_WSD FuncDef aBuiltinFunc[] = {
87299: FUNCTION(ltrim, 1, 1, 0, trimFunc ),
87300: FUNCTION(ltrim, 2, 1, 0, trimFunc ),
87301: FUNCTION(rtrim, 1, 2, 0, trimFunc ),
87302: FUNCTION(rtrim, 2, 2, 0, trimFunc ),
87303: FUNCTION(trim, 1, 3, 0, trimFunc ),
87304: FUNCTION(trim, 2, 3, 0, trimFunc ),
87305: FUNCTION(min, -1, 0, 1, minmaxFunc ),
87306: FUNCTION(min, 0, 0, 1, 0 ),
87307: AGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize ),
87308: FUNCTION(max, -1, 1, 1, minmaxFunc ),
87309: FUNCTION(max, 0, 1, 1, 0 ),
87310: AGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize ),
1.2.2.1 ! misho 87311: FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF),
! 87312: FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH),
! 87313: FUNCTION(instr, 2, 0, 0, instrFunc ),
1.2 misho 87314: FUNCTION(substr, 2, 0, 0, substrFunc ),
87315: FUNCTION(substr, 3, 0, 0, substrFunc ),
87316: FUNCTION(abs, 1, 0, 0, absFunc ),
87317: #ifndef SQLITE_OMIT_FLOATING_POINT
87318: FUNCTION(round, 1, 0, 0, roundFunc ),
87319: FUNCTION(round, 2, 0, 0, roundFunc ),
87320: #endif
87321: FUNCTION(upper, 1, 0, 0, upperFunc ),
87322: FUNCTION(lower, 1, 0, 0, lowerFunc ),
87323: FUNCTION(coalesce, 1, 0, 0, 0 ),
87324: FUNCTION(coalesce, 0, 0, 0, 0 ),
1.2.2.1 ! misho 87325: FUNCTION2(coalesce, -1, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
1.2 misho 87326: FUNCTION(hex, 1, 0, 0, hexFunc ),
1.2.2.1 ! misho 87327: FUNCTION2(ifnull, 2, 0, 0, ifnullFunc, SQLITE_FUNC_COALESCE),
1.2 misho 87328: FUNCTION(random, 0, 0, 0, randomFunc ),
87329: FUNCTION(randomblob, 1, 0, 0, randomBlob ),
87330: FUNCTION(nullif, 2, 0, 1, nullifFunc ),
87331: FUNCTION(sqlite_version, 0, 0, 0, versionFunc ),
87332: FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ),
87333: FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ),
87334: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
87335: FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ),
87336: FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ),
87337: #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
87338: FUNCTION(quote, 1, 0, 0, quoteFunc ),
87339: FUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid),
87340: FUNCTION(changes, 0, 0, 0, changes ),
87341: FUNCTION(total_changes, 0, 0, 0, total_changes ),
87342: FUNCTION(replace, 3, 0, 0, replaceFunc ),
87343: FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ),
87344: #ifdef SQLITE_SOUNDEX
87345: FUNCTION(soundex, 1, 0, 0, soundexFunc ),
87346: #endif
87347: #ifndef SQLITE_OMIT_LOAD_EXTENSION
87348: FUNCTION(load_extension, 1, 0, 0, loadExt ),
87349: FUNCTION(load_extension, 2, 0, 0, loadExt ),
87350: #endif
87351: AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ),
87352: AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ),
87353: AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ),
87354: /* AGGREGATE(count, 0, 0, 0, countStep, countFinalize ), */
87355: {0,SQLITE_UTF8,SQLITE_FUNC_COUNT,0,0,0,countStep,countFinalize,"count",0,0},
87356: AGGREGATE(count, 1, 0, 0, countStep, countFinalize ),
87357: AGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize),
87358: AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize),
87359:
87360: LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
87361: #ifdef SQLITE_CASE_SENSITIVE_LIKE
87362: LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
87363: LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE),
87364: #else
87365: LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE),
87366: LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE),
87367: #endif
87368: };
87369:
87370: int i;
87371: FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
87372: FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc);
87373:
87374: for(i=0; i<ArraySize(aBuiltinFunc); i++){
87375: sqlite3FuncDefInsert(pHash, &aFunc[i]);
87376: }
87377: sqlite3RegisterDateTimeFunctions();
87378: #ifndef SQLITE_OMIT_ALTERTABLE
87379: sqlite3AlterFunctions();
87380: #endif
87381: }
87382:
87383: /************** End of func.c ************************************************/
87384: /************** Begin file fkey.c ********************************************/
87385: /*
87386: **
87387: ** The author disclaims copyright to this source code. In place of
87388: ** a legal notice, here is a blessing:
87389: **
87390: ** May you do good and not evil.
87391: ** May you find forgiveness for yourself and forgive others.
87392: ** May you share freely, never taking more than you give.
87393: **
87394: *************************************************************************
87395: ** This file contains code used by the compiler to add foreign key
87396: ** support to compiled SQL statements.
87397: */
87398:
87399: #ifndef SQLITE_OMIT_FOREIGN_KEY
87400: #ifndef SQLITE_OMIT_TRIGGER
87401:
87402: /*
87403: ** Deferred and Immediate FKs
87404: ** --------------------------
87405: **
87406: ** Foreign keys in SQLite come in two flavours: deferred and immediate.
87407: ** If an immediate foreign key constraint is violated, SQLITE_CONSTRAINT
87408: ** is returned and the current statement transaction rolled back. If a
87409: ** deferred foreign key constraint is violated, no action is taken
87410: ** immediately. However if the application attempts to commit the
87411: ** transaction before fixing the constraint violation, the attempt fails.
87412: **
87413: ** Deferred constraints are implemented using a simple counter associated
87414: ** with the database handle. The counter is set to zero each time a
87415: ** database transaction is opened. Each time a statement is executed
87416: ** that causes a foreign key violation, the counter is incremented. Each
87417: ** time a statement is executed that removes an existing violation from
87418: ** the database, the counter is decremented. When the transaction is
87419: ** committed, the commit fails if the current value of the counter is
87420: ** greater than zero. This scheme has two big drawbacks:
87421: **
87422: ** * When a commit fails due to a deferred foreign key constraint,
87423: ** there is no way to tell which foreign constraint is not satisfied,
87424: ** or which row it is not satisfied for.
87425: **
87426: ** * If the database contains foreign key violations when the
87427: ** transaction is opened, this may cause the mechanism to malfunction.
87428: **
87429: ** Despite these problems, this approach is adopted as it seems simpler
87430: ** than the alternatives.
87431: **
87432: ** INSERT operations:
87433: **
87434: ** I.1) For each FK for which the table is the child table, search
87435: ** the parent table for a match. If none is found increment the
87436: ** constraint counter.
87437: **
87438: ** I.2) For each FK for which the table is the parent table,
87439: ** search the child table for rows that correspond to the new
87440: ** row in the parent table. Decrement the counter for each row
87441: ** found (as the constraint is now satisfied).
87442: **
87443: ** DELETE operations:
87444: **
87445: ** D.1) For each FK for which the table is the child table,
87446: ** search the parent table for a row that corresponds to the
87447: ** deleted row in the child table. If such a row is not found,
87448: ** decrement the counter.
87449: **
87450: ** D.2) For each FK for which the table is the parent table, search
87451: ** the child table for rows that correspond to the deleted row
87452: ** in the parent table. For each found increment the counter.
87453: **
87454: ** UPDATE operations:
87455: **
87456: ** An UPDATE command requires that all 4 steps above are taken, but only
87457: ** for FK constraints for which the affected columns are actually
87458: ** modified (values must be compared at runtime).
87459: **
87460: ** Note that I.1 and D.1 are very similar operations, as are I.2 and D.2.
87461: ** This simplifies the implementation a bit.
87462: **
87463: ** For the purposes of immediate FK constraints, the OR REPLACE conflict
87464: ** resolution is considered to delete rows before the new row is inserted.
87465: ** If a delete caused by OR REPLACE violates an FK constraint, an exception
87466: ** is thrown, even if the FK constraint would be satisfied after the new
87467: ** row is inserted.
87468: **
87469: ** Immediate constraints are usually handled similarly. The only difference
87470: ** is that the counter used is stored as part of each individual statement
87471: ** object (struct Vdbe). If, after the statement has run, its immediate
87472: ** constraint counter is greater than zero, it returns SQLITE_CONSTRAINT
87473: ** and the statement transaction is rolled back. An exception is an INSERT
87474: ** statement that inserts a single row only (no triggers). In this case,
87475: ** instead of using a counter, an exception is thrown immediately if the
87476: ** INSERT violates a foreign key constraint. This is necessary as such
87477: ** an INSERT does not open a statement transaction.
87478: **
87479: ** TODO: How should dropping a table be handled? How should renaming a
87480: ** table be handled?
87481: **
87482: **
87483: ** Query API Notes
87484: ** ---------------
87485: **
87486: ** Before coding an UPDATE or DELETE row operation, the code-generator
87487: ** for those two operations needs to know whether or not the operation
87488: ** requires any FK processing and, if so, which columns of the original
87489: ** row are required by the FK processing VDBE code (i.e. if FKs were
87490: ** implemented using triggers, which of the old.* columns would be
87491: ** accessed). No information is required by the code-generator before
87492: ** coding an INSERT operation. The functions used by the UPDATE/DELETE
87493: ** generation code to query for this information are:
87494: **
87495: ** sqlite3FkRequired() - Test to see if FK processing is required.
87496: ** sqlite3FkOldmask() - Query for the set of required old.* columns.
87497: **
87498: **
87499: ** Externally accessible module functions
87500: ** --------------------------------------
87501: **
87502: ** sqlite3FkCheck() - Check for foreign key violations.
87503: ** sqlite3FkActions() - Code triggers for ON UPDATE/ON DELETE actions.
87504: ** sqlite3FkDelete() - Delete an FKey structure.
87505: */
87506:
87507: /*
87508: ** VDBE Calling Convention
87509: ** -----------------------
87510: **
87511: ** Example:
87512: **
87513: ** For the following INSERT statement:
87514: **
87515: ** CREATE TABLE t1(a, b INTEGER PRIMARY KEY, c);
87516: ** INSERT INTO t1 VALUES(1, 2, 3.1);
87517: **
87518: ** Register (x): 2 (type integer)
87519: ** Register (x+1): 1 (type integer)
87520: ** Register (x+2): NULL (type NULL)
87521: ** Register (x+3): 3.1 (type real)
87522: */
87523:
87524: /*
87525: ** A foreign key constraint requires that the key columns in the parent
87526: ** table are collectively subject to a UNIQUE or PRIMARY KEY constraint.
87527: ** Given that pParent is the parent table for foreign key constraint pFKey,
87528: ** search the schema a unique index on the parent key columns.
87529: **
87530: ** If successful, zero is returned. If the parent key is an INTEGER PRIMARY
87531: ** KEY column, then output variable *ppIdx is set to NULL. Otherwise, *ppIdx
87532: ** is set to point to the unique index.
87533: **
87534: ** If the parent key consists of a single column (the foreign key constraint
87535: ** is not a composite foreign key), output variable *paiCol is set to NULL.
87536: ** Otherwise, it is set to point to an allocated array of size N, where
87537: ** N is the number of columns in the parent key. The first element of the
87538: ** array is the index of the child table column that is mapped by the FK
87539: ** constraint to the parent table column stored in the left-most column
87540: ** of index *ppIdx. The second element of the array is the index of the
87541: ** child table column that corresponds to the second left-most column of
87542: ** *ppIdx, and so on.
87543: **
87544: ** If the required index cannot be found, either because:
87545: **
87546: ** 1) The named parent key columns do not exist, or
87547: **
87548: ** 2) The named parent key columns do exist, but are not subject to a
87549: ** UNIQUE or PRIMARY KEY constraint, or
87550: **
87551: ** 3) No parent key columns were provided explicitly as part of the
87552: ** foreign key definition, and the parent table does not have a
87553: ** PRIMARY KEY, or
87554: **
87555: ** 4) No parent key columns were provided explicitly as part of the
87556: ** foreign key definition, and the PRIMARY KEY of the parent table
87557: ** consists of a a different number of columns to the child key in
87558: ** the child table.
87559: **
87560: ** then non-zero is returned, and a "foreign key mismatch" error loaded
87561: ** into pParse. If an OOM error occurs, non-zero is returned and the
87562: ** pParse->db->mallocFailed flag is set.
87563: */
87564: static int locateFkeyIndex(
87565: Parse *pParse, /* Parse context to store any error in */
87566: Table *pParent, /* Parent table of FK constraint pFKey */
87567: FKey *pFKey, /* Foreign key to find index for */
87568: Index **ppIdx, /* OUT: Unique index on parent table */
87569: int **paiCol /* OUT: Map of index columns in pFKey */
87570: ){
87571: Index *pIdx = 0; /* Value to return via *ppIdx */
87572: int *aiCol = 0; /* Value to return via *paiCol */
87573: int nCol = pFKey->nCol; /* Number of columns in parent key */
87574: char *zKey = pFKey->aCol[0].zCol; /* Name of left-most parent key column */
87575:
87576: /* The caller is responsible for zeroing output parameters. */
87577: assert( ppIdx && *ppIdx==0 );
87578: assert( !paiCol || *paiCol==0 );
87579: assert( pParse );
87580:
87581: /* If this is a non-composite (single column) foreign key, check if it
87582: ** maps to the INTEGER PRIMARY KEY of table pParent. If so, leave *ppIdx
87583: ** and *paiCol set to zero and return early.
87584: **
87585: ** Otherwise, for a composite foreign key (more than one column), allocate
87586: ** space for the aiCol array (returned via output parameter *paiCol).
87587: ** Non-composite foreign keys do not require the aiCol array.
87588: */
87589: if( nCol==1 ){
87590: /* The FK maps to the IPK if any of the following are true:
87591: **
87592: ** 1) There is an INTEGER PRIMARY KEY column and the FK is implicitly
87593: ** mapped to the primary key of table pParent, or
87594: ** 2) The FK is explicitly mapped to a column declared as INTEGER
87595: ** PRIMARY KEY.
87596: */
87597: if( pParent->iPKey>=0 ){
87598: if( !zKey ) return 0;
87599: if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0;
87600: }
87601: }else if( paiCol ){
87602: assert( nCol>1 );
87603: aiCol = (int *)sqlite3DbMallocRaw(pParse->db, nCol*sizeof(int));
87604: if( !aiCol ) return 1;
87605: *paiCol = aiCol;
87606: }
87607:
87608: for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){
87609: if( pIdx->nColumn==nCol && pIdx->onError!=OE_None ){
87610: /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number
87611: ** of columns. If each indexed column corresponds to a foreign key
87612: ** column of pFKey, then this index is a winner. */
87613:
87614: if( zKey==0 ){
87615: /* If zKey is NULL, then this foreign key is implicitly mapped to
87616: ** the PRIMARY KEY of table pParent. The PRIMARY KEY index may be
87617: ** identified by the test (Index.autoIndex==2). */
87618: if( pIdx->autoIndex==2 ){
87619: if( aiCol ){
87620: int i;
87621: for(i=0; i<nCol; i++) aiCol[i] = pFKey->aCol[i].iFrom;
87622: }
87623: break;
87624: }
87625: }else{
87626: /* If zKey is non-NULL, then this foreign key was declared to
87627: ** map to an explicit list of columns in table pParent. Check if this
87628: ** index matches those columns. Also, check that the index uses
87629: ** the default collation sequences for each column. */
87630: int i, j;
87631: for(i=0; i<nCol; i++){
87632: int iCol = pIdx->aiColumn[i]; /* Index of column in parent tbl */
87633: char *zDfltColl; /* Def. collation for column */
87634: char *zIdxCol; /* Name of indexed column */
87635:
87636: /* If the index uses a collation sequence that is different from
87637: ** the default collation sequence for the column, this index is
87638: ** unusable. Bail out early in this case. */
87639: zDfltColl = pParent->aCol[iCol].zColl;
87640: if( !zDfltColl ){
87641: zDfltColl = "BINARY";
87642: }
87643: if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break;
87644:
87645: zIdxCol = pParent->aCol[iCol].zName;
87646: for(j=0; j<nCol; j++){
87647: if( sqlite3StrICmp(pFKey->aCol[j].zCol, zIdxCol)==0 ){
87648: if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom;
87649: break;
87650: }
87651: }
87652: if( j==nCol ) break;
87653: }
87654: if( i==nCol ) break; /* pIdx is usable */
87655: }
87656: }
87657: }
87658:
87659: if( !pIdx ){
87660: if( !pParse->disableTriggers ){
87661: sqlite3ErrorMsg(pParse, "foreign key mismatch");
87662: }
87663: sqlite3DbFree(pParse->db, aiCol);
87664: return 1;
87665: }
87666:
87667: *ppIdx = pIdx;
87668: return 0;
87669: }
87670:
87671: /*
87672: ** This function is called when a row is inserted into or deleted from the
87673: ** child table of foreign key constraint pFKey. If an SQL UPDATE is executed
87674: ** on the child table of pFKey, this function is invoked twice for each row
87675: ** affected - once to "delete" the old row, and then again to "insert" the
87676: ** new row.
87677: **
87678: ** Each time it is called, this function generates VDBE code to locate the
87679: ** row in the parent table that corresponds to the row being inserted into
87680: ** or deleted from the child table. If the parent row can be found, no
87681: ** special action is taken. Otherwise, if the parent row can *not* be
87682: ** found in the parent table:
87683: **
87684: ** Operation | FK type | Action taken
87685: ** --------------------------------------------------------------------------
87686: ** INSERT immediate Increment the "immediate constraint counter".
87687: **
87688: ** DELETE immediate Decrement the "immediate constraint counter".
87689: **
87690: ** INSERT deferred Increment the "deferred constraint counter".
87691: **
87692: ** DELETE deferred Decrement the "deferred constraint counter".
87693: **
87694: ** These operations are identified in the comment at the top of this file
87695: ** (fkey.c) as "I.1" and "D.1".
87696: */
87697: static void fkLookupParent(
87698: Parse *pParse, /* Parse context */
87699: int iDb, /* Index of database housing pTab */
87700: Table *pTab, /* Parent table of FK pFKey */
87701: Index *pIdx, /* Unique index on parent key columns in pTab */
87702: FKey *pFKey, /* Foreign key constraint */
87703: int *aiCol, /* Map from parent key columns to child table columns */
87704: int regData, /* Address of array containing child table row */
87705: int nIncr, /* Increment constraint counter by this */
87706: int isIgnore /* If true, pretend pTab contains all NULL values */
87707: ){
87708: int i; /* Iterator variable */
87709: Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */
87710: int iCur = pParse->nTab - 1; /* Cursor number to use */
87711: int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */
87712:
87713: /* If nIncr is less than zero, then check at runtime if there are any
87714: ** outstanding constraints to resolve. If there are not, there is no need
87715: ** to check if deleting this row resolves any outstanding violations.
87716: **
87717: ** Check if any of the key columns in the child table row are NULL. If
87718: ** any are, then the constraint is considered satisfied. No need to
87719: ** search for a matching row in the parent table. */
87720: if( nIncr<0 ){
87721: sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, iOk);
87722: }
87723: for(i=0; i<pFKey->nCol; i++){
87724: int iReg = aiCol[i] + regData + 1;
87725: sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk);
87726: }
87727:
87728: if( isIgnore==0 ){
87729: if( pIdx==0 ){
87730: /* If pIdx is NULL, then the parent key is the INTEGER PRIMARY KEY
87731: ** column of the parent table (table pTab). */
87732: int iMustBeInt; /* Address of MustBeInt instruction */
87733: int regTemp = sqlite3GetTempReg(pParse);
87734:
87735: /* Invoke MustBeInt to coerce the child key value to an integer (i.e.
87736: ** apply the affinity of the parent key). If this fails, then there
87737: ** is no matching parent key. Before using MustBeInt, make a copy of
87738: ** the value. Otherwise, the value inserted into the child key column
87739: ** will have INTEGER affinity applied to it, which may not be correct. */
87740: sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp);
87741: iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0);
87742:
87743: /* If the parent table is the same as the child table, and we are about
87744: ** to increment the constraint-counter (i.e. this is an INSERT operation),
87745: ** then check if the row being inserted matches itself. If so, do not
87746: ** increment the constraint-counter. */
87747: if( pTab==pFKey->pFrom && nIncr==1 ){
87748: sqlite3VdbeAddOp3(v, OP_Eq, regData, iOk, regTemp);
87749: }
87750:
87751: sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead);
87752: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp);
87753: sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk);
87754: sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2);
87755: sqlite3VdbeJumpHere(v, iMustBeInt);
87756: sqlite3ReleaseTempReg(pParse, regTemp);
87757: }else{
87758: int nCol = pFKey->nCol;
87759: int regTemp = sqlite3GetTempRange(pParse, nCol);
87760: int regRec = sqlite3GetTempReg(pParse);
87761: KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
87762:
87763: sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb);
87764: sqlite3VdbeChangeP4(v, -1, (char*)pKey, P4_KEYINFO_HANDOFF);
87765: for(i=0; i<nCol; i++){
87766: sqlite3VdbeAddOp2(v, OP_Copy, aiCol[i]+1+regData, regTemp+i);
87767: }
87768:
87769: /* If the parent table is the same as the child table, and we are about
87770: ** to increment the constraint-counter (i.e. this is an INSERT operation),
87771: ** then check if the row being inserted matches itself. If so, do not
87772: ** increment the constraint-counter.
87773: **
87774: ** If any of the parent-key values are NULL, then the row cannot match
87775: ** itself. So set JUMPIFNULL to make sure we do the OP_Found if any
87776: ** of the parent-key values are NULL (at this point it is known that
87777: ** none of the child key values are).
87778: */
87779: if( pTab==pFKey->pFrom && nIncr==1 ){
87780: int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1;
87781: for(i=0; i<nCol; i++){
87782: int iChild = aiCol[i]+1+regData;
87783: int iParent = pIdx->aiColumn[i]+1+regData;
87784: assert( aiCol[i]!=pTab->iPKey );
87785: if( pIdx->aiColumn[i]==pTab->iPKey ){
87786: /* The parent key is a composite key that includes the IPK column */
87787: iParent = regData;
87788: }
87789: sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent);
87790: sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
87791: }
87792: sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk);
87793: }
87794:
87795: sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec);
87796: sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v,pIdx), P4_TRANSIENT);
87797: sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0);
87798:
87799: sqlite3ReleaseTempReg(pParse, regRec);
87800: sqlite3ReleaseTempRange(pParse, regTemp, nCol);
87801: }
87802: }
87803:
87804: if( !pFKey->isDeferred && !pParse->pToplevel && !pParse->isMultiWrite ){
87805: /* Special case: If this is an INSERT statement that will insert exactly
87806: ** one row into the table, raise a constraint immediately instead of
87807: ** incrementing a counter. This is necessary as the VM code is being
87808: ** generated for will not open a statement transaction. */
87809: assert( nIncr==1 );
87810: sqlite3HaltConstraint(
87811: pParse, OE_Abort, "foreign key constraint failed", P4_STATIC
87812: );
87813: }else{
87814: if( nIncr>0 && pFKey->isDeferred==0 ){
87815: sqlite3ParseToplevel(pParse)->mayAbort = 1;
87816: }
87817: sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
87818: }
87819:
87820: sqlite3VdbeResolveLabel(v, iOk);
87821: sqlite3VdbeAddOp1(v, OP_Close, iCur);
87822: }
87823:
87824: /*
87825: ** This function is called to generate code executed when a row is deleted
87826: ** from the parent table of foreign key constraint pFKey and, if pFKey is
87827: ** deferred, when a row is inserted into the same table. When generating
87828: ** code for an SQL UPDATE operation, this function may be called twice -
87829: ** once to "delete" the old row and once to "insert" the new row.
87830: **
87831: ** The code generated by this function scans through the rows in the child
87832: ** table that correspond to the parent table row being deleted or inserted.
87833: ** For each child row found, one of the following actions is taken:
87834: **
87835: ** Operation | FK type | Action taken
87836: ** --------------------------------------------------------------------------
87837: ** DELETE immediate Increment the "immediate constraint counter".
87838: ** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
87839: ** throw a "foreign key constraint failed" exception.
87840: **
87841: ** INSERT immediate Decrement the "immediate constraint counter".
87842: **
87843: ** DELETE deferred Increment the "deferred constraint counter".
87844: ** Or, if the ON (UPDATE|DELETE) action is RESTRICT,
87845: ** throw a "foreign key constraint failed" exception.
87846: **
87847: ** INSERT deferred Decrement the "deferred constraint counter".
87848: **
87849: ** These operations are identified in the comment at the top of this file
87850: ** (fkey.c) as "I.2" and "D.2".
87851: */
87852: static void fkScanChildren(
87853: Parse *pParse, /* Parse context */
87854: SrcList *pSrc, /* SrcList containing the table to scan */
87855: Table *pTab,
87856: Index *pIdx, /* Foreign key index */
87857: FKey *pFKey, /* Foreign key relationship */
87858: int *aiCol, /* Map from pIdx cols to child table cols */
87859: int regData, /* Referenced table data starts here */
87860: int nIncr /* Amount to increment deferred counter by */
87861: ){
87862: sqlite3 *db = pParse->db; /* Database handle */
87863: int i; /* Iterator variable */
87864: Expr *pWhere = 0; /* WHERE clause to scan with */
87865: NameContext sNameContext; /* Context used to resolve WHERE clause */
87866: WhereInfo *pWInfo; /* Context used by sqlite3WhereXXX() */
87867: int iFkIfZero = 0; /* Address of OP_FkIfZero */
87868: Vdbe *v = sqlite3GetVdbe(pParse);
87869:
87870: assert( !pIdx || pIdx->pTable==pTab );
87871:
87872: if( nIncr<0 ){
87873: iFkIfZero = sqlite3VdbeAddOp2(v, OP_FkIfZero, pFKey->isDeferred, 0);
87874: }
87875:
87876: /* Create an Expr object representing an SQL expression like:
87877: **
87878: ** <parent-key1> = <child-key1> AND <parent-key2> = <child-key2> ...
87879: **
87880: ** The collation sequence used for the comparison should be that of
87881: ** the parent key columns. The affinity of the parent key column should
87882: ** be applied to each child key value before the comparison takes place.
87883: */
87884: for(i=0; i<pFKey->nCol; i++){
87885: Expr *pLeft; /* Value from parent table row */
87886: Expr *pRight; /* Column ref to child table */
87887: Expr *pEq; /* Expression (pLeft = pRight) */
87888: int iCol; /* Index of column in child table */
87889: const char *zCol; /* Name of column in child table */
87890:
87891: pLeft = sqlite3Expr(db, TK_REGISTER, 0);
87892: if( pLeft ){
87893: /* Set the collation sequence and affinity of the LHS of each TK_EQ
87894: ** expression to the parent key column defaults. */
87895: if( pIdx ){
87896: Column *pCol;
1.2.2.1 ! misho 87897: const char *zColl;
1.2 misho 87898: iCol = pIdx->aiColumn[i];
87899: pCol = &pTab->aCol[iCol];
87900: if( pTab->iPKey==iCol ) iCol = -1;
87901: pLeft->iTable = regData+iCol+1;
87902: pLeft->affinity = pCol->affinity;
1.2.2.1 ! misho 87903: zColl = pCol->zColl;
! 87904: if( zColl==0 ) zColl = db->pDfltColl->zName;
! 87905: pLeft = sqlite3ExprAddCollateString(pParse, pLeft, zColl);
1.2 misho 87906: }else{
87907: pLeft->iTable = regData;
87908: pLeft->affinity = SQLITE_AFF_INTEGER;
87909: }
87910: }
87911: iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom;
87912: assert( iCol>=0 );
87913: zCol = pFKey->pFrom->aCol[iCol].zName;
87914: pRight = sqlite3Expr(db, TK_ID, zCol);
87915: pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0);
87916: pWhere = sqlite3ExprAnd(db, pWhere, pEq);
87917: }
87918:
87919: /* If the child table is the same as the parent table, and this scan
87920: ** is taking place as part of a DELETE operation (operation D.2), omit the
87921: ** row being deleted from the scan by adding ($rowid != rowid) to the WHERE
87922: ** clause, where $rowid is the rowid of the row being deleted. */
87923: if( pTab==pFKey->pFrom && nIncr>0 ){
87924: Expr *pEq; /* Expression (pLeft = pRight) */
87925: Expr *pLeft; /* Value from parent table row */
87926: Expr *pRight; /* Column ref to child table */
87927: pLeft = sqlite3Expr(db, TK_REGISTER, 0);
87928: pRight = sqlite3Expr(db, TK_COLUMN, 0);
87929: if( pLeft && pRight ){
87930: pLeft->iTable = regData;
87931: pLeft->affinity = SQLITE_AFF_INTEGER;
87932: pRight->iTable = pSrc->a[0].iCursor;
87933: pRight->iColumn = -1;
87934: }
87935: pEq = sqlite3PExpr(pParse, TK_NE, pLeft, pRight, 0);
87936: pWhere = sqlite3ExprAnd(db, pWhere, pEq);
87937: }
87938:
87939: /* Resolve the references in the WHERE clause. */
87940: memset(&sNameContext, 0, sizeof(NameContext));
87941: sNameContext.pSrcList = pSrc;
87942: sNameContext.pParse = pParse;
87943: sqlite3ResolveExprNames(&sNameContext, pWhere);
87944:
87945: /* Create VDBE to loop through the entries in pSrc that match the WHERE
87946: ** clause. If the constraint is not deferred, throw an exception for
87947: ** each row found. Otherwise, for deferred constraints, increment the
87948: ** deferred constraint counter by nIncr for each row selected. */
1.2.2.1 ! misho 87949: pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0);
1.2 misho 87950: if( nIncr>0 && pFKey->isDeferred==0 ){
87951: sqlite3ParseToplevel(pParse)->mayAbort = 1;
87952: }
87953: sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
87954: if( pWInfo ){
87955: sqlite3WhereEnd(pWInfo);
87956: }
87957:
87958: /* Clean up the WHERE clause constructed above. */
87959: sqlite3ExprDelete(db, pWhere);
87960: if( iFkIfZero ){
87961: sqlite3VdbeJumpHere(v, iFkIfZero);
87962: }
87963: }
87964:
87965: /*
87966: ** This function returns a pointer to the head of a linked list of FK
87967: ** constraints for which table pTab is the parent table. For example,
87968: ** given the following schema:
87969: **
87970: ** CREATE TABLE t1(a PRIMARY KEY);
87971: ** CREATE TABLE t2(b REFERENCES t1(a);
87972: **
87973: ** Calling this function with table "t1" as an argument returns a pointer
87974: ** to the FKey structure representing the foreign key constraint on table
87975: ** "t2". Calling this function with "t2" as the argument would return a
87976: ** NULL pointer (as there are no FK constraints for which t2 is the parent
87977: ** table).
87978: */
87979: SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *pTab){
87980: int nName = sqlite3Strlen30(pTab->zName);
87981: return (FKey *)sqlite3HashFind(&pTab->pSchema->fkeyHash, pTab->zName, nName);
87982: }
87983:
87984: /*
87985: ** The second argument is a Trigger structure allocated by the
87986: ** fkActionTrigger() routine. This function deletes the Trigger structure
87987: ** and all of its sub-components.
87988: **
87989: ** The Trigger structure or any of its sub-components may be allocated from
87990: ** the lookaside buffer belonging to database handle dbMem.
87991: */
87992: static void fkTriggerDelete(sqlite3 *dbMem, Trigger *p){
87993: if( p ){
87994: TriggerStep *pStep = p->step_list;
87995: sqlite3ExprDelete(dbMem, pStep->pWhere);
87996: sqlite3ExprListDelete(dbMem, pStep->pExprList);
87997: sqlite3SelectDelete(dbMem, pStep->pSelect);
87998: sqlite3ExprDelete(dbMem, p->pWhen);
87999: sqlite3DbFree(dbMem, p);
88000: }
88001: }
88002:
88003: /*
88004: ** This function is called to generate code that runs when table pTab is
88005: ** being dropped from the database. The SrcList passed as the second argument
88006: ** to this function contains a single entry guaranteed to resolve to
88007: ** table pTab.
88008: **
88009: ** Normally, no code is required. However, if either
88010: **
88011: ** (a) The table is the parent table of a FK constraint, or
88012: ** (b) The table is the child table of a deferred FK constraint and it is
88013: ** determined at runtime that there are outstanding deferred FK
88014: ** constraint violations in the database,
88015: **
88016: ** then the equivalent of "DELETE FROM <tbl>" is executed before dropping
88017: ** the table from the database. Triggers are disabled while running this
88018: ** DELETE, but foreign key actions are not.
88019: */
88020: SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){
88021: sqlite3 *db = pParse->db;
88022: if( (db->flags&SQLITE_ForeignKeys) && !IsVirtual(pTab) && !pTab->pSelect ){
88023: int iSkip = 0;
88024: Vdbe *v = sqlite3GetVdbe(pParse);
88025:
88026: assert( v ); /* VDBE has already been allocated */
88027: if( sqlite3FkReferences(pTab)==0 ){
88028: /* Search for a deferred foreign key constraint for which this table
88029: ** is the child table. If one cannot be found, return without
88030: ** generating any VDBE code. If one can be found, then jump over
88031: ** the entire DELETE if there are no outstanding deferred constraints
88032: ** when this statement is run. */
88033: FKey *p;
88034: for(p=pTab->pFKey; p; p=p->pNextFrom){
88035: if( p->isDeferred ) break;
88036: }
88037: if( !p ) return;
88038: iSkip = sqlite3VdbeMakeLabel(v);
88039: sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip);
88040: }
88041:
88042: pParse->disableTriggers = 1;
88043: sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0);
88044: pParse->disableTriggers = 0;
88045:
88046: /* If the DELETE has generated immediate foreign key constraint
88047: ** violations, halt the VDBE and return an error at this point, before
88048: ** any modifications to the schema are made. This is because statement
88049: ** transactions are not able to rollback schema changes. */
88050: sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2);
88051: sqlite3HaltConstraint(
88052: pParse, OE_Abort, "foreign key constraint failed", P4_STATIC
88053: );
88054:
88055: if( iSkip ){
88056: sqlite3VdbeResolveLabel(v, iSkip);
88057: }
88058: }
88059: }
88060:
88061: /*
88062: ** This function is called when inserting, deleting or updating a row of
88063: ** table pTab to generate VDBE code to perform foreign key constraint
88064: ** processing for the operation.
88065: **
88066: ** For a DELETE operation, parameter regOld is passed the index of the
88067: ** first register in an array of (pTab->nCol+1) registers containing the
88068: ** rowid of the row being deleted, followed by each of the column values
88069: ** of the row being deleted, from left to right. Parameter regNew is passed
88070: ** zero in this case.
88071: **
88072: ** For an INSERT operation, regOld is passed zero and regNew is passed the
88073: ** first register of an array of (pTab->nCol+1) registers containing the new
88074: ** row data.
88075: **
88076: ** For an UPDATE operation, this function is called twice. Once before
88077: ** the original record is deleted from the table using the calling convention
88078: ** described for DELETE. Then again after the original record is deleted
88079: ** but before the new record is inserted using the INSERT convention.
88080: */
88081: SQLITE_PRIVATE void sqlite3FkCheck(
88082: Parse *pParse, /* Parse context */
88083: Table *pTab, /* Row is being deleted from this table */
88084: int regOld, /* Previous row data is stored here */
88085: int regNew /* New row data is stored here */
88086: ){
88087: sqlite3 *db = pParse->db; /* Database handle */
88088: FKey *pFKey; /* Used to iterate through FKs */
88089: int iDb; /* Index of database containing pTab */
88090: const char *zDb; /* Name of database containing pTab */
88091: int isIgnoreErrors = pParse->disableTriggers;
88092:
88093: /* Exactly one of regOld and regNew should be non-zero. */
88094: assert( (regOld==0)!=(regNew==0) );
88095:
88096: /* If foreign-keys are disabled, this function is a no-op. */
88097: if( (db->flags&SQLITE_ForeignKeys)==0 ) return;
88098:
88099: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
88100: zDb = db->aDb[iDb].zName;
88101:
88102: /* Loop through all the foreign key constraints for which pTab is the
88103: ** child table (the table that the foreign key definition is part of). */
88104: for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){
88105: Table *pTo; /* Parent table of foreign key pFKey */
88106: Index *pIdx = 0; /* Index on key columns in pTo */
88107: int *aiFree = 0;
88108: int *aiCol;
88109: int iCol;
88110: int i;
88111: int isIgnore = 0;
88112:
88113: /* Find the parent table of this foreign key. Also find a unique index
88114: ** on the parent key columns in the parent table. If either of these
88115: ** schema items cannot be located, set an error in pParse and return
88116: ** early. */
88117: if( pParse->disableTriggers ){
88118: pTo = sqlite3FindTable(db, pFKey->zTo, zDb);
88119: }else{
88120: pTo = sqlite3LocateTable(pParse, 0, pFKey->zTo, zDb);
88121: }
88122: if( !pTo || locateFkeyIndex(pParse, pTo, pFKey, &pIdx, &aiFree) ){
88123: assert( isIgnoreErrors==0 || (regOld!=0 && regNew==0) );
88124: if( !isIgnoreErrors || db->mallocFailed ) return;
88125: if( pTo==0 ){
88126: /* If isIgnoreErrors is true, then a table is being dropped. In this
88127: ** case SQLite runs a "DELETE FROM xxx" on the table being dropped
88128: ** before actually dropping it in order to check FK constraints.
88129: ** If the parent table of an FK constraint on the current table is
88130: ** missing, behave as if it is empty. i.e. decrement the relevant
88131: ** FK counter for each row of the current table with non-NULL keys.
88132: */
88133: Vdbe *v = sqlite3GetVdbe(pParse);
88134: int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1;
88135: for(i=0; i<pFKey->nCol; i++){
88136: int iReg = pFKey->aCol[i].iFrom + regOld + 1;
88137: sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump);
88138: }
88139: sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1);
88140: }
88141: continue;
88142: }
88143: assert( pFKey->nCol==1 || (aiFree && pIdx) );
88144:
88145: if( aiFree ){
88146: aiCol = aiFree;
88147: }else{
88148: iCol = pFKey->aCol[0].iFrom;
88149: aiCol = &iCol;
88150: }
88151: for(i=0; i<pFKey->nCol; i++){
88152: if( aiCol[i]==pTab->iPKey ){
88153: aiCol[i] = -1;
88154: }
88155: #ifndef SQLITE_OMIT_AUTHORIZATION
88156: /* Request permission to read the parent key columns. If the
88157: ** authorization callback returns SQLITE_IGNORE, behave as if any
88158: ** values read from the parent table are NULL. */
88159: if( db->xAuth ){
88160: int rcauth;
88161: char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName;
88162: rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb);
88163: isIgnore = (rcauth==SQLITE_IGNORE);
88164: }
88165: #endif
88166: }
88167:
88168: /* Take a shared-cache advisory read-lock on the parent table. Allocate
88169: ** a cursor to use to search the unique index on the parent key columns
88170: ** in the parent table. */
88171: sqlite3TableLock(pParse, iDb, pTo->tnum, 0, pTo->zName);
88172: pParse->nTab++;
88173:
88174: if( regOld!=0 ){
88175: /* A row is being removed from the child table. Search for the parent.
88176: ** If the parent does not exist, removing the child row resolves an
88177: ** outstanding foreign key constraint violation. */
88178: fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regOld, -1,isIgnore);
88179: }
88180: if( regNew!=0 ){
88181: /* A row is being added to the child table. If a parent row cannot
88182: ** be found, adding the child row has violated the FK constraint. */
88183: fkLookupParent(pParse, iDb, pTo, pIdx, pFKey, aiCol, regNew, +1,isIgnore);
88184: }
88185:
88186: sqlite3DbFree(db, aiFree);
88187: }
88188:
88189: /* Loop through all the foreign key constraints that refer to this table */
88190: for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){
88191: Index *pIdx = 0; /* Foreign key index for pFKey */
88192: SrcList *pSrc;
88193: int *aiCol = 0;
88194:
88195: if( !pFKey->isDeferred && !pParse->pToplevel && !pParse->isMultiWrite ){
88196: assert( regOld==0 && regNew!=0 );
88197: /* Inserting a single row into a parent table cannot cause an immediate
88198: ** foreign key violation. So do nothing in this case. */
88199: continue;
88200: }
88201:
88202: if( locateFkeyIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ){
88203: if( !isIgnoreErrors || db->mallocFailed ) return;
88204: continue;
88205: }
88206: assert( aiCol || pFKey->nCol==1 );
88207:
88208: /* Create a SrcList structure containing a single table (the table
88209: ** the foreign key that refers to this table is attached to). This
88210: ** is required for the sqlite3WhereXXX() interface. */
88211: pSrc = sqlite3SrcListAppend(db, 0, 0, 0);
88212: if( pSrc ){
88213: struct SrcList_item *pItem = pSrc->a;
88214: pItem->pTab = pFKey->pFrom;
88215: pItem->zName = pFKey->pFrom->zName;
88216: pItem->pTab->nRef++;
88217: pItem->iCursor = pParse->nTab++;
88218:
88219: if( regNew!=0 ){
88220: fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regNew, -1);
88221: }
88222: if( regOld!=0 ){
88223: /* If there is a RESTRICT action configured for the current operation
88224: ** on the parent table of this FK, then throw an exception
88225: ** immediately if the FK constraint is violated, even if this is a
88226: ** deferred trigger. That's what RESTRICT means. To defer checking
88227: ** the constraint, the FK should specify NO ACTION (represented
88228: ** using OE_None). NO ACTION is the default. */
88229: fkScanChildren(pParse, pSrc, pTab, pIdx, pFKey, aiCol, regOld, 1);
88230: }
88231: pItem->zName = 0;
88232: sqlite3SrcListDelete(db, pSrc);
88233: }
88234: sqlite3DbFree(db, aiCol);
88235: }
88236: }
88237:
88238: #define COLUMN_MASK(x) (((x)>31) ? 0xffffffff : ((u32)1<<(x)))
88239:
88240: /*
88241: ** This function is called before generating code to update or delete a
88242: ** row contained in table pTab.
88243: */
88244: SQLITE_PRIVATE u32 sqlite3FkOldmask(
88245: Parse *pParse, /* Parse context */
88246: Table *pTab /* Table being modified */
88247: ){
88248: u32 mask = 0;
88249: if( pParse->db->flags&SQLITE_ForeignKeys ){
88250: FKey *p;
88251: int i;
88252: for(p=pTab->pFKey; p; p=p->pNextFrom){
88253: for(i=0; i<p->nCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom);
88254: }
88255: for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
88256: Index *pIdx = 0;
88257: locateFkeyIndex(pParse, pTab, p, &pIdx, 0);
88258: if( pIdx ){
88259: for(i=0; i<pIdx->nColumn; i++) mask |= COLUMN_MASK(pIdx->aiColumn[i]);
88260: }
88261: }
88262: }
88263: return mask;
88264: }
88265:
88266: /*
88267: ** This function is called before generating code to update or delete a
88268: ** row contained in table pTab. If the operation is a DELETE, then
88269: ** parameter aChange is passed a NULL value. For an UPDATE, aChange points
88270: ** to an array of size N, where N is the number of columns in table pTab.
88271: ** If the i'th column is not modified by the UPDATE, then the corresponding
88272: ** entry in the aChange[] array is set to -1. If the column is modified,
88273: ** the value is 0 or greater. Parameter chngRowid is set to true if the
88274: ** UPDATE statement modifies the rowid fields of the table.
88275: **
88276: ** If any foreign key processing will be required, this function returns
88277: ** true. If there is no foreign key related processing, this function
88278: ** returns false.
88279: */
88280: SQLITE_PRIVATE int sqlite3FkRequired(
88281: Parse *pParse, /* Parse context */
88282: Table *pTab, /* Table being modified */
88283: int *aChange, /* Non-NULL for UPDATE operations */
88284: int chngRowid /* True for UPDATE that affects rowid */
88285: ){
88286: if( pParse->db->flags&SQLITE_ForeignKeys ){
88287: if( !aChange ){
88288: /* A DELETE operation. Foreign key processing is required if the
88289: ** table in question is either the child or parent table for any
88290: ** foreign key constraint. */
88291: return (sqlite3FkReferences(pTab) || pTab->pFKey);
88292: }else{
88293: /* This is an UPDATE. Foreign key processing is only required if the
88294: ** operation modifies one or more child or parent key columns. */
88295: int i;
88296: FKey *p;
88297:
88298: /* Check if any child key columns are being modified. */
88299: for(p=pTab->pFKey; p; p=p->pNextFrom){
88300: for(i=0; i<p->nCol; i++){
88301: int iChildKey = p->aCol[i].iFrom;
88302: if( aChange[iChildKey]>=0 ) return 1;
88303: if( iChildKey==pTab->iPKey && chngRowid ) return 1;
88304: }
88305: }
88306:
88307: /* Check if any parent key columns are being modified. */
88308: for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){
88309: for(i=0; i<p->nCol; i++){
88310: char *zKey = p->aCol[i].zCol;
88311: int iKey;
88312: for(iKey=0; iKey<pTab->nCol; iKey++){
88313: Column *pCol = &pTab->aCol[iKey];
1.2.2.1 ! misho 88314: if( (zKey ? !sqlite3StrICmp(pCol->zName, zKey)
! 88315: : (pCol->colFlags & COLFLAG_PRIMKEY)!=0) ){
1.2 misho 88316: if( aChange[iKey]>=0 ) return 1;
88317: if( iKey==pTab->iPKey && chngRowid ) return 1;
88318: }
88319: }
88320: }
88321: }
88322: }
88323: }
88324: return 0;
88325: }
88326:
88327: /*
88328: ** This function is called when an UPDATE or DELETE operation is being
88329: ** compiled on table pTab, which is the parent table of foreign-key pFKey.
88330: ** If the current operation is an UPDATE, then the pChanges parameter is
88331: ** passed a pointer to the list of columns being modified. If it is a
88332: ** DELETE, pChanges is passed a NULL pointer.
88333: **
88334: ** It returns a pointer to a Trigger structure containing a trigger
88335: ** equivalent to the ON UPDATE or ON DELETE action specified by pFKey.
88336: ** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is
88337: ** returned (these actions require no special handling by the triggers
88338: ** sub-system, code for them is created by fkScanChildren()).
88339: **
88340: ** For example, if pFKey is the foreign key and pTab is table "p" in
88341: ** the following schema:
88342: **
88343: ** CREATE TABLE p(pk PRIMARY KEY);
88344: ** CREATE TABLE c(ck REFERENCES p ON DELETE CASCADE);
88345: **
88346: ** then the returned trigger structure is equivalent to:
88347: **
88348: ** CREATE TRIGGER ... DELETE ON p BEGIN
88349: ** DELETE FROM c WHERE ck = old.pk;
88350: ** END;
88351: **
88352: ** The returned pointer is cached as part of the foreign key object. It
88353: ** is eventually freed along with the rest of the foreign key object by
88354: ** sqlite3FkDelete().
88355: */
88356: static Trigger *fkActionTrigger(
88357: Parse *pParse, /* Parse context */
88358: Table *pTab, /* Table being updated or deleted from */
88359: FKey *pFKey, /* Foreign key to get action for */
88360: ExprList *pChanges /* Change-list for UPDATE, NULL for DELETE */
88361: ){
88362: sqlite3 *db = pParse->db; /* Database handle */
88363: int action; /* One of OE_None, OE_Cascade etc. */
88364: Trigger *pTrigger; /* Trigger definition to return */
88365: int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */
88366:
88367: action = pFKey->aAction[iAction];
88368: pTrigger = pFKey->apTrigger[iAction];
88369:
88370: if( action!=OE_None && !pTrigger ){
88371: u8 enableLookaside; /* Copy of db->lookaside.bEnabled */
88372: char const *zFrom; /* Name of child table */
88373: int nFrom; /* Length in bytes of zFrom */
88374: Index *pIdx = 0; /* Parent key index for this FK */
88375: int *aiCol = 0; /* child table cols -> parent key cols */
88376: TriggerStep *pStep = 0; /* First (only) step of trigger program */
88377: Expr *pWhere = 0; /* WHERE clause of trigger step */
88378: ExprList *pList = 0; /* Changes list if ON UPDATE CASCADE */
88379: Select *pSelect = 0; /* If RESTRICT, "SELECT RAISE(...)" */
88380: int i; /* Iterator variable */
88381: Expr *pWhen = 0; /* WHEN clause for the trigger */
88382:
88383: if( locateFkeyIndex(pParse, pTab, pFKey, &pIdx, &aiCol) ) return 0;
88384: assert( aiCol || pFKey->nCol==1 );
88385:
88386: for(i=0; i<pFKey->nCol; i++){
88387: Token tOld = { "old", 3 }; /* Literal "old" token */
88388: Token tNew = { "new", 3 }; /* Literal "new" token */
88389: Token tFromCol; /* Name of column in child table */
88390: Token tToCol; /* Name of column in parent table */
88391: int iFromCol; /* Idx of column in child table */
88392: Expr *pEq; /* tFromCol = OLD.tToCol */
88393:
88394: iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom;
88395: assert( iFromCol>=0 );
88396: tToCol.z = pIdx ? pTab->aCol[pIdx->aiColumn[i]].zName : "oid";
88397: tFromCol.z = pFKey->pFrom->aCol[iFromCol].zName;
88398:
88399: tToCol.n = sqlite3Strlen30(tToCol.z);
88400: tFromCol.n = sqlite3Strlen30(tFromCol.z);
88401:
88402: /* Create the expression "OLD.zToCol = zFromCol". It is important
88403: ** that the "OLD.zToCol" term is on the LHS of the = operator, so
88404: ** that the affinity and collation sequence associated with the
88405: ** parent table are used for the comparison. */
88406: pEq = sqlite3PExpr(pParse, TK_EQ,
88407: sqlite3PExpr(pParse, TK_DOT,
88408: sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld),
88409: sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol)
88410: , 0),
88411: sqlite3PExpr(pParse, TK_ID, 0, 0, &tFromCol)
88412: , 0);
88413: pWhere = sqlite3ExprAnd(db, pWhere, pEq);
88414:
88415: /* For ON UPDATE, construct the next term of the WHEN clause.
88416: ** The final WHEN clause will be like this:
88417: **
88418: ** WHEN NOT(old.col1 IS new.col1 AND ... AND old.colN IS new.colN)
88419: */
88420: if( pChanges ){
88421: pEq = sqlite3PExpr(pParse, TK_IS,
88422: sqlite3PExpr(pParse, TK_DOT,
88423: sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld),
88424: sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol),
88425: 0),
88426: sqlite3PExpr(pParse, TK_DOT,
88427: sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew),
88428: sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol),
88429: 0),
88430: 0);
88431: pWhen = sqlite3ExprAnd(db, pWhen, pEq);
88432: }
88433:
88434: if( action!=OE_Restrict && (action!=OE_Cascade || pChanges) ){
88435: Expr *pNew;
88436: if( action==OE_Cascade ){
88437: pNew = sqlite3PExpr(pParse, TK_DOT,
88438: sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew),
88439: sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol)
88440: , 0);
88441: }else if( action==OE_SetDflt ){
88442: Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt;
88443: if( pDflt ){
88444: pNew = sqlite3ExprDup(db, pDflt, 0);
88445: }else{
88446: pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0);
88447: }
88448: }else{
88449: pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0);
88450: }
88451: pList = sqlite3ExprListAppend(pParse, pList, pNew);
88452: sqlite3ExprListSetName(pParse, pList, &tFromCol, 0);
88453: }
88454: }
88455: sqlite3DbFree(db, aiCol);
88456:
88457: zFrom = pFKey->pFrom->zName;
88458: nFrom = sqlite3Strlen30(zFrom);
88459:
88460: if( action==OE_Restrict ){
88461: Token tFrom;
88462: Expr *pRaise;
88463:
88464: tFrom.z = zFrom;
88465: tFrom.n = nFrom;
88466: pRaise = sqlite3Expr(db, TK_RAISE, "foreign key constraint failed");
88467: if( pRaise ){
88468: pRaise->affinity = OE_Abort;
88469: }
88470: pSelect = sqlite3SelectNew(pParse,
88471: sqlite3ExprListAppend(pParse, 0, pRaise),
88472: sqlite3SrcListAppend(db, 0, &tFrom, 0),
88473: pWhere,
88474: 0, 0, 0, 0, 0, 0
88475: );
88476: pWhere = 0;
88477: }
88478:
88479: /* Disable lookaside memory allocation */
88480: enableLookaside = db->lookaside.bEnabled;
88481: db->lookaside.bEnabled = 0;
88482:
88483: pTrigger = (Trigger *)sqlite3DbMallocZero(db,
88484: sizeof(Trigger) + /* struct Trigger */
88485: sizeof(TriggerStep) + /* Single step in trigger program */
88486: nFrom + 1 /* Space for pStep->target.z */
88487: );
88488: if( pTrigger ){
88489: pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1];
88490: pStep->target.z = (char *)&pStep[1];
88491: pStep->target.n = nFrom;
88492: memcpy((char *)pStep->target.z, zFrom, nFrom);
88493:
88494: pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
88495: pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE);
88496: pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
88497: if( pWhen ){
88498: pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0, 0);
88499: pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
88500: }
88501: }
88502:
88503: /* Re-enable the lookaside buffer, if it was disabled earlier. */
88504: db->lookaside.bEnabled = enableLookaside;
88505:
88506: sqlite3ExprDelete(db, pWhere);
88507: sqlite3ExprDelete(db, pWhen);
88508: sqlite3ExprListDelete(db, pList);
88509: sqlite3SelectDelete(db, pSelect);
88510: if( db->mallocFailed==1 ){
88511: fkTriggerDelete(db, pTrigger);
88512: return 0;
88513: }
88514: assert( pStep!=0 );
88515:
88516: switch( action ){
88517: case OE_Restrict:
88518: pStep->op = TK_SELECT;
88519: break;
88520: case OE_Cascade:
88521: if( !pChanges ){
88522: pStep->op = TK_DELETE;
88523: break;
88524: }
88525: default:
88526: pStep->op = TK_UPDATE;
88527: }
88528: pStep->pTrig = pTrigger;
88529: pTrigger->pSchema = pTab->pSchema;
88530: pTrigger->pTabSchema = pTab->pSchema;
88531: pFKey->apTrigger[iAction] = pTrigger;
88532: pTrigger->op = (pChanges ? TK_UPDATE : TK_DELETE);
88533: }
88534:
88535: return pTrigger;
88536: }
88537:
88538: /*
88539: ** This function is called when deleting or updating a row to implement
88540: ** any required CASCADE, SET NULL or SET DEFAULT actions.
88541: */
88542: SQLITE_PRIVATE void sqlite3FkActions(
88543: Parse *pParse, /* Parse context */
88544: Table *pTab, /* Table being updated or deleted from */
88545: ExprList *pChanges, /* Change-list for UPDATE, NULL for DELETE */
88546: int regOld /* Address of array containing old row */
88547: ){
88548: /* If foreign-key support is enabled, iterate through all FKs that
88549: ** refer to table pTab. If there is an action associated with the FK
88550: ** for this operation (either update or delete), invoke the associated
88551: ** trigger sub-program. */
88552: if( pParse->db->flags&SQLITE_ForeignKeys ){
88553: FKey *pFKey; /* Iterator variable */
88554: for(pFKey = sqlite3FkReferences(pTab); pFKey; pFKey=pFKey->pNextTo){
88555: Trigger *pAction = fkActionTrigger(pParse, pTab, pFKey, pChanges);
88556: if( pAction ){
88557: sqlite3CodeRowTriggerDirect(pParse, pAction, pTab, regOld, OE_Abort, 0);
88558: }
88559: }
88560: }
88561: }
88562:
88563: #endif /* ifndef SQLITE_OMIT_TRIGGER */
88564:
88565: /*
88566: ** Free all memory associated with foreign key definitions attached to
88567: ** table pTab. Remove the deleted foreign keys from the Schema.fkeyHash
88568: ** hash table.
88569: */
88570: SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){
88571: FKey *pFKey; /* Iterator variable */
88572: FKey *pNext; /* Copy of pFKey->pNextFrom */
88573:
88574: assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) );
88575: for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){
88576:
88577: /* Remove the FK from the fkeyHash hash table. */
88578: if( !db || db->pnBytesFreed==0 ){
88579: if( pFKey->pPrevTo ){
88580: pFKey->pPrevTo->pNextTo = pFKey->pNextTo;
88581: }else{
88582: void *p = (void *)pFKey->pNextTo;
88583: const char *z = (p ? pFKey->pNextTo->zTo : pFKey->zTo);
88584: sqlite3HashInsert(&pTab->pSchema->fkeyHash, z, sqlite3Strlen30(z), p);
88585: }
88586: if( pFKey->pNextTo ){
88587: pFKey->pNextTo->pPrevTo = pFKey->pPrevTo;
88588: }
88589: }
88590:
88591: /* EV: R-30323-21917 Each foreign key constraint in SQLite is
88592: ** classified as either immediate or deferred.
88593: */
88594: assert( pFKey->isDeferred==0 || pFKey->isDeferred==1 );
88595:
88596: /* Delete any triggers created to implement actions for this FK. */
88597: #ifndef SQLITE_OMIT_TRIGGER
88598: fkTriggerDelete(db, pFKey->apTrigger[0]);
88599: fkTriggerDelete(db, pFKey->apTrigger[1]);
88600: #endif
88601:
88602: pNext = pFKey->pNextFrom;
88603: sqlite3DbFree(db, pFKey);
88604: }
88605: }
88606: #endif /* ifndef SQLITE_OMIT_FOREIGN_KEY */
88607:
88608: /************** End of fkey.c ************************************************/
88609: /************** Begin file insert.c ******************************************/
88610: /*
88611: ** 2001 September 15
88612: **
88613: ** The author disclaims copyright to this source code. In place of
88614: ** a legal notice, here is a blessing:
88615: **
88616: ** May you do good and not evil.
88617: ** May you find forgiveness for yourself and forgive others.
88618: ** May you share freely, never taking more than you give.
88619: **
88620: *************************************************************************
88621: ** This file contains C code routines that are called by the parser
88622: ** to handle INSERT statements in SQLite.
88623: */
88624:
88625: /*
88626: ** Generate code that will open a table for reading.
88627: */
88628: SQLITE_PRIVATE void sqlite3OpenTable(
88629: Parse *p, /* Generate code into this VDBE */
88630: int iCur, /* The cursor number of the table */
88631: int iDb, /* The database index in sqlite3.aDb[] */
88632: Table *pTab, /* The table to be opened */
88633: int opcode /* OP_OpenRead or OP_OpenWrite */
88634: ){
88635: Vdbe *v;
1.2.2.1 ! misho 88636: assert( !IsVirtual(pTab) );
1.2 misho 88637: v = sqlite3GetVdbe(p);
88638: assert( opcode==OP_OpenWrite || opcode==OP_OpenRead );
88639: sqlite3TableLock(p, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName);
88640: sqlite3VdbeAddOp3(v, opcode, iCur, pTab->tnum, iDb);
88641: sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(pTab->nCol), P4_INT32);
88642: VdbeComment((v, "%s", pTab->zName));
88643: }
88644:
88645: /*
88646: ** Return a pointer to the column affinity string associated with index
88647: ** pIdx. A column affinity string has one character for each column in
88648: ** the table, according to the affinity of the column:
88649: **
88650: ** Character Column affinity
88651: ** ------------------------------
88652: ** 'a' TEXT
88653: ** 'b' NONE
88654: ** 'c' NUMERIC
88655: ** 'd' INTEGER
88656: ** 'e' REAL
88657: **
88658: ** An extra 'd' is appended to the end of the string to cover the
88659: ** rowid that appears as the last column in every index.
88660: **
88661: ** Memory for the buffer containing the column index affinity string
88662: ** is managed along with the rest of the Index structure. It will be
88663: ** released when sqlite3DeleteIndex() is called.
88664: */
88665: SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){
88666: if( !pIdx->zColAff ){
88667: /* The first time a column affinity string for a particular index is
88668: ** required, it is allocated and populated here. It is then stored as
88669: ** a member of the Index structure for subsequent use.
88670: **
88671: ** The column affinity string will eventually be deleted by
88672: ** sqliteDeleteIndex() when the Index structure itself is cleaned
88673: ** up.
88674: */
88675: int n;
88676: Table *pTab = pIdx->pTable;
88677: sqlite3 *db = sqlite3VdbeDb(v);
88678: pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+2);
88679: if( !pIdx->zColAff ){
88680: db->mallocFailed = 1;
88681: return 0;
88682: }
88683: for(n=0; n<pIdx->nColumn; n++){
88684: pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity;
88685: }
88686: pIdx->zColAff[n++] = SQLITE_AFF_INTEGER;
88687: pIdx->zColAff[n] = 0;
88688: }
88689:
88690: return pIdx->zColAff;
88691: }
88692:
88693: /*
88694: ** Set P4 of the most recently inserted opcode to a column affinity
88695: ** string for table pTab. A column affinity string has one character
88696: ** for each column indexed by the index, according to the affinity of the
88697: ** column:
88698: **
88699: ** Character Column affinity
88700: ** ------------------------------
88701: ** 'a' TEXT
88702: ** 'b' NONE
88703: ** 'c' NUMERIC
88704: ** 'd' INTEGER
88705: ** 'e' REAL
88706: */
88707: SQLITE_PRIVATE void sqlite3TableAffinityStr(Vdbe *v, Table *pTab){
88708: /* The first time a column affinity string for a particular table
88709: ** is required, it is allocated and populated here. It is then
88710: ** stored as a member of the Table structure for subsequent use.
88711: **
88712: ** The column affinity string will eventually be deleted by
88713: ** sqlite3DeleteTable() when the Table structure itself is cleaned up.
88714: */
88715: if( !pTab->zColAff ){
88716: char *zColAff;
88717: int i;
88718: sqlite3 *db = sqlite3VdbeDb(v);
88719:
88720: zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1);
88721: if( !zColAff ){
88722: db->mallocFailed = 1;
88723: return;
88724: }
88725:
88726: for(i=0; i<pTab->nCol; i++){
88727: zColAff[i] = pTab->aCol[i].affinity;
88728: }
88729: zColAff[pTab->nCol] = '\0';
88730:
88731: pTab->zColAff = zColAff;
88732: }
88733:
88734: sqlite3VdbeChangeP4(v, -1, pTab->zColAff, P4_TRANSIENT);
88735: }
88736:
88737: /*
88738: ** Return non-zero if the table pTab in database iDb or any of its indices
88739: ** have been opened at any point in the VDBE program beginning at location
88740: ** iStartAddr throught the end of the program. This is used to see if
88741: ** a statement of the form "INSERT INTO <iDb, pTab> SELECT ..." can
88742: ** run without using temporary table for the results of the SELECT.
88743: */
88744: static int readsTable(Parse *p, int iStartAddr, int iDb, Table *pTab){
88745: Vdbe *v = sqlite3GetVdbe(p);
88746: int i;
88747: int iEnd = sqlite3VdbeCurrentAddr(v);
88748: #ifndef SQLITE_OMIT_VIRTUALTABLE
88749: VTable *pVTab = IsVirtual(pTab) ? sqlite3GetVTable(p->db, pTab) : 0;
88750: #endif
88751:
88752: for(i=iStartAddr; i<iEnd; i++){
88753: VdbeOp *pOp = sqlite3VdbeGetOp(v, i);
88754: assert( pOp!=0 );
88755: if( pOp->opcode==OP_OpenRead && pOp->p3==iDb ){
88756: Index *pIndex;
88757: int tnum = pOp->p2;
88758: if( tnum==pTab->tnum ){
88759: return 1;
88760: }
88761: for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){
88762: if( tnum==pIndex->tnum ){
88763: return 1;
88764: }
88765: }
88766: }
88767: #ifndef SQLITE_OMIT_VIRTUALTABLE
88768: if( pOp->opcode==OP_VOpen && pOp->p4.pVtab==pVTab ){
88769: assert( pOp->p4.pVtab!=0 );
88770: assert( pOp->p4type==P4_VTAB );
88771: return 1;
88772: }
88773: #endif
88774: }
88775: return 0;
88776: }
88777:
88778: #ifndef SQLITE_OMIT_AUTOINCREMENT
88779: /*
88780: ** Locate or create an AutoincInfo structure associated with table pTab
88781: ** which is in database iDb. Return the register number for the register
88782: ** that holds the maximum rowid.
88783: **
88784: ** There is at most one AutoincInfo structure per table even if the
88785: ** same table is autoincremented multiple times due to inserts within
88786: ** triggers. A new AutoincInfo structure is created if this is the
88787: ** first use of table pTab. On 2nd and subsequent uses, the original
88788: ** AutoincInfo structure is used.
88789: **
88790: ** Three memory locations are allocated:
88791: **
88792: ** (1) Register to hold the name of the pTab table.
88793: ** (2) Register to hold the maximum ROWID of pTab.
88794: ** (3) Register to hold the rowid in sqlite_sequence of pTab
88795: **
88796: ** The 2nd register is the one that is returned. That is all the
88797: ** insert routine needs to know about.
88798: */
88799: static int autoIncBegin(
88800: Parse *pParse, /* Parsing context */
88801: int iDb, /* Index of the database holding pTab */
88802: Table *pTab /* The table we are writing to */
88803: ){
88804: int memId = 0; /* Register holding maximum rowid */
88805: if( pTab->tabFlags & TF_Autoincrement ){
88806: Parse *pToplevel = sqlite3ParseToplevel(pParse);
88807: AutoincInfo *pInfo;
88808:
88809: pInfo = pToplevel->pAinc;
88810: while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; }
88811: if( pInfo==0 ){
88812: pInfo = sqlite3DbMallocRaw(pParse->db, sizeof(*pInfo));
88813: if( pInfo==0 ) return 0;
88814: pInfo->pNext = pToplevel->pAinc;
88815: pToplevel->pAinc = pInfo;
88816: pInfo->pTab = pTab;
88817: pInfo->iDb = iDb;
88818: pToplevel->nMem++; /* Register to hold name of table */
88819: pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */
88820: pToplevel->nMem++; /* Rowid in sqlite_sequence */
88821: }
88822: memId = pInfo->regCtr;
88823: }
88824: return memId;
88825: }
88826:
88827: /*
88828: ** This routine generates code that will initialize all of the
88829: ** register used by the autoincrement tracker.
88830: */
88831: SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){
88832: AutoincInfo *p; /* Information about an AUTOINCREMENT */
88833: sqlite3 *db = pParse->db; /* The database connection */
88834: Db *pDb; /* Database only autoinc table */
88835: int memId; /* Register holding max rowid */
88836: int addr; /* A VDBE address */
88837: Vdbe *v = pParse->pVdbe; /* VDBE under construction */
88838:
88839: /* This routine is never called during trigger-generation. It is
88840: ** only called from the top-level */
88841: assert( pParse->pTriggerTab==0 );
88842: assert( pParse==sqlite3ParseToplevel(pParse) );
88843:
88844: assert( v ); /* We failed long ago if this is not so */
88845: for(p = pParse->pAinc; p; p = p->pNext){
88846: pDb = &db->aDb[p->iDb];
88847: memId = p->regCtr;
88848: assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) );
88849: sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead);
88850: sqlite3VdbeAddOp3(v, OP_Null, 0, memId, memId+1);
88851: addr = sqlite3VdbeCurrentAddr(v);
88852: sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0);
88853: sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9);
88854: sqlite3VdbeAddOp3(v, OP_Column, 0, 0, memId);
88855: sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId);
88856: sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
88857: sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1);
88858: sqlite3VdbeAddOp3(v, OP_Column, 0, 1, memId);
88859: sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+9);
88860: sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2);
88861: sqlite3VdbeAddOp2(v, OP_Integer, 0, memId);
88862: sqlite3VdbeAddOp0(v, OP_Close);
88863: }
88864: }
88865:
88866: /*
88867: ** Update the maximum rowid for an autoincrement calculation.
88868: **
88869: ** This routine should be called when the top of the stack holds a
88870: ** new rowid that is about to be inserted. If that new rowid is
88871: ** larger than the maximum rowid in the memId memory cell, then the
88872: ** memory cell is updated. The stack is unchanged.
88873: */
88874: static void autoIncStep(Parse *pParse, int memId, int regRowid){
88875: if( memId>0 ){
88876: sqlite3VdbeAddOp2(pParse->pVdbe, OP_MemMax, memId, regRowid);
88877: }
88878: }
88879:
88880: /*
88881: ** This routine generates the code needed to write autoincrement
88882: ** maximum rowid values back into the sqlite_sequence register.
88883: ** Every statement that might do an INSERT into an autoincrement
88884: ** table (either directly or through triggers) needs to call this
88885: ** routine just before the "exit" code.
88886: */
88887: SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){
88888: AutoincInfo *p;
88889: Vdbe *v = pParse->pVdbe;
88890: sqlite3 *db = pParse->db;
88891:
88892: assert( v );
88893: for(p = pParse->pAinc; p; p = p->pNext){
88894: Db *pDb = &db->aDb[p->iDb];
88895: int j1, j2, j3, j4, j5;
88896: int iRec;
88897: int memId = p->regCtr;
88898:
88899: iRec = sqlite3GetTempReg(pParse);
88900: assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) );
88901: sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite);
88902: j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1);
88903: j2 = sqlite3VdbeAddOp0(v, OP_Rewind);
88904: j3 = sqlite3VdbeAddOp3(v, OP_Column, 0, 0, iRec);
88905: j4 = sqlite3VdbeAddOp3(v, OP_Eq, memId-1, 0, iRec);
88906: sqlite3VdbeAddOp2(v, OP_Next, 0, j3);
88907: sqlite3VdbeJumpHere(v, j2);
88908: sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1);
88909: j5 = sqlite3VdbeAddOp0(v, OP_Goto);
88910: sqlite3VdbeJumpHere(v, j4);
88911: sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1);
88912: sqlite3VdbeJumpHere(v, j1);
88913: sqlite3VdbeJumpHere(v, j5);
88914: sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec);
88915: sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1);
88916: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
88917: sqlite3VdbeAddOp0(v, OP_Close);
88918: sqlite3ReleaseTempReg(pParse, iRec);
88919: }
88920: }
88921: #else
88922: /*
88923: ** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines
88924: ** above are all no-ops
88925: */
88926: # define autoIncBegin(A,B,C) (0)
88927: # define autoIncStep(A,B,C)
88928: #endif /* SQLITE_OMIT_AUTOINCREMENT */
88929:
88930:
1.2.2.1 ! misho 88931: /*
! 88932: ** Generate code for a co-routine that will evaluate a subquery one
! 88933: ** row at a time.
! 88934: **
! 88935: ** The pSelect parameter is the subquery that the co-routine will evaluation.
! 88936: ** Information about the location of co-routine and the registers it will use
! 88937: ** is returned by filling in the pDest object.
! 88938: **
! 88939: ** Registers are allocated as follows:
! 88940: **
! 88941: ** pDest->iSDParm The register holding the next entry-point of the
! 88942: ** co-routine. Run the co-routine to its next breakpoint
! 88943: ** by calling "OP_Yield $X" where $X is pDest->iSDParm.
! 88944: **
! 88945: ** pDest->iSDParm+1 The register holding the "completed" flag for the
! 88946: ** co-routine. This register is 0 if the previous Yield
! 88947: ** generated a new result row, or 1 if the subquery
! 88948: ** has completed. If the Yield is called again
! 88949: ** after this register becomes 1, then the VDBE will
! 88950: ** halt with an SQLITE_INTERNAL error.
! 88951: **
! 88952: ** pDest->iSdst First result register.
! 88953: **
! 88954: ** pDest->nSdst Number of result registers.
! 88955: **
! 88956: ** This routine handles all of the register allocation and fills in the
! 88957: ** pDest structure appropriately.
! 88958: **
! 88959: ** Here is a schematic of the generated code assuming that X is the
! 88960: ** co-routine entry-point register reg[pDest->iSDParm], that EOF is the
! 88961: ** completed flag reg[pDest->iSDParm+1], and R and S are the range of
! 88962: ** registers that hold the result set, reg[pDest->iSdst] through
! 88963: ** reg[pDest->iSdst+pDest->nSdst-1]:
! 88964: **
! 88965: ** X <- A
! 88966: ** EOF <- 0
! 88967: ** goto B
! 88968: ** A: setup for the SELECT
! 88969: ** loop rows in the SELECT
! 88970: ** load results into registers R..S
! 88971: ** yield X
! 88972: ** end loop
! 88973: ** cleanup after the SELECT
! 88974: ** EOF <- 1
! 88975: ** yield X
! 88976: ** halt-error
! 88977: ** B:
! 88978: **
! 88979: ** To use this subroutine, the caller generates code as follows:
! 88980: **
! 88981: ** [ Co-routine generated by this subroutine, shown above ]
! 88982: ** S: yield X
! 88983: ** if EOF goto E
! 88984: ** if skip this row, goto C
! 88985: ** if terminate loop, goto E
! 88986: ** deal with this row
! 88987: ** C: goto S
! 88988: ** E:
! 88989: */
! 88990: SQLITE_PRIVATE int sqlite3CodeCoroutine(Parse *pParse, Select *pSelect, SelectDest *pDest){
! 88991: int regYield; /* Register holding co-routine entry-point */
! 88992: int regEof; /* Register holding co-routine completion flag */
! 88993: int addrTop; /* Top of the co-routine */
! 88994: int j1; /* Jump instruction */
! 88995: int rc; /* Result code */
! 88996: Vdbe *v; /* VDBE under construction */
! 88997:
! 88998: regYield = ++pParse->nMem;
! 88999: regEof = ++pParse->nMem;
! 89000: v = sqlite3GetVdbe(pParse);
! 89001: addrTop = sqlite3VdbeCurrentAddr(v);
! 89002: sqlite3VdbeAddOp2(v, OP_Integer, addrTop+2, regYield); /* X <- A */
! 89003: VdbeComment((v, "Co-routine entry point"));
! 89004: sqlite3VdbeAddOp2(v, OP_Integer, 0, regEof); /* EOF <- 0 */
! 89005: VdbeComment((v, "Co-routine completion flag"));
! 89006: sqlite3SelectDestInit(pDest, SRT_Coroutine, regYield);
! 89007: j1 = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
! 89008: rc = sqlite3Select(pParse, pSelect, pDest);
! 89009: assert( pParse->nErr==0 || rc );
! 89010: if( pParse->db->mallocFailed && rc==SQLITE_OK ) rc = SQLITE_NOMEM;
! 89011: if( rc ) return rc;
! 89012: sqlite3VdbeAddOp2(v, OP_Integer, 1, regEof); /* EOF <- 1 */
! 89013: sqlite3VdbeAddOp1(v, OP_Yield, regYield); /* yield X */
! 89014: sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_INTERNAL, OE_Abort);
! 89015: VdbeComment((v, "End of coroutine"));
! 89016: sqlite3VdbeJumpHere(v, j1); /* label B: */
! 89017: return rc;
! 89018: }
! 89019:
! 89020:
! 89021:
1.2 misho 89022: /* Forward declaration */
89023: static int xferOptimization(
89024: Parse *pParse, /* Parser context */
89025: Table *pDest, /* The table we are inserting into */
89026: Select *pSelect, /* A SELECT statement to use as the data source */
89027: int onError, /* How to handle constraint errors */
89028: int iDbDest /* The database of pDest */
89029: );
89030:
89031: /*
89032: ** This routine is call to handle SQL of the following forms:
89033: **
89034: ** insert into TABLE (IDLIST) values(EXPRLIST)
89035: ** insert into TABLE (IDLIST) select
89036: **
89037: ** The IDLIST following the table name is always optional. If omitted,
89038: ** then a list of all columns for the table is substituted. The IDLIST
89039: ** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted.
89040: **
89041: ** The pList parameter holds EXPRLIST in the first form of the INSERT
89042: ** statement above, and pSelect is NULL. For the second form, pList is
89043: ** NULL and pSelect is a pointer to the select statement used to generate
89044: ** data for the insert.
89045: **
89046: ** The code generated follows one of four templates. For a simple
89047: ** select with data coming from a VALUES clause, the code executes
89048: ** once straight down through. Pseudo-code follows (we call this
89049: ** the "1st template"):
89050: **
89051: ** open write cursor to <table> and its indices
89052: ** puts VALUES clause expressions onto the stack
89053: ** write the resulting record into <table>
89054: ** cleanup
89055: **
89056: ** The three remaining templates assume the statement is of the form
89057: **
89058: ** INSERT INTO <table> SELECT ...
89059: **
89060: ** If the SELECT clause is of the restricted form "SELECT * FROM <table2>" -
89061: ** in other words if the SELECT pulls all columns from a single table
89062: ** and there is no WHERE or LIMIT or GROUP BY or ORDER BY clauses, and
89063: ** if <table2> and <table1> are distinct tables but have identical
89064: ** schemas, including all the same indices, then a special optimization
89065: ** is invoked that copies raw records from <table2> over to <table1>.
89066: ** See the xferOptimization() function for the implementation of this
89067: ** template. This is the 2nd template.
89068: **
89069: ** open a write cursor to <table>
89070: ** open read cursor on <table2>
89071: ** transfer all records in <table2> over to <table>
89072: ** close cursors
89073: ** foreach index on <table>
89074: ** open a write cursor on the <table> index
89075: ** open a read cursor on the corresponding <table2> index
89076: ** transfer all records from the read to the write cursors
89077: ** close cursors
89078: ** end foreach
89079: **
89080: ** The 3rd template is for when the second template does not apply
89081: ** and the SELECT clause does not read from <table> at any time.
89082: ** The generated code follows this template:
89083: **
89084: ** EOF <- 0
89085: ** X <- A
89086: ** goto B
89087: ** A: setup for the SELECT
89088: ** loop over the rows in the SELECT
89089: ** load values into registers R..R+n
89090: ** yield X
89091: ** end loop
89092: ** cleanup after the SELECT
89093: ** EOF <- 1
89094: ** yield X
89095: ** goto A
89096: ** B: open write cursor to <table> and its indices
89097: ** C: yield X
89098: ** if EOF goto D
89099: ** insert the select result into <table> from R..R+n
89100: ** goto C
89101: ** D: cleanup
89102: **
89103: ** The 4th template is used if the insert statement takes its
89104: ** values from a SELECT but the data is being inserted into a table
89105: ** that is also read as part of the SELECT. In the third form,
89106: ** we have to use a intermediate table to store the results of
89107: ** the select. The template is like this:
89108: **
89109: ** EOF <- 0
89110: ** X <- A
89111: ** goto B
89112: ** A: setup for the SELECT
89113: ** loop over the tables in the SELECT
89114: ** load value into register R..R+n
89115: ** yield X
89116: ** end loop
89117: ** cleanup after the SELECT
89118: ** EOF <- 1
89119: ** yield X
89120: ** halt-error
89121: ** B: open temp table
89122: ** L: yield X
89123: ** if EOF goto M
89124: ** insert row from R..R+n into temp table
89125: ** goto L
89126: ** M: open write cursor to <table> and its indices
89127: ** rewind temp table
89128: ** C: loop over rows of intermediate table
89129: ** transfer values form intermediate table into <table>
89130: ** end loop
89131: ** D: cleanup
89132: */
89133: SQLITE_PRIVATE void sqlite3Insert(
89134: Parse *pParse, /* Parser context */
89135: SrcList *pTabList, /* Name of table into which we are inserting */
89136: ExprList *pList, /* List of values to be inserted */
89137: Select *pSelect, /* A SELECT statement to use as the data source */
89138: IdList *pColumn, /* Column names corresponding to IDLIST. */
89139: int onError /* How to handle constraint errors */
89140: ){
89141: sqlite3 *db; /* The main database structure */
89142: Table *pTab; /* The table to insert into. aka TABLE */
89143: char *zTab; /* Name of the table into which we are inserting */
89144: const char *zDb; /* Name of the database holding this table */
89145: int i, j, idx; /* Loop counters */
89146: Vdbe *v; /* Generate code into this virtual machine */
89147: Index *pIdx; /* For looping over indices of the table */
89148: int nColumn; /* Number of columns in the data */
89149: int nHidden = 0; /* Number of hidden columns if TABLE is virtual */
89150: int baseCur = 0; /* VDBE Cursor number for pTab */
89151: int keyColumn = -1; /* Column that is the INTEGER PRIMARY KEY */
89152: int endOfLoop; /* Label for the end of the insertion loop */
89153: int useTempTable = 0; /* Store SELECT results in intermediate table */
89154: int srcTab = 0; /* Data comes from this temporary cursor if >=0 */
89155: int addrInsTop = 0; /* Jump to label "D" */
89156: int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */
89157: int addrSelect = 0; /* Address of coroutine that implements the SELECT */
89158: SelectDest dest; /* Destination for SELECT on rhs of INSERT */
89159: int iDb; /* Index of database holding TABLE */
89160: Db *pDb; /* The database containing table being inserted into */
89161: int appendFlag = 0; /* True if the insert is likely to be an append */
89162:
89163: /* Register allocations */
89164: int regFromSelect = 0;/* Base register for data coming from SELECT */
89165: int regAutoinc = 0; /* Register holding the AUTOINCREMENT counter */
89166: int regRowCount = 0; /* Memory cell used for the row counter */
89167: int regIns; /* Block of regs holding rowid+data being inserted */
89168: int regRowid; /* registers holding insert rowid */
89169: int regData; /* register holding first column to insert */
89170: int regEof = 0; /* Register recording end of SELECT data */
89171: int *aRegIdx = 0; /* One register allocated to each index */
89172:
89173: #ifndef SQLITE_OMIT_TRIGGER
89174: int isView; /* True if attempting to insert into a view */
89175: Trigger *pTrigger; /* List of triggers on pTab, if required */
89176: int tmask; /* Mask of trigger times */
89177: #endif
89178:
89179: db = pParse->db;
89180: memset(&dest, 0, sizeof(dest));
89181: if( pParse->nErr || db->mallocFailed ){
89182: goto insert_cleanup;
89183: }
89184:
89185: /* Locate the table into which we will be inserting new information.
89186: */
89187: assert( pTabList->nSrc==1 );
89188: zTab = pTabList->a[0].zName;
89189: if( NEVER(zTab==0) ) goto insert_cleanup;
89190: pTab = sqlite3SrcListLookup(pParse, pTabList);
89191: if( pTab==0 ){
89192: goto insert_cleanup;
89193: }
89194: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
89195: assert( iDb<db->nDb );
89196: pDb = &db->aDb[iDb];
89197: zDb = pDb->zName;
89198: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){
89199: goto insert_cleanup;
89200: }
89201:
89202: /* Figure out if we have any triggers and if the table being
89203: ** inserted into is a view
89204: */
89205: #ifndef SQLITE_OMIT_TRIGGER
89206: pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask);
89207: isView = pTab->pSelect!=0;
89208: #else
89209: # define pTrigger 0
89210: # define tmask 0
89211: # define isView 0
89212: #endif
89213: #ifdef SQLITE_OMIT_VIEW
89214: # undef isView
89215: # define isView 0
89216: #endif
89217: assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) );
89218:
89219: /* If pTab is really a view, make sure it has been initialized.
89220: ** ViewGetColumnNames() is a no-op if pTab is not a view (or virtual
89221: ** module table).
89222: */
89223: if( sqlite3ViewGetColumnNames(pParse, pTab) ){
89224: goto insert_cleanup;
89225: }
89226:
89227: /* Ensure that:
89228: * (a) the table is not read-only,
89229: * (b) that if it is a view then ON INSERT triggers exist
89230: */
89231: if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
89232: goto insert_cleanup;
89233: }
89234:
89235: /* Allocate a VDBE
89236: */
89237: v = sqlite3GetVdbe(pParse);
89238: if( v==0 ) goto insert_cleanup;
89239: if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
89240: sqlite3BeginWriteOperation(pParse, pSelect || pTrigger, iDb);
89241:
89242: #ifndef SQLITE_OMIT_XFER_OPT
89243: /* If the statement is of the form
89244: **
89245: ** INSERT INTO <table1> SELECT * FROM <table2>;
89246: **
89247: ** Then special optimizations can be applied that make the transfer
89248: ** very fast and which reduce fragmentation of indices.
89249: **
89250: ** This is the 2nd template.
89251: */
89252: if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
89253: assert( !pTrigger );
89254: assert( pList==0 );
89255: goto insert_end;
89256: }
89257: #endif /* SQLITE_OMIT_XFER_OPT */
89258:
89259: /* If this is an AUTOINCREMENT table, look up the sequence number in the
89260: ** sqlite_sequence table and store it in memory cell regAutoinc.
89261: */
89262: regAutoinc = autoIncBegin(pParse, iDb, pTab);
89263:
89264: /* Figure out how many columns of data are supplied. If the data
89265: ** is coming from a SELECT statement, then generate a co-routine that
89266: ** produces a single row of the SELECT on each invocation. The
89267: ** co-routine is the common header to the 3rd and 4th templates.
89268: */
89269: if( pSelect ){
1.2.2.1 ! misho 89270: /* Data is coming from a SELECT. Generate a co-routine to run that
! 89271: ** SELECT. */
! 89272: int rc = sqlite3CodeCoroutine(pParse, pSelect, &dest);
! 89273: if( rc ) goto insert_cleanup;
1.2 misho 89274:
1.2.2.1 ! misho 89275: regEof = dest.iSDParm + 1;
! 89276: regFromSelect = dest.iSdst;
1.2 misho 89277: assert( pSelect->pEList );
89278: nColumn = pSelect->pEList->nExpr;
1.2.2.1 ! misho 89279: assert( dest.nSdst==nColumn );
1.2 misho 89280:
89281: /* Set useTempTable to TRUE if the result of the SELECT statement
89282: ** should be written into a temporary table (template 4). Set to
89283: ** FALSE if each* row of the SELECT can be written directly into
89284: ** the destination table (template 3).
89285: **
89286: ** A temp table must be used if the table being updated is also one
89287: ** of the tables being read by the SELECT statement. Also use a
89288: ** temp table in the case of row triggers.
89289: */
89290: if( pTrigger || readsTable(pParse, addrSelect, iDb, pTab) ){
89291: useTempTable = 1;
89292: }
89293:
89294: if( useTempTable ){
89295: /* Invoke the coroutine to extract information from the SELECT
89296: ** and add it to a transient table srcTab. The code generated
89297: ** here is from the 4th template:
89298: **
89299: ** B: open temp table
89300: ** L: yield X
89301: ** if EOF goto M
89302: ** insert row from R..R+n into temp table
89303: ** goto L
89304: ** M: ...
89305: */
89306: int regRec; /* Register to hold packed record */
89307: int regTempRowid; /* Register to hold temp table ROWID */
89308: int addrTop; /* Label "L" */
89309: int addrIf; /* Address of jump to M */
89310:
89311: srcTab = pParse->nTab++;
89312: regRec = sqlite3GetTempReg(pParse);
89313: regTempRowid = sqlite3GetTempReg(pParse);
89314: sqlite3VdbeAddOp2(v, OP_OpenEphemeral, srcTab, nColumn);
1.2.2.1 ! misho 89315: addrTop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm);
1.2 misho 89316: addrIf = sqlite3VdbeAddOp1(v, OP_If, regEof);
89317: sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec);
89318: sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid);
89319: sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid);
89320: sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop);
89321: sqlite3VdbeJumpHere(v, addrIf);
89322: sqlite3ReleaseTempReg(pParse, regRec);
89323: sqlite3ReleaseTempReg(pParse, regTempRowid);
89324: }
89325: }else{
89326: /* This is the case if the data for the INSERT is coming from a VALUES
89327: ** clause
89328: */
89329: NameContext sNC;
89330: memset(&sNC, 0, sizeof(sNC));
89331: sNC.pParse = pParse;
89332: srcTab = -1;
89333: assert( useTempTable==0 );
89334: nColumn = pList ? pList->nExpr : 0;
89335: for(i=0; i<nColumn; i++){
89336: if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){
89337: goto insert_cleanup;
89338: }
89339: }
89340: }
89341:
89342: /* Make sure the number of columns in the source data matches the number
89343: ** of columns to be inserted into the table.
89344: */
89345: if( IsVirtual(pTab) ){
89346: for(i=0; i<pTab->nCol; i++){
89347: nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0);
89348: }
89349: }
89350: if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){
89351: sqlite3ErrorMsg(pParse,
89352: "table %S has %d columns but %d values were supplied",
89353: pTabList, 0, pTab->nCol-nHidden, nColumn);
89354: goto insert_cleanup;
89355: }
89356: if( pColumn!=0 && nColumn!=pColumn->nId ){
89357: sqlite3ErrorMsg(pParse, "%d values for %d columns", nColumn, pColumn->nId);
89358: goto insert_cleanup;
89359: }
89360:
89361: /* If the INSERT statement included an IDLIST term, then make sure
89362: ** all elements of the IDLIST really are columns of the table and
89363: ** remember the column indices.
89364: **
89365: ** If the table has an INTEGER PRIMARY KEY column and that column
89366: ** is named in the IDLIST, then record in the keyColumn variable
89367: ** the index into IDLIST of the primary key column. keyColumn is
89368: ** the index of the primary key as it appears in IDLIST, not as
89369: ** is appears in the original table. (The index of the primary
89370: ** key in the original table is pTab->iPKey.)
89371: */
89372: if( pColumn ){
89373: for(i=0; i<pColumn->nId; i++){
89374: pColumn->a[i].idx = -1;
89375: }
89376: for(i=0; i<pColumn->nId; i++){
89377: for(j=0; j<pTab->nCol; j++){
89378: if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){
89379: pColumn->a[i].idx = j;
89380: if( j==pTab->iPKey ){
89381: keyColumn = i;
89382: }
89383: break;
89384: }
89385: }
89386: if( j>=pTab->nCol ){
89387: if( sqlite3IsRowid(pColumn->a[i].zName) ){
89388: keyColumn = i;
89389: }else{
89390: sqlite3ErrorMsg(pParse, "table %S has no column named %s",
89391: pTabList, 0, pColumn->a[i].zName);
89392: pParse->checkSchema = 1;
89393: goto insert_cleanup;
89394: }
89395: }
89396: }
89397: }
89398:
89399: /* If there is no IDLIST term but the table has an integer primary
89400: ** key, the set the keyColumn variable to the primary key column index
89401: ** in the original table definition.
89402: */
89403: if( pColumn==0 && nColumn>0 ){
89404: keyColumn = pTab->iPKey;
89405: }
89406:
89407: /* Initialize the count of rows to be inserted
89408: */
89409: if( db->flags & SQLITE_CountRows ){
89410: regRowCount = ++pParse->nMem;
89411: sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
89412: }
89413:
89414: /* If this is not a view, open the table and and all indices */
89415: if( !isView ){
89416: int nIdx;
89417:
89418: baseCur = pParse->nTab;
89419: nIdx = sqlite3OpenTableAndIndices(pParse, pTab, baseCur, OP_OpenWrite);
89420: aRegIdx = sqlite3DbMallocRaw(db, sizeof(int)*(nIdx+1));
89421: if( aRegIdx==0 ){
89422: goto insert_cleanup;
89423: }
89424: for(i=0; i<nIdx; i++){
89425: aRegIdx[i] = ++pParse->nMem;
89426: }
89427: }
89428:
89429: /* This is the top of the main insertion loop */
89430: if( useTempTable ){
89431: /* This block codes the top of loop only. The complete loop is the
89432: ** following pseudocode (template 4):
89433: **
89434: ** rewind temp table
89435: ** C: loop over rows of intermediate table
89436: ** transfer values form intermediate table into <table>
89437: ** end loop
89438: ** D: ...
89439: */
89440: addrInsTop = sqlite3VdbeAddOp1(v, OP_Rewind, srcTab);
89441: addrCont = sqlite3VdbeCurrentAddr(v);
89442: }else if( pSelect ){
89443: /* This block codes the top of loop only. The complete loop is the
89444: ** following pseudocode (template 3):
89445: **
89446: ** C: yield X
89447: ** if EOF goto D
89448: ** insert the select result into <table> from R..R+n
89449: ** goto C
89450: ** D: ...
89451: */
1.2.2.1 ! misho 89452: addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm);
1.2 misho 89453: addrInsTop = sqlite3VdbeAddOp1(v, OP_If, regEof);
89454: }
89455:
89456: /* Allocate registers for holding the rowid of the new row,
89457: ** the content of the new row, and the assemblied row record.
89458: */
89459: regRowid = regIns = pParse->nMem+1;
89460: pParse->nMem += pTab->nCol + 1;
89461: if( IsVirtual(pTab) ){
89462: regRowid++;
89463: pParse->nMem++;
89464: }
89465: regData = regRowid+1;
89466:
89467: /* Run the BEFORE and INSTEAD OF triggers, if there are any
89468: */
89469: endOfLoop = sqlite3VdbeMakeLabel(v);
89470: if( tmask & TRIGGER_BEFORE ){
89471: int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1);
89472:
89473: /* build the NEW.* reference row. Note that if there is an INTEGER
89474: ** PRIMARY KEY into which a NULL is being inserted, that NULL will be
89475: ** translated into a unique ID for the row. But on a BEFORE trigger,
89476: ** we do not know what the unique ID will be (because the insert has
89477: ** not happened yet) so we substitute a rowid of -1
89478: */
89479: if( keyColumn<0 ){
89480: sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols);
89481: }else{
89482: int j1;
89483: if( useTempTable ){
89484: sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regCols);
89485: }else{
89486: assert( pSelect==0 ); /* Otherwise useTempTable is true */
89487: sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regCols);
89488: }
89489: j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols);
89490: sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols);
89491: sqlite3VdbeJumpHere(v, j1);
89492: sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols);
89493: }
89494:
89495: /* Cannot have triggers on a virtual table. If it were possible,
89496: ** this block would have to account for hidden column.
89497: */
89498: assert( !IsVirtual(pTab) );
89499:
89500: /* Create the new column data
89501: */
89502: for(i=0; i<pTab->nCol; i++){
89503: if( pColumn==0 ){
89504: j = i;
89505: }else{
89506: for(j=0; j<pColumn->nId; j++){
89507: if( pColumn->a[j].idx==i ) break;
89508: }
89509: }
89510: if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) ){
89511: sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1);
89512: }else if( useTempTable ){
89513: sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1);
89514: }else{
89515: assert( pSelect==0 ); /* Otherwise useTempTable is true */
89516: sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1);
89517: }
89518: }
89519:
89520: /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger,
89521: ** do not attempt any conversions before assembling the record.
89522: ** If this is a real table, attempt conversions as required by the
89523: ** table column affinities.
89524: */
89525: if( !isView ){
89526: sqlite3VdbeAddOp2(v, OP_Affinity, regCols+1, pTab->nCol);
89527: sqlite3TableAffinityStr(v, pTab);
89528: }
89529:
89530: /* Fire BEFORE or INSTEAD OF triggers */
89531: sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_BEFORE,
89532: pTab, regCols-pTab->nCol-1, onError, endOfLoop);
89533:
89534: sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1);
89535: }
89536:
89537: /* Push the record number for the new entry onto the stack. The
89538: ** record number is a randomly generate integer created by NewRowid
89539: ** except when the table has an INTEGER PRIMARY KEY column, in which
89540: ** case the record number is the same as that column.
89541: */
89542: if( !isView ){
89543: if( IsVirtual(pTab) ){
89544: /* The row that the VUpdate opcode will delete: none */
89545: sqlite3VdbeAddOp2(v, OP_Null, 0, regIns);
89546: }
89547: if( keyColumn>=0 ){
89548: if( useTempTable ){
89549: sqlite3VdbeAddOp3(v, OP_Column, srcTab, keyColumn, regRowid);
89550: }else if( pSelect ){
89551: sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+keyColumn, regRowid);
89552: }else{
89553: VdbeOp *pOp;
89554: sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr, regRowid);
89555: pOp = sqlite3VdbeGetOp(v, -1);
89556: if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){
89557: appendFlag = 1;
89558: pOp->opcode = OP_NewRowid;
89559: pOp->p1 = baseCur;
89560: pOp->p2 = regRowid;
89561: pOp->p3 = regAutoinc;
89562: }
89563: }
89564: /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid
89565: ** to generate a unique primary key value.
89566: */
89567: if( !appendFlag ){
89568: int j1;
89569: if( !IsVirtual(pTab) ){
89570: j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid);
89571: sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc);
89572: sqlite3VdbeJumpHere(v, j1);
89573: }else{
89574: j1 = sqlite3VdbeCurrentAddr(v);
89575: sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2);
89576: }
89577: sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid);
89578: }
89579: }else if( IsVirtual(pTab) ){
89580: sqlite3VdbeAddOp2(v, OP_Null, 0, regRowid);
89581: }else{
89582: sqlite3VdbeAddOp3(v, OP_NewRowid, baseCur, regRowid, regAutoinc);
89583: appendFlag = 1;
89584: }
89585: autoIncStep(pParse, regAutoinc, regRowid);
89586:
89587: /* Push onto the stack, data for all columns of the new entry, beginning
89588: ** with the first column.
89589: */
89590: nHidden = 0;
89591: for(i=0; i<pTab->nCol; i++){
89592: int iRegStore = regRowid+1+i;
89593: if( i==pTab->iPKey ){
89594: /* The value of the INTEGER PRIMARY KEY column is always a NULL.
89595: ** Whenever this column is read, the record number will be substituted
89596: ** in its place. So will fill this column with a NULL to avoid
89597: ** taking up data space with information that will never be used. */
89598: sqlite3VdbeAddOp2(v, OP_Null, 0, iRegStore);
89599: continue;
89600: }
89601: if( pColumn==0 ){
89602: if( IsHiddenColumn(&pTab->aCol[i]) ){
89603: assert( IsVirtual(pTab) );
89604: j = -1;
89605: nHidden++;
89606: }else{
89607: j = i - nHidden;
89608: }
89609: }else{
89610: for(j=0; j<pColumn->nId; j++){
89611: if( pColumn->a[j].idx==i ) break;
89612: }
89613: }
89614: if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){
89615: sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore);
89616: }else if( useTempTable ){
89617: sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore);
89618: }else if( pSelect ){
89619: sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore);
89620: }else{
89621: sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore);
89622: }
89623: }
89624:
89625: /* Generate code to check constraints and generate index keys and
89626: ** do the insertion.
89627: */
89628: #ifndef SQLITE_OMIT_VIRTUALTABLE
89629: if( IsVirtual(pTab) ){
89630: const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
89631: sqlite3VtabMakeWritable(pParse, pTab);
89632: sqlite3VdbeAddOp4(v, OP_VUpdate, 1, pTab->nCol+2, regIns, pVTab, P4_VTAB);
89633: sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError);
89634: sqlite3MayAbort(pParse);
89635: }else
89636: #endif
89637: {
89638: int isReplace; /* Set to true if constraints may cause a replace */
89639: sqlite3GenerateConstraintChecks(pParse, pTab, baseCur, regIns, aRegIdx,
89640: keyColumn>=0, 0, onError, endOfLoop, &isReplace
89641: );
89642: sqlite3FkCheck(pParse, pTab, 0, regIns);
89643: sqlite3CompleteInsertion(
89644: pParse, pTab, baseCur, regIns, aRegIdx, 0, appendFlag, isReplace==0
89645: );
89646: }
89647: }
89648:
89649: /* Update the count of rows that are inserted
89650: */
89651: if( (db->flags & SQLITE_CountRows)!=0 ){
89652: sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
89653: }
89654:
89655: if( pTrigger ){
89656: /* Code AFTER triggers */
89657: sqlite3CodeRowTrigger(pParse, pTrigger, TK_INSERT, 0, TRIGGER_AFTER,
89658: pTab, regData-2-pTab->nCol, onError, endOfLoop);
89659: }
89660:
89661: /* The bottom of the main insertion loop, if the data source
89662: ** is a SELECT statement.
89663: */
89664: sqlite3VdbeResolveLabel(v, endOfLoop);
89665: if( useTempTable ){
89666: sqlite3VdbeAddOp2(v, OP_Next, srcTab, addrCont);
89667: sqlite3VdbeJumpHere(v, addrInsTop);
89668: sqlite3VdbeAddOp1(v, OP_Close, srcTab);
89669: }else if( pSelect ){
89670: sqlite3VdbeAddOp2(v, OP_Goto, 0, addrCont);
89671: sqlite3VdbeJumpHere(v, addrInsTop);
89672: }
89673:
89674: if( !IsVirtual(pTab) && !isView ){
89675: /* Close all tables opened */
89676: sqlite3VdbeAddOp1(v, OP_Close, baseCur);
89677: for(idx=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){
89678: sqlite3VdbeAddOp1(v, OP_Close, idx+baseCur);
89679: }
89680: }
89681:
89682: insert_end:
89683: /* Update the sqlite_sequence table by storing the content of the
89684: ** maximum rowid counter values recorded while inserting into
89685: ** autoincrement tables.
89686: */
89687: if( pParse->nested==0 && pParse->pTriggerTab==0 ){
89688: sqlite3AutoincrementEnd(pParse);
89689: }
89690:
89691: /*
89692: ** Return the number of rows inserted. If this routine is
89693: ** generating code because of a call to sqlite3NestedParse(), do not
89694: ** invoke the callback function.
89695: */
89696: if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){
89697: sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
89698: sqlite3VdbeSetNumCols(v, 1);
89699: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC);
89700: }
89701:
89702: insert_cleanup:
89703: sqlite3SrcListDelete(db, pTabList);
89704: sqlite3ExprListDelete(db, pList);
89705: sqlite3SelectDelete(db, pSelect);
89706: sqlite3IdListDelete(db, pColumn);
89707: sqlite3DbFree(db, aRegIdx);
89708: }
89709:
89710: /* Make sure "isView" and other macros defined above are undefined. Otherwise
89711: ** thely may interfere with compilation of other functions in this file
89712: ** (or in another file, if this file becomes part of the amalgamation). */
89713: #ifdef isView
89714: #undef isView
89715: #endif
89716: #ifdef pTrigger
89717: #undef pTrigger
89718: #endif
89719: #ifdef tmask
89720: #undef tmask
89721: #endif
89722:
89723:
89724: /*
89725: ** Generate code to do constraint checks prior to an INSERT or an UPDATE.
89726: **
89727: ** The input is a range of consecutive registers as follows:
89728: **
89729: ** 1. The rowid of the row after the update.
89730: **
89731: ** 2. The data in the first column of the entry after the update.
89732: **
89733: ** i. Data from middle columns...
89734: **
89735: ** N. The data in the last column of the entry after the update.
89736: **
89737: ** The regRowid parameter is the index of the register containing (1).
89738: **
89739: ** If isUpdate is true and rowidChng is non-zero, then rowidChng contains
89740: ** the address of a register containing the rowid before the update takes
89741: ** place. isUpdate is true for UPDATEs and false for INSERTs. If isUpdate
89742: ** is false, indicating an INSERT statement, then a non-zero rowidChng
89743: ** indicates that the rowid was explicitly specified as part of the
89744: ** INSERT statement. If rowidChng is false, it means that the rowid is
89745: ** computed automatically in an insert or that the rowid value is not
89746: ** modified by an update.
89747: **
89748: ** The code generated by this routine store new index entries into
89749: ** registers identified by aRegIdx[]. No index entry is created for
89750: ** indices where aRegIdx[i]==0. The order of indices in aRegIdx[] is
89751: ** the same as the order of indices on the linked list of indices
89752: ** attached to the table.
89753: **
89754: ** This routine also generates code to check constraints. NOT NULL,
89755: ** CHECK, and UNIQUE constraints are all checked. If a constraint fails,
89756: ** then the appropriate action is performed. There are five possible
89757: ** actions: ROLLBACK, ABORT, FAIL, REPLACE, and IGNORE.
89758: **
89759: ** Constraint type Action What Happens
89760: ** --------------- ---------- ----------------------------------------
89761: ** any ROLLBACK The current transaction is rolled back and
89762: ** sqlite3_exec() returns immediately with a
89763: ** return code of SQLITE_CONSTRAINT.
89764: **
89765: ** any ABORT Back out changes from the current command
89766: ** only (do not do a complete rollback) then
89767: ** cause sqlite3_exec() to return immediately
89768: ** with SQLITE_CONSTRAINT.
89769: **
89770: ** any FAIL Sqlite3_exec() returns immediately with a
89771: ** return code of SQLITE_CONSTRAINT. The
89772: ** transaction is not rolled back and any
89773: ** prior changes are retained.
89774: **
89775: ** any IGNORE The record number and data is popped from
89776: ** the stack and there is an immediate jump
89777: ** to label ignoreDest.
89778: **
89779: ** NOT NULL REPLACE The NULL value is replace by the default
89780: ** value for that column. If the default value
89781: ** is NULL, the action is the same as ABORT.
89782: **
89783: ** UNIQUE REPLACE The other row that conflicts with the row
89784: ** being inserted is removed.
89785: **
89786: ** CHECK REPLACE Illegal. The results in an exception.
89787: **
89788: ** Which action to take is determined by the overrideError parameter.
89789: ** Or if overrideError==OE_Default, then the pParse->onError parameter
89790: ** is used. Or if pParse->onError==OE_Default then the onError value
89791: ** for the constraint is used.
89792: **
89793: ** The calling routine must open a read/write cursor for pTab with
89794: ** cursor number "baseCur". All indices of pTab must also have open
89795: ** read/write cursors with cursor number baseCur+i for the i-th cursor.
89796: ** Except, if there is no possibility of a REPLACE action then
89797: ** cursors do not need to be open for indices where aRegIdx[i]==0.
89798: */
89799: SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(
89800: Parse *pParse, /* The parser context */
89801: Table *pTab, /* the table into which we are inserting */
89802: int baseCur, /* Index of a read/write cursor pointing at pTab */
89803: int regRowid, /* Index of the range of input registers */
89804: int *aRegIdx, /* Register used by each index. 0 for unused indices */
89805: int rowidChng, /* True if the rowid might collide with existing entry */
89806: int isUpdate, /* True for UPDATE, False for INSERT */
89807: int overrideError, /* Override onError to this if not OE_Default */
89808: int ignoreDest, /* Jump to this label on an OE_Ignore resolution */
89809: int *pbMayReplace /* OUT: Set to true if constraint may cause a replace */
89810: ){
89811: int i; /* loop counter */
89812: Vdbe *v; /* VDBE under constrution */
89813: int nCol; /* Number of columns */
89814: int onError; /* Conflict resolution strategy */
89815: int j1; /* Addresss of jump instruction */
89816: int j2 = 0, j3; /* Addresses of jump instructions */
89817: int regData; /* Register containing first data column */
89818: int iCur; /* Table cursor number */
89819: Index *pIdx; /* Pointer to one of the indices */
1.2.2.1 ! misho 89820: sqlite3 *db; /* Database connection */
1.2 misho 89821: int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */
89822: int regOldRowid = (rowidChng && isUpdate) ? rowidChng : regRowid;
89823:
1.2.2.1 ! misho 89824: db = pParse->db;
1.2 misho 89825: v = sqlite3GetVdbe(pParse);
89826: assert( v!=0 );
89827: assert( pTab->pSelect==0 ); /* This table is not a VIEW */
89828: nCol = pTab->nCol;
89829: regData = regRowid + 1;
89830:
89831: /* Test all NOT NULL constraints.
89832: */
89833: for(i=0; i<nCol; i++){
89834: if( i==pTab->iPKey ){
89835: continue;
89836: }
89837: onError = pTab->aCol[i].notNull;
89838: if( onError==OE_None ) continue;
89839: if( overrideError!=OE_Default ){
89840: onError = overrideError;
89841: }else if( onError==OE_Default ){
89842: onError = OE_Abort;
89843: }
89844: if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){
89845: onError = OE_Abort;
89846: }
89847: assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
89848: || onError==OE_Ignore || onError==OE_Replace );
89849: switch( onError ){
89850: case OE_Abort:
89851: sqlite3MayAbort(pParse);
89852: case OE_Rollback:
89853: case OE_Fail: {
89854: char *zMsg;
89855: sqlite3VdbeAddOp3(v, OP_HaltIfNull,
89856: SQLITE_CONSTRAINT, onError, regData+i);
1.2.2.1 ! misho 89857: zMsg = sqlite3MPrintf(db, "%s.%s may not be NULL",
1.2 misho 89858: pTab->zName, pTab->aCol[i].zName);
89859: sqlite3VdbeChangeP4(v, -1, zMsg, P4_DYNAMIC);
89860: break;
89861: }
89862: case OE_Ignore: {
89863: sqlite3VdbeAddOp2(v, OP_IsNull, regData+i, ignoreDest);
89864: break;
89865: }
89866: default: {
89867: assert( onError==OE_Replace );
89868: j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regData+i);
89869: sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regData+i);
89870: sqlite3VdbeJumpHere(v, j1);
89871: break;
89872: }
89873: }
89874: }
89875:
89876: /* Test all CHECK constraints
89877: */
89878: #ifndef SQLITE_OMIT_CHECK
1.2.2.1 ! misho 89879: if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){
! 89880: ExprList *pCheck = pTab->pCheck;
1.2 misho 89881: pParse->ckBase = regData;
89882: onError = overrideError!=OE_Default ? overrideError : OE_Abort;
1.2.2.1 ! misho 89883: for(i=0; i<pCheck->nExpr; i++){
! 89884: int allOk = sqlite3VdbeMakeLabel(v);
! 89885: sqlite3ExprIfTrue(pParse, pCheck->a[i].pExpr, allOk, SQLITE_JUMPIFNULL);
! 89886: if( onError==OE_Ignore ){
! 89887: sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
! 89888: }else{
! 89889: char *zConsName = pCheck->a[i].zName;
! 89890: if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-15569-63625 */
! 89891: if( zConsName ){
! 89892: zConsName = sqlite3MPrintf(db, "constraint %s failed", zConsName);
! 89893: }else{
! 89894: zConsName = 0;
! 89895: }
! 89896: sqlite3HaltConstraint(pParse, onError, zConsName, P4_DYNAMIC);
! 89897: }
! 89898: sqlite3VdbeResolveLabel(v, allOk);
1.2 misho 89899: }
89900: }
89901: #endif /* !defined(SQLITE_OMIT_CHECK) */
89902:
89903: /* If we have an INTEGER PRIMARY KEY, make sure the primary key
89904: ** of the new record does not previously exist. Except, if this
89905: ** is an UPDATE and the primary key is not changing, that is OK.
89906: */
89907: if( rowidChng ){
89908: onError = pTab->keyConf;
89909: if( overrideError!=OE_Default ){
89910: onError = overrideError;
89911: }else if( onError==OE_Default ){
89912: onError = OE_Abort;
89913: }
89914:
89915: if( isUpdate ){
89916: j2 = sqlite3VdbeAddOp3(v, OP_Eq, regRowid, 0, rowidChng);
89917: }
89918: j3 = sqlite3VdbeAddOp3(v, OP_NotExists, baseCur, 0, regRowid);
89919: switch( onError ){
89920: default: {
89921: onError = OE_Abort;
89922: /* Fall thru into the next case */
89923: }
89924: case OE_Rollback:
89925: case OE_Abort:
89926: case OE_Fail: {
89927: sqlite3HaltConstraint(
89928: pParse, onError, "PRIMARY KEY must be unique", P4_STATIC);
89929: break;
89930: }
89931: case OE_Replace: {
89932: /* If there are DELETE triggers on this table and the
89933: ** recursive-triggers flag is set, call GenerateRowDelete() to
1.2.2.1 ! misho 89934: ** remove the conflicting row from the table. This will fire
1.2 misho 89935: ** the triggers and remove both the table and index b-tree entries.
89936: **
89937: ** Otherwise, if there are no triggers or the recursive-triggers
89938: ** flag is not set, but the table has one or more indexes, call
89939: ** GenerateRowIndexDelete(). This removes the index b-tree entries
89940: ** only. The table b-tree entry will be replaced by the new entry
89941: ** when it is inserted.
89942: **
89943: ** If either GenerateRowDelete() or GenerateRowIndexDelete() is called,
89944: ** also invoke MultiWrite() to indicate that this VDBE may require
89945: ** statement rollback (if the statement is aborted after the delete
89946: ** takes place). Earlier versions called sqlite3MultiWrite() regardless,
89947: ** but being more selective here allows statements like:
89948: **
89949: ** REPLACE INTO t(rowid) VALUES($newrowid)
89950: **
89951: ** to run without a statement journal if there are no indexes on the
89952: ** table.
89953: */
89954: Trigger *pTrigger = 0;
1.2.2.1 ! misho 89955: if( db->flags&SQLITE_RecTriggers ){
1.2 misho 89956: pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
89957: }
89958: if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){
89959: sqlite3MultiWrite(pParse);
89960: sqlite3GenerateRowDelete(
89961: pParse, pTab, baseCur, regRowid, 0, pTrigger, OE_Replace
89962: );
89963: }else if( pTab->pIndex ){
89964: sqlite3MultiWrite(pParse);
89965: sqlite3GenerateRowIndexDelete(pParse, pTab, baseCur, 0);
89966: }
89967: seenReplace = 1;
89968: break;
89969: }
89970: case OE_Ignore: {
89971: assert( seenReplace==0 );
89972: sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
89973: break;
89974: }
89975: }
89976: sqlite3VdbeJumpHere(v, j3);
89977: if( isUpdate ){
89978: sqlite3VdbeJumpHere(v, j2);
89979: }
89980: }
89981:
89982: /* Test all UNIQUE constraints by creating entries for each UNIQUE
89983: ** index and making sure that duplicate entries do not already exist.
89984: ** Add the new records to the indices as we go.
89985: */
89986: for(iCur=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, iCur++){
89987: int regIdx;
89988: int regR;
89989:
89990: if( aRegIdx[iCur]==0 ) continue; /* Skip unused indices */
89991:
89992: /* Create a key for accessing the index entry */
89993: regIdx = sqlite3GetTempRange(pParse, pIdx->nColumn+1);
89994: for(i=0; i<pIdx->nColumn; i++){
89995: int idx = pIdx->aiColumn[i];
89996: if( idx==pTab->iPKey ){
89997: sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i);
89998: }else{
89999: sqlite3VdbeAddOp2(v, OP_SCopy, regData+idx, regIdx+i);
90000: }
90001: }
90002: sqlite3VdbeAddOp2(v, OP_SCopy, regRowid, regIdx+i);
90003: sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn+1, aRegIdx[iCur]);
90004: sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT);
90005: sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn+1);
90006:
90007: /* Find out what action to take in case there is an indexing conflict */
90008: onError = pIdx->onError;
90009: if( onError==OE_None ){
90010: sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1);
90011: continue; /* pIdx is not a UNIQUE index */
90012: }
90013: if( overrideError!=OE_Default ){
90014: onError = overrideError;
90015: }else if( onError==OE_Default ){
90016: onError = OE_Abort;
90017: }
90018: if( seenReplace ){
90019: if( onError==OE_Ignore ) onError = OE_Replace;
90020: else if( onError==OE_Fail ) onError = OE_Abort;
90021: }
90022:
90023: /* Check to see if the new index entry will be unique */
90024: regR = sqlite3GetTempReg(pParse);
90025: sqlite3VdbeAddOp2(v, OP_SCopy, regOldRowid, regR);
90026: j3 = sqlite3VdbeAddOp4(v, OP_IsUnique, baseCur+iCur+1, 0,
90027: regR, SQLITE_INT_TO_PTR(regIdx),
90028: P4_INT32);
90029: sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn+1);
90030:
90031: /* Generate code that executes if the new index entry is not unique */
90032: assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
90033: || onError==OE_Ignore || onError==OE_Replace );
90034: switch( onError ){
90035: case OE_Rollback:
90036: case OE_Abort:
90037: case OE_Fail: {
90038: int j;
90039: StrAccum errMsg;
90040: const char *zSep;
90041: char *zErr;
90042:
90043: sqlite3StrAccumInit(&errMsg, 0, 0, 200);
1.2.2.1 ! misho 90044: errMsg.db = db;
1.2 misho 90045: zSep = pIdx->nColumn>1 ? "columns " : "column ";
90046: for(j=0; j<pIdx->nColumn; j++){
90047: char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
90048: sqlite3StrAccumAppend(&errMsg, zSep, -1);
90049: zSep = ", ";
90050: sqlite3StrAccumAppend(&errMsg, zCol, -1);
90051: }
90052: sqlite3StrAccumAppend(&errMsg,
90053: pIdx->nColumn>1 ? " are not unique" : " is not unique", -1);
90054: zErr = sqlite3StrAccumFinish(&errMsg);
90055: sqlite3HaltConstraint(pParse, onError, zErr, 0);
90056: sqlite3DbFree(errMsg.db, zErr);
90057: break;
90058: }
90059: case OE_Ignore: {
90060: assert( seenReplace==0 );
90061: sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest);
90062: break;
90063: }
90064: default: {
90065: Trigger *pTrigger = 0;
90066: assert( onError==OE_Replace );
90067: sqlite3MultiWrite(pParse);
1.2.2.1 ! misho 90068: if( db->flags&SQLITE_RecTriggers ){
1.2 misho 90069: pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0);
90070: }
90071: sqlite3GenerateRowDelete(
90072: pParse, pTab, baseCur, regR, 0, pTrigger, OE_Replace
90073: );
90074: seenReplace = 1;
90075: break;
90076: }
90077: }
90078: sqlite3VdbeJumpHere(v, j3);
90079: sqlite3ReleaseTempReg(pParse, regR);
90080: }
90081:
90082: if( pbMayReplace ){
90083: *pbMayReplace = seenReplace;
90084: }
90085: }
90086:
90087: /*
90088: ** This routine generates code to finish the INSERT or UPDATE operation
90089: ** that was started by a prior call to sqlite3GenerateConstraintChecks.
90090: ** A consecutive range of registers starting at regRowid contains the
90091: ** rowid and the content to be inserted.
90092: **
90093: ** The arguments to this routine should be the same as the first six
90094: ** arguments to sqlite3GenerateConstraintChecks.
90095: */
90096: SQLITE_PRIVATE void sqlite3CompleteInsertion(
90097: Parse *pParse, /* The parser context */
90098: Table *pTab, /* the table into which we are inserting */
90099: int baseCur, /* Index of a read/write cursor pointing at pTab */
90100: int regRowid, /* Range of content */
90101: int *aRegIdx, /* Register used by each index. 0 for unused indices */
90102: int isUpdate, /* True for UPDATE, False for INSERT */
90103: int appendBias, /* True if this is likely to be an append */
90104: int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */
90105: ){
90106: int i;
90107: Vdbe *v;
90108: int nIdx;
90109: Index *pIdx;
90110: u8 pik_flags;
90111: int regData;
90112: int regRec;
90113:
90114: v = sqlite3GetVdbe(pParse);
90115: assert( v!=0 );
90116: assert( pTab->pSelect==0 ); /* This table is not a VIEW */
90117: for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){}
90118: for(i=nIdx-1; i>=0; i--){
90119: if( aRegIdx[i]==0 ) continue;
90120: sqlite3VdbeAddOp2(v, OP_IdxInsert, baseCur+i+1, aRegIdx[i]);
90121: if( useSeekResult ){
90122: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
90123: }
90124: }
90125: regData = regRowid + 1;
90126: regRec = sqlite3GetTempReg(pParse);
90127: sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec);
90128: sqlite3TableAffinityStr(v, pTab);
90129: sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol);
90130: if( pParse->nested ){
90131: pik_flags = 0;
90132: }else{
90133: pik_flags = OPFLAG_NCHANGE;
90134: pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID);
90135: }
90136: if( appendBias ){
90137: pik_flags |= OPFLAG_APPEND;
90138: }
90139: if( useSeekResult ){
90140: pik_flags |= OPFLAG_USESEEKRESULT;
90141: }
90142: sqlite3VdbeAddOp3(v, OP_Insert, baseCur, regRec, regRowid);
90143: if( !pParse->nested ){
90144: sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT);
90145: }
90146: sqlite3VdbeChangeP5(v, pik_flags);
90147: }
90148:
90149: /*
90150: ** Generate code that will open cursors for a table and for all
90151: ** indices of that table. The "baseCur" parameter is the cursor number used
90152: ** for the table. Indices are opened on subsequent cursors.
90153: **
90154: ** Return the number of indices on the table.
90155: */
90156: SQLITE_PRIVATE int sqlite3OpenTableAndIndices(
90157: Parse *pParse, /* Parsing context */
90158: Table *pTab, /* Table to be opened */
90159: int baseCur, /* Cursor number assigned to the table */
90160: int op /* OP_OpenRead or OP_OpenWrite */
90161: ){
90162: int i;
90163: int iDb;
90164: Index *pIdx;
90165: Vdbe *v;
90166:
90167: if( IsVirtual(pTab) ) return 0;
90168: iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
90169: v = sqlite3GetVdbe(pParse);
90170: assert( v!=0 );
90171: sqlite3OpenTable(pParse, baseCur, iDb, pTab, op);
90172: for(i=1, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
90173: KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
90174: assert( pIdx->pSchema==pTab->pSchema );
90175: sqlite3VdbeAddOp4(v, op, i+baseCur, pIdx->tnum, iDb,
90176: (char*)pKey, P4_KEYINFO_HANDOFF);
90177: VdbeComment((v, "%s", pIdx->zName));
90178: }
90179: if( pParse->nTab<baseCur+i ){
90180: pParse->nTab = baseCur+i;
90181: }
90182: return i-1;
90183: }
90184:
90185:
90186: #ifdef SQLITE_TEST
90187: /*
90188: ** The following global variable is incremented whenever the
90189: ** transfer optimization is used. This is used for testing
90190: ** purposes only - to make sure the transfer optimization really
90191: ** is happening when it is suppose to.
90192: */
90193: SQLITE_API int sqlite3_xferopt_count;
90194: #endif /* SQLITE_TEST */
90195:
90196:
90197: #ifndef SQLITE_OMIT_XFER_OPT
90198: /*
90199: ** Check to collation names to see if they are compatible.
90200: */
90201: static int xferCompatibleCollation(const char *z1, const char *z2){
90202: if( z1==0 ){
90203: return z2==0;
90204: }
90205: if( z2==0 ){
90206: return 0;
90207: }
90208: return sqlite3StrICmp(z1, z2)==0;
90209: }
90210:
90211:
90212: /*
90213: ** Check to see if index pSrc is compatible as a source of data
90214: ** for index pDest in an insert transfer optimization. The rules
90215: ** for a compatible index:
90216: **
90217: ** * The index is over the same set of columns
90218: ** * The same DESC and ASC markings occurs on all columns
90219: ** * The same onError processing (OE_Abort, OE_Ignore, etc)
90220: ** * The same collating sequence on each column
90221: */
90222: static int xferCompatibleIndex(Index *pDest, Index *pSrc){
90223: int i;
90224: assert( pDest && pSrc );
90225: assert( pDest->pTable!=pSrc->pTable );
90226: if( pDest->nColumn!=pSrc->nColumn ){
90227: return 0; /* Different number of columns */
90228: }
90229: if( pDest->onError!=pSrc->onError ){
90230: return 0; /* Different conflict resolution strategies */
90231: }
90232: for(i=0; i<pSrc->nColumn; i++){
90233: if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){
90234: return 0; /* Different columns indexed */
90235: }
90236: if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){
90237: return 0; /* Different sort orders */
90238: }
90239: if( !xferCompatibleCollation(pSrc->azColl[i],pDest->azColl[i]) ){
90240: return 0; /* Different collating sequences */
90241: }
90242: }
90243:
90244: /* If no test above fails then the indices must be compatible */
90245: return 1;
90246: }
90247:
90248: /*
90249: ** Attempt the transfer optimization on INSERTs of the form
90250: **
90251: ** INSERT INTO tab1 SELECT * FROM tab2;
90252: **
90253: ** The xfer optimization transfers raw records from tab2 over to tab1.
90254: ** Columns are not decoded and reassemblied, which greatly improves
90255: ** performance. Raw index records are transferred in the same way.
90256: **
90257: ** The xfer optimization is only attempted if tab1 and tab2 are compatible.
90258: ** There are lots of rules for determining compatibility - see comments
90259: ** embedded in the code for details.
90260: **
90261: ** This routine returns TRUE if the optimization is guaranteed to be used.
90262: ** Sometimes the xfer optimization will only work if the destination table
90263: ** is empty - a factor that can only be determined at run-time. In that
90264: ** case, this routine generates code for the xfer optimization but also
90265: ** does a test to see if the destination table is empty and jumps over the
90266: ** xfer optimization code if the test fails. In that case, this routine
90267: ** returns FALSE so that the caller will know to go ahead and generate
90268: ** an unoptimized transfer. This routine also returns FALSE if there
90269: ** is no chance that the xfer optimization can be applied.
90270: **
90271: ** This optimization is particularly useful at making VACUUM run faster.
90272: */
90273: static int xferOptimization(
90274: Parse *pParse, /* Parser context */
90275: Table *pDest, /* The table we are inserting into */
90276: Select *pSelect, /* A SELECT statement to use as the data source */
90277: int onError, /* How to handle constraint errors */
90278: int iDbDest /* The database of pDest */
90279: ){
90280: ExprList *pEList; /* The result set of the SELECT */
90281: Table *pSrc; /* The table in the FROM clause of SELECT */
90282: Index *pSrcIdx, *pDestIdx; /* Source and destination indices */
90283: struct SrcList_item *pItem; /* An element of pSelect->pSrc */
90284: int i; /* Loop counter */
90285: int iDbSrc; /* The database of pSrc */
90286: int iSrc, iDest; /* Cursors from source and destination */
90287: int addr1, addr2; /* Loop addresses */
90288: int emptyDestTest; /* Address of test for empty pDest */
90289: int emptySrcTest; /* Address of test for empty pSrc */
90290: Vdbe *v; /* The VDBE we are building */
90291: KeyInfo *pKey; /* Key information for an index */
90292: int regAutoinc; /* Memory register used by AUTOINC */
90293: int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */
90294: int regData, regRowid; /* Registers holding data and rowid */
90295:
90296: if( pSelect==0 ){
90297: return 0; /* Must be of the form INSERT INTO ... SELECT ... */
90298: }
90299: if( sqlite3TriggerList(pParse, pDest) ){
90300: return 0; /* tab1 must not have triggers */
90301: }
90302: #ifndef SQLITE_OMIT_VIRTUALTABLE
90303: if( pDest->tabFlags & TF_Virtual ){
90304: return 0; /* tab1 must not be a virtual table */
90305: }
90306: #endif
90307: if( onError==OE_Default ){
90308: if( pDest->iPKey>=0 ) onError = pDest->keyConf;
90309: if( onError==OE_Default ) onError = OE_Abort;
90310: }
90311: assert(pSelect->pSrc); /* allocated even if there is no FROM clause */
90312: if( pSelect->pSrc->nSrc!=1 ){
90313: return 0; /* FROM clause must have exactly one term */
90314: }
90315: if( pSelect->pSrc->a[0].pSelect ){
90316: return 0; /* FROM clause cannot contain a subquery */
90317: }
90318: if( pSelect->pWhere ){
90319: return 0; /* SELECT may not have a WHERE clause */
90320: }
90321: if( pSelect->pOrderBy ){
90322: return 0; /* SELECT may not have an ORDER BY clause */
90323: }
90324: /* Do not need to test for a HAVING clause. If HAVING is present but
90325: ** there is no ORDER BY, we will get an error. */
90326: if( pSelect->pGroupBy ){
90327: return 0; /* SELECT may not have a GROUP BY clause */
90328: }
90329: if( pSelect->pLimit ){
90330: return 0; /* SELECT may not have a LIMIT clause */
90331: }
90332: assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */
90333: if( pSelect->pPrior ){
90334: return 0; /* SELECT may not be a compound query */
90335: }
90336: if( pSelect->selFlags & SF_Distinct ){
90337: return 0; /* SELECT may not be DISTINCT */
90338: }
90339: pEList = pSelect->pEList;
90340: assert( pEList!=0 );
90341: if( pEList->nExpr!=1 ){
90342: return 0; /* The result set must have exactly one column */
90343: }
90344: assert( pEList->a[0].pExpr );
90345: if( pEList->a[0].pExpr->op!=TK_ALL ){
90346: return 0; /* The result set must be the special operator "*" */
90347: }
90348:
90349: /* At this point we have established that the statement is of the
90350: ** correct syntactic form to participate in this optimization. Now
90351: ** we have to check the semantics.
90352: */
90353: pItem = pSelect->pSrc->a;
1.2.2.1 ! misho 90354: pSrc = sqlite3LocateTableItem(pParse, 0, pItem);
1.2 misho 90355: if( pSrc==0 ){
90356: return 0; /* FROM clause does not contain a real table */
90357: }
90358: if( pSrc==pDest ){
90359: return 0; /* tab1 and tab2 may not be the same table */
90360: }
90361: #ifndef SQLITE_OMIT_VIRTUALTABLE
90362: if( pSrc->tabFlags & TF_Virtual ){
90363: return 0; /* tab2 must not be a virtual table */
90364: }
90365: #endif
90366: if( pSrc->pSelect ){
90367: return 0; /* tab2 may not be a view */
90368: }
90369: if( pDest->nCol!=pSrc->nCol ){
90370: return 0; /* Number of columns must be the same in tab1 and tab2 */
90371: }
90372: if( pDest->iPKey!=pSrc->iPKey ){
90373: return 0; /* Both tables must have the same INTEGER PRIMARY KEY */
90374: }
90375: for(i=0; i<pDest->nCol; i++){
90376: if( pDest->aCol[i].affinity!=pSrc->aCol[i].affinity ){
90377: return 0; /* Affinity must be the same on all columns */
90378: }
90379: if( !xferCompatibleCollation(pDest->aCol[i].zColl, pSrc->aCol[i].zColl) ){
90380: return 0; /* Collating sequence must be the same on all columns */
90381: }
90382: if( pDest->aCol[i].notNull && !pSrc->aCol[i].notNull ){
90383: return 0; /* tab2 must be NOT NULL if tab1 is */
90384: }
90385: }
90386: for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){
90387: if( pDestIdx->onError!=OE_None ){
90388: destHasUniqueIdx = 1;
90389: }
90390: for(pSrcIdx=pSrc->pIndex; pSrcIdx; pSrcIdx=pSrcIdx->pNext){
90391: if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break;
90392: }
90393: if( pSrcIdx==0 ){
90394: return 0; /* pDestIdx has no corresponding index in pSrc */
90395: }
90396: }
90397: #ifndef SQLITE_OMIT_CHECK
1.2.2.1 ! misho 90398: if( pDest->pCheck && sqlite3ExprListCompare(pSrc->pCheck, pDest->pCheck) ){
1.2 misho 90399: return 0; /* Tables have different CHECK constraints. Ticket #2252 */
90400: }
90401: #endif
90402: #ifndef SQLITE_OMIT_FOREIGN_KEY
90403: /* Disallow the transfer optimization if the destination table constains
90404: ** any foreign key constraints. This is more restrictive than necessary.
90405: ** But the main beneficiary of the transfer optimization is the VACUUM
90406: ** command, and the VACUUM command disables foreign key constraints. So
90407: ** the extra complication to make this rule less restrictive is probably
90408: ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e]
90409: */
90410: if( (pParse->db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){
90411: return 0;
90412: }
90413: #endif
90414: if( (pParse->db->flags & SQLITE_CountRows)!=0 ){
90415: return 0; /* xfer opt does not play well with PRAGMA count_changes */
90416: }
90417:
90418: /* If we get this far, it means that the xfer optimization is at
90419: ** least a possibility, though it might only work if the destination
90420: ** table (tab1) is initially empty.
90421: */
90422: #ifdef SQLITE_TEST
90423: sqlite3_xferopt_count++;
90424: #endif
90425: iDbSrc = sqlite3SchemaToIndex(pParse->db, pSrc->pSchema);
90426: v = sqlite3GetVdbe(pParse);
90427: sqlite3CodeVerifySchema(pParse, iDbSrc);
90428: iSrc = pParse->nTab++;
90429: iDest = pParse->nTab++;
90430: regAutoinc = autoIncBegin(pParse, iDbDest, pDest);
90431: sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite);
90432: if( (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */
90433: || destHasUniqueIdx /* (2) */
90434: || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */
90435: ){
90436: /* In some circumstances, we are able to run the xfer optimization
90437: ** only if the destination table is initially empty. This code makes
90438: ** that determination. Conditions under which the destination must
90439: ** be empty:
90440: **
90441: ** (1) There is no INTEGER PRIMARY KEY but there are indices.
90442: ** (If the destination is not initially empty, the rowid fields
90443: ** of index entries might need to change.)
90444: **
90445: ** (2) The destination has a unique index. (The xfer optimization
90446: ** is unable to test uniqueness.)
90447: **
90448: ** (3) onError is something other than OE_Abort and OE_Rollback.
90449: */
90450: addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0);
90451: emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0);
90452: sqlite3VdbeJumpHere(v, addr1);
90453: }else{
90454: emptyDestTest = 0;
90455: }
90456: sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead);
90457: emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0);
90458: regData = sqlite3GetTempReg(pParse);
90459: regRowid = sqlite3GetTempReg(pParse);
90460: if( pDest->iPKey>=0 ){
90461: addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
90462: addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid);
90463: sqlite3HaltConstraint(
90464: pParse, onError, "PRIMARY KEY must be unique", P4_STATIC);
90465: sqlite3VdbeJumpHere(v, addr2);
90466: autoIncStep(pParse, regAutoinc, regRowid);
90467: }else if( pDest->pIndex==0 ){
90468: addr1 = sqlite3VdbeAddOp2(v, OP_NewRowid, iDest, regRowid);
90469: }else{
90470: addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid);
90471: assert( (pDest->tabFlags & TF_Autoincrement)==0 );
90472: }
90473: sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData);
90474: sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid);
90475: sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND);
90476: sqlite3VdbeChangeP4(v, -1, pDest->zName, 0);
90477: sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1);
90478: for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){
90479: for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){
90480: if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break;
90481: }
90482: assert( pSrcIdx );
90483: sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0);
90484: sqlite3VdbeAddOp2(v, OP_Close, iDest, 0);
90485: pKey = sqlite3IndexKeyinfo(pParse, pSrcIdx);
90486: sqlite3VdbeAddOp4(v, OP_OpenRead, iSrc, pSrcIdx->tnum, iDbSrc,
90487: (char*)pKey, P4_KEYINFO_HANDOFF);
90488: VdbeComment((v, "%s", pSrcIdx->zName));
90489: pKey = sqlite3IndexKeyinfo(pParse, pDestIdx);
90490: sqlite3VdbeAddOp4(v, OP_OpenWrite, iDest, pDestIdx->tnum, iDbDest,
90491: (char*)pKey, P4_KEYINFO_HANDOFF);
90492: VdbeComment((v, "%s", pDestIdx->zName));
90493: addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0);
90494: sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData);
90495: sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1);
90496: sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1);
90497: sqlite3VdbeJumpHere(v, addr1);
90498: }
90499: sqlite3VdbeJumpHere(v, emptySrcTest);
90500: sqlite3ReleaseTempReg(pParse, regRowid);
90501: sqlite3ReleaseTempReg(pParse, regData);
90502: sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0);
90503: sqlite3VdbeAddOp2(v, OP_Close, iDest, 0);
90504: if( emptyDestTest ){
90505: sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0);
90506: sqlite3VdbeJumpHere(v, emptyDestTest);
90507: sqlite3VdbeAddOp2(v, OP_Close, iDest, 0);
90508: return 0;
90509: }else{
90510: return 1;
90511: }
90512: }
90513: #endif /* SQLITE_OMIT_XFER_OPT */
90514:
90515: /************** End of insert.c **********************************************/
90516: /************** Begin file legacy.c ******************************************/
90517: /*
90518: ** 2001 September 15
90519: **
90520: ** The author disclaims copyright to this source code. In place of
90521: ** a legal notice, here is a blessing:
90522: **
90523: ** May you do good and not evil.
90524: ** May you find forgiveness for yourself and forgive others.
90525: ** May you share freely, never taking more than you give.
90526: **
90527: *************************************************************************
90528: ** Main file for the SQLite library. The routines in this file
90529: ** implement the programmer interface to the library. Routines in
90530: ** other files are for internal use by SQLite and should not be
90531: ** accessed by users of the library.
90532: */
90533:
90534:
90535: /*
90536: ** Execute SQL code. Return one of the SQLITE_ success/failure
90537: ** codes. Also write an error message into memory obtained from
90538: ** malloc() and make *pzErrMsg point to that message.
90539: **
90540: ** If the SQL is a query, then for each row in the query result
90541: ** the xCallback() function is called. pArg becomes the first
90542: ** argument to xCallback(). If xCallback=NULL then no callback
90543: ** is invoked, even for queries.
90544: */
90545: SQLITE_API int sqlite3_exec(
90546: sqlite3 *db, /* The database on which the SQL executes */
90547: const char *zSql, /* The SQL to be executed */
90548: sqlite3_callback xCallback, /* Invoke this callback routine */
90549: void *pArg, /* First argument to xCallback() */
90550: char **pzErrMsg /* Write error messages here */
90551: ){
90552: int rc = SQLITE_OK; /* Return code */
90553: const char *zLeftover; /* Tail of unprocessed SQL */
90554: sqlite3_stmt *pStmt = 0; /* The current SQL statement */
90555: char **azCols = 0; /* Names of result columns */
90556: int nRetry = 0; /* Number of retry attempts */
90557: int callbackIsInit; /* True if callback data is initialized */
90558:
90559: if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
90560: if( zSql==0 ) zSql = "";
90561:
90562: sqlite3_mutex_enter(db->mutex);
90563: sqlite3Error(db, SQLITE_OK, 0);
90564: while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
90565: int nCol;
90566: char **azVals = 0;
90567:
90568: pStmt = 0;
90569: rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover);
90570: assert( rc==SQLITE_OK || pStmt==0 );
90571: if( rc!=SQLITE_OK ){
90572: continue;
90573: }
90574: if( !pStmt ){
90575: /* this happens for a comment or white-space */
90576: zSql = zLeftover;
90577: continue;
90578: }
90579:
90580: callbackIsInit = 0;
90581: nCol = sqlite3_column_count(pStmt);
90582:
90583: while( 1 ){
90584: int i;
90585: rc = sqlite3_step(pStmt);
90586:
90587: /* Invoke the callback function if required */
90588: if( xCallback && (SQLITE_ROW==rc ||
90589: (SQLITE_DONE==rc && !callbackIsInit
90590: && db->flags&SQLITE_NullCallback)) ){
90591: if( !callbackIsInit ){
90592: azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
90593: if( azCols==0 ){
90594: goto exec_out;
90595: }
90596: for(i=0; i<nCol; i++){
90597: azCols[i] = (char *)sqlite3_column_name(pStmt, i);
90598: /* sqlite3VdbeSetColName() installs column names as UTF8
90599: ** strings so there is no way for sqlite3_column_name() to fail. */
90600: assert( azCols[i]!=0 );
90601: }
90602: callbackIsInit = 1;
90603: }
90604: if( rc==SQLITE_ROW ){
90605: azVals = &azCols[nCol];
90606: for(i=0; i<nCol; i++){
90607: azVals[i] = (char *)sqlite3_column_text(pStmt, i);
90608: if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
90609: db->mallocFailed = 1;
90610: goto exec_out;
90611: }
90612: }
90613: }
90614: if( xCallback(pArg, nCol, azVals, azCols) ){
90615: rc = SQLITE_ABORT;
90616: sqlite3VdbeFinalize((Vdbe *)pStmt);
90617: pStmt = 0;
90618: sqlite3Error(db, SQLITE_ABORT, 0);
90619: goto exec_out;
90620: }
90621: }
90622:
90623: if( rc!=SQLITE_ROW ){
90624: rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
90625: pStmt = 0;
90626: if( rc!=SQLITE_SCHEMA ){
90627: nRetry = 0;
90628: zSql = zLeftover;
90629: while( sqlite3Isspace(zSql[0]) ) zSql++;
90630: }
90631: break;
90632: }
90633: }
90634:
90635: sqlite3DbFree(db, azCols);
90636: azCols = 0;
90637: }
90638:
90639: exec_out:
90640: if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
90641: sqlite3DbFree(db, azCols);
90642:
90643: rc = sqlite3ApiExit(db, rc);
90644: if( rc!=SQLITE_OK && ALWAYS(rc==sqlite3_errcode(db)) && pzErrMsg ){
90645: int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db));
90646: *pzErrMsg = sqlite3Malloc(nErrMsg);
90647: if( *pzErrMsg ){
90648: memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
90649: }else{
90650: rc = SQLITE_NOMEM;
90651: sqlite3Error(db, SQLITE_NOMEM, 0);
90652: }
90653: }else if( pzErrMsg ){
90654: *pzErrMsg = 0;
90655: }
90656:
90657: assert( (rc&db->errMask)==rc );
90658: sqlite3_mutex_leave(db->mutex);
90659: return rc;
90660: }
90661:
90662: /************** End of legacy.c **********************************************/
90663: /************** Begin file loadext.c *****************************************/
90664: /*
90665: ** 2006 June 7
90666: **
90667: ** The author disclaims copyright to this source code. In place of
90668: ** a legal notice, here is a blessing:
90669: **
90670: ** May you do good and not evil.
90671: ** May you find forgiveness for yourself and forgive others.
90672: ** May you share freely, never taking more than you give.
90673: **
90674: *************************************************************************
90675: ** This file contains code used to dynamically load extensions into
90676: ** the SQLite library.
90677: */
90678:
90679: #ifndef SQLITE_CORE
90680: #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */
90681: #endif
90682: /************** Include sqlite3ext.h in the middle of loadext.c **************/
90683: /************** Begin file sqlite3ext.h **************************************/
90684: /*
90685: ** 2006 June 7
90686: **
90687: ** The author disclaims copyright to this source code. In place of
90688: ** a legal notice, here is a blessing:
90689: **
90690: ** May you do good and not evil.
90691: ** May you find forgiveness for yourself and forgive others.
90692: ** May you share freely, never taking more than you give.
90693: **
90694: *************************************************************************
90695: ** This header file defines the SQLite interface for use by
90696: ** shared libraries that want to be imported as extensions into
90697: ** an SQLite instance. Shared libraries that intend to be loaded
90698: ** as extensions by SQLite should #include this file instead of
90699: ** sqlite3.h.
90700: */
90701: #ifndef _SQLITE3EXT_H_
90702: #define _SQLITE3EXT_H_
90703:
90704: typedef struct sqlite3_api_routines sqlite3_api_routines;
90705:
90706: /*
90707: ** The following structure holds pointers to all of the SQLite API
90708: ** routines.
90709: **
90710: ** WARNING: In order to maintain backwards compatibility, add new
90711: ** interfaces to the end of this structure only. If you insert new
90712: ** interfaces in the middle of this structure, then older different
90713: ** versions of SQLite will not be able to load each others' shared
90714: ** libraries!
90715: */
90716: struct sqlite3_api_routines {
90717: void * (*aggregate_context)(sqlite3_context*,int nBytes);
90718: int (*aggregate_count)(sqlite3_context*);
90719: int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
90720: int (*bind_double)(sqlite3_stmt*,int,double);
90721: int (*bind_int)(sqlite3_stmt*,int,int);
90722: int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
90723: int (*bind_null)(sqlite3_stmt*,int);
90724: int (*bind_parameter_count)(sqlite3_stmt*);
90725: int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
90726: const char * (*bind_parameter_name)(sqlite3_stmt*,int);
90727: int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
90728: int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
90729: int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
90730: int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
90731: int (*busy_timeout)(sqlite3*,int ms);
90732: int (*changes)(sqlite3*);
90733: int (*close)(sqlite3*);
90734: int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
90735: int eTextRep,const char*));
90736: int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
90737: int eTextRep,const void*));
90738: const void * (*column_blob)(sqlite3_stmt*,int iCol);
90739: int (*column_bytes)(sqlite3_stmt*,int iCol);
90740: int (*column_bytes16)(sqlite3_stmt*,int iCol);
90741: int (*column_count)(sqlite3_stmt*pStmt);
90742: const char * (*column_database_name)(sqlite3_stmt*,int);
90743: const void * (*column_database_name16)(sqlite3_stmt*,int);
90744: const char * (*column_decltype)(sqlite3_stmt*,int i);
90745: const void * (*column_decltype16)(sqlite3_stmt*,int);
90746: double (*column_double)(sqlite3_stmt*,int iCol);
90747: int (*column_int)(sqlite3_stmt*,int iCol);
90748: sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
90749: const char * (*column_name)(sqlite3_stmt*,int);
90750: const void * (*column_name16)(sqlite3_stmt*,int);
90751: const char * (*column_origin_name)(sqlite3_stmt*,int);
90752: const void * (*column_origin_name16)(sqlite3_stmt*,int);
90753: const char * (*column_table_name)(sqlite3_stmt*,int);
90754: const void * (*column_table_name16)(sqlite3_stmt*,int);
90755: const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
90756: const void * (*column_text16)(sqlite3_stmt*,int iCol);
90757: int (*column_type)(sqlite3_stmt*,int iCol);
90758: sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
90759: void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
90760: int (*complete)(const char*sql);
90761: int (*complete16)(const void*sql);
90762: int (*create_collation)(sqlite3*,const char*,int,void*,
90763: int(*)(void*,int,const void*,int,const void*));
90764: int (*create_collation16)(sqlite3*,const void*,int,void*,
90765: int(*)(void*,int,const void*,int,const void*));
90766: int (*create_function)(sqlite3*,const char*,int,int,void*,
90767: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
90768: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
90769: void (*xFinal)(sqlite3_context*));
90770: int (*create_function16)(sqlite3*,const void*,int,int,void*,
90771: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
90772: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
90773: void (*xFinal)(sqlite3_context*));
90774: int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
90775: int (*data_count)(sqlite3_stmt*pStmt);
90776: sqlite3 * (*db_handle)(sqlite3_stmt*);
90777: int (*declare_vtab)(sqlite3*,const char*);
90778: int (*enable_shared_cache)(int);
90779: int (*errcode)(sqlite3*db);
90780: const char * (*errmsg)(sqlite3*);
90781: const void * (*errmsg16)(sqlite3*);
90782: int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
90783: int (*expired)(sqlite3_stmt*);
90784: int (*finalize)(sqlite3_stmt*pStmt);
90785: void (*free)(void*);
90786: void (*free_table)(char**result);
90787: int (*get_autocommit)(sqlite3*);
90788: void * (*get_auxdata)(sqlite3_context*,int);
90789: int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
90790: int (*global_recover)(void);
90791: void (*interruptx)(sqlite3*);
90792: sqlite_int64 (*last_insert_rowid)(sqlite3*);
90793: const char * (*libversion)(void);
90794: int (*libversion_number)(void);
90795: void *(*malloc)(int);
90796: char * (*mprintf)(const char*,...);
90797: int (*open)(const char*,sqlite3**);
90798: int (*open16)(const void*,sqlite3**);
90799: int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
90800: int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
90801: void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
90802: void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
90803: void *(*realloc)(void*,int);
90804: int (*reset)(sqlite3_stmt*pStmt);
90805: void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
90806: void (*result_double)(sqlite3_context*,double);
90807: void (*result_error)(sqlite3_context*,const char*,int);
90808: void (*result_error16)(sqlite3_context*,const void*,int);
90809: void (*result_int)(sqlite3_context*,int);
90810: void (*result_int64)(sqlite3_context*,sqlite_int64);
90811: void (*result_null)(sqlite3_context*);
90812: void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
90813: void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
90814: void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
90815: void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
90816: void (*result_value)(sqlite3_context*,sqlite3_value*);
90817: void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
90818: int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
90819: const char*,const char*),void*);
90820: void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
90821: char * (*snprintf)(int,char*,const char*,...);
90822: int (*step)(sqlite3_stmt*);
90823: int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
90824: char const**,char const**,int*,int*,int*);
90825: void (*thread_cleanup)(void);
90826: int (*total_changes)(sqlite3*);
90827: void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
90828: int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
90829: void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
90830: sqlite_int64),void*);
90831: void * (*user_data)(sqlite3_context*);
90832: const void * (*value_blob)(sqlite3_value*);
90833: int (*value_bytes)(sqlite3_value*);
90834: int (*value_bytes16)(sqlite3_value*);
90835: double (*value_double)(sqlite3_value*);
90836: int (*value_int)(sqlite3_value*);
90837: sqlite_int64 (*value_int64)(sqlite3_value*);
90838: int (*value_numeric_type)(sqlite3_value*);
90839: const unsigned char * (*value_text)(sqlite3_value*);
90840: const void * (*value_text16)(sqlite3_value*);
90841: const void * (*value_text16be)(sqlite3_value*);
90842: const void * (*value_text16le)(sqlite3_value*);
90843: int (*value_type)(sqlite3_value*);
90844: char *(*vmprintf)(const char*,va_list);
90845: /* Added ??? */
90846: int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
90847: /* Added by 3.3.13 */
90848: int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
90849: int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
90850: int (*clear_bindings)(sqlite3_stmt*);
90851: /* Added by 3.4.1 */
90852: int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
90853: void (*xDestroy)(void *));
90854: /* Added by 3.5.0 */
90855: int (*bind_zeroblob)(sqlite3_stmt*,int,int);
90856: int (*blob_bytes)(sqlite3_blob*);
90857: int (*blob_close)(sqlite3_blob*);
90858: int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
90859: int,sqlite3_blob**);
90860: int (*blob_read)(sqlite3_blob*,void*,int,int);
90861: int (*blob_write)(sqlite3_blob*,const void*,int,int);
90862: int (*create_collation_v2)(sqlite3*,const char*,int,void*,
90863: int(*)(void*,int,const void*,int,const void*),
90864: void(*)(void*));
90865: int (*file_control)(sqlite3*,const char*,int,void*);
90866: sqlite3_int64 (*memory_highwater)(int);
90867: sqlite3_int64 (*memory_used)(void);
90868: sqlite3_mutex *(*mutex_alloc)(int);
90869: void (*mutex_enter)(sqlite3_mutex*);
90870: void (*mutex_free)(sqlite3_mutex*);
90871: void (*mutex_leave)(sqlite3_mutex*);
90872: int (*mutex_try)(sqlite3_mutex*);
90873: int (*open_v2)(const char*,sqlite3**,int,const char*);
90874: int (*release_memory)(int);
90875: void (*result_error_nomem)(sqlite3_context*);
90876: void (*result_error_toobig)(sqlite3_context*);
90877: int (*sleep)(int);
90878: void (*soft_heap_limit)(int);
90879: sqlite3_vfs *(*vfs_find)(const char*);
90880: int (*vfs_register)(sqlite3_vfs*,int);
90881: int (*vfs_unregister)(sqlite3_vfs*);
90882: int (*xthreadsafe)(void);
90883: void (*result_zeroblob)(sqlite3_context*,int);
90884: void (*result_error_code)(sqlite3_context*,int);
90885: int (*test_control)(int, ...);
90886: void (*randomness)(int,void*);
90887: sqlite3 *(*context_db_handle)(sqlite3_context*);
90888: int (*extended_result_codes)(sqlite3*,int);
90889: int (*limit)(sqlite3*,int,int);
90890: sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
90891: const char *(*sql)(sqlite3_stmt*);
90892: int (*status)(int,int*,int*,int);
90893: int (*backup_finish)(sqlite3_backup*);
90894: sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
90895: int (*backup_pagecount)(sqlite3_backup*);
90896: int (*backup_remaining)(sqlite3_backup*);
90897: int (*backup_step)(sqlite3_backup*,int);
90898: const char *(*compileoption_get)(int);
90899: int (*compileoption_used)(const char*);
90900: int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
90901: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
90902: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
90903: void (*xFinal)(sqlite3_context*),
90904: void(*xDestroy)(void*));
90905: int (*db_config)(sqlite3*,int,...);
90906: sqlite3_mutex *(*db_mutex)(sqlite3*);
90907: int (*db_status)(sqlite3*,int,int*,int*,int);
90908: int (*extended_errcode)(sqlite3*);
90909: void (*log)(int,const char*,...);
90910: sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
90911: const char *(*sourceid)(void);
90912: int (*stmt_status)(sqlite3_stmt*,int,int);
90913: int (*strnicmp)(const char*,const char*,int);
90914: int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
90915: int (*wal_autocheckpoint)(sqlite3*,int);
90916: int (*wal_checkpoint)(sqlite3*,const char*);
90917: void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
90918: int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
90919: int (*vtab_config)(sqlite3*,int op,...);
90920: int (*vtab_on_conflict)(sqlite3*);
90921: };
90922:
90923: /*
90924: ** The following macros redefine the API routines so that they are
90925: ** redirected throught the global sqlite3_api structure.
90926: **
90927: ** This header file is also used by the loadext.c source file
90928: ** (part of the main SQLite library - not an extension) so that
90929: ** it can get access to the sqlite3_api_routines structure
90930: ** definition. But the main library does not want to redefine
90931: ** the API. So the redefinition macros are only valid if the
90932: ** SQLITE_CORE macros is undefined.
90933: */
90934: #ifndef SQLITE_CORE
90935: #define sqlite3_aggregate_context sqlite3_api->aggregate_context
90936: #ifndef SQLITE_OMIT_DEPRECATED
90937: #define sqlite3_aggregate_count sqlite3_api->aggregate_count
90938: #endif
90939: #define sqlite3_bind_blob sqlite3_api->bind_blob
90940: #define sqlite3_bind_double sqlite3_api->bind_double
90941: #define sqlite3_bind_int sqlite3_api->bind_int
90942: #define sqlite3_bind_int64 sqlite3_api->bind_int64
90943: #define sqlite3_bind_null sqlite3_api->bind_null
90944: #define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
90945: #define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
90946: #define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
90947: #define sqlite3_bind_text sqlite3_api->bind_text
90948: #define sqlite3_bind_text16 sqlite3_api->bind_text16
90949: #define sqlite3_bind_value sqlite3_api->bind_value
90950: #define sqlite3_busy_handler sqlite3_api->busy_handler
90951: #define sqlite3_busy_timeout sqlite3_api->busy_timeout
90952: #define sqlite3_changes sqlite3_api->changes
90953: #define sqlite3_close sqlite3_api->close
90954: #define sqlite3_collation_needed sqlite3_api->collation_needed
90955: #define sqlite3_collation_needed16 sqlite3_api->collation_needed16
90956: #define sqlite3_column_blob sqlite3_api->column_blob
90957: #define sqlite3_column_bytes sqlite3_api->column_bytes
90958: #define sqlite3_column_bytes16 sqlite3_api->column_bytes16
90959: #define sqlite3_column_count sqlite3_api->column_count
90960: #define sqlite3_column_database_name sqlite3_api->column_database_name
90961: #define sqlite3_column_database_name16 sqlite3_api->column_database_name16
90962: #define sqlite3_column_decltype sqlite3_api->column_decltype
90963: #define sqlite3_column_decltype16 sqlite3_api->column_decltype16
90964: #define sqlite3_column_double sqlite3_api->column_double
90965: #define sqlite3_column_int sqlite3_api->column_int
90966: #define sqlite3_column_int64 sqlite3_api->column_int64
90967: #define sqlite3_column_name sqlite3_api->column_name
90968: #define sqlite3_column_name16 sqlite3_api->column_name16
90969: #define sqlite3_column_origin_name sqlite3_api->column_origin_name
90970: #define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
90971: #define sqlite3_column_table_name sqlite3_api->column_table_name
90972: #define sqlite3_column_table_name16 sqlite3_api->column_table_name16
90973: #define sqlite3_column_text sqlite3_api->column_text
90974: #define sqlite3_column_text16 sqlite3_api->column_text16
90975: #define sqlite3_column_type sqlite3_api->column_type
90976: #define sqlite3_column_value sqlite3_api->column_value
90977: #define sqlite3_commit_hook sqlite3_api->commit_hook
90978: #define sqlite3_complete sqlite3_api->complete
90979: #define sqlite3_complete16 sqlite3_api->complete16
90980: #define sqlite3_create_collation sqlite3_api->create_collation
90981: #define sqlite3_create_collation16 sqlite3_api->create_collation16
90982: #define sqlite3_create_function sqlite3_api->create_function
90983: #define sqlite3_create_function16 sqlite3_api->create_function16
90984: #define sqlite3_create_module sqlite3_api->create_module
90985: #define sqlite3_create_module_v2 sqlite3_api->create_module_v2
90986: #define sqlite3_data_count sqlite3_api->data_count
90987: #define sqlite3_db_handle sqlite3_api->db_handle
90988: #define sqlite3_declare_vtab sqlite3_api->declare_vtab
90989: #define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
90990: #define sqlite3_errcode sqlite3_api->errcode
90991: #define sqlite3_errmsg sqlite3_api->errmsg
90992: #define sqlite3_errmsg16 sqlite3_api->errmsg16
90993: #define sqlite3_exec sqlite3_api->exec
90994: #ifndef SQLITE_OMIT_DEPRECATED
90995: #define sqlite3_expired sqlite3_api->expired
90996: #endif
90997: #define sqlite3_finalize sqlite3_api->finalize
90998: #define sqlite3_free sqlite3_api->free
90999: #define sqlite3_free_table sqlite3_api->free_table
91000: #define sqlite3_get_autocommit sqlite3_api->get_autocommit
91001: #define sqlite3_get_auxdata sqlite3_api->get_auxdata
91002: #define sqlite3_get_table sqlite3_api->get_table
91003: #ifndef SQLITE_OMIT_DEPRECATED
91004: #define sqlite3_global_recover sqlite3_api->global_recover
91005: #endif
91006: #define sqlite3_interrupt sqlite3_api->interruptx
91007: #define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
91008: #define sqlite3_libversion sqlite3_api->libversion
91009: #define sqlite3_libversion_number sqlite3_api->libversion_number
91010: #define sqlite3_malloc sqlite3_api->malloc
91011: #define sqlite3_mprintf sqlite3_api->mprintf
91012: #define sqlite3_open sqlite3_api->open
91013: #define sqlite3_open16 sqlite3_api->open16
91014: #define sqlite3_prepare sqlite3_api->prepare
91015: #define sqlite3_prepare16 sqlite3_api->prepare16
91016: #define sqlite3_prepare_v2 sqlite3_api->prepare_v2
91017: #define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
91018: #define sqlite3_profile sqlite3_api->profile
91019: #define sqlite3_progress_handler sqlite3_api->progress_handler
91020: #define sqlite3_realloc sqlite3_api->realloc
91021: #define sqlite3_reset sqlite3_api->reset
91022: #define sqlite3_result_blob sqlite3_api->result_blob
91023: #define sqlite3_result_double sqlite3_api->result_double
91024: #define sqlite3_result_error sqlite3_api->result_error
91025: #define sqlite3_result_error16 sqlite3_api->result_error16
91026: #define sqlite3_result_int sqlite3_api->result_int
91027: #define sqlite3_result_int64 sqlite3_api->result_int64
91028: #define sqlite3_result_null sqlite3_api->result_null
91029: #define sqlite3_result_text sqlite3_api->result_text
91030: #define sqlite3_result_text16 sqlite3_api->result_text16
91031: #define sqlite3_result_text16be sqlite3_api->result_text16be
91032: #define sqlite3_result_text16le sqlite3_api->result_text16le
91033: #define sqlite3_result_value sqlite3_api->result_value
91034: #define sqlite3_rollback_hook sqlite3_api->rollback_hook
91035: #define sqlite3_set_authorizer sqlite3_api->set_authorizer
91036: #define sqlite3_set_auxdata sqlite3_api->set_auxdata
91037: #define sqlite3_snprintf sqlite3_api->snprintf
91038: #define sqlite3_step sqlite3_api->step
91039: #define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
91040: #define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
91041: #define sqlite3_total_changes sqlite3_api->total_changes
91042: #define sqlite3_trace sqlite3_api->trace
91043: #ifndef SQLITE_OMIT_DEPRECATED
91044: #define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
91045: #endif
91046: #define sqlite3_update_hook sqlite3_api->update_hook
91047: #define sqlite3_user_data sqlite3_api->user_data
91048: #define sqlite3_value_blob sqlite3_api->value_blob
91049: #define sqlite3_value_bytes sqlite3_api->value_bytes
91050: #define sqlite3_value_bytes16 sqlite3_api->value_bytes16
91051: #define sqlite3_value_double sqlite3_api->value_double
91052: #define sqlite3_value_int sqlite3_api->value_int
91053: #define sqlite3_value_int64 sqlite3_api->value_int64
91054: #define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
91055: #define sqlite3_value_text sqlite3_api->value_text
91056: #define sqlite3_value_text16 sqlite3_api->value_text16
91057: #define sqlite3_value_text16be sqlite3_api->value_text16be
91058: #define sqlite3_value_text16le sqlite3_api->value_text16le
91059: #define sqlite3_value_type sqlite3_api->value_type
91060: #define sqlite3_vmprintf sqlite3_api->vmprintf
91061: #define sqlite3_overload_function sqlite3_api->overload_function
91062: #define sqlite3_prepare_v2 sqlite3_api->prepare_v2
91063: #define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
91064: #define sqlite3_clear_bindings sqlite3_api->clear_bindings
91065: #define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
91066: #define sqlite3_blob_bytes sqlite3_api->blob_bytes
91067: #define sqlite3_blob_close sqlite3_api->blob_close
91068: #define sqlite3_blob_open sqlite3_api->blob_open
91069: #define sqlite3_blob_read sqlite3_api->blob_read
91070: #define sqlite3_blob_write sqlite3_api->blob_write
91071: #define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
91072: #define sqlite3_file_control sqlite3_api->file_control
91073: #define sqlite3_memory_highwater sqlite3_api->memory_highwater
91074: #define sqlite3_memory_used sqlite3_api->memory_used
91075: #define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
91076: #define sqlite3_mutex_enter sqlite3_api->mutex_enter
91077: #define sqlite3_mutex_free sqlite3_api->mutex_free
91078: #define sqlite3_mutex_leave sqlite3_api->mutex_leave
91079: #define sqlite3_mutex_try sqlite3_api->mutex_try
91080: #define sqlite3_open_v2 sqlite3_api->open_v2
91081: #define sqlite3_release_memory sqlite3_api->release_memory
91082: #define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
91083: #define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
91084: #define sqlite3_sleep sqlite3_api->sleep
91085: #define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
91086: #define sqlite3_vfs_find sqlite3_api->vfs_find
91087: #define sqlite3_vfs_register sqlite3_api->vfs_register
91088: #define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
91089: #define sqlite3_threadsafe sqlite3_api->xthreadsafe
91090: #define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
91091: #define sqlite3_result_error_code sqlite3_api->result_error_code
91092: #define sqlite3_test_control sqlite3_api->test_control
91093: #define sqlite3_randomness sqlite3_api->randomness
91094: #define sqlite3_context_db_handle sqlite3_api->context_db_handle
91095: #define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
91096: #define sqlite3_limit sqlite3_api->limit
91097: #define sqlite3_next_stmt sqlite3_api->next_stmt
91098: #define sqlite3_sql sqlite3_api->sql
91099: #define sqlite3_status sqlite3_api->status
91100: #define sqlite3_backup_finish sqlite3_api->backup_finish
91101: #define sqlite3_backup_init sqlite3_api->backup_init
91102: #define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
91103: #define sqlite3_backup_remaining sqlite3_api->backup_remaining
91104: #define sqlite3_backup_step sqlite3_api->backup_step
91105: #define sqlite3_compileoption_get sqlite3_api->compileoption_get
91106: #define sqlite3_compileoption_used sqlite3_api->compileoption_used
91107: #define sqlite3_create_function_v2 sqlite3_api->create_function_v2
91108: #define sqlite3_db_config sqlite3_api->db_config
91109: #define sqlite3_db_mutex sqlite3_api->db_mutex
91110: #define sqlite3_db_status sqlite3_api->db_status
91111: #define sqlite3_extended_errcode sqlite3_api->extended_errcode
91112: #define sqlite3_log sqlite3_api->log
91113: #define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
91114: #define sqlite3_sourceid sqlite3_api->sourceid
91115: #define sqlite3_stmt_status sqlite3_api->stmt_status
91116: #define sqlite3_strnicmp sqlite3_api->strnicmp
91117: #define sqlite3_unlock_notify sqlite3_api->unlock_notify
91118: #define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
91119: #define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
91120: #define sqlite3_wal_hook sqlite3_api->wal_hook
91121: #define sqlite3_blob_reopen sqlite3_api->blob_reopen
91122: #define sqlite3_vtab_config sqlite3_api->vtab_config
91123: #define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
91124: #endif /* SQLITE_CORE */
91125:
91126: #define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api = 0;
91127: #define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v;
91128:
91129: #endif /* _SQLITE3EXT_H_ */
91130:
91131: /************** End of sqlite3ext.h ******************************************/
91132: /************** Continuing where we left off in loadext.c ********************/
91133: /* #include <string.h> */
91134:
91135: #ifndef SQLITE_OMIT_LOAD_EXTENSION
91136:
91137: /*
91138: ** Some API routines are omitted when various features are
91139: ** excluded from a build of SQLite. Substitute a NULL pointer
91140: ** for any missing APIs.
91141: */
91142: #ifndef SQLITE_ENABLE_COLUMN_METADATA
91143: # define sqlite3_column_database_name 0
91144: # define sqlite3_column_database_name16 0
91145: # define sqlite3_column_table_name 0
91146: # define sqlite3_column_table_name16 0
91147: # define sqlite3_column_origin_name 0
91148: # define sqlite3_column_origin_name16 0
91149: # define sqlite3_table_column_metadata 0
91150: #endif
91151:
91152: #ifdef SQLITE_OMIT_AUTHORIZATION
91153: # define sqlite3_set_authorizer 0
91154: #endif
91155:
91156: #ifdef SQLITE_OMIT_UTF16
91157: # define sqlite3_bind_text16 0
91158: # define sqlite3_collation_needed16 0
91159: # define sqlite3_column_decltype16 0
91160: # define sqlite3_column_name16 0
91161: # define sqlite3_column_text16 0
91162: # define sqlite3_complete16 0
91163: # define sqlite3_create_collation16 0
91164: # define sqlite3_create_function16 0
91165: # define sqlite3_errmsg16 0
91166: # define sqlite3_open16 0
91167: # define sqlite3_prepare16 0
91168: # define sqlite3_prepare16_v2 0
91169: # define sqlite3_result_error16 0
91170: # define sqlite3_result_text16 0
91171: # define sqlite3_result_text16be 0
91172: # define sqlite3_result_text16le 0
91173: # define sqlite3_value_text16 0
91174: # define sqlite3_value_text16be 0
91175: # define sqlite3_value_text16le 0
91176: # define sqlite3_column_database_name16 0
91177: # define sqlite3_column_table_name16 0
91178: # define sqlite3_column_origin_name16 0
91179: #endif
91180:
91181: #ifdef SQLITE_OMIT_COMPLETE
91182: # define sqlite3_complete 0
91183: # define sqlite3_complete16 0
91184: #endif
91185:
91186: #ifdef SQLITE_OMIT_DECLTYPE
91187: # define sqlite3_column_decltype16 0
91188: # define sqlite3_column_decltype 0
91189: #endif
91190:
91191: #ifdef SQLITE_OMIT_PROGRESS_CALLBACK
91192: # define sqlite3_progress_handler 0
91193: #endif
91194:
91195: #ifdef SQLITE_OMIT_VIRTUALTABLE
91196: # define sqlite3_create_module 0
91197: # define sqlite3_create_module_v2 0
91198: # define sqlite3_declare_vtab 0
91199: # define sqlite3_vtab_config 0
91200: # define sqlite3_vtab_on_conflict 0
91201: #endif
91202:
91203: #ifdef SQLITE_OMIT_SHARED_CACHE
91204: # define sqlite3_enable_shared_cache 0
91205: #endif
91206:
91207: #ifdef SQLITE_OMIT_TRACE
91208: # define sqlite3_profile 0
91209: # define sqlite3_trace 0
91210: #endif
91211:
91212: #ifdef SQLITE_OMIT_GET_TABLE
91213: # define sqlite3_free_table 0
91214: # define sqlite3_get_table 0
91215: #endif
91216:
91217: #ifdef SQLITE_OMIT_INCRBLOB
91218: #define sqlite3_bind_zeroblob 0
91219: #define sqlite3_blob_bytes 0
91220: #define sqlite3_blob_close 0
91221: #define sqlite3_blob_open 0
91222: #define sqlite3_blob_read 0
91223: #define sqlite3_blob_write 0
91224: #define sqlite3_blob_reopen 0
91225: #endif
91226:
91227: /*
91228: ** The following structure contains pointers to all SQLite API routines.
91229: ** A pointer to this structure is passed into extensions when they are
91230: ** loaded so that the extension can make calls back into the SQLite
91231: ** library.
91232: **
91233: ** When adding new APIs, add them to the bottom of this structure
91234: ** in order to preserve backwards compatibility.
91235: **
91236: ** Extensions that use newer APIs should first call the
91237: ** sqlite3_libversion_number() to make sure that the API they
91238: ** intend to use is supported by the library. Extensions should
91239: ** also check to make sure that the pointer to the function is
91240: ** not NULL before calling it.
91241: */
91242: static const sqlite3_api_routines sqlite3Apis = {
91243: sqlite3_aggregate_context,
91244: #ifndef SQLITE_OMIT_DEPRECATED
91245: sqlite3_aggregate_count,
91246: #else
91247: 0,
91248: #endif
91249: sqlite3_bind_blob,
91250: sqlite3_bind_double,
91251: sqlite3_bind_int,
91252: sqlite3_bind_int64,
91253: sqlite3_bind_null,
91254: sqlite3_bind_parameter_count,
91255: sqlite3_bind_parameter_index,
91256: sqlite3_bind_parameter_name,
91257: sqlite3_bind_text,
91258: sqlite3_bind_text16,
91259: sqlite3_bind_value,
91260: sqlite3_busy_handler,
91261: sqlite3_busy_timeout,
91262: sqlite3_changes,
91263: sqlite3_close,
91264: sqlite3_collation_needed,
91265: sqlite3_collation_needed16,
91266: sqlite3_column_blob,
91267: sqlite3_column_bytes,
91268: sqlite3_column_bytes16,
91269: sqlite3_column_count,
91270: sqlite3_column_database_name,
91271: sqlite3_column_database_name16,
91272: sqlite3_column_decltype,
91273: sqlite3_column_decltype16,
91274: sqlite3_column_double,
91275: sqlite3_column_int,
91276: sqlite3_column_int64,
91277: sqlite3_column_name,
91278: sqlite3_column_name16,
91279: sqlite3_column_origin_name,
91280: sqlite3_column_origin_name16,
91281: sqlite3_column_table_name,
91282: sqlite3_column_table_name16,
91283: sqlite3_column_text,
91284: sqlite3_column_text16,
91285: sqlite3_column_type,
91286: sqlite3_column_value,
91287: sqlite3_commit_hook,
91288: sqlite3_complete,
91289: sqlite3_complete16,
91290: sqlite3_create_collation,
91291: sqlite3_create_collation16,
91292: sqlite3_create_function,
91293: sqlite3_create_function16,
91294: sqlite3_create_module,
91295: sqlite3_data_count,
91296: sqlite3_db_handle,
91297: sqlite3_declare_vtab,
91298: sqlite3_enable_shared_cache,
91299: sqlite3_errcode,
91300: sqlite3_errmsg,
91301: sqlite3_errmsg16,
91302: sqlite3_exec,
91303: #ifndef SQLITE_OMIT_DEPRECATED
91304: sqlite3_expired,
91305: #else
91306: 0,
91307: #endif
91308: sqlite3_finalize,
91309: sqlite3_free,
91310: sqlite3_free_table,
91311: sqlite3_get_autocommit,
91312: sqlite3_get_auxdata,
91313: sqlite3_get_table,
91314: 0, /* Was sqlite3_global_recover(), but that function is deprecated */
91315: sqlite3_interrupt,
91316: sqlite3_last_insert_rowid,
91317: sqlite3_libversion,
91318: sqlite3_libversion_number,
91319: sqlite3_malloc,
91320: sqlite3_mprintf,
91321: sqlite3_open,
91322: sqlite3_open16,
91323: sqlite3_prepare,
91324: sqlite3_prepare16,
91325: sqlite3_profile,
91326: sqlite3_progress_handler,
91327: sqlite3_realloc,
91328: sqlite3_reset,
91329: sqlite3_result_blob,
91330: sqlite3_result_double,
91331: sqlite3_result_error,
91332: sqlite3_result_error16,
91333: sqlite3_result_int,
91334: sqlite3_result_int64,
91335: sqlite3_result_null,
91336: sqlite3_result_text,
91337: sqlite3_result_text16,
91338: sqlite3_result_text16be,
91339: sqlite3_result_text16le,
91340: sqlite3_result_value,
91341: sqlite3_rollback_hook,
91342: sqlite3_set_authorizer,
91343: sqlite3_set_auxdata,
91344: sqlite3_snprintf,
91345: sqlite3_step,
91346: sqlite3_table_column_metadata,
91347: #ifndef SQLITE_OMIT_DEPRECATED
91348: sqlite3_thread_cleanup,
91349: #else
91350: 0,
91351: #endif
91352: sqlite3_total_changes,
91353: sqlite3_trace,
91354: #ifndef SQLITE_OMIT_DEPRECATED
91355: sqlite3_transfer_bindings,
91356: #else
91357: 0,
91358: #endif
91359: sqlite3_update_hook,
91360: sqlite3_user_data,
91361: sqlite3_value_blob,
91362: sqlite3_value_bytes,
91363: sqlite3_value_bytes16,
91364: sqlite3_value_double,
91365: sqlite3_value_int,
91366: sqlite3_value_int64,
91367: sqlite3_value_numeric_type,
91368: sqlite3_value_text,
91369: sqlite3_value_text16,
91370: sqlite3_value_text16be,
91371: sqlite3_value_text16le,
91372: sqlite3_value_type,
91373: sqlite3_vmprintf,
91374: /*
91375: ** The original API set ends here. All extensions can call any
91376: ** of the APIs above provided that the pointer is not NULL. But
91377: ** before calling APIs that follow, extension should check the
91378: ** sqlite3_libversion_number() to make sure they are dealing with
91379: ** a library that is new enough to support that API.
91380: *************************************************************************
91381: */
91382: sqlite3_overload_function,
91383:
91384: /*
91385: ** Added after 3.3.13
91386: */
91387: sqlite3_prepare_v2,
91388: sqlite3_prepare16_v2,
91389: sqlite3_clear_bindings,
91390:
91391: /*
91392: ** Added for 3.4.1
91393: */
91394: sqlite3_create_module_v2,
91395:
91396: /*
91397: ** Added for 3.5.0
91398: */
91399: sqlite3_bind_zeroblob,
91400: sqlite3_blob_bytes,
91401: sqlite3_blob_close,
91402: sqlite3_blob_open,
91403: sqlite3_blob_read,
91404: sqlite3_blob_write,
91405: sqlite3_create_collation_v2,
91406: sqlite3_file_control,
91407: sqlite3_memory_highwater,
91408: sqlite3_memory_used,
91409: #ifdef SQLITE_MUTEX_OMIT
91410: 0,
91411: 0,
91412: 0,
91413: 0,
91414: 0,
91415: #else
91416: sqlite3_mutex_alloc,
91417: sqlite3_mutex_enter,
91418: sqlite3_mutex_free,
91419: sqlite3_mutex_leave,
91420: sqlite3_mutex_try,
91421: #endif
91422: sqlite3_open_v2,
91423: sqlite3_release_memory,
91424: sqlite3_result_error_nomem,
91425: sqlite3_result_error_toobig,
91426: sqlite3_sleep,
91427: sqlite3_soft_heap_limit,
91428: sqlite3_vfs_find,
91429: sqlite3_vfs_register,
91430: sqlite3_vfs_unregister,
91431:
91432: /*
91433: ** Added for 3.5.8
91434: */
91435: sqlite3_threadsafe,
91436: sqlite3_result_zeroblob,
91437: sqlite3_result_error_code,
91438: sqlite3_test_control,
91439: sqlite3_randomness,
91440: sqlite3_context_db_handle,
91441:
91442: /*
91443: ** Added for 3.6.0
91444: */
91445: sqlite3_extended_result_codes,
91446: sqlite3_limit,
91447: sqlite3_next_stmt,
91448: sqlite3_sql,
91449: sqlite3_status,
91450:
91451: /*
91452: ** Added for 3.7.4
91453: */
91454: sqlite3_backup_finish,
91455: sqlite3_backup_init,
91456: sqlite3_backup_pagecount,
91457: sqlite3_backup_remaining,
91458: sqlite3_backup_step,
91459: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
91460: sqlite3_compileoption_get,
91461: sqlite3_compileoption_used,
91462: #else
91463: 0,
91464: 0,
91465: #endif
91466: sqlite3_create_function_v2,
91467: sqlite3_db_config,
91468: sqlite3_db_mutex,
91469: sqlite3_db_status,
91470: sqlite3_extended_errcode,
91471: sqlite3_log,
91472: sqlite3_soft_heap_limit64,
91473: sqlite3_sourceid,
91474: sqlite3_stmt_status,
91475: sqlite3_strnicmp,
91476: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
91477: sqlite3_unlock_notify,
91478: #else
91479: 0,
91480: #endif
91481: #ifndef SQLITE_OMIT_WAL
91482: sqlite3_wal_autocheckpoint,
91483: sqlite3_wal_checkpoint,
91484: sqlite3_wal_hook,
91485: #else
91486: 0,
91487: 0,
91488: 0,
91489: #endif
91490: sqlite3_blob_reopen,
91491: sqlite3_vtab_config,
91492: sqlite3_vtab_on_conflict,
91493: };
91494:
91495: /*
91496: ** Attempt to load an SQLite extension library contained in the file
91497: ** zFile. The entry point is zProc. zProc may be 0 in which case a
91498: ** default entry point name (sqlite3_extension_init) is used. Use
91499: ** of the default name is recommended.
91500: **
91501: ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong.
91502: **
91503: ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with
91504: ** error message text. The calling function should free this memory
91505: ** by calling sqlite3DbFree(db, ).
91506: */
91507: static int sqlite3LoadExtension(
91508: sqlite3 *db, /* Load the extension into this database connection */
91509: const char *zFile, /* Name of the shared library containing extension */
91510: const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */
91511: char **pzErrMsg /* Put error message here if not 0 */
91512: ){
91513: sqlite3_vfs *pVfs = db->pVfs;
91514: void *handle;
91515: int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
91516: char *zErrmsg = 0;
91517: void **aHandle;
91518: int nMsg = 300 + sqlite3Strlen30(zFile);
91519:
91520: if( pzErrMsg ) *pzErrMsg = 0;
91521:
91522: /* Ticket #1863. To avoid a creating security problems for older
91523: ** applications that relink against newer versions of SQLite, the
91524: ** ability to run load_extension is turned off by default. One
91525: ** must call sqlite3_enable_load_extension() to turn on extension
91526: ** loading. Otherwise you get the following error.
91527: */
91528: if( (db->flags & SQLITE_LoadExtension)==0 ){
91529: if( pzErrMsg ){
91530: *pzErrMsg = sqlite3_mprintf("not authorized");
91531: }
91532: return SQLITE_ERROR;
91533: }
91534:
91535: if( zProc==0 ){
91536: zProc = "sqlite3_extension_init";
91537: }
91538:
91539: handle = sqlite3OsDlOpen(pVfs, zFile);
91540: if( handle==0 ){
91541: if( pzErrMsg ){
91542: *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
91543: if( zErrmsg ){
91544: sqlite3_snprintf(nMsg, zErrmsg,
91545: "unable to open shared library [%s]", zFile);
91546: sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
91547: }
91548: }
91549: return SQLITE_ERROR;
91550: }
91551: xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
91552: sqlite3OsDlSym(pVfs, handle, zProc);
91553: if( xInit==0 ){
91554: if( pzErrMsg ){
91555: nMsg += sqlite3Strlen30(zProc);
91556: *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
91557: if( zErrmsg ){
91558: sqlite3_snprintf(nMsg, zErrmsg,
91559: "no entry point [%s] in shared library [%s]", zProc,zFile);
91560: sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
91561: }
91562: sqlite3OsDlClose(pVfs, handle);
91563: }
91564: return SQLITE_ERROR;
91565: }else if( xInit(db, &zErrmsg, &sqlite3Apis) ){
91566: if( pzErrMsg ){
91567: *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg);
91568: }
91569: sqlite3_free(zErrmsg);
91570: sqlite3OsDlClose(pVfs, handle);
91571: return SQLITE_ERROR;
91572: }
91573:
91574: /* Append the new shared library handle to the db->aExtension array. */
91575: aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
91576: if( aHandle==0 ){
91577: return SQLITE_NOMEM;
91578: }
91579: if( db->nExtension>0 ){
91580: memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
91581: }
91582: sqlite3DbFree(db, db->aExtension);
91583: db->aExtension = aHandle;
91584:
91585: db->aExtension[db->nExtension++] = handle;
91586: return SQLITE_OK;
91587: }
91588: SQLITE_API int sqlite3_load_extension(
91589: sqlite3 *db, /* Load the extension into this database connection */
91590: const char *zFile, /* Name of the shared library containing extension */
91591: const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */
91592: char **pzErrMsg /* Put error message here if not 0 */
91593: ){
91594: int rc;
91595: sqlite3_mutex_enter(db->mutex);
91596: rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
91597: rc = sqlite3ApiExit(db, rc);
91598: sqlite3_mutex_leave(db->mutex);
91599: return rc;
91600: }
91601:
91602: /*
91603: ** Call this routine when the database connection is closing in order
91604: ** to clean up loaded extensions
91605: */
91606: SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){
91607: int i;
91608: assert( sqlite3_mutex_held(db->mutex) );
91609: for(i=0; i<db->nExtension; i++){
91610: sqlite3OsDlClose(db->pVfs, db->aExtension[i]);
91611: }
91612: sqlite3DbFree(db, db->aExtension);
91613: }
91614:
91615: /*
91616: ** Enable or disable extension loading. Extension loading is disabled by
91617: ** default so as not to open security holes in older applications.
91618: */
91619: SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
91620: sqlite3_mutex_enter(db->mutex);
91621: if( onoff ){
91622: db->flags |= SQLITE_LoadExtension;
91623: }else{
91624: db->flags &= ~SQLITE_LoadExtension;
91625: }
91626: sqlite3_mutex_leave(db->mutex);
91627: return SQLITE_OK;
91628: }
91629:
91630: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
91631:
91632: /*
91633: ** The auto-extension code added regardless of whether or not extension
91634: ** loading is supported. We need a dummy sqlite3Apis pointer for that
91635: ** code if regular extension loading is not available. This is that
91636: ** dummy pointer.
91637: */
91638: #ifdef SQLITE_OMIT_LOAD_EXTENSION
91639: static const sqlite3_api_routines sqlite3Apis = { 0 };
91640: #endif
91641:
91642:
91643: /*
91644: ** The following object holds the list of automatically loaded
91645: ** extensions.
91646: **
91647: ** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER
91648: ** mutex must be held while accessing this list.
91649: */
91650: typedef struct sqlite3AutoExtList sqlite3AutoExtList;
91651: static SQLITE_WSD struct sqlite3AutoExtList {
91652: int nExt; /* Number of entries in aExt[] */
91653: void (**aExt)(void); /* Pointers to the extension init functions */
91654: } sqlite3Autoext = { 0, 0 };
91655:
91656: /* The "wsdAutoext" macro will resolve to the autoextension
91657: ** state vector. If writable static data is unsupported on the target,
91658: ** we have to locate the state vector at run-time. In the more common
91659: ** case where writable static data is supported, wsdStat can refer directly
91660: ** to the "sqlite3Autoext" state vector declared above.
91661: */
91662: #ifdef SQLITE_OMIT_WSD
91663: # define wsdAutoextInit \
91664: sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext)
91665: # define wsdAutoext x[0]
91666: #else
91667: # define wsdAutoextInit
91668: # define wsdAutoext sqlite3Autoext
91669: #endif
91670:
91671:
91672: /*
91673: ** Register a statically linked extension that is automatically
91674: ** loaded by every new database connection.
91675: */
91676: SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){
91677: int rc = SQLITE_OK;
91678: #ifndef SQLITE_OMIT_AUTOINIT
91679: rc = sqlite3_initialize();
91680: if( rc ){
91681: return rc;
91682: }else
91683: #endif
91684: {
91685: int i;
91686: #if SQLITE_THREADSAFE
91687: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
91688: #endif
91689: wsdAutoextInit;
91690: sqlite3_mutex_enter(mutex);
91691: for(i=0; i<wsdAutoext.nExt; i++){
91692: if( wsdAutoext.aExt[i]==xInit ) break;
91693: }
91694: if( i==wsdAutoext.nExt ){
91695: int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]);
91696: void (**aNew)(void);
91697: aNew = sqlite3_realloc(wsdAutoext.aExt, nByte);
91698: if( aNew==0 ){
91699: rc = SQLITE_NOMEM;
91700: }else{
91701: wsdAutoext.aExt = aNew;
91702: wsdAutoext.aExt[wsdAutoext.nExt] = xInit;
91703: wsdAutoext.nExt++;
91704: }
91705: }
91706: sqlite3_mutex_leave(mutex);
91707: assert( (rc&0xff)==rc );
91708: return rc;
91709: }
91710: }
91711:
91712: /*
91713: ** Reset the automatic extension loading mechanism.
91714: */
91715: SQLITE_API void sqlite3_reset_auto_extension(void){
91716: #ifndef SQLITE_OMIT_AUTOINIT
91717: if( sqlite3_initialize()==SQLITE_OK )
91718: #endif
91719: {
91720: #if SQLITE_THREADSAFE
91721: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
91722: #endif
91723: wsdAutoextInit;
91724: sqlite3_mutex_enter(mutex);
91725: sqlite3_free(wsdAutoext.aExt);
91726: wsdAutoext.aExt = 0;
91727: wsdAutoext.nExt = 0;
91728: sqlite3_mutex_leave(mutex);
91729: }
91730: }
91731:
91732: /*
91733: ** Load all automatic extensions.
91734: **
91735: ** If anything goes wrong, set an error in the database connection.
91736: */
91737: SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){
91738: int i;
91739: int go = 1;
91740: int rc;
91741: int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
91742:
91743: wsdAutoextInit;
91744: if( wsdAutoext.nExt==0 ){
91745: /* Common case: early out without every having to acquire a mutex */
91746: return;
91747: }
91748: for(i=0; go; i++){
91749: char *zErrmsg;
91750: #if SQLITE_THREADSAFE
91751: sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
91752: #endif
91753: sqlite3_mutex_enter(mutex);
91754: if( i>=wsdAutoext.nExt ){
91755: xInit = 0;
91756: go = 0;
91757: }else{
91758: xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
91759: wsdAutoext.aExt[i];
91760: }
91761: sqlite3_mutex_leave(mutex);
91762: zErrmsg = 0;
91763: if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){
91764: sqlite3Error(db, rc,
91765: "automatic extension loading failed: %s", zErrmsg);
91766: go = 0;
91767: }
91768: sqlite3_free(zErrmsg);
91769: }
91770: }
91771:
91772: /************** End of loadext.c *********************************************/
91773: /************** Begin file pragma.c ******************************************/
91774: /*
91775: ** 2003 April 6
91776: **
91777: ** The author disclaims copyright to this source code. In place of
91778: ** a legal notice, here is a blessing:
91779: **
91780: ** May you do good and not evil.
91781: ** May you find forgiveness for yourself and forgive others.
91782: ** May you share freely, never taking more than you give.
91783: **
91784: *************************************************************************
91785: ** This file contains code used to implement the PRAGMA command.
91786: */
91787:
91788: /*
91789: ** Interpret the given string as a safety level. Return 0 for OFF,
91790: ** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or
1.2.2.1 ! misho 91791: ** unrecognized string argument. The FULL option is disallowed
! 91792: ** if the omitFull parameter it 1.
1.2 misho 91793: **
91794: ** Note that the values returned are one less that the values that
91795: ** should be passed into sqlite3BtreeSetSafetyLevel(). The is done
91796: ** to support legacy SQL code. The safety level used to be boolean
91797: ** and older scripts may have used numbers 0 for OFF and 1 for ON.
91798: */
1.2.2.1 ! misho 91799: static u8 getSafetyLevel(const char *z, int omitFull, int dflt){
1.2 misho 91800: /* 123456789 123456789 */
91801: static const char zText[] = "onoffalseyestruefull";
91802: static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16};
91803: static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4};
91804: static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2};
91805: int i, n;
91806: if( sqlite3Isdigit(*z) ){
91807: return (u8)sqlite3Atoi(z);
91808: }
91809: n = sqlite3Strlen30(z);
1.2.2.1 ! misho 91810: for(i=0; i<ArraySize(iLength)-omitFull; i++){
1.2 misho 91811: if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){
91812: return iValue[i];
91813: }
91814: }
1.2.2.1 ! misho 91815: return dflt;
1.2 misho 91816: }
91817:
91818: /*
91819: ** Interpret the given string as a boolean value.
91820: */
1.2.2.1 ! misho 91821: SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z, int dflt){
! 91822: return getSafetyLevel(z,1,dflt)!=0;
1.2 misho 91823: }
91824:
91825: /* The sqlite3GetBoolean() function is used by other modules but the
91826: ** remainder of this file is specific to PRAGMA processing. So omit
91827: ** the rest of the file if PRAGMAs are omitted from the build.
91828: */
91829: #if !defined(SQLITE_OMIT_PRAGMA)
91830:
91831: /*
91832: ** Interpret the given string as a locking mode value.
91833: */
91834: static int getLockingMode(const char *z){
91835: if( z ){
91836: if( 0==sqlite3StrICmp(z, "exclusive") ) return PAGER_LOCKINGMODE_EXCLUSIVE;
91837: if( 0==sqlite3StrICmp(z, "normal") ) return PAGER_LOCKINGMODE_NORMAL;
91838: }
91839: return PAGER_LOCKINGMODE_QUERY;
91840: }
91841:
91842: #ifndef SQLITE_OMIT_AUTOVACUUM
91843: /*
91844: ** Interpret the given string as an auto-vacuum mode value.
91845: **
91846: ** The following strings, "none", "full" and "incremental" are
91847: ** acceptable, as are their numeric equivalents: 0, 1 and 2 respectively.
91848: */
91849: static int getAutoVacuum(const char *z){
91850: int i;
91851: if( 0==sqlite3StrICmp(z, "none") ) return BTREE_AUTOVACUUM_NONE;
91852: if( 0==sqlite3StrICmp(z, "full") ) return BTREE_AUTOVACUUM_FULL;
91853: if( 0==sqlite3StrICmp(z, "incremental") ) return BTREE_AUTOVACUUM_INCR;
91854: i = sqlite3Atoi(z);
91855: return (u8)((i>=0&&i<=2)?i:0);
91856: }
91857: #endif /* ifndef SQLITE_OMIT_AUTOVACUUM */
91858:
91859: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
91860: /*
91861: ** Interpret the given string as a temp db location. Return 1 for file
91862: ** backed temporary databases, 2 for the Red-Black tree in memory database
91863: ** and 0 to use the compile-time default.
91864: */
91865: static int getTempStore(const char *z){
91866: if( z[0]>='0' && z[0]<='2' ){
91867: return z[0] - '0';
91868: }else if( sqlite3StrICmp(z, "file")==0 ){
91869: return 1;
91870: }else if( sqlite3StrICmp(z, "memory")==0 ){
91871: return 2;
91872: }else{
91873: return 0;
91874: }
91875: }
91876: #endif /* SQLITE_PAGER_PRAGMAS */
91877:
91878: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
91879: /*
91880: ** Invalidate temp storage, either when the temp storage is changed
91881: ** from default, or when 'file' and the temp_store_directory has changed
91882: */
91883: static int invalidateTempStorage(Parse *pParse){
91884: sqlite3 *db = pParse->db;
91885: if( db->aDb[1].pBt!=0 ){
91886: if( !db->autoCommit || sqlite3BtreeIsInReadTrans(db->aDb[1].pBt) ){
91887: sqlite3ErrorMsg(pParse, "temporary storage cannot be changed "
91888: "from within a transaction");
91889: return SQLITE_ERROR;
91890: }
91891: sqlite3BtreeClose(db->aDb[1].pBt);
91892: db->aDb[1].pBt = 0;
1.2.2.1 ! misho 91893: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 91894: }
91895: return SQLITE_OK;
91896: }
91897: #endif /* SQLITE_PAGER_PRAGMAS */
91898:
91899: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
91900: /*
91901: ** If the TEMP database is open, close it and mark the database schema
91902: ** as needing reloading. This must be done when using the SQLITE_TEMP_STORE
91903: ** or DEFAULT_TEMP_STORE pragmas.
91904: */
91905: static int changeTempStorage(Parse *pParse, const char *zStorageType){
91906: int ts = getTempStore(zStorageType);
91907: sqlite3 *db = pParse->db;
91908: if( db->temp_store==ts ) return SQLITE_OK;
91909: if( invalidateTempStorage( pParse ) != SQLITE_OK ){
91910: return SQLITE_ERROR;
91911: }
91912: db->temp_store = (u8)ts;
91913: return SQLITE_OK;
91914: }
91915: #endif /* SQLITE_PAGER_PRAGMAS */
91916:
91917: /*
91918: ** Generate code to return a single integer value.
91919: */
91920: static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){
91921: Vdbe *v = sqlite3GetVdbe(pParse);
91922: int mem = ++pParse->nMem;
91923: i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value));
91924: if( pI64 ){
91925: memcpy(pI64, &value, sizeof(value));
91926: }
91927: sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64);
91928: sqlite3VdbeSetNumCols(v, 1);
91929: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC);
91930: sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1);
91931: }
91932:
91933: #ifndef SQLITE_OMIT_FLAG_PRAGMAS
91934: /*
91935: ** Check to see if zRight and zLeft refer to a pragma that queries
91936: ** or changes one of the flags in db->flags. Return 1 if so and 0 if not.
91937: ** Also, implement the pragma.
91938: */
91939: static int flagPragma(Parse *pParse, const char *zLeft, const char *zRight){
91940: static const struct sPragmaType {
91941: const char *zName; /* Name of the pragma */
91942: int mask; /* Mask for the db->flags value */
91943: } aPragma[] = {
91944: { "full_column_names", SQLITE_FullColNames },
91945: { "short_column_names", SQLITE_ShortColNames },
91946: { "count_changes", SQLITE_CountRows },
91947: { "empty_result_callbacks", SQLITE_NullCallback },
91948: { "legacy_file_format", SQLITE_LegacyFileFmt },
91949: { "fullfsync", SQLITE_FullFSync },
91950: { "checkpoint_fullfsync", SQLITE_CkptFullFSync },
91951: { "reverse_unordered_selects", SQLITE_ReverseOrder },
91952: #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
91953: { "automatic_index", SQLITE_AutoIndex },
91954: #endif
91955: #ifdef SQLITE_DEBUG
91956: { "sql_trace", SQLITE_SqlTrace },
91957: { "vdbe_listing", SQLITE_VdbeListing },
91958: { "vdbe_trace", SQLITE_VdbeTrace },
91959: #endif
91960: #ifndef SQLITE_OMIT_CHECK
91961: { "ignore_check_constraints", SQLITE_IgnoreChecks },
91962: #endif
91963: /* The following is VERY experimental */
91964: { "writable_schema", SQLITE_WriteSchema|SQLITE_RecoveryMode },
91965:
91966: /* TODO: Maybe it shouldn't be possible to change the ReadUncommitted
91967: ** flag if there are any active statements. */
91968: { "read_uncommitted", SQLITE_ReadUncommitted },
91969: { "recursive_triggers", SQLITE_RecTriggers },
91970:
91971: /* This flag may only be set if both foreign-key and trigger support
91972: ** are present in the build. */
91973: #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER)
91974: { "foreign_keys", SQLITE_ForeignKeys },
91975: #endif
91976: };
91977: int i;
91978: const struct sPragmaType *p;
91979: for(i=0, p=aPragma; i<ArraySize(aPragma); i++, p++){
91980: if( sqlite3StrICmp(zLeft, p->zName)==0 ){
91981: sqlite3 *db = pParse->db;
91982: Vdbe *v;
91983: v = sqlite3GetVdbe(pParse);
91984: assert( v!=0 ); /* Already allocated by sqlite3Pragma() */
91985: if( ALWAYS(v) ){
91986: if( zRight==0 ){
91987: returnSingleInt(pParse, p->zName, (db->flags & p->mask)!=0 );
91988: }else{
91989: int mask = p->mask; /* Mask of bits to set or clear. */
91990: if( db->autoCommit==0 ){
91991: /* Foreign key support may not be enabled or disabled while not
91992: ** in auto-commit mode. */
91993: mask &= ~(SQLITE_ForeignKeys);
91994: }
91995:
1.2.2.1 ! misho 91996: if( sqlite3GetBoolean(zRight, 0) ){
1.2 misho 91997: db->flags |= mask;
91998: }else{
91999: db->flags &= ~mask;
92000: }
92001:
92002: /* Many of the flag-pragmas modify the code generated by the SQL
92003: ** compiler (eg. count_changes). So add an opcode to expire all
92004: ** compiled SQL statements after modifying a pragma value.
92005: */
92006: sqlite3VdbeAddOp2(v, OP_Expire, 0, 0);
92007: }
92008: }
92009:
92010: return 1;
92011: }
92012: }
92013: return 0;
92014: }
92015: #endif /* SQLITE_OMIT_FLAG_PRAGMAS */
92016:
92017: /*
92018: ** Return a human-readable name for a constraint resolution action.
92019: */
92020: #ifndef SQLITE_OMIT_FOREIGN_KEY
92021: static const char *actionName(u8 action){
92022: const char *zName;
92023: switch( action ){
92024: case OE_SetNull: zName = "SET NULL"; break;
92025: case OE_SetDflt: zName = "SET DEFAULT"; break;
92026: case OE_Cascade: zName = "CASCADE"; break;
92027: case OE_Restrict: zName = "RESTRICT"; break;
92028: default: zName = "NO ACTION";
92029: assert( action==OE_None ); break;
92030: }
92031: return zName;
92032: }
92033: #endif
92034:
92035:
92036: /*
92037: ** Parameter eMode must be one of the PAGER_JOURNALMODE_XXX constants
92038: ** defined in pager.h. This function returns the associated lowercase
92039: ** journal-mode name.
92040: */
92041: SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){
92042: static char * const azModeName[] = {
92043: "delete", "persist", "off", "truncate", "memory"
92044: #ifndef SQLITE_OMIT_WAL
92045: , "wal"
92046: #endif
92047: };
92048: assert( PAGER_JOURNALMODE_DELETE==0 );
92049: assert( PAGER_JOURNALMODE_PERSIST==1 );
92050: assert( PAGER_JOURNALMODE_OFF==2 );
92051: assert( PAGER_JOURNALMODE_TRUNCATE==3 );
92052: assert( PAGER_JOURNALMODE_MEMORY==4 );
92053: assert( PAGER_JOURNALMODE_WAL==5 );
92054: assert( eMode>=0 && eMode<=ArraySize(azModeName) );
92055:
92056: if( eMode==ArraySize(azModeName) ) return 0;
92057: return azModeName[eMode];
92058: }
92059:
92060: /*
92061: ** Process a pragma statement.
92062: **
92063: ** Pragmas are of this form:
92064: **
92065: ** PRAGMA [database.]id [= value]
92066: **
92067: ** The identifier might also be a string. The value is a string, and
92068: ** identifier, or a number. If minusFlag is true, then the value is
92069: ** a number that was preceded by a minus sign.
92070: **
92071: ** If the left side is "database.id" then pId1 is the database name
92072: ** and pId2 is the id. If the left side is just "id" then pId1 is the
92073: ** id and pId2 is any empty string.
92074: */
92075: SQLITE_PRIVATE void sqlite3Pragma(
92076: Parse *pParse,
92077: Token *pId1, /* First part of [database.]id field */
92078: Token *pId2, /* Second part of [database.]id field, or NULL */
92079: Token *pValue, /* Token for <value>, or NULL */
92080: int minusFlag /* True if a '-' sign preceded <value> */
92081: ){
92082: char *zLeft = 0; /* Nul-terminated UTF-8 string <id> */
92083: char *zRight = 0; /* Nul-terminated UTF-8 string <value>, or NULL */
92084: const char *zDb = 0; /* The database name */
92085: Token *pId; /* Pointer to <id> token */
92086: int iDb; /* Database index for <database> */
1.2.2.1 ! misho 92087: char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */
! 92088: int rc; /* return value form SQLITE_FCNTL_PRAGMA */
! 92089: sqlite3 *db = pParse->db; /* The database connection */
! 92090: Db *pDb; /* The specific database being pragmaed */
! 92091: Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); /* Prepared statement */
! 92092:
1.2 misho 92093: if( v==0 ) return;
92094: sqlite3VdbeRunOnlyOnce(v);
92095: pParse->nMem = 2;
92096:
92097: /* Interpret the [database.] part of the pragma statement. iDb is the
92098: ** index of the database this pragma is being applied to in db.aDb[]. */
92099: iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId);
92100: if( iDb<0 ) return;
92101: pDb = &db->aDb[iDb];
92102:
92103: /* If the temp database has been explicitly named as part of the
92104: ** pragma, make sure it is open.
92105: */
92106: if( iDb==1 && sqlite3OpenTempDatabase(pParse) ){
92107: return;
92108: }
92109:
92110: zLeft = sqlite3NameFromToken(db, pId);
92111: if( !zLeft ) return;
92112: if( minusFlag ){
92113: zRight = sqlite3MPrintf(db, "-%T", pValue);
92114: }else{
92115: zRight = sqlite3NameFromToken(db, pValue);
92116: }
92117:
92118: assert( pId2 );
92119: zDb = pId2->n>0 ? pDb->zName : 0;
92120: if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){
92121: goto pragma_out;
92122: }
1.2.2.1 ! misho 92123:
! 92124: /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS
! 92125: ** connection. If it returns SQLITE_OK, then assume that the VFS
! 92126: ** handled the pragma and generate a no-op prepared statement.
! 92127: */
! 92128: aFcntl[0] = 0;
! 92129: aFcntl[1] = zLeft;
! 92130: aFcntl[2] = zRight;
! 92131: aFcntl[3] = 0;
! 92132: db->busyHandler.nBusy = 0;
! 92133: rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl);
! 92134: if( rc==SQLITE_OK ){
! 92135: if( aFcntl[0] ){
! 92136: int mem = ++pParse->nMem;
! 92137: sqlite3VdbeAddOp4(v, OP_String8, 0, mem, 0, aFcntl[0], 0);
! 92138: sqlite3VdbeSetNumCols(v, 1);
! 92139: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "result", SQLITE_STATIC);
! 92140: sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1);
! 92141: sqlite3_free(aFcntl[0]);
! 92142: }
! 92143: }else if( rc!=SQLITE_NOTFOUND ){
! 92144: if( aFcntl[0] ){
! 92145: sqlite3ErrorMsg(pParse, "%s", aFcntl[0]);
! 92146: sqlite3_free(aFcntl[0]);
! 92147: }
! 92148: pParse->nErr++;
! 92149: pParse->rc = rc;
! 92150: }else
! 92151:
1.2 misho 92152:
92153: #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
92154: /*
92155: ** PRAGMA [database.]default_cache_size
92156: ** PRAGMA [database.]default_cache_size=N
92157: **
92158: ** The first form reports the current persistent setting for the
92159: ** page cache size. The value returned is the maximum number of
92160: ** pages in the page cache. The second form sets both the current
92161: ** page cache size value and the persistent page cache size value
92162: ** stored in the database file.
92163: **
92164: ** Older versions of SQLite would set the default cache size to a
92165: ** negative number to indicate synchronous=OFF. These days, synchronous
92166: ** is always on by default regardless of the sign of the default cache
92167: ** size. But continue to take the absolute value of the default cache
92168: ** size of historical compatibility.
92169: */
92170: if( sqlite3StrICmp(zLeft,"default_cache_size")==0 ){
92171: static const VdbeOpList getCacheSize[] = {
92172: { OP_Transaction, 0, 0, 0}, /* 0 */
92173: { OP_ReadCookie, 0, 1, BTREE_DEFAULT_CACHE_SIZE}, /* 1 */
92174: { OP_IfPos, 1, 7, 0},
92175: { OP_Integer, 0, 2, 0},
92176: { OP_Subtract, 1, 2, 1},
92177: { OP_IfPos, 1, 7, 0},
92178: { OP_Integer, 0, 1, 0}, /* 6 */
92179: { OP_ResultRow, 1, 1, 0},
92180: };
92181: int addr;
92182: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92183: sqlite3VdbeUsesBtree(v, iDb);
92184: if( !zRight ){
92185: sqlite3VdbeSetNumCols(v, 1);
92186: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC);
92187: pParse->nMem += 2;
92188: addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize);
92189: sqlite3VdbeChangeP1(v, addr, iDb);
92190: sqlite3VdbeChangeP1(v, addr+1, iDb);
92191: sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE);
92192: }else{
92193: int size = sqlite3AbsInt32(sqlite3Atoi(zRight));
92194: sqlite3BeginWriteOperation(pParse, 0, iDb);
92195: sqlite3VdbeAddOp2(v, OP_Integer, size, 1);
92196: sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1);
92197: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
92198: pDb->pSchema->cache_size = size;
92199: sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
92200: }
92201: }else
92202: #endif /* !SQLITE_OMIT_PAGER_PRAGMAS && !SQLITE_OMIT_DEPRECATED */
92203:
92204: #if !defined(SQLITE_OMIT_PAGER_PRAGMAS)
92205: /*
92206: ** PRAGMA [database.]page_size
92207: ** PRAGMA [database.]page_size=N
92208: **
92209: ** The first form reports the current setting for the
92210: ** database page size in bytes. The second form sets the
92211: ** database page size value. The value can only be set if
92212: ** the database has not yet been created.
92213: */
92214: if( sqlite3StrICmp(zLeft,"page_size")==0 ){
92215: Btree *pBt = pDb->pBt;
92216: assert( pBt!=0 );
92217: if( !zRight ){
92218: int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0;
92219: returnSingleInt(pParse, "page_size", size);
92220: }else{
92221: /* Malloc may fail when setting the page-size, as there is an internal
92222: ** buffer that the pager module resizes using sqlite3_realloc().
92223: */
92224: db->nextPagesize = sqlite3Atoi(zRight);
92225: if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,-1,0) ){
92226: db->mallocFailed = 1;
92227: }
92228: }
92229: }else
92230:
92231: /*
92232: ** PRAGMA [database.]secure_delete
92233: ** PRAGMA [database.]secure_delete=ON/OFF
92234: **
92235: ** The first form reports the current setting for the
92236: ** secure_delete flag. The second form changes the secure_delete
92237: ** flag setting and reports thenew value.
92238: */
92239: if( sqlite3StrICmp(zLeft,"secure_delete")==0 ){
92240: Btree *pBt = pDb->pBt;
92241: int b = -1;
92242: assert( pBt!=0 );
92243: if( zRight ){
1.2.2.1 ! misho 92244: b = sqlite3GetBoolean(zRight, 0);
1.2 misho 92245: }
92246: if( pId2->n==0 && b>=0 ){
92247: int ii;
92248: for(ii=0; ii<db->nDb; ii++){
92249: sqlite3BtreeSecureDelete(db->aDb[ii].pBt, b);
92250: }
92251: }
92252: b = sqlite3BtreeSecureDelete(pBt, b);
92253: returnSingleInt(pParse, "secure_delete", b);
92254: }else
92255:
92256: /*
92257: ** PRAGMA [database.]max_page_count
92258: ** PRAGMA [database.]max_page_count=N
92259: **
92260: ** The first form reports the current setting for the
92261: ** maximum number of pages in the database file. The
92262: ** second form attempts to change this setting. Both
92263: ** forms return the current setting.
92264: **
92265: ** The absolute value of N is used. This is undocumented and might
92266: ** change. The only purpose is to provide an easy way to test
92267: ** the sqlite3AbsInt32() function.
92268: **
92269: ** PRAGMA [database.]page_count
92270: **
92271: ** Return the number of pages in the specified database.
92272: */
92273: if( sqlite3StrICmp(zLeft,"page_count")==0
92274: || sqlite3StrICmp(zLeft,"max_page_count")==0
92275: ){
92276: int iReg;
92277: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92278: sqlite3CodeVerifySchema(pParse, iDb);
92279: iReg = ++pParse->nMem;
92280: if( sqlite3Tolower(zLeft[0])=='p' ){
92281: sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg);
92282: }else{
92283: sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg,
92284: sqlite3AbsInt32(sqlite3Atoi(zRight)));
92285: }
92286: sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1);
92287: sqlite3VdbeSetNumCols(v, 1);
92288: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT);
92289: }else
92290:
92291: /*
92292: ** PRAGMA [database.]locking_mode
92293: ** PRAGMA [database.]locking_mode = (normal|exclusive)
92294: */
92295: if( sqlite3StrICmp(zLeft,"locking_mode")==0 ){
92296: const char *zRet = "normal";
92297: int eMode = getLockingMode(zRight);
92298:
92299: if( pId2->n==0 && eMode==PAGER_LOCKINGMODE_QUERY ){
92300: /* Simple "PRAGMA locking_mode;" statement. This is a query for
92301: ** the current default locking mode (which may be different to
92302: ** the locking-mode of the main database).
92303: */
92304: eMode = db->dfltLockMode;
92305: }else{
92306: Pager *pPager;
92307: if( pId2->n==0 ){
92308: /* This indicates that no database name was specified as part
92309: ** of the PRAGMA command. In this case the locking-mode must be
92310: ** set on all attached databases, as well as the main db file.
92311: **
92312: ** Also, the sqlite3.dfltLockMode variable is set so that
92313: ** any subsequently attached databases also use the specified
92314: ** locking mode.
92315: */
92316: int ii;
92317: assert(pDb==&db->aDb[0]);
92318: for(ii=2; ii<db->nDb; ii++){
92319: pPager = sqlite3BtreePager(db->aDb[ii].pBt);
92320: sqlite3PagerLockingMode(pPager, eMode);
92321: }
92322: db->dfltLockMode = (u8)eMode;
92323: }
92324: pPager = sqlite3BtreePager(pDb->pBt);
92325: eMode = sqlite3PagerLockingMode(pPager, eMode);
92326: }
92327:
92328: assert(eMode==PAGER_LOCKINGMODE_NORMAL||eMode==PAGER_LOCKINGMODE_EXCLUSIVE);
92329: if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){
92330: zRet = "exclusive";
92331: }
92332: sqlite3VdbeSetNumCols(v, 1);
92333: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC);
92334: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0);
92335: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
92336: }else
92337:
92338: /*
92339: ** PRAGMA [database.]journal_mode
92340: ** PRAGMA [database.]journal_mode =
92341: ** (delete|persist|off|truncate|memory|wal|off)
92342: */
92343: if( sqlite3StrICmp(zLeft,"journal_mode")==0 ){
92344: int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */
92345: int ii; /* Loop counter */
92346:
92347: /* Force the schema to be loaded on all databases. This causes all
92348: ** database files to be opened and the journal_modes set. This is
92349: ** necessary because subsequent processing must know if the databases
92350: ** are in WAL mode. */
92351: if( sqlite3ReadSchema(pParse) ){
92352: goto pragma_out;
92353: }
92354:
92355: sqlite3VdbeSetNumCols(v, 1);
92356: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC);
92357:
92358: if( zRight==0 ){
92359: /* If there is no "=MODE" part of the pragma, do a query for the
92360: ** current mode */
92361: eMode = PAGER_JOURNALMODE_QUERY;
92362: }else{
92363: const char *zMode;
92364: int n = sqlite3Strlen30(zRight);
92365: for(eMode=0; (zMode = sqlite3JournalModename(eMode))!=0; eMode++){
92366: if( sqlite3StrNICmp(zRight, zMode, n)==0 ) break;
92367: }
92368: if( !zMode ){
92369: /* If the "=MODE" part does not match any known journal mode,
92370: ** then do a query */
92371: eMode = PAGER_JOURNALMODE_QUERY;
92372: }
92373: }
92374: if( eMode==PAGER_JOURNALMODE_QUERY && pId2->n==0 ){
92375: /* Convert "PRAGMA journal_mode" into "PRAGMA main.journal_mode" */
92376: iDb = 0;
92377: pId2->n = 1;
92378: }
92379: for(ii=db->nDb-1; ii>=0; ii--){
92380: if( db->aDb[ii].pBt && (ii==iDb || pId2->n==0) ){
92381: sqlite3VdbeUsesBtree(v, ii);
92382: sqlite3VdbeAddOp3(v, OP_JournalMode, ii, 1, eMode);
92383: }
92384: }
92385: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
92386: }else
92387:
92388: /*
92389: ** PRAGMA [database.]journal_size_limit
92390: ** PRAGMA [database.]journal_size_limit=N
92391: **
92392: ** Get or set the size limit on rollback journal files.
92393: */
92394: if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){
92395: Pager *pPager = sqlite3BtreePager(pDb->pBt);
92396: i64 iLimit = -2;
92397: if( zRight ){
92398: sqlite3Atoi64(zRight, &iLimit, 1000000, SQLITE_UTF8);
92399: if( iLimit<-1 ) iLimit = -1;
92400: }
92401: iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit);
92402: returnSingleInt(pParse, "journal_size_limit", iLimit);
92403: }else
92404:
92405: #endif /* SQLITE_OMIT_PAGER_PRAGMAS */
92406:
92407: /*
92408: ** PRAGMA [database.]auto_vacuum
92409: ** PRAGMA [database.]auto_vacuum=N
92410: **
92411: ** Get or set the value of the database 'auto-vacuum' parameter.
92412: ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL
92413: */
92414: #ifndef SQLITE_OMIT_AUTOVACUUM
92415: if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){
92416: Btree *pBt = pDb->pBt;
92417: assert( pBt!=0 );
92418: if( sqlite3ReadSchema(pParse) ){
92419: goto pragma_out;
92420: }
92421: if( !zRight ){
92422: int auto_vacuum;
92423: if( ALWAYS(pBt) ){
92424: auto_vacuum = sqlite3BtreeGetAutoVacuum(pBt);
92425: }else{
92426: auto_vacuum = SQLITE_DEFAULT_AUTOVACUUM;
92427: }
92428: returnSingleInt(pParse, "auto_vacuum", auto_vacuum);
92429: }else{
92430: int eAuto = getAutoVacuum(zRight);
92431: assert( eAuto>=0 && eAuto<=2 );
92432: db->nextAutovac = (u8)eAuto;
92433: if( ALWAYS(eAuto>=0) ){
92434: /* Call SetAutoVacuum() to set initialize the internal auto and
92435: ** incr-vacuum flags. This is required in case this connection
92436: ** creates the database file. It is important that it is created
92437: ** as an auto-vacuum capable db.
92438: */
1.2.2.1 ! misho 92439: rc = sqlite3BtreeSetAutoVacuum(pBt, eAuto);
1.2 misho 92440: if( rc==SQLITE_OK && (eAuto==1 || eAuto==2) ){
92441: /* When setting the auto_vacuum mode to either "full" or
92442: ** "incremental", write the value of meta[6] in the database
92443: ** file. Before writing to meta[6], check that meta[3] indicates
92444: ** that this really is an auto-vacuum capable database.
92445: */
92446: static const VdbeOpList setMeta6[] = {
92447: { OP_Transaction, 0, 1, 0}, /* 0 */
92448: { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE},
92449: { OP_If, 1, 0, 0}, /* 2 */
92450: { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */
92451: { OP_Integer, 0, 1, 0}, /* 4 */
92452: { OP_SetCookie, 0, BTREE_INCR_VACUUM, 1}, /* 5 */
92453: };
92454: int iAddr;
92455: iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6);
92456: sqlite3VdbeChangeP1(v, iAddr, iDb);
92457: sqlite3VdbeChangeP1(v, iAddr+1, iDb);
92458: sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4);
92459: sqlite3VdbeChangeP1(v, iAddr+4, eAuto-1);
92460: sqlite3VdbeChangeP1(v, iAddr+5, iDb);
92461: sqlite3VdbeUsesBtree(v, iDb);
92462: }
92463: }
92464: }
92465: }else
92466: #endif
92467:
92468: /*
92469: ** PRAGMA [database.]incremental_vacuum(N)
92470: **
92471: ** Do N steps of incremental vacuuming on a database.
92472: */
92473: #ifndef SQLITE_OMIT_AUTOVACUUM
92474: if( sqlite3StrICmp(zLeft,"incremental_vacuum")==0 ){
92475: int iLimit, addr;
92476: if( sqlite3ReadSchema(pParse) ){
92477: goto pragma_out;
92478: }
92479: if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){
92480: iLimit = 0x7fffffff;
92481: }
92482: sqlite3BeginWriteOperation(pParse, 0, iDb);
92483: sqlite3VdbeAddOp2(v, OP_Integer, iLimit, 1);
92484: addr = sqlite3VdbeAddOp1(v, OP_IncrVacuum, iDb);
92485: sqlite3VdbeAddOp1(v, OP_ResultRow, 1);
92486: sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1);
92487: sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr);
92488: sqlite3VdbeJumpHere(v, addr);
92489: }else
92490: #endif
92491:
92492: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
92493: /*
92494: ** PRAGMA [database.]cache_size
92495: ** PRAGMA [database.]cache_size=N
92496: **
92497: ** The first form reports the current local setting for the
92498: ** page cache size. The second form sets the local
92499: ** page cache size value. If N is positive then that is the
92500: ** number of pages in the cache. If N is negative, then the
92501: ** number of pages is adjusted so that the cache uses -N kibibytes
92502: ** of memory.
92503: */
92504: if( sqlite3StrICmp(zLeft,"cache_size")==0 ){
92505: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92506: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
92507: if( !zRight ){
92508: returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size);
92509: }else{
92510: int size = sqlite3Atoi(zRight);
92511: pDb->pSchema->cache_size = size;
92512: sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
92513: }
92514: }else
92515:
92516: /*
92517: ** PRAGMA temp_store
92518: ** PRAGMA temp_store = "default"|"memory"|"file"
92519: **
92520: ** Return or set the local value of the temp_store flag. Changing
92521: ** the local value does not make changes to the disk file and the default
92522: ** value will be restored the next time the database is opened.
92523: **
92524: ** Note that it is possible for the library compile-time options to
92525: ** override this setting
92526: */
92527: if( sqlite3StrICmp(zLeft, "temp_store")==0 ){
92528: if( !zRight ){
92529: returnSingleInt(pParse, "temp_store", db->temp_store);
92530: }else{
92531: changeTempStorage(pParse, zRight);
92532: }
92533: }else
92534:
92535: /*
92536: ** PRAGMA temp_store_directory
92537: ** PRAGMA temp_store_directory = ""|"directory_name"
92538: **
92539: ** Return or set the local value of the temp_store_directory flag. Changing
92540: ** the value sets a specific directory to be used for temporary files.
92541: ** Setting to a null string reverts to the default temporary directory search.
92542: ** If temporary directory is changed, then invalidateTempStorage.
92543: **
92544: */
92545: if( sqlite3StrICmp(zLeft, "temp_store_directory")==0 ){
92546: if( !zRight ){
92547: if( sqlite3_temp_directory ){
92548: sqlite3VdbeSetNumCols(v, 1);
92549: sqlite3VdbeSetColName(v, 0, COLNAME_NAME,
92550: "temp_store_directory", SQLITE_STATIC);
92551: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0);
92552: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
92553: }
92554: }else{
92555: #ifndef SQLITE_OMIT_WSD
92556: if( zRight[0] ){
92557: int res;
92558: rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
92559: if( rc!=SQLITE_OK || res==0 ){
92560: sqlite3ErrorMsg(pParse, "not a writable directory");
92561: goto pragma_out;
92562: }
92563: }
92564: if( SQLITE_TEMP_STORE==0
92565: || (SQLITE_TEMP_STORE==1 && db->temp_store<=1)
92566: || (SQLITE_TEMP_STORE==2 && db->temp_store==1)
92567: ){
92568: invalidateTempStorage(pParse);
92569: }
92570: sqlite3_free(sqlite3_temp_directory);
92571: if( zRight[0] ){
92572: sqlite3_temp_directory = sqlite3_mprintf("%s", zRight);
92573: }else{
92574: sqlite3_temp_directory = 0;
92575: }
92576: #endif /* SQLITE_OMIT_WSD */
92577: }
92578: }else
92579:
1.2.2.1 ! misho 92580: #if SQLITE_OS_WIN
! 92581: /*
! 92582: ** PRAGMA data_store_directory
! 92583: ** PRAGMA data_store_directory = ""|"directory_name"
! 92584: **
! 92585: ** Return or set the local value of the data_store_directory flag. Changing
! 92586: ** the value sets a specific directory to be used for database files that
! 92587: ** were specified with a relative pathname. Setting to a null string reverts
! 92588: ** to the default database directory, which for database files specified with
! 92589: ** a relative path will probably be based on the current directory for the
! 92590: ** process. Database file specified with an absolute path are not impacted
! 92591: ** by this setting, regardless of its value.
! 92592: **
! 92593: */
! 92594: if( sqlite3StrICmp(zLeft, "data_store_directory")==0 ){
! 92595: if( !zRight ){
! 92596: if( sqlite3_data_directory ){
! 92597: sqlite3VdbeSetNumCols(v, 1);
! 92598: sqlite3VdbeSetColName(v, 0, COLNAME_NAME,
! 92599: "data_store_directory", SQLITE_STATIC);
! 92600: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_data_directory, 0);
! 92601: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
! 92602: }
! 92603: }else{
! 92604: #ifndef SQLITE_OMIT_WSD
! 92605: if( zRight[0] ){
! 92606: int res;
! 92607: rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
! 92608: if( rc!=SQLITE_OK || res==0 ){
! 92609: sqlite3ErrorMsg(pParse, "not a writable directory");
! 92610: goto pragma_out;
! 92611: }
! 92612: }
! 92613: sqlite3_free(sqlite3_data_directory);
! 92614: if( zRight[0] ){
! 92615: sqlite3_data_directory = sqlite3_mprintf("%s", zRight);
! 92616: }else{
! 92617: sqlite3_data_directory = 0;
! 92618: }
! 92619: #endif /* SQLITE_OMIT_WSD */
! 92620: }
! 92621: }else
! 92622: #endif
! 92623:
1.2 misho 92624: #if !defined(SQLITE_ENABLE_LOCKING_STYLE)
92625: # if defined(__APPLE__)
92626: # define SQLITE_ENABLE_LOCKING_STYLE 1
92627: # else
92628: # define SQLITE_ENABLE_LOCKING_STYLE 0
92629: # endif
92630: #endif
92631: #if SQLITE_ENABLE_LOCKING_STYLE
92632: /*
92633: ** PRAGMA [database.]lock_proxy_file
92634: ** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path"
92635: **
92636: ** Return or set the value of the lock_proxy_file flag. Changing
92637: ** the value sets a specific file to be used for database access locks.
92638: **
92639: */
92640: if( sqlite3StrICmp(zLeft, "lock_proxy_file")==0 ){
92641: if( !zRight ){
92642: Pager *pPager = sqlite3BtreePager(pDb->pBt);
92643: char *proxy_file_path = NULL;
92644: sqlite3_file *pFile = sqlite3PagerFile(pPager);
92645: sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE,
92646: &proxy_file_path);
92647:
92648: if( proxy_file_path ){
92649: sqlite3VdbeSetNumCols(v, 1);
92650: sqlite3VdbeSetColName(v, 0, COLNAME_NAME,
92651: "lock_proxy_file", SQLITE_STATIC);
92652: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0);
92653: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
92654: }
92655: }else{
92656: Pager *pPager = sqlite3BtreePager(pDb->pBt);
92657: sqlite3_file *pFile = sqlite3PagerFile(pPager);
92658: int res;
92659: if( zRight[0] ){
92660: res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,
92661: zRight);
92662: } else {
92663: res=sqlite3OsFileControl(pFile, SQLITE_SET_LOCKPROXYFILE,
92664: NULL);
92665: }
92666: if( res!=SQLITE_OK ){
92667: sqlite3ErrorMsg(pParse, "failed to set lock proxy file");
92668: goto pragma_out;
92669: }
92670: }
92671: }else
92672: #endif /* SQLITE_ENABLE_LOCKING_STYLE */
92673:
92674: /*
92675: ** PRAGMA [database.]synchronous
92676: ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL
92677: **
92678: ** Return or set the local value of the synchronous flag. Changing
92679: ** the local value does not make changes to the disk file and the
92680: ** default value will be restored the next time the database is
92681: ** opened.
92682: */
92683: if( sqlite3StrICmp(zLeft,"synchronous")==0 ){
92684: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92685: if( !zRight ){
92686: returnSingleInt(pParse, "synchronous", pDb->safety_level-1);
92687: }else{
92688: if( !db->autoCommit ){
92689: sqlite3ErrorMsg(pParse,
92690: "Safety level may not be changed inside a transaction");
92691: }else{
1.2.2.1 ! misho 92692: pDb->safety_level = getSafetyLevel(zRight,0,1)+1;
1.2 misho 92693: }
92694: }
92695: }else
92696: #endif /* SQLITE_OMIT_PAGER_PRAGMAS */
92697:
92698: #ifndef SQLITE_OMIT_FLAG_PRAGMAS
92699: if( flagPragma(pParse, zLeft, zRight) ){
92700: /* The flagPragma() subroutine also generates any necessary code
92701: ** there is nothing more to do here */
92702: }else
92703: #endif /* SQLITE_OMIT_FLAG_PRAGMAS */
92704:
92705: #ifndef SQLITE_OMIT_SCHEMA_PRAGMAS
92706: /*
92707: ** PRAGMA table_info(<table>)
92708: **
92709: ** Return a single row for each column of the named table. The columns of
92710: ** the returned data set are:
92711: **
92712: ** cid: Column id (numbered from left to right, starting at 0)
92713: ** name: Column name
92714: ** type: Column declaration type.
92715: ** notnull: True if 'NOT NULL' is part of column declaration
92716: ** dflt_value: The default value for the column, if any.
92717: */
92718: if( sqlite3StrICmp(zLeft, "table_info")==0 && zRight ){
92719: Table *pTab;
92720: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92721: pTab = sqlite3FindTable(db, zRight, zDb);
92722: if( pTab ){
92723: int i;
92724: int nHidden = 0;
92725: Column *pCol;
92726: sqlite3VdbeSetNumCols(v, 6);
92727: pParse->nMem = 6;
92728: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC);
92729: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
92730: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC);
92731: sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC);
92732: sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC);
92733: sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC);
92734: sqlite3ViewGetColumnNames(pParse, pTab);
92735: for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
92736: if( IsHiddenColumn(pCol) ){
92737: nHidden++;
92738: continue;
92739: }
92740: sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1);
92741: sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0);
92742: sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
92743: pCol->zType ? pCol->zType : "", 0);
92744: sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4);
92745: if( pCol->zDflt ){
92746: sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pCol->zDflt, 0);
92747: }else{
92748: sqlite3VdbeAddOp2(v, OP_Null, 0, 5);
92749: }
1.2.2.1 ! misho 92750: sqlite3VdbeAddOp2(v, OP_Integer,
! 92751: (pCol->colFlags&COLFLAG_PRIMKEY)!=0, 6);
1.2 misho 92752: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6);
92753: }
92754: }
92755: }else
92756:
92757: if( sqlite3StrICmp(zLeft, "index_info")==0 && zRight ){
92758: Index *pIdx;
92759: Table *pTab;
92760: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92761: pIdx = sqlite3FindIndex(db, zRight, zDb);
92762: if( pIdx ){
92763: int i;
92764: pTab = pIdx->pTable;
92765: sqlite3VdbeSetNumCols(v, 3);
92766: pParse->nMem = 3;
92767: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC);
92768: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC);
92769: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC);
92770: for(i=0; i<pIdx->nColumn; i++){
92771: int cnum = pIdx->aiColumn[i];
92772: sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
92773: sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2);
92774: assert( pTab->nCol>cnum );
92775: sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0);
92776: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
92777: }
92778: }
92779: }else
92780:
92781: if( sqlite3StrICmp(zLeft, "index_list")==0 && zRight ){
92782: Index *pIdx;
92783: Table *pTab;
92784: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92785: pTab = sqlite3FindTable(db, zRight, zDb);
92786: if( pTab ){
92787: v = sqlite3GetVdbe(pParse);
92788: pIdx = pTab->pIndex;
92789: if( pIdx ){
92790: int i = 0;
92791: sqlite3VdbeSetNumCols(v, 3);
92792: pParse->nMem = 3;
92793: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
92794: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
92795: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC);
92796: while(pIdx){
92797: sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
92798: sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0);
92799: sqlite3VdbeAddOp2(v, OP_Integer, pIdx->onError!=OE_None, 3);
92800: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
92801: ++i;
92802: pIdx = pIdx->pNext;
92803: }
92804: }
92805: }
92806: }else
92807:
92808: if( sqlite3StrICmp(zLeft, "database_list")==0 ){
92809: int i;
92810: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92811: sqlite3VdbeSetNumCols(v, 3);
92812: pParse->nMem = 3;
92813: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
92814: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
92815: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC);
92816: for(i=0; i<db->nDb; i++){
92817: if( db->aDb[i].pBt==0 ) continue;
92818: assert( db->aDb[i].zName!=0 );
92819: sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
92820: sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0);
92821: sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
92822: sqlite3BtreeGetFilename(db->aDb[i].pBt), 0);
92823: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
92824: }
92825: }else
92826:
92827: if( sqlite3StrICmp(zLeft, "collation_list")==0 ){
92828: int i = 0;
92829: HashElem *p;
92830: sqlite3VdbeSetNumCols(v, 2);
92831: pParse->nMem = 2;
92832: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC);
92833: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC);
92834: for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){
92835: CollSeq *pColl = (CollSeq *)sqliteHashData(p);
92836: sqlite3VdbeAddOp2(v, OP_Integer, i++, 1);
92837: sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0);
92838: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);
92839: }
92840: }else
92841: #endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */
92842:
92843: #ifndef SQLITE_OMIT_FOREIGN_KEY
92844: if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 && zRight ){
92845: FKey *pFK;
92846: Table *pTab;
92847: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92848: pTab = sqlite3FindTable(db, zRight, zDb);
92849: if( pTab ){
92850: v = sqlite3GetVdbe(pParse);
92851: pFK = pTab->pFKey;
92852: if( pFK ){
92853: int i = 0;
92854: sqlite3VdbeSetNumCols(v, 8);
92855: pParse->nMem = 8;
92856: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC);
92857: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC);
92858: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC);
92859: sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC);
92860: sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC);
92861: sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC);
92862: sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC);
92863: sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC);
92864: while(pFK){
92865: int j;
92866: for(j=0; j<pFK->nCol; j++){
92867: char *zCol = pFK->aCol[j].zCol;
92868: char *zOnDelete = (char *)actionName(pFK->aAction[0]);
92869: char *zOnUpdate = (char *)actionName(pFK->aAction[1]);
92870: sqlite3VdbeAddOp2(v, OP_Integer, i, 1);
92871: sqlite3VdbeAddOp2(v, OP_Integer, j, 2);
92872: sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0);
92873: sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0,
92874: pTab->aCol[pFK->aCol[j].iFrom].zName, 0);
92875: sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0);
92876: sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0);
92877: sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0);
92878: sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0);
92879: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8);
92880: }
92881: ++i;
92882: pFK = pFK->pNextFrom;
92883: }
92884: }
92885: }
92886: }else
92887: #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */
92888:
92889: #ifndef NDEBUG
92890: if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){
92891: if( zRight ){
1.2.2.1 ! misho 92892: if( sqlite3GetBoolean(zRight, 0) ){
1.2 misho 92893: sqlite3ParserTrace(stderr, "parser: ");
92894: }else{
92895: sqlite3ParserTrace(0, 0);
92896: }
92897: }
92898: }else
92899: #endif
92900:
92901: /* Reinstall the LIKE and GLOB functions. The variant of LIKE
92902: ** used will be case sensitive or not depending on the RHS.
92903: */
92904: if( sqlite3StrICmp(zLeft, "case_sensitive_like")==0 ){
92905: if( zRight ){
1.2.2.1 ! misho 92906: sqlite3RegisterLikeFunctions(db, sqlite3GetBoolean(zRight, 0));
1.2 misho 92907: }
92908: }else
92909:
92910: #ifndef SQLITE_INTEGRITY_CHECK_ERROR_MAX
92911: # define SQLITE_INTEGRITY_CHECK_ERROR_MAX 100
92912: #endif
92913:
92914: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
92915: /* Pragma "quick_check" is an experimental reduced version of
92916: ** integrity_check designed to detect most database corruption
92917: ** without most of the overhead of a full integrity-check.
92918: */
92919: if( sqlite3StrICmp(zLeft, "integrity_check")==0
92920: || sqlite3StrICmp(zLeft, "quick_check")==0
92921: ){
92922: int i, j, addr, mxErr;
92923:
92924: /* Code that appears at the end of the integrity check. If no error
92925: ** messages have been generated, output OK. Otherwise output the
92926: ** error message
92927: */
92928: static const VdbeOpList endCode[] = {
92929: { OP_AddImm, 1, 0, 0}, /* 0 */
92930: { OP_IfNeg, 1, 0, 0}, /* 1 */
92931: { OP_String8, 0, 3, 0}, /* 2 */
92932: { OP_ResultRow, 3, 1, 0},
92933: };
92934:
92935: int isQuick = (sqlite3Tolower(zLeft[0])=='q');
92936:
1.2.2.1 ! misho 92937: /* If the PRAGMA command was of the form "PRAGMA <db>.integrity_check",
! 92938: ** then iDb is set to the index of the database identified by <db>.
! 92939: ** In this case, the integrity of database iDb only is verified by
! 92940: ** the VDBE created below.
! 92941: **
! 92942: ** Otherwise, if the command was simply "PRAGMA integrity_check" (or
! 92943: ** "PRAGMA quick_check"), then iDb is set to 0. In this case, set iDb
! 92944: ** to -1 here, to indicate that the VDBE should verify the integrity
! 92945: ** of all attached databases. */
! 92946: assert( iDb>=0 );
! 92947: assert( iDb==0 || pId2->z );
! 92948: if( pId2->z==0 ) iDb = -1;
! 92949:
1.2 misho 92950: /* Initialize the VDBE program */
92951: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
92952: pParse->nMem = 6;
92953: sqlite3VdbeSetNumCols(v, 1);
92954: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC);
92955:
92956: /* Set the maximum error count */
92957: mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
92958: if( zRight ){
92959: sqlite3GetInt32(zRight, &mxErr);
92960: if( mxErr<=0 ){
92961: mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX;
92962: }
92963: }
92964: sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */
92965:
92966: /* Do an integrity check on each database file */
92967: for(i=0; i<db->nDb; i++){
92968: HashElem *x;
92969: Hash *pTbls;
92970: int cnt = 0;
92971:
92972: if( OMIT_TEMPDB && i==1 ) continue;
1.2.2.1 ! misho 92973: if( iDb>=0 && i!=iDb ) continue;
1.2 misho 92974:
92975: sqlite3CodeVerifySchema(pParse, i);
92976: addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */
92977: sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);
92978: sqlite3VdbeJumpHere(v, addr);
92979:
92980: /* Do an integrity check of the B-Tree
92981: **
92982: ** Begin by filling registers 2, 3, ... with the root pages numbers
92983: ** for all tables and indices in the database.
92984: */
1.2.2.1 ! misho 92985: assert( sqlite3SchemaMutexHeld(db, i, 0) );
1.2 misho 92986: pTbls = &db->aDb[i].pSchema->tblHash;
92987: for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){
92988: Table *pTab = sqliteHashData(x);
92989: Index *pIdx;
92990: sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt);
92991: cnt++;
92992: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
92993: sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt);
92994: cnt++;
92995: }
92996: }
92997:
92998: /* Make sure sufficient number of registers have been allocated */
92999: if( pParse->nMem < cnt+4 ){
93000: pParse->nMem = cnt+4;
93001: }
93002:
93003: /* Do the b-tree integrity checks */
93004: sqlite3VdbeAddOp3(v, OP_IntegrityCk, 2, cnt, 1);
93005: sqlite3VdbeChangeP5(v, (u8)i);
93006: addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2);
93007: sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0,
93008: sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName),
93009: P4_DYNAMIC);
1.2.2.1 ! misho 93010: sqlite3VdbeAddOp2(v, OP_Move, 2, 4);
1.2 misho 93011: sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2);
93012: sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1);
93013: sqlite3VdbeJumpHere(v, addr);
93014:
93015: /* Make sure all the indices are constructed correctly.
93016: */
93017: for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){
93018: Table *pTab = sqliteHashData(x);
93019: Index *pIdx;
93020: int loopTop;
93021:
93022: if( pTab->pIndex==0 ) continue;
93023: addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */
93024: sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);
93025: sqlite3VdbeJumpHere(v, addr);
93026: sqlite3OpenTableAndIndices(pParse, pTab, 1, OP_OpenRead);
93027: sqlite3VdbeAddOp2(v, OP_Integer, 0, 2); /* reg(2) will count entries */
93028: loopTop = sqlite3VdbeAddOp2(v, OP_Rewind, 1, 0);
93029: sqlite3VdbeAddOp2(v, OP_AddImm, 2, 1); /* increment entry count */
93030: for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
93031: int jmp2;
93032: int r1;
93033: static const VdbeOpList idxErr[] = {
93034: { OP_AddImm, 1, -1, 0},
93035: { OP_String8, 0, 3, 0}, /* 1 */
93036: { OP_Rowid, 1, 4, 0},
93037: { OP_String8, 0, 5, 0}, /* 3 */
93038: { OP_String8, 0, 6, 0}, /* 4 */
93039: { OP_Concat, 4, 3, 3},
93040: { OP_Concat, 5, 3, 3},
93041: { OP_Concat, 6, 3, 3},
93042: { OP_ResultRow, 3, 1, 0},
93043: { OP_IfPos, 1, 0, 0}, /* 9 */
93044: { OP_Halt, 0, 0, 0},
93045: };
93046: r1 = sqlite3GenerateIndexKey(pParse, pIdx, 1, 3, 0);
93047: jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, j+2, 0, r1, pIdx->nColumn+1);
93048: addr = sqlite3VdbeAddOpList(v, ArraySize(idxErr), idxErr);
93049: sqlite3VdbeChangeP4(v, addr+1, "rowid ", P4_STATIC);
93050: sqlite3VdbeChangeP4(v, addr+3, " missing from index ", P4_STATIC);
93051: sqlite3VdbeChangeP4(v, addr+4, pIdx->zName, P4_TRANSIENT);
93052: sqlite3VdbeJumpHere(v, addr+9);
93053: sqlite3VdbeJumpHere(v, jmp2);
93054: }
93055: sqlite3VdbeAddOp2(v, OP_Next, 1, loopTop+1);
93056: sqlite3VdbeJumpHere(v, loopTop);
93057: for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
93058: static const VdbeOpList cntIdx[] = {
93059: { OP_Integer, 0, 3, 0},
93060: { OP_Rewind, 0, 0, 0}, /* 1 */
93061: { OP_AddImm, 3, 1, 0},
93062: { OP_Next, 0, 0, 0}, /* 3 */
93063: { OP_Eq, 2, 0, 3}, /* 4 */
93064: { OP_AddImm, 1, -1, 0},
93065: { OP_String8, 0, 2, 0}, /* 6 */
93066: { OP_String8, 0, 3, 0}, /* 7 */
93067: { OP_Concat, 3, 2, 2},
93068: { OP_ResultRow, 2, 1, 0},
93069: };
93070: addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1);
93071: sqlite3VdbeAddOp2(v, OP_Halt, 0, 0);
93072: sqlite3VdbeJumpHere(v, addr);
93073: addr = sqlite3VdbeAddOpList(v, ArraySize(cntIdx), cntIdx);
93074: sqlite3VdbeChangeP1(v, addr+1, j+2);
93075: sqlite3VdbeChangeP2(v, addr+1, addr+4);
93076: sqlite3VdbeChangeP1(v, addr+3, j+2);
93077: sqlite3VdbeChangeP2(v, addr+3, addr+2);
93078: sqlite3VdbeJumpHere(v, addr+4);
93079: sqlite3VdbeChangeP4(v, addr+6,
93080: "wrong # of entries in index ", P4_STATIC);
93081: sqlite3VdbeChangeP4(v, addr+7, pIdx->zName, P4_TRANSIENT);
93082: }
93083: }
93084: }
93085: addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode);
93086: sqlite3VdbeChangeP2(v, addr, -mxErr);
93087: sqlite3VdbeJumpHere(v, addr+1);
93088: sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC);
93089: }else
93090: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
93091:
93092: #ifndef SQLITE_OMIT_UTF16
93093: /*
93094: ** PRAGMA encoding
93095: ** PRAGMA encoding = "utf-8"|"utf-16"|"utf-16le"|"utf-16be"
93096: **
93097: ** In its first form, this pragma returns the encoding of the main
93098: ** database. If the database is not initialized, it is initialized now.
93099: **
93100: ** The second form of this pragma is a no-op if the main database file
93101: ** has not already been initialized. In this case it sets the default
93102: ** encoding that will be used for the main database file if a new file
93103: ** is created. If an existing main database file is opened, then the
93104: ** default text encoding for the existing database is used.
93105: **
93106: ** In all cases new databases created using the ATTACH command are
93107: ** created to use the same default text encoding as the main database. If
93108: ** the main database has not been initialized and/or created when ATTACH
93109: ** is executed, this is done before the ATTACH operation.
93110: **
93111: ** In the second form this pragma sets the text encoding to be used in
93112: ** new database files created using this database handle. It is only
93113: ** useful if invoked immediately after the main database i
93114: */
93115: if( sqlite3StrICmp(zLeft, "encoding")==0 ){
93116: static const struct EncName {
93117: char *zName;
93118: u8 enc;
93119: } encnames[] = {
93120: { "UTF8", SQLITE_UTF8 },
93121: { "UTF-8", SQLITE_UTF8 }, /* Must be element [1] */
93122: { "UTF-16le", SQLITE_UTF16LE }, /* Must be element [2] */
93123: { "UTF-16be", SQLITE_UTF16BE }, /* Must be element [3] */
93124: { "UTF16le", SQLITE_UTF16LE },
93125: { "UTF16be", SQLITE_UTF16BE },
93126: { "UTF-16", 0 }, /* SQLITE_UTF16NATIVE */
93127: { "UTF16", 0 }, /* SQLITE_UTF16NATIVE */
93128: { 0, 0 }
93129: };
93130: const struct EncName *pEnc;
93131: if( !zRight ){ /* "PRAGMA encoding" */
93132: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
93133: sqlite3VdbeSetNumCols(v, 1);
93134: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", SQLITE_STATIC);
93135: sqlite3VdbeAddOp2(v, OP_String8, 0, 1);
93136: assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 );
93137: assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE );
93138: assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE );
93139: sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC);
93140: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
93141: }else{ /* "PRAGMA encoding = XXX" */
93142: /* Only change the value of sqlite.enc if the database handle is not
93143: ** initialized. If the main database exists, the new sqlite.enc value
93144: ** will be overwritten when the schema is next loaded. If it does not
93145: ** already exists, it will be created to use the new encoding value.
93146: */
93147: if(
93148: !(DbHasProperty(db, 0, DB_SchemaLoaded)) ||
93149: DbHasProperty(db, 0, DB_Empty)
93150: ){
93151: for(pEnc=&encnames[0]; pEnc->zName; pEnc++){
93152: if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){
93153: ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE;
93154: break;
93155: }
93156: }
93157: if( !pEnc->zName ){
93158: sqlite3ErrorMsg(pParse, "unsupported encoding: %s", zRight);
93159: }
93160: }
93161: }
93162: }else
93163: #endif /* SQLITE_OMIT_UTF16 */
93164:
93165: #ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
93166: /*
93167: ** PRAGMA [database.]schema_version
93168: ** PRAGMA [database.]schema_version = <integer>
93169: **
93170: ** PRAGMA [database.]user_version
93171: ** PRAGMA [database.]user_version = <integer>
93172: **
93173: ** The pragma's schema_version and user_version are used to set or get
93174: ** the value of the schema-version and user-version, respectively. Both
93175: ** the schema-version and the user-version are 32-bit signed integers
93176: ** stored in the database header.
93177: **
93178: ** The schema-cookie is usually only manipulated internally by SQLite. It
93179: ** is incremented by SQLite whenever the database schema is modified (by
93180: ** creating or dropping a table or index). The schema version is used by
93181: ** SQLite each time a query is executed to ensure that the internal cache
93182: ** of the schema used when compiling the SQL query matches the schema of
93183: ** the database against which the compiled query is actually executed.
93184: ** Subverting this mechanism by using "PRAGMA schema_version" to modify
93185: ** the schema-version is potentially dangerous and may lead to program
93186: ** crashes or database corruption. Use with caution!
93187: **
93188: ** The user-version is not used internally by SQLite. It may be used by
93189: ** applications for any purpose.
93190: */
93191: if( sqlite3StrICmp(zLeft, "schema_version")==0
93192: || sqlite3StrICmp(zLeft, "user_version")==0
93193: || sqlite3StrICmp(zLeft, "freelist_count")==0
93194: ){
93195: int iCookie; /* Cookie index. 1 for schema-cookie, 6 for user-cookie. */
93196: sqlite3VdbeUsesBtree(v, iDb);
93197: switch( zLeft[0] ){
93198: case 'f': case 'F':
93199: iCookie = BTREE_FREE_PAGE_COUNT;
93200: break;
93201: case 's': case 'S':
93202: iCookie = BTREE_SCHEMA_VERSION;
93203: break;
93204: default:
93205: iCookie = BTREE_USER_VERSION;
93206: break;
93207: }
93208:
93209: if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){
93210: /* Write the specified cookie value */
93211: static const VdbeOpList setCookie[] = {
93212: { OP_Transaction, 0, 1, 0}, /* 0 */
93213: { OP_Integer, 0, 1, 0}, /* 1 */
93214: { OP_SetCookie, 0, 0, 1}, /* 2 */
93215: };
93216: int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie);
93217: sqlite3VdbeChangeP1(v, addr, iDb);
93218: sqlite3VdbeChangeP1(v, addr+1, sqlite3Atoi(zRight));
93219: sqlite3VdbeChangeP1(v, addr+2, iDb);
93220: sqlite3VdbeChangeP2(v, addr+2, iCookie);
93221: }else{
93222: /* Read the specified cookie value */
93223: static const VdbeOpList readCookie[] = {
93224: { OP_Transaction, 0, 0, 0}, /* 0 */
93225: { OP_ReadCookie, 0, 1, 0}, /* 1 */
93226: { OP_ResultRow, 1, 1, 0}
93227: };
93228: int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie);
93229: sqlite3VdbeChangeP1(v, addr, iDb);
93230: sqlite3VdbeChangeP1(v, addr+1, iDb);
93231: sqlite3VdbeChangeP3(v, addr+1, iCookie);
93232: sqlite3VdbeSetNumCols(v, 1);
93233: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT);
93234: }
93235: }else
93236: #endif /* SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS */
93237:
93238: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
93239: /*
93240: ** PRAGMA compile_options
93241: **
93242: ** Return the names of all compile-time options used in this build,
93243: ** one option per row.
93244: */
93245: if( sqlite3StrICmp(zLeft, "compile_options")==0 ){
93246: int i = 0;
93247: const char *zOpt;
93248: sqlite3VdbeSetNumCols(v, 1);
93249: pParse->nMem = 1;
93250: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "compile_option", SQLITE_STATIC);
93251: while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){
93252: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0);
93253: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1);
93254: }
93255: }else
93256: #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */
93257:
93258: #ifndef SQLITE_OMIT_WAL
93259: /*
93260: ** PRAGMA [database.]wal_checkpoint = passive|full|restart
93261: **
93262: ** Checkpoint the database.
93263: */
93264: if( sqlite3StrICmp(zLeft, "wal_checkpoint")==0 ){
93265: int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED);
93266: int eMode = SQLITE_CHECKPOINT_PASSIVE;
93267: if( zRight ){
93268: if( sqlite3StrICmp(zRight, "full")==0 ){
93269: eMode = SQLITE_CHECKPOINT_FULL;
93270: }else if( sqlite3StrICmp(zRight, "restart")==0 ){
93271: eMode = SQLITE_CHECKPOINT_RESTART;
93272: }
93273: }
93274: if( sqlite3ReadSchema(pParse) ) goto pragma_out;
93275: sqlite3VdbeSetNumCols(v, 3);
93276: pParse->nMem = 3;
93277: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "busy", SQLITE_STATIC);
93278: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "log", SQLITE_STATIC);
93279: sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "checkpointed", SQLITE_STATIC);
93280:
93281: sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1);
93282: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
93283: }else
93284:
93285: /*
93286: ** PRAGMA wal_autocheckpoint
93287: ** PRAGMA wal_autocheckpoint = N
93288: **
93289: ** Configure a database connection to automatically checkpoint a database
93290: ** after accumulating N frames in the log. Or query for the current value
93291: ** of N.
93292: */
93293: if( sqlite3StrICmp(zLeft, "wal_autocheckpoint")==0 ){
93294: if( zRight ){
93295: sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight));
93296: }
93297: returnSingleInt(pParse, "wal_autocheckpoint",
93298: db->xWalCallback==sqlite3WalDefaultHook ?
93299: SQLITE_PTR_TO_INT(db->pWalArg) : 0);
93300: }else
93301: #endif
93302:
93303: /*
93304: ** PRAGMA shrink_memory
93305: **
93306: ** This pragma attempts to free as much memory as possible from the
93307: ** current database connection.
93308: */
93309: if( sqlite3StrICmp(zLeft, "shrink_memory")==0 ){
93310: sqlite3_db_release_memory(db);
93311: }else
93312:
1.2.2.1 ! misho 93313: /*
! 93314: ** PRAGMA busy_timeout
! 93315: ** PRAGMA busy_timeout = N
! 93316: **
! 93317: ** Call sqlite3_busy_timeout(db, N). Return the current timeout value
! 93318: ** if one is set. If no busy handler or a different busy handler is set
! 93319: ** then 0 is returned. Setting the busy_timeout to 0 or negative
! 93320: ** disables the timeout.
! 93321: */
! 93322: if( sqlite3StrICmp(zLeft, "busy_timeout")==0 ){
! 93323: if( zRight ){
! 93324: sqlite3_busy_timeout(db, sqlite3Atoi(zRight));
! 93325: }
! 93326: returnSingleInt(pParse, "timeout", db->busyTimeout);
! 93327: }else
! 93328:
1.2 misho 93329: #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
93330: /*
93331: ** Report the current state of file logs for all databases
93332: */
93333: if( sqlite3StrICmp(zLeft, "lock_status")==0 ){
93334: static const char *const azLockName[] = {
93335: "unlocked", "shared", "reserved", "pending", "exclusive"
93336: };
93337: int i;
93338: sqlite3VdbeSetNumCols(v, 2);
93339: pParse->nMem = 2;
93340: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", SQLITE_STATIC);
93341: sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", SQLITE_STATIC);
93342: for(i=0; i<db->nDb; i++){
93343: Btree *pBt;
93344: const char *zState = "unknown";
93345: int j;
93346: if( db->aDb[i].zName==0 ) continue;
93347: sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, db->aDb[i].zName, P4_STATIC);
93348: pBt = db->aDb[i].pBt;
1.2.2.1 ! misho 93349: if( pBt==0 || sqlite3BtreePager(pBt)==0 ){
1.2 misho 93350: zState = "closed";
93351: }else if( sqlite3_file_control(db, i ? db->aDb[i].zName : 0,
93352: SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){
93353: zState = azLockName[j];
93354: }
93355: sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC);
93356: sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);
93357: }
93358:
93359: }else
93360: #endif
93361:
93362: #ifdef SQLITE_HAS_CODEC
93363: if( sqlite3StrICmp(zLeft, "key")==0 && zRight ){
93364: sqlite3_key(db, zRight, sqlite3Strlen30(zRight));
93365: }else
93366: if( sqlite3StrICmp(zLeft, "rekey")==0 && zRight ){
93367: sqlite3_rekey(db, zRight, sqlite3Strlen30(zRight));
93368: }else
93369: if( zRight && (sqlite3StrICmp(zLeft, "hexkey")==0 ||
93370: sqlite3StrICmp(zLeft, "hexrekey")==0) ){
93371: int i, h1, h2;
93372: char zKey[40];
93373: for(i=0; (h1 = zRight[i])!=0 && (h2 = zRight[i+1])!=0; i+=2){
93374: h1 += 9*(1&(h1>>6));
93375: h2 += 9*(1&(h2>>6));
93376: zKey[i/2] = (h2 & 0x0f) | ((h1 & 0xf)<<4);
93377: }
93378: if( (zLeft[3] & 0xf)==0xb ){
93379: sqlite3_key(db, zKey, i/2);
93380: }else{
93381: sqlite3_rekey(db, zKey, i/2);
93382: }
93383: }else
93384: #endif
93385: #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD)
93386: if( sqlite3StrICmp(zLeft, "activate_extensions")==0 ){
93387: #ifdef SQLITE_HAS_CODEC
93388: if( sqlite3StrNICmp(zRight, "see-", 4)==0 ){
93389: sqlite3_activate_see(&zRight[4]);
93390: }
93391: #endif
93392: #ifdef SQLITE_ENABLE_CEROD
93393: if( sqlite3StrNICmp(zRight, "cerod-", 6)==0 ){
93394: sqlite3_activate_cerod(&zRight[6]);
93395: }
93396: #endif
93397: }else
93398: #endif
93399:
93400:
93401: {/* Empty ELSE clause */}
93402:
93403: /*
93404: ** Reset the safety level, in case the fullfsync flag or synchronous
93405: ** setting changed.
93406: */
93407: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
93408: if( db->autoCommit ){
93409: sqlite3BtreeSetSafetyLevel(pDb->pBt, pDb->safety_level,
93410: (db->flags&SQLITE_FullFSync)!=0,
93411: (db->flags&SQLITE_CkptFullFSync)!=0);
93412: }
93413: #endif
93414: pragma_out:
93415: sqlite3DbFree(db, zLeft);
93416: sqlite3DbFree(db, zRight);
93417: }
93418:
93419: #endif /* SQLITE_OMIT_PRAGMA */
93420:
93421: /************** End of pragma.c **********************************************/
93422: /************** Begin file prepare.c *****************************************/
93423: /*
93424: ** 2005 May 25
93425: **
93426: ** The author disclaims copyright to this source code. In place of
93427: ** a legal notice, here is a blessing:
93428: **
93429: ** May you do good and not evil.
93430: ** May you find forgiveness for yourself and forgive others.
93431: ** May you share freely, never taking more than you give.
93432: **
93433: *************************************************************************
93434: ** This file contains the implementation of the sqlite3_prepare()
93435: ** interface, and routines that contribute to loading the database schema
93436: ** from disk.
93437: */
93438:
93439: /*
93440: ** Fill the InitData structure with an error message that indicates
93441: ** that the database is corrupt.
93442: */
93443: static void corruptSchema(
93444: InitData *pData, /* Initialization context */
93445: const char *zObj, /* Object being parsed at the point of error */
93446: const char *zExtra /* Error information */
93447: ){
93448: sqlite3 *db = pData->db;
93449: if( !db->mallocFailed && (db->flags & SQLITE_RecoveryMode)==0 ){
93450: if( zObj==0 ) zObj = "?";
93451: sqlite3SetString(pData->pzErrMsg, db,
93452: "malformed database schema (%s)", zObj);
93453: if( zExtra ){
93454: *pData->pzErrMsg = sqlite3MAppendf(db, *pData->pzErrMsg,
93455: "%s - %s", *pData->pzErrMsg, zExtra);
93456: }
93457: }
93458: pData->rc = db->mallocFailed ? SQLITE_NOMEM : SQLITE_CORRUPT_BKPT;
93459: }
93460:
93461: /*
93462: ** This is the callback routine for the code that initializes the
93463: ** database. See sqlite3Init() below for additional information.
93464: ** This routine is also called from the OP_ParseSchema opcode of the VDBE.
93465: **
93466: ** Each callback contains the following information:
93467: **
93468: ** argv[0] = name of thing being created
93469: ** argv[1] = root page number for table or index. 0 for trigger or view.
93470: ** argv[2] = SQL text for the CREATE statement.
93471: **
93472: */
93473: SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){
93474: InitData *pData = (InitData*)pInit;
93475: sqlite3 *db = pData->db;
93476: int iDb = pData->iDb;
93477:
93478: assert( argc==3 );
93479: UNUSED_PARAMETER2(NotUsed, argc);
93480: assert( sqlite3_mutex_held(db->mutex) );
93481: DbClearProperty(db, iDb, DB_Empty);
93482: if( db->mallocFailed ){
93483: corruptSchema(pData, argv[0], 0);
93484: return 1;
93485: }
93486:
93487: assert( iDb>=0 && iDb<db->nDb );
93488: if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */
93489: if( argv[1]==0 ){
93490: corruptSchema(pData, argv[0], 0);
93491: }else if( argv[2] && argv[2][0] ){
93492: /* Call the parser to process a CREATE TABLE, INDEX or VIEW.
93493: ** But because db->init.busy is set to 1, no VDBE code is generated
93494: ** or executed. All the parser does is build the internal data
93495: ** structures that describe the table, index, or view.
93496: */
93497: int rc;
93498: sqlite3_stmt *pStmt;
93499: TESTONLY(int rcp); /* Return code from sqlite3_prepare() */
93500:
93501: assert( db->init.busy );
93502: db->init.iDb = iDb;
93503: db->init.newTnum = sqlite3Atoi(argv[1]);
93504: db->init.orphanTrigger = 0;
93505: TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0);
93506: rc = db->errCode;
93507: assert( (rc&0xFF)==(rcp&0xFF) );
93508: db->init.iDb = 0;
93509: if( SQLITE_OK!=rc ){
93510: if( db->init.orphanTrigger ){
93511: assert( iDb==1 );
93512: }else{
93513: pData->rc = rc;
93514: if( rc==SQLITE_NOMEM ){
93515: db->mallocFailed = 1;
93516: }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){
93517: corruptSchema(pData, argv[0], sqlite3_errmsg(db));
93518: }
93519: }
93520: }
93521: sqlite3_finalize(pStmt);
93522: }else if( argv[0]==0 ){
93523: corruptSchema(pData, 0, 0);
93524: }else{
93525: /* If the SQL column is blank it means this is an index that
93526: ** was created to be the PRIMARY KEY or to fulfill a UNIQUE
93527: ** constraint for a CREATE TABLE. The index should have already
93528: ** been created when we processed the CREATE TABLE. All we have
93529: ** to do here is record the root page number for that index.
93530: */
93531: Index *pIndex;
93532: pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName);
93533: if( pIndex==0 ){
93534: /* This can occur if there exists an index on a TEMP table which
93535: ** has the same name as another index on a permanent index. Since
93536: ** the permanent table is hidden by the TEMP table, we can also
93537: ** safely ignore the index on the permanent table.
93538: */
93539: /* Do Nothing */;
93540: }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){
93541: corruptSchema(pData, argv[0], "invalid rootpage");
93542: }
93543: }
93544: return 0;
93545: }
93546:
93547: /*
93548: ** Attempt to read the database schema and initialize internal
93549: ** data structures for a single database file. The index of the
93550: ** database file is given by iDb. iDb==0 is used for the main
93551: ** database. iDb==1 should never be used. iDb>=2 is used for
93552: ** auxiliary databases. Return one of the SQLITE_ error codes to
93553: ** indicate success or failure.
93554: */
93555: static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
93556: int rc;
93557: int i;
1.2.2.1 ! misho 93558: #ifndef SQLITE_OMIT_DEPRECATED
1.2 misho 93559: int size;
1.2.2.1 ! misho 93560: #endif
1.2 misho 93561: Table *pTab;
93562: Db *pDb;
93563: char const *azArg[4];
93564: int meta[5];
93565: InitData initData;
93566: char const *zMasterSchema;
93567: char const *zMasterName;
93568: int openedTransaction = 0;
93569:
93570: /*
93571: ** The master database table has a structure like this
93572: */
93573: static const char master_schema[] =
93574: "CREATE TABLE sqlite_master(\n"
93575: " type text,\n"
93576: " name text,\n"
93577: " tbl_name text,\n"
93578: " rootpage integer,\n"
93579: " sql text\n"
93580: ")"
93581: ;
93582: #ifndef SQLITE_OMIT_TEMPDB
93583: static const char temp_master_schema[] =
93584: "CREATE TEMP TABLE sqlite_temp_master(\n"
93585: " type text,\n"
93586: " name text,\n"
93587: " tbl_name text,\n"
93588: " rootpage integer,\n"
93589: " sql text\n"
93590: ")"
93591: ;
93592: #else
93593: #define temp_master_schema 0
93594: #endif
93595:
93596: assert( iDb>=0 && iDb<db->nDb );
93597: assert( db->aDb[iDb].pSchema );
93598: assert( sqlite3_mutex_held(db->mutex) );
93599: assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) );
93600:
93601: /* zMasterSchema and zInitScript are set to point at the master schema
93602: ** and initialisation script appropriate for the database being
93603: ** initialised. zMasterName is the name of the master table.
93604: */
93605: if( !OMIT_TEMPDB && iDb==1 ){
93606: zMasterSchema = temp_master_schema;
93607: }else{
93608: zMasterSchema = master_schema;
93609: }
93610: zMasterName = SCHEMA_TABLE(iDb);
93611:
93612: /* Construct the schema tables. */
93613: azArg[0] = zMasterName;
93614: azArg[1] = "1";
93615: azArg[2] = zMasterSchema;
93616: azArg[3] = 0;
93617: initData.db = db;
93618: initData.iDb = iDb;
93619: initData.rc = SQLITE_OK;
93620: initData.pzErrMsg = pzErrMsg;
93621: sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
93622: if( initData.rc ){
93623: rc = initData.rc;
93624: goto error_out;
93625: }
93626: pTab = sqlite3FindTable(db, zMasterName, db->aDb[iDb].zName);
93627: if( ALWAYS(pTab) ){
93628: pTab->tabFlags |= TF_Readonly;
93629: }
93630:
93631: /* Create a cursor to hold the database open
93632: */
93633: pDb = &db->aDb[iDb];
93634: if( pDb->pBt==0 ){
93635: if( !OMIT_TEMPDB && ALWAYS(iDb==1) ){
93636: DbSetProperty(db, 1, DB_SchemaLoaded);
93637: }
93638: return SQLITE_OK;
93639: }
93640:
93641: /* If there is not already a read-only (or read-write) transaction opened
93642: ** on the b-tree database, open one now. If a transaction is opened, it
93643: ** will be closed before this function returns. */
93644: sqlite3BtreeEnter(pDb->pBt);
93645: if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){
93646: rc = sqlite3BtreeBeginTrans(pDb->pBt, 0);
93647: if( rc!=SQLITE_OK ){
93648: sqlite3SetString(pzErrMsg, db, "%s", sqlite3ErrStr(rc));
93649: goto initone_error_out;
93650: }
93651: openedTransaction = 1;
93652: }
93653:
93654: /* Get the database meta information.
93655: **
93656: ** Meta values are as follows:
93657: ** meta[0] Schema cookie. Changes with each schema change.
93658: ** meta[1] File format of schema layer.
93659: ** meta[2] Size of the page cache.
93660: ** meta[3] Largest rootpage (auto/incr_vacuum mode)
93661: ** meta[4] Db text encoding. 1:UTF-8 2:UTF-16LE 3:UTF-16BE
93662: ** meta[5] User version
93663: ** meta[6] Incremental vacuum mode
93664: ** meta[7] unused
93665: ** meta[8] unused
93666: ** meta[9] unused
93667: **
93668: ** Note: The #defined SQLITE_UTF* symbols in sqliteInt.h correspond to
93669: ** the possible values of meta[4].
93670: */
93671: for(i=0; i<ArraySize(meta); i++){
93672: sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]);
93673: }
93674: pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1];
93675:
93676: /* If opening a non-empty database, check the text encoding. For the
93677: ** main database, set sqlite3.enc to the encoding of the main database.
93678: ** For an attached db, it is an error if the encoding is not the same
93679: ** as sqlite3.enc.
93680: */
93681: if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */
93682: if( iDb==0 ){
93683: u8 encoding;
93684: /* If opening the main database, set ENC(db). */
93685: encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3;
93686: if( encoding==0 ) encoding = SQLITE_UTF8;
93687: ENC(db) = encoding;
93688: }else{
93689: /* If opening an attached database, the encoding much match ENC(db) */
93690: if( meta[BTREE_TEXT_ENCODING-1]!=ENC(db) ){
93691: sqlite3SetString(pzErrMsg, db, "attached databases must use the same"
93692: " text encoding as main database");
93693: rc = SQLITE_ERROR;
93694: goto initone_error_out;
93695: }
93696: }
93697: }else{
93698: DbSetProperty(db, iDb, DB_Empty);
93699: }
93700: pDb->pSchema->enc = ENC(db);
93701:
93702: if( pDb->pSchema->cache_size==0 ){
93703: #ifndef SQLITE_OMIT_DEPRECATED
93704: size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]);
93705: if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; }
93706: pDb->pSchema->cache_size = size;
93707: #else
93708: pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE;
93709: #endif
93710: sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size);
93711: }
93712:
93713: /*
93714: ** file_format==1 Version 3.0.0.
93715: ** file_format==2 Version 3.1.3. // ALTER TABLE ADD COLUMN
93716: ** file_format==3 Version 3.1.4. // ditto but with non-NULL defaults
93717: ** file_format==4 Version 3.3.0. // DESC indices. Boolean constants
93718: */
93719: pDb->pSchema->file_format = (u8)meta[BTREE_FILE_FORMAT-1];
93720: if( pDb->pSchema->file_format==0 ){
93721: pDb->pSchema->file_format = 1;
93722: }
93723: if( pDb->pSchema->file_format>SQLITE_MAX_FILE_FORMAT ){
93724: sqlite3SetString(pzErrMsg, db, "unsupported file format");
93725: rc = SQLITE_ERROR;
93726: goto initone_error_out;
93727: }
93728:
93729: /* Ticket #2804: When we open a database in the newer file format,
93730: ** clear the legacy_file_format pragma flag so that a VACUUM will
93731: ** not downgrade the database and thus invalidate any descending
93732: ** indices that the user might have created.
93733: */
93734: if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){
93735: db->flags &= ~SQLITE_LegacyFileFmt;
93736: }
93737:
93738: /* Read the schema information out of the schema tables
93739: */
93740: assert( db->init.busy );
93741: {
93742: char *zSql;
93743: zSql = sqlite3MPrintf(db,
93744: "SELECT name, rootpage, sql FROM '%q'.%s ORDER BY rowid",
93745: db->aDb[iDb].zName, zMasterName);
93746: #ifndef SQLITE_OMIT_AUTHORIZATION
93747: {
93748: int (*xAuth)(void*,int,const char*,const char*,const char*,const char*);
93749: xAuth = db->xAuth;
93750: db->xAuth = 0;
93751: #endif
93752: rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
93753: #ifndef SQLITE_OMIT_AUTHORIZATION
93754: db->xAuth = xAuth;
93755: }
93756: #endif
93757: if( rc==SQLITE_OK ) rc = initData.rc;
93758: sqlite3DbFree(db, zSql);
93759: #ifndef SQLITE_OMIT_ANALYZE
93760: if( rc==SQLITE_OK ){
93761: sqlite3AnalysisLoad(db, iDb);
93762: }
93763: #endif
93764: }
93765: if( db->mallocFailed ){
93766: rc = SQLITE_NOMEM;
1.2.2.1 ! misho 93767: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 93768: }
93769: if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){
93770: /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider
93771: ** the schema loaded, even if errors occurred. In this situation the
93772: ** current sqlite3_prepare() operation will fail, but the following one
93773: ** will attempt to compile the supplied statement against whatever subset
93774: ** of the schema was loaded before the error occurred. The primary
93775: ** purpose of this is to allow access to the sqlite_master table
93776: ** even when its contents have been corrupted.
93777: */
93778: DbSetProperty(db, iDb, DB_SchemaLoaded);
93779: rc = SQLITE_OK;
93780: }
93781:
93782: /* Jump here for an error that occurs after successfully allocating
93783: ** curMain and calling sqlite3BtreeEnter(). For an error that occurs
93784: ** before that point, jump to error_out.
93785: */
93786: initone_error_out:
93787: if( openedTransaction ){
93788: sqlite3BtreeCommit(pDb->pBt);
93789: }
93790: sqlite3BtreeLeave(pDb->pBt);
93791:
93792: error_out:
93793: if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
93794: db->mallocFailed = 1;
93795: }
93796: return rc;
93797: }
93798:
93799: /*
93800: ** Initialize all database files - the main database file, the file
93801: ** used to store temporary tables, and any additional database files
93802: ** created using ATTACH statements. Return a success code. If an
93803: ** error occurs, write an error message into *pzErrMsg.
93804: **
93805: ** After a database is initialized, the DB_SchemaLoaded bit is set
93806: ** bit is set in the flags field of the Db structure. If the database
93807: ** file was of zero-length, then the DB_Empty flag is also set.
93808: */
93809: SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){
93810: int i, rc;
93811: int commit_internal = !(db->flags&SQLITE_InternChanges);
93812:
93813: assert( sqlite3_mutex_held(db->mutex) );
93814: rc = SQLITE_OK;
93815: db->init.busy = 1;
93816: for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
93817: if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue;
93818: rc = sqlite3InitOne(db, i, pzErrMsg);
93819: if( rc ){
1.2.2.1 ! misho 93820: sqlite3ResetOneSchema(db, i);
1.2 misho 93821: }
93822: }
93823:
93824: /* Once all the other databases have been initialised, load the schema
93825: ** for the TEMP database. This is loaded last, as the TEMP database
93826: ** schema may contain references to objects in other databases.
93827: */
93828: #ifndef SQLITE_OMIT_TEMPDB
93829: if( rc==SQLITE_OK && ALWAYS(db->nDb>1)
93830: && !DbHasProperty(db, 1, DB_SchemaLoaded) ){
93831: rc = sqlite3InitOne(db, 1, pzErrMsg);
93832: if( rc ){
1.2.2.1 ! misho 93833: sqlite3ResetOneSchema(db, 1);
1.2 misho 93834: }
93835: }
93836: #endif
93837:
93838: db->init.busy = 0;
93839: if( rc==SQLITE_OK && commit_internal ){
93840: sqlite3CommitInternalChanges(db);
93841: }
93842:
93843: return rc;
93844: }
93845:
93846: /*
93847: ** This routine is a no-op if the database schema is already initialised.
93848: ** Otherwise, the schema is loaded. An error code is returned.
93849: */
93850: SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){
93851: int rc = SQLITE_OK;
93852: sqlite3 *db = pParse->db;
93853: assert( sqlite3_mutex_held(db->mutex) );
93854: if( !db->init.busy ){
93855: rc = sqlite3Init(db, &pParse->zErrMsg);
93856: }
93857: if( rc!=SQLITE_OK ){
93858: pParse->rc = rc;
93859: pParse->nErr++;
93860: }
93861: return rc;
93862: }
93863:
93864:
93865: /*
93866: ** Check schema cookies in all databases. If any cookie is out
93867: ** of date set pParse->rc to SQLITE_SCHEMA. If all schema cookies
93868: ** make no changes to pParse->rc.
93869: */
93870: static void schemaIsValid(Parse *pParse){
93871: sqlite3 *db = pParse->db;
93872: int iDb;
93873: int rc;
93874: int cookie;
93875:
93876: assert( pParse->checkSchema );
93877: assert( sqlite3_mutex_held(db->mutex) );
93878: for(iDb=0; iDb<db->nDb; iDb++){
93879: int openedTransaction = 0; /* True if a transaction is opened */
93880: Btree *pBt = db->aDb[iDb].pBt; /* Btree database to read cookie from */
93881: if( pBt==0 ) continue;
93882:
93883: /* If there is not already a read-only (or read-write) transaction opened
93884: ** on the b-tree database, open one now. If a transaction is opened, it
93885: ** will be closed immediately after reading the meta-value. */
93886: if( !sqlite3BtreeIsInReadTrans(pBt) ){
93887: rc = sqlite3BtreeBeginTrans(pBt, 0);
93888: if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){
93889: db->mallocFailed = 1;
93890: }
93891: if( rc!=SQLITE_OK ) return;
93892: openedTransaction = 1;
93893: }
93894:
93895: /* Read the schema cookie from the database. If it does not match the
93896: ** value stored as part of the in-memory schema representation,
93897: ** set Parse.rc to SQLITE_SCHEMA. */
93898: sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie);
93899: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
93900: if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){
1.2.2.1 ! misho 93901: sqlite3ResetOneSchema(db, iDb);
1.2 misho 93902: pParse->rc = SQLITE_SCHEMA;
93903: }
93904:
93905: /* Close the transaction, if one was opened. */
93906: if( openedTransaction ){
93907: sqlite3BtreeCommit(pBt);
93908: }
93909: }
93910: }
93911:
93912: /*
93913: ** Convert a schema pointer into the iDb index that indicates
93914: ** which database file in db->aDb[] the schema refers to.
93915: **
93916: ** If the same database is attached more than once, the first
93917: ** attached database is returned.
93918: */
93919: SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){
93920: int i = -1000000;
93921:
93922: /* If pSchema is NULL, then return -1000000. This happens when code in
93923: ** expr.c is trying to resolve a reference to a transient table (i.e. one
93924: ** created by a sub-select). In this case the return value of this
93925: ** function should never be used.
93926: **
93927: ** We return -1000000 instead of the more usual -1 simply because using
93928: ** -1000000 as the incorrect index into db->aDb[] is much
93929: ** more likely to cause a segfault than -1 (of course there are assert()
93930: ** statements too, but it never hurts to play the odds).
93931: */
93932: assert( sqlite3_mutex_held(db->mutex) );
93933: if( pSchema ){
93934: for(i=0; ALWAYS(i<db->nDb); i++){
93935: if( db->aDb[i].pSchema==pSchema ){
93936: break;
93937: }
93938: }
93939: assert( i>=0 && i<db->nDb );
93940: }
93941: return i;
93942: }
93943:
93944: /*
93945: ** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
93946: */
93947: static int sqlite3Prepare(
93948: sqlite3 *db, /* Database handle. */
93949: const char *zSql, /* UTF-8 encoded SQL statement. */
93950: int nBytes, /* Length of zSql in bytes. */
93951: int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */
93952: Vdbe *pReprepare, /* VM being reprepared */
93953: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
93954: const char **pzTail /* OUT: End of parsed string */
93955: ){
93956: Parse *pParse; /* Parsing context */
93957: char *zErrMsg = 0; /* Error message */
93958: int rc = SQLITE_OK; /* Result code */
93959: int i; /* Loop counter */
93960:
93961: /* Allocate the parsing context */
93962: pParse = sqlite3StackAllocZero(db, sizeof(*pParse));
93963: if( pParse==0 ){
93964: rc = SQLITE_NOMEM;
93965: goto end_prepare;
93966: }
93967: pParse->pReprepare = pReprepare;
93968: assert( ppStmt && *ppStmt==0 );
93969: assert( !db->mallocFailed );
93970: assert( sqlite3_mutex_held(db->mutex) );
93971:
93972: /* Check to verify that it is possible to get a read lock on all
93973: ** database schemas. The inability to get a read lock indicates that
93974: ** some other database connection is holding a write-lock, which in
93975: ** turn means that the other connection has made uncommitted changes
93976: ** to the schema.
93977: **
93978: ** Were we to proceed and prepare the statement against the uncommitted
93979: ** schema changes and if those schema changes are subsequently rolled
93980: ** back and different changes are made in their place, then when this
93981: ** prepared statement goes to run the schema cookie would fail to detect
93982: ** the schema change. Disaster would follow.
93983: **
93984: ** This thread is currently holding mutexes on all Btrees (because
93985: ** of the sqlite3BtreeEnterAll() in sqlite3LockAndPrepare()) so it
93986: ** is not possible for another thread to start a new schema change
93987: ** while this routine is running. Hence, we do not need to hold
93988: ** locks on the schema, we just need to make sure nobody else is
93989: ** holding them.
93990: **
93991: ** Note that setting READ_UNCOMMITTED overrides most lock detection,
93992: ** but it does *not* override schema lock detection, so this all still
93993: ** works even if READ_UNCOMMITTED is set.
93994: */
93995: for(i=0; i<db->nDb; i++) {
93996: Btree *pBt = db->aDb[i].pBt;
93997: if( pBt ){
93998: assert( sqlite3BtreeHoldsMutex(pBt) );
93999: rc = sqlite3BtreeSchemaLocked(pBt);
94000: if( rc ){
94001: const char *zDb = db->aDb[i].zName;
94002: sqlite3Error(db, rc, "database schema is locked: %s", zDb);
94003: testcase( db->flags & SQLITE_ReadUncommitted );
94004: goto end_prepare;
94005: }
94006: }
94007: }
94008:
94009: sqlite3VtabUnlockList(db);
94010:
94011: pParse->db = db;
94012: pParse->nQueryLoop = (double)1;
94013: if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){
94014: char *zSqlCopy;
94015: int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
94016: testcase( nBytes==mxLen );
94017: testcase( nBytes==mxLen+1 );
94018: if( nBytes>mxLen ){
94019: sqlite3Error(db, SQLITE_TOOBIG, "statement too long");
94020: rc = sqlite3ApiExit(db, SQLITE_TOOBIG);
94021: goto end_prepare;
94022: }
94023: zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes);
94024: if( zSqlCopy ){
94025: sqlite3RunParser(pParse, zSqlCopy, &zErrMsg);
94026: sqlite3DbFree(db, zSqlCopy);
94027: pParse->zTail = &zSql[pParse->zTail-zSqlCopy];
94028: }else{
94029: pParse->zTail = &zSql[nBytes];
94030: }
94031: }else{
94032: sqlite3RunParser(pParse, zSql, &zErrMsg);
94033: }
94034: assert( 1==(int)pParse->nQueryLoop );
94035:
94036: if( db->mallocFailed ){
94037: pParse->rc = SQLITE_NOMEM;
94038: }
94039: if( pParse->rc==SQLITE_DONE ) pParse->rc = SQLITE_OK;
94040: if( pParse->checkSchema ){
94041: schemaIsValid(pParse);
94042: }
94043: if( db->mallocFailed ){
94044: pParse->rc = SQLITE_NOMEM;
94045: }
94046: if( pzTail ){
94047: *pzTail = pParse->zTail;
94048: }
94049: rc = pParse->rc;
94050:
94051: #ifndef SQLITE_OMIT_EXPLAIN
94052: if( rc==SQLITE_OK && pParse->pVdbe && pParse->explain ){
94053: static const char * const azColName[] = {
94054: "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment",
94055: "selectid", "order", "from", "detail"
94056: };
94057: int iFirst, mx;
94058: if( pParse->explain==2 ){
94059: sqlite3VdbeSetNumCols(pParse->pVdbe, 4);
94060: iFirst = 8;
94061: mx = 12;
94062: }else{
94063: sqlite3VdbeSetNumCols(pParse->pVdbe, 8);
94064: iFirst = 0;
94065: mx = 8;
94066: }
94067: for(i=iFirst; i<mx; i++){
94068: sqlite3VdbeSetColName(pParse->pVdbe, i-iFirst, COLNAME_NAME,
94069: azColName[i], SQLITE_STATIC);
94070: }
94071: }
94072: #endif
94073:
94074: assert( db->init.busy==0 || saveSqlFlag==0 );
94075: if( db->init.busy==0 ){
94076: Vdbe *pVdbe = pParse->pVdbe;
94077: sqlite3VdbeSetSql(pVdbe, zSql, (int)(pParse->zTail-zSql), saveSqlFlag);
94078: }
94079: if( pParse->pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){
94080: sqlite3VdbeFinalize(pParse->pVdbe);
94081: assert(!(*ppStmt));
94082: }else{
94083: *ppStmt = (sqlite3_stmt*)pParse->pVdbe;
94084: }
94085:
94086: if( zErrMsg ){
94087: sqlite3Error(db, rc, "%s", zErrMsg);
94088: sqlite3DbFree(db, zErrMsg);
94089: }else{
94090: sqlite3Error(db, rc, 0);
94091: }
94092:
94093: /* Delete any TriggerPrg structures allocated while parsing this statement. */
94094: while( pParse->pTriggerPrg ){
94095: TriggerPrg *pT = pParse->pTriggerPrg;
94096: pParse->pTriggerPrg = pT->pNext;
94097: sqlite3DbFree(db, pT);
94098: }
94099:
94100: end_prepare:
94101:
94102: sqlite3StackFree(db, pParse);
94103: rc = sqlite3ApiExit(db, rc);
94104: assert( (rc&db->errMask)==rc );
94105: return rc;
94106: }
94107: static int sqlite3LockAndPrepare(
94108: sqlite3 *db, /* Database handle. */
94109: const char *zSql, /* UTF-8 encoded SQL statement. */
94110: int nBytes, /* Length of zSql in bytes. */
94111: int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */
94112: Vdbe *pOld, /* VM being reprepared */
94113: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94114: const char **pzTail /* OUT: End of parsed string */
94115: ){
94116: int rc;
94117: assert( ppStmt!=0 );
94118: *ppStmt = 0;
94119: if( !sqlite3SafetyCheckOk(db) ){
94120: return SQLITE_MISUSE_BKPT;
94121: }
94122: sqlite3_mutex_enter(db->mutex);
94123: sqlite3BtreeEnterAll(db);
94124: rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail);
94125: if( rc==SQLITE_SCHEMA ){
94126: sqlite3_finalize(*ppStmt);
94127: rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail);
94128: }
94129: sqlite3BtreeLeaveAll(db);
94130: sqlite3_mutex_leave(db->mutex);
1.2.2.1 ! misho 94131: assert( rc==SQLITE_OK || *ppStmt==0 );
1.2 misho 94132: return rc;
94133: }
94134:
94135: /*
94136: ** Rerun the compilation of a statement after a schema change.
94137: **
94138: ** If the statement is successfully recompiled, return SQLITE_OK. Otherwise,
94139: ** if the statement cannot be recompiled because another connection has
94140: ** locked the sqlite3_master table, return SQLITE_LOCKED. If any other error
94141: ** occurs, return SQLITE_SCHEMA.
94142: */
94143: SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){
94144: int rc;
94145: sqlite3_stmt *pNew;
94146: const char *zSql;
94147: sqlite3 *db;
94148:
94149: assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) );
94150: zSql = sqlite3_sql((sqlite3_stmt *)p);
94151: assert( zSql!=0 ); /* Reprepare only called for prepare_v2() statements */
94152: db = sqlite3VdbeDb(p);
94153: assert( sqlite3_mutex_held(db->mutex) );
94154: rc = sqlite3LockAndPrepare(db, zSql, -1, 0, p, &pNew, 0);
94155: if( rc ){
94156: if( rc==SQLITE_NOMEM ){
94157: db->mallocFailed = 1;
94158: }
94159: assert( pNew==0 );
94160: return rc;
94161: }else{
94162: assert( pNew!=0 );
94163: }
94164: sqlite3VdbeSwap((Vdbe*)pNew, p);
94165: sqlite3TransferBindings(pNew, (sqlite3_stmt*)p);
94166: sqlite3VdbeResetStepResult((Vdbe*)pNew);
94167: sqlite3VdbeFinalize((Vdbe*)pNew);
94168: return SQLITE_OK;
94169: }
94170:
94171:
94172: /*
94173: ** Two versions of the official API. Legacy and new use. In the legacy
94174: ** version, the original SQL text is not saved in the prepared statement
94175: ** and so if a schema change occurs, SQLITE_SCHEMA is returned by
94176: ** sqlite3_step(). In the new version, the original SQL text is retained
94177: ** and the statement is automatically recompiled if an schema change
94178: ** occurs.
94179: */
94180: SQLITE_API int sqlite3_prepare(
94181: sqlite3 *db, /* Database handle. */
94182: const char *zSql, /* UTF-8 encoded SQL statement. */
94183: int nBytes, /* Length of zSql in bytes. */
94184: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94185: const char **pzTail /* OUT: End of parsed string */
94186: ){
94187: int rc;
94188: rc = sqlite3LockAndPrepare(db,zSql,nBytes,0,0,ppStmt,pzTail);
94189: assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
94190: return rc;
94191: }
94192: SQLITE_API int sqlite3_prepare_v2(
94193: sqlite3 *db, /* Database handle. */
94194: const char *zSql, /* UTF-8 encoded SQL statement. */
94195: int nBytes, /* Length of zSql in bytes. */
94196: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94197: const char **pzTail /* OUT: End of parsed string */
94198: ){
94199: int rc;
94200: rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,0,ppStmt,pzTail);
94201: assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
94202: return rc;
94203: }
94204:
94205:
94206: #ifndef SQLITE_OMIT_UTF16
94207: /*
94208: ** Compile the UTF-16 encoded SQL statement zSql into a statement handle.
94209: */
94210: static int sqlite3Prepare16(
94211: sqlite3 *db, /* Database handle. */
94212: const void *zSql, /* UTF-16 encoded SQL statement. */
94213: int nBytes, /* Length of zSql in bytes. */
94214: int saveSqlFlag, /* True to save SQL text into the sqlite3_stmt */
94215: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94216: const void **pzTail /* OUT: End of parsed string */
94217: ){
94218: /* This function currently works by first transforming the UTF-16
94219: ** encoded string to UTF-8, then invoking sqlite3_prepare(). The
94220: ** tricky bit is figuring out the pointer to return in *pzTail.
94221: */
94222: char *zSql8;
94223: const char *zTail8 = 0;
94224: int rc = SQLITE_OK;
94225:
94226: assert( ppStmt );
94227: *ppStmt = 0;
94228: if( !sqlite3SafetyCheckOk(db) ){
94229: return SQLITE_MISUSE_BKPT;
94230: }
94231: sqlite3_mutex_enter(db->mutex);
94232: zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE);
94233: if( zSql8 ){
94234: rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, 0, ppStmt, &zTail8);
94235: }
94236:
94237: if( zTail8 && pzTail ){
94238: /* If sqlite3_prepare returns a tail pointer, we calculate the
94239: ** equivalent pointer into the UTF-16 string by counting the unicode
94240: ** characters between zSql8 and zTail8, and then returning a pointer
94241: ** the same number of characters into the UTF-16 string.
94242: */
94243: int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8));
94244: *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed);
94245: }
94246: sqlite3DbFree(db, zSql8);
94247: rc = sqlite3ApiExit(db, rc);
94248: sqlite3_mutex_leave(db->mutex);
94249: return rc;
94250: }
94251:
94252: /*
94253: ** Two versions of the official API. Legacy and new use. In the legacy
94254: ** version, the original SQL text is not saved in the prepared statement
94255: ** and so if a schema change occurs, SQLITE_SCHEMA is returned by
94256: ** sqlite3_step(). In the new version, the original SQL text is retained
94257: ** and the statement is automatically recompiled if an schema change
94258: ** occurs.
94259: */
94260: SQLITE_API int sqlite3_prepare16(
94261: sqlite3 *db, /* Database handle. */
94262: const void *zSql, /* UTF-16 encoded SQL statement. */
94263: int nBytes, /* Length of zSql in bytes. */
94264: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94265: const void **pzTail /* OUT: End of parsed string */
94266: ){
94267: int rc;
94268: rc = sqlite3Prepare16(db,zSql,nBytes,0,ppStmt,pzTail);
94269: assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
94270: return rc;
94271: }
94272: SQLITE_API int sqlite3_prepare16_v2(
94273: sqlite3 *db, /* Database handle. */
94274: const void *zSql, /* UTF-16 encoded SQL statement. */
94275: int nBytes, /* Length of zSql in bytes. */
94276: sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */
94277: const void **pzTail /* OUT: End of parsed string */
94278: ){
94279: int rc;
94280: rc = sqlite3Prepare16(db,zSql,nBytes,1,ppStmt,pzTail);
94281: assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */
94282: return rc;
94283: }
94284:
94285: #endif /* SQLITE_OMIT_UTF16 */
94286:
94287: /************** End of prepare.c *********************************************/
94288: /************** Begin file select.c ******************************************/
94289: /*
94290: ** 2001 September 15
94291: **
94292: ** The author disclaims copyright to this source code. In place of
94293: ** a legal notice, here is a blessing:
94294: **
94295: ** May you do good and not evil.
94296: ** May you find forgiveness for yourself and forgive others.
94297: ** May you share freely, never taking more than you give.
94298: **
94299: *************************************************************************
94300: ** This file contains C code routines that are called by the parser
94301: ** to handle SELECT statements in SQLite.
94302: */
94303:
94304:
94305: /*
94306: ** Delete all the content of a Select structure but do not deallocate
94307: ** the select structure itself.
94308: */
94309: static void clearSelect(sqlite3 *db, Select *p){
94310: sqlite3ExprListDelete(db, p->pEList);
94311: sqlite3SrcListDelete(db, p->pSrc);
94312: sqlite3ExprDelete(db, p->pWhere);
94313: sqlite3ExprListDelete(db, p->pGroupBy);
94314: sqlite3ExprDelete(db, p->pHaving);
94315: sqlite3ExprListDelete(db, p->pOrderBy);
94316: sqlite3SelectDelete(db, p->pPrior);
94317: sqlite3ExprDelete(db, p->pLimit);
94318: sqlite3ExprDelete(db, p->pOffset);
94319: }
94320:
94321: /*
94322: ** Initialize a SelectDest structure.
94323: */
94324: SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){
94325: pDest->eDest = (u8)eDest;
1.2.2.1 ! misho 94326: pDest->iSDParm = iParm;
! 94327: pDest->affSdst = 0;
! 94328: pDest->iSdst = 0;
! 94329: pDest->nSdst = 0;
1.2 misho 94330: }
94331:
94332:
94333: /*
94334: ** Allocate a new Select structure and return a pointer to that
94335: ** structure.
94336: */
94337: SQLITE_PRIVATE Select *sqlite3SelectNew(
94338: Parse *pParse, /* Parsing context */
94339: ExprList *pEList, /* which columns to include in the result */
94340: SrcList *pSrc, /* the FROM clause -- which tables to scan */
94341: Expr *pWhere, /* the WHERE clause */
94342: ExprList *pGroupBy, /* the GROUP BY clause */
94343: Expr *pHaving, /* the HAVING clause */
94344: ExprList *pOrderBy, /* the ORDER BY clause */
94345: int isDistinct, /* true if the DISTINCT keyword is present */
94346: Expr *pLimit, /* LIMIT value. NULL means not used */
94347: Expr *pOffset /* OFFSET value. NULL means no offset */
94348: ){
94349: Select *pNew;
94350: Select standin;
94351: sqlite3 *db = pParse->db;
94352: pNew = sqlite3DbMallocZero(db, sizeof(*pNew) );
94353: assert( db->mallocFailed || !pOffset || pLimit ); /* OFFSET implies LIMIT */
94354: if( pNew==0 ){
94355: assert( db->mallocFailed );
94356: pNew = &standin;
94357: memset(pNew, 0, sizeof(*pNew));
94358: }
94359: if( pEList==0 ){
94360: pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0));
94361: }
94362: pNew->pEList = pEList;
1.2.2.1 ! misho 94363: if( pSrc==0 ) pSrc = sqlite3DbMallocZero(db, sizeof(*pSrc));
1.2 misho 94364: pNew->pSrc = pSrc;
94365: pNew->pWhere = pWhere;
94366: pNew->pGroupBy = pGroupBy;
94367: pNew->pHaving = pHaving;
94368: pNew->pOrderBy = pOrderBy;
94369: pNew->selFlags = isDistinct ? SF_Distinct : 0;
94370: pNew->op = TK_SELECT;
94371: pNew->pLimit = pLimit;
94372: pNew->pOffset = pOffset;
94373: assert( pOffset==0 || pLimit!=0 );
94374: pNew->addrOpenEphm[0] = -1;
94375: pNew->addrOpenEphm[1] = -1;
94376: pNew->addrOpenEphm[2] = -1;
94377: if( db->mallocFailed ) {
94378: clearSelect(db, pNew);
94379: if( pNew!=&standin ) sqlite3DbFree(db, pNew);
94380: pNew = 0;
94381: }else{
94382: assert( pNew->pSrc!=0 || pParse->nErr>0 );
94383: }
94384: assert( pNew!=&standin );
94385: return pNew;
94386: }
94387:
94388: /*
94389: ** Delete the given Select structure and all of its substructures.
94390: */
94391: SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){
94392: if( p ){
94393: clearSelect(db, p);
94394: sqlite3DbFree(db, p);
94395: }
94396: }
94397:
94398: /*
94399: ** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the
94400: ** type of join. Return an integer constant that expresses that type
94401: ** in terms of the following bit values:
94402: **
94403: ** JT_INNER
94404: ** JT_CROSS
94405: ** JT_OUTER
94406: ** JT_NATURAL
94407: ** JT_LEFT
94408: ** JT_RIGHT
94409: **
94410: ** A full outer join is the combination of JT_LEFT and JT_RIGHT.
94411: **
94412: ** If an illegal or unsupported join type is seen, then still return
94413: ** a join type, but put an error in the pParse structure.
94414: */
94415: SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){
94416: int jointype = 0;
94417: Token *apAll[3];
94418: Token *p;
94419: /* 0123456789 123456789 123456789 123 */
94420: static const char zKeyText[] = "naturaleftouterightfullinnercross";
94421: static const struct {
94422: u8 i; /* Beginning of keyword text in zKeyText[] */
94423: u8 nChar; /* Length of the keyword in characters */
94424: u8 code; /* Join type mask */
94425: } aKeyword[] = {
94426: /* natural */ { 0, 7, JT_NATURAL },
94427: /* left */ { 6, 4, JT_LEFT|JT_OUTER },
94428: /* outer */ { 10, 5, JT_OUTER },
94429: /* right */ { 14, 5, JT_RIGHT|JT_OUTER },
94430: /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER },
94431: /* inner */ { 23, 5, JT_INNER },
94432: /* cross */ { 28, 5, JT_INNER|JT_CROSS },
94433: };
94434: int i, j;
94435: apAll[0] = pA;
94436: apAll[1] = pB;
94437: apAll[2] = pC;
94438: for(i=0; i<3 && apAll[i]; i++){
94439: p = apAll[i];
94440: for(j=0; j<ArraySize(aKeyword); j++){
94441: if( p->n==aKeyword[j].nChar
94442: && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){
94443: jointype |= aKeyword[j].code;
94444: break;
94445: }
94446: }
94447: testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 );
94448: if( j>=ArraySize(aKeyword) ){
94449: jointype |= JT_ERROR;
94450: break;
94451: }
94452: }
94453: if(
94454: (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||
94455: (jointype & JT_ERROR)!=0
94456: ){
94457: const char *zSp = " ";
94458: assert( pB!=0 );
94459: if( pC==0 ){ zSp++; }
94460: sqlite3ErrorMsg(pParse, "unknown or unsupported join type: "
94461: "%T %T%s%T", pA, pB, zSp, pC);
94462: jointype = JT_INNER;
94463: }else if( (jointype & JT_OUTER)!=0
94464: && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){
94465: sqlite3ErrorMsg(pParse,
94466: "RIGHT and FULL OUTER JOINs are not currently supported");
94467: jointype = JT_INNER;
94468: }
94469: return jointype;
94470: }
94471:
94472: /*
94473: ** Return the index of a column in a table. Return -1 if the column
94474: ** is not contained in the table.
94475: */
94476: static int columnIndex(Table *pTab, const char *zCol){
94477: int i;
94478: for(i=0; i<pTab->nCol; i++){
94479: if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i;
94480: }
94481: return -1;
94482: }
94483:
94484: /*
94485: ** Search the first N tables in pSrc, from left to right, looking for a
94486: ** table that has a column named zCol.
94487: **
94488: ** When found, set *piTab and *piCol to the table index and column index
94489: ** of the matching column and return TRUE.
94490: **
94491: ** If not found, return FALSE.
94492: */
94493: static int tableAndColumnIndex(
94494: SrcList *pSrc, /* Array of tables to search */
94495: int N, /* Number of tables in pSrc->a[] to search */
94496: const char *zCol, /* Name of the column we are looking for */
94497: int *piTab, /* Write index of pSrc->a[] here */
94498: int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */
94499: ){
94500: int i; /* For looping over tables in pSrc */
94501: int iCol; /* Index of column matching zCol */
94502:
94503: assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */
94504: for(i=0; i<N; i++){
94505: iCol = columnIndex(pSrc->a[i].pTab, zCol);
94506: if( iCol>=0 ){
94507: if( piTab ){
94508: *piTab = i;
94509: *piCol = iCol;
94510: }
94511: return 1;
94512: }
94513: }
94514: return 0;
94515: }
94516:
94517: /*
94518: ** This function is used to add terms implied by JOIN syntax to the
94519: ** WHERE clause expression of a SELECT statement. The new term, which
94520: ** is ANDed with the existing WHERE clause, is of the form:
94521: **
94522: ** (tab1.col1 = tab2.col2)
94523: **
94524: ** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the
94525: ** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is
94526: ** column iColRight of tab2.
94527: */
94528: static void addWhereTerm(
94529: Parse *pParse, /* Parsing context */
94530: SrcList *pSrc, /* List of tables in FROM clause */
94531: int iLeft, /* Index of first table to join in pSrc */
94532: int iColLeft, /* Index of column in first table */
94533: int iRight, /* Index of second table in pSrc */
94534: int iColRight, /* Index of column in second table */
94535: int isOuterJoin, /* True if this is an OUTER join */
94536: Expr **ppWhere /* IN/OUT: The WHERE clause to add to */
94537: ){
94538: sqlite3 *db = pParse->db;
94539: Expr *pE1;
94540: Expr *pE2;
94541: Expr *pEq;
94542:
94543: assert( iLeft<iRight );
94544: assert( pSrc->nSrc>iRight );
94545: assert( pSrc->a[iLeft].pTab );
94546: assert( pSrc->a[iRight].pTab );
94547:
94548: pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft);
94549: pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight);
94550:
94551: pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2, 0);
94552: if( pEq && isOuterJoin ){
94553: ExprSetProperty(pEq, EP_FromJoin);
94554: assert( !ExprHasAnyProperty(pEq, EP_TokenOnly|EP_Reduced) );
94555: ExprSetIrreducible(pEq);
94556: pEq->iRightJoinTable = (i16)pE2->iTable;
94557: }
94558: *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq);
94559: }
94560:
94561: /*
94562: ** Set the EP_FromJoin property on all terms of the given expression.
94563: ** And set the Expr.iRightJoinTable to iTable for every term in the
94564: ** expression.
94565: **
94566: ** The EP_FromJoin property is used on terms of an expression to tell
94567: ** the LEFT OUTER JOIN processing logic that this term is part of the
94568: ** join restriction specified in the ON or USING clause and not a part
94569: ** of the more general WHERE clause. These terms are moved over to the
94570: ** WHERE clause during join processing but we need to remember that they
94571: ** originated in the ON or USING clause.
94572: **
94573: ** The Expr.iRightJoinTable tells the WHERE clause processing that the
94574: ** expression depends on table iRightJoinTable even if that table is not
94575: ** explicitly mentioned in the expression. That information is needed
94576: ** for cases like this:
94577: **
94578: ** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5
94579: **
94580: ** The where clause needs to defer the handling of the t1.x=5
94581: ** term until after the t2 loop of the join. In that way, a
94582: ** NULL t2 row will be inserted whenever t1.x!=5. If we do not
94583: ** defer the handling of t1.x=5, it will be processed immediately
94584: ** after the t1 loop and rows with t1.x!=5 will never appear in
94585: ** the output, which is incorrect.
94586: */
94587: static void setJoinExpr(Expr *p, int iTable){
94588: while( p ){
94589: ExprSetProperty(p, EP_FromJoin);
94590: assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) );
94591: ExprSetIrreducible(p);
94592: p->iRightJoinTable = (i16)iTable;
94593: setJoinExpr(p->pLeft, iTable);
94594: p = p->pRight;
94595: }
94596: }
94597:
94598: /*
94599: ** This routine processes the join information for a SELECT statement.
94600: ** ON and USING clauses are converted into extra terms of the WHERE clause.
94601: ** NATURAL joins also create extra WHERE clause terms.
94602: **
94603: ** The terms of a FROM clause are contained in the Select.pSrc structure.
94604: ** The left most table is the first entry in Select.pSrc. The right-most
94605: ** table is the last entry. The join operator is held in the entry to
94606: ** the left. Thus entry 0 contains the join operator for the join between
94607: ** entries 0 and 1. Any ON or USING clauses associated with the join are
94608: ** also attached to the left entry.
94609: **
94610: ** This routine returns the number of errors encountered.
94611: */
94612: static int sqliteProcessJoin(Parse *pParse, Select *p){
94613: SrcList *pSrc; /* All tables in the FROM clause */
94614: int i, j; /* Loop counters */
94615: struct SrcList_item *pLeft; /* Left table being joined */
94616: struct SrcList_item *pRight; /* Right table being joined */
94617:
94618: pSrc = p->pSrc;
94619: pLeft = &pSrc->a[0];
94620: pRight = &pLeft[1];
94621: for(i=0; i<pSrc->nSrc-1; i++, pRight++, pLeft++){
94622: Table *pLeftTab = pLeft->pTab;
94623: Table *pRightTab = pRight->pTab;
94624: int isOuter;
94625:
94626: if( NEVER(pLeftTab==0 || pRightTab==0) ) continue;
94627: isOuter = (pRight->jointype & JT_OUTER)!=0;
94628:
94629: /* When the NATURAL keyword is present, add WHERE clause terms for
94630: ** every column that the two tables have in common.
94631: */
94632: if( pRight->jointype & JT_NATURAL ){
94633: if( pRight->pOn || pRight->pUsing ){
94634: sqlite3ErrorMsg(pParse, "a NATURAL join may not have "
94635: "an ON or USING clause", 0);
94636: return 1;
94637: }
94638: for(j=0; j<pRightTab->nCol; j++){
94639: char *zName; /* Name of column in the right table */
94640: int iLeft; /* Matching left table */
94641: int iLeftCol; /* Matching column in the left table */
94642:
94643: zName = pRightTab->aCol[j].zName;
94644: if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){
94645: addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j,
94646: isOuter, &p->pWhere);
94647: }
94648: }
94649: }
94650:
94651: /* Disallow both ON and USING clauses in the same join
94652: */
94653: if( pRight->pOn && pRight->pUsing ){
94654: sqlite3ErrorMsg(pParse, "cannot have both ON and USING "
94655: "clauses in the same join");
94656: return 1;
94657: }
94658:
94659: /* Add the ON clause to the end of the WHERE clause, connected by
94660: ** an AND operator.
94661: */
94662: if( pRight->pOn ){
94663: if( isOuter ) setJoinExpr(pRight->pOn, pRight->iCursor);
94664: p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn);
94665: pRight->pOn = 0;
94666: }
94667:
94668: /* Create extra terms on the WHERE clause for each column named
94669: ** in the USING clause. Example: If the two tables to be joined are
94670: ** A and B and the USING clause names X, Y, and Z, then add this
94671: ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z
94672: ** Report an error if any column mentioned in the USING clause is
94673: ** not contained in both tables to be joined.
94674: */
94675: if( pRight->pUsing ){
94676: IdList *pList = pRight->pUsing;
94677: for(j=0; j<pList->nId; j++){
94678: char *zName; /* Name of the term in the USING clause */
94679: int iLeft; /* Table on the left with matching column name */
94680: int iLeftCol; /* Column number of matching column on the left */
94681: int iRightCol; /* Column number of matching column on the right */
94682:
94683: zName = pList->a[j].zName;
94684: iRightCol = columnIndex(pRightTab, zName);
94685: if( iRightCol<0
94686: || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol)
94687: ){
94688: sqlite3ErrorMsg(pParse, "cannot join using column %s - column "
94689: "not present in both tables", zName);
94690: return 1;
94691: }
94692: addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol,
94693: isOuter, &p->pWhere);
94694: }
94695: }
94696: }
94697: return 0;
94698: }
94699:
94700: /*
94701: ** Insert code into "v" that will push the record on the top of the
94702: ** stack into the sorter.
94703: */
94704: static void pushOntoSorter(
94705: Parse *pParse, /* Parser context */
94706: ExprList *pOrderBy, /* The ORDER BY clause */
94707: Select *pSelect, /* The whole SELECT statement */
94708: int regData /* Register holding data to be sorted */
94709: ){
94710: Vdbe *v = pParse->pVdbe;
94711: int nExpr = pOrderBy->nExpr;
94712: int regBase = sqlite3GetTempRange(pParse, nExpr+2);
94713: int regRecord = sqlite3GetTempReg(pParse);
94714: int op;
94715: sqlite3ExprCacheClear(pParse);
94716: sqlite3ExprCodeExprList(pParse, pOrderBy, regBase, 0);
94717: sqlite3VdbeAddOp2(v, OP_Sequence, pOrderBy->iECursor, regBase+nExpr);
94718: sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+1, 1);
94719: sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nExpr + 2, regRecord);
94720: if( pSelect->selFlags & SF_UseSorter ){
94721: op = OP_SorterInsert;
94722: }else{
94723: op = OP_IdxInsert;
94724: }
94725: sqlite3VdbeAddOp2(v, op, pOrderBy->iECursor, regRecord);
94726: sqlite3ReleaseTempReg(pParse, regRecord);
94727: sqlite3ReleaseTempRange(pParse, regBase, nExpr+2);
94728: if( pSelect->iLimit ){
94729: int addr1, addr2;
94730: int iLimit;
94731: if( pSelect->iOffset ){
94732: iLimit = pSelect->iOffset+1;
94733: }else{
94734: iLimit = pSelect->iLimit;
94735: }
94736: addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit);
94737: sqlite3VdbeAddOp2(v, OP_AddImm, iLimit, -1);
94738: addr2 = sqlite3VdbeAddOp0(v, OP_Goto);
94739: sqlite3VdbeJumpHere(v, addr1);
94740: sqlite3VdbeAddOp1(v, OP_Last, pOrderBy->iECursor);
94741: sqlite3VdbeAddOp1(v, OP_Delete, pOrderBy->iECursor);
94742: sqlite3VdbeJumpHere(v, addr2);
94743: }
94744: }
94745:
94746: /*
94747: ** Add code to implement the OFFSET
94748: */
94749: static void codeOffset(
94750: Vdbe *v, /* Generate code into this VM */
94751: Select *p, /* The SELECT statement being coded */
94752: int iContinue /* Jump here to skip the current record */
94753: ){
94754: if( p->iOffset && iContinue!=0 ){
94755: int addr;
94756: sqlite3VdbeAddOp2(v, OP_AddImm, p->iOffset, -1);
94757: addr = sqlite3VdbeAddOp1(v, OP_IfNeg, p->iOffset);
94758: sqlite3VdbeAddOp2(v, OP_Goto, 0, iContinue);
94759: VdbeComment((v, "skip OFFSET records"));
94760: sqlite3VdbeJumpHere(v, addr);
94761: }
94762: }
94763:
94764: /*
94765: ** Add code that will check to make sure the N registers starting at iMem
94766: ** form a distinct entry. iTab is a sorting index that holds previously
94767: ** seen combinations of the N values. A new entry is made in iTab
94768: ** if the current N values are new.
94769: **
94770: ** A jump to addrRepeat is made and the N+1 values are popped from the
94771: ** stack if the top N elements are not distinct.
94772: */
94773: static void codeDistinct(
94774: Parse *pParse, /* Parsing and code generating context */
94775: int iTab, /* A sorting index used to test for distinctness */
94776: int addrRepeat, /* Jump to here if not distinct */
94777: int N, /* Number of elements */
94778: int iMem /* First element */
94779: ){
94780: Vdbe *v;
94781: int r1;
94782:
94783: v = pParse->pVdbe;
94784: r1 = sqlite3GetTempReg(pParse);
94785: sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N);
94786: sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1);
94787: sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1);
94788: sqlite3ReleaseTempReg(pParse, r1);
94789: }
94790:
94791: #ifndef SQLITE_OMIT_SUBQUERY
94792: /*
94793: ** Generate an error message when a SELECT is used within a subexpression
94794: ** (example: "a IN (SELECT * FROM table)") but it has more than 1 result
94795: ** column. We do this in a subroutine because the error used to occur
94796: ** in multiple places. (The error only occurs in one place now, but we
94797: ** retain the subroutine to minimize code disruption.)
94798: */
94799: static int checkForMultiColumnSelectError(
94800: Parse *pParse, /* Parse context. */
94801: SelectDest *pDest, /* Destination of SELECT results */
94802: int nExpr /* Number of result columns returned by SELECT */
94803: ){
94804: int eDest = pDest->eDest;
94805: if( nExpr>1 && (eDest==SRT_Mem || eDest==SRT_Set) ){
94806: sqlite3ErrorMsg(pParse, "only a single result allowed for "
94807: "a SELECT that is part of an expression");
94808: return 1;
94809: }else{
94810: return 0;
94811: }
94812: }
94813: #endif
94814:
94815: /*
1.2.2.1 ! misho 94816: ** An instance of the following object is used to record information about
! 94817: ** how to process the DISTINCT keyword, to simplify passing that information
! 94818: ** into the selectInnerLoop() routine.
! 94819: */
! 94820: typedef struct DistinctCtx DistinctCtx;
! 94821: struct DistinctCtx {
! 94822: u8 isTnct; /* True if the DISTINCT keyword is present */
! 94823: u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */
! 94824: int tabTnct; /* Ephemeral table used for DISTINCT processing */
! 94825: int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */
! 94826: };
! 94827:
! 94828: /*
1.2 misho 94829: ** This routine generates the code for the inside of the inner loop
94830: ** of a SELECT.
94831: **
94832: ** If srcTab and nColumn are both zero, then the pEList expressions
94833: ** are evaluated in order to get the data for this row. If nColumn>0
94834: ** then data is pulled from srcTab and pEList is used only to get the
94835: ** datatypes for each column.
94836: */
94837: static void selectInnerLoop(
94838: Parse *pParse, /* The parser context */
94839: Select *p, /* The complete select statement being coded */
94840: ExprList *pEList, /* List of values being extracted */
94841: int srcTab, /* Pull data from this table */
94842: int nColumn, /* Number of columns in the source table */
94843: ExprList *pOrderBy, /* If not NULL, sort results using this key */
1.2.2.1 ! misho 94844: DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */
1.2 misho 94845: SelectDest *pDest, /* How to dispose of the results */
94846: int iContinue, /* Jump here to continue with next row */
94847: int iBreak /* Jump here to break out of the inner loop */
94848: ){
94849: Vdbe *v = pParse->pVdbe;
94850: int i;
94851: int hasDistinct; /* True if the DISTINCT keyword is present */
94852: int regResult; /* Start of memory holding result set */
94853: int eDest = pDest->eDest; /* How to dispose of results */
1.2.2.1 ! misho 94854: int iParm = pDest->iSDParm; /* First argument to disposal method */
1.2 misho 94855: int nResultCol; /* Number of result columns */
94856:
94857: assert( v );
94858: if( NEVER(v==0) ) return;
94859: assert( pEList!=0 );
1.2.2.1 ! misho 94860: hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP;
1.2 misho 94861: if( pOrderBy==0 && !hasDistinct ){
94862: codeOffset(v, p, iContinue);
94863: }
94864:
94865: /* Pull the requested columns.
94866: */
94867: if( nColumn>0 ){
94868: nResultCol = nColumn;
94869: }else{
94870: nResultCol = pEList->nExpr;
94871: }
1.2.2.1 ! misho 94872: if( pDest->iSdst==0 ){
! 94873: pDest->iSdst = pParse->nMem+1;
! 94874: pDest->nSdst = nResultCol;
1.2 misho 94875: pParse->nMem += nResultCol;
94876: }else{
1.2.2.1 ! misho 94877: assert( pDest->nSdst==nResultCol );
1.2 misho 94878: }
1.2.2.1 ! misho 94879: regResult = pDest->iSdst;
1.2 misho 94880: if( nColumn>0 ){
94881: for(i=0; i<nColumn; i++){
94882: sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult+i);
94883: }
94884: }else if( eDest!=SRT_Exists ){
94885: /* If the destination is an EXISTS(...) expression, the actual
94886: ** values returned by the SELECT are not required.
94887: */
94888: sqlite3ExprCacheClear(pParse);
94889: sqlite3ExprCodeExprList(pParse, pEList, regResult, eDest==SRT_Output);
94890: }
94891: nColumn = nResultCol;
94892:
94893: /* If the DISTINCT keyword was present on the SELECT statement
94894: ** and this row has been seen before, then do not make this row
94895: ** part of the result.
94896: */
94897: if( hasDistinct ){
94898: assert( pEList!=0 );
94899: assert( pEList->nExpr==nColumn );
1.2.2.1 ! misho 94900: switch( pDistinct->eTnctType ){
! 94901: case WHERE_DISTINCT_ORDERED: {
! 94902: VdbeOp *pOp; /* No longer required OpenEphemeral instr. */
! 94903: int iJump; /* Jump destination */
! 94904: int regPrev; /* Previous row content */
! 94905:
! 94906: /* Allocate space for the previous row */
! 94907: regPrev = pParse->nMem+1;
! 94908: pParse->nMem += nColumn;
! 94909:
! 94910: /* Change the OP_OpenEphemeral coded earlier to an OP_Null
! 94911: ** sets the MEM_Cleared bit on the first register of the
! 94912: ** previous value. This will cause the OP_Ne below to always
! 94913: ** fail on the first iteration of the loop even if the first
! 94914: ** row is all NULLs.
! 94915: */
! 94916: sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct);
! 94917: pOp = sqlite3VdbeGetOp(v, pDistinct->addrTnct);
! 94918: pOp->opcode = OP_Null;
! 94919: pOp->p1 = 1;
! 94920: pOp->p2 = regPrev;
! 94921:
! 94922: iJump = sqlite3VdbeCurrentAddr(v) + nColumn;
! 94923: for(i=0; i<nColumn; i++){
! 94924: CollSeq *pColl = sqlite3ExprCollSeq(pParse, pEList->a[i].pExpr);
! 94925: if( i<nColumn-1 ){
! 94926: sqlite3VdbeAddOp3(v, OP_Ne, regResult+i, iJump, regPrev+i);
! 94927: }else{
! 94928: sqlite3VdbeAddOp3(v, OP_Eq, regResult+i, iContinue, regPrev+i);
! 94929: }
! 94930: sqlite3VdbeChangeP4(v, -1, (const char *)pColl, P4_COLLSEQ);
! 94931: sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
! 94932: }
! 94933: assert( sqlite3VdbeCurrentAddr(v)==iJump );
! 94934: sqlite3VdbeAddOp3(v, OP_Copy, regResult, regPrev, nColumn-1);
! 94935: break;
! 94936: }
! 94937:
! 94938: case WHERE_DISTINCT_UNIQUE: {
! 94939: sqlite3VdbeChangeToNoop(v, pDistinct->addrTnct);
! 94940: break;
! 94941: }
! 94942:
! 94943: default: {
! 94944: assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED );
! 94945: codeDistinct(pParse, pDistinct->tabTnct, iContinue, nColumn, regResult);
! 94946: break;
! 94947: }
! 94948: }
1.2 misho 94949: if( pOrderBy==0 ){
94950: codeOffset(v, p, iContinue);
94951: }
94952: }
94953:
94954: switch( eDest ){
94955: /* In this mode, write each query result to the key of the temporary
94956: ** table iParm.
94957: */
94958: #ifndef SQLITE_OMIT_COMPOUND_SELECT
94959: case SRT_Union: {
94960: int r1;
94961: r1 = sqlite3GetTempReg(pParse);
94962: sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
94963: sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1);
94964: sqlite3ReleaseTempReg(pParse, r1);
94965: break;
94966: }
94967:
94968: /* Construct a record from the query result, but instead of
94969: ** saving that record, use it as a key to delete elements from
94970: ** the temporary table iParm.
94971: */
94972: case SRT_Except: {
94973: sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nColumn);
94974: break;
94975: }
94976: #endif
94977:
94978: /* Store the result as data using a unique key.
94979: */
94980: case SRT_Table:
94981: case SRT_EphemTab: {
94982: int r1 = sqlite3GetTempReg(pParse);
94983: testcase( eDest==SRT_Table );
94984: testcase( eDest==SRT_EphemTab );
94985: sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
94986: if( pOrderBy ){
94987: pushOntoSorter(pParse, pOrderBy, p, r1);
94988: }else{
94989: int r2 = sqlite3GetTempReg(pParse);
94990: sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2);
94991: sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2);
94992: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
94993: sqlite3ReleaseTempReg(pParse, r2);
94994: }
94995: sqlite3ReleaseTempReg(pParse, r1);
94996: break;
94997: }
94998:
94999: #ifndef SQLITE_OMIT_SUBQUERY
95000: /* If we are creating a set for an "expr IN (SELECT ...)" construct,
95001: ** then there should be a single item on the stack. Write this
95002: ** item into the set table with bogus data.
95003: */
95004: case SRT_Set: {
95005: assert( nColumn==1 );
1.2.2.1 ! misho 95006: pDest->affSdst =
! 95007: sqlite3CompareAffinity(pEList->a[0].pExpr, pDest->affSdst);
1.2 misho 95008: if( pOrderBy ){
95009: /* At first glance you would think we could optimize out the
95010: ** ORDER BY in this case since the order of entries in the set
95011: ** does not matter. But there might be a LIMIT clause, in which
95012: ** case the order does matter */
95013: pushOntoSorter(pParse, pOrderBy, p, regResult);
95014: }else{
95015: int r1 = sqlite3GetTempReg(pParse);
1.2.2.1 ! misho 95016: sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult,1,r1, &pDest->affSdst, 1);
1.2 misho 95017: sqlite3ExprCacheAffinityChange(pParse, regResult, 1);
95018: sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1);
95019: sqlite3ReleaseTempReg(pParse, r1);
95020: }
95021: break;
95022: }
95023:
95024: /* If any row exist in the result set, record that fact and abort.
95025: */
95026: case SRT_Exists: {
95027: sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm);
95028: /* The LIMIT clause will terminate the loop for us */
95029: break;
95030: }
95031:
95032: /* If this is a scalar select that is part of an expression, then
95033: ** store the results in the appropriate memory cell and break out
95034: ** of the scan loop.
95035: */
95036: case SRT_Mem: {
95037: assert( nColumn==1 );
95038: if( pOrderBy ){
95039: pushOntoSorter(pParse, pOrderBy, p, regResult);
95040: }else{
95041: sqlite3ExprCodeMove(pParse, regResult, iParm, 1);
95042: /* The LIMIT clause will jump out of the loop for us */
95043: }
95044: break;
95045: }
95046: #endif /* #ifndef SQLITE_OMIT_SUBQUERY */
95047:
95048: /* Send the data to the callback function or to a subroutine. In the
95049: ** case of a subroutine, the subroutine itself is responsible for
95050: ** popping the data from the stack.
95051: */
95052: case SRT_Coroutine:
95053: case SRT_Output: {
95054: testcase( eDest==SRT_Coroutine );
95055: testcase( eDest==SRT_Output );
95056: if( pOrderBy ){
95057: int r1 = sqlite3GetTempReg(pParse);
95058: sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1);
95059: pushOntoSorter(pParse, pOrderBy, p, r1);
95060: sqlite3ReleaseTempReg(pParse, r1);
95061: }else if( eDest==SRT_Coroutine ){
1.2.2.1 ! misho 95062: sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);
1.2 misho 95063: }else{
95064: sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nColumn);
95065: sqlite3ExprCacheAffinityChange(pParse, regResult, nColumn);
95066: }
95067: break;
95068: }
95069:
95070: #if !defined(SQLITE_OMIT_TRIGGER)
95071: /* Discard the results. This is used for SELECT statements inside
95072: ** the body of a TRIGGER. The purpose of such selects is to call
95073: ** user-defined functions that have side effects. We do not care
95074: ** about the actual results of the select.
95075: */
95076: default: {
95077: assert( eDest==SRT_Discard );
95078: break;
95079: }
95080: #endif
95081: }
95082:
95083: /* Jump to the end of the loop if the LIMIT is reached. Except, if
95084: ** there is a sorter, in which case the sorter has already limited
95085: ** the output for us.
95086: */
95087: if( pOrderBy==0 && p->iLimit ){
95088: sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1);
95089: }
95090: }
95091:
95092: /*
95093: ** Given an expression list, generate a KeyInfo structure that records
95094: ** the collating sequence for each expression in that expression list.
95095: **
95096: ** If the ExprList is an ORDER BY or GROUP BY clause then the resulting
95097: ** KeyInfo structure is appropriate for initializing a virtual index to
95098: ** implement that clause. If the ExprList is the result set of a SELECT
95099: ** then the KeyInfo structure is appropriate for initializing a virtual
95100: ** index to implement a DISTINCT test.
95101: **
95102: ** Space to hold the KeyInfo structure is obtain from malloc. The calling
95103: ** function is responsible for seeing that this structure is eventually
95104: ** freed. Add the KeyInfo structure to the P4 field of an opcode using
95105: ** P4_KEYINFO_HANDOFF is the usual way of dealing with this.
95106: */
95107: static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){
95108: sqlite3 *db = pParse->db;
95109: int nExpr;
95110: KeyInfo *pInfo;
95111: struct ExprList_item *pItem;
95112: int i;
95113:
95114: nExpr = pList->nExpr;
95115: pInfo = sqlite3DbMallocZero(db, sizeof(*pInfo) + nExpr*(sizeof(CollSeq*)+1) );
95116: if( pInfo ){
95117: pInfo->aSortOrder = (u8*)&pInfo->aColl[nExpr];
95118: pInfo->nField = (u16)nExpr;
95119: pInfo->enc = ENC(db);
95120: pInfo->db = db;
95121: for(i=0, pItem=pList->a; i<nExpr; i++, pItem++){
95122: CollSeq *pColl;
95123: pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr);
95124: if( !pColl ){
95125: pColl = db->pDfltColl;
95126: }
95127: pInfo->aColl[i] = pColl;
95128: pInfo->aSortOrder[i] = pItem->sortOrder;
95129: }
95130: }
95131: return pInfo;
95132: }
95133:
95134: #ifndef SQLITE_OMIT_COMPOUND_SELECT
95135: /*
95136: ** Name of the connection operator, used for error messages.
95137: */
95138: static const char *selectOpName(int id){
95139: char *z;
95140: switch( id ){
95141: case TK_ALL: z = "UNION ALL"; break;
95142: case TK_INTERSECT: z = "INTERSECT"; break;
95143: case TK_EXCEPT: z = "EXCEPT"; break;
95144: default: z = "UNION"; break;
95145: }
95146: return z;
95147: }
95148: #endif /* SQLITE_OMIT_COMPOUND_SELECT */
95149:
95150: #ifndef SQLITE_OMIT_EXPLAIN
95151: /*
95152: ** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function
95153: ** is a no-op. Otherwise, it adds a single row of output to the EQP result,
95154: ** where the caption is of the form:
95155: **
95156: ** "USE TEMP B-TREE FOR xxx"
95157: **
95158: ** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which
95159: ** is determined by the zUsage argument.
95160: */
95161: static void explainTempTable(Parse *pParse, const char *zUsage){
95162: if( pParse->explain==2 ){
95163: Vdbe *v = pParse->pVdbe;
95164: char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage);
95165: sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
95166: }
95167: }
95168:
95169: /*
95170: ** Assign expression b to lvalue a. A second, no-op, version of this macro
95171: ** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code
95172: ** in sqlite3Select() to assign values to structure member variables that
95173: ** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the
95174: ** code with #ifndef directives.
95175: */
95176: # define explainSetInteger(a, b) a = b
95177:
95178: #else
95179: /* No-op versions of the explainXXX() functions and macros. */
95180: # define explainTempTable(y,z)
95181: # define explainSetInteger(y,z)
95182: #endif
95183:
95184: #if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT)
95185: /*
95186: ** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function
95187: ** is a no-op. Otherwise, it adds a single row of output to the EQP result,
95188: ** where the caption is of one of the two forms:
95189: **
95190: ** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)"
95191: ** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)"
95192: **
95193: ** where iSub1 and iSub2 are the integers passed as the corresponding
95194: ** function parameters, and op is the text representation of the parameter
95195: ** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT,
95196: ** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is
95197: ** false, or the second form if it is true.
95198: */
95199: static void explainComposite(
95200: Parse *pParse, /* Parse context */
95201: int op, /* One of TK_UNION, TK_EXCEPT etc. */
95202: int iSub1, /* Subquery id 1 */
95203: int iSub2, /* Subquery id 2 */
95204: int bUseTmp /* True if a temp table was used */
95205: ){
95206: assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL );
95207: if( pParse->explain==2 ){
95208: Vdbe *v = pParse->pVdbe;
95209: char *zMsg = sqlite3MPrintf(
95210: pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2,
95211: bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op)
95212: );
95213: sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC);
95214: }
95215: }
95216: #else
95217: /* No-op versions of the explainXXX() functions and macros. */
95218: # define explainComposite(v,w,x,y,z)
95219: #endif
95220:
95221: /*
95222: ** If the inner loop was generated using a non-null pOrderBy argument,
95223: ** then the results were placed in a sorter. After the loop is terminated
95224: ** we need to run the sorter and output the results. The following
95225: ** routine generates the code needed to do that.
95226: */
95227: static void generateSortTail(
95228: Parse *pParse, /* Parsing context */
95229: Select *p, /* The SELECT statement */
95230: Vdbe *v, /* Generate code into this VDBE */
95231: int nColumn, /* Number of columns of data */
95232: SelectDest *pDest /* Write the sorted results here */
95233: ){
95234: int addrBreak = sqlite3VdbeMakeLabel(v); /* Jump here to exit loop */
95235: int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */
95236: int addr;
95237: int iTab;
95238: int pseudoTab = 0;
95239: ExprList *pOrderBy = p->pOrderBy;
95240:
95241: int eDest = pDest->eDest;
1.2.2.1 ! misho 95242: int iParm = pDest->iSDParm;
1.2 misho 95243:
95244: int regRow;
95245: int regRowid;
95246:
95247: iTab = pOrderBy->iECursor;
95248: regRow = sqlite3GetTempReg(pParse);
95249: if( eDest==SRT_Output || eDest==SRT_Coroutine ){
95250: pseudoTab = pParse->nTab++;
95251: sqlite3VdbeAddOp3(v, OP_OpenPseudo, pseudoTab, regRow, nColumn);
95252: regRowid = 0;
95253: }else{
95254: regRowid = sqlite3GetTempReg(pParse);
95255: }
95256: if( p->selFlags & SF_UseSorter ){
95257: int regSortOut = ++pParse->nMem;
95258: int ptab2 = pParse->nTab++;
95259: sqlite3VdbeAddOp3(v, OP_OpenPseudo, ptab2, regSortOut, pOrderBy->nExpr+2);
95260: addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);
95261: codeOffset(v, p, addrContinue);
95262: sqlite3VdbeAddOp2(v, OP_SorterData, iTab, regSortOut);
95263: sqlite3VdbeAddOp3(v, OP_Column, ptab2, pOrderBy->nExpr+1, regRow);
95264: sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE);
95265: }else{
95266: addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak);
95267: codeOffset(v, p, addrContinue);
95268: sqlite3VdbeAddOp3(v, OP_Column, iTab, pOrderBy->nExpr+1, regRow);
95269: }
95270: switch( eDest ){
95271: case SRT_Table:
95272: case SRT_EphemTab: {
95273: testcase( eDest==SRT_Table );
95274: testcase( eDest==SRT_EphemTab );
95275: sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid);
95276: sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid);
95277: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
95278: break;
95279: }
95280: #ifndef SQLITE_OMIT_SUBQUERY
95281: case SRT_Set: {
95282: assert( nColumn==1 );
1.2.2.1 ! misho 95283: sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, 1, regRowid,
! 95284: &pDest->affSdst, 1);
1.2 misho 95285: sqlite3ExprCacheAffinityChange(pParse, regRow, 1);
95286: sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid);
95287: break;
95288: }
95289: case SRT_Mem: {
95290: assert( nColumn==1 );
95291: sqlite3ExprCodeMove(pParse, regRow, iParm, 1);
95292: /* The LIMIT clause will terminate the loop for us */
95293: break;
95294: }
95295: #endif
95296: default: {
95297: int i;
95298: assert( eDest==SRT_Output || eDest==SRT_Coroutine );
95299: testcase( eDest==SRT_Output );
95300: testcase( eDest==SRT_Coroutine );
95301: for(i=0; i<nColumn; i++){
1.2.2.1 ! misho 95302: assert( regRow!=pDest->iSdst+i );
! 95303: sqlite3VdbeAddOp3(v, OP_Column, pseudoTab, i, pDest->iSdst+i);
1.2 misho 95304: if( i==0 ){
95305: sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE);
95306: }
95307: }
95308: if( eDest==SRT_Output ){
1.2.2.1 ! misho 95309: sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iSdst, nColumn);
! 95310: sqlite3ExprCacheAffinityChange(pParse, pDest->iSdst, nColumn);
1.2 misho 95311: }else{
1.2.2.1 ! misho 95312: sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);
1.2 misho 95313: }
95314: break;
95315: }
95316: }
95317: sqlite3ReleaseTempReg(pParse, regRow);
95318: sqlite3ReleaseTempReg(pParse, regRowid);
95319:
95320: /* The bottom of the loop
95321: */
95322: sqlite3VdbeResolveLabel(v, addrContinue);
95323: if( p->selFlags & SF_UseSorter ){
95324: sqlite3VdbeAddOp2(v, OP_SorterNext, iTab, addr);
95325: }else{
95326: sqlite3VdbeAddOp2(v, OP_Next, iTab, addr);
95327: }
95328: sqlite3VdbeResolveLabel(v, addrBreak);
95329: if( eDest==SRT_Output || eDest==SRT_Coroutine ){
95330: sqlite3VdbeAddOp2(v, OP_Close, pseudoTab, 0);
95331: }
95332: }
95333:
95334: /*
95335: ** Return a pointer to a string containing the 'declaration type' of the
95336: ** expression pExpr. The string may be treated as static by the caller.
95337: **
95338: ** The declaration type is the exact datatype definition extracted from the
95339: ** original CREATE TABLE statement if the expression is a column. The
95340: ** declaration type for a ROWID field is INTEGER. Exactly when an expression
95341: ** is considered a column can be complex in the presence of subqueries. The
95342: ** result-set expression in all of the following SELECT statements is
95343: ** considered a column by this function.
95344: **
95345: ** SELECT col FROM tbl;
95346: ** SELECT (SELECT col FROM tbl;
95347: ** SELECT (SELECT col FROM tbl);
95348: ** SELECT abc FROM (SELECT col AS abc FROM tbl);
95349: **
95350: ** The declaration type for any expression other than a column is NULL.
95351: */
95352: static const char *columnType(
95353: NameContext *pNC,
95354: Expr *pExpr,
95355: const char **pzOriginDb,
95356: const char **pzOriginTab,
95357: const char **pzOriginCol
95358: ){
95359: char const *zType = 0;
95360: char const *zOriginDb = 0;
95361: char const *zOriginTab = 0;
95362: char const *zOriginCol = 0;
95363: int j;
95364: if( NEVER(pExpr==0) || pNC->pSrcList==0 ) return 0;
95365:
95366: switch( pExpr->op ){
95367: case TK_AGG_COLUMN:
95368: case TK_COLUMN: {
95369: /* The expression is a column. Locate the table the column is being
95370: ** extracted from in NameContext.pSrcList. This table may be real
95371: ** database table or a subquery.
95372: */
95373: Table *pTab = 0; /* Table structure column is extracted from */
95374: Select *pS = 0; /* Select the column is extracted from */
95375: int iCol = pExpr->iColumn; /* Index of column in pTab */
95376: testcase( pExpr->op==TK_AGG_COLUMN );
95377: testcase( pExpr->op==TK_COLUMN );
95378: while( pNC && !pTab ){
95379: SrcList *pTabList = pNC->pSrcList;
95380: for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++);
95381: if( j<pTabList->nSrc ){
95382: pTab = pTabList->a[j].pTab;
95383: pS = pTabList->a[j].pSelect;
95384: }else{
95385: pNC = pNC->pNext;
95386: }
95387: }
95388:
95389: if( pTab==0 ){
95390: /* At one time, code such as "SELECT new.x" within a trigger would
95391: ** cause this condition to run. Since then, we have restructured how
95392: ** trigger code is generated and so this condition is no longer
95393: ** possible. However, it can still be true for statements like
95394: ** the following:
95395: **
95396: ** CREATE TABLE t1(col INTEGER);
95397: ** SELECT (SELECT t1.col) FROM FROM t1;
95398: **
95399: ** when columnType() is called on the expression "t1.col" in the
95400: ** sub-select. In this case, set the column type to NULL, even
95401: ** though it should really be "INTEGER".
95402: **
95403: ** This is not a problem, as the column type of "t1.col" is never
95404: ** used. When columnType() is called on the expression
95405: ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT
95406: ** branch below. */
95407: break;
95408: }
95409:
95410: assert( pTab && pExpr->pTab==pTab );
95411: if( pS ){
95412: /* The "table" is actually a sub-select or a view in the FROM clause
95413: ** of the SELECT statement. Return the declaration type and origin
95414: ** data for the result-set column of the sub-select.
95415: */
95416: if( iCol>=0 && ALWAYS(iCol<pS->pEList->nExpr) ){
95417: /* If iCol is less than zero, then the expression requests the
95418: ** rowid of the sub-select or view. This expression is legal (see
95419: ** test case misc2.2.2) - it always evaluates to NULL.
95420: */
95421: NameContext sNC;
95422: Expr *p = pS->pEList->a[iCol].pExpr;
95423: sNC.pSrcList = pS->pSrc;
95424: sNC.pNext = pNC;
95425: sNC.pParse = pNC->pParse;
95426: zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol);
95427: }
95428: }else if( ALWAYS(pTab->pSchema) ){
95429: /* A real table */
95430: assert( !pS );
95431: if( iCol<0 ) iCol = pTab->iPKey;
95432: assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
95433: if( iCol<0 ){
95434: zType = "INTEGER";
95435: zOriginCol = "rowid";
95436: }else{
95437: zType = pTab->aCol[iCol].zType;
95438: zOriginCol = pTab->aCol[iCol].zName;
95439: }
95440: zOriginTab = pTab->zName;
95441: if( pNC->pParse ){
95442: int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema);
95443: zOriginDb = pNC->pParse->db->aDb[iDb].zName;
95444: }
95445: }
95446: break;
95447: }
95448: #ifndef SQLITE_OMIT_SUBQUERY
95449: case TK_SELECT: {
95450: /* The expression is a sub-select. Return the declaration type and
95451: ** origin info for the single column in the result set of the SELECT
95452: ** statement.
95453: */
95454: NameContext sNC;
95455: Select *pS = pExpr->x.pSelect;
95456: Expr *p = pS->pEList->a[0].pExpr;
95457: assert( ExprHasProperty(pExpr, EP_xIsSelect) );
95458: sNC.pSrcList = pS->pSrc;
95459: sNC.pNext = pNC;
95460: sNC.pParse = pNC->pParse;
95461: zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol);
95462: break;
95463: }
95464: #endif
95465: }
95466:
95467: if( pzOriginDb ){
95468: assert( pzOriginTab && pzOriginCol );
95469: *pzOriginDb = zOriginDb;
95470: *pzOriginTab = zOriginTab;
95471: *pzOriginCol = zOriginCol;
95472: }
95473: return zType;
95474: }
95475:
95476: /*
95477: ** Generate code that will tell the VDBE the declaration types of columns
95478: ** in the result set.
95479: */
95480: static void generateColumnTypes(
95481: Parse *pParse, /* Parser context */
95482: SrcList *pTabList, /* List of tables */
95483: ExprList *pEList /* Expressions defining the result set */
95484: ){
95485: #ifndef SQLITE_OMIT_DECLTYPE
95486: Vdbe *v = pParse->pVdbe;
95487: int i;
95488: NameContext sNC;
95489: sNC.pSrcList = pTabList;
95490: sNC.pParse = pParse;
95491: for(i=0; i<pEList->nExpr; i++){
95492: Expr *p = pEList->a[i].pExpr;
95493: const char *zType;
95494: #ifdef SQLITE_ENABLE_COLUMN_METADATA
95495: const char *zOrigDb = 0;
95496: const char *zOrigTab = 0;
95497: const char *zOrigCol = 0;
95498: zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol);
95499:
95500: /* The vdbe must make its own copy of the column-type and other
95501: ** column specific strings, in case the schema is reset before this
95502: ** virtual machine is deleted.
95503: */
95504: sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT);
95505: sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT);
95506: sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT);
95507: #else
95508: zType = columnType(&sNC, p, 0, 0, 0);
95509: #endif
95510: sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT);
95511: }
95512: #endif /* SQLITE_OMIT_DECLTYPE */
95513: }
95514:
95515: /*
95516: ** Generate code that will tell the VDBE the names of columns
95517: ** in the result set. This information is used to provide the
95518: ** azCol[] values in the callback.
95519: */
95520: static void generateColumnNames(
95521: Parse *pParse, /* Parser context */
95522: SrcList *pTabList, /* List of tables */
95523: ExprList *pEList /* Expressions defining the result set */
95524: ){
95525: Vdbe *v = pParse->pVdbe;
95526: int i, j;
95527: sqlite3 *db = pParse->db;
95528: int fullNames, shortNames;
95529:
95530: #ifndef SQLITE_OMIT_EXPLAIN
95531: /* If this is an EXPLAIN, skip this step */
95532: if( pParse->explain ){
95533: return;
95534: }
95535: #endif
95536:
95537: if( pParse->colNamesSet || NEVER(v==0) || db->mallocFailed ) return;
95538: pParse->colNamesSet = 1;
95539: fullNames = (db->flags & SQLITE_FullColNames)!=0;
95540: shortNames = (db->flags & SQLITE_ShortColNames)!=0;
95541: sqlite3VdbeSetNumCols(v, pEList->nExpr);
95542: for(i=0; i<pEList->nExpr; i++){
95543: Expr *p;
95544: p = pEList->a[i].pExpr;
95545: if( NEVER(p==0) ) continue;
95546: if( pEList->a[i].zName ){
95547: char *zName = pEList->a[i].zName;
95548: sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT);
95549: }else if( (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) && pTabList ){
95550: Table *pTab;
95551: char *zCol;
95552: int iCol = p->iColumn;
95553: for(j=0; ALWAYS(j<pTabList->nSrc); j++){
95554: if( pTabList->a[j].iCursor==p->iTable ) break;
95555: }
95556: assert( j<pTabList->nSrc );
95557: pTab = pTabList->a[j].pTab;
95558: if( iCol<0 ) iCol = pTab->iPKey;
95559: assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
95560: if( iCol<0 ){
95561: zCol = "rowid";
95562: }else{
95563: zCol = pTab->aCol[iCol].zName;
95564: }
95565: if( !shortNames && !fullNames ){
95566: sqlite3VdbeSetColName(v, i, COLNAME_NAME,
95567: sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC);
95568: }else if( fullNames ){
95569: char *zName = 0;
95570: zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol);
95571: sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC);
95572: }else{
95573: sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT);
95574: }
95575: }else{
95576: sqlite3VdbeSetColName(v, i, COLNAME_NAME,
95577: sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC);
95578: }
95579: }
95580: generateColumnTypes(pParse, pTabList, pEList);
95581: }
95582:
95583: /*
95584: ** Given a an expression list (which is really the list of expressions
95585: ** that form the result set of a SELECT statement) compute appropriate
95586: ** column names for a table that would hold the expression list.
95587: **
95588: ** All column names will be unique.
95589: **
95590: ** Only the column names are computed. Column.zType, Column.zColl,
95591: ** and other fields of Column are zeroed.
95592: **
95593: ** Return SQLITE_OK on success. If a memory allocation error occurs,
95594: ** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM.
95595: */
95596: static int selectColumnsFromExprList(
95597: Parse *pParse, /* Parsing context */
95598: ExprList *pEList, /* Expr list from which to derive column names */
1.2.2.1 ! misho 95599: i16 *pnCol, /* Write the number of columns here */
1.2 misho 95600: Column **paCol /* Write the new column list here */
95601: ){
95602: sqlite3 *db = pParse->db; /* Database connection */
95603: int i, j; /* Loop counters */
95604: int cnt; /* Index added to make the name unique */
95605: Column *aCol, *pCol; /* For looping over result columns */
95606: int nCol; /* Number of columns in the result set */
95607: Expr *p; /* Expression for a single result column */
95608: char *zName; /* Column name */
95609: int nName; /* Size of name in zName[] */
95610:
1.2.2.1 ! misho 95611: if( pEList ){
! 95612: nCol = pEList->nExpr;
! 95613: aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol);
! 95614: testcase( aCol==0 );
! 95615: }else{
! 95616: nCol = 0;
! 95617: aCol = 0;
! 95618: }
! 95619: *pnCol = nCol;
! 95620: *paCol = aCol;
! 95621:
1.2 misho 95622: for(i=0, pCol=aCol; i<nCol; i++, pCol++){
95623: /* Get an appropriate name for the column
95624: */
1.2.2.1 ! misho 95625: p = sqlite3ExprSkipCollate(pEList->a[i].pExpr);
1.2 misho 95626: assert( p->pRight==0 || ExprHasProperty(p->pRight, EP_IntValue)
95627: || p->pRight->u.zToken==0 || p->pRight->u.zToken[0]!=0 );
95628: if( (zName = pEList->a[i].zName)!=0 ){
95629: /* If the column contains an "AS <name>" phrase, use <name> as the name */
95630: zName = sqlite3DbStrDup(db, zName);
95631: }else{
95632: Expr *pColExpr = p; /* The expression that is the result column name */
95633: Table *pTab; /* Table associated with this expression */
95634: while( pColExpr->op==TK_DOT ){
95635: pColExpr = pColExpr->pRight;
95636: assert( pColExpr!=0 );
95637: }
95638: if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){
95639: /* For columns use the column name name */
95640: int iCol = pColExpr->iColumn;
95641: pTab = pColExpr->pTab;
95642: if( iCol<0 ) iCol = pTab->iPKey;
95643: zName = sqlite3MPrintf(db, "%s",
95644: iCol>=0 ? pTab->aCol[iCol].zName : "rowid");
95645: }else if( pColExpr->op==TK_ID ){
95646: assert( !ExprHasProperty(pColExpr, EP_IntValue) );
95647: zName = sqlite3MPrintf(db, "%s", pColExpr->u.zToken);
95648: }else{
95649: /* Use the original text of the column expression as its name */
95650: zName = sqlite3MPrintf(db, "%s", pEList->a[i].zSpan);
95651: }
95652: }
95653: if( db->mallocFailed ){
95654: sqlite3DbFree(db, zName);
95655: break;
95656: }
95657:
95658: /* Make sure the column name is unique. If the name is not unique,
95659: ** append a integer to the name so that it becomes unique.
95660: */
95661: nName = sqlite3Strlen30(zName);
95662: for(j=cnt=0; j<i; j++){
95663: if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){
95664: char *zNewName;
95665: zName[nName] = 0;
95666: zNewName = sqlite3MPrintf(db, "%s:%d", zName, ++cnt);
95667: sqlite3DbFree(db, zName);
95668: zName = zNewName;
95669: j = -1;
95670: if( zName==0 ) break;
95671: }
95672: }
95673: pCol->zName = zName;
95674: }
95675: if( db->mallocFailed ){
95676: for(j=0; j<i; j++){
95677: sqlite3DbFree(db, aCol[j].zName);
95678: }
95679: sqlite3DbFree(db, aCol);
95680: *paCol = 0;
95681: *pnCol = 0;
95682: return SQLITE_NOMEM;
95683: }
95684: return SQLITE_OK;
95685: }
95686:
95687: /*
95688: ** Add type and collation information to a column list based on
95689: ** a SELECT statement.
95690: **
95691: ** The column list presumably came from selectColumnNamesFromExprList().
95692: ** The column list has only names, not types or collations. This
95693: ** routine goes through and adds the types and collations.
95694: **
95695: ** This routine requires that all identifiers in the SELECT
95696: ** statement be resolved.
95697: */
95698: static void selectAddColumnTypeAndCollation(
95699: Parse *pParse, /* Parsing contexts */
95700: int nCol, /* Number of columns */
95701: Column *aCol, /* List of columns */
95702: Select *pSelect /* SELECT used to determine types and collations */
95703: ){
95704: sqlite3 *db = pParse->db;
95705: NameContext sNC;
95706: Column *pCol;
95707: CollSeq *pColl;
95708: int i;
95709: Expr *p;
95710: struct ExprList_item *a;
95711:
95712: assert( pSelect!=0 );
95713: assert( (pSelect->selFlags & SF_Resolved)!=0 );
95714: assert( nCol==pSelect->pEList->nExpr || db->mallocFailed );
95715: if( db->mallocFailed ) return;
95716: memset(&sNC, 0, sizeof(sNC));
95717: sNC.pSrcList = pSelect->pSrc;
95718: a = pSelect->pEList->a;
95719: for(i=0, pCol=aCol; i<nCol; i++, pCol++){
95720: p = a[i].pExpr;
95721: pCol->zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0));
95722: pCol->affinity = sqlite3ExprAffinity(p);
95723: if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_NONE;
95724: pColl = sqlite3ExprCollSeq(pParse, p);
95725: if( pColl ){
95726: pCol->zColl = sqlite3DbStrDup(db, pColl->zName);
95727: }
95728: }
95729: }
95730:
95731: /*
95732: ** Given a SELECT statement, generate a Table structure that describes
95733: ** the result set of that SELECT.
95734: */
95735: SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){
95736: Table *pTab;
95737: sqlite3 *db = pParse->db;
95738: int savedFlags;
95739:
95740: savedFlags = db->flags;
95741: db->flags &= ~SQLITE_FullColNames;
95742: db->flags |= SQLITE_ShortColNames;
95743: sqlite3SelectPrep(pParse, pSelect, 0);
95744: if( pParse->nErr ) return 0;
95745: while( pSelect->pPrior ) pSelect = pSelect->pPrior;
95746: db->flags = savedFlags;
95747: pTab = sqlite3DbMallocZero(db, sizeof(Table) );
95748: if( pTab==0 ){
95749: return 0;
95750: }
95751: /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside
95752: ** is disabled */
95753: assert( db->lookaside.bEnabled==0 );
95754: pTab->nRef = 1;
95755: pTab->zName = 0;
95756: pTab->nRowEst = 1000000;
95757: selectColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol);
95758: selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSelect);
95759: pTab->iPKey = -1;
95760: if( db->mallocFailed ){
95761: sqlite3DeleteTable(db, pTab);
95762: return 0;
95763: }
95764: return pTab;
95765: }
95766:
95767: /*
95768: ** Get a VDBE for the given parser context. Create a new one if necessary.
95769: ** If an error occurs, return NULL and leave a message in pParse.
95770: */
95771: SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){
95772: Vdbe *v = pParse->pVdbe;
95773: if( v==0 ){
95774: v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db);
95775: #ifndef SQLITE_OMIT_TRACE
95776: if( v ){
95777: sqlite3VdbeAddOp0(v, OP_Trace);
95778: }
95779: #endif
95780: }
95781: return v;
95782: }
95783:
95784:
95785: /*
95786: ** Compute the iLimit and iOffset fields of the SELECT based on the
95787: ** pLimit and pOffset expressions. pLimit and pOffset hold the expressions
95788: ** that appear in the original SQL statement after the LIMIT and OFFSET
95789: ** keywords. Or NULL if those keywords are omitted. iLimit and iOffset
95790: ** are the integer memory register numbers for counters used to compute
95791: ** the limit and offset. If there is no limit and/or offset, then
95792: ** iLimit and iOffset are negative.
95793: **
95794: ** This routine changes the values of iLimit and iOffset only if
95795: ** a limit or offset is defined by pLimit and pOffset. iLimit and
95796: ** iOffset should have been preset to appropriate default values
95797: ** (usually but not always -1) prior to calling this routine.
95798: ** Only if pLimit!=0 or pOffset!=0 do the limit registers get
95799: ** redefined. The UNION ALL operator uses this property to force
95800: ** the reuse of the same limit and offset registers across multiple
95801: ** SELECT statements.
95802: */
95803: static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){
95804: Vdbe *v = 0;
95805: int iLimit = 0;
95806: int iOffset;
95807: int addr1, n;
95808: if( p->iLimit ) return;
95809:
95810: /*
95811: ** "LIMIT -1" always shows all rows. There is some
95812: ** contraversy about what the correct behavior should be.
95813: ** The current implementation interprets "LIMIT 0" to mean
95814: ** no rows.
95815: */
95816: sqlite3ExprCacheClear(pParse);
95817: assert( p->pOffset==0 || p->pLimit!=0 );
95818: if( p->pLimit ){
95819: p->iLimit = iLimit = ++pParse->nMem;
95820: v = sqlite3GetVdbe(pParse);
95821: if( NEVER(v==0) ) return; /* VDBE should have already been allocated */
95822: if( sqlite3ExprIsInteger(p->pLimit, &n) ){
95823: sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit);
95824: VdbeComment((v, "LIMIT counter"));
95825: if( n==0 ){
95826: sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak);
95827: }else{
95828: if( p->nSelectRow > (double)n ) p->nSelectRow = (double)n;
95829: }
95830: }else{
95831: sqlite3ExprCode(pParse, p->pLimit, iLimit);
95832: sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit);
95833: VdbeComment((v, "LIMIT counter"));
95834: sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak);
95835: }
95836: if( p->pOffset ){
95837: p->iOffset = iOffset = ++pParse->nMem;
95838: pParse->nMem++; /* Allocate an extra register for limit+offset */
95839: sqlite3ExprCode(pParse, p->pOffset, iOffset);
95840: sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset);
95841: VdbeComment((v, "OFFSET counter"));
95842: addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset);
95843: sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset);
95844: sqlite3VdbeJumpHere(v, addr1);
95845: sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1);
95846: VdbeComment((v, "LIMIT+OFFSET"));
95847: addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit);
95848: sqlite3VdbeAddOp2(v, OP_Integer, -1, iOffset+1);
95849: sqlite3VdbeJumpHere(v, addr1);
95850: }
95851: }
95852: }
95853:
95854: #ifndef SQLITE_OMIT_COMPOUND_SELECT
95855: /*
95856: ** Return the appropriate collating sequence for the iCol-th column of
95857: ** the result set for the compound-select statement "p". Return NULL if
95858: ** the column has no default collating sequence.
95859: **
95860: ** The collating sequence for the compound select is taken from the
95861: ** left-most term of the select that has a collating sequence.
95862: */
95863: static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){
95864: CollSeq *pRet;
95865: if( p->pPrior ){
95866: pRet = multiSelectCollSeq(pParse, p->pPrior, iCol);
95867: }else{
95868: pRet = 0;
95869: }
95870: assert( iCol>=0 );
95871: if( pRet==0 && iCol<p->pEList->nExpr ){
95872: pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr);
95873: }
95874: return pRet;
95875: }
95876: #endif /* SQLITE_OMIT_COMPOUND_SELECT */
95877:
95878: /* Forward reference */
95879: static int multiSelectOrderBy(
95880: Parse *pParse, /* Parsing context */
95881: Select *p, /* The right-most of SELECTs to be coded */
95882: SelectDest *pDest /* What to do with query results */
95883: );
95884:
95885:
95886: #ifndef SQLITE_OMIT_COMPOUND_SELECT
95887: /*
95888: ** This routine is called to process a compound query form from
95889: ** two or more separate queries using UNION, UNION ALL, EXCEPT, or
95890: ** INTERSECT
95891: **
95892: ** "p" points to the right-most of the two queries. the query on the
95893: ** left is p->pPrior. The left query could also be a compound query
95894: ** in which case this routine will be called recursively.
95895: **
95896: ** The results of the total query are to be written into a destination
95897: ** of type eDest with parameter iParm.
95898: **
95899: ** Example 1: Consider a three-way compound SQL statement.
95900: **
95901: ** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3
95902: **
95903: ** This statement is parsed up as follows:
95904: **
95905: ** SELECT c FROM t3
95906: ** |
95907: ** `-----> SELECT b FROM t2
95908: ** |
95909: ** `------> SELECT a FROM t1
95910: **
95911: ** The arrows in the diagram above represent the Select.pPrior pointer.
95912: ** So if this routine is called with p equal to the t3 query, then
95913: ** pPrior will be the t2 query. p->op will be TK_UNION in this case.
95914: **
95915: ** Notice that because of the way SQLite parses compound SELECTs, the
95916: ** individual selects always group from left to right.
95917: */
95918: static int multiSelect(
95919: Parse *pParse, /* Parsing context */
95920: Select *p, /* The right-most of SELECTs to be coded */
95921: SelectDest *pDest /* What to do with query results */
95922: ){
95923: int rc = SQLITE_OK; /* Success code from a subroutine */
95924: Select *pPrior; /* Another SELECT immediately to our left */
95925: Vdbe *v; /* Generate code to this VDBE */
95926: SelectDest dest; /* Alternative data destination */
95927: Select *pDelete = 0; /* Chain of simple selects to delete */
95928: sqlite3 *db; /* Database connection */
95929: #ifndef SQLITE_OMIT_EXPLAIN
95930: int iSub1; /* EQP id of left-hand query */
95931: int iSub2; /* EQP id of right-hand query */
95932: #endif
95933:
95934: /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
95935: ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT.
95936: */
95937: assert( p && p->pPrior ); /* Calling function guarantees this much */
95938: db = pParse->db;
95939: pPrior = p->pPrior;
95940: assert( pPrior->pRightmost!=pPrior );
95941: assert( pPrior->pRightmost==p->pRightmost );
95942: dest = *pDest;
95943: if( pPrior->pOrderBy ){
95944: sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before",
95945: selectOpName(p->op));
95946: rc = 1;
95947: goto multi_select_end;
95948: }
95949: if( pPrior->pLimit ){
95950: sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before",
95951: selectOpName(p->op));
95952: rc = 1;
95953: goto multi_select_end;
95954: }
95955:
95956: v = sqlite3GetVdbe(pParse);
95957: assert( v!=0 ); /* The VDBE already created by calling function */
95958:
95959: /* Create the destination temporary table if necessary
95960: */
95961: if( dest.eDest==SRT_EphemTab ){
95962: assert( p->pEList );
1.2.2.1 ! misho 95963: sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr);
1.2 misho 95964: sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
95965: dest.eDest = SRT_Table;
95966: }
95967:
95968: /* Make sure all SELECTs in the statement have the same number of elements
95969: ** in their result sets.
95970: */
95971: assert( p->pEList && pPrior->pEList );
95972: if( p->pEList->nExpr!=pPrior->pEList->nExpr ){
1.2.2.1 ! misho 95973: if( p->selFlags & SF_Values ){
! 95974: sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms");
! 95975: }else{
! 95976: sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s"
! 95977: " do not have the same number of result columns", selectOpName(p->op));
! 95978: }
1.2 misho 95979: rc = 1;
95980: goto multi_select_end;
95981: }
95982:
95983: /* Compound SELECTs that have an ORDER BY clause are handled separately.
95984: */
95985: if( p->pOrderBy ){
95986: return multiSelectOrderBy(pParse, p, pDest);
95987: }
95988:
95989: /* Generate code for the left and right SELECT statements.
95990: */
95991: switch( p->op ){
95992: case TK_ALL: {
95993: int addr = 0;
95994: int nLimit;
95995: assert( !pPrior->pLimit );
95996: pPrior->pLimit = p->pLimit;
95997: pPrior->pOffset = p->pOffset;
95998: explainSetInteger(iSub1, pParse->iNextSelectId);
95999: rc = sqlite3Select(pParse, pPrior, &dest);
96000: p->pLimit = 0;
96001: p->pOffset = 0;
96002: if( rc ){
96003: goto multi_select_end;
96004: }
96005: p->pPrior = 0;
96006: p->iLimit = pPrior->iLimit;
96007: p->iOffset = pPrior->iOffset;
96008: if( p->iLimit ){
96009: addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit);
96010: VdbeComment((v, "Jump ahead if LIMIT reached"));
96011: }
96012: explainSetInteger(iSub2, pParse->iNextSelectId);
96013: rc = sqlite3Select(pParse, p, &dest);
96014: testcase( rc!=SQLITE_OK );
96015: pDelete = p->pPrior;
96016: p->pPrior = pPrior;
96017: p->nSelectRow += pPrior->nSelectRow;
96018: if( pPrior->pLimit
96019: && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit)
96020: && p->nSelectRow > (double)nLimit
96021: ){
96022: p->nSelectRow = (double)nLimit;
96023: }
96024: if( addr ){
96025: sqlite3VdbeJumpHere(v, addr);
96026: }
96027: break;
96028: }
96029: case TK_EXCEPT:
96030: case TK_UNION: {
96031: int unionTab; /* Cursor number of the temporary table holding result */
96032: u8 op = 0; /* One of the SRT_ operations to apply to self */
96033: int priorOp; /* The SRT_ operation to apply to prior selects */
96034: Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */
96035: int addr;
96036: SelectDest uniondest;
96037:
96038: testcase( p->op==TK_EXCEPT );
96039: testcase( p->op==TK_UNION );
96040: priorOp = SRT_Union;
96041: if( dest.eDest==priorOp && ALWAYS(!p->pLimit &&!p->pOffset) ){
96042: /* We can reuse a temporary table generated by a SELECT to our
96043: ** right.
96044: */
96045: assert( p->pRightmost!=p ); /* Can only happen for leftward elements
96046: ** of a 3-way or more compound */
96047: assert( p->pLimit==0 ); /* Not allowed on leftward elements */
96048: assert( p->pOffset==0 ); /* Not allowed on leftward elements */
1.2.2.1 ! misho 96049: unionTab = dest.iSDParm;
1.2 misho 96050: }else{
96051: /* We will need to create our own temporary table to hold the
96052: ** intermediate results.
96053: */
96054: unionTab = pParse->nTab++;
96055: assert( p->pOrderBy==0 );
96056: addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0);
96057: assert( p->addrOpenEphm[0] == -1 );
96058: p->addrOpenEphm[0] = addr;
96059: p->pRightmost->selFlags |= SF_UsesEphemeral;
96060: assert( p->pEList );
96061: }
96062:
96063: /* Code the SELECT statements to our left
96064: */
96065: assert( !pPrior->pOrderBy );
96066: sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
96067: explainSetInteger(iSub1, pParse->iNextSelectId);
96068: rc = sqlite3Select(pParse, pPrior, &uniondest);
96069: if( rc ){
96070: goto multi_select_end;
96071: }
96072:
96073: /* Code the current SELECT statement
96074: */
96075: if( p->op==TK_EXCEPT ){
96076: op = SRT_Except;
96077: }else{
96078: assert( p->op==TK_UNION );
96079: op = SRT_Union;
96080: }
96081: p->pPrior = 0;
96082: pLimit = p->pLimit;
96083: p->pLimit = 0;
96084: pOffset = p->pOffset;
96085: p->pOffset = 0;
96086: uniondest.eDest = op;
96087: explainSetInteger(iSub2, pParse->iNextSelectId);
96088: rc = sqlite3Select(pParse, p, &uniondest);
96089: testcase( rc!=SQLITE_OK );
96090: /* Query flattening in sqlite3Select() might refill p->pOrderBy.
96091: ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */
96092: sqlite3ExprListDelete(db, p->pOrderBy);
96093: pDelete = p->pPrior;
96094: p->pPrior = pPrior;
96095: p->pOrderBy = 0;
96096: if( p->op==TK_UNION ) p->nSelectRow += pPrior->nSelectRow;
96097: sqlite3ExprDelete(db, p->pLimit);
96098: p->pLimit = pLimit;
96099: p->pOffset = pOffset;
96100: p->iLimit = 0;
96101: p->iOffset = 0;
96102:
96103: /* Convert the data in the temporary table into whatever form
96104: ** it is that we currently need.
96105: */
1.2.2.1 ! misho 96106: assert( unionTab==dest.iSDParm || dest.eDest!=priorOp );
1.2 misho 96107: if( dest.eDest!=priorOp ){
96108: int iCont, iBreak, iStart;
96109: assert( p->pEList );
96110: if( dest.eDest==SRT_Output ){
96111: Select *pFirst = p;
96112: while( pFirst->pPrior ) pFirst = pFirst->pPrior;
96113: generateColumnNames(pParse, 0, pFirst->pEList);
96114: }
96115: iBreak = sqlite3VdbeMakeLabel(v);
96116: iCont = sqlite3VdbeMakeLabel(v);
96117: computeLimitRegisters(pParse, p, iBreak);
96118: sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak);
96119: iStart = sqlite3VdbeCurrentAddr(v);
96120: selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr,
1.2.2.1 ! misho 96121: 0, 0, &dest, iCont, iBreak);
1.2 misho 96122: sqlite3VdbeResolveLabel(v, iCont);
96123: sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart);
96124: sqlite3VdbeResolveLabel(v, iBreak);
96125: sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0);
96126: }
96127: break;
96128: }
96129: default: assert( p->op==TK_INTERSECT ); {
96130: int tab1, tab2;
96131: int iCont, iBreak, iStart;
96132: Expr *pLimit, *pOffset;
96133: int addr;
96134: SelectDest intersectdest;
96135: int r1;
96136:
96137: /* INTERSECT is different from the others since it requires
96138: ** two temporary tables. Hence it has its own case. Begin
96139: ** by allocating the tables we will need.
96140: */
96141: tab1 = pParse->nTab++;
96142: tab2 = pParse->nTab++;
96143: assert( p->pOrderBy==0 );
96144:
96145: addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0);
96146: assert( p->addrOpenEphm[0] == -1 );
96147: p->addrOpenEphm[0] = addr;
96148: p->pRightmost->selFlags |= SF_UsesEphemeral;
96149: assert( p->pEList );
96150:
96151: /* Code the SELECTs to our left into temporary table "tab1".
96152: */
96153: sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1);
96154: explainSetInteger(iSub1, pParse->iNextSelectId);
96155: rc = sqlite3Select(pParse, pPrior, &intersectdest);
96156: if( rc ){
96157: goto multi_select_end;
96158: }
96159:
96160: /* Code the current SELECT into temporary table "tab2"
96161: */
96162: addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0);
96163: assert( p->addrOpenEphm[1] == -1 );
96164: p->addrOpenEphm[1] = addr;
96165: p->pPrior = 0;
96166: pLimit = p->pLimit;
96167: p->pLimit = 0;
96168: pOffset = p->pOffset;
96169: p->pOffset = 0;
1.2.2.1 ! misho 96170: intersectdest.iSDParm = tab2;
1.2 misho 96171: explainSetInteger(iSub2, pParse->iNextSelectId);
96172: rc = sqlite3Select(pParse, p, &intersectdest);
96173: testcase( rc!=SQLITE_OK );
96174: pDelete = p->pPrior;
96175: p->pPrior = pPrior;
96176: if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow;
96177: sqlite3ExprDelete(db, p->pLimit);
96178: p->pLimit = pLimit;
96179: p->pOffset = pOffset;
96180:
96181: /* Generate code to take the intersection of the two temporary
96182: ** tables.
96183: */
96184: assert( p->pEList );
96185: if( dest.eDest==SRT_Output ){
96186: Select *pFirst = p;
96187: while( pFirst->pPrior ) pFirst = pFirst->pPrior;
96188: generateColumnNames(pParse, 0, pFirst->pEList);
96189: }
96190: iBreak = sqlite3VdbeMakeLabel(v);
96191: iCont = sqlite3VdbeMakeLabel(v);
96192: computeLimitRegisters(pParse, p, iBreak);
96193: sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak);
96194: r1 = sqlite3GetTempReg(pParse);
96195: iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1);
96196: sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0);
96197: sqlite3ReleaseTempReg(pParse, r1);
96198: selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr,
1.2.2.1 ! misho 96199: 0, 0, &dest, iCont, iBreak);
1.2 misho 96200: sqlite3VdbeResolveLabel(v, iCont);
96201: sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart);
96202: sqlite3VdbeResolveLabel(v, iBreak);
96203: sqlite3VdbeAddOp2(v, OP_Close, tab2, 0);
96204: sqlite3VdbeAddOp2(v, OP_Close, tab1, 0);
96205: break;
96206: }
96207: }
96208:
96209: explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL);
96210:
96211: /* Compute collating sequences used by
96212: ** temporary tables needed to implement the compound select.
96213: ** Attach the KeyInfo structure to all temporary tables.
96214: **
96215: ** This section is run by the right-most SELECT statement only.
96216: ** SELECT statements to the left always skip this part. The right-most
96217: ** SELECT might also skip this part if it has no ORDER BY clause and
96218: ** no temp tables are required.
96219: */
96220: if( p->selFlags & SF_UsesEphemeral ){
96221: int i; /* Loop counter */
96222: KeyInfo *pKeyInfo; /* Collating sequence for the result set */
96223: Select *pLoop; /* For looping through SELECT statements */
96224: CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */
96225: int nCol; /* Number of columns in result set */
96226:
96227: assert( p->pRightmost==p );
96228: nCol = p->pEList->nExpr;
96229: pKeyInfo = sqlite3DbMallocZero(db,
96230: sizeof(*pKeyInfo)+nCol*(sizeof(CollSeq*) + 1));
96231: if( !pKeyInfo ){
96232: rc = SQLITE_NOMEM;
96233: goto multi_select_end;
96234: }
96235:
96236: pKeyInfo->enc = ENC(db);
96237: pKeyInfo->nField = (u16)nCol;
96238:
96239: for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){
96240: *apColl = multiSelectCollSeq(pParse, p, i);
96241: if( 0==*apColl ){
96242: *apColl = db->pDfltColl;
96243: }
96244: }
1.2.2.1 ! misho 96245: pKeyInfo->aSortOrder = (u8*)apColl;
1.2 misho 96246:
96247: for(pLoop=p; pLoop; pLoop=pLoop->pPrior){
96248: for(i=0; i<2; i++){
96249: int addr = pLoop->addrOpenEphm[i];
96250: if( addr<0 ){
96251: /* If [0] is unused then [1] is also unused. So we can
96252: ** always safely abort as soon as the first unused slot is found */
96253: assert( pLoop->addrOpenEphm[1]<0 );
96254: break;
96255: }
96256: sqlite3VdbeChangeP2(v, addr, nCol);
96257: sqlite3VdbeChangeP4(v, addr, (char*)pKeyInfo, P4_KEYINFO);
96258: pLoop->addrOpenEphm[i] = -1;
96259: }
96260: }
96261: sqlite3DbFree(db, pKeyInfo);
96262: }
96263:
96264: multi_select_end:
1.2.2.1 ! misho 96265: pDest->iSdst = dest.iSdst;
! 96266: pDest->nSdst = dest.nSdst;
1.2 misho 96267: sqlite3SelectDelete(db, pDelete);
96268: return rc;
96269: }
96270: #endif /* SQLITE_OMIT_COMPOUND_SELECT */
96271:
96272: /*
96273: ** Code an output subroutine for a coroutine implementation of a
96274: ** SELECT statment.
96275: **
1.2.2.1 ! misho 96276: ** The data to be output is contained in pIn->iSdst. There are
! 96277: ** pIn->nSdst columns to be output. pDest is where the output should
1.2 misho 96278: ** be sent.
96279: **
96280: ** regReturn is the number of the register holding the subroutine
96281: ** return address.
96282: **
96283: ** If regPrev>0 then it is the first register in a vector that
96284: ** records the previous output. mem[regPrev] is a flag that is false
96285: ** if there has been no previous output. If regPrev>0 then code is
96286: ** generated to suppress duplicates. pKeyInfo is used for comparing
96287: ** keys.
96288: **
96289: ** If the LIMIT found in p->iLimit is reached, jump immediately to
96290: ** iBreak.
96291: */
96292: static int generateOutputSubroutine(
96293: Parse *pParse, /* Parsing context */
96294: Select *p, /* The SELECT statement */
96295: SelectDest *pIn, /* Coroutine supplying data */
96296: SelectDest *pDest, /* Where to send the data */
96297: int regReturn, /* The return address register */
96298: int regPrev, /* Previous result register. No uniqueness if 0 */
96299: KeyInfo *pKeyInfo, /* For comparing with previous entry */
96300: int p4type, /* The p4 type for pKeyInfo */
96301: int iBreak /* Jump here if we hit the LIMIT */
96302: ){
96303: Vdbe *v = pParse->pVdbe;
96304: int iContinue;
96305: int addr;
96306:
96307: addr = sqlite3VdbeCurrentAddr(v);
96308: iContinue = sqlite3VdbeMakeLabel(v);
96309:
96310: /* Suppress duplicates for UNION, EXCEPT, and INTERSECT
96311: */
96312: if( regPrev ){
96313: int j1, j2;
96314: j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev);
1.2.2.1 ! misho 96315: j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst,
1.2 misho 96316: (char*)pKeyInfo, p4type);
96317: sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2);
96318: sqlite3VdbeJumpHere(v, j1);
1.2.2.1 ! misho 96319: sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1);
1.2 misho 96320: sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev);
96321: }
96322: if( pParse->db->mallocFailed ) return 0;
96323:
1.2.2.1 ! misho 96324: /* Suppress the first OFFSET entries if there is an OFFSET clause
1.2 misho 96325: */
96326: codeOffset(v, p, iContinue);
96327:
96328: switch( pDest->eDest ){
96329: /* Store the result as data using a unique key.
96330: */
96331: case SRT_Table:
96332: case SRT_EphemTab: {
96333: int r1 = sqlite3GetTempReg(pParse);
96334: int r2 = sqlite3GetTempReg(pParse);
96335: testcase( pDest->eDest==SRT_Table );
96336: testcase( pDest->eDest==SRT_EphemTab );
1.2.2.1 ! misho 96337: sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1);
! 96338: sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2);
! 96339: sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2);
1.2 misho 96340: sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
96341: sqlite3ReleaseTempReg(pParse, r2);
96342: sqlite3ReleaseTempReg(pParse, r1);
96343: break;
96344: }
96345:
96346: #ifndef SQLITE_OMIT_SUBQUERY
96347: /* If we are creating a set for an "expr IN (SELECT ...)" construct,
96348: ** then there should be a single item on the stack. Write this
96349: ** item into the set table with bogus data.
96350: */
96351: case SRT_Set: {
96352: int r1;
1.2.2.1 ! misho 96353: assert( pIn->nSdst==1 );
! 96354: pDest->affSdst =
! 96355: sqlite3CompareAffinity(p->pEList->a[0].pExpr, pDest->affSdst);
1.2 misho 96356: r1 = sqlite3GetTempReg(pParse);
1.2.2.1 ! misho 96357: sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, 1, r1, &pDest->affSdst,1);
! 96358: sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, 1);
! 96359: sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iSDParm, r1);
1.2 misho 96360: sqlite3ReleaseTempReg(pParse, r1);
96361: break;
96362: }
96363:
96364: #if 0 /* Never occurs on an ORDER BY query */
96365: /* If any row exist in the result set, record that fact and abort.
96366: */
96367: case SRT_Exists: {
1.2.2.1 ! misho 96368: sqlite3VdbeAddOp2(v, OP_Integer, 1, pDest->iSDParm);
1.2 misho 96369: /* The LIMIT clause will terminate the loop for us */
96370: break;
96371: }
96372: #endif
96373:
96374: /* If this is a scalar select that is part of an expression, then
96375: ** store the results in the appropriate memory cell and break out
96376: ** of the scan loop.
96377: */
96378: case SRT_Mem: {
1.2.2.1 ! misho 96379: assert( pIn->nSdst==1 );
! 96380: sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1);
1.2 misho 96381: /* The LIMIT clause will jump out of the loop for us */
96382: break;
96383: }
96384: #endif /* #ifndef SQLITE_OMIT_SUBQUERY */
96385:
96386: /* The results are stored in a sequence of registers
1.2.2.1 ! misho 96387: ** starting at pDest->iSdst. Then the co-routine yields.
1.2 misho 96388: */
96389: case SRT_Coroutine: {
1.2.2.1 ! misho 96390: if( pDest->iSdst==0 ){
! 96391: pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst);
! 96392: pDest->nSdst = pIn->nSdst;
1.2 misho 96393: }
1.2.2.1 ! misho 96394: sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pDest->nSdst);
! 96395: sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm);
1.2 misho 96396: break;
96397: }
96398:
96399: /* If none of the above, then the result destination must be
96400: ** SRT_Output. This routine is never called with any other
96401: ** destination other than the ones handled above or SRT_Output.
96402: **
96403: ** For SRT_Output, results are stored in a sequence of registers.
96404: ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to
96405: ** return the next row of result.
96406: */
96407: default: {
96408: assert( pDest->eDest==SRT_Output );
1.2.2.1 ! misho 96409: sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iSdst, pIn->nSdst);
! 96410: sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst);
1.2 misho 96411: break;
96412: }
96413: }
96414:
96415: /* Jump to the end of the loop if the LIMIT is reached.
96416: */
96417: if( p->iLimit ){
96418: sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1);
96419: }
96420:
96421: /* Generate the subroutine return
96422: */
96423: sqlite3VdbeResolveLabel(v, iContinue);
96424: sqlite3VdbeAddOp1(v, OP_Return, regReturn);
96425:
96426: return addr;
96427: }
96428:
96429: /*
96430: ** Alternative compound select code generator for cases when there
96431: ** is an ORDER BY clause.
96432: **
96433: ** We assume a query of the following form:
96434: **
96435: ** <selectA> <operator> <selectB> ORDER BY <orderbylist>
96436: **
96437: ** <operator> is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea
96438: ** is to code both <selectA> and <selectB> with the ORDER BY clause as
96439: ** co-routines. Then run the co-routines in parallel and merge the results
96440: ** into the output. In addition to the two coroutines (called selectA and
96441: ** selectB) there are 7 subroutines:
96442: **
96443: ** outA: Move the output of the selectA coroutine into the output
96444: ** of the compound query.
96445: **
96446: ** outB: Move the output of the selectB coroutine into the output
96447: ** of the compound query. (Only generated for UNION and
96448: ** UNION ALL. EXCEPT and INSERTSECT never output a row that
96449: ** appears only in B.)
96450: **
96451: ** AltB: Called when there is data from both coroutines and A<B.
96452: **
96453: ** AeqB: Called when there is data from both coroutines and A==B.
96454: **
96455: ** AgtB: Called when there is data from both coroutines and A>B.
96456: **
96457: ** EofA: Called when data is exhausted from selectA.
96458: **
96459: ** EofB: Called when data is exhausted from selectB.
96460: **
96461: ** The implementation of the latter five subroutines depend on which
96462: ** <operator> is used:
96463: **
96464: **
96465: ** UNION ALL UNION EXCEPT INTERSECT
96466: ** ------------- ----------------- -------------- -----------------
96467: ** AltB: outA, nextA outA, nextA outA, nextA nextA
96468: **
96469: ** AeqB: outA, nextA nextA nextA outA, nextA
96470: **
96471: ** AgtB: outB, nextB outB, nextB nextB nextB
96472: **
96473: ** EofA: outB, nextB outB, nextB halt halt
96474: **
96475: ** EofB: outA, nextA outA, nextA outA, nextA halt
96476: **
96477: ** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA
96478: ** causes an immediate jump to EofA and an EOF on B following nextB causes
96479: ** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or
96480: ** following nextX causes a jump to the end of the select processing.
96481: **
96482: ** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled
96483: ** within the output subroutine. The regPrev register set holds the previously
96484: ** output value. A comparison is made against this value and the output
96485: ** is skipped if the next results would be the same as the previous.
96486: **
96487: ** The implementation plan is to implement the two coroutines and seven
96488: ** subroutines first, then put the control logic at the bottom. Like this:
96489: **
96490: ** goto Init
96491: ** coA: coroutine for left query (A)
96492: ** coB: coroutine for right query (B)
96493: ** outA: output one row of A
96494: ** outB: output one row of B (UNION and UNION ALL only)
96495: ** EofA: ...
96496: ** EofB: ...
96497: ** AltB: ...
96498: ** AeqB: ...
96499: ** AgtB: ...
96500: ** Init: initialize coroutine registers
96501: ** yield coA
96502: ** if eof(A) goto EofA
96503: ** yield coB
96504: ** if eof(B) goto EofB
96505: ** Cmpr: Compare A, B
96506: ** Jump AltB, AeqB, AgtB
96507: ** End: ...
96508: **
96509: ** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not
96510: ** actually called using Gosub and they do not Return. EofA and EofB loop
96511: ** until all data is exhausted then jump to the "end" labe. AltB, AeqB,
96512: ** and AgtB jump to either L2 or to one of EofA or EofB.
96513: */
96514: #ifndef SQLITE_OMIT_COMPOUND_SELECT
96515: static int multiSelectOrderBy(
96516: Parse *pParse, /* Parsing context */
96517: Select *p, /* The right-most of SELECTs to be coded */
96518: SelectDest *pDest /* What to do with query results */
96519: ){
96520: int i, j; /* Loop counters */
96521: Select *pPrior; /* Another SELECT immediately to our left */
96522: Vdbe *v; /* Generate code to this VDBE */
96523: SelectDest destA; /* Destination for coroutine A */
96524: SelectDest destB; /* Destination for coroutine B */
96525: int regAddrA; /* Address register for select-A coroutine */
96526: int regEofA; /* Flag to indicate when select-A is complete */
96527: int regAddrB; /* Address register for select-B coroutine */
96528: int regEofB; /* Flag to indicate when select-B is complete */
96529: int addrSelectA; /* Address of the select-A coroutine */
96530: int addrSelectB; /* Address of the select-B coroutine */
96531: int regOutA; /* Address register for the output-A subroutine */
96532: int regOutB; /* Address register for the output-B subroutine */
96533: int addrOutA; /* Address of the output-A subroutine */
96534: int addrOutB = 0; /* Address of the output-B subroutine */
96535: int addrEofA; /* Address of the select-A-exhausted subroutine */
96536: int addrEofB; /* Address of the select-B-exhausted subroutine */
96537: int addrAltB; /* Address of the A<B subroutine */
96538: int addrAeqB; /* Address of the A==B subroutine */
96539: int addrAgtB; /* Address of the A>B subroutine */
96540: int regLimitA; /* Limit register for select-A */
96541: int regLimitB; /* Limit register for select-A */
96542: int regPrev; /* A range of registers to hold previous output */
96543: int savedLimit; /* Saved value of p->iLimit */
96544: int savedOffset; /* Saved value of p->iOffset */
96545: int labelCmpr; /* Label for the start of the merge algorithm */
96546: int labelEnd; /* Label for the end of the overall SELECT stmt */
96547: int j1; /* Jump instructions that get retargetted */
96548: int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */
96549: KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */
96550: KeyInfo *pKeyMerge; /* Comparison information for merging rows */
96551: sqlite3 *db; /* Database connection */
96552: ExprList *pOrderBy; /* The ORDER BY clause */
96553: int nOrderBy; /* Number of terms in the ORDER BY clause */
96554: int *aPermute; /* Mapping from ORDER BY terms to result set columns */
96555: #ifndef SQLITE_OMIT_EXPLAIN
96556: int iSub1; /* EQP id of left-hand query */
96557: int iSub2; /* EQP id of right-hand query */
96558: #endif
96559:
96560: assert( p->pOrderBy!=0 );
96561: assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */
96562: db = pParse->db;
96563: v = pParse->pVdbe;
96564: assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */
96565: labelEnd = sqlite3VdbeMakeLabel(v);
96566: labelCmpr = sqlite3VdbeMakeLabel(v);
96567:
96568:
96569: /* Patch up the ORDER BY clause
96570: */
96571: op = p->op;
96572: pPrior = p->pPrior;
96573: assert( pPrior->pOrderBy==0 );
96574: pOrderBy = p->pOrderBy;
96575: assert( pOrderBy );
96576: nOrderBy = pOrderBy->nExpr;
96577:
96578: /* For operators other than UNION ALL we have to make sure that
96579: ** the ORDER BY clause covers every term of the result set. Add
96580: ** terms to the ORDER BY clause as necessary.
96581: */
96582: if( op!=TK_ALL ){
96583: for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){
96584: struct ExprList_item *pItem;
96585: for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){
96586: assert( pItem->iOrderByCol>0 );
96587: if( pItem->iOrderByCol==i ) break;
96588: }
96589: if( j==nOrderBy ){
96590: Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0);
96591: if( pNew==0 ) return SQLITE_NOMEM;
96592: pNew->flags |= EP_IntValue;
96593: pNew->u.iValue = i;
96594: pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew);
1.2.2.1 ! misho 96595: if( pOrderBy ) pOrderBy->a[nOrderBy++].iOrderByCol = (u16)i;
1.2 misho 96596: }
96597: }
96598: }
96599:
96600: /* Compute the comparison permutation and keyinfo that is used with
96601: ** the permutation used to determine if the next
96602: ** row of results comes from selectA or selectB. Also add explicit
96603: ** collations to the ORDER BY clause terms so that when the subqueries
96604: ** to the right and the left are evaluated, they use the correct
96605: ** collation.
96606: */
96607: aPermute = sqlite3DbMallocRaw(db, sizeof(int)*nOrderBy);
96608: if( aPermute ){
96609: struct ExprList_item *pItem;
96610: for(i=0, pItem=pOrderBy->a; i<nOrderBy; i++, pItem++){
96611: assert( pItem->iOrderByCol>0 && pItem->iOrderByCol<=p->pEList->nExpr );
96612: aPermute[i] = pItem->iOrderByCol - 1;
96613: }
96614: pKeyMerge =
96615: sqlite3DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1));
96616: if( pKeyMerge ){
96617: pKeyMerge->aSortOrder = (u8*)&pKeyMerge->aColl[nOrderBy];
96618: pKeyMerge->nField = (u16)nOrderBy;
96619: pKeyMerge->enc = ENC(db);
96620: for(i=0; i<nOrderBy; i++){
96621: CollSeq *pColl;
96622: Expr *pTerm = pOrderBy->a[i].pExpr;
1.2.2.1 ! misho 96623: if( pTerm->flags & EP_Collate ){
! 96624: pColl = sqlite3ExprCollSeq(pParse, pTerm);
1.2 misho 96625: }else{
96626: pColl = multiSelectCollSeq(pParse, p, aPermute[i]);
1.2.2.1 ! misho 96627: if( pColl==0 ) pColl = db->pDfltColl;
! 96628: pOrderBy->a[i].pExpr =
! 96629: sqlite3ExprAddCollateString(pParse, pTerm, pColl->zName);
1.2 misho 96630: }
96631: pKeyMerge->aColl[i] = pColl;
96632: pKeyMerge->aSortOrder[i] = pOrderBy->a[i].sortOrder;
96633: }
96634: }
96635: }else{
96636: pKeyMerge = 0;
96637: }
96638:
96639: /* Reattach the ORDER BY clause to the query.
96640: */
96641: p->pOrderBy = pOrderBy;
96642: pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0);
96643:
96644: /* Allocate a range of temporary registers and the KeyInfo needed
96645: ** for the logic that removes duplicate result rows when the
96646: ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL).
96647: */
96648: if( op==TK_ALL ){
96649: regPrev = 0;
96650: }else{
96651: int nExpr = p->pEList->nExpr;
96652: assert( nOrderBy>=nExpr || db->mallocFailed );
96653: regPrev = sqlite3GetTempRange(pParse, nExpr+1);
96654: sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev);
96655: pKeyDup = sqlite3DbMallocZero(db,
96656: sizeof(*pKeyDup) + nExpr*(sizeof(CollSeq*)+1) );
96657: if( pKeyDup ){
96658: pKeyDup->aSortOrder = (u8*)&pKeyDup->aColl[nExpr];
96659: pKeyDup->nField = (u16)nExpr;
96660: pKeyDup->enc = ENC(db);
96661: for(i=0; i<nExpr; i++){
96662: pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i);
96663: pKeyDup->aSortOrder[i] = 0;
96664: }
96665: }
96666: }
96667:
96668: /* Separate the left and the right query from one another
96669: */
96670: p->pPrior = 0;
96671: sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER");
96672: if( pPrior->pPrior==0 ){
96673: sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER");
96674: }
96675:
96676: /* Compute the limit registers */
96677: computeLimitRegisters(pParse, p, labelEnd);
96678: if( p->iLimit && op==TK_ALL ){
96679: regLimitA = ++pParse->nMem;
96680: regLimitB = ++pParse->nMem;
96681: sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit,
96682: regLimitA);
96683: sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB);
96684: }else{
96685: regLimitA = regLimitB = 0;
96686: }
96687: sqlite3ExprDelete(db, p->pLimit);
96688: p->pLimit = 0;
96689: sqlite3ExprDelete(db, p->pOffset);
96690: p->pOffset = 0;
96691:
96692: regAddrA = ++pParse->nMem;
96693: regEofA = ++pParse->nMem;
96694: regAddrB = ++pParse->nMem;
96695: regEofB = ++pParse->nMem;
96696: regOutA = ++pParse->nMem;
96697: regOutB = ++pParse->nMem;
96698: sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA);
96699: sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB);
96700:
96701: /* Jump past the various subroutines and coroutines to the main
96702: ** merge loop
96703: */
96704: j1 = sqlite3VdbeAddOp0(v, OP_Goto);
96705: addrSelectA = sqlite3VdbeCurrentAddr(v);
96706:
96707:
96708: /* Generate a coroutine to evaluate the SELECT statement to the
96709: ** left of the compound operator - the "A" select.
96710: */
96711: VdbeNoopComment((v, "Begin coroutine for left SELECT"));
96712: pPrior->iLimit = regLimitA;
96713: explainSetInteger(iSub1, pParse->iNextSelectId);
96714: sqlite3Select(pParse, pPrior, &destA);
96715: sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofA);
96716: sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
96717: VdbeNoopComment((v, "End coroutine for left SELECT"));
96718:
96719: /* Generate a coroutine to evaluate the SELECT statement on
96720: ** the right - the "B" select
96721: */
96722: addrSelectB = sqlite3VdbeCurrentAddr(v);
96723: VdbeNoopComment((v, "Begin coroutine for right SELECT"));
96724: savedLimit = p->iLimit;
96725: savedOffset = p->iOffset;
96726: p->iLimit = regLimitB;
96727: p->iOffset = 0;
96728: explainSetInteger(iSub2, pParse->iNextSelectId);
96729: sqlite3Select(pParse, p, &destB);
96730: p->iLimit = savedLimit;
96731: p->iOffset = savedOffset;
96732: sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofB);
96733: sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
96734: VdbeNoopComment((v, "End coroutine for right SELECT"));
96735:
96736: /* Generate a subroutine that outputs the current row of the A
96737: ** select as the next output row of the compound select.
96738: */
96739: VdbeNoopComment((v, "Output routine for A"));
96740: addrOutA = generateOutputSubroutine(pParse,
96741: p, &destA, pDest, regOutA,
96742: regPrev, pKeyDup, P4_KEYINFO_HANDOFF, labelEnd);
96743:
96744: /* Generate a subroutine that outputs the current row of the B
96745: ** select as the next output row of the compound select.
96746: */
96747: if( op==TK_ALL || op==TK_UNION ){
96748: VdbeNoopComment((v, "Output routine for B"));
96749: addrOutB = generateOutputSubroutine(pParse,
96750: p, &destB, pDest, regOutB,
96751: regPrev, pKeyDup, P4_KEYINFO_STATIC, labelEnd);
96752: }
96753:
96754: /* Generate a subroutine to run when the results from select A
96755: ** are exhausted and only data in select B remains.
96756: */
96757: VdbeNoopComment((v, "eof-A subroutine"));
96758: if( op==TK_EXCEPT || op==TK_INTERSECT ){
96759: addrEofA = sqlite3VdbeAddOp2(v, OP_Goto, 0, labelEnd);
96760: }else{
96761: addrEofA = sqlite3VdbeAddOp2(v, OP_If, regEofB, labelEnd);
96762: sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);
96763: sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
96764: sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofA);
96765: p->nSelectRow += pPrior->nSelectRow;
96766: }
96767:
96768: /* Generate a subroutine to run when the results from select B
96769: ** are exhausted and only data in select A remains.
96770: */
96771: if( op==TK_INTERSECT ){
96772: addrEofB = addrEofA;
96773: if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow;
96774: }else{
96775: VdbeNoopComment((v, "eof-B subroutine"));
96776: addrEofB = sqlite3VdbeAddOp2(v, OP_If, regEofA, labelEnd);
96777: sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);
96778: sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
96779: sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofB);
96780: }
96781:
96782: /* Generate code to handle the case of A<B
96783: */
96784: VdbeNoopComment((v, "A-lt-B subroutine"));
96785: addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA);
96786: sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
96787: sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
96788: sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
96789:
96790: /* Generate code to handle the case of A==B
96791: */
96792: if( op==TK_ALL ){
96793: addrAeqB = addrAltB;
96794: }else if( op==TK_INTERSECT ){
96795: addrAeqB = addrAltB;
96796: addrAltB++;
96797: }else{
96798: VdbeNoopComment((v, "A-eq-B subroutine"));
96799: addrAeqB =
96800: sqlite3VdbeAddOp1(v, OP_Yield, regAddrA);
96801: sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
96802: sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
96803: }
96804:
96805: /* Generate code to handle the case of A>B
96806: */
96807: VdbeNoopComment((v, "A-gt-B subroutine"));
96808: addrAgtB = sqlite3VdbeCurrentAddr(v);
96809: if( op==TK_ALL || op==TK_UNION ){
96810: sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB);
96811: }
96812: sqlite3VdbeAddOp1(v, OP_Yield, regAddrB);
96813: sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB);
96814: sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr);
96815:
96816: /* This code runs once to initialize everything.
96817: */
96818: sqlite3VdbeJumpHere(v, j1);
96819: sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofA);
96820: sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofB);
96821: sqlite3VdbeAddOp2(v, OP_Gosub, regAddrA, addrSelectA);
96822: sqlite3VdbeAddOp2(v, OP_Gosub, regAddrB, addrSelectB);
96823: sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA);
96824: sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB);
96825:
96826: /* Implement the main merge loop
96827: */
96828: sqlite3VdbeResolveLabel(v, labelCmpr);
96829: sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY);
1.2.2.1 ! misho 96830: sqlite3VdbeAddOp4(v, OP_Compare, destA.iSdst, destB.iSdst, nOrderBy,
1.2 misho 96831: (char*)pKeyMerge, P4_KEYINFO_HANDOFF);
1.2.2.1 ! misho 96832: sqlite3VdbeChangeP5(v, OPFLAG_PERMUTE);
1.2 misho 96833: sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB);
96834:
96835: /* Release temporary registers
96836: */
96837: if( regPrev ){
96838: sqlite3ReleaseTempRange(pParse, regPrev, nOrderBy+1);
96839: }
96840:
96841: /* Jump to the this point in order to terminate the query.
96842: */
96843: sqlite3VdbeResolveLabel(v, labelEnd);
96844:
96845: /* Set the number of output columns
96846: */
96847: if( pDest->eDest==SRT_Output ){
96848: Select *pFirst = pPrior;
96849: while( pFirst->pPrior ) pFirst = pFirst->pPrior;
96850: generateColumnNames(pParse, 0, pFirst->pEList);
96851: }
96852:
96853: /* Reassembly the compound query so that it will be freed correctly
96854: ** by the calling function */
96855: if( p->pPrior ){
96856: sqlite3SelectDelete(db, p->pPrior);
96857: }
96858: p->pPrior = pPrior;
96859:
96860: /*** TBD: Insert subroutine calls to close cursors on incomplete
96861: **** subqueries ****/
96862: explainComposite(pParse, p->op, iSub1, iSub2, 0);
96863: return SQLITE_OK;
96864: }
96865: #endif
96866:
96867: #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
96868: /* Forward Declarations */
96869: static void substExprList(sqlite3*, ExprList*, int, ExprList*);
96870: static void substSelect(sqlite3*, Select *, int, ExprList *);
96871:
96872: /*
96873: ** Scan through the expression pExpr. Replace every reference to
96874: ** a column in table number iTable with a copy of the iColumn-th
96875: ** entry in pEList. (But leave references to the ROWID column
96876: ** unchanged.)
96877: **
96878: ** This routine is part of the flattening procedure. A subquery
96879: ** whose result set is defined by pEList appears as entry in the
96880: ** FROM clause of a SELECT such that the VDBE cursor assigned to that
96881: ** FORM clause entry is iTable. This routine make the necessary
96882: ** changes to pExpr so that it refers directly to the source table
96883: ** of the subquery rather the result set of the subquery.
96884: */
96885: static Expr *substExpr(
96886: sqlite3 *db, /* Report malloc errors to this connection */
96887: Expr *pExpr, /* Expr in which substitution occurs */
96888: int iTable, /* Table to be substituted */
96889: ExprList *pEList /* Substitute expressions */
96890: ){
96891: if( pExpr==0 ) return 0;
96892: if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){
96893: if( pExpr->iColumn<0 ){
96894: pExpr->op = TK_NULL;
96895: }else{
96896: Expr *pNew;
96897: assert( pEList!=0 && pExpr->iColumn<pEList->nExpr );
96898: assert( pExpr->pLeft==0 && pExpr->pRight==0 );
96899: pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0);
96900: sqlite3ExprDelete(db, pExpr);
96901: pExpr = pNew;
96902: }
96903: }else{
96904: pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList);
96905: pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList);
96906: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
96907: substSelect(db, pExpr->x.pSelect, iTable, pEList);
96908: }else{
96909: substExprList(db, pExpr->x.pList, iTable, pEList);
96910: }
96911: }
96912: return pExpr;
96913: }
96914: static void substExprList(
96915: sqlite3 *db, /* Report malloc errors here */
96916: ExprList *pList, /* List to scan and in which to make substitutes */
96917: int iTable, /* Table to be substituted */
96918: ExprList *pEList /* Substitute values */
96919: ){
96920: int i;
96921: if( pList==0 ) return;
96922: for(i=0; i<pList->nExpr; i++){
96923: pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList);
96924: }
96925: }
96926: static void substSelect(
96927: sqlite3 *db, /* Report malloc errors here */
96928: Select *p, /* SELECT statement in which to make substitutions */
96929: int iTable, /* Table to be replaced */
96930: ExprList *pEList /* Substitute values */
96931: ){
96932: SrcList *pSrc;
96933: struct SrcList_item *pItem;
96934: int i;
96935: if( !p ) return;
96936: substExprList(db, p->pEList, iTable, pEList);
96937: substExprList(db, p->pGroupBy, iTable, pEList);
96938: substExprList(db, p->pOrderBy, iTable, pEList);
96939: p->pHaving = substExpr(db, p->pHaving, iTable, pEList);
96940: p->pWhere = substExpr(db, p->pWhere, iTable, pEList);
96941: substSelect(db, p->pPrior, iTable, pEList);
96942: pSrc = p->pSrc;
96943: assert( pSrc ); /* Even for (SELECT 1) we have: pSrc!=0 but pSrc->nSrc==0 */
96944: if( ALWAYS(pSrc) ){
96945: for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){
96946: substSelect(db, pItem->pSelect, iTable, pEList);
96947: }
96948: }
96949: }
96950: #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
96951:
96952: #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
96953: /*
96954: ** This routine attempts to flatten subqueries as a performance optimization.
96955: ** This routine returns 1 if it makes changes and 0 if no flattening occurs.
96956: **
96957: ** To understand the concept of flattening, consider the following
96958: ** query:
96959: **
96960: ** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5
96961: **
96962: ** The default way of implementing this query is to execute the
96963: ** subquery first and store the results in a temporary table, then
96964: ** run the outer query on that temporary table. This requires two
96965: ** passes over the data. Furthermore, because the temporary table
96966: ** has no indices, the WHERE clause on the outer query cannot be
96967: ** optimized.
96968: **
96969: ** This routine attempts to rewrite queries such as the above into
96970: ** a single flat select, like this:
96971: **
96972: ** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5
96973: **
96974: ** The code generated for this simpification gives the same result
96975: ** but only has to scan the data once. And because indices might
96976: ** exist on the table t1, a complete scan of the data might be
96977: ** avoided.
96978: **
96979: ** Flattening is only attempted if all of the following are true:
96980: **
96981: ** (1) The subquery and the outer query do not both use aggregates.
96982: **
96983: ** (2) The subquery is not an aggregate or the outer query is not a join.
96984: **
96985: ** (3) The subquery is not the right operand of a left outer join
96986: ** (Originally ticket #306. Strengthened by ticket #3300)
96987: **
96988: ** (4) The subquery is not DISTINCT.
96989: **
96990: ** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT
96991: ** sub-queries that were excluded from this optimization. Restriction
96992: ** (4) has since been expanded to exclude all DISTINCT subqueries.
96993: **
96994: ** (6) The subquery does not use aggregates or the outer query is not
96995: ** DISTINCT.
96996: **
96997: ** (7) The subquery has a FROM clause. TODO: For subqueries without
96998: ** A FROM clause, consider adding a FROM close with the special
96999: ** table sqlite_once that consists of a single row containing a
97000: ** single NULL.
97001: **
97002: ** (8) The subquery does not use LIMIT or the outer query is not a join.
97003: **
97004: ** (9) The subquery does not use LIMIT or the outer query does not use
97005: ** aggregates.
97006: **
97007: ** (10) The subquery does not use aggregates or the outer query does not
97008: ** use LIMIT.
97009: **
97010: ** (11) The subquery and the outer query do not both have ORDER BY clauses.
97011: **
97012: ** (**) Not implemented. Subsumed into restriction (3). Was previously
97013: ** a separate restriction deriving from ticket #350.
97014: **
97015: ** (13) The subquery and outer query do not both use LIMIT.
97016: **
97017: ** (14) The subquery does not use OFFSET.
97018: **
97019: ** (15) The outer query is not part of a compound select or the
97020: ** subquery does not have a LIMIT clause.
97021: ** (See ticket #2339 and ticket [02a8e81d44]).
97022: **
97023: ** (16) The outer query is not an aggregate or the subquery does
97024: ** not contain ORDER BY. (Ticket #2942) This used to not matter
97025: ** until we introduced the group_concat() function.
97026: **
97027: ** (17) The sub-query is not a compound select, or it is a UNION ALL
97028: ** compound clause made up entirely of non-aggregate queries, and
97029: ** the parent query:
97030: **
97031: ** * is not itself part of a compound select,
97032: ** * is not an aggregate or DISTINCT query, and
97033: ** * is not a join
97034: **
97035: ** The parent and sub-query may contain WHERE clauses. Subject to
97036: ** rules (11), (13) and (14), they may also contain ORDER BY,
97037: ** LIMIT and OFFSET clauses. The subquery cannot use any compound
97038: ** operator other than UNION ALL because all the other compound
97039: ** operators have an implied DISTINCT which is disallowed by
97040: ** restriction (4).
97041: **
1.2.2.1 ! misho 97042: ** Also, each component of the sub-query must return the same number
! 97043: ** of result columns. This is actually a requirement for any compound
! 97044: ** SELECT statement, but all the code here does is make sure that no
! 97045: ** such (illegal) sub-query is flattened. The caller will detect the
! 97046: ** syntax error and return a detailed message.
! 97047: **
1.2 misho 97048: ** (18) If the sub-query is a compound select, then all terms of the
97049: ** ORDER by clause of the parent must be simple references to
97050: ** columns of the sub-query.
97051: **
97052: ** (19) The subquery does not use LIMIT or the outer query does not
97053: ** have a WHERE clause.
97054: **
97055: ** (20) If the sub-query is a compound select, then it must not use
97056: ** an ORDER BY clause. Ticket #3773. We could relax this constraint
97057: ** somewhat by saying that the terms of the ORDER BY clause must
97058: ** appear as unmodified result columns in the outer query. But we
97059: ** have other optimizations in mind to deal with that case.
97060: **
97061: ** (21) The subquery does not use LIMIT or the outer query is not
97062: ** DISTINCT. (See ticket [752e1646fc]).
97063: **
97064: ** In this routine, the "p" parameter is a pointer to the outer query.
97065: ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query
97066: ** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates.
97067: **
97068: ** If flattening is not attempted, this routine is a no-op and returns 0.
97069: ** If flattening is attempted this routine returns 1.
97070: **
97071: ** All of the expression analysis must occur on both the outer query and
97072: ** the subquery before this routine runs.
97073: */
97074: static int flattenSubquery(
97075: Parse *pParse, /* Parsing context */
97076: Select *p, /* The parent or outer SELECT statement */
97077: int iFrom, /* Index in p->pSrc->a[] of the inner subquery */
97078: int isAgg, /* True if outer SELECT uses aggregate functions */
97079: int subqueryIsAgg /* True if the subquery uses aggregate functions */
97080: ){
97081: const char *zSavedAuthContext = pParse->zAuthContext;
97082: Select *pParent;
97083: Select *pSub; /* The inner query or "subquery" */
97084: Select *pSub1; /* Pointer to the rightmost select in sub-query */
97085: SrcList *pSrc; /* The FROM clause of the outer query */
97086: SrcList *pSubSrc; /* The FROM clause of the subquery */
97087: ExprList *pList; /* The result set of the outer query */
97088: int iParent; /* VDBE cursor number of the pSub result set temp table */
97089: int i; /* Loop counter */
97090: Expr *pWhere; /* The WHERE clause */
97091: struct SrcList_item *pSubitem; /* The subquery */
97092: sqlite3 *db = pParse->db;
97093:
97094: /* Check to see if flattening is permitted. Return 0 if not.
97095: */
97096: assert( p!=0 );
97097: assert( p->pPrior==0 ); /* Unable to flatten compound queries */
1.2.2.1 ! misho 97098: if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0;
1.2 misho 97099: pSrc = p->pSrc;
97100: assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc );
97101: pSubitem = &pSrc->a[iFrom];
97102: iParent = pSubitem->iCursor;
97103: pSub = pSubitem->pSelect;
97104: assert( pSub!=0 );
97105: if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */
97106: if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; /* Restriction (2) */
97107: pSubSrc = pSub->pSrc;
97108: assert( pSubSrc );
97109: /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants,
97110: ** not arbitrary expresssions, we allowed some combining of LIMIT and OFFSET
97111: ** because they could be computed at compile-time. But when LIMIT and OFFSET
97112: ** became arbitrary expressions, we were forced to add restrictions (13)
97113: ** and (14). */
97114: if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */
97115: if( pSub->pOffset ) return 0; /* Restriction (14) */
97116: if( p->pRightmost && pSub->pLimit ){
97117: return 0; /* Restriction (15) */
97118: }
97119: if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */
97120: if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (5) */
97121: if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){
97122: return 0; /* Restrictions (8)(9) */
97123: }
97124: if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){
97125: return 0; /* Restriction (6) */
97126: }
97127: if( p->pOrderBy && pSub->pOrderBy ){
97128: return 0; /* Restriction (11) */
97129: }
97130: if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */
97131: if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */
97132: if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){
97133: return 0; /* Restriction (21) */
97134: }
97135:
97136: /* OBSOLETE COMMENT 1:
97137: ** Restriction 3: If the subquery is a join, make sure the subquery is
97138: ** not used as the right operand of an outer join. Examples of why this
97139: ** is not allowed:
97140: **
97141: ** t1 LEFT OUTER JOIN (t2 JOIN t3)
97142: **
97143: ** If we flatten the above, we would get
97144: **
97145: ** (t1 LEFT OUTER JOIN t2) JOIN t3
97146: **
97147: ** which is not at all the same thing.
97148: **
97149: ** OBSOLETE COMMENT 2:
97150: ** Restriction 12: If the subquery is the right operand of a left outer
97151: ** join, make sure the subquery has no WHERE clause.
97152: ** An examples of why this is not allowed:
97153: **
97154: ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0)
97155: **
97156: ** If we flatten the above, we would get
97157: **
97158: ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0
97159: **
97160: ** But the t2.x>0 test will always fail on a NULL row of t2, which
97161: ** effectively converts the OUTER JOIN into an INNER JOIN.
97162: **
97163: ** THIS OVERRIDES OBSOLETE COMMENTS 1 AND 2 ABOVE:
97164: ** Ticket #3300 shows that flattening the right term of a LEFT JOIN
97165: ** is fraught with danger. Best to avoid the whole thing. If the
97166: ** subquery is the right term of a LEFT JOIN, then do not flatten.
97167: */
97168: if( (pSubitem->jointype & JT_OUTER)!=0 ){
97169: return 0;
97170: }
97171:
97172: /* Restriction 17: If the sub-query is a compound SELECT, then it must
97173: ** use only the UNION ALL operator. And none of the simple select queries
97174: ** that make up the compound SELECT are allowed to be aggregate or distinct
97175: ** queries.
97176: */
97177: if( pSub->pPrior ){
97178: if( pSub->pOrderBy ){
97179: return 0; /* Restriction 20 */
97180: }
97181: if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){
97182: return 0;
97183: }
97184: for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){
97185: testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct );
97186: testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate );
97187: assert( pSub->pSrc!=0 );
97188: if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0
97189: || (pSub1->pPrior && pSub1->op!=TK_ALL)
97190: || pSub1->pSrc->nSrc<1
1.2.2.1 ! misho 97191: || pSub->pEList->nExpr!=pSub1->pEList->nExpr
1.2 misho 97192: ){
97193: return 0;
97194: }
97195: testcase( pSub1->pSrc->nSrc>1 );
97196: }
97197:
97198: /* Restriction 18. */
97199: if( p->pOrderBy ){
97200: int ii;
97201: for(ii=0; ii<p->pOrderBy->nExpr; ii++){
97202: if( p->pOrderBy->a[ii].iOrderByCol==0 ) return 0;
97203: }
97204: }
97205: }
97206:
97207: /***** If we reach this point, flattening is permitted. *****/
97208:
97209: /* Authorize the subquery */
97210: pParse->zAuthContext = pSubitem->zName;
1.2.2.1 ! misho 97211: TESTONLY(i =) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0);
! 97212: testcase( i==SQLITE_DENY );
1.2 misho 97213: pParse->zAuthContext = zSavedAuthContext;
97214:
97215: /* If the sub-query is a compound SELECT statement, then (by restrictions
97216: ** 17 and 18 above) it must be a UNION ALL and the parent query must
97217: ** be of the form:
97218: **
97219: ** SELECT <expr-list> FROM (<sub-query>) <where-clause>
97220: **
97221: ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block
97222: ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or
97223: ** OFFSET clauses and joins them to the left-hand-side of the original
97224: ** using UNION ALL operators. In this case N is the number of simple
97225: ** select statements in the compound sub-query.
97226: **
97227: ** Example:
97228: **
97229: ** SELECT a+1 FROM (
97230: ** SELECT x FROM tab
97231: ** UNION ALL
97232: ** SELECT y FROM tab
97233: ** UNION ALL
97234: ** SELECT abs(z*2) FROM tab2
97235: ** ) WHERE a!=5 ORDER BY 1
97236: **
97237: ** Transformed into:
97238: **
97239: ** SELECT x+1 FROM tab WHERE x+1!=5
97240: ** UNION ALL
97241: ** SELECT y+1 FROM tab WHERE y+1!=5
97242: ** UNION ALL
97243: ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5
97244: ** ORDER BY 1
97245: **
97246: ** We call this the "compound-subquery flattening".
97247: */
97248: for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){
97249: Select *pNew;
97250: ExprList *pOrderBy = p->pOrderBy;
97251: Expr *pLimit = p->pLimit;
97252: Select *pPrior = p->pPrior;
97253: p->pOrderBy = 0;
97254: p->pSrc = 0;
97255: p->pPrior = 0;
97256: p->pLimit = 0;
97257: pNew = sqlite3SelectDup(db, p, 0);
97258: p->pLimit = pLimit;
97259: p->pOrderBy = pOrderBy;
97260: p->pSrc = pSrc;
97261: p->op = TK_ALL;
97262: p->pRightmost = 0;
97263: if( pNew==0 ){
97264: pNew = pPrior;
97265: }else{
97266: pNew->pPrior = pPrior;
97267: pNew->pRightmost = 0;
97268: }
97269: p->pPrior = pNew;
97270: if( db->mallocFailed ) return 1;
97271: }
97272:
97273: /* Begin flattening the iFrom-th entry of the FROM clause
97274: ** in the outer query.
97275: */
97276: pSub = pSub1 = pSubitem->pSelect;
97277:
97278: /* Delete the transient table structure associated with the
97279: ** subquery
97280: */
97281: sqlite3DbFree(db, pSubitem->zDatabase);
97282: sqlite3DbFree(db, pSubitem->zName);
97283: sqlite3DbFree(db, pSubitem->zAlias);
97284: pSubitem->zDatabase = 0;
97285: pSubitem->zName = 0;
97286: pSubitem->zAlias = 0;
97287: pSubitem->pSelect = 0;
97288:
97289: /* Defer deleting the Table object associated with the
97290: ** subquery until code generation is
97291: ** complete, since there may still exist Expr.pTab entries that
97292: ** refer to the subquery even after flattening. Ticket #3346.
97293: **
97294: ** pSubitem->pTab is always non-NULL by test restrictions and tests above.
97295: */
97296: if( ALWAYS(pSubitem->pTab!=0) ){
97297: Table *pTabToDel = pSubitem->pTab;
97298: if( pTabToDel->nRef==1 ){
97299: Parse *pToplevel = sqlite3ParseToplevel(pParse);
97300: pTabToDel->pNextZombie = pToplevel->pZombieTab;
97301: pToplevel->pZombieTab = pTabToDel;
97302: }else{
97303: pTabToDel->nRef--;
97304: }
97305: pSubitem->pTab = 0;
97306: }
97307:
97308: /* The following loop runs once for each term in a compound-subquery
97309: ** flattening (as described above). If we are doing a different kind
97310: ** of flattening - a flattening other than a compound-subquery flattening -
97311: ** then this loop only runs once.
97312: **
97313: ** This loop moves all of the FROM elements of the subquery into the
97314: ** the FROM clause of the outer query. Before doing this, remember
97315: ** the cursor number for the original outer query FROM element in
97316: ** iParent. The iParent cursor will never be used. Subsequent code
97317: ** will scan expressions looking for iParent references and replace
97318: ** those references with expressions that resolve to the subquery FROM
97319: ** elements we are now copying in.
97320: */
97321: for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){
97322: int nSubSrc;
97323: u8 jointype = 0;
97324: pSubSrc = pSub->pSrc; /* FROM clause of subquery */
97325: nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */
97326: pSrc = pParent->pSrc; /* FROM clause of the outer query */
97327:
97328: if( pSrc ){
97329: assert( pParent==p ); /* First time through the loop */
97330: jointype = pSubitem->jointype;
97331: }else{
97332: assert( pParent!=p ); /* 2nd and subsequent times through the loop */
97333: pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0);
97334: if( pSrc==0 ){
97335: assert( db->mallocFailed );
97336: break;
97337: }
97338: }
97339:
97340: /* The subquery uses a single slot of the FROM clause of the outer
97341: ** query. If the subquery has more than one element in its FROM clause,
97342: ** then expand the outer query to make space for it to hold all elements
97343: ** of the subquery.
97344: **
97345: ** Example:
97346: **
97347: ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB;
97348: **
97349: ** The outer query has 3 slots in its FROM clause. One slot of the
97350: ** outer query (the middle slot) is used by the subquery. The next
97351: ** block of code will expand the out query to 4 slots. The middle
97352: ** slot is expanded to two slots in order to make space for the
97353: ** two elements in the FROM clause of the subquery.
97354: */
97355: if( nSubSrc>1 ){
97356: pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1);
97357: if( db->mallocFailed ){
97358: break;
97359: }
97360: }
97361:
97362: /* Transfer the FROM clause terms from the subquery into the
97363: ** outer query.
97364: */
97365: for(i=0; i<nSubSrc; i++){
97366: sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing);
97367: pSrc->a[i+iFrom] = pSubSrc->a[i];
97368: memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
97369: }
97370: pSrc->a[iFrom].jointype = jointype;
97371:
97372: /* Now begin substituting subquery result set expressions for
97373: ** references to the iParent in the outer query.
97374: **
97375: ** Example:
97376: **
97377: ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b;
97378: ** \ \_____________ subquery __________/ /
97379: ** \_____________________ outer query ______________________________/
97380: **
97381: ** We look at every expression in the outer query and every place we see
97382: ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10".
97383: */
97384: pList = pParent->pEList;
97385: for(i=0; i<pList->nExpr; i++){
97386: if( pList->a[i].zName==0 ){
1.2.2.1 ! misho 97387: char *zName = sqlite3DbStrDup(db, pList->a[i].zSpan);
! 97388: sqlite3Dequote(zName);
! 97389: pList->a[i].zName = zName;
1.2 misho 97390: }
97391: }
97392: substExprList(db, pParent->pEList, iParent, pSub->pEList);
97393: if( isAgg ){
97394: substExprList(db, pParent->pGroupBy, iParent, pSub->pEList);
97395: pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList);
97396: }
97397: if( pSub->pOrderBy ){
97398: assert( pParent->pOrderBy==0 );
97399: pParent->pOrderBy = pSub->pOrderBy;
97400: pSub->pOrderBy = 0;
97401: }else if( pParent->pOrderBy ){
97402: substExprList(db, pParent->pOrderBy, iParent, pSub->pEList);
97403: }
97404: if( pSub->pWhere ){
97405: pWhere = sqlite3ExprDup(db, pSub->pWhere, 0);
97406: }else{
97407: pWhere = 0;
97408: }
97409: if( subqueryIsAgg ){
97410: assert( pParent->pHaving==0 );
97411: pParent->pHaving = pParent->pWhere;
97412: pParent->pWhere = pWhere;
97413: pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList);
97414: pParent->pHaving = sqlite3ExprAnd(db, pParent->pHaving,
97415: sqlite3ExprDup(db, pSub->pHaving, 0));
97416: assert( pParent->pGroupBy==0 );
97417: pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0);
97418: }else{
97419: pParent->pWhere = substExpr(db, pParent->pWhere, iParent, pSub->pEList);
97420: pParent->pWhere = sqlite3ExprAnd(db, pParent->pWhere, pWhere);
97421: }
97422:
97423: /* The flattened query is distinct if either the inner or the
97424: ** outer query is distinct.
97425: */
97426: pParent->selFlags |= pSub->selFlags & SF_Distinct;
97427:
97428: /*
97429: ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y;
97430: **
97431: ** One is tempted to try to add a and b to combine the limits. But this
97432: ** does not work if either limit is negative.
97433: */
97434: if( pSub->pLimit ){
97435: pParent->pLimit = pSub->pLimit;
97436: pSub->pLimit = 0;
97437: }
97438: }
97439:
97440: /* Finially, delete what is left of the subquery and return
97441: ** success.
97442: */
97443: sqlite3SelectDelete(db, pSub1);
97444:
97445: return 1;
97446: }
97447: #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */
97448:
97449: /*
97450: ** Analyze the SELECT statement passed as an argument to see if it
97451: ** is a min() or max() query. Return WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX if
97452: ** it is, or 0 otherwise. At present, a query is considered to be
97453: ** a min()/max() query if:
97454: **
97455: ** 1. There is a single object in the FROM clause.
97456: **
97457: ** 2. There is a single expression in the result set, and it is
97458: ** either min(x) or max(x), where x is a column reference.
97459: */
97460: static u8 minMaxQuery(Select *p){
97461: Expr *pExpr;
97462: ExprList *pEList = p->pEList;
97463:
97464: if( pEList->nExpr!=1 ) return WHERE_ORDERBY_NORMAL;
97465: pExpr = pEList->a[0].pExpr;
97466: if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
97467: if( NEVER(ExprHasProperty(pExpr, EP_xIsSelect)) ) return 0;
97468: pEList = pExpr->x.pList;
97469: if( pEList==0 || pEList->nExpr!=1 ) return 0;
97470: if( pEList->a[0].pExpr->op!=TK_AGG_COLUMN ) return WHERE_ORDERBY_NORMAL;
97471: assert( !ExprHasProperty(pExpr, EP_IntValue) );
97472: if( sqlite3StrICmp(pExpr->u.zToken,"min")==0 ){
97473: return WHERE_ORDERBY_MIN;
97474: }else if( sqlite3StrICmp(pExpr->u.zToken,"max")==0 ){
97475: return WHERE_ORDERBY_MAX;
97476: }
97477: return WHERE_ORDERBY_NORMAL;
97478: }
97479:
97480: /*
97481: ** The select statement passed as the first argument is an aggregate query.
97482: ** The second argment is the associated aggregate-info object. This
97483: ** function tests if the SELECT is of the form:
97484: **
97485: ** SELECT count(*) FROM <tbl>
97486: **
97487: ** where table is a database table, not a sub-select or view. If the query
97488: ** does match this pattern, then a pointer to the Table object representing
97489: ** <tbl> is returned. Otherwise, 0 is returned.
97490: */
97491: static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
97492: Table *pTab;
97493: Expr *pExpr;
97494:
97495: assert( !p->pGroupBy );
97496:
97497: if( p->pWhere || p->pEList->nExpr!=1
97498: || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect
97499: ){
97500: return 0;
97501: }
97502: pTab = p->pSrc->a[0].pTab;
97503: pExpr = p->pEList->a[0].pExpr;
97504: assert( pTab && !pTab->pSelect && pExpr );
97505:
97506: if( IsVirtual(pTab) ) return 0;
97507: if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
1.2.2.1 ! misho 97508: if( NEVER(pAggInfo->nFunc==0) ) return 0;
1.2 misho 97509: if( (pAggInfo->aFunc[0].pFunc->flags&SQLITE_FUNC_COUNT)==0 ) return 0;
97510: if( pExpr->flags&EP_Distinct ) return 0;
97511:
97512: return pTab;
97513: }
97514:
97515: /*
97516: ** If the source-list item passed as an argument was augmented with an
97517: ** INDEXED BY clause, then try to locate the specified index. If there
97518: ** was such a clause and the named index cannot be found, return
97519: ** SQLITE_ERROR and leave an error in pParse. Otherwise, populate
97520: ** pFrom->pIndex and return SQLITE_OK.
97521: */
97522: SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){
97523: if( pFrom->pTab && pFrom->zIndex ){
97524: Table *pTab = pFrom->pTab;
97525: char *zIndex = pFrom->zIndex;
97526: Index *pIdx;
97527: for(pIdx=pTab->pIndex;
97528: pIdx && sqlite3StrICmp(pIdx->zName, zIndex);
97529: pIdx=pIdx->pNext
97530: );
97531: if( !pIdx ){
97532: sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0);
97533: pParse->checkSchema = 1;
97534: return SQLITE_ERROR;
97535: }
97536: pFrom->pIndex = pIdx;
97537: }
97538: return SQLITE_OK;
97539: }
97540:
97541: /*
97542: ** This routine is a Walker callback for "expanding" a SELECT statement.
97543: ** "Expanding" means to do the following:
97544: **
97545: ** (1) Make sure VDBE cursor numbers have been assigned to every
97546: ** element of the FROM clause.
97547: **
97548: ** (2) Fill in the pTabList->a[].pTab fields in the SrcList that
97549: ** defines FROM clause. When views appear in the FROM clause,
97550: ** fill pTabList->a[].pSelect with a copy of the SELECT statement
97551: ** that implements the view. A copy is made of the view's SELECT
97552: ** statement so that we can freely modify or delete that statement
97553: ** without worrying about messing up the presistent representation
97554: ** of the view.
97555: **
97556: ** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword
97557: ** on joins and the ON and USING clause of joins.
97558: **
97559: ** (4) Scan the list of columns in the result set (pEList) looking
97560: ** for instances of the "*" operator or the TABLE.* operator.
97561: ** If found, expand each "*" to be every column in every table
97562: ** and TABLE.* to be every column in TABLE.
97563: **
97564: */
97565: static int selectExpander(Walker *pWalker, Select *p){
97566: Parse *pParse = pWalker->pParse;
97567: int i, j, k;
97568: SrcList *pTabList;
97569: ExprList *pEList;
97570: struct SrcList_item *pFrom;
97571: sqlite3 *db = pParse->db;
97572:
97573: if( db->mallocFailed ){
97574: return WRC_Abort;
97575: }
97576: if( NEVER(p->pSrc==0) || (p->selFlags & SF_Expanded)!=0 ){
97577: return WRC_Prune;
97578: }
97579: p->selFlags |= SF_Expanded;
97580: pTabList = p->pSrc;
97581: pEList = p->pEList;
97582:
97583: /* Make sure cursor numbers have been assigned to all entries in
97584: ** the FROM clause of the SELECT statement.
97585: */
97586: sqlite3SrcListAssignCursors(pParse, pTabList);
97587:
97588: /* Look up every table named in the FROM clause of the select. If
97589: ** an entry of the FROM clause is a subquery instead of a table or view,
97590: ** then create a transient table structure to describe the subquery.
97591: */
97592: for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
97593: Table *pTab;
97594: if( pFrom->pTab!=0 ){
97595: /* This statement has already been prepared. There is no need
97596: ** to go further. */
97597: assert( i==0 );
97598: return WRC_Prune;
97599: }
97600: if( pFrom->zName==0 ){
97601: #ifndef SQLITE_OMIT_SUBQUERY
97602: Select *pSel = pFrom->pSelect;
97603: /* A sub-query in the FROM clause of a SELECT */
97604: assert( pSel!=0 );
97605: assert( pFrom->pTab==0 );
97606: sqlite3WalkSelect(pWalker, pSel);
97607: pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table));
97608: if( pTab==0 ) return WRC_Abort;
97609: pTab->nRef = 1;
97610: pTab->zName = sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pTab);
97611: while( pSel->pPrior ){ pSel = pSel->pPrior; }
97612: selectColumnsFromExprList(pParse, pSel->pEList, &pTab->nCol, &pTab->aCol);
97613: pTab->iPKey = -1;
97614: pTab->nRowEst = 1000000;
97615: pTab->tabFlags |= TF_Ephemeral;
97616: #endif
97617: }else{
97618: /* An ordinary table or view name in the FROM clause */
97619: assert( pFrom->pTab==0 );
1.2.2.1 ! misho 97620: pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom);
1.2 misho 97621: if( pTab==0 ) return WRC_Abort;
97622: pTab->nRef++;
97623: #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE)
97624: if( pTab->pSelect || IsVirtual(pTab) ){
97625: /* We reach here if the named table is a really a view */
97626: if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
97627: assert( pFrom->pSelect==0 );
97628: pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);
97629: sqlite3WalkSelect(pWalker, pFrom->pSelect);
97630: }
97631: #endif
97632: }
97633:
97634: /* Locate the index named by the INDEXED BY clause, if any. */
97635: if( sqlite3IndexedByLookup(pParse, pFrom) ){
97636: return WRC_Abort;
97637: }
97638: }
97639:
97640: /* Process NATURAL keywords, and ON and USING clauses of joins.
97641: */
97642: if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){
97643: return WRC_Abort;
97644: }
97645:
97646: /* For every "*" that occurs in the column list, insert the names of
97647: ** all columns in all tables. And for every TABLE.* insert the names
97648: ** of all columns in TABLE. The parser inserted a special expression
97649: ** with the TK_ALL operator for each "*" that it found in the column list.
97650: ** The following code just has to locate the TK_ALL expressions and expand
97651: ** each one to the list of all columns in all tables.
97652: **
97653: ** The first loop just checks to see if there are any "*" operators
97654: ** that need expanding.
97655: */
97656: for(k=0; k<pEList->nExpr; k++){
97657: Expr *pE = pEList->a[k].pExpr;
97658: if( pE->op==TK_ALL ) break;
97659: assert( pE->op!=TK_DOT || pE->pRight!=0 );
97660: assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) );
97661: if( pE->op==TK_DOT && pE->pRight->op==TK_ALL ) break;
97662: }
97663: if( k<pEList->nExpr ){
97664: /*
97665: ** If we get here it means the result set contains one or more "*"
97666: ** operators that need to be expanded. Loop through each expression
97667: ** in the result set and expand them one by one.
97668: */
97669: struct ExprList_item *a = pEList->a;
97670: ExprList *pNew = 0;
97671: int flags = pParse->db->flags;
97672: int longNames = (flags & SQLITE_FullColNames)!=0
97673: && (flags & SQLITE_ShortColNames)==0;
97674:
97675: for(k=0; k<pEList->nExpr; k++){
97676: Expr *pE = a[k].pExpr;
97677: assert( pE->op!=TK_DOT || pE->pRight!=0 );
97678: if( pE->op!=TK_ALL && (pE->op!=TK_DOT || pE->pRight->op!=TK_ALL) ){
97679: /* This particular expression does not need to be expanded.
97680: */
97681: pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr);
97682: if( pNew ){
97683: pNew->a[pNew->nExpr-1].zName = a[k].zName;
97684: pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan;
97685: a[k].zName = 0;
97686: a[k].zSpan = 0;
97687: }
97688: a[k].pExpr = 0;
97689: }else{
97690: /* This expression is a "*" or a "TABLE.*" and needs to be
97691: ** expanded. */
97692: int tableSeen = 0; /* Set to 1 when TABLE matches */
97693: char *zTName; /* text of name of TABLE */
97694: if( pE->op==TK_DOT ){
97695: assert( pE->pLeft!=0 );
97696: assert( !ExprHasProperty(pE->pLeft, EP_IntValue) );
97697: zTName = pE->pLeft->u.zToken;
97698: }else{
97699: zTName = 0;
97700: }
97701: for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
97702: Table *pTab = pFrom->pTab;
97703: char *zTabName = pFrom->zAlias;
97704: if( zTabName==0 ){
97705: zTabName = pTab->zName;
97706: }
97707: if( db->mallocFailed ) break;
97708: if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){
97709: continue;
97710: }
97711: tableSeen = 1;
97712: for(j=0; j<pTab->nCol; j++){
97713: Expr *pExpr, *pRight;
97714: char *zName = pTab->aCol[j].zName;
97715: char *zColname; /* The computed column name */
97716: char *zToFree; /* Malloced string that needs to be freed */
97717: Token sColname; /* Computed column name as a token */
97718:
97719: /* If a column is marked as 'hidden' (currently only possible
97720: ** for virtual tables), do not include it in the expanded
97721: ** result-set list.
97722: */
97723: if( IsHiddenColumn(&pTab->aCol[j]) ){
97724: assert(IsVirtual(pTab));
97725: continue;
97726: }
97727:
97728: if( i>0 && zTName==0 ){
97729: if( (pFrom->jointype & JT_NATURAL)!=0
97730: && tableAndColumnIndex(pTabList, i, zName, 0, 0)
97731: ){
97732: /* In a NATURAL join, omit the join columns from the
97733: ** table to the right of the join */
97734: continue;
97735: }
97736: if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){
97737: /* In a join with a USING clause, omit columns in the
97738: ** using clause from the table on the right. */
97739: continue;
97740: }
97741: }
97742: pRight = sqlite3Expr(db, TK_ID, zName);
97743: zColname = zName;
97744: zToFree = 0;
97745: if( longNames || pTabList->nSrc>1 ){
97746: Expr *pLeft;
97747: pLeft = sqlite3Expr(db, TK_ID, zTabName);
97748: pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
97749: if( longNames ){
97750: zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName);
97751: zToFree = zColname;
97752: }
97753: }else{
97754: pExpr = pRight;
97755: }
97756: pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);
97757: sColname.z = zColname;
97758: sColname.n = sqlite3Strlen30(zColname);
97759: sqlite3ExprListSetName(pParse, pNew, &sColname, 0);
97760: sqlite3DbFree(db, zToFree);
97761: }
97762: }
97763: if( !tableSeen ){
97764: if( zTName ){
97765: sqlite3ErrorMsg(pParse, "no such table: %s", zTName);
97766: }else{
97767: sqlite3ErrorMsg(pParse, "no tables specified");
97768: }
97769: }
97770: }
97771: }
97772: sqlite3ExprListDelete(db, pEList);
97773: p->pEList = pNew;
97774: }
97775: #if SQLITE_MAX_COLUMN
97776: if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){
97777: sqlite3ErrorMsg(pParse, "too many columns in result set");
97778: }
97779: #endif
97780: return WRC_Continue;
97781: }
97782:
97783: /*
97784: ** No-op routine for the parse-tree walker.
97785: **
97786: ** When this routine is the Walker.xExprCallback then expression trees
97787: ** are walked without any actions being taken at each node. Presumably,
97788: ** when this routine is used for Walker.xExprCallback then
97789: ** Walker.xSelectCallback is set to do something useful for every
97790: ** subquery in the parser tree.
97791: */
97792: static int exprWalkNoop(Walker *NotUsed, Expr *NotUsed2){
97793: UNUSED_PARAMETER2(NotUsed, NotUsed2);
97794: return WRC_Continue;
97795: }
97796:
97797: /*
97798: ** This routine "expands" a SELECT statement and all of its subqueries.
97799: ** For additional information on what it means to "expand" a SELECT
97800: ** statement, see the comment on the selectExpand worker callback above.
97801: **
97802: ** Expanding a SELECT statement is the first step in processing a
97803: ** SELECT statement. The SELECT statement must be expanded before
97804: ** name resolution is performed.
97805: **
97806: ** If anything goes wrong, an error message is written into pParse.
97807: ** The calling function can detect the problem by looking at pParse->nErr
97808: ** and/or pParse->db->mallocFailed.
97809: */
97810: static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){
97811: Walker w;
97812: w.xSelectCallback = selectExpander;
97813: w.xExprCallback = exprWalkNoop;
97814: w.pParse = pParse;
97815: sqlite3WalkSelect(&w, pSelect);
97816: }
97817:
97818:
97819: #ifndef SQLITE_OMIT_SUBQUERY
97820: /*
97821: ** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo()
97822: ** interface.
97823: **
97824: ** For each FROM-clause subquery, add Column.zType and Column.zColl
97825: ** information to the Table structure that represents the result set
97826: ** of that subquery.
97827: **
97828: ** The Table structure that represents the result set was constructed
97829: ** by selectExpander() but the type and collation information was omitted
97830: ** at that point because identifiers had not yet been resolved. This
97831: ** routine is called after identifier resolution.
97832: */
97833: static int selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
97834: Parse *pParse;
97835: int i;
97836: SrcList *pTabList;
97837: struct SrcList_item *pFrom;
97838:
97839: assert( p->selFlags & SF_Resolved );
97840: if( (p->selFlags & SF_HasTypeInfo)==0 ){
97841: p->selFlags |= SF_HasTypeInfo;
97842: pParse = pWalker->pParse;
97843: pTabList = p->pSrc;
97844: for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
97845: Table *pTab = pFrom->pTab;
97846: if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){
97847: /* A sub-query in the FROM clause of a SELECT */
97848: Select *pSel = pFrom->pSelect;
97849: assert( pSel );
97850: while( pSel->pPrior ) pSel = pSel->pPrior;
97851: selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSel);
97852: }
97853: }
97854: }
97855: return WRC_Continue;
97856: }
97857: #endif
97858:
97859:
97860: /*
97861: ** This routine adds datatype and collating sequence information to
97862: ** the Table structures of all FROM-clause subqueries in a
97863: ** SELECT statement.
97864: **
97865: ** Use this routine after name resolution.
97866: */
97867: static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){
97868: #ifndef SQLITE_OMIT_SUBQUERY
97869: Walker w;
97870: w.xSelectCallback = selectAddSubqueryTypeInfo;
97871: w.xExprCallback = exprWalkNoop;
97872: w.pParse = pParse;
97873: sqlite3WalkSelect(&w, pSelect);
97874: #endif
97875: }
97876:
97877:
97878: /*
1.2.2.1 ! misho 97879: ** This routine sets up a SELECT statement for processing. The
1.2 misho 97880: ** following is accomplished:
97881: **
97882: ** * VDBE Cursor numbers are assigned to all FROM-clause terms.
97883: ** * Ephemeral Table objects are created for all FROM-clause subqueries.
97884: ** * ON and USING clauses are shifted into WHERE statements
97885: ** * Wildcards "*" and "TABLE.*" in result sets are expanded.
97886: ** * Identifiers in expression are matched to tables.
97887: **
97888: ** This routine acts recursively on all subqueries within the SELECT.
97889: */
97890: SQLITE_PRIVATE void sqlite3SelectPrep(
97891: Parse *pParse, /* The parser context */
97892: Select *p, /* The SELECT statement being coded. */
97893: NameContext *pOuterNC /* Name context for container */
97894: ){
97895: sqlite3 *db;
97896: if( NEVER(p==0) ) return;
97897: db = pParse->db;
97898: if( p->selFlags & SF_HasTypeInfo ) return;
97899: sqlite3SelectExpand(pParse, p);
97900: if( pParse->nErr || db->mallocFailed ) return;
97901: sqlite3ResolveSelectNames(pParse, p, pOuterNC);
97902: if( pParse->nErr || db->mallocFailed ) return;
97903: sqlite3SelectAddTypeInfo(pParse, p);
97904: }
97905:
97906: /*
97907: ** Reset the aggregate accumulator.
97908: **
97909: ** The aggregate accumulator is a set of memory cells that hold
97910: ** intermediate results while calculating an aggregate. This
1.2.2.1 ! misho 97911: ** routine generates code that stores NULLs in all of those memory
! 97912: ** cells.
1.2 misho 97913: */
97914: static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
97915: Vdbe *v = pParse->pVdbe;
97916: int i;
97917: struct AggInfo_func *pFunc;
97918: if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){
97919: return;
97920: }
97921: for(i=0; i<pAggInfo->nColumn; i++){
97922: sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem);
97923: }
97924: for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
97925: sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem);
97926: if( pFunc->iDistinct>=0 ){
97927: Expr *pE = pFunc->pExpr;
97928: assert( !ExprHasProperty(pE, EP_xIsSelect) );
97929: if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
97930: sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "
97931: "argument");
97932: pFunc->iDistinct = -1;
97933: }else{
97934: KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->x.pList);
97935: sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0,
97936: (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
97937: }
97938: }
97939: }
97940: }
97941:
97942: /*
97943: ** Invoke the OP_AggFinalize opcode for every aggregate function
97944: ** in the AggInfo structure.
97945: */
97946: static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
97947: Vdbe *v = pParse->pVdbe;
97948: int i;
97949: struct AggInfo_func *pF;
97950: for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
97951: ExprList *pList = pF->pExpr->x.pList;
97952: assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
97953: sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0,
97954: (void*)pF->pFunc, P4_FUNCDEF);
97955: }
97956: }
97957:
97958: /*
97959: ** Update the accumulator memory cells for an aggregate based on
97960: ** the current cursor position.
97961: */
97962: static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){
97963: Vdbe *v = pParse->pVdbe;
97964: int i;
1.2.2.1 ! misho 97965: int regHit = 0;
! 97966: int addrHitTest = 0;
1.2 misho 97967: struct AggInfo_func *pF;
97968: struct AggInfo_col *pC;
97969:
97970: pAggInfo->directMode = 1;
97971: sqlite3ExprCacheClear(pParse);
97972: for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
97973: int nArg;
97974: int addrNext = 0;
97975: int regAgg;
97976: ExprList *pList = pF->pExpr->x.pList;
97977: assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
97978: if( pList ){
97979: nArg = pList->nExpr;
97980: regAgg = sqlite3GetTempRange(pParse, nArg);
97981: sqlite3ExprCodeExprList(pParse, pList, regAgg, 1);
97982: }else{
97983: nArg = 0;
97984: regAgg = 0;
97985: }
97986: if( pF->iDistinct>=0 ){
97987: addrNext = sqlite3VdbeMakeLabel(v);
97988: assert( nArg==1 );
97989: codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg);
97990: }
97991: if( pF->pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
97992: CollSeq *pColl = 0;
97993: struct ExprList_item *pItem;
97994: int j;
97995: assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */
97996: for(j=0, pItem=pList->a; !pColl && j<nArg; j++, pItem++){
97997: pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr);
97998: }
97999: if( !pColl ){
98000: pColl = pParse->db->pDfltColl;
98001: }
1.2.2.1 ! misho 98002: if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
! 98003: sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ);
1.2 misho 98004: }
98005: sqlite3VdbeAddOp4(v, OP_AggStep, 0, regAgg, pF->iMem,
98006: (void*)pF->pFunc, P4_FUNCDEF);
98007: sqlite3VdbeChangeP5(v, (u8)nArg);
98008: sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg);
98009: sqlite3ReleaseTempRange(pParse, regAgg, nArg);
98010: if( addrNext ){
98011: sqlite3VdbeResolveLabel(v, addrNext);
98012: sqlite3ExprCacheClear(pParse);
98013: }
98014: }
98015:
98016: /* Before populating the accumulator registers, clear the column cache.
98017: ** Otherwise, if any of the required column values are already present
98018: ** in registers, sqlite3ExprCode() may use OP_SCopy to copy the value
98019: ** to pC->iMem. But by the time the value is used, the original register
98020: ** may have been used, invalidating the underlying buffer holding the
98021: ** text or blob value. See ticket [883034dcb5].
98022: **
98023: ** Another solution would be to change the OP_SCopy used to copy cached
98024: ** values to an OP_Copy.
98025: */
1.2.2.1 ! misho 98026: if( regHit ){
! 98027: addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit);
! 98028: }
1.2 misho 98029: sqlite3ExprCacheClear(pParse);
98030: for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
98031: sqlite3ExprCode(pParse, pC->pExpr, pC->iMem);
98032: }
98033: pAggInfo->directMode = 0;
98034: sqlite3ExprCacheClear(pParse);
1.2.2.1 ! misho 98035: if( addrHitTest ){
! 98036: sqlite3VdbeJumpHere(v, addrHitTest);
! 98037: }
1.2 misho 98038: }
98039:
98040: /*
98041: ** Add a single OP_Explain instruction to the VDBE to explain a simple
98042: ** count(*) query ("SELECT count(*) FROM pTab").
98043: */
98044: #ifndef SQLITE_OMIT_EXPLAIN
98045: static void explainSimpleCount(
98046: Parse *pParse, /* Parse context */
98047: Table *pTab, /* Table being queried */
98048: Index *pIdx /* Index used to optimize scan, or NULL */
98049: ){
98050: if( pParse->explain==2 ){
98051: char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s %s%s(~%d rows)",
98052: pTab->zName,
98053: pIdx ? "USING COVERING INDEX " : "",
98054: pIdx ? pIdx->zName : "",
98055: pTab->nRowEst
98056: );
98057: sqlite3VdbeAddOp4(
98058: pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC
98059: );
98060: }
98061: }
98062: #else
98063: # define explainSimpleCount(a,b,c)
98064: #endif
98065:
98066: /*
98067: ** Generate code for the SELECT statement given in the p argument.
98068: **
98069: ** The results are distributed in various ways depending on the
98070: ** contents of the SelectDest structure pointed to by argument pDest
98071: ** as follows:
98072: **
98073: ** pDest->eDest Result
98074: ** ------------ -------------------------------------------
98075: ** SRT_Output Generate a row of output (using the OP_ResultRow
98076: ** opcode) for each row in the result set.
98077: **
98078: ** SRT_Mem Only valid if the result is a single column.
98079: ** Store the first column of the first result row
1.2.2.1 ! misho 98080: ** in register pDest->iSDParm then abandon the rest
1.2 misho 98081: ** of the query. This destination implies "LIMIT 1".
98082: **
98083: ** SRT_Set The result must be a single column. Store each
1.2.2.1 ! misho 98084: ** row of result as the key in table pDest->iSDParm.
! 98085: ** Apply the affinity pDest->affSdst before storing
1.2 misho 98086: ** results. Used to implement "IN (SELECT ...)".
98087: **
1.2.2.1 ! misho 98088: ** SRT_Union Store results as a key in a temporary table
! 98089: ** identified by pDest->iSDParm.
1.2 misho 98090: **
1.2.2.1 ! misho 98091: ** SRT_Except Remove results from the temporary table pDest->iSDParm.
1.2 misho 98092: **
1.2.2.1 ! misho 98093: ** SRT_Table Store results in temporary table pDest->iSDParm.
1.2 misho 98094: ** This is like SRT_EphemTab except that the table
98095: ** is assumed to already be open.
98096: **
1.2.2.1 ! misho 98097: ** SRT_EphemTab Create an temporary table pDest->iSDParm and store
1.2 misho 98098: ** the result there. The cursor is left open after
98099: ** returning. This is like SRT_Table except that
98100: ** this destination uses OP_OpenEphemeral to create
98101: ** the table first.
98102: **
98103: ** SRT_Coroutine Generate a co-routine that returns a new row of
98104: ** results each time it is invoked. The entry point
1.2.2.1 ! misho 98105: ** of the co-routine is stored in register pDest->iSDParm.
1.2 misho 98106: **
1.2.2.1 ! misho 98107: ** SRT_Exists Store a 1 in memory cell pDest->iSDParm if the result
1.2 misho 98108: ** set is not empty.
98109: **
98110: ** SRT_Discard Throw the results away. This is used by SELECT
98111: ** statements within triggers whose only purpose is
98112: ** the side-effects of functions.
98113: **
98114: ** This routine returns the number of errors. If any errors are
98115: ** encountered, then an appropriate error message is left in
98116: ** pParse->zErrMsg.
98117: **
98118: ** This routine does NOT free the Select structure passed in. The
98119: ** calling function needs to do that.
98120: */
98121: SQLITE_PRIVATE int sqlite3Select(
98122: Parse *pParse, /* The parser context */
98123: Select *p, /* The SELECT statement being coded. */
98124: SelectDest *pDest /* What to do with the query results */
98125: ){
98126: int i, j; /* Loop counters */
98127: WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */
98128: Vdbe *v; /* The virtual machine under construction */
98129: int isAgg; /* True for select lists like "count(*)" */
98130: ExprList *pEList; /* List of columns to extract. */
98131: SrcList *pTabList; /* List of tables to select from */
98132: Expr *pWhere; /* The WHERE clause. May be NULL */
98133: ExprList *pOrderBy; /* The ORDER BY clause. May be NULL */
98134: ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */
98135: Expr *pHaving; /* The HAVING clause. May be NULL */
98136: int rc = 1; /* Value to return from this function */
98137: int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */
1.2.2.1 ! misho 98138: DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */
1.2 misho 98139: AggInfo sAggInfo; /* Information used by aggregate queries */
98140: int iEnd; /* Address of the end of the query */
98141: sqlite3 *db; /* The database connection */
98142:
98143: #ifndef SQLITE_OMIT_EXPLAIN
98144: int iRestoreSelectId = pParse->iSelectId;
98145: pParse->iSelectId = pParse->iNextSelectId++;
98146: #endif
98147:
98148: db = pParse->db;
98149: if( p==0 || db->mallocFailed || pParse->nErr ){
98150: return 1;
98151: }
98152: if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
98153: memset(&sAggInfo, 0, sizeof(sAggInfo));
98154:
98155: if( IgnorableOrderby(pDest) ){
98156: assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union ||
98157: pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard);
98158: /* If ORDER BY makes no difference in the output then neither does
98159: ** DISTINCT so it can be removed too. */
98160: sqlite3ExprListDelete(db, p->pOrderBy);
98161: p->pOrderBy = 0;
98162: p->selFlags &= ~SF_Distinct;
98163: }
98164: sqlite3SelectPrep(pParse, p, 0);
98165: pOrderBy = p->pOrderBy;
98166: pTabList = p->pSrc;
98167: pEList = p->pEList;
98168: if( pParse->nErr || db->mallocFailed ){
98169: goto select_end;
98170: }
98171: isAgg = (p->selFlags & SF_Aggregate)!=0;
98172: assert( pEList!=0 );
98173:
98174: /* Begin generating code.
98175: */
98176: v = sqlite3GetVdbe(pParse);
98177: if( v==0 ) goto select_end;
98178:
98179: /* If writing to memory or generating a set
98180: ** only a single column may be output.
98181: */
98182: #ifndef SQLITE_OMIT_SUBQUERY
98183: if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){
98184: goto select_end;
98185: }
98186: #endif
98187:
98188: /* Generate code for all sub-queries in the FROM clause
98189: */
98190: #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
98191: for(i=0; !p->pPrior && i<pTabList->nSrc; i++){
98192: struct SrcList_item *pItem = &pTabList->a[i];
98193: SelectDest dest;
98194: Select *pSub = pItem->pSelect;
98195: int isAggSub;
98196:
98197: if( pSub==0 ) continue;
1.2.2.1 ! misho 98198:
! 98199: /* Sometimes the code for a subquery will be generated more than
! 98200: ** once, if the subquery is part of the WHERE clause in a LEFT JOIN,
! 98201: ** for example. In that case, do not regenerate the code to manifest
! 98202: ** a view or the co-routine to implement a view. The first instance
! 98203: ** is sufficient, though the subroutine to manifest the view does need
! 98204: ** to be invoked again. */
1.2 misho 98205: if( pItem->addrFillSub ){
1.2.2.1 ! misho 98206: if( pItem->viaCoroutine==0 ){
! 98207: sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub);
! 98208: }
1.2 misho 98209: continue;
98210: }
98211:
98212: /* Increment Parse.nHeight by the height of the largest expression
98213: ** tree refered to by this, the parent select. The child select
98214: ** may contain expression trees of at most
98215: ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit
98216: ** more conservative than necessary, but much easier than enforcing
98217: ** an exact limit.
98218: */
98219: pParse->nHeight += sqlite3SelectExprHeight(p);
98220:
98221: isAggSub = (pSub->selFlags & SF_Aggregate)!=0;
98222: if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){
98223: /* This subquery can be absorbed into its parent. */
98224: if( isAggSub ){
98225: isAgg = 1;
98226: p->selFlags |= SF_Aggregate;
98227: }
98228: i = -1;
1.2.2.1 ! misho 98229: }else if( pTabList->nSrc==1 && (p->selFlags & SF_Materialize)==0
! 98230: && OptimizationEnabled(db, SQLITE_SubqCoroutine)
! 98231: ){
! 98232: /* Implement a co-routine that will return a single row of the result
! 98233: ** set on each invocation.
! 98234: */
! 98235: int addrTop;
! 98236: int addrEof;
! 98237: pItem->regReturn = ++pParse->nMem;
! 98238: addrEof = ++pParse->nMem;
! 98239: /* Before coding the OP_Goto to jump to the start of the main routine,
! 98240: ** ensure that the jump to the verify-schema routine has already
! 98241: ** been coded. Otherwise, the verify-schema would likely be coded as
! 98242: ** part of the co-routine. If the main routine then accessed the
! 98243: ** database before invoking the co-routine for the first time (for
! 98244: ** example to initialize a LIMIT register from a sub-select), it would
! 98245: ** be doing so without having verified the schema version and obtained
! 98246: ** the required db locks. See ticket d6b36be38. */
! 98247: sqlite3CodeVerifySchema(pParse, -1);
! 98248: sqlite3VdbeAddOp0(v, OP_Goto);
! 98249: addrTop = sqlite3VdbeAddOp1(v, OP_OpenPseudo, pItem->iCursor);
! 98250: sqlite3VdbeChangeP5(v, 1);
! 98251: VdbeComment((v, "coroutine for %s", pItem->pTab->zName));
! 98252: pItem->addrFillSub = addrTop;
! 98253: sqlite3VdbeAddOp2(v, OP_Integer, 0, addrEof);
! 98254: sqlite3VdbeChangeP5(v, 1);
! 98255: sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn);
! 98256: explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
! 98257: sqlite3Select(pParse, pSub, &dest);
! 98258: pItem->pTab->nRowEst = (unsigned)pSub->nSelectRow;
! 98259: pItem->viaCoroutine = 1;
! 98260: sqlite3VdbeChangeP2(v, addrTop, dest.iSdst);
! 98261: sqlite3VdbeChangeP3(v, addrTop, dest.nSdst);
! 98262: sqlite3VdbeAddOp2(v, OP_Integer, 1, addrEof);
! 98263: sqlite3VdbeAddOp1(v, OP_Yield, pItem->regReturn);
! 98264: VdbeComment((v, "end %s", pItem->pTab->zName));
! 98265: sqlite3VdbeJumpHere(v, addrTop-1);
! 98266: sqlite3ClearTempRegCache(pParse);
1.2 misho 98267: }else{
98268: /* Generate a subroutine that will fill an ephemeral table with
98269: ** the content of this subquery. pItem->addrFillSub will point
98270: ** to the address of the generated subroutine. pItem->regReturn
98271: ** is a register allocated to hold the subroutine return address
98272: */
98273: int topAddr;
98274: int onceAddr = 0;
98275: int retAddr;
98276: assert( pItem->addrFillSub==0 );
98277: pItem->regReturn = ++pParse->nMem;
98278: topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn);
98279: pItem->addrFillSub = topAddr+1;
98280: VdbeNoopComment((v, "materialize %s", pItem->pTab->zName));
98281: if( pItem->isCorrelated==0 ){
98282: /* If the subquery is no correlated and if we are not inside of
98283: ** a trigger, then we only need to compute the value of the subquery
98284: ** once. */
98285: onceAddr = sqlite3CodeOnce(pParse);
98286: }
98287: sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor);
98288: explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId);
98289: sqlite3Select(pParse, pSub, &dest);
98290: pItem->pTab->nRowEst = (unsigned)pSub->nSelectRow;
98291: if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr);
98292: retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn);
98293: VdbeComment((v, "end %s", pItem->pTab->zName));
98294: sqlite3VdbeChangeP1(v, topAddr, retAddr);
98295: sqlite3ClearTempRegCache(pParse);
98296: }
98297: if( /*pParse->nErr ||*/ db->mallocFailed ){
98298: goto select_end;
98299: }
98300: pParse->nHeight -= sqlite3SelectExprHeight(p);
98301: pTabList = p->pSrc;
98302: if( !IgnorableOrderby(pDest) ){
98303: pOrderBy = p->pOrderBy;
98304: }
98305: }
98306: pEList = p->pEList;
98307: #endif
98308: pWhere = p->pWhere;
98309: pGroupBy = p->pGroupBy;
98310: pHaving = p->pHaving;
1.2.2.1 ! misho 98311: sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0;
1.2 misho 98312:
98313: #ifndef SQLITE_OMIT_COMPOUND_SELECT
98314: /* If there is are a sequence of queries, do the earlier ones first.
98315: */
98316: if( p->pPrior ){
98317: if( p->pRightmost==0 ){
98318: Select *pLoop, *pRight = 0;
98319: int cnt = 0;
98320: int mxSelect;
98321: for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){
98322: pLoop->pRightmost = p;
98323: pLoop->pNext = pRight;
98324: pRight = pLoop;
98325: }
98326: mxSelect = db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT];
98327: if( mxSelect && cnt>mxSelect ){
98328: sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
98329: goto select_end;
98330: }
98331: }
98332: rc = multiSelect(pParse, p, pDest);
98333: explainSetInteger(pParse->iSelectId, iRestoreSelectId);
98334: return rc;
98335: }
98336: #endif
98337:
98338: /* If there is both a GROUP BY and an ORDER BY clause and they are
98339: ** identical, then disable the ORDER BY clause since the GROUP BY
98340: ** will cause elements to come out in the correct order. This is
98341: ** an optimization - the correct answer should result regardless.
98342: ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER
98343: ** to disable this optimization for testing purposes.
98344: */
98345: if( sqlite3ExprListCompare(p->pGroupBy, pOrderBy)==0
1.2.2.1 ! misho 98346: && OptimizationEnabled(db, SQLITE_GroupByOrder) ){
1.2 misho 98347: pOrderBy = 0;
98348: }
98349:
98350: /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and
98351: ** if the select-list is the same as the ORDER BY list, then this query
98352: ** can be rewritten as a GROUP BY. In other words, this:
98353: **
98354: ** SELECT DISTINCT xyz FROM ... ORDER BY xyz
98355: **
98356: ** is transformed to:
98357: **
98358: ** SELECT xyz FROM ... GROUP BY xyz
98359: **
98360: ** The second form is preferred as a single index (or temp-table) may be
98361: ** used for both the ORDER BY and DISTINCT processing. As originally
98362: ** written the query must use a temp-table for at least one of the ORDER
98363: ** BY and DISTINCT, and an index or separate temp-table for the other.
98364: */
98365: if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct
98366: && sqlite3ExprListCompare(pOrderBy, p->pEList)==0
98367: ){
98368: p->selFlags &= ~SF_Distinct;
98369: p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0);
98370: pGroupBy = p->pGroupBy;
98371: pOrderBy = 0;
1.2.2.1 ! misho 98372: /* Notice that even thought SF_Distinct has been cleared from p->selFlags,
! 98373: ** the sDistinct.isTnct is still set. Hence, isTnct represents the
! 98374: ** original setting of the SF_Distinct flag, not the current setting */
! 98375: assert( sDistinct.isTnct );
1.2 misho 98376: }
98377:
98378: /* If there is an ORDER BY clause, then this sorting
98379: ** index might end up being unused if the data can be
98380: ** extracted in pre-sorted order. If that is the case, then the
98381: ** OP_OpenEphemeral instruction will be changed to an OP_Noop once
98382: ** we figure out that the sorting index is not needed. The addrSortIndex
98383: ** variable is used to facilitate that change.
98384: */
98385: if( pOrderBy ){
98386: KeyInfo *pKeyInfo;
98387: pKeyInfo = keyInfoFromExprList(pParse, pOrderBy);
98388: pOrderBy->iECursor = pParse->nTab++;
98389: p->addrOpenEphm[2] = addrSortIndex =
98390: sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
98391: pOrderBy->iECursor, pOrderBy->nExpr+2, 0,
98392: (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
98393: }else{
98394: addrSortIndex = -1;
98395: }
98396:
98397: /* If the output is destined for a temporary table, open that table.
98398: */
98399: if( pDest->eDest==SRT_EphemTab ){
1.2.2.1 ! misho 98400: sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr);
1.2 misho 98401: }
98402:
98403: /* Set the limiter.
98404: */
98405: iEnd = sqlite3VdbeMakeLabel(v);
98406: p->nSelectRow = (double)LARGEST_INT64;
98407: computeLimitRegisters(pParse, p, iEnd);
98408: if( p->iLimit==0 && addrSortIndex>=0 ){
98409: sqlite3VdbeGetOp(v, addrSortIndex)->opcode = OP_SorterOpen;
98410: p->selFlags |= SF_UseSorter;
98411: }
98412:
98413: /* Open a virtual index to use for the distinct set.
98414: */
98415: if( p->selFlags & SF_Distinct ){
1.2.2.1 ! misho 98416: sDistinct.tabTnct = pParse->nTab++;
! 98417: sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
! 98418: sDistinct.tabTnct, 0, 0,
! 98419: (char*)keyInfoFromExprList(pParse, p->pEList),
! 98420: P4_KEYINFO_HANDOFF);
1.2 misho 98421: sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
1.2.2.1 ! misho 98422: sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED;
1.2 misho 98423: }else{
1.2.2.1 ! misho 98424: sDistinct.eTnctType = WHERE_DISTINCT_NOOP;
1.2 misho 98425: }
98426:
98427: if( !isAgg && pGroupBy==0 ){
1.2.2.1 ! misho 98428: /* No aggregate functions and no GROUP BY clause */
! 98429: ExprList *pDist = (sDistinct.isTnct ? p->pEList : 0);
1.2 misho 98430:
98431: /* Begin the database scan. */
1.2.2.1 ! misho 98432: pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pOrderBy, pDist, 0,0);
1.2 misho 98433: if( pWInfo==0 ) goto select_end;
98434: if( pWInfo->nRowOut < p->nSelectRow ) p->nSelectRow = pWInfo->nRowOut;
1.2.2.1 ! misho 98435: if( pWInfo->eDistinct ) sDistinct.eTnctType = pWInfo->eDistinct;
! 98436: if( pOrderBy && pWInfo->nOBSat==pOrderBy->nExpr ) pOrderBy = 0;
1.2 misho 98437:
98438: /* If sorting index that was created by a prior OP_OpenEphemeral
98439: ** instruction ended up not being needed, then change the OP_OpenEphemeral
98440: ** into an OP_Noop.
98441: */
98442: if( addrSortIndex>=0 && pOrderBy==0 ){
98443: sqlite3VdbeChangeToNoop(v, addrSortIndex);
98444: p->addrOpenEphm[2] = -1;
98445: }
98446:
98447: /* Use the standard inner loop. */
1.2.2.1 ! misho 98448: selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, &sDistinct, pDest,
1.2 misho 98449: pWInfo->iContinue, pWInfo->iBreak);
98450:
98451: /* End the database scan loop.
98452: */
98453: sqlite3WhereEnd(pWInfo);
98454: }else{
1.2.2.1 ! misho 98455: /* This case when there exist aggregate functions or a GROUP BY clause
! 98456: ** or both */
1.2 misho 98457: NameContext sNC; /* Name context for processing aggregate information */
98458: int iAMem; /* First Mem address for storing current GROUP BY */
98459: int iBMem; /* First Mem address for previous GROUP BY */
98460: int iUseFlag; /* Mem address holding flag indicating that at least
98461: ** one row of the input to the aggregator has been
98462: ** processed */
98463: int iAbortFlag; /* Mem address which causes query abort if positive */
98464: int groupBySort; /* Rows come from source in GROUP BY order */
98465: int addrEnd; /* End of processing for this SELECT */
98466: int sortPTab = 0; /* Pseudotable used to decode sorting results */
98467: int sortOut = 0; /* Output register from the sorter */
98468:
98469: /* Remove any and all aliases between the result set and the
98470: ** GROUP BY clause.
98471: */
98472: if( pGroupBy ){
98473: int k; /* Loop counter */
98474: struct ExprList_item *pItem; /* For looping over expression in a list */
98475:
98476: for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){
98477: pItem->iAlias = 0;
98478: }
98479: for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){
98480: pItem->iAlias = 0;
98481: }
98482: if( p->nSelectRow>(double)100 ) p->nSelectRow = (double)100;
98483: }else{
98484: p->nSelectRow = (double)1;
98485: }
98486:
98487:
98488: /* Create a label to jump to when we want to abort the query */
98489: addrEnd = sqlite3VdbeMakeLabel(v);
98490:
98491: /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in
98492: ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the
98493: ** SELECT statement.
98494: */
98495: memset(&sNC, 0, sizeof(sNC));
98496: sNC.pParse = pParse;
98497: sNC.pSrcList = pTabList;
98498: sNC.pAggInfo = &sAggInfo;
98499: sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0;
98500: sAggInfo.pGroupBy = pGroupBy;
98501: sqlite3ExprAnalyzeAggList(&sNC, pEList);
98502: sqlite3ExprAnalyzeAggList(&sNC, pOrderBy);
98503: if( pHaving ){
98504: sqlite3ExprAnalyzeAggregates(&sNC, pHaving);
98505: }
98506: sAggInfo.nAccumulator = sAggInfo.nColumn;
98507: for(i=0; i<sAggInfo.nFunc; i++){
98508: assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
1.2.2.1 ! misho 98509: sNC.ncFlags |= NC_InAggFunc;
1.2 misho 98510: sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
1.2.2.1 ! misho 98511: sNC.ncFlags &= ~NC_InAggFunc;
1.2 misho 98512: }
98513: if( db->mallocFailed ) goto select_end;
98514:
98515: /* Processing for aggregates with GROUP BY is very different and
98516: ** much more complex than aggregates without a GROUP BY.
98517: */
98518: if( pGroupBy ){
98519: KeyInfo *pKeyInfo; /* Keying information for the group by clause */
98520: int j1; /* A-vs-B comparision jump */
98521: int addrOutputRow; /* Start of subroutine that outputs a result row */
98522: int regOutputRow; /* Return address register for output subroutine */
98523: int addrSetAbort; /* Set the abort flag and return */
98524: int addrTopOfLoop; /* Top of the input loop */
98525: int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */
98526: int addrReset; /* Subroutine for resetting the accumulator */
98527: int regReset; /* Return address register for reset subroutine */
98528:
98529: /* If there is a GROUP BY clause we might need a sorting index to
98530: ** implement it. Allocate that sorting index now. If it turns out
98531: ** that we do not need it after all, the OP_SorterOpen instruction
98532: ** will be converted into a Noop.
98533: */
98534: sAggInfo.sortingIdx = pParse->nTab++;
98535: pKeyInfo = keyInfoFromExprList(pParse, pGroupBy);
98536: addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen,
98537: sAggInfo.sortingIdx, sAggInfo.nSortingColumn,
98538: 0, (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
98539:
98540: /* Initialize memory locations used by GROUP BY aggregate processing
98541: */
98542: iUseFlag = ++pParse->nMem;
98543: iAbortFlag = ++pParse->nMem;
98544: regOutputRow = ++pParse->nMem;
98545: addrOutputRow = sqlite3VdbeMakeLabel(v);
98546: regReset = ++pParse->nMem;
98547: addrReset = sqlite3VdbeMakeLabel(v);
98548: iAMem = pParse->nMem + 1;
98549: pParse->nMem += pGroupBy->nExpr;
98550: iBMem = pParse->nMem + 1;
98551: pParse->nMem += pGroupBy->nExpr;
98552: sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag);
98553: VdbeComment((v, "clear abort flag"));
98554: sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag);
98555: VdbeComment((v, "indicate accumulator empty"));
98556: sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1);
98557:
98558: /* Begin a loop that will extract all source rows in GROUP BY order.
98559: ** This might involve two separate loops with an OP_Sort in between, or
98560: ** it might be a single loop that uses an index to extract information
98561: ** in the right order to begin with.
98562: */
98563: sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
1.2.2.1 ! misho 98564: pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0, 0, 0);
1.2 misho 98565: if( pWInfo==0 ) goto select_end;
1.2.2.1 ! misho 98566: if( pWInfo->nOBSat==pGroupBy->nExpr ){
1.2 misho 98567: /* The optimizer is able to deliver rows in group by order so
98568: ** we do not have to sort. The OP_OpenEphemeral table will be
98569: ** cancelled later because we still need to use the pKeyInfo
98570: */
98571: groupBySort = 0;
98572: }else{
98573: /* Rows are coming out in undetermined order. We have to push
98574: ** each row into a sorting index, terminate the first loop,
98575: ** then loop over the sorting index in order to get the output
98576: ** in sorted order
98577: */
98578: int regBase;
98579: int regRecord;
98580: int nCol;
98581: int nGroupBy;
98582:
98583: explainTempTable(pParse,
1.2.2.1 ! misho 98584: (sDistinct.isTnct && (p->selFlags&SF_Distinct)==0) ?
! 98585: "DISTINCT" : "GROUP BY");
1.2 misho 98586:
98587: groupBySort = 1;
98588: nGroupBy = pGroupBy->nExpr;
98589: nCol = nGroupBy + 1;
98590: j = nGroupBy+1;
98591: for(i=0; i<sAggInfo.nColumn; i++){
98592: if( sAggInfo.aCol[i].iSorterColumn>=j ){
98593: nCol++;
98594: j++;
98595: }
98596: }
98597: regBase = sqlite3GetTempRange(pParse, nCol);
98598: sqlite3ExprCacheClear(pParse);
98599: sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0);
98600: sqlite3VdbeAddOp2(v, OP_Sequence, sAggInfo.sortingIdx,regBase+nGroupBy);
98601: j = nGroupBy+1;
98602: for(i=0; i<sAggInfo.nColumn; i++){
98603: struct AggInfo_col *pCol = &sAggInfo.aCol[i];
98604: if( pCol->iSorterColumn>=j ){
98605: int r1 = j + regBase;
98606: int r2;
98607:
98608: r2 = sqlite3ExprCodeGetColumn(pParse,
1.2.2.1 ! misho 98609: pCol->pTab, pCol->iColumn, pCol->iTable, r1, 0);
1.2 misho 98610: if( r1!=r2 ){
98611: sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1);
98612: }
98613: j++;
98614: }
98615: }
98616: regRecord = sqlite3GetTempReg(pParse);
98617: sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord);
98618: sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord);
98619: sqlite3ReleaseTempReg(pParse, regRecord);
98620: sqlite3ReleaseTempRange(pParse, regBase, nCol);
98621: sqlite3WhereEnd(pWInfo);
98622: sAggInfo.sortingIdxPTab = sortPTab = pParse->nTab++;
98623: sortOut = sqlite3GetTempReg(pParse);
98624: sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol);
98625: sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd);
98626: VdbeComment((v, "GROUP BY sort"));
98627: sAggInfo.useSortingIdx = 1;
98628: sqlite3ExprCacheClear(pParse);
98629: }
98630:
98631: /* Evaluate the current GROUP BY terms and store in b0, b1, b2...
98632: ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth)
98633: ** Then compare the current GROUP BY terms against the GROUP BY terms
98634: ** from the previous row currently stored in a0, a1, a2...
98635: */
98636: addrTopOfLoop = sqlite3VdbeCurrentAddr(v);
98637: sqlite3ExprCacheClear(pParse);
98638: if( groupBySort ){
98639: sqlite3VdbeAddOp2(v, OP_SorterData, sAggInfo.sortingIdx, sortOut);
98640: }
98641: for(j=0; j<pGroupBy->nExpr; j++){
98642: if( groupBySort ){
98643: sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j);
98644: if( j==0 ) sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE);
98645: }else{
98646: sAggInfo.directMode = 1;
98647: sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j);
98648: }
98649: }
98650: sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr,
98651: (char*)pKeyInfo, P4_KEYINFO);
98652: j1 = sqlite3VdbeCurrentAddr(v);
98653: sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1);
98654:
98655: /* Generate code that runs whenever the GROUP BY changes.
98656: ** Changes in the GROUP BY are detected by the previous code
98657: ** block. If there were no changes, this block is skipped.
98658: **
98659: ** This code copies current group by terms in b0,b1,b2,...
98660: ** over to a0,a1,a2. It then calls the output subroutine
98661: ** and resets the aggregate accumulator registers in preparation
98662: ** for the next GROUP BY batch.
98663: */
98664: sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr);
98665: sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);
98666: VdbeComment((v, "output one row"));
98667: sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd);
98668: VdbeComment((v, "check abort flag"));
98669: sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
98670: VdbeComment((v, "reset accumulator"));
98671:
98672: /* Update the aggregate accumulators based on the content of
98673: ** the current row
98674: */
98675: sqlite3VdbeJumpHere(v, j1);
98676: updateAccumulator(pParse, &sAggInfo);
98677: sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag);
98678: VdbeComment((v, "indicate data in accumulator"));
98679:
98680: /* End of the loop
98681: */
98682: if( groupBySort ){
98683: sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop);
98684: }else{
98685: sqlite3WhereEnd(pWInfo);
98686: sqlite3VdbeChangeToNoop(v, addrSortingIdx);
98687: }
98688:
98689: /* Output the final row of result
98690: */
98691: sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow);
98692: VdbeComment((v, "output final row"));
98693:
98694: /* Jump over the subroutines
98695: */
98696: sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEnd);
98697:
98698: /* Generate a subroutine that outputs a single row of the result
98699: ** set. This subroutine first looks at the iUseFlag. If iUseFlag
98700: ** is less than or equal to zero, the subroutine is a no-op. If
98701: ** the processing calls for the query to abort, this subroutine
98702: ** increments the iAbortFlag memory location before returning in
98703: ** order to signal the caller to abort.
98704: */
98705: addrSetAbort = sqlite3VdbeCurrentAddr(v);
98706: sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag);
98707: VdbeComment((v, "set abort flag"));
98708: sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
98709: sqlite3VdbeResolveLabel(v, addrOutputRow);
98710: addrOutputRow = sqlite3VdbeCurrentAddr(v);
98711: sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2);
98712: VdbeComment((v, "Groupby result generator entry point"));
98713: sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
98714: finalizeAggFunctions(pParse, &sAggInfo);
98715: sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL);
98716: selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy,
1.2.2.1 ! misho 98717: &sDistinct, pDest,
1.2 misho 98718: addrOutputRow+1, addrSetAbort);
98719: sqlite3VdbeAddOp1(v, OP_Return, regOutputRow);
98720: VdbeComment((v, "end groupby result generator"));
98721:
98722: /* Generate a subroutine that will reset the group-by accumulator
98723: */
98724: sqlite3VdbeResolveLabel(v, addrReset);
98725: resetAccumulator(pParse, &sAggInfo);
98726: sqlite3VdbeAddOp1(v, OP_Return, regReset);
98727:
98728: } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */
98729: else {
98730: ExprList *pDel = 0;
98731: #ifndef SQLITE_OMIT_BTREECOUNT
98732: Table *pTab;
98733: if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){
98734: /* If isSimpleCount() returns a pointer to a Table structure, then
98735: ** the SQL statement is of the form:
98736: **
98737: ** SELECT count(*) FROM <tbl>
98738: **
98739: ** where the Table structure returned represents table <tbl>.
98740: **
98741: ** This statement is so common that it is optimized specially. The
98742: ** OP_Count instruction is executed either on the intkey table that
98743: ** contains the data for table <tbl> or on one of its indexes. It
98744: ** is better to execute the op on an index, as indexes are almost
98745: ** always spread across less pages than their corresponding tables.
98746: */
98747: const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
98748: const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */
98749: Index *pIdx; /* Iterator variable */
98750: KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */
98751: Index *pBest = 0; /* Best index found so far */
98752: int iRoot = pTab->tnum; /* Root page of scanned b-tree */
98753:
98754: sqlite3CodeVerifySchema(pParse, iDb);
98755: sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
98756:
98757: /* Search for the index that has the least amount of columns. If
98758: ** there is such an index, and it has less columns than the table
98759: ** does, then we can assume that it consumes less space on disk and
98760: ** will therefore be cheaper to scan to determine the query result.
98761: ** In this case set iRoot to the root page number of the index b-tree
98762: ** and pKeyInfo to the KeyInfo structure required to navigate the
98763: ** index.
98764: **
98765: ** (2011-04-15) Do not do a full scan of an unordered index.
98766: **
98767: ** In practice the KeyInfo structure will not be used. It is only
98768: ** passed to keep OP_OpenRead happy.
98769: */
98770: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
98771: if( pIdx->bUnordered==0 && (!pBest || pIdx->nColumn<pBest->nColumn) ){
98772: pBest = pIdx;
98773: }
98774: }
98775: if( pBest && pBest->nColumn<pTab->nCol ){
98776: iRoot = pBest->tnum;
98777: pKeyInfo = sqlite3IndexKeyinfo(pParse, pBest);
98778: }
98779:
98780: /* Open a read-only cursor, execute the OP_Count, close the cursor. */
98781: sqlite3VdbeAddOp3(v, OP_OpenRead, iCsr, iRoot, iDb);
98782: if( pKeyInfo ){
98783: sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO_HANDOFF);
98784: }
98785: sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem);
98786: sqlite3VdbeAddOp1(v, OP_Close, iCsr);
98787: explainSimpleCount(pParse, pTab, pBest);
98788: }else
98789: #endif /* SQLITE_OMIT_BTREECOUNT */
98790: {
98791: /* Check if the query is of one of the following forms:
98792: **
98793: ** SELECT min(x) FROM ...
98794: ** SELECT max(x) FROM ...
98795: **
98796: ** If it is, then ask the code in where.c to attempt to sort results
98797: ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause.
98798: ** If where.c is able to produce results sorted in this order, then
98799: ** add vdbe code to break out of the processing loop after the
98800: ** first iteration (since the first iteration of the loop is
98801: ** guaranteed to operate on the row with the minimum or maximum
98802: ** value of x, the only row required).
98803: **
98804: ** A special flag must be passed to sqlite3WhereBegin() to slightly
98805: ** modify behaviour as follows:
98806: **
98807: ** + If the query is a "SELECT min(x)", then the loop coded by
98808: ** where.c should not iterate over any values with a NULL value
98809: ** for x.
98810: **
98811: ** + The optimizer code in where.c (the thing that decides which
98812: ** index or indices to use) should place a different priority on
98813: ** satisfying the 'ORDER BY' clause than it does in other cases.
98814: ** Refer to code and comments in where.c for details.
98815: */
98816: ExprList *pMinMax = 0;
98817: u8 flag = minMaxQuery(p);
98818: if( flag ){
98819: assert( !ExprHasProperty(p->pEList->a[0].pExpr, EP_xIsSelect) );
1.2.2.1 ! misho 98820: assert( p->pEList->a[0].pExpr->x.pList->nExpr==1 );
1.2 misho 98821: pMinMax = sqlite3ExprListDup(db, p->pEList->a[0].pExpr->x.pList,0);
98822: pDel = pMinMax;
98823: if( pMinMax && !db->mallocFailed ){
98824: pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0;
98825: pMinMax->a[0].pExpr->op = TK_COLUMN;
98826: }
98827: }
98828:
98829: /* This case runs if the aggregate has no GROUP BY clause. The
98830: ** processing is much simpler since there is only a single row
98831: ** of output.
98832: */
98833: resetAccumulator(pParse, &sAggInfo);
1.2.2.1 ! misho 98834: pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMax,0,flag,0);
1.2 misho 98835: if( pWInfo==0 ){
98836: sqlite3ExprListDelete(db, pDel);
98837: goto select_end;
98838: }
98839: updateAccumulator(pParse, &sAggInfo);
1.2.2.1 ! misho 98840: assert( pMinMax==0 || pMinMax->nExpr==1 );
! 98841: if( pWInfo->nOBSat>0 ){
1.2 misho 98842: sqlite3VdbeAddOp2(v, OP_Goto, 0, pWInfo->iBreak);
98843: VdbeComment((v, "%s() by index",
98844: (flag==WHERE_ORDERBY_MIN?"min":"max")));
98845: }
98846: sqlite3WhereEnd(pWInfo);
98847: finalizeAggFunctions(pParse, &sAggInfo);
98848: }
98849:
98850: pOrderBy = 0;
98851: sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL);
1.2.2.1 ! misho 98852: selectInnerLoop(pParse, p, p->pEList, 0, 0, 0, 0,
1.2 misho 98853: pDest, addrEnd, addrEnd);
98854: sqlite3ExprListDelete(db, pDel);
98855: }
98856: sqlite3VdbeResolveLabel(v, addrEnd);
98857:
98858: } /* endif aggregate query */
98859:
1.2.2.1 ! misho 98860: if( sDistinct.eTnctType==WHERE_DISTINCT_UNORDERED ){
1.2 misho 98861: explainTempTable(pParse, "DISTINCT");
98862: }
98863:
98864: /* If there is an ORDER BY clause, then we need to sort the results
98865: ** and send them to the callback one by one.
98866: */
98867: if( pOrderBy ){
98868: explainTempTable(pParse, "ORDER BY");
98869: generateSortTail(pParse, p, v, pEList->nExpr, pDest);
98870: }
98871:
98872: /* Jump here to skip this query
98873: */
98874: sqlite3VdbeResolveLabel(v, iEnd);
98875:
98876: /* The SELECT was successfully coded. Set the return code to 0
98877: ** to indicate no errors.
98878: */
98879: rc = 0;
98880:
98881: /* Control jumps to here if an error is encountered above, or upon
98882: ** successful coding of the SELECT.
98883: */
98884: select_end:
98885: explainSetInteger(pParse->iSelectId, iRestoreSelectId);
98886:
98887: /* Identify column names if results of the SELECT are to be output.
98888: */
98889: if( rc==SQLITE_OK && pDest->eDest==SRT_Output ){
98890: generateColumnNames(pParse, pTabList, pEList);
98891: }
98892:
98893: sqlite3DbFree(db, sAggInfo.aCol);
98894: sqlite3DbFree(db, sAggInfo.aFunc);
98895: return rc;
98896: }
98897:
98898: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
98899: /*
98900: ** Generate a human-readable description of a the Select object.
98901: */
98902: static void explainOneSelect(Vdbe *pVdbe, Select *p){
98903: sqlite3ExplainPrintf(pVdbe, "SELECT ");
98904: if( p->selFlags & (SF_Distinct|SF_Aggregate) ){
98905: if( p->selFlags & SF_Distinct ){
98906: sqlite3ExplainPrintf(pVdbe, "DISTINCT ");
98907: }
98908: if( p->selFlags & SF_Aggregate ){
98909: sqlite3ExplainPrintf(pVdbe, "agg_flag ");
98910: }
98911: sqlite3ExplainNL(pVdbe);
98912: sqlite3ExplainPrintf(pVdbe, " ");
98913: }
98914: sqlite3ExplainExprList(pVdbe, p->pEList);
98915: sqlite3ExplainNL(pVdbe);
98916: if( p->pSrc && p->pSrc->nSrc ){
98917: int i;
98918: sqlite3ExplainPrintf(pVdbe, "FROM ");
98919: sqlite3ExplainPush(pVdbe);
98920: for(i=0; i<p->pSrc->nSrc; i++){
98921: struct SrcList_item *pItem = &p->pSrc->a[i];
98922: sqlite3ExplainPrintf(pVdbe, "{%d,*} = ", pItem->iCursor);
98923: if( pItem->pSelect ){
98924: sqlite3ExplainSelect(pVdbe, pItem->pSelect);
98925: if( pItem->pTab ){
98926: sqlite3ExplainPrintf(pVdbe, " (tabname=%s)", pItem->pTab->zName);
98927: }
98928: }else if( pItem->zName ){
98929: sqlite3ExplainPrintf(pVdbe, "%s", pItem->zName);
98930: }
98931: if( pItem->zAlias ){
98932: sqlite3ExplainPrintf(pVdbe, " (AS %s)", pItem->zAlias);
98933: }
98934: if( pItem->jointype & JT_LEFT ){
98935: sqlite3ExplainPrintf(pVdbe, " LEFT-JOIN");
98936: }
98937: sqlite3ExplainNL(pVdbe);
98938: }
98939: sqlite3ExplainPop(pVdbe);
98940: }
98941: if( p->pWhere ){
98942: sqlite3ExplainPrintf(pVdbe, "WHERE ");
98943: sqlite3ExplainExpr(pVdbe, p->pWhere);
98944: sqlite3ExplainNL(pVdbe);
98945: }
98946: if( p->pGroupBy ){
98947: sqlite3ExplainPrintf(pVdbe, "GROUPBY ");
98948: sqlite3ExplainExprList(pVdbe, p->pGroupBy);
98949: sqlite3ExplainNL(pVdbe);
98950: }
98951: if( p->pHaving ){
98952: sqlite3ExplainPrintf(pVdbe, "HAVING ");
98953: sqlite3ExplainExpr(pVdbe, p->pHaving);
98954: sqlite3ExplainNL(pVdbe);
98955: }
98956: if( p->pOrderBy ){
98957: sqlite3ExplainPrintf(pVdbe, "ORDERBY ");
98958: sqlite3ExplainExprList(pVdbe, p->pOrderBy);
98959: sqlite3ExplainNL(pVdbe);
98960: }
98961: if( p->pLimit ){
98962: sqlite3ExplainPrintf(pVdbe, "LIMIT ");
98963: sqlite3ExplainExpr(pVdbe, p->pLimit);
98964: sqlite3ExplainNL(pVdbe);
98965: }
98966: if( p->pOffset ){
98967: sqlite3ExplainPrintf(pVdbe, "OFFSET ");
98968: sqlite3ExplainExpr(pVdbe, p->pOffset);
98969: sqlite3ExplainNL(pVdbe);
98970: }
98971: }
98972: SQLITE_PRIVATE void sqlite3ExplainSelect(Vdbe *pVdbe, Select *p){
98973: if( p==0 ){
98974: sqlite3ExplainPrintf(pVdbe, "(null-select)");
98975: return;
98976: }
98977: while( p->pPrior ) p = p->pPrior;
98978: sqlite3ExplainPush(pVdbe);
98979: while( p ){
98980: explainOneSelect(pVdbe, p);
98981: p = p->pNext;
98982: if( p==0 ) break;
98983: sqlite3ExplainNL(pVdbe);
98984: sqlite3ExplainPrintf(pVdbe, "%s\n", selectOpName(p->op));
98985: }
98986: sqlite3ExplainPrintf(pVdbe, "END");
98987: sqlite3ExplainPop(pVdbe);
98988: }
98989:
98990: /* End of the structure debug printing code
98991: *****************************************************************************/
1.2.2.1 ! misho 98992: #endif /* defined(SQLITE_ENABLE_TREE_EXPLAIN) */
1.2 misho 98993:
98994: /************** End of select.c **********************************************/
98995: /************** Begin file table.c *******************************************/
98996: /*
98997: ** 2001 September 15
98998: **
98999: ** The author disclaims copyright to this source code. In place of
99000: ** a legal notice, here is a blessing:
99001: **
99002: ** May you do good and not evil.
99003: ** May you find forgiveness for yourself and forgive others.
99004: ** May you share freely, never taking more than you give.
99005: **
99006: *************************************************************************
99007: ** This file contains the sqlite3_get_table() and sqlite3_free_table()
99008: ** interface routines. These are just wrappers around the main
99009: ** interface routine of sqlite3_exec().
99010: **
99011: ** These routines are in a separate files so that they will not be linked
99012: ** if they are not used.
99013: */
99014: /* #include <stdlib.h> */
99015: /* #include <string.h> */
99016:
99017: #ifndef SQLITE_OMIT_GET_TABLE
99018:
99019: /*
99020: ** This structure is used to pass data from sqlite3_get_table() through
99021: ** to the callback function is uses to build the result.
99022: */
99023: typedef struct TabResult {
99024: char **azResult; /* Accumulated output */
99025: char *zErrMsg; /* Error message text, if an error occurs */
99026: int nAlloc; /* Slots allocated for azResult[] */
99027: int nRow; /* Number of rows in the result */
99028: int nColumn; /* Number of columns in the result */
99029: int nData; /* Slots used in azResult[]. (nRow+1)*nColumn */
99030: int rc; /* Return code from sqlite3_exec() */
99031: } TabResult;
99032:
99033: /*
99034: ** This routine is called once for each row in the result table. Its job
99035: ** is to fill in the TabResult structure appropriately, allocating new
99036: ** memory as necessary.
99037: */
99038: static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){
99039: TabResult *p = (TabResult*)pArg; /* Result accumulator */
99040: int need; /* Slots needed in p->azResult[] */
99041: int i; /* Loop counter */
99042: char *z; /* A single column of result */
99043:
99044: /* Make sure there is enough space in p->azResult to hold everything
99045: ** we need to remember from this invocation of the callback.
99046: */
99047: if( p->nRow==0 && argv!=0 ){
99048: need = nCol*2;
99049: }else{
99050: need = nCol;
99051: }
99052: if( p->nData + need > p->nAlloc ){
99053: char **azNew;
99054: p->nAlloc = p->nAlloc*2 + need;
99055: azNew = sqlite3_realloc( p->azResult, sizeof(char*)*p->nAlloc );
99056: if( azNew==0 ) goto malloc_failed;
99057: p->azResult = azNew;
99058: }
99059:
99060: /* If this is the first row, then generate an extra row containing
99061: ** the names of all columns.
99062: */
99063: if( p->nRow==0 ){
99064: p->nColumn = nCol;
99065: for(i=0; i<nCol; i++){
99066: z = sqlite3_mprintf("%s", colv[i]);
99067: if( z==0 ) goto malloc_failed;
99068: p->azResult[p->nData++] = z;
99069: }
99070: }else if( p->nColumn!=nCol ){
99071: sqlite3_free(p->zErrMsg);
99072: p->zErrMsg = sqlite3_mprintf(
99073: "sqlite3_get_table() called with two or more incompatible queries"
99074: );
99075: p->rc = SQLITE_ERROR;
99076: return 1;
99077: }
99078:
99079: /* Copy over the row data
99080: */
99081: if( argv!=0 ){
99082: for(i=0; i<nCol; i++){
99083: if( argv[i]==0 ){
99084: z = 0;
99085: }else{
99086: int n = sqlite3Strlen30(argv[i])+1;
99087: z = sqlite3_malloc( n );
99088: if( z==0 ) goto malloc_failed;
99089: memcpy(z, argv[i], n);
99090: }
99091: p->azResult[p->nData++] = z;
99092: }
99093: p->nRow++;
99094: }
99095: return 0;
99096:
99097: malloc_failed:
99098: p->rc = SQLITE_NOMEM;
99099: return 1;
99100: }
99101:
99102: /*
99103: ** Query the database. But instead of invoking a callback for each row,
99104: ** malloc() for space to hold the result and return the entire results
99105: ** at the conclusion of the call.
99106: **
99107: ** The result that is written to ***pazResult is held in memory obtained
99108: ** from malloc(). But the caller cannot free this memory directly.
99109: ** Instead, the entire table should be passed to sqlite3_free_table() when
99110: ** the calling procedure is finished using it.
99111: */
99112: SQLITE_API int sqlite3_get_table(
99113: sqlite3 *db, /* The database on which the SQL executes */
99114: const char *zSql, /* The SQL to be executed */
99115: char ***pazResult, /* Write the result table here */
99116: int *pnRow, /* Write the number of rows in the result here */
99117: int *pnColumn, /* Write the number of columns of result here */
99118: char **pzErrMsg /* Write error messages here */
99119: ){
99120: int rc;
99121: TabResult res;
99122:
99123: *pazResult = 0;
99124: if( pnColumn ) *pnColumn = 0;
99125: if( pnRow ) *pnRow = 0;
99126: if( pzErrMsg ) *pzErrMsg = 0;
99127: res.zErrMsg = 0;
99128: res.nRow = 0;
99129: res.nColumn = 0;
99130: res.nData = 1;
99131: res.nAlloc = 20;
99132: res.rc = SQLITE_OK;
99133: res.azResult = sqlite3_malloc(sizeof(char*)*res.nAlloc );
99134: if( res.azResult==0 ){
99135: db->errCode = SQLITE_NOMEM;
99136: return SQLITE_NOMEM;
99137: }
99138: res.azResult[0] = 0;
99139: rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg);
99140: assert( sizeof(res.azResult[0])>= sizeof(res.nData) );
99141: res.azResult[0] = SQLITE_INT_TO_PTR(res.nData);
99142: if( (rc&0xff)==SQLITE_ABORT ){
99143: sqlite3_free_table(&res.azResult[1]);
99144: if( res.zErrMsg ){
99145: if( pzErrMsg ){
99146: sqlite3_free(*pzErrMsg);
99147: *pzErrMsg = sqlite3_mprintf("%s",res.zErrMsg);
99148: }
99149: sqlite3_free(res.zErrMsg);
99150: }
99151: db->errCode = res.rc; /* Assume 32-bit assignment is atomic */
99152: return res.rc;
99153: }
99154: sqlite3_free(res.zErrMsg);
99155: if( rc!=SQLITE_OK ){
99156: sqlite3_free_table(&res.azResult[1]);
99157: return rc;
99158: }
99159: if( res.nAlloc>res.nData ){
99160: char **azNew;
99161: azNew = sqlite3_realloc( res.azResult, sizeof(char*)*res.nData );
99162: if( azNew==0 ){
99163: sqlite3_free_table(&res.azResult[1]);
99164: db->errCode = SQLITE_NOMEM;
99165: return SQLITE_NOMEM;
99166: }
99167: res.azResult = azNew;
99168: }
99169: *pazResult = &res.azResult[1];
99170: if( pnColumn ) *pnColumn = res.nColumn;
99171: if( pnRow ) *pnRow = res.nRow;
99172: return rc;
99173: }
99174:
99175: /*
99176: ** This routine frees the space the sqlite3_get_table() malloced.
99177: */
99178: SQLITE_API void sqlite3_free_table(
99179: char **azResult /* Result returned from from sqlite3_get_table() */
99180: ){
99181: if( azResult ){
99182: int i, n;
99183: azResult--;
99184: assert( azResult!=0 );
99185: n = SQLITE_PTR_TO_INT(azResult[0]);
99186: for(i=1; i<n; i++){ if( azResult[i] ) sqlite3_free(azResult[i]); }
99187: sqlite3_free(azResult);
99188: }
99189: }
99190:
99191: #endif /* SQLITE_OMIT_GET_TABLE */
99192:
99193: /************** End of table.c ***********************************************/
99194: /************** Begin file trigger.c *****************************************/
99195: /*
99196: **
99197: ** The author disclaims copyright to this source code. In place of
99198: ** a legal notice, here is a blessing:
99199: **
99200: ** May you do good and not evil.
99201: ** May you find forgiveness for yourself and forgive others.
99202: ** May you share freely, never taking more than you give.
99203: **
99204: *************************************************************************
99205: ** This file contains the implementation for TRIGGERs
99206: */
99207:
99208: #ifndef SQLITE_OMIT_TRIGGER
99209: /*
99210: ** Delete a linked list of TriggerStep structures.
99211: */
99212: SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerStep){
99213: while( pTriggerStep ){
99214: TriggerStep * pTmp = pTriggerStep;
99215: pTriggerStep = pTriggerStep->pNext;
99216:
99217: sqlite3ExprDelete(db, pTmp->pWhere);
99218: sqlite3ExprListDelete(db, pTmp->pExprList);
99219: sqlite3SelectDelete(db, pTmp->pSelect);
99220: sqlite3IdListDelete(db, pTmp->pIdList);
99221:
99222: sqlite3DbFree(db, pTmp);
99223: }
99224: }
99225:
99226: /*
99227: ** Given table pTab, return a list of all the triggers attached to
99228: ** the table. The list is connected by Trigger.pNext pointers.
99229: **
99230: ** All of the triggers on pTab that are in the same database as pTab
99231: ** are already attached to pTab->pTrigger. But there might be additional
99232: ** triggers on pTab in the TEMP schema. This routine prepends all
99233: ** TEMP triggers on pTab to the beginning of the pTab->pTrigger list
99234: ** and returns the combined list.
99235: **
99236: ** To state it another way: This routine returns a list of all triggers
99237: ** that fire off of pTab. The list will include any TEMP triggers on
99238: ** pTab as well as the triggers lised in pTab->pTrigger.
99239: */
99240: SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
99241: Schema * const pTmpSchema = pParse->db->aDb[1].pSchema;
99242: Trigger *pList = 0; /* List of triggers to return */
99243:
99244: if( pParse->disableTriggers ){
99245: return 0;
99246: }
99247:
99248: if( pTmpSchema!=pTab->pSchema ){
99249: HashElem *p;
99250: assert( sqlite3SchemaMutexHeld(pParse->db, 0, pTmpSchema) );
99251: for(p=sqliteHashFirst(&pTmpSchema->trigHash); p; p=sqliteHashNext(p)){
99252: Trigger *pTrig = (Trigger *)sqliteHashData(p);
99253: if( pTrig->pTabSchema==pTab->pSchema
99254: && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
99255: ){
99256: pTrig->pNext = (pList ? pList : pTab->pTrigger);
99257: pList = pTrig;
99258: }
99259: }
99260: }
99261:
99262: return (pList ? pList : pTab->pTrigger);
99263: }
99264:
99265: /*
99266: ** This is called by the parser when it sees a CREATE TRIGGER statement
99267: ** up to the point of the BEGIN before the trigger actions. A Trigger
99268: ** structure is generated based on the information available and stored
99269: ** in pParse->pNewTrigger. After the trigger actions have been parsed, the
99270: ** sqlite3FinishTrigger() function is called to complete the trigger
99271: ** construction process.
99272: */
99273: SQLITE_PRIVATE void sqlite3BeginTrigger(
99274: Parse *pParse, /* The parse context of the CREATE TRIGGER statement */
99275: Token *pName1, /* The name of the trigger */
99276: Token *pName2, /* The name of the trigger */
99277: int tr_tm, /* One of TK_BEFORE, TK_AFTER, TK_INSTEAD */
99278: int op, /* One of TK_INSERT, TK_UPDATE, TK_DELETE */
99279: IdList *pColumns, /* column list if this is an UPDATE OF trigger */
99280: SrcList *pTableName,/* The name of the table/view the trigger applies to */
99281: Expr *pWhen, /* WHEN clause */
99282: int isTemp, /* True if the TEMPORARY keyword is present */
99283: int noErr /* Suppress errors if the trigger already exists */
99284: ){
99285: Trigger *pTrigger = 0; /* The new trigger */
99286: Table *pTab; /* Table that the trigger fires off of */
99287: char *zName = 0; /* Name of the trigger */
99288: sqlite3 *db = pParse->db; /* The database connection */
99289: int iDb; /* The database to store the trigger in */
99290: Token *pName; /* The unqualified db name */
99291: DbFixer sFix; /* State vector for the DB fixer */
99292: int iTabDb; /* Index of the database holding pTab */
99293:
99294: assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */
99295: assert( pName2!=0 );
99296: assert( op==TK_INSERT || op==TK_UPDATE || op==TK_DELETE );
99297: assert( op>0 && op<0xff );
99298: if( isTemp ){
99299: /* If TEMP was specified, then the trigger name may not be qualified. */
99300: if( pName2->n>0 ){
99301: sqlite3ErrorMsg(pParse, "temporary trigger may not have qualified name");
99302: goto trigger_cleanup;
99303: }
99304: iDb = 1;
99305: pName = pName1;
99306: }else{
1.2.2.1 ! misho 99307: /* Figure out the db that the trigger will be created in */
1.2 misho 99308: iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
99309: if( iDb<0 ){
99310: goto trigger_cleanup;
99311: }
99312: }
99313: if( !pTableName || db->mallocFailed ){
99314: goto trigger_cleanup;
99315: }
99316:
99317: /* A long-standing parser bug is that this syntax was allowed:
99318: **
99319: ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab ....
99320: ** ^^^^^^^^
99321: **
99322: ** To maintain backwards compatibility, ignore the database
99323: ** name on pTableName if we are reparsing our of SQLITE_MASTER.
99324: */
99325: if( db->init.busy && iDb!=1 ){
99326: sqlite3DbFree(db, pTableName->a[0].zDatabase);
99327: pTableName->a[0].zDatabase = 0;
99328: }
99329:
99330: /* If the trigger name was unqualified, and the table is a temp table,
99331: ** then set iDb to 1 to create the trigger in the temporary database.
99332: ** If sqlite3SrcListLookup() returns 0, indicating the table does not
99333: ** exist, the error is caught by the block below.
99334: */
99335: pTab = sqlite3SrcListLookup(pParse, pTableName);
99336: if( db->init.busy==0 && pName2->n==0 && pTab
99337: && pTab->pSchema==db->aDb[1].pSchema ){
99338: iDb = 1;
99339: }
99340:
99341: /* Ensure the table name matches database name and that the table exists */
99342: if( db->mallocFailed ) goto trigger_cleanup;
99343: assert( pTableName->nSrc==1 );
99344: if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", pName) &&
99345: sqlite3FixSrcList(&sFix, pTableName) ){
99346: goto trigger_cleanup;
99347: }
99348: pTab = sqlite3SrcListLookup(pParse, pTableName);
99349: if( !pTab ){
99350: /* The table does not exist. */
99351: if( db->init.iDb==1 ){
99352: /* Ticket #3810.
99353: ** Normally, whenever a table is dropped, all associated triggers are
99354: ** dropped too. But if a TEMP trigger is created on a non-TEMP table
99355: ** and the table is dropped by a different database connection, the
99356: ** trigger is not visible to the database connection that does the
99357: ** drop so the trigger cannot be dropped. This results in an
99358: ** "orphaned trigger" - a trigger whose associated table is missing.
99359: */
99360: db->init.orphanTrigger = 1;
99361: }
99362: goto trigger_cleanup;
99363: }
99364: if( IsVirtual(pTab) ){
99365: sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables");
99366: goto trigger_cleanup;
99367: }
99368:
99369: /* Check that the trigger name is not reserved and that no trigger of the
99370: ** specified name exists */
99371: zName = sqlite3NameFromToken(db, pName);
99372: if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){
99373: goto trigger_cleanup;
99374: }
99375: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
99376: if( sqlite3HashFind(&(db->aDb[iDb].pSchema->trigHash),
99377: zName, sqlite3Strlen30(zName)) ){
99378: if( !noErr ){
99379: sqlite3ErrorMsg(pParse, "trigger %T already exists", pName);
99380: }else{
99381: assert( !db->init.busy );
99382: sqlite3CodeVerifySchema(pParse, iDb);
99383: }
99384: goto trigger_cleanup;
99385: }
99386:
99387: /* Do not create a trigger on a system table */
99388: if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
99389: sqlite3ErrorMsg(pParse, "cannot create trigger on system table");
99390: pParse->nErr++;
99391: goto trigger_cleanup;
99392: }
99393:
99394: /* INSTEAD of triggers are only for views and views only support INSTEAD
99395: ** of triggers.
99396: */
99397: if( pTab->pSelect && tr_tm!=TK_INSTEAD ){
99398: sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S",
99399: (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName, 0);
99400: goto trigger_cleanup;
99401: }
99402: if( !pTab->pSelect && tr_tm==TK_INSTEAD ){
99403: sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF"
99404: " trigger on table: %S", pTableName, 0);
99405: goto trigger_cleanup;
99406: }
99407: iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
99408:
99409: #ifndef SQLITE_OMIT_AUTHORIZATION
99410: {
99411: int code = SQLITE_CREATE_TRIGGER;
99412: const char *zDb = db->aDb[iTabDb].zName;
99413: const char *zDbTrig = isTemp ? db->aDb[1].zName : zDb;
99414: if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER;
99415: if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){
99416: goto trigger_cleanup;
99417: }
99418: if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iTabDb),0,zDb)){
99419: goto trigger_cleanup;
99420: }
99421: }
99422: #endif
99423:
99424: /* INSTEAD OF triggers can only appear on views and BEFORE triggers
99425: ** cannot appear on views. So we might as well translate every
99426: ** INSTEAD OF trigger into a BEFORE trigger. It simplifies code
99427: ** elsewhere.
99428: */
99429: if (tr_tm == TK_INSTEAD){
99430: tr_tm = TK_BEFORE;
99431: }
99432:
99433: /* Build the Trigger object */
99434: pTrigger = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger));
99435: if( pTrigger==0 ) goto trigger_cleanup;
99436: pTrigger->zName = zName;
99437: zName = 0;
99438: pTrigger->table = sqlite3DbStrDup(db, pTableName->a[0].zName);
99439: pTrigger->pSchema = db->aDb[iDb].pSchema;
99440: pTrigger->pTabSchema = pTab->pSchema;
99441: pTrigger->op = (u8)op;
99442: pTrigger->tr_tm = tr_tm==TK_BEFORE ? TRIGGER_BEFORE : TRIGGER_AFTER;
99443: pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE);
99444: pTrigger->pColumns = sqlite3IdListDup(db, pColumns);
99445: assert( pParse->pNewTrigger==0 );
99446: pParse->pNewTrigger = pTrigger;
99447:
99448: trigger_cleanup:
99449: sqlite3DbFree(db, zName);
99450: sqlite3SrcListDelete(db, pTableName);
99451: sqlite3IdListDelete(db, pColumns);
99452: sqlite3ExprDelete(db, pWhen);
99453: if( !pParse->pNewTrigger ){
99454: sqlite3DeleteTrigger(db, pTrigger);
99455: }else{
99456: assert( pParse->pNewTrigger==pTrigger );
99457: }
99458: }
99459:
99460: /*
99461: ** This routine is called after all of the trigger actions have been parsed
99462: ** in order to complete the process of building the trigger.
99463: */
99464: SQLITE_PRIVATE void sqlite3FinishTrigger(
99465: Parse *pParse, /* Parser context */
99466: TriggerStep *pStepList, /* The triggered program */
99467: Token *pAll /* Token that describes the complete CREATE TRIGGER */
99468: ){
99469: Trigger *pTrig = pParse->pNewTrigger; /* Trigger being finished */
99470: char *zName; /* Name of trigger */
99471: sqlite3 *db = pParse->db; /* The database */
99472: DbFixer sFix; /* Fixer object */
99473: int iDb; /* Database containing the trigger */
99474: Token nameToken; /* Trigger name for error reporting */
99475:
99476: pParse->pNewTrigger = 0;
99477: if( NEVER(pParse->nErr) || !pTrig ) goto triggerfinish_cleanup;
99478: zName = pTrig->zName;
99479: iDb = sqlite3SchemaToIndex(pParse->db, pTrig->pSchema);
99480: pTrig->step_list = pStepList;
99481: while( pStepList ){
99482: pStepList->pTrig = pTrig;
99483: pStepList = pStepList->pNext;
99484: }
99485: nameToken.z = pTrig->zName;
99486: nameToken.n = sqlite3Strlen30(nameToken.z);
99487: if( sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken)
99488: && sqlite3FixTriggerStep(&sFix, pTrig->step_list) ){
99489: goto triggerfinish_cleanup;
99490: }
99491:
99492: /* if we are not initializing,
99493: ** build the sqlite_master entry
99494: */
99495: if( !db->init.busy ){
99496: Vdbe *v;
99497: char *z;
99498:
99499: /* Make an entry in the sqlite_master table */
99500: v = sqlite3GetVdbe(pParse);
99501: if( v==0 ) goto triggerfinish_cleanup;
99502: sqlite3BeginWriteOperation(pParse, 0, iDb);
99503: z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);
99504: sqlite3NestedParse(pParse,
99505: "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
99506: db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName,
99507: pTrig->table, z);
99508: sqlite3DbFree(db, z);
99509: sqlite3ChangeCookie(pParse, iDb);
99510: sqlite3VdbeAddParseSchemaOp(v, iDb,
99511: sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName));
99512: }
99513:
99514: if( db->init.busy ){
99515: Trigger *pLink = pTrig;
99516: Hash *pHash = &db->aDb[iDb].pSchema->trigHash;
99517: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
99518: pTrig = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), pTrig);
99519: if( pTrig ){
99520: db->mallocFailed = 1;
99521: }else if( pLink->pSchema==pLink->pTabSchema ){
99522: Table *pTab;
99523: int n = sqlite3Strlen30(pLink->table);
99524: pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table, n);
99525: assert( pTab!=0 );
99526: pLink->pNext = pTab->pTrigger;
99527: pTab->pTrigger = pLink;
99528: }
99529: }
99530:
99531: triggerfinish_cleanup:
99532: sqlite3DeleteTrigger(db, pTrig);
99533: assert( !pParse->pNewTrigger );
99534: sqlite3DeleteTriggerStep(db, pStepList);
99535: }
99536:
99537: /*
99538: ** Turn a SELECT statement (that the pSelect parameter points to) into
99539: ** a trigger step. Return a pointer to a TriggerStep structure.
99540: **
99541: ** The parser calls this routine when it finds a SELECT statement in
99542: ** body of a TRIGGER.
99543: */
99544: SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){
99545: TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep));
99546: if( pTriggerStep==0 ) {
99547: sqlite3SelectDelete(db, pSelect);
99548: return 0;
99549: }
99550: pTriggerStep->op = TK_SELECT;
99551: pTriggerStep->pSelect = pSelect;
99552: pTriggerStep->orconf = OE_Default;
99553: return pTriggerStep;
99554: }
99555:
99556: /*
99557: ** Allocate space to hold a new trigger step. The allocated space
99558: ** holds both the TriggerStep object and the TriggerStep.target.z string.
99559: **
99560: ** If an OOM error occurs, NULL is returned and db->mallocFailed is set.
99561: */
99562: static TriggerStep *triggerStepAllocate(
99563: sqlite3 *db, /* Database connection */
99564: u8 op, /* Trigger opcode */
99565: Token *pName /* The target name */
99566: ){
99567: TriggerStep *pTriggerStep;
99568:
99569: pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n);
99570: if( pTriggerStep ){
99571: char *z = (char*)&pTriggerStep[1];
99572: memcpy(z, pName->z, pName->n);
99573: pTriggerStep->target.z = z;
99574: pTriggerStep->target.n = pName->n;
99575: pTriggerStep->op = op;
99576: }
99577: return pTriggerStep;
99578: }
99579:
99580: /*
99581: ** Build a trigger step out of an INSERT statement. Return a pointer
99582: ** to the new trigger step.
99583: **
99584: ** The parser calls this routine when it sees an INSERT inside the
99585: ** body of a trigger.
99586: */
99587: SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(
99588: sqlite3 *db, /* The database connection */
99589: Token *pTableName, /* Name of the table into which we insert */
99590: IdList *pColumn, /* List of columns in pTableName to insert into */
99591: ExprList *pEList, /* The VALUE clause: a list of values to be inserted */
99592: Select *pSelect, /* A SELECT statement that supplies values */
99593: u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */
99594: ){
99595: TriggerStep *pTriggerStep;
99596:
99597: assert(pEList == 0 || pSelect == 0);
99598: assert(pEList != 0 || pSelect != 0 || db->mallocFailed);
99599:
99600: pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName);
99601: if( pTriggerStep ){
99602: pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE);
99603: pTriggerStep->pIdList = pColumn;
99604: pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
99605: pTriggerStep->orconf = orconf;
99606: }else{
99607: sqlite3IdListDelete(db, pColumn);
99608: }
99609: sqlite3ExprListDelete(db, pEList);
99610: sqlite3SelectDelete(db, pSelect);
99611:
99612: return pTriggerStep;
99613: }
99614:
99615: /*
99616: ** Construct a trigger step that implements an UPDATE statement and return
99617: ** a pointer to that trigger step. The parser calls this routine when it
99618: ** sees an UPDATE statement inside the body of a CREATE TRIGGER.
99619: */
99620: SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(
99621: sqlite3 *db, /* The database connection */
99622: Token *pTableName, /* Name of the table to be updated */
99623: ExprList *pEList, /* The SET clause: list of column and new values */
99624: Expr *pWhere, /* The WHERE clause */
99625: u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
99626: ){
99627: TriggerStep *pTriggerStep;
99628:
99629: pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName);
99630: if( pTriggerStep ){
99631: pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE);
99632: pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
99633: pTriggerStep->orconf = orconf;
99634: }
99635: sqlite3ExprListDelete(db, pEList);
99636: sqlite3ExprDelete(db, pWhere);
99637: return pTriggerStep;
99638: }
99639:
99640: /*
99641: ** Construct a trigger step that implements a DELETE statement and return
99642: ** a pointer to that trigger step. The parser calls this routine when it
99643: ** sees a DELETE statement inside the body of a CREATE TRIGGER.
99644: */
99645: SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(
99646: sqlite3 *db, /* Database connection */
99647: Token *pTableName, /* The table from which rows are deleted */
99648: Expr *pWhere /* The WHERE clause */
99649: ){
99650: TriggerStep *pTriggerStep;
99651:
99652: pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName);
99653: if( pTriggerStep ){
99654: pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE);
99655: pTriggerStep->orconf = OE_Default;
99656: }
99657: sqlite3ExprDelete(db, pWhere);
99658: return pTriggerStep;
99659: }
99660:
99661: /*
99662: ** Recursively delete a Trigger structure
99663: */
99664: SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){
99665: if( pTrigger==0 ) return;
99666: sqlite3DeleteTriggerStep(db, pTrigger->step_list);
99667: sqlite3DbFree(db, pTrigger->zName);
99668: sqlite3DbFree(db, pTrigger->table);
99669: sqlite3ExprDelete(db, pTrigger->pWhen);
99670: sqlite3IdListDelete(db, pTrigger->pColumns);
99671: sqlite3DbFree(db, pTrigger);
99672: }
99673:
99674: /*
99675: ** This function is called to drop a trigger from the database schema.
99676: **
99677: ** This may be called directly from the parser and therefore identifies
99678: ** the trigger by name. The sqlite3DropTriggerPtr() routine does the
99679: ** same job as this routine except it takes a pointer to the trigger
99680: ** instead of the trigger name.
99681: **/
99682: SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){
99683: Trigger *pTrigger = 0;
99684: int i;
99685: const char *zDb;
99686: const char *zName;
99687: int nName;
99688: sqlite3 *db = pParse->db;
99689:
99690: if( db->mallocFailed ) goto drop_trigger_cleanup;
99691: if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
99692: goto drop_trigger_cleanup;
99693: }
99694:
99695: assert( pName->nSrc==1 );
99696: zDb = pName->a[0].zDatabase;
99697: zName = pName->a[0].zName;
99698: nName = sqlite3Strlen30(zName);
99699: assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
99700: for(i=OMIT_TEMPDB; i<db->nDb; i++){
99701: int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */
99702: if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue;
99703: assert( sqlite3SchemaMutexHeld(db, j, 0) );
99704: pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName, nName);
99705: if( pTrigger ) break;
99706: }
99707: if( !pTrigger ){
99708: if( !noErr ){
99709: sqlite3ErrorMsg(pParse, "no such trigger: %S", pName, 0);
99710: }else{
99711: sqlite3CodeVerifyNamedSchema(pParse, zDb);
99712: }
99713: pParse->checkSchema = 1;
99714: goto drop_trigger_cleanup;
99715: }
99716: sqlite3DropTriggerPtr(pParse, pTrigger);
99717:
99718: drop_trigger_cleanup:
99719: sqlite3SrcListDelete(db, pName);
99720: }
99721:
99722: /*
99723: ** Return a pointer to the Table structure for the table that a trigger
99724: ** is set on.
99725: */
99726: static Table *tableOfTrigger(Trigger *pTrigger){
99727: int n = sqlite3Strlen30(pTrigger->table);
99728: return sqlite3HashFind(&pTrigger->pTabSchema->tblHash, pTrigger->table, n);
99729: }
99730:
99731:
99732: /*
99733: ** Drop a trigger given a pointer to that trigger.
99734: */
99735: SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){
99736: Table *pTable;
99737: Vdbe *v;
99738: sqlite3 *db = pParse->db;
99739: int iDb;
99740:
99741: iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema);
99742: assert( iDb>=0 && iDb<db->nDb );
99743: pTable = tableOfTrigger(pTrigger);
99744: assert( pTable );
99745: assert( pTable->pSchema==pTrigger->pSchema || iDb==1 );
99746: #ifndef SQLITE_OMIT_AUTHORIZATION
99747: {
99748: int code = SQLITE_DROP_TRIGGER;
99749: const char *zDb = db->aDb[iDb].zName;
99750: const char *zTab = SCHEMA_TABLE(iDb);
99751: if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER;
99752: if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) ||
99753: sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){
99754: return;
99755: }
99756: }
99757: #endif
99758:
99759: /* Generate code to destroy the database record of the trigger.
99760: */
99761: assert( pTable!=0 );
99762: if( (v = sqlite3GetVdbe(pParse))!=0 ){
99763: int base;
99764: static const VdbeOpList dropTrigger[] = {
99765: { OP_Rewind, 0, ADDR(9), 0},
99766: { OP_String8, 0, 1, 0}, /* 1 */
99767: { OP_Column, 0, 1, 2},
99768: { OP_Ne, 2, ADDR(8), 1},
99769: { OP_String8, 0, 1, 0}, /* 4: "trigger" */
99770: { OP_Column, 0, 0, 2},
99771: { OP_Ne, 2, ADDR(8), 1},
99772: { OP_Delete, 0, 0, 0},
99773: { OP_Next, 0, ADDR(1), 0}, /* 8 */
99774: };
99775:
99776: sqlite3BeginWriteOperation(pParse, 0, iDb);
99777: sqlite3OpenMasterTable(pParse, iDb);
99778: base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger);
99779: sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT);
99780: sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC);
99781: sqlite3ChangeCookie(pParse, iDb);
99782: sqlite3VdbeAddOp2(v, OP_Close, 0, 0);
99783: sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0);
99784: if( pParse->nMem<3 ){
99785: pParse->nMem = 3;
99786: }
99787: }
99788: }
99789:
99790: /*
99791: ** Remove a trigger from the hash tables of the sqlite* pointer.
99792: */
99793: SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){
99794: Trigger *pTrigger;
99795: Hash *pHash;
99796:
99797: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
99798: pHash = &(db->aDb[iDb].pSchema->trigHash);
99799: pTrigger = sqlite3HashInsert(pHash, zName, sqlite3Strlen30(zName), 0);
99800: if( ALWAYS(pTrigger) ){
99801: if( pTrigger->pSchema==pTrigger->pTabSchema ){
99802: Table *pTab = tableOfTrigger(pTrigger);
99803: Trigger **pp;
99804: for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext));
99805: *pp = (*pp)->pNext;
99806: }
99807: sqlite3DeleteTrigger(db, pTrigger);
99808: db->flags |= SQLITE_InternChanges;
99809: }
99810: }
99811:
99812: /*
99813: ** pEList is the SET clause of an UPDATE statement. Each entry
99814: ** in pEList is of the format <id>=<expr>. If any of the entries
99815: ** in pEList have an <id> which matches an identifier in pIdList,
99816: ** then return TRUE. If pIdList==NULL, then it is considered a
99817: ** wildcard that matches anything. Likewise if pEList==NULL then
99818: ** it matches anything so always return true. Return false only
99819: ** if there is no match.
99820: */
99821: static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){
99822: int e;
99823: if( pIdList==0 || NEVER(pEList==0) ) return 1;
99824: for(e=0; e<pEList->nExpr; e++){
99825: if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1;
99826: }
99827: return 0;
99828: }
99829:
99830: /*
99831: ** Return a list of all triggers on table pTab if there exists at least
99832: ** one trigger that must be fired when an operation of type 'op' is
99833: ** performed on the table, and, if that operation is an UPDATE, if at
99834: ** least one of the columns in pChanges is being modified.
99835: */
99836: SQLITE_PRIVATE Trigger *sqlite3TriggersExist(
99837: Parse *pParse, /* Parse context */
99838: Table *pTab, /* The table the contains the triggers */
99839: int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */
99840: ExprList *pChanges, /* Columns that change in an UPDATE statement */
99841: int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
99842: ){
99843: int mask = 0;
99844: Trigger *pList = 0;
99845: Trigger *p;
99846:
99847: if( (pParse->db->flags & SQLITE_EnableTrigger)!=0 ){
99848: pList = sqlite3TriggerList(pParse, pTab);
99849: }
99850: assert( pList==0 || IsVirtual(pTab)==0 );
99851: for(p=pList; p; p=p->pNext){
99852: if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){
99853: mask |= p->tr_tm;
99854: }
99855: }
99856: if( pMask ){
99857: *pMask = mask;
99858: }
99859: return (mask ? pList : 0);
99860: }
99861:
99862: /*
99863: ** Convert the pStep->target token into a SrcList and return a pointer
99864: ** to that SrcList.
99865: **
99866: ** This routine adds a specific database name, if needed, to the target when
99867: ** forming the SrcList. This prevents a trigger in one database from
99868: ** referring to a target in another database. An exception is when the
99869: ** trigger is in TEMP in which case it can refer to any other database it
99870: ** wants.
99871: */
99872: static SrcList *targetSrcList(
99873: Parse *pParse, /* The parsing context */
99874: TriggerStep *pStep /* The trigger containing the target token */
99875: ){
99876: int iDb; /* Index of the database to use */
99877: SrcList *pSrc; /* SrcList to be returned */
99878:
99879: pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0);
99880: if( pSrc ){
99881: assert( pSrc->nSrc>0 );
99882: assert( pSrc->a!=0 );
99883: iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema);
99884: if( iDb==0 || iDb>=2 ){
99885: sqlite3 *db = pParse->db;
99886: assert( iDb<pParse->db->nDb );
99887: pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName);
99888: }
99889: }
99890: return pSrc;
99891: }
99892:
99893: /*
99894: ** Generate VDBE code for the statements inside the body of a single
99895: ** trigger.
99896: */
99897: static int codeTriggerProgram(
99898: Parse *pParse, /* The parser context */
99899: TriggerStep *pStepList, /* List of statements inside the trigger body */
99900: int orconf /* Conflict algorithm. (OE_Abort, etc) */
99901: ){
99902: TriggerStep *pStep;
99903: Vdbe *v = pParse->pVdbe;
99904: sqlite3 *db = pParse->db;
99905:
99906: assert( pParse->pTriggerTab && pParse->pToplevel );
99907: assert( pStepList );
99908: assert( v!=0 );
99909: for(pStep=pStepList; pStep; pStep=pStep->pNext){
99910: /* Figure out the ON CONFLICT policy that will be used for this step
99911: ** of the trigger program. If the statement that caused this trigger
99912: ** to fire had an explicit ON CONFLICT, then use it. Otherwise, use
99913: ** the ON CONFLICT policy that was specified as part of the trigger
99914: ** step statement. Example:
99915: **
99916: ** CREATE TRIGGER AFTER INSERT ON t1 BEGIN;
99917: ** INSERT OR REPLACE INTO t2 VALUES(new.a, new.b);
99918: ** END;
99919: **
99920: ** INSERT INTO t1 ... ; -- insert into t2 uses REPLACE policy
99921: ** INSERT OR IGNORE INTO t1 ... ; -- insert into t2 uses IGNORE policy
99922: */
99923: pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf;
99924:
1.2.2.1 ! misho 99925: /* Clear the cookieGoto flag. When coding triggers, the cookieGoto
! 99926: ** variable is used as a flag to indicate to sqlite3ExprCodeConstants()
! 99927: ** that it is not safe to refactor constants (this happens after the
! 99928: ** start of the first loop in the SQL statement is coded - at that
! 99929: ** point code may be conditionally executed, so it is no longer safe to
! 99930: ** initialize constant register values). */
! 99931: assert( pParse->cookieGoto==0 || pParse->cookieGoto==-1 );
! 99932: pParse->cookieGoto = 0;
! 99933:
1.2 misho 99934: switch( pStep->op ){
99935: case TK_UPDATE: {
99936: sqlite3Update(pParse,
99937: targetSrcList(pParse, pStep),
99938: sqlite3ExprListDup(db, pStep->pExprList, 0),
99939: sqlite3ExprDup(db, pStep->pWhere, 0),
99940: pParse->eOrconf
99941: );
99942: break;
99943: }
99944: case TK_INSERT: {
99945: sqlite3Insert(pParse,
99946: targetSrcList(pParse, pStep),
99947: sqlite3ExprListDup(db, pStep->pExprList, 0),
99948: sqlite3SelectDup(db, pStep->pSelect, 0),
99949: sqlite3IdListDup(db, pStep->pIdList),
99950: pParse->eOrconf
99951: );
99952: break;
99953: }
99954: case TK_DELETE: {
99955: sqlite3DeleteFrom(pParse,
99956: targetSrcList(pParse, pStep),
99957: sqlite3ExprDup(db, pStep->pWhere, 0)
99958: );
99959: break;
99960: }
99961: default: assert( pStep->op==TK_SELECT ); {
99962: SelectDest sDest;
99963: Select *pSelect = sqlite3SelectDup(db, pStep->pSelect, 0);
99964: sqlite3SelectDestInit(&sDest, SRT_Discard, 0);
99965: sqlite3Select(pParse, pSelect, &sDest);
99966: sqlite3SelectDelete(db, pSelect);
99967: break;
99968: }
99969: }
99970: if( pStep->op!=TK_SELECT ){
99971: sqlite3VdbeAddOp0(v, OP_ResetCount);
99972: }
99973: }
99974:
99975: return 0;
99976: }
99977:
99978: #ifdef SQLITE_DEBUG
99979: /*
99980: ** This function is used to add VdbeComment() annotations to a VDBE
99981: ** program. It is not used in production code, only for debugging.
99982: */
99983: static const char *onErrorText(int onError){
99984: switch( onError ){
99985: case OE_Abort: return "abort";
99986: case OE_Rollback: return "rollback";
99987: case OE_Fail: return "fail";
99988: case OE_Replace: return "replace";
99989: case OE_Ignore: return "ignore";
99990: case OE_Default: return "default";
99991: }
99992: return "n/a";
99993: }
99994: #endif
99995:
99996: /*
99997: ** Parse context structure pFrom has just been used to create a sub-vdbe
99998: ** (trigger program). If an error has occurred, transfer error information
99999: ** from pFrom to pTo.
100000: */
100001: static void transferParseError(Parse *pTo, Parse *pFrom){
100002: assert( pFrom->zErrMsg==0 || pFrom->nErr );
100003: assert( pTo->zErrMsg==0 || pTo->nErr );
100004: if( pTo->nErr==0 ){
100005: pTo->zErrMsg = pFrom->zErrMsg;
100006: pTo->nErr = pFrom->nErr;
100007: }else{
100008: sqlite3DbFree(pFrom->db, pFrom->zErrMsg);
100009: }
100010: }
100011:
100012: /*
100013: ** Create and populate a new TriggerPrg object with a sub-program
100014: ** implementing trigger pTrigger with ON CONFLICT policy orconf.
100015: */
100016: static TriggerPrg *codeRowTrigger(
100017: Parse *pParse, /* Current parse context */
100018: Trigger *pTrigger, /* Trigger to code */
100019: Table *pTab, /* The table pTrigger is attached to */
100020: int orconf /* ON CONFLICT policy to code trigger program with */
100021: ){
100022: Parse *pTop = sqlite3ParseToplevel(pParse);
100023: sqlite3 *db = pParse->db; /* Database handle */
100024: TriggerPrg *pPrg; /* Value to return */
100025: Expr *pWhen = 0; /* Duplicate of trigger WHEN expression */
100026: Vdbe *v; /* Temporary VM */
100027: NameContext sNC; /* Name context for sub-vdbe */
100028: SubProgram *pProgram = 0; /* Sub-vdbe for trigger program */
100029: Parse *pSubParse; /* Parse context for sub-vdbe */
100030: int iEndTrigger = 0; /* Label to jump to if WHEN is false */
100031:
100032: assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
100033: assert( pTop->pVdbe );
100034:
100035: /* Allocate the TriggerPrg and SubProgram objects. To ensure that they
100036: ** are freed if an error occurs, link them into the Parse.pTriggerPrg
100037: ** list of the top-level Parse object sooner rather than later. */
100038: pPrg = sqlite3DbMallocZero(db, sizeof(TriggerPrg));
100039: if( !pPrg ) return 0;
100040: pPrg->pNext = pTop->pTriggerPrg;
100041: pTop->pTriggerPrg = pPrg;
100042: pPrg->pProgram = pProgram = sqlite3DbMallocZero(db, sizeof(SubProgram));
100043: if( !pProgram ) return 0;
100044: sqlite3VdbeLinkSubProgram(pTop->pVdbe, pProgram);
100045: pPrg->pTrigger = pTrigger;
100046: pPrg->orconf = orconf;
100047: pPrg->aColmask[0] = 0xffffffff;
100048: pPrg->aColmask[1] = 0xffffffff;
100049:
100050: /* Allocate and populate a new Parse context to use for coding the
100051: ** trigger sub-program. */
100052: pSubParse = sqlite3StackAllocZero(db, sizeof(Parse));
100053: if( !pSubParse ) return 0;
100054: memset(&sNC, 0, sizeof(sNC));
100055: sNC.pParse = pSubParse;
100056: pSubParse->db = db;
100057: pSubParse->pTriggerTab = pTab;
100058: pSubParse->pToplevel = pTop;
100059: pSubParse->zAuthContext = pTrigger->zName;
100060: pSubParse->eTriggerOp = pTrigger->op;
100061: pSubParse->nQueryLoop = pParse->nQueryLoop;
100062:
100063: v = sqlite3GetVdbe(pSubParse);
100064: if( v ){
100065: VdbeComment((v, "Start: %s.%s (%s %s%s%s ON %s)",
100066: pTrigger->zName, onErrorText(orconf),
100067: (pTrigger->tr_tm==TRIGGER_BEFORE ? "BEFORE" : "AFTER"),
100068: (pTrigger->op==TK_UPDATE ? "UPDATE" : ""),
100069: (pTrigger->op==TK_INSERT ? "INSERT" : ""),
100070: (pTrigger->op==TK_DELETE ? "DELETE" : ""),
100071: pTab->zName
100072: ));
100073: #ifndef SQLITE_OMIT_TRACE
100074: sqlite3VdbeChangeP4(v, -1,
100075: sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC
100076: );
100077: #endif
100078:
100079: /* If one was specified, code the WHEN clause. If it evaluates to false
100080: ** (or NULL) the sub-vdbe is immediately halted by jumping to the
100081: ** OP_Halt inserted at the end of the program. */
100082: if( pTrigger->pWhen ){
100083: pWhen = sqlite3ExprDup(db, pTrigger->pWhen, 0);
100084: if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen)
100085: && db->mallocFailed==0
100086: ){
100087: iEndTrigger = sqlite3VdbeMakeLabel(v);
100088: sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL);
100089: }
100090: sqlite3ExprDelete(db, pWhen);
100091: }
100092:
100093: /* Code the trigger program into the sub-vdbe. */
100094: codeTriggerProgram(pSubParse, pTrigger->step_list, orconf);
100095:
100096: /* Insert an OP_Halt at the end of the sub-program. */
100097: if( iEndTrigger ){
100098: sqlite3VdbeResolveLabel(v, iEndTrigger);
100099: }
100100: sqlite3VdbeAddOp0(v, OP_Halt);
100101: VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf)));
100102:
100103: transferParseError(pParse, pSubParse);
100104: if( db->mallocFailed==0 ){
100105: pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg);
100106: }
100107: pProgram->nMem = pSubParse->nMem;
100108: pProgram->nCsr = pSubParse->nTab;
100109: pProgram->nOnce = pSubParse->nOnce;
100110: pProgram->token = (void *)pTrigger;
100111: pPrg->aColmask[0] = pSubParse->oldmask;
100112: pPrg->aColmask[1] = pSubParse->newmask;
100113: sqlite3VdbeDelete(v);
100114: }
100115:
100116: assert( !pSubParse->pAinc && !pSubParse->pZombieTab );
100117: assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg );
100118: sqlite3StackFree(db, pSubParse);
100119:
100120: return pPrg;
100121: }
100122:
100123: /*
100124: ** Return a pointer to a TriggerPrg object containing the sub-program for
100125: ** trigger pTrigger with default ON CONFLICT algorithm orconf. If no such
100126: ** TriggerPrg object exists, a new object is allocated and populated before
100127: ** being returned.
100128: */
100129: static TriggerPrg *getRowTrigger(
100130: Parse *pParse, /* Current parse context */
100131: Trigger *pTrigger, /* Trigger to code */
100132: Table *pTab, /* The table trigger pTrigger is attached to */
100133: int orconf /* ON CONFLICT algorithm. */
100134: ){
100135: Parse *pRoot = sqlite3ParseToplevel(pParse);
100136: TriggerPrg *pPrg;
100137:
100138: assert( pTrigger->zName==0 || pTab==tableOfTrigger(pTrigger) );
100139:
100140: /* It may be that this trigger has already been coded (or is in the
100141: ** process of being coded). If this is the case, then an entry with
100142: ** a matching TriggerPrg.pTrigger field will be present somewhere
100143: ** in the Parse.pTriggerPrg list. Search for such an entry. */
100144: for(pPrg=pRoot->pTriggerPrg;
100145: pPrg && (pPrg->pTrigger!=pTrigger || pPrg->orconf!=orconf);
100146: pPrg=pPrg->pNext
100147: );
100148:
100149: /* If an existing TriggerPrg could not be located, create a new one. */
100150: if( !pPrg ){
100151: pPrg = codeRowTrigger(pParse, pTrigger, pTab, orconf);
100152: }
100153:
100154: return pPrg;
100155: }
100156:
100157: /*
100158: ** Generate code for the trigger program associated with trigger p on
100159: ** table pTab. The reg, orconf and ignoreJump parameters passed to this
100160: ** function are the same as those described in the header function for
100161: ** sqlite3CodeRowTrigger()
100162: */
100163: SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(
100164: Parse *pParse, /* Parse context */
100165: Trigger *p, /* Trigger to code */
100166: Table *pTab, /* The table to code triggers from */
100167: int reg, /* Reg array containing OLD.* and NEW.* values */
100168: int orconf, /* ON CONFLICT policy */
100169: int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
100170: ){
100171: Vdbe *v = sqlite3GetVdbe(pParse); /* Main VM */
100172: TriggerPrg *pPrg;
100173: pPrg = getRowTrigger(pParse, p, pTab, orconf);
100174: assert( pPrg || pParse->nErr || pParse->db->mallocFailed );
100175:
100176: /* Code the OP_Program opcode in the parent VDBE. P4 of the OP_Program
100177: ** is a pointer to the sub-vdbe containing the trigger program. */
100178: if( pPrg ){
100179: int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers));
100180:
100181: sqlite3VdbeAddOp3(v, OP_Program, reg, ignoreJump, ++pParse->nMem);
100182: sqlite3VdbeChangeP4(v, -1, (const char *)pPrg->pProgram, P4_SUBPROGRAM);
100183: VdbeComment(
100184: (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf)));
100185:
100186: /* Set the P5 operand of the OP_Program instruction to non-zero if
100187: ** recursive invocation of this trigger program is disallowed. Recursive
100188: ** invocation is disallowed if (a) the sub-program is really a trigger,
100189: ** not a foreign key action, and (b) the flag to enable recursive triggers
100190: ** is clear. */
100191: sqlite3VdbeChangeP5(v, (u8)bRecursive);
100192: }
100193: }
100194:
100195: /*
100196: ** This is called to code the required FOR EACH ROW triggers for an operation
100197: ** on table pTab. The operation to code triggers for (INSERT, UPDATE or DELETE)
100198: ** is given by the op paramater. The tr_tm parameter determines whether the
100199: ** BEFORE or AFTER triggers are coded. If the operation is an UPDATE, then
100200: ** parameter pChanges is passed the list of columns being modified.
100201: **
100202: ** If there are no triggers that fire at the specified time for the specified
100203: ** operation on pTab, this function is a no-op.
100204: **
100205: ** The reg argument is the address of the first in an array of registers
100206: ** that contain the values substituted for the new.* and old.* references
100207: ** in the trigger program. If N is the number of columns in table pTab
100208: ** (a copy of pTab->nCol), then registers are populated as follows:
100209: **
100210: ** Register Contains
100211: ** ------------------------------------------------------
100212: ** reg+0 OLD.rowid
100213: ** reg+1 OLD.* value of left-most column of pTab
100214: ** ... ...
100215: ** reg+N OLD.* value of right-most column of pTab
100216: ** reg+N+1 NEW.rowid
100217: ** reg+N+2 OLD.* value of left-most column of pTab
100218: ** ... ...
100219: ** reg+N+N+1 NEW.* value of right-most column of pTab
100220: **
100221: ** For ON DELETE triggers, the registers containing the NEW.* values will
100222: ** never be accessed by the trigger program, so they are not allocated or
100223: ** populated by the caller (there is no data to populate them with anyway).
100224: ** Similarly, for ON INSERT triggers the values stored in the OLD.* registers
100225: ** are never accessed, and so are not allocated by the caller. So, for an
100226: ** ON INSERT trigger, the value passed to this function as parameter reg
100227: ** is not a readable register, although registers (reg+N) through
100228: ** (reg+N+N+1) are.
100229: **
100230: ** Parameter orconf is the default conflict resolution algorithm for the
100231: ** trigger program to use (REPLACE, IGNORE etc.). Parameter ignoreJump
100232: ** is the instruction that control should jump to if a trigger program
100233: ** raises an IGNORE exception.
100234: */
100235: SQLITE_PRIVATE void sqlite3CodeRowTrigger(
100236: Parse *pParse, /* Parse context */
100237: Trigger *pTrigger, /* List of triggers on table pTab */
100238: int op, /* One of TK_UPDATE, TK_INSERT, TK_DELETE */
100239: ExprList *pChanges, /* Changes list for any UPDATE OF triggers */
100240: int tr_tm, /* One of TRIGGER_BEFORE, TRIGGER_AFTER */
100241: Table *pTab, /* The table to code triggers from */
100242: int reg, /* The first in an array of registers (see above) */
100243: int orconf, /* ON CONFLICT policy */
100244: int ignoreJump /* Instruction to jump to for RAISE(IGNORE) */
100245: ){
100246: Trigger *p; /* Used to iterate through pTrigger list */
100247:
100248: assert( op==TK_UPDATE || op==TK_INSERT || op==TK_DELETE );
100249: assert( tr_tm==TRIGGER_BEFORE || tr_tm==TRIGGER_AFTER );
100250: assert( (op==TK_UPDATE)==(pChanges!=0) );
100251:
100252: for(p=pTrigger; p; p=p->pNext){
100253:
100254: /* Sanity checking: The schema for the trigger and for the table are
100255: ** always defined. The trigger must be in the same schema as the table
100256: ** or else it must be a TEMP trigger. */
100257: assert( p->pSchema!=0 );
100258: assert( p->pTabSchema!=0 );
100259: assert( p->pSchema==p->pTabSchema
100260: || p->pSchema==pParse->db->aDb[1].pSchema );
100261:
100262: /* Determine whether we should code this trigger */
100263: if( p->op==op
100264: && p->tr_tm==tr_tm
100265: && checkColumnOverlap(p->pColumns, pChanges)
100266: ){
100267: sqlite3CodeRowTriggerDirect(pParse, p, pTab, reg, orconf, ignoreJump);
100268: }
100269: }
100270: }
100271:
100272: /*
100273: ** Triggers may access values stored in the old.* or new.* pseudo-table.
100274: ** This function returns a 32-bit bitmask indicating which columns of the
100275: ** old.* or new.* tables actually are used by triggers. This information
100276: ** may be used by the caller, for example, to avoid having to load the entire
100277: ** old.* record into memory when executing an UPDATE or DELETE command.
100278: **
100279: ** Bit 0 of the returned mask is set if the left-most column of the
100280: ** table may be accessed using an [old|new].<col> reference. Bit 1 is set if
100281: ** the second leftmost column value is required, and so on. If there
100282: ** are more than 32 columns in the table, and at least one of the columns
100283: ** with an index greater than 32 may be accessed, 0xffffffff is returned.
100284: **
100285: ** It is not possible to determine if the old.rowid or new.rowid column is
100286: ** accessed by triggers. The caller must always assume that it is.
100287: **
100288: ** Parameter isNew must be either 1 or 0. If it is 0, then the mask returned
100289: ** applies to the old.* table. If 1, the new.* table.
100290: **
100291: ** Parameter tr_tm must be a mask with one or both of the TRIGGER_BEFORE
100292: ** and TRIGGER_AFTER bits set. Values accessed by BEFORE triggers are only
100293: ** included in the returned mask if the TRIGGER_BEFORE bit is set in the
100294: ** tr_tm parameter. Similarly, values accessed by AFTER triggers are only
100295: ** included in the returned mask if the TRIGGER_AFTER bit is set in tr_tm.
100296: */
100297: SQLITE_PRIVATE u32 sqlite3TriggerColmask(
100298: Parse *pParse, /* Parse context */
100299: Trigger *pTrigger, /* List of triggers on table pTab */
100300: ExprList *pChanges, /* Changes list for any UPDATE OF triggers */
100301: int isNew, /* 1 for new.* ref mask, 0 for old.* ref mask */
100302: int tr_tm, /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
100303: Table *pTab, /* The table to code triggers from */
100304: int orconf /* Default ON CONFLICT policy for trigger steps */
100305: ){
100306: const int op = pChanges ? TK_UPDATE : TK_DELETE;
100307: u32 mask = 0;
100308: Trigger *p;
100309:
100310: assert( isNew==1 || isNew==0 );
100311: for(p=pTrigger; p; p=p->pNext){
100312: if( p->op==op && (tr_tm&p->tr_tm)
100313: && checkColumnOverlap(p->pColumns,pChanges)
100314: ){
100315: TriggerPrg *pPrg;
100316: pPrg = getRowTrigger(pParse, p, pTab, orconf);
100317: if( pPrg ){
100318: mask |= pPrg->aColmask[isNew];
100319: }
100320: }
100321: }
100322:
100323: return mask;
100324: }
100325:
100326: #endif /* !defined(SQLITE_OMIT_TRIGGER) */
100327:
100328: /************** End of trigger.c *********************************************/
100329: /************** Begin file update.c ******************************************/
100330: /*
100331: ** 2001 September 15
100332: **
100333: ** The author disclaims copyright to this source code. In place of
100334: ** a legal notice, here is a blessing:
100335: **
100336: ** May you do good and not evil.
100337: ** May you find forgiveness for yourself and forgive others.
100338: ** May you share freely, never taking more than you give.
100339: **
100340: *************************************************************************
100341: ** This file contains C code routines that are called by the parser
100342: ** to handle UPDATE statements.
100343: */
100344:
100345: #ifndef SQLITE_OMIT_VIRTUALTABLE
100346: /* Forward declaration */
100347: static void updateVirtualTable(
100348: Parse *pParse, /* The parsing context */
100349: SrcList *pSrc, /* The virtual table to be modified */
100350: Table *pTab, /* The virtual table */
100351: ExprList *pChanges, /* The columns to change in the UPDATE statement */
100352: Expr *pRowidExpr, /* Expression used to recompute the rowid */
100353: int *aXRef, /* Mapping from columns of pTab to entries in pChanges */
100354: Expr *pWhere, /* WHERE clause of the UPDATE statement */
100355: int onError /* ON CONFLICT strategy */
100356: );
100357: #endif /* SQLITE_OMIT_VIRTUALTABLE */
100358:
100359: /*
100360: ** The most recently coded instruction was an OP_Column to retrieve the
100361: ** i-th column of table pTab. This routine sets the P4 parameter of the
100362: ** OP_Column to the default value, if any.
100363: **
100364: ** The default value of a column is specified by a DEFAULT clause in the
100365: ** column definition. This was either supplied by the user when the table
100366: ** was created, or added later to the table definition by an ALTER TABLE
100367: ** command. If the latter, then the row-records in the table btree on disk
100368: ** may not contain a value for the column and the default value, taken
100369: ** from the P4 parameter of the OP_Column instruction, is returned instead.
100370: ** If the former, then all row-records are guaranteed to include a value
100371: ** for the column and the P4 value is not required.
100372: **
100373: ** Column definitions created by an ALTER TABLE command may only have
100374: ** literal default values specified: a number, null or a string. (If a more
100375: ** complicated default expression value was provided, it is evaluated
100376: ** when the ALTER TABLE is executed and one of the literal values written
100377: ** into the sqlite_master table.)
100378: **
100379: ** Therefore, the P4 parameter is only required if the default value for
100380: ** the column is a literal number, string or null. The sqlite3ValueFromExpr()
100381: ** function is capable of transforming these types of expressions into
100382: ** sqlite3_value objects.
100383: **
100384: ** If parameter iReg is not negative, code an OP_RealAffinity instruction
100385: ** on register iReg. This is used when an equivalent integer value is
100386: ** stored in place of an 8-byte floating point value in order to save
100387: ** space.
100388: */
100389: SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){
100390: assert( pTab!=0 );
100391: if( !pTab->pSelect ){
100392: sqlite3_value *pValue;
100393: u8 enc = ENC(sqlite3VdbeDb(v));
100394: Column *pCol = &pTab->aCol[i];
100395: VdbeComment((v, "%s.%s", pTab->zName, pCol->zName));
100396: assert( i<pTab->nCol );
100397: sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc,
100398: pCol->affinity, &pValue);
100399: if( pValue ){
100400: sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM);
100401: }
100402: #ifndef SQLITE_OMIT_FLOATING_POINT
100403: if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){
100404: sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg);
100405: }
100406: #endif
100407: }
100408: }
100409:
100410: /*
100411: ** Process an UPDATE statement.
100412: **
100413: ** UPDATE OR IGNORE table_wxyz SET a=b, c=d WHERE e<5 AND f NOT NULL;
100414: ** \_______/ \________/ \______/ \________________/
100415: * onError pTabList pChanges pWhere
100416: */
100417: SQLITE_PRIVATE void sqlite3Update(
100418: Parse *pParse, /* The parser context */
100419: SrcList *pTabList, /* The table in which we should change things */
100420: ExprList *pChanges, /* Things to be changed */
100421: Expr *pWhere, /* The WHERE clause. May be null */
100422: int onError /* How to handle constraint errors */
100423: ){
100424: int i, j; /* Loop counters */
100425: Table *pTab; /* The table to be updated */
100426: int addr = 0; /* VDBE instruction address of the start of the loop */
100427: WhereInfo *pWInfo; /* Information about the WHERE clause */
100428: Vdbe *v; /* The virtual database engine */
100429: Index *pIdx; /* For looping over indices */
100430: int nIdx; /* Number of indices that need updating */
100431: int iCur; /* VDBE Cursor number of pTab */
100432: sqlite3 *db; /* The database structure */
100433: int *aRegIdx = 0; /* One register assigned to each index to be updated */
100434: int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the
100435: ** an expression for the i-th column of the table.
100436: ** aXRef[i]==-1 if the i-th column is not changed. */
100437: int chngRowid; /* True if the record number is being changed */
100438: Expr *pRowidExpr = 0; /* Expression defining the new record number */
100439: int openAll = 0; /* True if all indices need to be opened */
100440: AuthContext sContext; /* The authorization context */
100441: NameContext sNC; /* The name-context to resolve expressions in */
100442: int iDb; /* Database containing the table being updated */
100443: int okOnePass; /* True for one-pass algorithm without the FIFO */
100444: int hasFK; /* True if foreign key processing is required */
100445:
100446: #ifndef SQLITE_OMIT_TRIGGER
100447: int isView; /* True when updating a view (INSTEAD OF trigger) */
100448: Trigger *pTrigger; /* List of triggers on pTab, if required */
100449: int tmask; /* Mask of TRIGGER_BEFORE|TRIGGER_AFTER */
100450: #endif
100451: int newmask; /* Mask of NEW.* columns accessed by BEFORE triggers */
100452:
100453: /* Register Allocations */
100454: int regRowCount = 0; /* A count of rows changed */
100455: int regOldRowid; /* The old rowid */
100456: int regNewRowid; /* The new rowid */
100457: int regNew; /* Content of the NEW.* table in triggers */
100458: int regOld = 0; /* Content of OLD.* table in triggers */
100459: int regRowSet = 0; /* Rowset of rows to be updated */
100460:
100461: memset(&sContext, 0, sizeof(sContext));
100462: db = pParse->db;
100463: if( pParse->nErr || db->mallocFailed ){
100464: goto update_cleanup;
100465: }
100466: assert( pTabList->nSrc==1 );
100467:
100468: /* Locate the table which we want to update.
100469: */
100470: pTab = sqlite3SrcListLookup(pParse, pTabList);
100471: if( pTab==0 ) goto update_cleanup;
100472: iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
100473:
100474: /* Figure out if we have any triggers and if the table being
100475: ** updated is a view.
100476: */
100477: #ifndef SQLITE_OMIT_TRIGGER
100478: pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask);
100479: isView = pTab->pSelect!=0;
100480: assert( pTrigger || tmask==0 );
100481: #else
100482: # define pTrigger 0
100483: # define isView 0
100484: # define tmask 0
100485: #endif
100486: #ifdef SQLITE_OMIT_VIEW
100487: # undef isView
100488: # define isView 0
100489: #endif
100490:
100491: if( sqlite3ViewGetColumnNames(pParse, pTab) ){
100492: goto update_cleanup;
100493: }
100494: if( sqlite3IsReadOnly(pParse, pTab, tmask) ){
100495: goto update_cleanup;
100496: }
100497: aXRef = sqlite3DbMallocRaw(db, sizeof(int) * pTab->nCol );
100498: if( aXRef==0 ) goto update_cleanup;
100499: for(i=0; i<pTab->nCol; i++) aXRef[i] = -1;
100500:
100501: /* Allocate a cursors for the main database table and for all indices.
100502: ** The index cursors might not be used, but if they are used they
100503: ** need to occur right after the database cursor. So go ahead and
100504: ** allocate enough space, just in case.
100505: */
100506: pTabList->a[0].iCursor = iCur = pParse->nTab++;
100507: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
100508: pParse->nTab++;
100509: }
100510:
100511: /* Initialize the name-context */
100512: memset(&sNC, 0, sizeof(sNC));
100513: sNC.pParse = pParse;
100514: sNC.pSrcList = pTabList;
100515:
100516: /* Resolve the column names in all the expressions of the
100517: ** of the UPDATE statement. Also find the column index
100518: ** for each column to be updated in the pChanges array. For each
100519: ** column to be updated, make sure we have authorization to change
100520: ** that column.
100521: */
100522: chngRowid = 0;
100523: for(i=0; i<pChanges->nExpr; i++){
100524: if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){
100525: goto update_cleanup;
100526: }
100527: for(j=0; j<pTab->nCol; j++){
100528: if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){
100529: if( j==pTab->iPKey ){
100530: chngRowid = 1;
100531: pRowidExpr = pChanges->a[i].pExpr;
100532: }
100533: aXRef[j] = i;
100534: break;
100535: }
100536: }
100537: if( j>=pTab->nCol ){
100538: if( sqlite3IsRowid(pChanges->a[i].zName) ){
100539: chngRowid = 1;
100540: pRowidExpr = pChanges->a[i].pExpr;
100541: }else{
100542: sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName);
100543: pParse->checkSchema = 1;
100544: goto update_cleanup;
100545: }
100546: }
100547: #ifndef SQLITE_OMIT_AUTHORIZATION
100548: {
100549: int rc;
100550: rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName,
100551: pTab->aCol[j].zName, db->aDb[iDb].zName);
100552: if( rc==SQLITE_DENY ){
100553: goto update_cleanup;
100554: }else if( rc==SQLITE_IGNORE ){
100555: aXRef[j] = -1;
100556: }
100557: }
100558: #endif
100559: }
100560:
100561: hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngRowid);
100562:
100563: /* Allocate memory for the array aRegIdx[]. There is one entry in the
100564: ** array for each index associated with table being updated. Fill in
100565: ** the value with a register number for indices that are to be used
100566: ** and with zero for unused indices.
100567: */
100568: for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){}
100569: if( nIdx>0 ){
100570: aRegIdx = sqlite3DbMallocRaw(db, sizeof(Index*) * nIdx );
100571: if( aRegIdx==0 ) goto update_cleanup;
100572: }
100573: for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
100574: int reg;
100575: if( hasFK || chngRowid ){
100576: reg = ++pParse->nMem;
100577: }else{
100578: reg = 0;
100579: for(i=0; i<pIdx->nColumn; i++){
100580: if( aXRef[pIdx->aiColumn[i]]>=0 ){
100581: reg = ++pParse->nMem;
100582: break;
100583: }
100584: }
100585: }
100586: aRegIdx[j] = reg;
100587: }
100588:
100589: /* Begin generating code. */
100590: v = sqlite3GetVdbe(pParse);
100591: if( v==0 ) goto update_cleanup;
100592: if( pParse->nested==0 ) sqlite3VdbeCountChanges(v);
100593: sqlite3BeginWriteOperation(pParse, 1, iDb);
100594:
100595: #ifndef SQLITE_OMIT_VIRTUALTABLE
100596: /* Virtual tables must be handled separately */
100597: if( IsVirtual(pTab) ){
100598: updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef,
100599: pWhere, onError);
100600: pWhere = 0;
100601: pTabList = 0;
100602: goto update_cleanup;
100603: }
100604: #endif
100605:
100606: /* Allocate required registers. */
100607: regRowSet = ++pParse->nMem;
100608: regOldRowid = regNewRowid = ++pParse->nMem;
100609: if( pTrigger || hasFK ){
100610: regOld = pParse->nMem + 1;
100611: pParse->nMem += pTab->nCol;
100612: }
100613: if( chngRowid || pTrigger || hasFK ){
100614: regNewRowid = ++pParse->nMem;
100615: }
100616: regNew = pParse->nMem + 1;
100617: pParse->nMem += pTab->nCol;
100618:
100619: /* Start the view context. */
100620: if( isView ){
100621: sqlite3AuthContextPush(pParse, &sContext, pTab->zName);
100622: }
100623:
100624: /* If we are trying to update a view, realize that view into
100625: ** a ephemeral table.
100626: */
100627: #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER)
100628: if( isView ){
100629: sqlite3MaterializeView(pParse, pTab, pWhere, iCur);
100630: }
100631: #endif
100632:
100633: /* Resolve the column names in all the expressions in the
100634: ** WHERE clause.
100635: */
100636: if( sqlite3ResolveExprNames(&sNC, pWhere) ){
100637: goto update_cleanup;
100638: }
100639:
100640: /* Begin the database scan
100641: */
100642: sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid);
100643: pWInfo = sqlite3WhereBegin(
1.2.2.1 ! misho 100644: pParse, pTabList, pWhere, 0, 0, WHERE_ONEPASS_DESIRED, 0
1.2 misho 100645: );
100646: if( pWInfo==0 ) goto update_cleanup;
100647: okOnePass = pWInfo->okOnePass;
100648:
100649: /* Remember the rowid of every item to be updated.
100650: */
100651: sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regOldRowid);
100652: if( !okOnePass ){
100653: sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid);
100654: }
100655:
100656: /* End the database scan loop.
100657: */
100658: sqlite3WhereEnd(pWInfo);
100659:
100660: /* Initialize the count of updated rows
100661: */
100662: if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){
100663: regRowCount = ++pParse->nMem;
100664: sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount);
100665: }
100666:
100667: if( !isView ){
100668: /*
100669: ** Open every index that needs updating. Note that if any
100670: ** index could potentially invoke a REPLACE conflict resolution
100671: ** action, then we need to open all indices because we might need
100672: ** to be deleting some records.
100673: */
100674: if( !okOnePass ) sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenWrite);
100675: if( onError==OE_Replace ){
100676: openAll = 1;
100677: }else{
100678: openAll = 0;
100679: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
100680: if( pIdx->onError==OE_Replace ){
100681: openAll = 1;
100682: break;
100683: }
100684: }
100685: }
100686: for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
100687: assert( aRegIdx );
100688: if( openAll || aRegIdx[i]>0 ){
100689: KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIdx);
100690: sqlite3VdbeAddOp4(v, OP_OpenWrite, iCur+i+1, pIdx->tnum, iDb,
100691: (char*)pKey, P4_KEYINFO_HANDOFF);
100692: assert( pParse->nTab>iCur+i+1 );
100693: }
100694: }
100695: }
100696:
100697: /* Top of the update loop */
100698: if( okOnePass ){
100699: int a1 = sqlite3VdbeAddOp1(v, OP_NotNull, regOldRowid);
100700: addr = sqlite3VdbeAddOp0(v, OP_Goto);
100701: sqlite3VdbeJumpHere(v, a1);
100702: }else{
100703: addr = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, 0, regOldRowid);
100704: }
100705:
100706: /* Make cursor iCur point to the record that is being updated. If
100707: ** this record does not exist for some reason (deleted by a trigger,
100708: ** for example, then jump to the next iteration of the RowSet loop. */
100709: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
100710:
100711: /* If the record number will change, set register regNewRowid to
100712: ** contain the new value. If the record number is not being modified,
100713: ** then regNewRowid is the same register as regOldRowid, which is
100714: ** already populated. */
100715: assert( chngRowid || pTrigger || hasFK || regOldRowid==regNewRowid );
100716: if( chngRowid ){
100717: sqlite3ExprCode(pParse, pRowidExpr, regNewRowid);
100718: sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid);
100719: }
100720:
100721: /* If there are triggers on this table, populate an array of registers
100722: ** with the required old.* column data. */
100723: if( hasFK || pTrigger ){
100724: u32 oldmask = (hasFK ? sqlite3FkOldmask(pParse, pTab) : 0);
100725: oldmask |= sqlite3TriggerColmask(pParse,
100726: pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError
100727: );
100728: for(i=0; i<pTab->nCol; i++){
100729: if( aXRef[i]<0 || oldmask==0xffffffff || (i<32 && (oldmask & (1<<i))) ){
100730: sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOld+i);
100731: }else{
100732: sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i);
100733: }
100734: }
100735: if( chngRowid==0 ){
100736: sqlite3VdbeAddOp2(v, OP_Copy, regOldRowid, regNewRowid);
100737: }
100738: }
100739:
100740: /* Populate the array of registers beginning at regNew with the new
100741: ** row data. This array is used to check constaints, create the new
100742: ** table and index records, and as the values for any new.* references
100743: ** made by triggers.
100744: **
100745: ** If there are one or more BEFORE triggers, then do not populate the
100746: ** registers associated with columns that are (a) not modified by
100747: ** this UPDATE statement and (b) not accessed by new.* references. The
100748: ** values for registers not modified by the UPDATE must be reloaded from
100749: ** the database after the BEFORE triggers are fired anyway (as the trigger
100750: ** may have modified them). So not loading those that are not going to
100751: ** be used eliminates some redundant opcodes.
100752: */
100753: newmask = sqlite3TriggerColmask(
100754: pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError
100755: );
100756: sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);
100757: for(i=0; i<pTab->nCol; i++){
100758: if( i==pTab->iPKey ){
100759: /*sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);*/
100760: }else{
100761: j = aXRef[i];
100762: if( j>=0 ){
100763: sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i);
100764: }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask&(1<<i)) ){
100765: /* This branch loads the value of a column that will not be changed
100766: ** into a register. This is done if there are no BEFORE triggers, or
100767: ** if there are one or more BEFORE triggers that use this value via
100768: ** a new.* reference in a trigger program.
100769: */
100770: testcase( i==31 );
100771: testcase( i==32 );
100772: sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i);
100773: sqlite3ColumnDefault(v, pTab, i, regNew+i);
100774: }
100775: }
100776: }
100777:
100778: /* Fire any BEFORE UPDATE triggers. This happens before constraints are
100779: ** verified. One could argue that this is wrong.
100780: */
100781: if( tmask&TRIGGER_BEFORE ){
100782: sqlite3VdbeAddOp2(v, OP_Affinity, regNew, pTab->nCol);
100783: sqlite3TableAffinityStr(v, pTab);
100784: sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
100785: TRIGGER_BEFORE, pTab, regOldRowid, onError, addr);
100786:
100787: /* The row-trigger may have deleted the row being updated. In this
100788: ** case, jump to the next row. No updates or AFTER triggers are
100789: ** required. This behaviour - what happens when the row being updated
100790: ** is deleted or renamed by a BEFORE trigger - is left undefined in the
100791: ** documentation.
100792: */
100793: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addr, regOldRowid);
100794:
100795: /* If it did not delete it, the row-trigger may still have modified
100796: ** some of the columns of the row being updated. Load the values for
100797: ** all columns not modified by the update statement into their
100798: ** registers in case this has happened.
100799: */
100800: for(i=0; i<pTab->nCol; i++){
100801: if( aXRef[i]<0 && i!=pTab->iPKey ){
100802: sqlite3VdbeAddOp3(v, OP_Column, iCur, i, regNew+i);
100803: sqlite3ColumnDefault(v, pTab, i, regNew+i);
100804: }
100805: }
100806: }
100807:
100808: if( !isView ){
100809: int j1; /* Address of jump instruction */
100810:
100811: /* Do constraint checks. */
100812: sqlite3GenerateConstraintChecks(pParse, pTab, iCur, regNewRowid,
100813: aRegIdx, (chngRowid?regOldRowid:0), 1, onError, addr, 0);
100814:
100815: /* Do FK constraint checks. */
100816: if( hasFK ){
100817: sqlite3FkCheck(pParse, pTab, regOldRowid, 0);
100818: }
100819:
100820: /* Delete the index entries associated with the current record. */
100821: j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regOldRowid);
100822: sqlite3GenerateRowIndexDelete(pParse, pTab, iCur, aRegIdx);
100823:
100824: /* If changing the record number, delete the old record. */
100825: if( hasFK || chngRowid ){
100826: sqlite3VdbeAddOp2(v, OP_Delete, iCur, 0);
100827: }
100828: sqlite3VdbeJumpHere(v, j1);
100829:
100830: if( hasFK ){
100831: sqlite3FkCheck(pParse, pTab, 0, regNewRowid);
100832: }
100833:
100834: /* Insert the new index entries and the new record. */
100835: sqlite3CompleteInsertion(pParse, pTab, iCur, regNewRowid, aRegIdx, 1, 0, 0);
100836:
100837: /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to
100838: ** handle rows (possibly in other tables) that refer via a foreign key
100839: ** to the row just updated. */
100840: if( hasFK ){
100841: sqlite3FkActions(pParse, pTab, pChanges, regOldRowid);
100842: }
100843: }
100844:
100845: /* Increment the row counter
100846: */
100847: if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){
100848: sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1);
100849: }
100850:
100851: sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges,
100852: TRIGGER_AFTER, pTab, regOldRowid, onError, addr);
100853:
100854: /* Repeat the above with the next record to be updated, until
100855: ** all record selected by the WHERE clause have been updated.
100856: */
100857: sqlite3VdbeAddOp2(v, OP_Goto, 0, addr);
100858: sqlite3VdbeJumpHere(v, addr);
100859:
100860: /* Close all tables */
100861: for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){
100862: assert( aRegIdx );
100863: if( openAll || aRegIdx[i]>0 ){
100864: sqlite3VdbeAddOp2(v, OP_Close, iCur+i+1, 0);
100865: }
100866: }
100867: sqlite3VdbeAddOp2(v, OP_Close, iCur, 0);
100868:
100869: /* Update the sqlite_sequence table by storing the content of the
100870: ** maximum rowid counter values recorded while inserting into
100871: ** autoincrement tables.
100872: */
100873: if( pParse->nested==0 && pParse->pTriggerTab==0 ){
100874: sqlite3AutoincrementEnd(pParse);
100875: }
100876:
100877: /*
100878: ** Return the number of rows that were changed. If this routine is
100879: ** generating code because of a call to sqlite3NestedParse(), do not
100880: ** invoke the callback function.
100881: */
100882: if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){
100883: sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1);
100884: sqlite3VdbeSetNumCols(v, 1);
100885: sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC);
100886: }
100887:
100888: update_cleanup:
100889: sqlite3AuthContextPop(&sContext);
100890: sqlite3DbFree(db, aRegIdx);
100891: sqlite3DbFree(db, aXRef);
100892: sqlite3SrcListDelete(db, pTabList);
100893: sqlite3ExprListDelete(db, pChanges);
100894: sqlite3ExprDelete(db, pWhere);
100895: return;
100896: }
100897: /* Make sure "isView" and other macros defined above are undefined. Otherwise
100898: ** thely may interfere with compilation of other functions in this file
100899: ** (or in another file, if this file becomes part of the amalgamation). */
100900: #ifdef isView
100901: #undef isView
100902: #endif
100903: #ifdef pTrigger
100904: #undef pTrigger
100905: #endif
100906:
100907: #ifndef SQLITE_OMIT_VIRTUALTABLE
100908: /*
100909: ** Generate code for an UPDATE of a virtual table.
100910: **
100911: ** The strategy is that we create an ephemerial table that contains
100912: ** for each row to be changed:
100913: **
100914: ** (A) The original rowid of that row.
100915: ** (B) The revised rowid for the row. (note1)
100916: ** (C) The content of every column in the row.
100917: **
100918: ** Then we loop over this ephemeral table and for each row in
100919: ** the ephermeral table call VUpdate.
100920: **
100921: ** When finished, drop the ephemeral table.
100922: **
100923: ** (note1) Actually, if we know in advance that (A) is always the same
100924: ** as (B) we only store (A), then duplicate (A) when pulling
100925: ** it out of the ephemeral table before calling VUpdate.
100926: */
100927: static void updateVirtualTable(
100928: Parse *pParse, /* The parsing context */
100929: SrcList *pSrc, /* The virtual table to be modified */
100930: Table *pTab, /* The virtual table */
100931: ExprList *pChanges, /* The columns to change in the UPDATE statement */
100932: Expr *pRowid, /* Expression used to recompute the rowid */
100933: int *aXRef, /* Mapping from columns of pTab to entries in pChanges */
100934: Expr *pWhere, /* WHERE clause of the UPDATE statement */
100935: int onError /* ON CONFLICT strategy */
100936: ){
100937: Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */
100938: ExprList *pEList = 0; /* The result set of the SELECT statement */
100939: Select *pSelect = 0; /* The SELECT statement */
100940: Expr *pExpr; /* Temporary expression */
100941: int ephemTab; /* Table holding the result of the SELECT */
100942: int i; /* Loop counter */
100943: int addr; /* Address of top of loop */
100944: int iReg; /* First register in set passed to OP_VUpdate */
100945: sqlite3 *db = pParse->db; /* Database connection */
100946: const char *pVTab = (const char*)sqlite3GetVTable(db, pTab);
100947: SelectDest dest;
100948:
100949: /* Construct the SELECT statement that will find the new values for
100950: ** all updated rows.
100951: */
100952: pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, "_rowid_"));
100953: if( pRowid ){
100954: pEList = sqlite3ExprListAppend(pParse, pEList,
100955: sqlite3ExprDup(db, pRowid, 0));
100956: }
100957: assert( pTab->iPKey<0 );
100958: for(i=0; i<pTab->nCol; i++){
100959: if( aXRef[i]>=0 ){
100960: pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0);
100961: }else{
100962: pExpr = sqlite3Expr(db, TK_ID, pTab->aCol[i].zName);
100963: }
100964: pEList = sqlite3ExprListAppend(pParse, pEList, pExpr);
100965: }
100966: pSelect = sqlite3SelectNew(pParse, pEList, pSrc, pWhere, 0, 0, 0, 0, 0, 0);
100967:
100968: /* Create the ephemeral table into which the update results will
100969: ** be stored.
100970: */
100971: assert( v );
100972: ephemTab = pParse->nTab++;
100973: sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, pTab->nCol+1+(pRowid!=0));
100974: sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
100975:
100976: /* fill the ephemeral table
100977: */
100978: sqlite3SelectDestInit(&dest, SRT_Table, ephemTab);
100979: sqlite3Select(pParse, pSelect, &dest);
100980:
100981: /* Generate code to scan the ephemeral table and call VUpdate. */
100982: iReg = ++pParse->nMem;
100983: pParse->nMem += pTab->nCol+1;
100984: addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0);
100985: sqlite3VdbeAddOp3(v, OP_Column, ephemTab, 0, iReg);
100986: sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1);
100987: for(i=0; i<pTab->nCol; i++){
100988: sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i+1+(pRowid!=0), iReg+2+i);
100989: }
100990: sqlite3VtabMakeWritable(pParse, pTab);
100991: sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVTab, P4_VTAB);
100992: sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError);
100993: sqlite3MayAbort(pParse);
100994: sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1);
100995: sqlite3VdbeJumpHere(v, addr);
100996: sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0);
100997:
100998: /* Cleanup */
100999: sqlite3SelectDelete(db, pSelect);
101000: }
101001: #endif /* SQLITE_OMIT_VIRTUALTABLE */
101002:
101003: /************** End of update.c **********************************************/
101004: /************** Begin file vacuum.c ******************************************/
101005: /*
101006: ** 2003 April 6
101007: **
101008: ** The author disclaims copyright to this source code. In place of
101009: ** a legal notice, here is a blessing:
101010: **
101011: ** May you do good and not evil.
101012: ** May you find forgiveness for yourself and forgive others.
101013: ** May you share freely, never taking more than you give.
101014: **
101015: *************************************************************************
101016: ** This file contains code used to implement the VACUUM command.
101017: **
101018: ** Most of the code in this file may be omitted by defining the
101019: ** SQLITE_OMIT_VACUUM macro.
101020: */
101021:
101022: #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
101023: /*
101024: ** Finalize a prepared statement. If there was an error, store the
101025: ** text of the error message in *pzErrMsg. Return the result code.
101026: */
101027: static int vacuumFinalize(sqlite3 *db, sqlite3_stmt *pStmt, char **pzErrMsg){
101028: int rc;
101029: rc = sqlite3VdbeFinalize((Vdbe*)pStmt);
101030: if( rc ){
101031: sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db));
101032: }
101033: return rc;
101034: }
101035:
101036: /*
101037: ** Execute zSql on database db. Return an error code.
101038: */
101039: static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){
101040: sqlite3_stmt *pStmt;
101041: VVA_ONLY( int rc; )
101042: if( !zSql ){
101043: return SQLITE_NOMEM;
101044: }
101045: if( SQLITE_OK!=sqlite3_prepare(db, zSql, -1, &pStmt, 0) ){
101046: sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db));
101047: return sqlite3_errcode(db);
101048: }
101049: VVA_ONLY( rc = ) sqlite3_step(pStmt);
101050: assert( rc!=SQLITE_ROW || (db->flags&SQLITE_CountRows) );
101051: return vacuumFinalize(db, pStmt, pzErrMsg);
101052: }
101053:
101054: /*
101055: ** Execute zSql on database db. The statement returns exactly
101056: ** one column. Execute this as SQL on the same database.
101057: */
101058: static int execExecSql(sqlite3 *db, char **pzErrMsg, const char *zSql){
101059: sqlite3_stmt *pStmt;
101060: int rc;
101061:
101062: rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
101063: if( rc!=SQLITE_OK ) return rc;
101064:
101065: while( SQLITE_ROW==sqlite3_step(pStmt) ){
101066: rc = execSql(db, pzErrMsg, (char*)sqlite3_column_text(pStmt, 0));
101067: if( rc!=SQLITE_OK ){
101068: vacuumFinalize(db, pStmt, pzErrMsg);
101069: return rc;
101070: }
101071: }
101072:
101073: return vacuumFinalize(db, pStmt, pzErrMsg);
101074: }
101075:
101076: /*
101077: ** The non-standard VACUUM command is used to clean up the database,
101078: ** collapse free space, etc. It is modelled after the VACUUM command
101079: ** in PostgreSQL.
101080: **
101081: ** In version 1.0.x of SQLite, the VACUUM command would call
101082: ** gdbm_reorganize() on all the database tables. But beginning
101083: ** with 2.0.0, SQLite no longer uses GDBM so this command has
101084: ** become a no-op.
101085: */
101086: SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse){
101087: Vdbe *v = sqlite3GetVdbe(pParse);
101088: if( v ){
101089: sqlite3VdbeAddOp2(v, OP_Vacuum, 0, 0);
1.2.2.1 ! misho 101090: sqlite3VdbeUsesBtree(v, 0);
1.2 misho 101091: }
101092: return;
101093: }
101094:
101095: /*
101096: ** This routine implements the OP_Vacuum opcode of the VDBE.
101097: */
101098: SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){
101099: int rc = SQLITE_OK; /* Return code from service routines */
101100: Btree *pMain; /* The database being vacuumed */
101101: Btree *pTemp; /* The temporary database we vacuum into */
101102: char *zSql = 0; /* SQL statements */
101103: int saved_flags; /* Saved value of the db->flags */
101104: int saved_nChange; /* Saved value of db->nChange */
101105: int saved_nTotalChange; /* Saved value of db->nTotalChange */
101106: void (*saved_xTrace)(void*,const char*); /* Saved db->xTrace */
101107: Db *pDb = 0; /* Database to detach at end of vacuum */
101108: int isMemDb; /* True if vacuuming a :memory: database */
101109: int nRes; /* Bytes of reserved space at the end of each page */
101110: int nDb; /* Number of attached databases */
101111:
101112: if( !db->autoCommit ){
101113: sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction");
101114: return SQLITE_ERROR;
101115: }
101116: if( db->activeVdbeCnt>1 ){
101117: sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress");
101118: return SQLITE_ERROR;
101119: }
101120:
101121: /* Save the current value of the database flags so that it can be
101122: ** restored before returning. Then set the writable-schema flag, and
101123: ** disable CHECK and foreign key constraints. */
101124: saved_flags = db->flags;
101125: saved_nChange = db->nChange;
101126: saved_nTotalChange = db->nTotalChange;
101127: saved_xTrace = db->xTrace;
101128: db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
101129: db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
101130: db->xTrace = 0;
101131:
101132: pMain = db->aDb[0].pBt;
101133: isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain));
101134:
101135: /* Attach the temporary database as 'vacuum_db'. The synchronous pragma
101136: ** can be set to 'off' for this file, as it is not recovered if a crash
101137: ** occurs anyway. The integrity of the database is maintained by a
101138: ** (possibly synchronous) transaction opened on the main database before
101139: ** sqlite3BtreeCopyFile() is called.
101140: **
101141: ** An optimisation would be to use a non-journaled pager.
101142: ** (Later:) I tried setting "PRAGMA vacuum_db.journal_mode=OFF" but
101143: ** that actually made the VACUUM run slower. Very little journalling
101144: ** actually occurs when doing a vacuum since the vacuum_db is initially
101145: ** empty. Only the journal header is written. Apparently it takes more
101146: ** time to parse and run the PRAGMA to turn journalling off than it does
101147: ** to write the journal header file.
101148: */
101149: nDb = db->nDb;
101150: if( sqlite3TempInMemory(db) ){
101151: zSql = "ATTACH ':memory:' AS vacuum_db;";
101152: }else{
101153: zSql = "ATTACH '' AS vacuum_db;";
101154: }
101155: rc = execSql(db, pzErrMsg, zSql);
101156: if( db->nDb>nDb ){
101157: pDb = &db->aDb[db->nDb-1];
101158: assert( strcmp(pDb->zName,"vacuum_db")==0 );
101159: }
101160: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101161: pTemp = db->aDb[db->nDb-1].pBt;
101162:
101163: /* The call to execSql() to attach the temp database has left the file
101164: ** locked (as there was more than one active statement when the transaction
101165: ** to read the schema was concluded. Unlock it here so that this doesn't
101166: ** cause problems for the call to BtreeSetPageSize() below. */
101167: sqlite3BtreeCommit(pTemp);
101168:
101169: nRes = sqlite3BtreeGetReserve(pMain);
101170:
101171: /* A VACUUM cannot change the pagesize of an encrypted database. */
101172: #ifdef SQLITE_HAS_CODEC
101173: if( db->nextPagesize ){
101174: extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*);
101175: int nKey;
101176: char *zKey;
101177: sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey);
101178: if( nKey ) db->nextPagesize = 0;
101179: }
101180: #endif
101181:
1.2.2.1 ! misho 101182: rc = execSql(db, pzErrMsg, "PRAGMA vacuum_db.synchronous=OFF");
! 101183: if( rc!=SQLITE_OK ) goto end_of_vacuum;
! 101184:
! 101185: /* Begin a transaction and take an exclusive lock on the main database
! 101186: ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below,
! 101187: ** to ensure that we do not try to change the page-size on a WAL database.
! 101188: */
! 101189: rc = execSql(db, pzErrMsg, "BEGIN;");
! 101190: if( rc!=SQLITE_OK ) goto end_of_vacuum;
! 101191: rc = sqlite3BtreeBeginTrans(pMain, 2);
! 101192: if( rc!=SQLITE_OK ) goto end_of_vacuum;
! 101193:
1.2 misho 101194: /* Do not attempt to change the page size for a WAL database */
101195: if( sqlite3PagerGetJournalMode(sqlite3BtreePager(pMain))
101196: ==PAGER_JOURNALMODE_WAL ){
101197: db->nextPagesize = 0;
101198: }
101199:
101200: if( sqlite3BtreeSetPageSize(pTemp, sqlite3BtreeGetPageSize(pMain), nRes, 0)
101201: || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0))
101202: || NEVER(db->mallocFailed)
101203: ){
101204: rc = SQLITE_NOMEM;
101205: goto end_of_vacuum;
101206: }
101207:
101208: #ifndef SQLITE_OMIT_AUTOVACUUM
101209: sqlite3BtreeSetAutoVacuum(pTemp, db->nextAutovac>=0 ? db->nextAutovac :
101210: sqlite3BtreeGetAutoVacuum(pMain));
101211: #endif
101212:
101213: /* Query the schema of the main database. Create a mirror schema
101214: ** in the temporary database.
101215: */
101216: rc = execExecSql(db, pzErrMsg,
101217: "SELECT 'CREATE TABLE vacuum_db.' || substr(sql,14) "
101218: " FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence'"
101219: " AND rootpage>0"
101220: );
101221: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101222: rc = execExecSql(db, pzErrMsg,
101223: "SELECT 'CREATE INDEX vacuum_db.' || substr(sql,14)"
101224: " FROM sqlite_master WHERE sql LIKE 'CREATE INDEX %' ");
101225: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101226: rc = execExecSql(db, pzErrMsg,
101227: "SELECT 'CREATE UNIQUE INDEX vacuum_db.' || substr(sql,21) "
101228: " FROM sqlite_master WHERE sql LIKE 'CREATE UNIQUE INDEX %'");
101229: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101230:
101231: /* Loop through the tables in the main database. For each, do
101232: ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy
101233: ** the contents to the temporary database.
101234: */
101235: rc = execExecSql(db, pzErrMsg,
101236: "SELECT 'INSERT INTO vacuum_db.' || quote(name) "
101237: "|| ' SELECT * FROM main.' || quote(name) || ';'"
101238: "FROM main.sqlite_master "
101239: "WHERE type = 'table' AND name!='sqlite_sequence' "
101240: " AND rootpage>0"
101241: );
101242: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101243:
101244: /* Copy over the sequence table
101245: */
101246: rc = execExecSql(db, pzErrMsg,
101247: "SELECT 'DELETE FROM vacuum_db.' || quote(name) || ';' "
101248: "FROM vacuum_db.sqlite_master WHERE name='sqlite_sequence' "
101249: );
101250: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101251: rc = execExecSql(db, pzErrMsg,
101252: "SELECT 'INSERT INTO vacuum_db.' || quote(name) "
101253: "|| ' SELECT * FROM main.' || quote(name) || ';' "
101254: "FROM vacuum_db.sqlite_master WHERE name=='sqlite_sequence';"
101255: );
101256: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101257:
101258:
101259: /* Copy the triggers, views, and virtual tables from the main database
101260: ** over to the temporary database. None of these objects has any
101261: ** associated storage, so all we have to do is copy their entries
101262: ** from the SQLITE_MASTER table.
101263: */
101264: rc = execSql(db, pzErrMsg,
101265: "INSERT INTO vacuum_db.sqlite_master "
101266: " SELECT type, name, tbl_name, rootpage, sql"
101267: " FROM main.sqlite_master"
101268: " WHERE type='view' OR type='trigger'"
101269: " OR (type='table' AND rootpage=0)"
101270: );
101271: if( rc ) goto end_of_vacuum;
101272:
101273: /* At this point, there is a write transaction open on both the
101274: ** vacuum database and the main database. Assuming no error occurs,
101275: ** both transactions are closed by this block - the main database
101276: ** transaction by sqlite3BtreeCopyFile() and the other by an explicit
101277: ** call to sqlite3BtreeCommit().
101278: */
101279: {
101280: u32 meta;
101281: int i;
101282:
101283: /* This array determines which meta meta values are preserved in the
101284: ** vacuum. Even entries are the meta value number and odd entries
101285: ** are an increment to apply to the meta value after the vacuum.
101286: ** The increment is used to increase the schema cookie so that other
101287: ** connections to the same database will know to reread the schema.
101288: */
101289: static const unsigned char aCopy[] = {
101290: BTREE_SCHEMA_VERSION, 1, /* Add one to the old schema cookie */
101291: BTREE_DEFAULT_CACHE_SIZE, 0, /* Preserve the default page cache size */
101292: BTREE_TEXT_ENCODING, 0, /* Preserve the text encoding */
101293: BTREE_USER_VERSION, 0, /* Preserve the user version */
101294: };
101295:
101296: assert( 1==sqlite3BtreeIsInTrans(pTemp) );
101297: assert( 1==sqlite3BtreeIsInTrans(pMain) );
101298:
101299: /* Copy Btree meta values */
101300: for(i=0; i<ArraySize(aCopy); i+=2){
101301: /* GetMeta() and UpdateMeta() cannot fail in this context because
101302: ** we already have page 1 loaded into cache and marked dirty. */
101303: sqlite3BtreeGetMeta(pMain, aCopy[i], &meta);
101304: rc = sqlite3BtreeUpdateMeta(pTemp, aCopy[i], meta+aCopy[i+1]);
101305: if( NEVER(rc!=SQLITE_OK) ) goto end_of_vacuum;
101306: }
101307:
101308: rc = sqlite3BtreeCopyFile(pMain, pTemp);
101309: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101310: rc = sqlite3BtreeCommit(pTemp);
101311: if( rc!=SQLITE_OK ) goto end_of_vacuum;
101312: #ifndef SQLITE_OMIT_AUTOVACUUM
101313: sqlite3BtreeSetAutoVacuum(pMain, sqlite3BtreeGetAutoVacuum(pTemp));
101314: #endif
101315: }
101316:
101317: assert( rc==SQLITE_OK );
101318: rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1);
101319:
101320: end_of_vacuum:
101321: /* Restore the original value of db->flags */
101322: db->flags = saved_flags;
101323: db->nChange = saved_nChange;
101324: db->nTotalChange = saved_nTotalChange;
101325: db->xTrace = saved_xTrace;
101326: sqlite3BtreeSetPageSize(pMain, -1, -1, 1);
101327:
101328: /* Currently there is an SQL level transaction open on the vacuum
101329: ** database. No locks are held on any other files (since the main file
101330: ** was committed at the btree level). So it safe to end the transaction
101331: ** by manually setting the autoCommit flag to true and detaching the
101332: ** vacuum database. The vacuum_db journal file is deleted when the pager
101333: ** is closed by the DETACH.
101334: */
101335: db->autoCommit = 1;
101336:
101337: if( pDb ){
101338: sqlite3BtreeClose(pDb->pBt);
101339: pDb->pBt = 0;
101340: pDb->pSchema = 0;
101341: }
101342:
101343: /* This both clears the schemas and reduces the size of the db->aDb[]
101344: ** array. */
1.2.2.1 ! misho 101345: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 101346:
101347: return rc;
101348: }
101349:
101350: #endif /* SQLITE_OMIT_VACUUM && SQLITE_OMIT_ATTACH */
101351:
101352: /************** End of vacuum.c **********************************************/
101353: /************** Begin file vtab.c ********************************************/
101354: /*
101355: ** 2006 June 10
101356: **
101357: ** The author disclaims copyright to this source code. In place of
101358: ** a legal notice, here is a blessing:
101359: **
101360: ** May you do good and not evil.
101361: ** May you find forgiveness for yourself and forgive others.
101362: ** May you share freely, never taking more than you give.
101363: **
101364: *************************************************************************
101365: ** This file contains code used to help implement virtual tables.
101366: */
101367: #ifndef SQLITE_OMIT_VIRTUALTABLE
101368:
101369: /*
101370: ** Before a virtual table xCreate() or xConnect() method is invoked, the
101371: ** sqlite3.pVtabCtx member variable is set to point to an instance of
101372: ** this struct allocated on the stack. It is used by the implementation of
101373: ** the sqlite3_declare_vtab() and sqlite3_vtab_config() APIs, both of which
101374: ** are invoked only from within xCreate and xConnect methods.
101375: */
101376: struct VtabCtx {
1.2.2.1 ! misho 101377: VTable *pVTable; /* The virtual table being constructed */
! 101378: Table *pTab; /* The Table object to which the virtual table belongs */
1.2 misho 101379: };
101380:
101381: /*
101382: ** The actual function that does the work of creating a new module.
101383: ** This function implements the sqlite3_create_module() and
101384: ** sqlite3_create_module_v2() interfaces.
101385: */
101386: static int createModule(
101387: sqlite3 *db, /* Database in which module is registered */
101388: const char *zName, /* Name assigned to this module */
101389: const sqlite3_module *pModule, /* The definition of the module */
101390: void *pAux, /* Context pointer for xCreate/xConnect */
101391: void (*xDestroy)(void *) /* Module destructor function */
101392: ){
1.2.2.1 ! misho 101393: int rc = SQLITE_OK;
! 101394: int nName;
1.2 misho 101395:
101396: sqlite3_mutex_enter(db->mutex);
101397: nName = sqlite3Strlen30(zName);
1.2.2.1 ! misho 101398: if( sqlite3HashFind(&db->aModule, zName, nName) ){
! 101399: rc = SQLITE_MISUSE_BKPT;
! 101400: }else{
! 101401: Module *pMod;
! 101402: pMod = (Module *)sqlite3DbMallocRaw(db, sizeof(Module) + nName + 1);
! 101403: if( pMod ){
! 101404: Module *pDel;
! 101405: char *zCopy = (char *)(&pMod[1]);
! 101406: memcpy(zCopy, zName, nName+1);
! 101407: pMod->zName = zCopy;
! 101408: pMod->pModule = pModule;
! 101409: pMod->pAux = pAux;
! 101410: pMod->xDestroy = xDestroy;
! 101411: pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,nName,(void*)pMod);
! 101412: assert( pDel==0 || pDel==pMod );
! 101413: if( pDel ){
! 101414: db->mallocFailed = 1;
! 101415: sqlite3DbFree(db, pDel);
! 101416: }
1.2 misho 101417: }
101418: }
1.2.2.1 ! misho 101419: rc = sqlite3ApiExit(db, rc);
! 101420: if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux);
! 101421:
1.2 misho 101422: sqlite3_mutex_leave(db->mutex);
101423: return rc;
101424: }
101425:
101426:
101427: /*
101428: ** External API function used to create a new virtual-table module.
101429: */
101430: SQLITE_API int sqlite3_create_module(
101431: sqlite3 *db, /* Database in which module is registered */
101432: const char *zName, /* Name assigned to this module */
101433: const sqlite3_module *pModule, /* The definition of the module */
101434: void *pAux /* Context pointer for xCreate/xConnect */
101435: ){
101436: return createModule(db, zName, pModule, pAux, 0);
101437: }
101438:
101439: /*
101440: ** External API function used to create a new virtual-table module.
101441: */
101442: SQLITE_API int sqlite3_create_module_v2(
101443: sqlite3 *db, /* Database in which module is registered */
101444: const char *zName, /* Name assigned to this module */
101445: const sqlite3_module *pModule, /* The definition of the module */
101446: void *pAux, /* Context pointer for xCreate/xConnect */
101447: void (*xDestroy)(void *) /* Module destructor function */
101448: ){
101449: return createModule(db, zName, pModule, pAux, xDestroy);
101450: }
101451:
101452: /*
101453: ** Lock the virtual table so that it cannot be disconnected.
101454: ** Locks nest. Every lock should have a corresponding unlock.
101455: ** If an unlock is omitted, resources leaks will occur.
101456: **
101457: ** If a disconnect is attempted while a virtual table is locked,
101458: ** the disconnect is deferred until all locks have been removed.
101459: */
101460: SQLITE_PRIVATE void sqlite3VtabLock(VTable *pVTab){
101461: pVTab->nRef++;
101462: }
101463:
101464:
101465: /*
101466: ** pTab is a pointer to a Table structure representing a virtual-table.
101467: ** Return a pointer to the VTable object used by connection db to access
101468: ** this virtual-table, if one has been created, or NULL otherwise.
101469: */
101470: SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){
101471: VTable *pVtab;
101472: assert( IsVirtual(pTab) );
101473: for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext);
101474: return pVtab;
101475: }
101476:
101477: /*
101478: ** Decrement the ref-count on a virtual table object. When the ref-count
101479: ** reaches zero, call the xDisconnect() method to delete the object.
101480: */
101481: SQLITE_PRIVATE void sqlite3VtabUnlock(VTable *pVTab){
101482: sqlite3 *db = pVTab->db;
101483:
101484: assert( db );
101485: assert( pVTab->nRef>0 );
1.2.2.1 ! misho 101486: assert( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ZOMBIE );
1.2 misho 101487:
101488: pVTab->nRef--;
101489: if( pVTab->nRef==0 ){
101490: sqlite3_vtab *p = pVTab->pVtab;
101491: if( p ){
101492: p->pModule->xDisconnect(p);
101493: }
101494: sqlite3DbFree(db, pVTab);
101495: }
101496: }
101497:
101498: /*
101499: ** Table p is a virtual table. This function moves all elements in the
101500: ** p->pVTable list to the sqlite3.pDisconnect lists of their associated
101501: ** database connections to be disconnected at the next opportunity.
101502: ** Except, if argument db is not NULL, then the entry associated with
101503: ** connection db is left in the p->pVTable list.
101504: */
101505: static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){
101506: VTable *pRet = 0;
101507: VTable *pVTable = p->pVTable;
101508: p->pVTable = 0;
101509:
101510: /* Assert that the mutex (if any) associated with the BtShared database
101511: ** that contains table p is held by the caller. See header comments
101512: ** above function sqlite3VtabUnlockList() for an explanation of why
101513: ** this makes it safe to access the sqlite3.pDisconnect list of any
101514: ** database connection that may have an entry in the p->pVTable list.
101515: */
101516: assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) );
101517:
101518: while( pVTable ){
101519: sqlite3 *db2 = pVTable->db;
101520: VTable *pNext = pVTable->pNext;
101521: assert( db2 );
101522: if( db2==db ){
101523: pRet = pVTable;
101524: p->pVTable = pRet;
101525: pRet->pNext = 0;
101526: }else{
101527: pVTable->pNext = db2->pDisconnect;
101528: db2->pDisconnect = pVTable;
101529: }
101530: pVTable = pNext;
101531: }
1.2.2.1 ! misho 101532:
! 101533: assert( !db || pRet );
! 101534: return pRet;
! 101535: }
! 101536:
! 101537: /*
! 101538: ** Table *p is a virtual table. This function removes the VTable object
! 101539: ** for table *p associated with database connection db from the linked
! 101540: ** list in p->pVTab. It also decrements the VTable ref count. This is
! 101541: ** used when closing database connection db to free all of its VTable
! 101542: ** objects without disturbing the rest of the Schema object (which may
! 101543: ** be being used by other shared-cache connections).
! 101544: */
! 101545: SQLITE_PRIVATE void sqlite3VtabDisconnect(sqlite3 *db, Table *p){
! 101546: VTable **ppVTab;
! 101547:
! 101548: assert( IsVirtual(p) );
! 101549: assert( sqlite3BtreeHoldsAllMutexes(db) );
! 101550: assert( sqlite3_mutex_held(db->mutex) );
! 101551:
! 101552: for(ppVTab=&p->pVTable; *ppVTab; ppVTab=&(*ppVTab)->pNext){
! 101553: if( (*ppVTab)->db==db ){
! 101554: VTable *pVTab = *ppVTab;
! 101555: *ppVTab = pVTab->pNext;
! 101556: sqlite3VtabUnlock(pVTab);
! 101557: break;
! 101558: }
! 101559: }
1.2 misho 101560: }
101561:
101562:
101563: /*
101564: ** Disconnect all the virtual table objects in the sqlite3.pDisconnect list.
101565: **
101566: ** This function may only be called when the mutexes associated with all
101567: ** shared b-tree databases opened using connection db are held by the
101568: ** caller. This is done to protect the sqlite3.pDisconnect list. The
101569: ** sqlite3.pDisconnect list is accessed only as follows:
101570: **
101571: ** 1) By this function. In this case, all BtShared mutexes and the mutex
101572: ** associated with the database handle itself must be held.
101573: **
101574: ** 2) By function vtabDisconnectAll(), when it adds a VTable entry to
101575: ** the sqlite3.pDisconnect list. In this case either the BtShared mutex
101576: ** associated with the database the virtual table is stored in is held
101577: ** or, if the virtual table is stored in a non-sharable database, then
101578: ** the database handle mutex is held.
101579: **
101580: ** As a result, a sqlite3.pDisconnect cannot be accessed simultaneously
101581: ** by multiple threads. It is thread-safe.
101582: */
101583: SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3 *db){
101584: VTable *p = db->pDisconnect;
101585: db->pDisconnect = 0;
101586:
101587: assert( sqlite3BtreeHoldsAllMutexes(db) );
101588: assert( sqlite3_mutex_held(db->mutex) );
101589:
101590: if( p ){
101591: sqlite3ExpirePreparedStatements(db);
101592: do {
101593: VTable *pNext = p->pNext;
101594: sqlite3VtabUnlock(p);
101595: p = pNext;
101596: }while( p );
101597: }
101598: }
101599:
101600: /*
101601: ** Clear any and all virtual-table information from the Table record.
101602: ** This routine is called, for example, just before deleting the Table
101603: ** record.
101604: **
101605: ** Since it is a virtual-table, the Table structure contains a pointer
101606: ** to the head of a linked list of VTable structures. Each VTable
101607: ** structure is associated with a single sqlite3* user of the schema.
101608: ** The reference count of the VTable structure associated with database
101609: ** connection db is decremented immediately (which may lead to the
101610: ** structure being xDisconnected and free). Any other VTable structures
101611: ** in the list are moved to the sqlite3.pDisconnect list of the associated
101612: ** database connection.
101613: */
101614: SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){
101615: if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p);
101616: if( p->azModuleArg ){
101617: int i;
101618: for(i=0; i<p->nModuleArg; i++){
1.2.2.1 ! misho 101619: if( i!=1 ) sqlite3DbFree(db, p->azModuleArg[i]);
1.2 misho 101620: }
101621: sqlite3DbFree(db, p->azModuleArg);
101622: }
101623: }
101624:
101625: /*
101626: ** Add a new module argument to pTable->azModuleArg[].
101627: ** The string is not copied - the pointer is stored. The
101628: ** string will be freed automatically when the table is
101629: ** deleted.
101630: */
101631: static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){
101632: int i = pTable->nModuleArg++;
101633: int nBytes = sizeof(char *)*(1+pTable->nModuleArg);
101634: char **azModuleArg;
101635: azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes);
101636: if( azModuleArg==0 ){
101637: int j;
101638: for(j=0; j<i; j++){
101639: sqlite3DbFree(db, pTable->azModuleArg[j]);
101640: }
101641: sqlite3DbFree(db, zArg);
101642: sqlite3DbFree(db, pTable->azModuleArg);
101643: pTable->nModuleArg = 0;
101644: }else{
101645: azModuleArg[i] = zArg;
101646: azModuleArg[i+1] = 0;
101647: }
101648: pTable->azModuleArg = azModuleArg;
101649: }
101650:
101651: /*
101652: ** The parser calls this routine when it first sees a CREATE VIRTUAL TABLE
101653: ** statement. The module name has been parsed, but the optional list
101654: ** of parameters that follow the module name are still pending.
101655: */
101656: SQLITE_PRIVATE void sqlite3VtabBeginParse(
101657: Parse *pParse, /* Parsing context */
101658: Token *pName1, /* Name of new table, or database name */
101659: Token *pName2, /* Name of new table or NULL */
1.2.2.1 ! misho 101660: Token *pModuleName, /* Name of the module for the virtual table */
! 101661: int ifNotExists /* No error if the table already exists */
1.2 misho 101662: ){
101663: int iDb; /* The database the table is being created in */
101664: Table *pTable; /* The new virtual table */
101665: sqlite3 *db; /* Database connection */
101666:
1.2.2.1 ! misho 101667: sqlite3StartTable(pParse, pName1, pName2, 0, 0, 1, ifNotExists);
1.2 misho 101668: pTable = pParse->pNewTable;
101669: if( pTable==0 ) return;
101670: assert( 0==pTable->pIndex );
101671:
101672: db = pParse->db;
101673: iDb = sqlite3SchemaToIndex(db, pTable->pSchema);
101674: assert( iDb>=0 );
101675:
101676: pTable->tabFlags |= TF_Virtual;
101677: pTable->nModuleArg = 0;
101678: addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName));
1.2.2.1 ! misho 101679: addModuleArgument(db, pTable, 0);
1.2 misho 101680: addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName));
101681: pParse->sNameToken.n = (int)(&pModuleName->z[pModuleName->n] - pName1->z);
101682:
101683: #ifndef SQLITE_OMIT_AUTHORIZATION
101684: /* Creating a virtual table invokes the authorization callback twice.
101685: ** The first invocation, to obtain permission to INSERT a row into the
101686: ** sqlite_master table, has already been made by sqlite3StartTable().
101687: ** The second call, to obtain permission to create the table, is made now.
101688: */
101689: if( pTable->azModuleArg ){
101690: sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName,
101691: pTable->azModuleArg[0], pParse->db->aDb[iDb].zName);
101692: }
101693: #endif
101694: }
101695:
101696: /*
101697: ** This routine takes the module argument that has been accumulating
101698: ** in pParse->zArg[] and appends it to the list of arguments on the
101699: ** virtual table currently under construction in pParse->pTable.
101700: */
101701: static void addArgumentToVtab(Parse *pParse){
1.2.2.1 ! misho 101702: if( pParse->sArg.z && pParse->pNewTable ){
1.2 misho 101703: const char *z = (const char*)pParse->sArg.z;
101704: int n = pParse->sArg.n;
101705: sqlite3 *db = pParse->db;
101706: addModuleArgument(db, pParse->pNewTable, sqlite3DbStrNDup(db, z, n));
101707: }
101708: }
101709:
101710: /*
101711: ** The parser calls this routine after the CREATE VIRTUAL TABLE statement
101712: ** has been completely parsed.
101713: */
101714: SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){
101715: Table *pTab = pParse->pNewTable; /* The table being constructed */
101716: sqlite3 *db = pParse->db; /* The database connection */
101717:
101718: if( pTab==0 ) return;
101719: addArgumentToVtab(pParse);
101720: pParse->sArg.z = 0;
101721: if( pTab->nModuleArg<1 ) return;
101722:
101723: /* If the CREATE VIRTUAL TABLE statement is being entered for the
101724: ** first time (in other words if the virtual table is actually being
101725: ** created now instead of just being read out of sqlite_master) then
101726: ** do additional initialization work and store the statement text
101727: ** in the sqlite_master table.
101728: */
101729: if( !db->init.busy ){
101730: char *zStmt;
101731: char *zWhere;
101732: int iDb;
101733: Vdbe *v;
101734:
101735: /* Compute the complete text of the CREATE VIRTUAL TABLE statement */
101736: if( pEnd ){
101737: pParse->sNameToken.n = (int)(pEnd->z - pParse->sNameToken.z) + pEnd->n;
101738: }
101739: zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken);
101740:
101741: /* A slot for the record has already been allocated in the
101742: ** SQLITE_MASTER table. We just need to update that slot with all
101743: ** the information we've collected.
101744: **
101745: ** The VM register number pParse->regRowid holds the rowid of an
101746: ** entry in the sqlite_master table tht was created for this vtab
101747: ** by sqlite3StartTable().
101748: */
101749: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
101750: sqlite3NestedParse(pParse,
101751: "UPDATE %Q.%s "
101752: "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "
101753: "WHERE rowid=#%d",
101754: db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
101755: pTab->zName,
101756: pTab->zName,
101757: zStmt,
101758: pParse->regRowid
101759: );
101760: sqlite3DbFree(db, zStmt);
101761: v = sqlite3GetVdbe(pParse);
101762: sqlite3ChangeCookie(pParse, iDb);
101763:
101764: sqlite3VdbeAddOp2(v, OP_Expire, 0, 0);
101765: zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName);
101766: sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
101767: sqlite3VdbeAddOp4(v, OP_VCreate, iDb, 0, 0,
101768: pTab->zName, sqlite3Strlen30(pTab->zName) + 1);
101769: }
101770:
101771: /* If we are rereading the sqlite_master table create the in-memory
101772: ** record of the table. The xConnect() method is not called until
101773: ** the first time the virtual table is used in an SQL statement. This
101774: ** allows a schema that contains virtual tables to be loaded before
101775: ** the required virtual table implementations are registered. */
101776: else {
101777: Table *pOld;
101778: Schema *pSchema = pTab->pSchema;
101779: const char *zName = pTab->zName;
101780: int nName = sqlite3Strlen30(zName);
101781: assert( sqlite3SchemaMutexHeld(db, 0, pSchema) );
101782: pOld = sqlite3HashInsert(&pSchema->tblHash, zName, nName, pTab);
101783: if( pOld ){
101784: db->mallocFailed = 1;
101785: assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */
101786: return;
101787: }
101788: pParse->pNewTable = 0;
101789: }
101790: }
101791:
101792: /*
101793: ** The parser calls this routine when it sees the first token
101794: ** of an argument to the module name in a CREATE VIRTUAL TABLE statement.
101795: */
101796: SQLITE_PRIVATE void sqlite3VtabArgInit(Parse *pParse){
101797: addArgumentToVtab(pParse);
101798: pParse->sArg.z = 0;
101799: pParse->sArg.n = 0;
101800: }
101801:
101802: /*
101803: ** The parser calls this routine for each token after the first token
101804: ** in an argument to the module name in a CREATE VIRTUAL TABLE statement.
101805: */
101806: SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){
101807: Token *pArg = &pParse->sArg;
101808: if( pArg->z==0 ){
101809: pArg->z = p->z;
101810: pArg->n = p->n;
101811: }else{
101812: assert(pArg->z < p->z);
101813: pArg->n = (int)(&p->z[p->n] - pArg->z);
101814: }
101815: }
101816:
101817: /*
101818: ** Invoke a virtual table constructor (either xCreate or xConnect). The
101819: ** pointer to the function to invoke is passed as the fourth parameter
101820: ** to this procedure.
101821: */
101822: static int vtabCallConstructor(
101823: sqlite3 *db,
101824: Table *pTab,
101825: Module *pMod,
101826: int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**),
101827: char **pzErr
101828: ){
1.2.2.1 ! misho 101829: VtabCtx sCtx, *pPriorCtx;
1.2 misho 101830: VTable *pVTable;
101831: int rc;
101832: const char *const*azArg = (const char *const*)pTab->azModuleArg;
101833: int nArg = pTab->nModuleArg;
101834: char *zErr = 0;
101835: char *zModuleName = sqlite3MPrintf(db, "%s", pTab->zName);
1.2.2.1 ! misho 101836: int iDb;
1.2 misho 101837:
101838: if( !zModuleName ){
101839: return SQLITE_NOMEM;
101840: }
101841:
101842: pVTable = sqlite3DbMallocZero(db, sizeof(VTable));
101843: if( !pVTable ){
101844: sqlite3DbFree(db, zModuleName);
101845: return SQLITE_NOMEM;
101846: }
101847: pVTable->db = db;
101848: pVTable->pMod = pMod;
101849:
1.2.2.1 ! misho 101850: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
! 101851: pTab->azModuleArg[1] = db->aDb[iDb].zName;
! 101852:
1.2 misho 101853: /* Invoke the virtual table constructor */
101854: assert( &db->pVtabCtx );
101855: assert( xConstruct );
101856: sCtx.pTab = pTab;
101857: sCtx.pVTable = pVTable;
1.2.2.1 ! misho 101858: pPriorCtx = db->pVtabCtx;
1.2 misho 101859: db->pVtabCtx = &sCtx;
101860: rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr);
1.2.2.1 ! misho 101861: db->pVtabCtx = pPriorCtx;
1.2 misho 101862: if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
101863:
101864: if( SQLITE_OK!=rc ){
101865: if( zErr==0 ){
101866: *pzErr = sqlite3MPrintf(db, "vtable constructor failed: %s", zModuleName);
101867: }else {
101868: *pzErr = sqlite3MPrintf(db, "%s", zErr);
101869: sqlite3_free(zErr);
101870: }
101871: sqlite3DbFree(db, pVTable);
101872: }else if( ALWAYS(pVTable->pVtab) ){
101873: /* Justification of ALWAYS(): A correct vtab constructor must allocate
101874: ** the sqlite3_vtab object if successful. */
101875: pVTable->pVtab->pModule = pMod->pModule;
101876: pVTable->nRef = 1;
101877: if( sCtx.pTab ){
101878: const char *zFormat = "vtable constructor did not declare schema: %s";
101879: *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName);
101880: sqlite3VtabUnlock(pVTable);
101881: rc = SQLITE_ERROR;
101882: }else{
101883: int iCol;
101884: /* If everything went according to plan, link the new VTable structure
101885: ** into the linked list headed by pTab->pVTable. Then loop through the
101886: ** columns of the table to see if any of them contain the token "hidden".
1.2.2.1 ! misho 101887: ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from
1.2 misho 101888: ** the type string. */
101889: pVTable->pNext = pTab->pVTable;
101890: pTab->pVTable = pVTable;
101891:
101892: for(iCol=0; iCol<pTab->nCol; iCol++){
101893: char *zType = pTab->aCol[iCol].zType;
101894: int nType;
101895: int i = 0;
101896: if( !zType ) continue;
101897: nType = sqlite3Strlen30(zType);
101898: if( sqlite3StrNICmp("hidden", zType, 6)||(zType[6] && zType[6]!=' ') ){
101899: for(i=0; i<nType; i++){
101900: if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7))
101901: && (zType[i+7]=='\0' || zType[i+7]==' ')
101902: ){
101903: i++;
101904: break;
101905: }
101906: }
101907: }
101908: if( i<nType ){
101909: int j;
101910: int nDel = 6 + (zType[i+6] ? 1 : 0);
101911: for(j=i; (j+nDel)<=nType; j++){
101912: zType[j] = zType[j+nDel];
101913: }
101914: if( zType[i]=='\0' && i>0 ){
101915: assert(zType[i-1]==' ');
101916: zType[i-1] = '\0';
101917: }
1.2.2.1 ! misho 101918: pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN;
1.2 misho 101919: }
101920: }
101921: }
101922: }
101923:
101924: sqlite3DbFree(db, zModuleName);
101925: return rc;
101926: }
101927:
101928: /*
101929: ** This function is invoked by the parser to call the xConnect() method
101930: ** of the virtual table pTab. If an error occurs, an error code is returned
101931: ** and an error left in pParse.
101932: **
101933: ** This call is a no-op if table pTab is not a virtual table.
101934: */
101935: SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){
101936: sqlite3 *db = pParse->db;
101937: const char *zMod;
101938: Module *pMod;
101939: int rc;
101940:
101941: assert( pTab );
101942: if( (pTab->tabFlags & TF_Virtual)==0 || sqlite3GetVTable(db, pTab) ){
101943: return SQLITE_OK;
101944: }
101945:
101946: /* Locate the required virtual table module */
101947: zMod = pTab->azModuleArg[0];
101948: pMod = (Module*)sqlite3HashFind(&db->aModule, zMod, sqlite3Strlen30(zMod));
101949:
101950: if( !pMod ){
101951: const char *zModule = pTab->azModuleArg[0];
101952: sqlite3ErrorMsg(pParse, "no such module: %s", zModule);
101953: rc = SQLITE_ERROR;
101954: }else{
101955: char *zErr = 0;
101956: rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr);
101957: if( rc!=SQLITE_OK ){
101958: sqlite3ErrorMsg(pParse, "%s", zErr);
101959: }
101960: sqlite3DbFree(db, zErr);
101961: }
101962:
101963: return rc;
101964: }
101965: /*
101966: ** Grow the db->aVTrans[] array so that there is room for at least one
101967: ** more v-table. Return SQLITE_NOMEM if a malloc fails, or SQLITE_OK otherwise.
101968: */
101969: static int growVTrans(sqlite3 *db){
101970: const int ARRAY_INCR = 5;
101971:
101972: /* Grow the sqlite3.aVTrans array if required */
101973: if( (db->nVTrans%ARRAY_INCR)==0 ){
101974: VTable **aVTrans;
101975: int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR);
101976: aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes);
101977: if( !aVTrans ){
101978: return SQLITE_NOMEM;
101979: }
101980: memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR);
101981: db->aVTrans = aVTrans;
101982: }
101983:
101984: return SQLITE_OK;
101985: }
101986:
101987: /*
101988: ** Add the virtual table pVTab to the array sqlite3.aVTrans[]. Space should
101989: ** have already been reserved using growVTrans().
101990: */
101991: static void addToVTrans(sqlite3 *db, VTable *pVTab){
101992: /* Add pVtab to the end of sqlite3.aVTrans */
101993: db->aVTrans[db->nVTrans++] = pVTab;
101994: sqlite3VtabLock(pVTab);
101995: }
101996:
101997: /*
101998: ** This function is invoked by the vdbe to call the xCreate method
101999: ** of the virtual table named zTab in database iDb.
102000: **
102001: ** If an error occurs, *pzErr is set to point an an English language
102002: ** description of the error and an SQLITE_XXX error code is returned.
102003: ** In this case the caller must call sqlite3DbFree(db, ) on *pzErr.
102004: */
102005: SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){
102006: int rc = SQLITE_OK;
102007: Table *pTab;
102008: Module *pMod;
102009: const char *zMod;
102010:
102011: pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
102012: assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable );
102013:
102014: /* Locate the required virtual table module */
102015: zMod = pTab->azModuleArg[0];
102016: pMod = (Module*)sqlite3HashFind(&db->aModule, zMod, sqlite3Strlen30(zMod));
102017:
102018: /* If the module has been registered and includes a Create method,
102019: ** invoke it now. If the module has not been registered, return an
102020: ** error. Otherwise, do nothing.
102021: */
102022: if( !pMod ){
102023: *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod);
102024: rc = SQLITE_ERROR;
102025: }else{
102026: rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xCreate, pzErr);
102027: }
102028:
102029: /* Justification of ALWAYS(): The xConstructor method is required to
102030: ** create a valid sqlite3_vtab if it returns SQLITE_OK. */
102031: if( rc==SQLITE_OK && ALWAYS(sqlite3GetVTable(db, pTab)) ){
102032: rc = growVTrans(db);
102033: if( rc==SQLITE_OK ){
102034: addToVTrans(db, sqlite3GetVTable(db, pTab));
102035: }
102036: }
102037:
102038: return rc;
102039: }
102040:
102041: /*
102042: ** This function is used to set the schema of a virtual table. It is only
102043: ** valid to call this function from within the xCreate() or xConnect() of a
102044: ** virtual table module.
102045: */
102046: SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){
102047: Parse *pParse;
102048:
102049: int rc = SQLITE_OK;
102050: Table *pTab;
102051: char *zErr = 0;
102052:
102053: sqlite3_mutex_enter(db->mutex);
102054: if( !db->pVtabCtx || !(pTab = db->pVtabCtx->pTab) ){
102055: sqlite3Error(db, SQLITE_MISUSE, 0);
102056: sqlite3_mutex_leave(db->mutex);
102057: return SQLITE_MISUSE_BKPT;
102058: }
102059: assert( (pTab->tabFlags & TF_Virtual)!=0 );
102060:
102061: pParse = sqlite3StackAllocZero(db, sizeof(*pParse));
102062: if( pParse==0 ){
102063: rc = SQLITE_NOMEM;
102064: }else{
102065: pParse->declareVtab = 1;
102066: pParse->db = db;
102067: pParse->nQueryLoop = 1;
102068:
102069: if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr)
102070: && pParse->pNewTable
102071: && !db->mallocFailed
102072: && !pParse->pNewTable->pSelect
102073: && (pParse->pNewTable->tabFlags & TF_Virtual)==0
102074: ){
102075: if( !pTab->aCol ){
102076: pTab->aCol = pParse->pNewTable->aCol;
102077: pTab->nCol = pParse->pNewTable->nCol;
102078: pParse->pNewTable->nCol = 0;
102079: pParse->pNewTable->aCol = 0;
102080: }
102081: db->pVtabCtx->pTab = 0;
102082: }else{
102083: sqlite3Error(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr);
102084: sqlite3DbFree(db, zErr);
102085: rc = SQLITE_ERROR;
102086: }
102087: pParse->declareVtab = 0;
102088:
102089: if( pParse->pVdbe ){
102090: sqlite3VdbeFinalize(pParse->pVdbe);
102091: }
102092: sqlite3DeleteTable(db, pParse->pNewTable);
102093: sqlite3StackFree(db, pParse);
102094: }
102095:
102096: assert( (rc&0xff)==rc );
102097: rc = sqlite3ApiExit(db, rc);
102098: sqlite3_mutex_leave(db->mutex);
102099: return rc;
102100: }
102101:
102102: /*
102103: ** This function is invoked by the vdbe to call the xDestroy method
102104: ** of the virtual table named zTab in database iDb. This occurs
102105: ** when a DROP TABLE is mentioned.
102106: **
102107: ** This call is a no-op if zTab is not a virtual table.
102108: */
102109: SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){
102110: int rc = SQLITE_OK;
102111: Table *pTab;
102112:
102113: pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName);
102114: if( ALWAYS(pTab!=0 && pTab->pVTable!=0) ){
102115: VTable *p = vtabDisconnectAll(db, pTab);
102116:
102117: assert( rc==SQLITE_OK );
102118: rc = p->pMod->pModule->xDestroy(p->pVtab);
102119:
102120: /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */
102121: if( rc==SQLITE_OK ){
102122: assert( pTab->pVTable==p && p->pNext==0 );
102123: p->pVtab = 0;
102124: pTab->pVTable = 0;
102125: sqlite3VtabUnlock(p);
102126: }
102127: }
102128:
102129: return rc;
102130: }
102131:
102132: /*
102133: ** This function invokes either the xRollback or xCommit method
102134: ** of each of the virtual tables in the sqlite3.aVTrans array. The method
102135: ** called is identified by the second argument, "offset", which is
102136: ** the offset of the method to call in the sqlite3_module structure.
102137: **
102138: ** The array is cleared after invoking the callbacks.
102139: */
102140: static void callFinaliser(sqlite3 *db, int offset){
102141: int i;
102142: if( db->aVTrans ){
102143: for(i=0; i<db->nVTrans; i++){
102144: VTable *pVTab = db->aVTrans[i];
102145: sqlite3_vtab *p = pVTab->pVtab;
102146: if( p ){
102147: int (*x)(sqlite3_vtab *);
102148: x = *(int (**)(sqlite3_vtab *))((char *)p->pModule + offset);
102149: if( x ) x(p);
102150: }
102151: pVTab->iSavepoint = 0;
102152: sqlite3VtabUnlock(pVTab);
102153: }
102154: sqlite3DbFree(db, db->aVTrans);
102155: db->nVTrans = 0;
102156: db->aVTrans = 0;
102157: }
102158: }
102159:
102160: /*
102161: ** Invoke the xSync method of all virtual tables in the sqlite3.aVTrans
102162: ** array. Return the error code for the first error that occurs, or
102163: ** SQLITE_OK if all xSync operations are successful.
102164: **
102165: ** Set *pzErrmsg to point to a buffer that should be released using
102166: ** sqlite3DbFree() containing an error message, if one is available.
102167: */
102168: SQLITE_PRIVATE int sqlite3VtabSync(sqlite3 *db, char **pzErrmsg){
102169: int i;
102170: int rc = SQLITE_OK;
102171: VTable **aVTrans = db->aVTrans;
102172:
102173: db->aVTrans = 0;
102174: for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){
102175: int (*x)(sqlite3_vtab *);
102176: sqlite3_vtab *pVtab = aVTrans[i]->pVtab;
102177: if( pVtab && (x = pVtab->pModule->xSync)!=0 ){
102178: rc = x(pVtab);
102179: sqlite3DbFree(db, *pzErrmsg);
102180: *pzErrmsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
102181: sqlite3_free(pVtab->zErrMsg);
102182: }
102183: }
102184: db->aVTrans = aVTrans;
102185: return rc;
102186: }
102187:
102188: /*
102189: ** Invoke the xRollback method of all virtual tables in the
102190: ** sqlite3.aVTrans array. Then clear the array itself.
102191: */
102192: SQLITE_PRIVATE int sqlite3VtabRollback(sqlite3 *db){
102193: callFinaliser(db, offsetof(sqlite3_module,xRollback));
102194: return SQLITE_OK;
102195: }
102196:
102197: /*
102198: ** Invoke the xCommit method of all virtual tables in the
102199: ** sqlite3.aVTrans array. Then clear the array itself.
102200: */
102201: SQLITE_PRIVATE int sqlite3VtabCommit(sqlite3 *db){
102202: callFinaliser(db, offsetof(sqlite3_module,xCommit));
102203: return SQLITE_OK;
102204: }
102205:
102206: /*
102207: ** If the virtual table pVtab supports the transaction interface
102208: ** (xBegin/xRollback/xCommit and optionally xSync) and a transaction is
102209: ** not currently open, invoke the xBegin method now.
102210: **
102211: ** If the xBegin call is successful, place the sqlite3_vtab pointer
102212: ** in the sqlite3.aVTrans array.
102213: */
102214: SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){
102215: int rc = SQLITE_OK;
102216: const sqlite3_module *pModule;
102217:
102218: /* Special case: If db->aVTrans is NULL and db->nVTrans is greater
102219: ** than zero, then this function is being called from within a
102220: ** virtual module xSync() callback. It is illegal to write to
102221: ** virtual module tables in this case, so return SQLITE_LOCKED.
102222: */
102223: if( sqlite3VtabInSync(db) ){
102224: return SQLITE_LOCKED;
102225: }
102226: if( !pVTab ){
102227: return SQLITE_OK;
102228: }
102229: pModule = pVTab->pVtab->pModule;
102230:
102231: if( pModule->xBegin ){
102232: int i;
102233:
102234: /* If pVtab is already in the aVTrans array, return early */
102235: for(i=0; i<db->nVTrans; i++){
102236: if( db->aVTrans[i]==pVTab ){
102237: return SQLITE_OK;
102238: }
102239: }
102240:
102241: /* Invoke the xBegin method. If successful, add the vtab to the
102242: ** sqlite3.aVTrans[] array. */
102243: rc = growVTrans(db);
102244: if( rc==SQLITE_OK ){
102245: rc = pModule->xBegin(pVTab->pVtab);
102246: if( rc==SQLITE_OK ){
102247: addToVTrans(db, pVTab);
102248: }
102249: }
102250: }
102251: return rc;
102252: }
102253:
102254: /*
102255: ** Invoke either the xSavepoint, xRollbackTo or xRelease method of all
102256: ** virtual tables that currently have an open transaction. Pass iSavepoint
102257: ** as the second argument to the virtual table method invoked.
102258: **
102259: ** If op is SAVEPOINT_BEGIN, the xSavepoint method is invoked. If it is
102260: ** SAVEPOINT_ROLLBACK, the xRollbackTo method. Otherwise, if op is
102261: ** SAVEPOINT_RELEASE, then the xRelease method of each virtual table with
102262: ** an open transaction is invoked.
102263: **
102264: ** If any virtual table method returns an error code other than SQLITE_OK,
102265: ** processing is abandoned and the error returned to the caller of this
102266: ** function immediately. If all calls to virtual table methods are successful,
102267: ** SQLITE_OK is returned.
102268: */
102269: SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){
102270: int rc = SQLITE_OK;
102271:
102272: assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN );
102273: assert( iSavepoint>=0 );
102274: if( db->aVTrans ){
102275: int i;
102276: for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){
102277: VTable *pVTab = db->aVTrans[i];
102278: const sqlite3_module *pMod = pVTab->pMod->pModule;
102279: if( pVTab->pVtab && pMod->iVersion>=2 ){
102280: int (*xMethod)(sqlite3_vtab *, int);
102281: switch( op ){
102282: case SAVEPOINT_BEGIN:
102283: xMethod = pMod->xSavepoint;
102284: pVTab->iSavepoint = iSavepoint+1;
102285: break;
102286: case SAVEPOINT_ROLLBACK:
102287: xMethod = pMod->xRollbackTo;
102288: break;
102289: default:
102290: xMethod = pMod->xRelease;
102291: break;
102292: }
102293: if( xMethod && pVTab->iSavepoint>iSavepoint ){
102294: rc = xMethod(pVTab->pVtab, iSavepoint);
102295: }
102296: }
102297: }
102298: }
102299: return rc;
102300: }
102301:
102302: /*
102303: ** The first parameter (pDef) is a function implementation. The
102304: ** second parameter (pExpr) is the first argument to this function.
102305: ** If pExpr is a column in a virtual table, then let the virtual
102306: ** table implementation have an opportunity to overload the function.
102307: **
102308: ** This routine is used to allow virtual table implementations to
102309: ** overload MATCH, LIKE, GLOB, and REGEXP operators.
102310: **
102311: ** Return either the pDef argument (indicating no change) or a
102312: ** new FuncDef structure that is marked as ephemeral using the
102313: ** SQLITE_FUNC_EPHEM flag.
102314: */
102315: SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(
102316: sqlite3 *db, /* Database connection for reporting malloc problems */
102317: FuncDef *pDef, /* Function to possibly overload */
102318: int nArg, /* Number of arguments to the function */
102319: Expr *pExpr /* First argument to the function */
102320: ){
102321: Table *pTab;
102322: sqlite3_vtab *pVtab;
102323: sqlite3_module *pMod;
102324: void (*xFunc)(sqlite3_context*,int,sqlite3_value**) = 0;
102325: void *pArg = 0;
102326: FuncDef *pNew;
102327: int rc = 0;
102328: char *zLowerName;
102329: unsigned char *z;
102330:
102331:
102332: /* Check to see the left operand is a column in a virtual table */
102333: if( NEVER(pExpr==0) ) return pDef;
102334: if( pExpr->op!=TK_COLUMN ) return pDef;
102335: pTab = pExpr->pTab;
102336: if( NEVER(pTab==0) ) return pDef;
102337: if( (pTab->tabFlags & TF_Virtual)==0 ) return pDef;
102338: pVtab = sqlite3GetVTable(db, pTab)->pVtab;
102339: assert( pVtab!=0 );
102340: assert( pVtab->pModule!=0 );
102341: pMod = (sqlite3_module *)pVtab->pModule;
102342: if( pMod->xFindFunction==0 ) return pDef;
102343:
102344: /* Call the xFindFunction method on the virtual table implementation
102345: ** to see if the implementation wants to overload this function
102346: */
102347: zLowerName = sqlite3DbStrDup(db, pDef->zName);
102348: if( zLowerName ){
102349: for(z=(unsigned char*)zLowerName; *z; z++){
102350: *z = sqlite3UpperToLower[*z];
102351: }
102352: rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xFunc, &pArg);
102353: sqlite3DbFree(db, zLowerName);
102354: }
102355: if( rc==0 ){
102356: return pDef;
102357: }
102358:
102359: /* Create a new ephemeral function definition for the overloaded
102360: ** function */
102361: pNew = sqlite3DbMallocZero(db, sizeof(*pNew)
102362: + sqlite3Strlen30(pDef->zName) + 1);
102363: if( pNew==0 ){
102364: return pDef;
102365: }
102366: *pNew = *pDef;
102367: pNew->zName = (char *)&pNew[1];
102368: memcpy(pNew->zName, pDef->zName, sqlite3Strlen30(pDef->zName)+1);
102369: pNew->xFunc = xFunc;
102370: pNew->pUserData = pArg;
102371: pNew->flags |= SQLITE_FUNC_EPHEM;
102372: return pNew;
102373: }
102374:
102375: /*
102376: ** Make sure virtual table pTab is contained in the pParse->apVirtualLock[]
102377: ** array so that an OP_VBegin will get generated for it. Add pTab to the
102378: ** array if it is missing. If pTab is already in the array, this routine
102379: ** is a no-op.
102380: */
102381: SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){
102382: Parse *pToplevel = sqlite3ParseToplevel(pParse);
102383: int i, n;
102384: Table **apVtabLock;
102385:
102386: assert( IsVirtual(pTab) );
102387: for(i=0; i<pToplevel->nVtabLock; i++){
102388: if( pTab==pToplevel->apVtabLock[i] ) return;
102389: }
102390: n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]);
102391: apVtabLock = sqlite3_realloc(pToplevel->apVtabLock, n);
102392: if( apVtabLock ){
102393: pToplevel->apVtabLock = apVtabLock;
102394: pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab;
102395: }else{
102396: pToplevel->db->mallocFailed = 1;
102397: }
102398: }
102399:
102400: /*
102401: ** Return the ON CONFLICT resolution mode in effect for the virtual
102402: ** table update operation currently in progress.
102403: **
102404: ** The results of this routine are undefined unless it is called from
102405: ** within an xUpdate method.
102406: */
102407: SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *db){
102408: static const unsigned char aMap[] = {
102409: SQLITE_ROLLBACK, SQLITE_ABORT, SQLITE_FAIL, SQLITE_IGNORE, SQLITE_REPLACE
102410: };
102411: assert( OE_Rollback==1 && OE_Abort==2 && OE_Fail==3 );
102412: assert( OE_Ignore==4 && OE_Replace==5 );
102413: assert( db->vtabOnConflict>=1 && db->vtabOnConflict<=5 );
102414: return (int)aMap[db->vtabOnConflict-1];
102415: }
102416:
102417: /*
102418: ** Call from within the xCreate() or xConnect() methods to provide
102419: ** the SQLite core with additional information about the behavior
102420: ** of the virtual table being implemented.
102421: */
102422: SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){
102423: va_list ap;
102424: int rc = SQLITE_OK;
102425:
102426: sqlite3_mutex_enter(db->mutex);
102427:
102428: va_start(ap, op);
102429: switch( op ){
102430: case SQLITE_VTAB_CONSTRAINT_SUPPORT: {
102431: VtabCtx *p = db->pVtabCtx;
102432: if( !p ){
102433: rc = SQLITE_MISUSE_BKPT;
102434: }else{
102435: assert( p->pTab==0 || (p->pTab->tabFlags & TF_Virtual)!=0 );
102436: p->pVTable->bConstraint = (u8)va_arg(ap, int);
102437: }
102438: break;
102439: }
102440: default:
102441: rc = SQLITE_MISUSE_BKPT;
102442: break;
102443: }
102444: va_end(ap);
102445:
102446: if( rc!=SQLITE_OK ) sqlite3Error(db, rc, 0);
102447: sqlite3_mutex_leave(db->mutex);
102448: return rc;
102449: }
102450:
102451: #endif /* SQLITE_OMIT_VIRTUALTABLE */
102452:
102453: /************** End of vtab.c ************************************************/
102454: /************** Begin file where.c *******************************************/
102455: /*
102456: ** 2001 September 15
102457: **
102458: ** The author disclaims copyright to this source code. In place of
102459: ** a legal notice, here is a blessing:
102460: **
102461: ** May you do good and not evil.
102462: ** May you find forgiveness for yourself and forgive others.
102463: ** May you share freely, never taking more than you give.
102464: **
102465: *************************************************************************
102466: ** This module contains C code that generates VDBE code used to process
102467: ** the WHERE clause of SQL statements. This module is responsible for
102468: ** generating the code that loops through a table looking for applicable
102469: ** rows. Indices are selected and used to speed the search when doing
102470: ** so is applicable. Because this module is responsible for selecting
102471: ** indices, you might also think of this module as the "query optimizer".
102472: */
102473:
102474:
102475: /*
102476: ** Trace output macros
102477: */
102478: #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
1.2.2.1 ! misho 102479: /***/ int sqlite3WhereTrace = 0;
1.2 misho 102480: #endif
1.2.2.1 ! misho 102481: #if defined(SQLITE_DEBUG) \
! 102482: && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE))
1.2 misho 102483: # define WHERETRACE(X) if(sqlite3WhereTrace) sqlite3DebugPrintf X
102484: #else
102485: # define WHERETRACE(X)
102486: #endif
102487:
102488: /* Forward reference
102489: */
102490: typedef struct WhereClause WhereClause;
102491: typedef struct WhereMaskSet WhereMaskSet;
102492: typedef struct WhereOrInfo WhereOrInfo;
102493: typedef struct WhereAndInfo WhereAndInfo;
102494: typedef struct WhereCost WhereCost;
102495:
102496: /*
102497: ** The query generator uses an array of instances of this structure to
102498: ** help it analyze the subexpressions of the WHERE clause. Each WHERE
102499: ** clause subexpression is separated from the others by AND operators,
102500: ** usually, or sometimes subexpressions separated by OR.
102501: **
102502: ** All WhereTerms are collected into a single WhereClause structure.
102503: ** The following identity holds:
102504: **
102505: ** WhereTerm.pWC->a[WhereTerm.idx] == WhereTerm
102506: **
102507: ** When a term is of the form:
102508: **
102509: ** X <op> <expr>
102510: **
102511: ** where X is a column name and <op> is one of certain operators,
102512: ** then WhereTerm.leftCursor and WhereTerm.u.leftColumn record the
102513: ** cursor number and column number for X. WhereTerm.eOperator records
102514: ** the <op> using a bitmask encoding defined by WO_xxx below. The
102515: ** use of a bitmask encoding for the operator allows us to search
102516: ** quickly for terms that match any of several different operators.
102517: **
102518: ** A WhereTerm might also be two or more subterms connected by OR:
102519: **
102520: ** (t1.X <op> <expr>) OR (t1.Y <op> <expr>) OR ....
102521: **
102522: ** In this second case, wtFlag as the TERM_ORINFO set and eOperator==WO_OR
102523: ** and the WhereTerm.u.pOrInfo field points to auxiliary information that
102524: ** is collected about the
102525: **
102526: ** If a term in the WHERE clause does not match either of the two previous
102527: ** categories, then eOperator==0. The WhereTerm.pExpr field is still set
102528: ** to the original subexpression content and wtFlags is set up appropriately
102529: ** but no other fields in the WhereTerm object are meaningful.
102530: **
102531: ** When eOperator!=0, prereqRight and prereqAll record sets of cursor numbers,
102532: ** but they do so indirectly. A single WhereMaskSet structure translates
102533: ** cursor number into bits and the translated bit is stored in the prereq
102534: ** fields. The translation is used in order to maximize the number of
102535: ** bits that will fit in a Bitmask. The VDBE cursor numbers might be
102536: ** spread out over the non-negative integers. For example, the cursor
102537: ** numbers might be 3, 8, 9, 10, 20, 23, 41, and 45. The WhereMaskSet
102538: ** translates these sparse cursor numbers into consecutive integers
102539: ** beginning with 0 in order to make the best possible use of the available
102540: ** bits in the Bitmask. So, in the example above, the cursor numbers
102541: ** would be mapped into integers 0 through 7.
102542: **
102543: ** The number of terms in a join is limited by the number of bits
102544: ** in prereqRight and prereqAll. The default is 64 bits, hence SQLite
102545: ** is only able to process joins with 64 or fewer tables.
102546: */
102547: typedef struct WhereTerm WhereTerm;
102548: struct WhereTerm {
102549: Expr *pExpr; /* Pointer to the subexpression that is this term */
102550: int iParent; /* Disable pWC->a[iParent] when this term disabled */
102551: int leftCursor; /* Cursor number of X in "X <op> <expr>" */
102552: union {
102553: int leftColumn; /* Column number of X in "X <op> <expr>" */
102554: WhereOrInfo *pOrInfo; /* Extra information if eOperator==WO_OR */
102555: WhereAndInfo *pAndInfo; /* Extra information if eOperator==WO_AND */
102556: } u;
102557: u16 eOperator; /* A WO_xx value describing <op> */
102558: u8 wtFlags; /* TERM_xxx bit flags. See below */
102559: u8 nChild; /* Number of children that must disable us */
102560: WhereClause *pWC; /* The clause this term is part of */
102561: Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */
102562: Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */
102563: };
102564:
102565: /*
102566: ** Allowed values of WhereTerm.wtFlags
102567: */
102568: #define TERM_DYNAMIC 0x01 /* Need to call sqlite3ExprDelete(db, pExpr) */
102569: #define TERM_VIRTUAL 0x02 /* Added by the optimizer. Do not code */
102570: #define TERM_CODED 0x04 /* This term is already coded */
102571: #define TERM_COPIED 0x08 /* Has a child */
102572: #define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */
102573: #define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */
102574: #define TERM_OR_OK 0x40 /* Used during OR-clause processing */
102575: #ifdef SQLITE_ENABLE_STAT3
102576: # define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */
102577: #else
102578: # define TERM_VNULL 0x00 /* Disabled if not using stat3 */
102579: #endif
102580:
102581: /*
102582: ** An instance of the following structure holds all information about a
102583: ** WHERE clause. Mostly this is a container for one or more WhereTerms.
102584: **
102585: ** Explanation of pOuter: For a WHERE clause of the form
102586: **
102587: ** a AND ((b AND c) OR (d AND e)) AND f
102588: **
102589: ** There are separate WhereClause objects for the whole clause and for
102590: ** the subclauses "(b AND c)" and "(d AND e)". The pOuter field of the
102591: ** subclauses points to the WhereClause object for the whole clause.
102592: */
102593: struct WhereClause {
102594: Parse *pParse; /* The parser context */
102595: WhereMaskSet *pMaskSet; /* Mapping of table cursor numbers to bitmasks */
102596: Bitmask vmask; /* Bitmask identifying virtual table cursors */
102597: WhereClause *pOuter; /* Outer conjunction */
102598: u8 op; /* Split operator. TK_AND or TK_OR */
102599: u16 wctrlFlags; /* Might include WHERE_AND_ONLY */
102600: int nTerm; /* Number of terms */
102601: int nSlot; /* Number of entries in a[] */
102602: WhereTerm *a; /* Each a[] describes a term of the WHERE cluase */
102603: #if defined(SQLITE_SMALL_STACK)
102604: WhereTerm aStatic[1]; /* Initial static space for a[] */
102605: #else
102606: WhereTerm aStatic[8]; /* Initial static space for a[] */
102607: #endif
102608: };
102609:
102610: /*
102611: ** A WhereTerm with eOperator==WO_OR has its u.pOrInfo pointer set to
102612: ** a dynamically allocated instance of the following structure.
102613: */
102614: struct WhereOrInfo {
102615: WhereClause wc; /* Decomposition into subterms */
102616: Bitmask indexable; /* Bitmask of all indexable tables in the clause */
102617: };
102618:
102619: /*
102620: ** A WhereTerm with eOperator==WO_AND has its u.pAndInfo pointer set to
102621: ** a dynamically allocated instance of the following structure.
102622: */
102623: struct WhereAndInfo {
102624: WhereClause wc; /* The subexpression broken out */
102625: };
102626:
102627: /*
102628: ** An instance of the following structure keeps track of a mapping
102629: ** between VDBE cursor numbers and bits of the bitmasks in WhereTerm.
102630: **
102631: ** The VDBE cursor numbers are small integers contained in
102632: ** SrcList_item.iCursor and Expr.iTable fields. For any given WHERE
102633: ** clause, the cursor numbers might not begin with 0 and they might
102634: ** contain gaps in the numbering sequence. But we want to make maximum
102635: ** use of the bits in our bitmasks. This structure provides a mapping
102636: ** from the sparse cursor numbers into consecutive integers beginning
102637: ** with 0.
102638: **
102639: ** If WhereMaskSet.ix[A]==B it means that The A-th bit of a Bitmask
102640: ** corresponds VDBE cursor number B. The A-th bit of a bitmask is 1<<A.
102641: **
102642: ** For example, if the WHERE clause expression used these VDBE
102643: ** cursors: 4, 5, 8, 29, 57, 73. Then the WhereMaskSet structure
102644: ** would map those cursor numbers into bits 0 through 5.
102645: **
102646: ** Note that the mapping is not necessarily ordered. In the example
102647: ** above, the mapping might go like this: 4->3, 5->1, 8->2, 29->0,
102648: ** 57->5, 73->4. Or one of 719 other combinations might be used. It
102649: ** does not really matter. What is important is that sparse cursor
102650: ** numbers all get mapped into bit numbers that begin with 0 and contain
102651: ** no gaps.
102652: */
102653: struct WhereMaskSet {
102654: int n; /* Number of assigned cursor values */
102655: int ix[BMS]; /* Cursor assigned to each bit */
102656: };
102657:
102658: /*
102659: ** A WhereCost object records a lookup strategy and the estimated
102660: ** cost of pursuing that strategy.
102661: */
102662: struct WhereCost {
102663: WherePlan plan; /* The lookup strategy */
102664: double rCost; /* Overall cost of pursuing this search strategy */
102665: Bitmask used; /* Bitmask of cursors used by this plan */
102666: };
102667:
102668: /*
102669: ** Bitmasks for the operators that indices are able to exploit. An
102670: ** OR-ed combination of these values can be used when searching for
102671: ** terms in the where clause.
102672: */
102673: #define WO_IN 0x001
102674: #define WO_EQ 0x002
102675: #define WO_LT (WO_EQ<<(TK_LT-TK_EQ))
102676: #define WO_LE (WO_EQ<<(TK_LE-TK_EQ))
102677: #define WO_GT (WO_EQ<<(TK_GT-TK_EQ))
102678: #define WO_GE (WO_EQ<<(TK_GE-TK_EQ))
102679: #define WO_MATCH 0x040
102680: #define WO_ISNULL 0x080
102681: #define WO_OR 0x100 /* Two or more OR-connected terms */
102682: #define WO_AND 0x200 /* Two or more AND-connected terms */
102683: #define WO_NOOP 0x800 /* This term does not restrict search space */
102684:
102685: #define WO_ALL 0xfff /* Mask of all possible WO_* values */
102686: #define WO_SINGLE 0x0ff /* Mask of all non-compound WO_* values */
102687:
102688: /*
102689: ** Value for wsFlags returned by bestIndex() and stored in
102690: ** WhereLevel.wsFlags. These flags determine which search
102691: ** strategies are appropriate.
102692: **
102693: ** The least significant 12 bits is reserved as a mask for WO_ values above.
102694: ** The WhereLevel.wsFlags field is usually set to WO_IN|WO_EQ|WO_ISNULL.
102695: ** But if the table is the right table of a left join, WhereLevel.wsFlags
102696: ** is set to WO_IN|WO_EQ. The WhereLevel.wsFlags field can then be used as
102697: ** the "op" parameter to findTerm when we are resolving equality constraints.
102698: ** ISNULL constraints will then not be used on the right table of a left
102699: ** join. Tickets #2177 and #2189.
102700: */
102701: #define WHERE_ROWID_EQ 0x00001000 /* rowid=EXPR or rowid IN (...) */
102702: #define WHERE_ROWID_RANGE 0x00002000 /* rowid<EXPR and/or rowid>EXPR */
102703: #define WHERE_COLUMN_EQ 0x00010000 /* x=EXPR or x IN (...) or x IS NULL */
102704: #define WHERE_COLUMN_RANGE 0x00020000 /* x<EXPR and/or x>EXPR */
102705: #define WHERE_COLUMN_IN 0x00040000 /* x IN (...) */
102706: #define WHERE_COLUMN_NULL 0x00080000 /* x IS NULL */
102707: #define WHERE_INDEXED 0x000f0000 /* Anything that uses an index */
102708: #define WHERE_NOT_FULLSCAN 0x100f3000 /* Does not do a full table scan */
102709: #define WHERE_IN_ABLE 0x000f1000 /* Able to support an IN operator */
102710: #define WHERE_TOP_LIMIT 0x00100000 /* x<EXPR or x<=EXPR constraint */
102711: #define WHERE_BTM_LIMIT 0x00200000 /* x>EXPR or x>=EXPR constraint */
102712: #define WHERE_BOTH_LIMIT 0x00300000 /* Both x>EXPR and x<EXPR */
1.2.2.1 ! misho 102713: #define WHERE_IDX_ONLY 0x00400000 /* Use index only - omit table */
! 102714: #define WHERE_ORDERED 0x00800000 /* Output will appear in correct order */
! 102715: #define WHERE_REVERSE 0x01000000 /* Scan in reverse order */
! 102716: #define WHERE_UNIQUE 0x02000000 /* Selects no more than one row */
! 102717: #define WHERE_ALL_UNIQUE 0x04000000 /* This and all prior have one row */
1.2 misho 102718: #define WHERE_VIRTUALTABLE 0x08000000 /* Use virtual-table processing */
102719: #define WHERE_MULTI_OR 0x10000000 /* OR using multiple indices */
102720: #define WHERE_TEMP_INDEX 0x20000000 /* Uses an ephemeral index */
102721: #define WHERE_DISTINCT 0x40000000 /* Correct order for DISTINCT */
1.2.2.1 ! misho 102722: #define WHERE_COVER_SCAN 0x80000000 /* Full scan of a covering index */
! 102723:
! 102724: /*
! 102725: ** This module contains many separate subroutines that work together to
! 102726: ** find the best indices to use for accessing a particular table in a query.
! 102727: ** An instance of the following structure holds context information about the
! 102728: ** index search so that it can be more easily passed between the various
! 102729: ** routines.
! 102730: */
! 102731: typedef struct WhereBestIdx WhereBestIdx;
! 102732: struct WhereBestIdx {
! 102733: Parse *pParse; /* Parser context */
! 102734: WhereClause *pWC; /* The WHERE clause */
! 102735: struct SrcList_item *pSrc; /* The FROM clause term to search */
! 102736: Bitmask notReady; /* Mask of cursors not available */
! 102737: Bitmask notValid; /* Cursors not available for any purpose */
! 102738: ExprList *pOrderBy; /* The ORDER BY clause */
! 102739: ExprList *pDistinct; /* The select-list if query is DISTINCT */
! 102740: sqlite3_index_info **ppIdxInfo; /* Index information passed to xBestIndex */
! 102741: int i, n; /* Which loop is being coded; # of loops */
! 102742: WhereLevel *aLevel; /* Info about outer loops */
! 102743: WhereCost cost; /* Lowest cost query plan */
! 102744: };
! 102745:
! 102746: /*
! 102747: ** Return TRUE if the probe cost is less than the baseline cost
! 102748: */
! 102749: static int compareCost(const WhereCost *pProbe, const WhereCost *pBaseline){
! 102750: if( pProbe->rCost<pBaseline->rCost ) return 1;
! 102751: if( pProbe->rCost>pBaseline->rCost ) return 0;
! 102752: if( pProbe->plan.nOBSat>pBaseline->plan.nOBSat ) return 1;
! 102753: if( pProbe->plan.nRow<pBaseline->plan.nRow ) return 1;
! 102754: return 0;
! 102755: }
1.2 misho 102756:
102757: /*
102758: ** Initialize a preallocated WhereClause structure.
102759: */
102760: static void whereClauseInit(
102761: WhereClause *pWC, /* The WhereClause to be initialized */
102762: Parse *pParse, /* The parsing context */
102763: WhereMaskSet *pMaskSet, /* Mapping from table cursor numbers to bitmasks */
102764: u16 wctrlFlags /* Might include WHERE_AND_ONLY */
102765: ){
102766: pWC->pParse = pParse;
102767: pWC->pMaskSet = pMaskSet;
102768: pWC->pOuter = 0;
102769: pWC->nTerm = 0;
102770: pWC->nSlot = ArraySize(pWC->aStatic);
102771: pWC->a = pWC->aStatic;
102772: pWC->vmask = 0;
102773: pWC->wctrlFlags = wctrlFlags;
102774: }
102775:
102776: /* Forward reference */
102777: static void whereClauseClear(WhereClause*);
102778:
102779: /*
102780: ** Deallocate all memory associated with a WhereOrInfo object.
102781: */
102782: static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){
102783: whereClauseClear(&p->wc);
102784: sqlite3DbFree(db, p);
102785: }
102786:
102787: /*
102788: ** Deallocate all memory associated with a WhereAndInfo object.
102789: */
102790: static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){
102791: whereClauseClear(&p->wc);
102792: sqlite3DbFree(db, p);
102793: }
102794:
102795: /*
102796: ** Deallocate a WhereClause structure. The WhereClause structure
102797: ** itself is not freed. This routine is the inverse of whereClauseInit().
102798: */
102799: static void whereClauseClear(WhereClause *pWC){
102800: int i;
102801: WhereTerm *a;
102802: sqlite3 *db = pWC->pParse->db;
102803: for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){
102804: if( a->wtFlags & TERM_DYNAMIC ){
102805: sqlite3ExprDelete(db, a->pExpr);
102806: }
102807: if( a->wtFlags & TERM_ORINFO ){
102808: whereOrInfoDelete(db, a->u.pOrInfo);
102809: }else if( a->wtFlags & TERM_ANDINFO ){
102810: whereAndInfoDelete(db, a->u.pAndInfo);
102811: }
102812: }
102813: if( pWC->a!=pWC->aStatic ){
102814: sqlite3DbFree(db, pWC->a);
102815: }
102816: }
102817:
102818: /*
102819: ** Add a single new WhereTerm entry to the WhereClause object pWC.
102820: ** The new WhereTerm object is constructed from Expr p and with wtFlags.
102821: ** The index in pWC->a[] of the new WhereTerm is returned on success.
102822: ** 0 is returned if the new WhereTerm could not be added due to a memory
102823: ** allocation error. The memory allocation failure will be recorded in
102824: ** the db->mallocFailed flag so that higher-level functions can detect it.
102825: **
102826: ** This routine will increase the size of the pWC->a[] array as necessary.
102827: **
102828: ** If the wtFlags argument includes TERM_DYNAMIC, then responsibility
102829: ** for freeing the expression p is assumed by the WhereClause object pWC.
102830: ** This is true even if this routine fails to allocate a new WhereTerm.
102831: **
102832: ** WARNING: This routine might reallocate the space used to store
102833: ** WhereTerms. All pointers to WhereTerms should be invalidated after
102834: ** calling this routine. Such pointers may be reinitialized by referencing
102835: ** the pWC->a[] array.
102836: */
102837: static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){
102838: WhereTerm *pTerm;
102839: int idx;
102840: testcase( wtFlags & TERM_VIRTUAL ); /* EV: R-00211-15100 */
102841: if( pWC->nTerm>=pWC->nSlot ){
102842: WhereTerm *pOld = pWC->a;
102843: sqlite3 *db = pWC->pParse->db;
102844: pWC->a = sqlite3DbMallocRaw(db, sizeof(pWC->a[0])*pWC->nSlot*2 );
102845: if( pWC->a==0 ){
102846: if( wtFlags & TERM_DYNAMIC ){
102847: sqlite3ExprDelete(db, p);
102848: }
102849: pWC->a = pOld;
102850: return 0;
102851: }
102852: memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm);
102853: if( pOld!=pWC->aStatic ){
102854: sqlite3DbFree(db, pOld);
102855: }
102856: pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]);
102857: }
102858: pTerm = &pWC->a[idx = pWC->nTerm++];
1.2.2.1 ! misho 102859: pTerm->pExpr = sqlite3ExprSkipCollate(p);
1.2 misho 102860: pTerm->wtFlags = wtFlags;
102861: pTerm->pWC = pWC;
102862: pTerm->iParent = -1;
102863: return idx;
102864: }
102865:
102866: /*
102867: ** This routine identifies subexpressions in the WHERE clause where
102868: ** each subexpression is separated by the AND operator or some other
102869: ** operator specified in the op parameter. The WhereClause structure
102870: ** is filled with pointers to subexpressions. For example:
102871: **
102872: ** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22)
102873: ** \________/ \_______________/ \________________/
102874: ** slot[0] slot[1] slot[2]
102875: **
102876: ** The original WHERE clause in pExpr is unaltered. All this routine
102877: ** does is make slot[] entries point to substructure within pExpr.
102878: **
102879: ** In the previous sentence and in the diagram, "slot[]" refers to
102880: ** the WhereClause.a[] array. The slot[] array grows as needed to contain
102881: ** all terms of the WHERE clause.
102882: */
102883: static void whereSplit(WhereClause *pWC, Expr *pExpr, int op){
102884: pWC->op = (u8)op;
102885: if( pExpr==0 ) return;
102886: if( pExpr->op!=op ){
102887: whereClauseInsert(pWC, pExpr, 0);
102888: }else{
102889: whereSplit(pWC, pExpr->pLeft, op);
102890: whereSplit(pWC, pExpr->pRight, op);
102891: }
102892: }
102893:
102894: /*
102895: ** Initialize an expression mask set (a WhereMaskSet object)
102896: */
102897: #define initMaskSet(P) memset(P, 0, sizeof(*P))
102898:
102899: /*
102900: ** Return the bitmask for the given cursor number. Return 0 if
102901: ** iCursor is not in the set.
102902: */
102903: static Bitmask getMask(WhereMaskSet *pMaskSet, int iCursor){
102904: int i;
102905: assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 );
102906: for(i=0; i<pMaskSet->n; i++){
102907: if( pMaskSet->ix[i]==iCursor ){
102908: return ((Bitmask)1)<<i;
102909: }
102910: }
102911: return 0;
102912: }
102913:
102914: /*
102915: ** Create a new mask for cursor iCursor.
102916: **
102917: ** There is one cursor per table in the FROM clause. The number of
102918: ** tables in the FROM clause is limited by a test early in the
102919: ** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[]
102920: ** array will never overflow.
102921: */
102922: static void createMask(WhereMaskSet *pMaskSet, int iCursor){
102923: assert( pMaskSet->n < ArraySize(pMaskSet->ix) );
102924: pMaskSet->ix[pMaskSet->n++] = iCursor;
102925: }
102926:
102927: /*
102928: ** This routine walks (recursively) an expression tree and generates
102929: ** a bitmask indicating which tables are used in that expression
102930: ** tree.
102931: **
102932: ** In order for this routine to work, the calling function must have
102933: ** previously invoked sqlite3ResolveExprNames() on the expression. See
102934: ** the header comment on that routine for additional information.
102935: ** The sqlite3ResolveExprNames() routines looks for column names and
102936: ** sets their opcodes to TK_COLUMN and their Expr.iTable fields to
102937: ** the VDBE cursor number of the table. This routine just has to
102938: ** translate the cursor numbers into bitmask values and OR all
102939: ** the bitmasks together.
102940: */
102941: static Bitmask exprListTableUsage(WhereMaskSet*, ExprList*);
102942: static Bitmask exprSelectTableUsage(WhereMaskSet*, Select*);
102943: static Bitmask exprTableUsage(WhereMaskSet *pMaskSet, Expr *p){
102944: Bitmask mask = 0;
102945: if( p==0 ) return 0;
102946: if( p->op==TK_COLUMN ){
102947: mask = getMask(pMaskSet, p->iTable);
102948: return mask;
102949: }
102950: mask = exprTableUsage(pMaskSet, p->pRight);
102951: mask |= exprTableUsage(pMaskSet, p->pLeft);
102952: if( ExprHasProperty(p, EP_xIsSelect) ){
102953: mask |= exprSelectTableUsage(pMaskSet, p->x.pSelect);
102954: }else{
102955: mask |= exprListTableUsage(pMaskSet, p->x.pList);
102956: }
102957: return mask;
102958: }
102959: static Bitmask exprListTableUsage(WhereMaskSet *pMaskSet, ExprList *pList){
102960: int i;
102961: Bitmask mask = 0;
102962: if( pList ){
102963: for(i=0; i<pList->nExpr; i++){
102964: mask |= exprTableUsage(pMaskSet, pList->a[i].pExpr);
102965: }
102966: }
102967: return mask;
102968: }
102969: static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){
102970: Bitmask mask = 0;
102971: while( pS ){
102972: SrcList *pSrc = pS->pSrc;
102973: mask |= exprListTableUsage(pMaskSet, pS->pEList);
102974: mask |= exprListTableUsage(pMaskSet, pS->pGroupBy);
102975: mask |= exprListTableUsage(pMaskSet, pS->pOrderBy);
102976: mask |= exprTableUsage(pMaskSet, pS->pWhere);
102977: mask |= exprTableUsage(pMaskSet, pS->pHaving);
102978: if( ALWAYS(pSrc!=0) ){
102979: int i;
102980: for(i=0; i<pSrc->nSrc; i++){
102981: mask |= exprSelectTableUsage(pMaskSet, pSrc->a[i].pSelect);
102982: mask |= exprTableUsage(pMaskSet, pSrc->a[i].pOn);
102983: }
102984: }
102985: pS = pS->pPrior;
102986: }
102987: return mask;
102988: }
102989:
102990: /*
102991: ** Return TRUE if the given operator is one of the operators that is
102992: ** allowed for an indexable WHERE clause term. The allowed operators are
102993: ** "=", "<", ">", "<=", ">=", and "IN".
102994: **
102995: ** IMPLEMENTATION-OF: R-59926-26393 To be usable by an index a term must be
102996: ** of one of the following forms: column = expression column > expression
102997: ** column >= expression column < expression column <= expression
102998: ** expression = column expression > column expression >= column
102999: ** expression < column expression <= column column IN
103000: ** (expression-list) column IN (subquery) column IS NULL
103001: */
103002: static int allowedOp(int op){
103003: assert( TK_GT>TK_EQ && TK_GT<TK_GE );
103004: assert( TK_LT>TK_EQ && TK_LT<TK_GE );
103005: assert( TK_LE>TK_EQ && TK_LE<TK_GE );
103006: assert( TK_GE==TK_EQ+4 );
103007: return op==TK_IN || (op>=TK_EQ && op<=TK_GE) || op==TK_ISNULL;
103008: }
103009:
103010: /*
103011: ** Swap two objects of type TYPE.
103012: */
103013: #define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;}
103014:
103015: /*
103016: ** Commute a comparison operator. Expressions of the form "X op Y"
103017: ** are converted into "Y op X".
103018: **
1.2.2.1 ! misho 103019: ** If left/right precendence rules come into play when determining the
! 103020: ** collating
1.2 misho 103021: ** side of the comparison, it remains associated with the same side after
103022: ** the commutation. So "Y collate NOCASE op X" becomes
1.2.2.1 ! misho 103023: ** "X op Y". This is because any collation sequence on
1.2 misho 103024: ** the left hand side of a comparison overrides any collation sequence
1.2.2.1 ! misho 103025: ** attached to the right. For the same reason the EP_Collate flag
1.2 misho 103026: ** is not commuted.
103027: */
103028: static void exprCommute(Parse *pParse, Expr *pExpr){
1.2.2.1 ! misho 103029: u16 expRight = (pExpr->pRight->flags & EP_Collate);
! 103030: u16 expLeft = (pExpr->pLeft->flags & EP_Collate);
1.2 misho 103031: assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN );
1.2.2.1 ! misho 103032: if( expRight==expLeft ){
! 103033: /* Either X and Y both have COLLATE operator or neither do */
! 103034: if( expRight ){
! 103035: /* Both X and Y have COLLATE operators. Make sure X is always
! 103036: ** used by clearing the EP_Collate flag from Y. */
! 103037: pExpr->pRight->flags &= ~EP_Collate;
! 103038: }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){
! 103039: /* Neither X nor Y have COLLATE operators, but X has a non-default
! 103040: ** collating sequence. So add the EP_Collate marker on X to cause
! 103041: ** it to be searched first. */
! 103042: pExpr->pLeft->flags |= EP_Collate;
! 103043: }
! 103044: }
1.2 misho 103045: SWAP(Expr*,pExpr->pRight,pExpr->pLeft);
103046: if( pExpr->op>=TK_GT ){
103047: assert( TK_LT==TK_GT+2 );
103048: assert( TK_GE==TK_LE+2 );
103049: assert( TK_GT>TK_EQ );
103050: assert( TK_GT<TK_LE );
103051: assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE );
103052: pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT;
103053: }
103054: }
103055:
103056: /*
103057: ** Translate from TK_xx operator to WO_xx bitmask.
103058: */
103059: static u16 operatorMask(int op){
103060: u16 c;
103061: assert( allowedOp(op) );
103062: if( op==TK_IN ){
103063: c = WO_IN;
103064: }else if( op==TK_ISNULL ){
103065: c = WO_ISNULL;
103066: }else{
103067: assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff );
103068: c = (u16)(WO_EQ<<(op-TK_EQ));
103069: }
103070: assert( op!=TK_ISNULL || c==WO_ISNULL );
103071: assert( op!=TK_IN || c==WO_IN );
103072: assert( op!=TK_EQ || c==WO_EQ );
103073: assert( op!=TK_LT || c==WO_LT );
103074: assert( op!=TK_LE || c==WO_LE );
103075: assert( op!=TK_GT || c==WO_GT );
103076: assert( op!=TK_GE || c==WO_GE );
103077: return c;
103078: }
103079:
103080: /*
103081: ** Search for a term in the WHERE clause that is of the form "X <op> <expr>"
103082: ** where X is a reference to the iColumn of table iCur and <op> is one of
103083: ** the WO_xx operator codes specified by the op parameter.
103084: ** Return a pointer to the term. Return 0 if not found.
103085: */
103086: static WhereTerm *findTerm(
103087: WhereClause *pWC, /* The WHERE clause to be searched */
103088: int iCur, /* Cursor number of LHS */
103089: int iColumn, /* Column number of LHS */
103090: Bitmask notReady, /* RHS must not overlap with this mask */
103091: u32 op, /* Mask of WO_xx values describing operator */
103092: Index *pIdx /* Must be compatible with this index, if not NULL */
103093: ){
103094: WhereTerm *pTerm;
103095: int k;
103096: assert( iCur>=0 );
103097: op &= WO_ALL;
103098: for(; pWC; pWC=pWC->pOuter){
103099: for(pTerm=pWC->a, k=pWC->nTerm; k; k--, pTerm++){
103100: if( pTerm->leftCursor==iCur
103101: && (pTerm->prereqRight & notReady)==0
103102: && pTerm->u.leftColumn==iColumn
103103: && (pTerm->eOperator & op)!=0
103104: ){
103105: if( iColumn>=0 && pIdx && pTerm->eOperator!=WO_ISNULL ){
103106: Expr *pX = pTerm->pExpr;
103107: CollSeq *pColl;
103108: char idxaff;
103109: int j;
103110: Parse *pParse = pWC->pParse;
103111:
103112: idxaff = pIdx->pTable->aCol[iColumn].affinity;
103113: if( !sqlite3IndexAffinityOk(pX, idxaff) ) continue;
103114:
103115: /* Figure out the collation sequence required from an index for
103116: ** it to be useful for optimising expression pX. Store this
103117: ** value in variable pColl.
103118: */
103119: assert(pX->pLeft);
103120: pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
1.2.2.1 ! misho 103121: if( pColl==0 ) pColl = pParse->db->pDfltColl;
1.2 misho 103122:
103123: for(j=0; pIdx->aiColumn[j]!=iColumn; j++){
103124: if( NEVER(j>=pIdx->nColumn) ) return 0;
103125: }
1.2.2.1 ! misho 103126: if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue;
1.2 misho 103127: }
103128: return pTerm;
103129: }
103130: }
103131: }
103132: return 0;
103133: }
103134:
103135: /* Forward reference */
103136: static void exprAnalyze(SrcList*, WhereClause*, int);
103137:
103138: /*
103139: ** Call exprAnalyze on all terms in a WHERE clause.
103140: **
103141: **
103142: */
103143: static void exprAnalyzeAll(
103144: SrcList *pTabList, /* the FROM clause */
103145: WhereClause *pWC /* the WHERE clause to be analyzed */
103146: ){
103147: int i;
103148: for(i=pWC->nTerm-1; i>=0; i--){
103149: exprAnalyze(pTabList, pWC, i);
103150: }
103151: }
103152:
103153: #ifndef SQLITE_OMIT_LIKE_OPTIMIZATION
103154: /*
103155: ** Check to see if the given expression is a LIKE or GLOB operator that
103156: ** can be optimized using inequality constraints. Return TRUE if it is
103157: ** so and false if not.
103158: **
103159: ** In order for the operator to be optimizible, the RHS must be a string
103160: ** literal that does not begin with a wildcard.
103161: */
103162: static int isLikeOrGlob(
103163: Parse *pParse, /* Parsing and code generating context */
103164: Expr *pExpr, /* Test this expression */
103165: Expr **ppPrefix, /* Pointer to TK_STRING expression with pattern prefix */
103166: int *pisComplete, /* True if the only wildcard is % in the last character */
103167: int *pnoCase /* True if uppercase is equivalent to lowercase */
103168: ){
103169: const char *z = 0; /* String on RHS of LIKE operator */
103170: Expr *pRight, *pLeft; /* Right and left size of LIKE operator */
103171: ExprList *pList; /* List of operands to the LIKE operator */
103172: int c; /* One character in z[] */
103173: int cnt; /* Number of non-wildcard prefix characters */
103174: char wc[3]; /* Wildcard characters */
103175: sqlite3 *db = pParse->db; /* Database connection */
103176: sqlite3_value *pVal = 0;
103177: int op; /* Opcode of pRight */
103178:
103179: if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){
103180: return 0;
103181: }
103182: #ifdef SQLITE_EBCDIC
103183: if( *pnoCase ) return 0;
103184: #endif
103185: pList = pExpr->x.pList;
103186: pLeft = pList->a[1].pExpr;
1.2.2.1 ! misho 103187: if( pLeft->op!=TK_COLUMN
! 103188: || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT
! 103189: || IsVirtual(pLeft->pTab)
! 103190: ){
1.2 misho 103191: /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must
103192: ** be the name of an indexed column with TEXT affinity. */
103193: return 0;
103194: }
103195: assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */
103196:
103197: pRight = pList->a[0].pExpr;
103198: op = pRight->op;
103199: if( op==TK_REGISTER ){
103200: op = pRight->op2;
103201: }
103202: if( op==TK_VARIABLE ){
103203: Vdbe *pReprepare = pParse->pReprepare;
103204: int iCol = pRight->iColumn;
103205: pVal = sqlite3VdbeGetValue(pReprepare, iCol, SQLITE_AFF_NONE);
103206: if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){
103207: z = (char *)sqlite3_value_text(pVal);
103208: }
103209: sqlite3VdbeSetVarmask(pParse->pVdbe, iCol);
103210: assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER );
103211: }else if( op==TK_STRING ){
103212: z = pRight->u.zToken;
103213: }
103214: if( z ){
103215: cnt = 0;
103216: while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){
103217: cnt++;
103218: }
103219: if( cnt!=0 && 255!=(u8)z[cnt-1] ){
103220: Expr *pPrefix;
103221: *pisComplete = c==wc[0] && z[cnt+1]==0;
103222: pPrefix = sqlite3Expr(db, TK_STRING, z);
103223: if( pPrefix ) pPrefix->u.zToken[cnt] = 0;
103224: *ppPrefix = pPrefix;
103225: if( op==TK_VARIABLE ){
103226: Vdbe *v = pParse->pVdbe;
103227: sqlite3VdbeSetVarmask(v, pRight->iColumn);
103228: if( *pisComplete && pRight->u.zToken[1] ){
103229: /* If the rhs of the LIKE expression is a variable, and the current
103230: ** value of the variable means there is no need to invoke the LIKE
103231: ** function, then no OP_Variable will be added to the program.
103232: ** This causes problems for the sqlite3_bind_parameter_name()
103233: ** API. To workaround them, add a dummy OP_Variable here.
103234: */
103235: int r1 = sqlite3GetTempReg(pParse);
103236: sqlite3ExprCodeTarget(pParse, pRight, r1);
103237: sqlite3VdbeChangeP3(v, sqlite3VdbeCurrentAddr(v)-1, 0);
103238: sqlite3ReleaseTempReg(pParse, r1);
103239: }
103240: }
103241: }else{
103242: z = 0;
103243: }
103244: }
103245:
103246: sqlite3ValueFree(pVal);
103247: return (z!=0);
103248: }
103249: #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
103250:
103251:
103252: #ifndef SQLITE_OMIT_VIRTUALTABLE
103253: /*
103254: ** Check to see if the given expression is of the form
103255: **
103256: ** column MATCH expr
103257: **
103258: ** If it is then return TRUE. If not, return FALSE.
103259: */
103260: static int isMatchOfColumn(
103261: Expr *pExpr /* Test this expression */
103262: ){
103263: ExprList *pList;
103264:
103265: if( pExpr->op!=TK_FUNCTION ){
103266: return 0;
103267: }
103268: if( sqlite3StrICmp(pExpr->u.zToken,"match")!=0 ){
103269: return 0;
103270: }
103271: pList = pExpr->x.pList;
103272: if( pList->nExpr!=2 ){
103273: return 0;
103274: }
103275: if( pList->a[1].pExpr->op != TK_COLUMN ){
103276: return 0;
103277: }
103278: return 1;
103279: }
103280: #endif /* SQLITE_OMIT_VIRTUALTABLE */
103281:
103282: /*
103283: ** If the pBase expression originated in the ON or USING clause of
103284: ** a join, then transfer the appropriate markings over to derived.
103285: */
103286: static void transferJoinMarkings(Expr *pDerived, Expr *pBase){
103287: pDerived->flags |= pBase->flags & EP_FromJoin;
103288: pDerived->iRightJoinTable = pBase->iRightJoinTable;
103289: }
103290:
103291: #if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
103292: /*
103293: ** Analyze a term that consists of two or more OR-connected
103294: ** subterms. So in:
103295: **
103296: ** ... WHERE (a=5) AND (b=7 OR c=9 OR d=13) AND (d=13)
103297: ** ^^^^^^^^^^^^^^^^^^^^
103298: **
103299: ** This routine analyzes terms such as the middle term in the above example.
103300: ** A WhereOrTerm object is computed and attached to the term under
103301: ** analysis, regardless of the outcome of the analysis. Hence:
103302: **
103303: ** WhereTerm.wtFlags |= TERM_ORINFO
103304: ** WhereTerm.u.pOrInfo = a dynamically allocated WhereOrTerm object
103305: **
103306: ** The term being analyzed must have two or more of OR-connected subterms.
103307: ** A single subterm might be a set of AND-connected sub-subterms.
103308: ** Examples of terms under analysis:
103309: **
103310: ** (A) t1.x=t2.y OR t1.x=t2.z OR t1.y=15 OR t1.z=t3.a+5
103311: ** (B) x=expr1 OR expr2=x OR x=expr3
103312: ** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15)
103313: ** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*')
103314: ** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6)
103315: **
103316: ** CASE 1:
103317: **
103318: ** If all subterms are of the form T.C=expr for some single column of C
103319: ** a single table T (as shown in example B above) then create a new virtual
103320: ** term that is an equivalent IN expression. In other words, if the term
103321: ** being analyzed is:
103322: **
103323: ** x = expr1 OR expr2 = x OR x = expr3
103324: **
103325: ** then create a new virtual term like this:
103326: **
103327: ** x IN (expr1,expr2,expr3)
103328: **
103329: ** CASE 2:
103330: **
103331: ** If all subterms are indexable by a single table T, then set
103332: **
103333: ** WhereTerm.eOperator = WO_OR
103334: ** WhereTerm.u.pOrInfo->indexable |= the cursor number for table T
103335: **
103336: ** A subterm is "indexable" if it is of the form
103337: ** "T.C <op> <expr>" where C is any column of table T and
103338: ** <op> is one of "=", "<", "<=", ">", ">=", "IS NULL", or "IN".
103339: ** A subterm is also indexable if it is an AND of two or more
103340: ** subsubterms at least one of which is indexable. Indexable AND
103341: ** subterms have their eOperator set to WO_AND and they have
103342: ** u.pAndInfo set to a dynamically allocated WhereAndTerm object.
103343: **
103344: ** From another point of view, "indexable" means that the subterm could
103345: ** potentially be used with an index if an appropriate index exists.
103346: ** This analysis does not consider whether or not the index exists; that
103347: ** is something the bestIndex() routine will determine. This analysis
103348: ** only looks at whether subterms appropriate for indexing exist.
103349: **
103350: ** All examples A through E above all satisfy case 2. But if a term
103351: ** also statisfies case 1 (such as B) we know that the optimizer will
103352: ** always prefer case 1, so in that case we pretend that case 2 is not
103353: ** satisfied.
103354: **
103355: ** It might be the case that multiple tables are indexable. For example,
103356: ** (E) above is indexable on tables P, Q, and R.
103357: **
103358: ** Terms that satisfy case 2 are candidates for lookup by using
103359: ** separate indices to find rowids for each subterm and composing
103360: ** the union of all rowids using a RowSet object. This is similar
103361: ** to "bitmap indices" in other database engines.
103362: **
103363: ** OTHERWISE:
103364: **
103365: ** If neither case 1 nor case 2 apply, then leave the eOperator set to
103366: ** zero. This term is not useful for search.
103367: */
103368: static void exprAnalyzeOrTerm(
103369: SrcList *pSrc, /* the FROM clause */
103370: WhereClause *pWC, /* the complete WHERE clause */
103371: int idxTerm /* Index of the OR-term to be analyzed */
103372: ){
103373: Parse *pParse = pWC->pParse; /* Parser context */
103374: sqlite3 *db = pParse->db; /* Database connection */
103375: WhereTerm *pTerm = &pWC->a[idxTerm]; /* The term to be analyzed */
103376: Expr *pExpr = pTerm->pExpr; /* The expression of the term */
103377: WhereMaskSet *pMaskSet = pWC->pMaskSet; /* Table use masks */
103378: int i; /* Loop counters */
103379: WhereClause *pOrWc; /* Breakup of pTerm into subterms */
103380: WhereTerm *pOrTerm; /* A Sub-term within the pOrWc */
103381: WhereOrInfo *pOrInfo; /* Additional information associated with pTerm */
103382: Bitmask chngToIN; /* Tables that might satisfy case 1 */
103383: Bitmask indexable; /* Tables that are indexable, satisfying case 2 */
103384:
103385: /*
103386: ** Break the OR clause into its separate subterms. The subterms are
103387: ** stored in a WhereClause structure containing within the WhereOrInfo
103388: ** object that is attached to the original OR clause term.
103389: */
103390: assert( (pTerm->wtFlags & (TERM_DYNAMIC|TERM_ORINFO|TERM_ANDINFO))==0 );
103391: assert( pExpr->op==TK_OR );
103392: pTerm->u.pOrInfo = pOrInfo = sqlite3DbMallocZero(db, sizeof(*pOrInfo));
103393: if( pOrInfo==0 ) return;
103394: pTerm->wtFlags |= TERM_ORINFO;
103395: pOrWc = &pOrInfo->wc;
103396: whereClauseInit(pOrWc, pWC->pParse, pMaskSet, pWC->wctrlFlags);
103397: whereSplit(pOrWc, pExpr, TK_OR);
103398: exprAnalyzeAll(pSrc, pOrWc);
103399: if( db->mallocFailed ) return;
103400: assert( pOrWc->nTerm>=2 );
103401:
103402: /*
103403: ** Compute the set of tables that might satisfy cases 1 or 2.
103404: */
103405: indexable = ~(Bitmask)0;
103406: chngToIN = ~(pWC->vmask);
103407: for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0 && indexable; i--, pOrTerm++){
103408: if( (pOrTerm->eOperator & WO_SINGLE)==0 ){
103409: WhereAndInfo *pAndInfo;
103410: assert( pOrTerm->eOperator==0 );
103411: assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 );
103412: chngToIN = 0;
103413: pAndInfo = sqlite3DbMallocRaw(db, sizeof(*pAndInfo));
103414: if( pAndInfo ){
103415: WhereClause *pAndWC;
103416: WhereTerm *pAndTerm;
103417: int j;
103418: Bitmask b = 0;
103419: pOrTerm->u.pAndInfo = pAndInfo;
103420: pOrTerm->wtFlags |= TERM_ANDINFO;
103421: pOrTerm->eOperator = WO_AND;
103422: pAndWC = &pAndInfo->wc;
103423: whereClauseInit(pAndWC, pWC->pParse, pMaskSet, pWC->wctrlFlags);
103424: whereSplit(pAndWC, pOrTerm->pExpr, TK_AND);
103425: exprAnalyzeAll(pSrc, pAndWC);
103426: pAndWC->pOuter = pWC;
103427: testcase( db->mallocFailed );
103428: if( !db->mallocFailed ){
103429: for(j=0, pAndTerm=pAndWC->a; j<pAndWC->nTerm; j++, pAndTerm++){
103430: assert( pAndTerm->pExpr );
103431: if( allowedOp(pAndTerm->pExpr->op) ){
103432: b |= getMask(pMaskSet, pAndTerm->leftCursor);
103433: }
103434: }
103435: }
103436: indexable &= b;
103437: }
103438: }else if( pOrTerm->wtFlags & TERM_COPIED ){
103439: /* Skip this term for now. We revisit it when we process the
103440: ** corresponding TERM_VIRTUAL term */
103441: }else{
103442: Bitmask b;
103443: b = getMask(pMaskSet, pOrTerm->leftCursor);
103444: if( pOrTerm->wtFlags & TERM_VIRTUAL ){
103445: WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent];
103446: b |= getMask(pMaskSet, pOther->leftCursor);
103447: }
103448: indexable &= b;
103449: if( pOrTerm->eOperator!=WO_EQ ){
103450: chngToIN = 0;
103451: }else{
103452: chngToIN &= b;
103453: }
103454: }
103455: }
103456:
103457: /*
103458: ** Record the set of tables that satisfy case 2. The set might be
103459: ** empty.
103460: */
103461: pOrInfo->indexable = indexable;
103462: pTerm->eOperator = indexable==0 ? 0 : WO_OR;
103463:
103464: /*
103465: ** chngToIN holds a set of tables that *might* satisfy case 1. But
103466: ** we have to do some additional checking to see if case 1 really
103467: ** is satisfied.
103468: **
103469: ** chngToIN will hold either 0, 1, or 2 bits. The 0-bit case means
103470: ** that there is no possibility of transforming the OR clause into an
103471: ** IN operator because one or more terms in the OR clause contain
103472: ** something other than == on a column in the single table. The 1-bit
103473: ** case means that every term of the OR clause is of the form
103474: ** "table.column=expr" for some single table. The one bit that is set
103475: ** will correspond to the common table. We still need to check to make
103476: ** sure the same column is used on all terms. The 2-bit case is when
103477: ** the all terms are of the form "table1.column=table2.column". It
103478: ** might be possible to form an IN operator with either table1.column
103479: ** or table2.column as the LHS if either is common to every term of
103480: ** the OR clause.
103481: **
103482: ** Note that terms of the form "table.column1=table.column2" (the
103483: ** same table on both sizes of the ==) cannot be optimized.
103484: */
103485: if( chngToIN ){
103486: int okToChngToIN = 0; /* True if the conversion to IN is valid */
103487: int iColumn = -1; /* Column index on lhs of IN operator */
103488: int iCursor = -1; /* Table cursor common to all terms */
103489: int j = 0; /* Loop counter */
103490:
103491: /* Search for a table and column that appears on one side or the
103492: ** other of the == operator in every subterm. That table and column
103493: ** will be recorded in iCursor and iColumn. There might not be any
103494: ** such table and column. Set okToChngToIN if an appropriate table
103495: ** and column is found but leave okToChngToIN false if not found.
103496: */
103497: for(j=0; j<2 && !okToChngToIN; j++){
103498: pOrTerm = pOrWc->a;
103499: for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){
103500: assert( pOrTerm->eOperator==WO_EQ );
103501: pOrTerm->wtFlags &= ~TERM_OR_OK;
103502: if( pOrTerm->leftCursor==iCursor ){
103503: /* This is the 2-bit case and we are on the second iteration and
103504: ** current term is from the first iteration. So skip this term. */
103505: assert( j==1 );
103506: continue;
103507: }
103508: if( (chngToIN & getMask(pMaskSet, pOrTerm->leftCursor))==0 ){
103509: /* This term must be of the form t1.a==t2.b where t2 is in the
103510: ** chngToIN set but t1 is not. This term will be either preceeded
103511: ** or follwed by an inverted copy (t2.b==t1.a). Skip this term
103512: ** and use its inversion. */
103513: testcase( pOrTerm->wtFlags & TERM_COPIED );
103514: testcase( pOrTerm->wtFlags & TERM_VIRTUAL );
103515: assert( pOrTerm->wtFlags & (TERM_COPIED|TERM_VIRTUAL) );
103516: continue;
103517: }
103518: iColumn = pOrTerm->u.leftColumn;
103519: iCursor = pOrTerm->leftCursor;
103520: break;
103521: }
103522: if( i<0 ){
103523: /* No candidate table+column was found. This can only occur
103524: ** on the second iteration */
103525: assert( j==1 );
103526: assert( (chngToIN&(chngToIN-1))==0 );
103527: assert( chngToIN==getMask(pMaskSet, iCursor) );
103528: break;
103529: }
103530: testcase( j==1 );
103531:
103532: /* We have found a candidate table and column. Check to see if that
103533: ** table and column is common to every term in the OR clause */
103534: okToChngToIN = 1;
103535: for(; i>=0 && okToChngToIN; i--, pOrTerm++){
103536: assert( pOrTerm->eOperator==WO_EQ );
103537: if( pOrTerm->leftCursor!=iCursor ){
103538: pOrTerm->wtFlags &= ~TERM_OR_OK;
103539: }else if( pOrTerm->u.leftColumn!=iColumn ){
103540: okToChngToIN = 0;
103541: }else{
103542: int affLeft, affRight;
103543: /* If the right-hand side is also a column, then the affinities
103544: ** of both right and left sides must be such that no type
103545: ** conversions are required on the right. (Ticket #2249)
103546: */
103547: affRight = sqlite3ExprAffinity(pOrTerm->pExpr->pRight);
103548: affLeft = sqlite3ExprAffinity(pOrTerm->pExpr->pLeft);
103549: if( affRight!=0 && affRight!=affLeft ){
103550: okToChngToIN = 0;
103551: }else{
103552: pOrTerm->wtFlags |= TERM_OR_OK;
103553: }
103554: }
103555: }
103556: }
103557:
103558: /* At this point, okToChngToIN is true if original pTerm satisfies
103559: ** case 1. In that case, construct a new virtual term that is
103560: ** pTerm converted into an IN operator.
103561: **
103562: ** EV: R-00211-15100
103563: */
103564: if( okToChngToIN ){
103565: Expr *pDup; /* A transient duplicate expression */
103566: ExprList *pList = 0; /* The RHS of the IN operator */
103567: Expr *pLeft = 0; /* The LHS of the IN operator */
103568: Expr *pNew; /* The complete IN operator */
103569:
103570: for(i=pOrWc->nTerm-1, pOrTerm=pOrWc->a; i>=0; i--, pOrTerm++){
103571: if( (pOrTerm->wtFlags & TERM_OR_OK)==0 ) continue;
103572: assert( pOrTerm->eOperator==WO_EQ );
103573: assert( pOrTerm->leftCursor==iCursor );
103574: assert( pOrTerm->u.leftColumn==iColumn );
103575: pDup = sqlite3ExprDup(db, pOrTerm->pExpr->pRight, 0);
103576: pList = sqlite3ExprListAppend(pWC->pParse, pList, pDup);
103577: pLeft = pOrTerm->pExpr->pLeft;
103578: }
103579: assert( pLeft!=0 );
103580: pDup = sqlite3ExprDup(db, pLeft, 0);
103581: pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0);
103582: if( pNew ){
103583: int idxNew;
103584: transferJoinMarkings(pNew, pExpr);
103585: assert( !ExprHasProperty(pNew, EP_xIsSelect) );
103586: pNew->x.pList = pList;
103587: idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
103588: testcase( idxNew==0 );
103589: exprAnalyze(pSrc, pWC, idxNew);
103590: pTerm = &pWC->a[idxTerm];
103591: pWC->a[idxNew].iParent = idxTerm;
103592: pTerm->nChild = 1;
103593: }else{
103594: sqlite3ExprListDelete(db, pList);
103595: }
103596: pTerm->eOperator = WO_NOOP; /* case 1 trumps case 2 */
103597: }
103598: }
103599: }
103600: #endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */
103601:
103602:
103603: /*
103604: ** The input to this routine is an WhereTerm structure with only the
103605: ** "pExpr" field filled in. The job of this routine is to analyze the
103606: ** subexpression and populate all the other fields of the WhereTerm
103607: ** structure.
103608: **
103609: ** If the expression is of the form "<expr> <op> X" it gets commuted
103610: ** to the standard form of "X <op> <expr>".
103611: **
103612: ** If the expression is of the form "X <op> Y" where both X and Y are
103613: ** columns, then the original expression is unchanged and a new virtual
103614: ** term of the form "Y <op> X" is added to the WHERE clause and
103615: ** analyzed separately. The original term is marked with TERM_COPIED
103616: ** and the new term is marked with TERM_DYNAMIC (because it's pExpr
103617: ** needs to be freed with the WhereClause) and TERM_VIRTUAL (because it
103618: ** is a commuted copy of a prior term.) The original term has nChild=1
103619: ** and the copy has idxParent set to the index of the original term.
103620: */
103621: static void exprAnalyze(
103622: SrcList *pSrc, /* the FROM clause */
103623: WhereClause *pWC, /* the WHERE clause */
103624: int idxTerm /* Index of the term to be analyzed */
103625: ){
103626: WhereTerm *pTerm; /* The term to be analyzed */
103627: WhereMaskSet *pMaskSet; /* Set of table index masks */
103628: Expr *pExpr; /* The expression to be analyzed */
103629: Bitmask prereqLeft; /* Prerequesites of the pExpr->pLeft */
103630: Bitmask prereqAll; /* Prerequesites of pExpr */
103631: Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */
103632: Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */
103633: int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */
103634: int noCase = 0; /* LIKE/GLOB distinguishes case */
103635: int op; /* Top-level operator. pExpr->op */
103636: Parse *pParse = pWC->pParse; /* Parsing context */
103637: sqlite3 *db = pParse->db; /* Database connection */
103638:
103639: if( db->mallocFailed ){
103640: return;
103641: }
103642: pTerm = &pWC->a[idxTerm];
103643: pMaskSet = pWC->pMaskSet;
103644: pExpr = pTerm->pExpr;
1.2.2.1 ! misho 103645: assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE );
1.2 misho 103646: prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft);
103647: op = pExpr->op;
103648: if( op==TK_IN ){
103649: assert( pExpr->pRight==0 );
103650: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
103651: pTerm->prereqRight = exprSelectTableUsage(pMaskSet, pExpr->x.pSelect);
103652: }else{
103653: pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->x.pList);
103654: }
103655: }else if( op==TK_ISNULL ){
103656: pTerm->prereqRight = 0;
103657: }else{
103658: pTerm->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight);
103659: }
103660: prereqAll = exprTableUsage(pMaskSet, pExpr);
103661: if( ExprHasProperty(pExpr, EP_FromJoin) ){
103662: Bitmask x = getMask(pMaskSet, pExpr->iRightJoinTable);
103663: prereqAll |= x;
103664: extraRight = x-1; /* ON clause terms may not be used with an index
103665: ** on left table of a LEFT JOIN. Ticket #3015 */
103666: }
103667: pTerm->prereqAll = prereqAll;
103668: pTerm->leftCursor = -1;
103669: pTerm->iParent = -1;
103670: pTerm->eOperator = 0;
103671: if( allowedOp(op) && (pTerm->prereqRight & prereqLeft)==0 ){
1.2.2.1 ! misho 103672: Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft);
! 103673: Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight);
1.2 misho 103674: if( pLeft->op==TK_COLUMN ){
103675: pTerm->leftCursor = pLeft->iTable;
103676: pTerm->u.leftColumn = pLeft->iColumn;
103677: pTerm->eOperator = operatorMask(op);
103678: }
103679: if( pRight && pRight->op==TK_COLUMN ){
103680: WhereTerm *pNew;
103681: Expr *pDup;
103682: if( pTerm->leftCursor>=0 ){
103683: int idxNew;
103684: pDup = sqlite3ExprDup(db, pExpr, 0);
103685: if( db->mallocFailed ){
103686: sqlite3ExprDelete(db, pDup);
103687: return;
103688: }
103689: idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);
103690: if( idxNew==0 ) return;
103691: pNew = &pWC->a[idxNew];
103692: pNew->iParent = idxTerm;
103693: pTerm = &pWC->a[idxTerm];
103694: pTerm->nChild = 1;
103695: pTerm->wtFlags |= TERM_COPIED;
103696: }else{
103697: pDup = pExpr;
103698: pNew = pTerm;
103699: }
103700: exprCommute(pParse, pDup);
1.2.2.1 ! misho 103701: pLeft = sqlite3ExprSkipCollate(pDup->pLeft);
1.2 misho 103702: pNew->leftCursor = pLeft->iTable;
103703: pNew->u.leftColumn = pLeft->iColumn;
103704: testcase( (prereqLeft | extraRight) != prereqLeft );
103705: pNew->prereqRight = prereqLeft | extraRight;
103706: pNew->prereqAll = prereqAll;
103707: pNew->eOperator = operatorMask(pDup->op);
103708: }
103709: }
103710:
103711: #ifndef SQLITE_OMIT_BETWEEN_OPTIMIZATION
103712: /* If a term is the BETWEEN operator, create two new virtual terms
103713: ** that define the range that the BETWEEN implements. For example:
103714: **
103715: ** a BETWEEN b AND c
103716: **
103717: ** is converted into:
103718: **
103719: ** (a BETWEEN b AND c) AND (a>=b) AND (a<=c)
103720: **
103721: ** The two new terms are added onto the end of the WhereClause object.
103722: ** The new terms are "dynamic" and are children of the original BETWEEN
103723: ** term. That means that if the BETWEEN term is coded, the children are
103724: ** skipped. Or, if the children are satisfied by an index, the original
103725: ** BETWEEN term is skipped.
103726: */
103727: else if( pExpr->op==TK_BETWEEN && pWC->op==TK_AND ){
103728: ExprList *pList = pExpr->x.pList;
103729: int i;
103730: static const u8 ops[] = {TK_GE, TK_LE};
103731: assert( pList!=0 );
103732: assert( pList->nExpr==2 );
103733: for(i=0; i<2; i++){
103734: Expr *pNewExpr;
103735: int idxNew;
103736: pNewExpr = sqlite3PExpr(pParse, ops[i],
103737: sqlite3ExprDup(db, pExpr->pLeft, 0),
103738: sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0);
103739: idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
103740: testcase( idxNew==0 );
103741: exprAnalyze(pSrc, pWC, idxNew);
103742: pTerm = &pWC->a[idxTerm];
103743: pWC->a[idxNew].iParent = idxTerm;
103744: }
103745: pTerm->nChild = 2;
103746: }
103747: #endif /* SQLITE_OMIT_BETWEEN_OPTIMIZATION */
103748:
103749: #if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY)
103750: /* Analyze a term that is composed of two or more subterms connected by
103751: ** an OR operator.
103752: */
103753: else if( pExpr->op==TK_OR ){
103754: assert( pWC->op==TK_AND );
103755: exprAnalyzeOrTerm(pSrc, pWC, idxTerm);
103756: pTerm = &pWC->a[idxTerm];
103757: }
103758: #endif /* SQLITE_OMIT_OR_OPTIMIZATION */
103759:
103760: #ifndef SQLITE_OMIT_LIKE_OPTIMIZATION
103761: /* Add constraints to reduce the search space on a LIKE or GLOB
103762: ** operator.
103763: **
103764: ** A like pattern of the form "x LIKE 'abc%'" is changed into constraints
103765: **
103766: ** x>='abc' AND x<'abd' AND x LIKE 'abc%'
103767: **
103768: ** The last character of the prefix "abc" is incremented to form the
103769: ** termination condition "abd".
103770: */
103771: if( pWC->op==TK_AND
103772: && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase)
103773: ){
103774: Expr *pLeft; /* LHS of LIKE/GLOB operator */
103775: Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */
103776: Expr *pNewExpr1;
103777: Expr *pNewExpr2;
103778: int idxNew1;
103779: int idxNew2;
1.2.2.1 ! misho 103780: Token sCollSeqName; /* Name of collating sequence */
1.2 misho 103781:
103782: pLeft = pExpr->x.pList->a[1].pExpr;
103783: pStr2 = sqlite3ExprDup(db, pStr1, 0);
103784: if( !db->mallocFailed ){
103785: u8 c, *pC; /* Last character before the first wildcard */
103786: pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1];
103787: c = *pC;
103788: if( noCase ){
103789: /* The point is to increment the last character before the first
103790: ** wildcard. But if we increment '@', that will push it into the
103791: ** alphabetic range where case conversions will mess up the
103792: ** inequality. To avoid this, make sure to also run the full
103793: ** LIKE on all candidate expressions by clearing the isComplete flag
103794: */
103795: if( c=='A'-1 ) isComplete = 0; /* EV: R-64339-08207 */
103796:
103797:
103798: c = sqlite3UpperToLower[c];
103799: }
103800: *pC = c + 1;
103801: }
1.2.2.1 ! misho 103802: sCollSeqName.z = noCase ? "NOCASE" : "BINARY";
! 103803: sCollSeqName.n = 6;
! 103804: pNewExpr1 = sqlite3ExprDup(db, pLeft, 0);
1.2 misho 103805: pNewExpr1 = sqlite3PExpr(pParse, TK_GE,
1.2.2.1 ! misho 103806: sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName),
! 103807: pStr1, 0);
1.2 misho 103808: idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
103809: testcase( idxNew1==0 );
103810: exprAnalyze(pSrc, pWC, idxNew1);
1.2.2.1 ! misho 103811: pNewExpr2 = sqlite3ExprDup(db, pLeft, 0);
1.2 misho 103812: pNewExpr2 = sqlite3PExpr(pParse, TK_LT,
1.2.2.1 ! misho 103813: sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName),
! 103814: pStr2, 0);
1.2 misho 103815: idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
103816: testcase( idxNew2==0 );
103817: exprAnalyze(pSrc, pWC, idxNew2);
103818: pTerm = &pWC->a[idxTerm];
103819: if( isComplete ){
103820: pWC->a[idxNew1].iParent = idxTerm;
103821: pWC->a[idxNew2].iParent = idxTerm;
103822: pTerm->nChild = 2;
103823: }
103824: }
103825: #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */
103826:
103827: #ifndef SQLITE_OMIT_VIRTUALTABLE
103828: /* Add a WO_MATCH auxiliary term to the constraint set if the
103829: ** current expression is of the form: column MATCH expr.
103830: ** This information is used by the xBestIndex methods of
103831: ** virtual tables. The native query optimizer does not attempt
103832: ** to do anything with MATCH functions.
103833: */
103834: if( isMatchOfColumn(pExpr) ){
103835: int idxNew;
103836: Expr *pRight, *pLeft;
103837: WhereTerm *pNewTerm;
103838: Bitmask prereqColumn, prereqExpr;
103839:
103840: pRight = pExpr->x.pList->a[0].pExpr;
103841: pLeft = pExpr->x.pList->a[1].pExpr;
103842: prereqExpr = exprTableUsage(pMaskSet, pRight);
103843: prereqColumn = exprTableUsage(pMaskSet, pLeft);
103844: if( (prereqExpr & prereqColumn)==0 ){
103845: Expr *pNewExpr;
103846: pNewExpr = sqlite3PExpr(pParse, TK_MATCH,
103847: 0, sqlite3ExprDup(db, pRight, 0), 0);
103848: idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC);
103849: testcase( idxNew==0 );
103850: pNewTerm = &pWC->a[idxNew];
103851: pNewTerm->prereqRight = prereqExpr;
103852: pNewTerm->leftCursor = pLeft->iTable;
103853: pNewTerm->u.leftColumn = pLeft->iColumn;
103854: pNewTerm->eOperator = WO_MATCH;
103855: pNewTerm->iParent = idxTerm;
103856: pTerm = &pWC->a[idxTerm];
103857: pTerm->nChild = 1;
103858: pTerm->wtFlags |= TERM_COPIED;
103859: pNewTerm->prereqAll = pTerm->prereqAll;
103860: }
103861: }
103862: #endif /* SQLITE_OMIT_VIRTUALTABLE */
103863:
103864: #ifdef SQLITE_ENABLE_STAT3
103865: /* When sqlite_stat3 histogram data is available an operator of the
103866: ** form "x IS NOT NULL" can sometimes be evaluated more efficiently
103867: ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a
103868: ** virtual term of that form.
103869: **
103870: ** Note that the virtual term must be tagged with TERM_VNULL. This
103871: ** TERM_VNULL tag will suppress the not-null check at the beginning
103872: ** of the loop. Without the TERM_VNULL flag, the not-null check at
103873: ** the start of the loop will prevent any results from being returned.
103874: */
103875: if( pExpr->op==TK_NOTNULL
103876: && pExpr->pLeft->op==TK_COLUMN
103877: && pExpr->pLeft->iColumn>=0
103878: ){
103879: Expr *pNewExpr;
103880: Expr *pLeft = pExpr->pLeft;
103881: int idxNew;
103882: WhereTerm *pNewTerm;
103883:
103884: pNewExpr = sqlite3PExpr(pParse, TK_GT,
103885: sqlite3ExprDup(db, pLeft, 0),
103886: sqlite3PExpr(pParse, TK_NULL, 0, 0, 0), 0);
103887:
103888: idxNew = whereClauseInsert(pWC, pNewExpr,
103889: TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL);
103890: if( idxNew ){
103891: pNewTerm = &pWC->a[idxNew];
103892: pNewTerm->prereqRight = 0;
103893: pNewTerm->leftCursor = pLeft->iTable;
103894: pNewTerm->u.leftColumn = pLeft->iColumn;
103895: pNewTerm->eOperator = WO_GT;
103896: pNewTerm->iParent = idxTerm;
103897: pTerm = &pWC->a[idxTerm];
103898: pTerm->nChild = 1;
103899: pTerm->wtFlags |= TERM_COPIED;
103900: pNewTerm->prereqAll = pTerm->prereqAll;
103901: }
103902: }
103903: #endif /* SQLITE_ENABLE_STAT */
103904:
103905: /* Prevent ON clause terms of a LEFT JOIN from being used to drive
103906: ** an index for tables to the left of the join.
103907: */
103908: pTerm->prereqRight |= extraRight;
103909: }
103910:
103911: /*
103912: ** This function searches the expression list passed as the second argument
103913: ** for an expression of type TK_COLUMN that refers to the same column and
103914: ** uses the same collation sequence as the iCol'th column of index pIdx.
103915: ** Argument iBase is the cursor number used for the table that pIdx refers
103916: ** to.
103917: **
103918: ** If such an expression is found, its index in pList->a[] is returned. If
103919: ** no expression is found, -1 is returned.
103920: */
103921: static int findIndexCol(
103922: Parse *pParse, /* Parse context */
103923: ExprList *pList, /* Expression list to search */
103924: int iBase, /* Cursor for table associated with pIdx */
103925: Index *pIdx, /* Index to match column of */
103926: int iCol /* Column of index to match */
103927: ){
103928: int i;
103929: const char *zColl = pIdx->azColl[iCol];
103930:
103931: for(i=0; i<pList->nExpr; i++){
1.2.2.1 ! misho 103932: Expr *p = sqlite3ExprSkipCollate(pList->a[i].pExpr);
1.2 misho 103933: if( p->op==TK_COLUMN
103934: && p->iColumn==pIdx->aiColumn[iCol]
103935: && p->iTable==iBase
103936: ){
1.2.2.1 ! misho 103937: CollSeq *pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr);
1.2 misho 103938: if( ALWAYS(pColl) && 0==sqlite3StrICmp(pColl->zName, zColl) ){
103939: return i;
103940: }
103941: }
103942: }
103943:
103944: return -1;
103945: }
103946:
103947: /*
103948: ** This routine determines if pIdx can be used to assist in processing a
103949: ** DISTINCT qualifier. In other words, it tests whether or not using this
103950: ** index for the outer loop guarantees that rows with equal values for
103951: ** all expressions in the pDistinct list are delivered grouped together.
103952: **
103953: ** For example, the query
103954: **
103955: ** SELECT DISTINCT a, b, c FROM tbl WHERE a = ?
103956: **
103957: ** can benefit from any index on columns "b" and "c".
103958: */
103959: static int isDistinctIndex(
103960: Parse *pParse, /* Parsing context */
103961: WhereClause *pWC, /* The WHERE clause */
103962: Index *pIdx, /* The index being considered */
103963: int base, /* Cursor number for the table pIdx is on */
103964: ExprList *pDistinct, /* The DISTINCT expressions */
103965: int nEqCol /* Number of index columns with == */
103966: ){
103967: Bitmask mask = 0; /* Mask of unaccounted for pDistinct exprs */
103968: int i; /* Iterator variable */
103969:
1.2.2.1 ! misho 103970: assert( pDistinct!=0 );
! 103971: if( pIdx->zName==0 || pDistinct->nExpr>=BMS ) return 0;
1.2 misho 103972: testcase( pDistinct->nExpr==BMS-1 );
103973:
103974: /* Loop through all the expressions in the distinct list. If any of them
103975: ** are not simple column references, return early. Otherwise, test if the
103976: ** WHERE clause contains a "col=X" clause. If it does, the expression
103977: ** can be ignored. If it does not, and the column does not belong to the
103978: ** same table as index pIdx, return early. Finally, if there is no
103979: ** matching "col=X" expression and the column is on the same table as pIdx,
103980: ** set the corresponding bit in variable mask.
103981: */
103982: for(i=0; i<pDistinct->nExpr; i++){
103983: WhereTerm *pTerm;
1.2.2.1 ! misho 103984: Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr);
1.2 misho 103985: if( p->op!=TK_COLUMN ) return 0;
103986: pTerm = findTerm(pWC, p->iTable, p->iColumn, ~(Bitmask)0, WO_EQ, 0);
103987: if( pTerm ){
103988: Expr *pX = pTerm->pExpr;
103989: CollSeq *p1 = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
103990: CollSeq *p2 = sqlite3ExprCollSeq(pParse, p);
103991: if( p1==p2 ) continue;
103992: }
103993: if( p->iTable!=base ) return 0;
103994: mask |= (((Bitmask)1) << i);
103995: }
103996:
103997: for(i=nEqCol; mask && i<pIdx->nColumn; i++){
103998: int iExpr = findIndexCol(pParse, pDistinct, base, pIdx, i);
103999: if( iExpr<0 ) break;
104000: mask &= ~(((Bitmask)1) << iExpr);
104001: }
104002:
104003: return (mask==0);
104004: }
104005:
104006:
104007: /*
104008: ** Return true if the DISTINCT expression-list passed as the third argument
104009: ** is redundant. A DISTINCT list is redundant if the database contains a
104010: ** UNIQUE index that guarantees that the result of the query will be distinct
104011: ** anyway.
104012: */
104013: static int isDistinctRedundant(
104014: Parse *pParse,
104015: SrcList *pTabList,
104016: WhereClause *pWC,
104017: ExprList *pDistinct
104018: ){
104019: Table *pTab;
104020: Index *pIdx;
104021: int i;
104022: int iBase;
104023:
104024: /* If there is more than one table or sub-select in the FROM clause of
104025: ** this query, then it will not be possible to show that the DISTINCT
104026: ** clause is redundant. */
104027: if( pTabList->nSrc!=1 ) return 0;
104028: iBase = pTabList->a[0].iCursor;
104029: pTab = pTabList->a[0].pTab;
104030:
104031: /* If any of the expressions is an IPK column on table iBase, then return
104032: ** true. Note: The (p->iTable==iBase) part of this test may be false if the
104033: ** current SELECT is a correlated sub-query.
104034: */
104035: for(i=0; i<pDistinct->nExpr; i++){
1.2.2.1 ! misho 104036: Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr);
1.2 misho 104037: if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1;
104038: }
104039:
104040: /* Loop through all indices on the table, checking each to see if it makes
104041: ** the DISTINCT qualifier redundant. It does so if:
104042: **
104043: ** 1. The index is itself UNIQUE, and
104044: **
104045: ** 2. All of the columns in the index are either part of the pDistinct
104046: ** list, or else the WHERE clause contains a term of the form "col=X",
104047: ** where X is a constant value. The collation sequences of the
104048: ** comparison and select-list expressions must match those of the index.
1.2.2.1 ! misho 104049: **
! 104050: ** 3. All of those index columns for which the WHERE clause does not
! 104051: ** contain a "col=X" term are subject to a NOT NULL constraint.
1.2 misho 104052: */
104053: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
104054: if( pIdx->onError==OE_None ) continue;
104055: for(i=0; i<pIdx->nColumn; i++){
104056: int iCol = pIdx->aiColumn[i];
1.2.2.1 ! misho 104057: if( 0==findTerm(pWC, iBase, iCol, ~(Bitmask)0, WO_EQ, pIdx) ){
! 104058: int iIdxCol = findIndexCol(pParse, pDistinct, iBase, pIdx, i);
! 104059: if( iIdxCol<0 || pTab->aCol[pIdx->aiColumn[i]].notNull==0 ){
! 104060: break;
! 104061: }
1.2 misho 104062: }
104063: }
104064: if( i==pIdx->nColumn ){
104065: /* This index implies that the DISTINCT qualifier is redundant. */
104066: return 1;
104067: }
104068: }
104069:
104070: return 0;
104071: }
104072:
104073: /*
104074: ** Prepare a crude estimate of the logarithm of the input value.
104075: ** The results need not be exact. This is only used for estimating
104076: ** the total cost of performing operations with O(logN) or O(NlogN)
104077: ** complexity. Because N is just a guess, it is no great tragedy if
104078: ** logN is a little off.
104079: */
104080: static double estLog(double N){
104081: double logN = 1;
104082: double x = 10;
104083: while( N>x ){
104084: logN += 1;
104085: x *= 10;
104086: }
104087: return logN;
104088: }
104089:
104090: /*
104091: ** Two routines for printing the content of an sqlite3_index_info
104092: ** structure. Used for testing and debugging only. If neither
104093: ** SQLITE_TEST or SQLITE_DEBUG are defined, then these routines
104094: ** are no-ops.
104095: */
104096: #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_DEBUG)
104097: static void TRACE_IDX_INPUTS(sqlite3_index_info *p){
104098: int i;
104099: if( !sqlite3WhereTrace ) return;
104100: for(i=0; i<p->nConstraint; i++){
104101: sqlite3DebugPrintf(" constraint[%d]: col=%d termid=%d op=%d usabled=%d\n",
104102: i,
104103: p->aConstraint[i].iColumn,
104104: p->aConstraint[i].iTermOffset,
104105: p->aConstraint[i].op,
104106: p->aConstraint[i].usable);
104107: }
104108: for(i=0; i<p->nOrderBy; i++){
104109: sqlite3DebugPrintf(" orderby[%d]: col=%d desc=%d\n",
104110: i,
104111: p->aOrderBy[i].iColumn,
104112: p->aOrderBy[i].desc);
104113: }
104114: }
104115: static void TRACE_IDX_OUTPUTS(sqlite3_index_info *p){
104116: int i;
104117: if( !sqlite3WhereTrace ) return;
104118: for(i=0; i<p->nConstraint; i++){
104119: sqlite3DebugPrintf(" usage[%d]: argvIdx=%d omit=%d\n",
104120: i,
104121: p->aConstraintUsage[i].argvIndex,
104122: p->aConstraintUsage[i].omit);
104123: }
104124: sqlite3DebugPrintf(" idxNum=%d\n", p->idxNum);
104125: sqlite3DebugPrintf(" idxStr=%s\n", p->idxStr);
104126: sqlite3DebugPrintf(" orderByConsumed=%d\n", p->orderByConsumed);
104127: sqlite3DebugPrintf(" estimatedCost=%g\n", p->estimatedCost);
104128: }
104129: #else
104130: #define TRACE_IDX_INPUTS(A)
104131: #define TRACE_IDX_OUTPUTS(A)
104132: #endif
104133:
104134: /*
104135: ** Required because bestIndex() is called by bestOrClauseIndex()
104136: */
1.2.2.1 ! misho 104137: static void bestIndex(WhereBestIdx*);
1.2 misho 104138:
104139: /*
104140: ** This routine attempts to find an scanning strategy that can be used
104141: ** to optimize an 'OR' expression that is part of a WHERE clause.
104142: **
104143: ** The table associated with FROM clause term pSrc may be either a
104144: ** regular B-Tree table or a virtual table.
104145: */
1.2.2.1 ! misho 104146: static void bestOrClauseIndex(WhereBestIdx *p){
1.2 misho 104147: #ifndef SQLITE_OMIT_OR_OPTIMIZATION
1.2.2.1 ! misho 104148: WhereClause *pWC = p->pWC; /* The WHERE clause */
! 104149: struct SrcList_item *pSrc = p->pSrc; /* The FROM clause term to search */
! 104150: const int iCur = pSrc->iCursor; /* The cursor of the table */
1.2 misho 104151: const Bitmask maskSrc = getMask(pWC->pMaskSet, iCur); /* Bitmask for pSrc */
104152: WhereTerm * const pWCEnd = &pWC->a[pWC->nTerm]; /* End of pWC->a[] */
1.2.2.1 ! misho 104153: WhereTerm *pTerm; /* A single term of the WHERE clause */
1.2 misho 104154:
104155: /* The OR-clause optimization is disallowed if the INDEXED BY or
104156: ** NOT INDEXED clauses are used or if the WHERE_AND_ONLY bit is set. */
104157: if( pSrc->notIndexed || pSrc->pIndex!=0 ){
104158: return;
104159: }
104160: if( pWC->wctrlFlags & WHERE_AND_ONLY ){
104161: return;
104162: }
104163:
104164: /* Search the WHERE clause terms for a usable WO_OR term. */
104165: for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
104166: if( pTerm->eOperator==WO_OR
1.2.2.1 ! misho 104167: && ((pTerm->prereqAll & ~maskSrc) & p->notReady)==0
1.2 misho 104168: && (pTerm->u.pOrInfo->indexable & maskSrc)!=0
104169: ){
104170: WhereClause * const pOrWC = &pTerm->u.pOrInfo->wc;
104171: WhereTerm * const pOrWCEnd = &pOrWC->a[pOrWC->nTerm];
104172: WhereTerm *pOrTerm;
104173: int flags = WHERE_MULTI_OR;
104174: double rTotal = 0;
104175: double nRow = 0;
104176: Bitmask used = 0;
1.2.2.1 ! misho 104177: WhereBestIdx sBOI;
1.2 misho 104178:
1.2.2.1 ! misho 104179: sBOI = *p;
! 104180: sBOI.pOrderBy = 0;
! 104181: sBOI.pDistinct = 0;
! 104182: sBOI.ppIdxInfo = 0;
1.2 misho 104183: for(pOrTerm=pOrWC->a; pOrTerm<pOrWCEnd; pOrTerm++){
104184: WHERETRACE(("... Multi-index OR testing for term %d of %d....\n",
104185: (pOrTerm - pOrWC->a), (pTerm - pWC->a)
104186: ));
104187: if( pOrTerm->eOperator==WO_AND ){
1.2.2.1 ! misho 104188: sBOI.pWC = &pOrTerm->u.pAndInfo->wc;
! 104189: bestIndex(&sBOI);
1.2 misho 104190: }else if( pOrTerm->leftCursor==iCur ){
104191: WhereClause tempWC;
104192: tempWC.pParse = pWC->pParse;
104193: tempWC.pMaskSet = pWC->pMaskSet;
104194: tempWC.pOuter = pWC;
104195: tempWC.op = TK_AND;
104196: tempWC.a = pOrTerm;
104197: tempWC.wctrlFlags = 0;
104198: tempWC.nTerm = 1;
1.2.2.1 ! misho 104199: sBOI.pWC = &tempWC;
! 104200: bestIndex(&sBOI);
1.2 misho 104201: }else{
104202: continue;
104203: }
1.2.2.1 ! misho 104204: rTotal += sBOI.cost.rCost;
! 104205: nRow += sBOI.cost.plan.nRow;
! 104206: used |= sBOI.cost.used;
! 104207: if( rTotal>=p->cost.rCost ) break;
1.2 misho 104208: }
104209:
104210: /* If there is an ORDER BY clause, increase the scan cost to account
104211: ** for the cost of the sort. */
1.2.2.1 ! misho 104212: if( p->pOrderBy!=0 ){
1.2 misho 104213: WHERETRACE(("... sorting increases OR cost %.9g to %.9g\n",
104214: rTotal, rTotal+nRow*estLog(nRow)));
104215: rTotal += nRow*estLog(nRow);
104216: }
104217:
104218: /* If the cost of scanning using this OR term for optimization is
104219: ** less than the current cost stored in pCost, replace the contents
104220: ** of pCost. */
104221: WHERETRACE(("... multi-index OR cost=%.9g nrow=%.9g\n", rTotal, nRow));
1.2.2.1 ! misho 104222: if( rTotal<p->cost.rCost ){
! 104223: p->cost.rCost = rTotal;
! 104224: p->cost.used = used;
! 104225: p->cost.plan.nRow = nRow;
! 104226: p->cost.plan.nOBSat = p->i ? p->aLevel[p->i-1].plan.nOBSat : 0;
! 104227: p->cost.plan.wsFlags = flags;
! 104228: p->cost.plan.u.pTerm = pTerm;
1.2 misho 104229: }
104230: }
104231: }
104232: #endif /* SQLITE_OMIT_OR_OPTIMIZATION */
104233: }
104234:
104235: #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
104236: /*
104237: ** Return TRUE if the WHERE clause term pTerm is of a form where it
104238: ** could be used with an index to access pSrc, assuming an appropriate
104239: ** index existed.
104240: */
104241: static int termCanDriveIndex(
104242: WhereTerm *pTerm, /* WHERE clause term to check */
104243: struct SrcList_item *pSrc, /* Table we are trying to access */
104244: Bitmask notReady /* Tables in outer loops of the join */
104245: ){
104246: char aff;
104247: if( pTerm->leftCursor!=pSrc->iCursor ) return 0;
104248: if( pTerm->eOperator!=WO_EQ ) return 0;
104249: if( (pTerm->prereqRight & notReady)!=0 ) return 0;
104250: aff = pSrc->pTab->aCol[pTerm->u.leftColumn].affinity;
104251: if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0;
104252: return 1;
104253: }
104254: #endif
104255:
104256: #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
104257: /*
104258: ** If the query plan for pSrc specified in pCost is a full table scan
104259: ** and indexing is allows (if there is no NOT INDEXED clause) and it
104260: ** possible to construct a transient index that would perform better
104261: ** than a full table scan even when the cost of constructing the index
104262: ** is taken into account, then alter the query plan to use the
104263: ** transient index.
104264: */
1.2.2.1 ! misho 104265: static void bestAutomaticIndex(WhereBestIdx *p){
! 104266: Parse *pParse = p->pParse; /* The parsing context */
! 104267: WhereClause *pWC = p->pWC; /* The WHERE clause */
! 104268: struct SrcList_item *pSrc = p->pSrc; /* The FROM clause term to search */
! 104269: double nTableRow; /* Rows in the input table */
! 104270: double logN; /* log(nTableRow) */
1.2 misho 104271: double costTempIdx; /* per-query cost of the transient index */
104272: WhereTerm *pTerm; /* A single term of the WHERE clause */
104273: WhereTerm *pWCEnd; /* End of pWC->a[] */
104274: Table *pTable; /* Table tht might be indexed */
104275:
104276: if( pParse->nQueryLoop<=(double)1 ){
104277: /* There is no point in building an automatic index for a single scan */
104278: return;
104279: }
104280: if( (pParse->db->flags & SQLITE_AutoIndex)==0 ){
104281: /* Automatic indices are disabled at run-time */
104282: return;
104283: }
1.2.2.1 ! misho 104284: if( (p->cost.plan.wsFlags & WHERE_NOT_FULLSCAN)!=0
! 104285: && (p->cost.plan.wsFlags & WHERE_COVER_SCAN)==0
! 104286: ){
1.2 misho 104287: /* We already have some kind of index in use for this query. */
104288: return;
104289: }
1.2.2.1 ! misho 104290: if( pSrc->viaCoroutine ){
! 104291: /* Cannot index a co-routine */
! 104292: return;
! 104293: }
1.2 misho 104294: if( pSrc->notIndexed ){
104295: /* The NOT INDEXED clause appears in the SQL. */
104296: return;
104297: }
104298: if( pSrc->isCorrelated ){
104299: /* The source is a correlated sub-query. No point in indexing it. */
104300: return;
104301: }
104302:
104303: assert( pParse->nQueryLoop >= (double)1 );
104304: pTable = pSrc->pTab;
104305: nTableRow = pTable->nRowEst;
104306: logN = estLog(nTableRow);
104307: costTempIdx = 2*logN*(nTableRow/pParse->nQueryLoop + 1);
1.2.2.1 ! misho 104308: if( costTempIdx>=p->cost.rCost ){
1.2 misho 104309: /* The cost of creating the transient table would be greater than
104310: ** doing the full table scan */
104311: return;
104312: }
104313:
104314: /* Search for any equality comparison term */
104315: pWCEnd = &pWC->a[pWC->nTerm];
104316: for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
1.2.2.1 ! misho 104317: if( termCanDriveIndex(pTerm, pSrc, p->notReady) ){
1.2 misho 104318: WHERETRACE(("auto-index reduces cost from %.1f to %.1f\n",
1.2.2.1 ! misho 104319: p->cost.rCost, costTempIdx));
! 104320: p->cost.rCost = costTempIdx;
! 104321: p->cost.plan.nRow = logN + 1;
! 104322: p->cost.plan.wsFlags = WHERE_TEMP_INDEX;
! 104323: p->cost.used = pTerm->prereqRight;
1.2 misho 104324: break;
104325: }
104326: }
104327: }
104328: #else
1.2.2.1 ! misho 104329: # define bestAutomaticIndex(A) /* no-op */
1.2 misho 104330: #endif /* SQLITE_OMIT_AUTOMATIC_INDEX */
104331:
104332:
104333: #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
104334: /*
104335: ** Generate code to construct the Index object for an automatic index
104336: ** and to set up the WhereLevel object pLevel so that the code generator
104337: ** makes use of the automatic index.
104338: */
104339: static void constructAutomaticIndex(
104340: Parse *pParse, /* The parsing context */
104341: WhereClause *pWC, /* The WHERE clause */
104342: struct SrcList_item *pSrc, /* The FROM clause term to get the next index */
104343: Bitmask notReady, /* Mask of cursors that are not available */
104344: WhereLevel *pLevel /* Write new index here */
104345: ){
104346: int nColumn; /* Number of columns in the constructed index */
104347: WhereTerm *pTerm; /* A single term of the WHERE clause */
104348: WhereTerm *pWCEnd; /* End of pWC->a[] */
104349: int nByte; /* Byte of memory needed for pIdx */
104350: Index *pIdx; /* Object describing the transient index */
104351: Vdbe *v; /* Prepared statement under construction */
104352: int addrInit; /* Address of the initialization bypass jump */
104353: Table *pTable; /* The table being indexed */
104354: KeyInfo *pKeyinfo; /* Key information for the index */
104355: int addrTop; /* Top of the index fill loop */
104356: int regRecord; /* Register holding an index record */
104357: int n; /* Column counter */
104358: int i; /* Loop counter */
104359: int mxBitCol; /* Maximum column in pSrc->colUsed */
104360: CollSeq *pColl; /* Collating sequence to on a column */
104361: Bitmask idxCols; /* Bitmap of columns used for indexing */
104362: Bitmask extraCols; /* Bitmap of additional columns */
104363:
104364: /* Generate code to skip over the creation and initialization of the
104365: ** transient index on 2nd and subsequent iterations of the loop. */
104366: v = pParse->pVdbe;
104367: assert( v!=0 );
104368: addrInit = sqlite3CodeOnce(pParse);
104369:
104370: /* Count the number of columns that will be added to the index
104371: ** and used to match WHERE clause constraints */
104372: nColumn = 0;
104373: pTable = pSrc->pTab;
104374: pWCEnd = &pWC->a[pWC->nTerm];
104375: idxCols = 0;
104376: for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
104377: if( termCanDriveIndex(pTerm, pSrc, notReady) ){
104378: int iCol = pTerm->u.leftColumn;
104379: Bitmask cMask = iCol>=BMS ? ((Bitmask)1)<<(BMS-1) : ((Bitmask)1)<<iCol;
104380: testcase( iCol==BMS );
104381: testcase( iCol==BMS-1 );
104382: if( (idxCols & cMask)==0 ){
104383: nColumn++;
104384: idxCols |= cMask;
104385: }
104386: }
104387: }
104388: assert( nColumn>0 );
104389: pLevel->plan.nEq = nColumn;
104390:
104391: /* Count the number of additional columns needed to create a
104392: ** covering index. A "covering index" is an index that contains all
104393: ** columns that are needed by the query. With a covering index, the
104394: ** original table never needs to be accessed. Automatic indices must
104395: ** be a covering index because the index will not be updated if the
104396: ** original table changes and the index and table cannot both be used
104397: ** if they go out of sync.
104398: */
104399: extraCols = pSrc->colUsed & (~idxCols | (((Bitmask)1)<<(BMS-1)));
104400: mxBitCol = (pTable->nCol >= BMS-1) ? BMS-1 : pTable->nCol;
104401: testcase( pTable->nCol==BMS-1 );
104402: testcase( pTable->nCol==BMS-2 );
104403: for(i=0; i<mxBitCol; i++){
104404: if( extraCols & (((Bitmask)1)<<i) ) nColumn++;
104405: }
104406: if( pSrc->colUsed & (((Bitmask)1)<<(BMS-1)) ){
104407: nColumn += pTable->nCol - BMS + 1;
104408: }
104409: pLevel->plan.wsFlags |= WHERE_COLUMN_EQ | WHERE_IDX_ONLY | WO_EQ;
104410:
104411: /* Construct the Index object to describe this index */
104412: nByte = sizeof(Index);
104413: nByte += nColumn*sizeof(int); /* Index.aiColumn */
104414: nByte += nColumn*sizeof(char*); /* Index.azColl */
104415: nByte += nColumn; /* Index.aSortOrder */
104416: pIdx = sqlite3DbMallocZero(pParse->db, nByte);
104417: if( pIdx==0 ) return;
104418: pLevel->plan.u.pIdx = pIdx;
104419: pIdx->azColl = (char**)&pIdx[1];
104420: pIdx->aiColumn = (int*)&pIdx->azColl[nColumn];
104421: pIdx->aSortOrder = (u8*)&pIdx->aiColumn[nColumn];
104422: pIdx->zName = "auto-index";
104423: pIdx->nColumn = nColumn;
104424: pIdx->pTable = pTable;
104425: n = 0;
104426: idxCols = 0;
104427: for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){
104428: if( termCanDriveIndex(pTerm, pSrc, notReady) ){
104429: int iCol = pTerm->u.leftColumn;
104430: Bitmask cMask = iCol>=BMS ? ((Bitmask)1)<<(BMS-1) : ((Bitmask)1)<<iCol;
104431: if( (idxCols & cMask)==0 ){
104432: Expr *pX = pTerm->pExpr;
104433: idxCols |= cMask;
104434: pIdx->aiColumn[n] = pTerm->u.leftColumn;
104435: pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
104436: pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : "BINARY";
104437: n++;
104438: }
104439: }
104440: }
104441: assert( (u32)n==pLevel->plan.nEq );
104442:
104443: /* Add additional columns needed to make the automatic index into
104444: ** a covering index */
104445: for(i=0; i<mxBitCol; i++){
104446: if( extraCols & (((Bitmask)1)<<i) ){
104447: pIdx->aiColumn[n] = i;
104448: pIdx->azColl[n] = "BINARY";
104449: n++;
104450: }
104451: }
104452: if( pSrc->colUsed & (((Bitmask)1)<<(BMS-1)) ){
104453: for(i=BMS-1; i<pTable->nCol; i++){
104454: pIdx->aiColumn[n] = i;
104455: pIdx->azColl[n] = "BINARY";
104456: n++;
104457: }
104458: }
104459: assert( n==nColumn );
104460:
104461: /* Create the automatic index */
104462: pKeyinfo = sqlite3IndexKeyinfo(pParse, pIdx);
104463: assert( pLevel->iIdxCur>=0 );
104464: sqlite3VdbeAddOp4(v, OP_OpenAutoindex, pLevel->iIdxCur, nColumn+1, 0,
104465: (char*)pKeyinfo, P4_KEYINFO_HANDOFF);
104466: VdbeComment((v, "for %s", pTable->zName));
104467:
104468: /* Fill the automatic index with content */
104469: addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur);
104470: regRecord = sqlite3GetTempReg(pParse);
104471: sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 1);
104472: sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord);
104473: sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT);
104474: sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1);
104475: sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX);
104476: sqlite3VdbeJumpHere(v, addrTop);
104477: sqlite3ReleaseTempReg(pParse, regRecord);
104478:
104479: /* Jump here when skipping the initialization */
104480: sqlite3VdbeJumpHere(v, addrInit);
104481: }
104482: #endif /* SQLITE_OMIT_AUTOMATIC_INDEX */
104483:
104484: #ifndef SQLITE_OMIT_VIRTUALTABLE
104485: /*
104486: ** Allocate and populate an sqlite3_index_info structure. It is the
104487: ** responsibility of the caller to eventually release the structure
104488: ** by passing the pointer returned by this function to sqlite3_free().
104489: */
1.2.2.1 ! misho 104490: static sqlite3_index_info *allocateIndexInfo(WhereBestIdx *p){
! 104491: Parse *pParse = p->pParse;
! 104492: WhereClause *pWC = p->pWC;
! 104493: struct SrcList_item *pSrc = p->pSrc;
! 104494: ExprList *pOrderBy = p->pOrderBy;
1.2 misho 104495: int i, j;
104496: int nTerm;
104497: struct sqlite3_index_constraint *pIdxCons;
104498: struct sqlite3_index_orderby *pIdxOrderBy;
104499: struct sqlite3_index_constraint_usage *pUsage;
104500: WhereTerm *pTerm;
104501: int nOrderBy;
104502: sqlite3_index_info *pIdxInfo;
104503:
104504: WHERETRACE(("Recomputing index info for %s...\n", pSrc->pTab->zName));
104505:
104506: /* Count the number of possible WHERE clause constraints referring
104507: ** to this virtual table */
104508: for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
104509: if( pTerm->leftCursor != pSrc->iCursor ) continue;
104510: assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
104511: testcase( pTerm->eOperator==WO_IN );
104512: testcase( pTerm->eOperator==WO_ISNULL );
104513: if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
104514: if( pTerm->wtFlags & TERM_VNULL ) continue;
104515: nTerm++;
104516: }
104517:
104518: /* If the ORDER BY clause contains only columns in the current
104519: ** virtual table then allocate space for the aOrderBy part of
104520: ** the sqlite3_index_info structure.
104521: */
104522: nOrderBy = 0;
104523: if( pOrderBy ){
1.2.2.1 ! misho 104524: int n = pOrderBy->nExpr;
! 104525: for(i=0; i<n; i++){
1.2 misho 104526: Expr *pExpr = pOrderBy->a[i].pExpr;
104527: if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break;
104528: }
1.2.2.1 ! misho 104529: if( i==n){
! 104530: nOrderBy = n;
1.2 misho 104531: }
104532: }
104533:
104534: /* Allocate the sqlite3_index_info structure
104535: */
104536: pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo)
104537: + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm
104538: + sizeof(*pIdxOrderBy)*nOrderBy );
104539: if( pIdxInfo==0 ){
104540: sqlite3ErrorMsg(pParse, "out of memory");
104541: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
104542: return 0;
104543: }
104544:
104545: /* Initialize the structure. The sqlite3_index_info structure contains
104546: ** many fields that are declared "const" to prevent xBestIndex from
104547: ** changing them. We have to do some funky casting in order to
104548: ** initialize those fields.
104549: */
104550: pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1];
104551: pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm];
104552: pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy];
104553: *(int*)&pIdxInfo->nConstraint = nTerm;
104554: *(int*)&pIdxInfo->nOrderBy = nOrderBy;
104555: *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint = pIdxCons;
104556: *(struct sqlite3_index_orderby**)&pIdxInfo->aOrderBy = pIdxOrderBy;
104557: *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage =
104558: pUsage;
104559:
104560: for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){
104561: if( pTerm->leftCursor != pSrc->iCursor ) continue;
104562: assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
104563: testcase( pTerm->eOperator==WO_IN );
104564: testcase( pTerm->eOperator==WO_ISNULL );
104565: if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
104566: if( pTerm->wtFlags & TERM_VNULL ) continue;
104567: pIdxCons[j].iColumn = pTerm->u.leftColumn;
104568: pIdxCons[j].iTermOffset = i;
104569: pIdxCons[j].op = (u8)pTerm->eOperator;
104570: /* The direct assignment in the previous line is possible only because
104571: ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The
104572: ** following asserts verify this fact. */
104573: assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ );
104574: assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT );
104575: assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE );
104576: assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT );
104577: assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE );
104578: assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH );
104579: assert( pTerm->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) );
104580: j++;
104581: }
104582: for(i=0; i<nOrderBy; i++){
104583: Expr *pExpr = pOrderBy->a[i].pExpr;
104584: pIdxOrderBy[i].iColumn = pExpr->iColumn;
104585: pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder;
104586: }
104587:
104588: return pIdxInfo;
104589: }
104590:
104591: /*
104592: ** The table object reference passed as the second argument to this function
104593: ** must represent a virtual table. This function invokes the xBestIndex()
104594: ** method of the virtual table with the sqlite3_index_info pointer passed
104595: ** as the argument.
104596: **
104597: ** If an error occurs, pParse is populated with an error message and a
104598: ** non-zero value is returned. Otherwise, 0 is returned and the output
104599: ** part of the sqlite3_index_info structure is left populated.
104600: **
104601: ** Whether or not an error is returned, it is the responsibility of the
104602: ** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates
104603: ** that this is required.
104604: */
104605: static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){
104606: sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab;
104607: int i;
104608: int rc;
104609:
104610: WHERETRACE(("xBestIndex for %s\n", pTab->zName));
104611: TRACE_IDX_INPUTS(p);
104612: rc = pVtab->pModule->xBestIndex(pVtab, p);
104613: TRACE_IDX_OUTPUTS(p);
104614:
104615: if( rc!=SQLITE_OK ){
104616: if( rc==SQLITE_NOMEM ){
104617: pParse->db->mallocFailed = 1;
104618: }else if( !pVtab->zErrMsg ){
104619: sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc));
104620: }else{
104621: sqlite3ErrorMsg(pParse, "%s", pVtab->zErrMsg);
104622: }
104623: }
104624: sqlite3_free(pVtab->zErrMsg);
104625: pVtab->zErrMsg = 0;
104626:
104627: for(i=0; i<p->nConstraint; i++){
104628: if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){
104629: sqlite3ErrorMsg(pParse,
104630: "table %s: xBestIndex returned an invalid plan", pTab->zName);
104631: }
104632: }
104633:
104634: return pParse->nErr;
104635: }
104636:
104637:
104638: /*
104639: ** Compute the best index for a virtual table.
104640: **
104641: ** The best index is computed by the xBestIndex method of the virtual
104642: ** table module. This routine is really just a wrapper that sets up
104643: ** the sqlite3_index_info structure that is used to communicate with
104644: ** xBestIndex.
104645: **
104646: ** In a join, this routine might be called multiple times for the
104647: ** same virtual table. The sqlite3_index_info structure is created
104648: ** and initialized on the first invocation and reused on all subsequent
104649: ** invocations. The sqlite3_index_info structure is also used when
104650: ** code is generated to access the virtual table. The whereInfoDelete()
104651: ** routine takes care of freeing the sqlite3_index_info structure after
104652: ** everybody has finished with it.
104653: */
1.2.2.1 ! misho 104654: static void bestVirtualIndex(WhereBestIdx *p){
! 104655: Parse *pParse = p->pParse; /* The parsing context */
! 104656: WhereClause *pWC = p->pWC; /* The WHERE clause */
! 104657: struct SrcList_item *pSrc = p->pSrc; /* The FROM clause term to search */
1.2 misho 104658: Table *pTab = pSrc->pTab;
104659: sqlite3_index_info *pIdxInfo;
104660: struct sqlite3_index_constraint *pIdxCons;
104661: struct sqlite3_index_constraint_usage *pUsage;
104662: WhereTerm *pTerm;
104663: int i, j;
104664: int nOrderBy;
104665: double rCost;
104666:
104667: /* Make sure wsFlags is initialized to some sane value. Otherwise, if the
104668: ** malloc in allocateIndexInfo() fails and this function returns leaving
104669: ** wsFlags in an uninitialized state, the caller may behave unpredictably.
104670: */
1.2.2.1 ! misho 104671: memset(&p->cost, 0, sizeof(p->cost));
! 104672: p->cost.plan.wsFlags = WHERE_VIRTUALTABLE;
1.2 misho 104673:
104674: /* If the sqlite3_index_info structure has not been previously
104675: ** allocated and initialized, then allocate and initialize it now.
104676: */
1.2.2.1 ! misho 104677: pIdxInfo = *p->ppIdxInfo;
1.2 misho 104678: if( pIdxInfo==0 ){
1.2.2.1 ! misho 104679: *p->ppIdxInfo = pIdxInfo = allocateIndexInfo(p);
1.2 misho 104680: }
104681: if( pIdxInfo==0 ){
104682: return;
104683: }
104684:
104685: /* At this point, the sqlite3_index_info structure that pIdxInfo points
104686: ** to will have been initialized, either during the current invocation or
104687: ** during some prior invocation. Now we just have to customize the
104688: ** details of pIdxInfo for the current invocation and pass it to
104689: ** xBestIndex.
104690: */
104691:
104692: /* The module name must be defined. Also, by this point there must
104693: ** be a pointer to an sqlite3_vtab structure. Otherwise
104694: ** sqlite3ViewGetColumnNames() would have picked up the error.
104695: */
104696: assert( pTab->azModuleArg && pTab->azModuleArg[0] );
104697: assert( sqlite3GetVTable(pParse->db, pTab) );
104698:
104699: /* Set the aConstraint[].usable fields and initialize all
104700: ** output variables to zero.
104701: **
104702: ** aConstraint[].usable is true for constraints where the right-hand
104703: ** side contains only references to tables to the left of the current
104704: ** table. In other words, if the constraint is of the form:
104705: **
104706: ** column = expr
104707: **
104708: ** and we are evaluating a join, then the constraint on column is
104709: ** only valid if all tables referenced in expr occur to the left
104710: ** of the table containing column.
104711: **
104712: ** The aConstraints[] array contains entries for all constraints
104713: ** on the current table. That way we only have to compute it once
104714: ** even though we might try to pick the best index multiple times.
104715: ** For each attempt at picking an index, the order of tables in the
104716: ** join might be different so we have to recompute the usable flag
104717: ** each time.
104718: */
104719: pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
104720: pUsage = pIdxInfo->aConstraintUsage;
104721: for(i=0; i<pIdxInfo->nConstraint; i++, pIdxCons++){
104722: j = pIdxCons->iTermOffset;
104723: pTerm = &pWC->a[j];
1.2.2.1 ! misho 104724: pIdxCons->usable = (pTerm->prereqRight&p->notReady) ? 0 : 1;
1.2 misho 104725: }
104726: memset(pUsage, 0, sizeof(pUsage[0])*pIdxInfo->nConstraint);
104727: if( pIdxInfo->needToFreeIdxStr ){
104728: sqlite3_free(pIdxInfo->idxStr);
104729: }
104730: pIdxInfo->idxStr = 0;
104731: pIdxInfo->idxNum = 0;
104732: pIdxInfo->needToFreeIdxStr = 0;
104733: pIdxInfo->orderByConsumed = 0;
104734: /* ((double)2) In case of SQLITE_OMIT_FLOATING_POINT... */
104735: pIdxInfo->estimatedCost = SQLITE_BIG_DBL / ((double)2);
104736: nOrderBy = pIdxInfo->nOrderBy;
1.2.2.1 ! misho 104737: if( !p->pOrderBy ){
1.2 misho 104738: pIdxInfo->nOrderBy = 0;
104739: }
104740:
104741: if( vtabBestIndex(pParse, pTab, pIdxInfo) ){
104742: return;
104743: }
104744:
104745: pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
104746: for(i=0; i<pIdxInfo->nConstraint; i++){
104747: if( pUsage[i].argvIndex>0 ){
1.2.2.1 ! misho 104748: p->cost.used |= pWC->a[pIdxCons[i].iTermOffset].prereqRight;
1.2 misho 104749: }
104750: }
104751:
104752: /* If there is an ORDER BY clause, and the selected virtual table index
104753: ** does not satisfy it, increase the cost of the scan accordingly. This
104754: ** matches the processing for non-virtual tables in bestBtreeIndex().
104755: */
104756: rCost = pIdxInfo->estimatedCost;
1.2.2.1 ! misho 104757: if( p->pOrderBy && pIdxInfo->orderByConsumed==0 ){
1.2 misho 104758: rCost += estLog(rCost)*rCost;
104759: }
104760:
104761: /* The cost is not allowed to be larger than SQLITE_BIG_DBL (the
104762: ** inital value of lowestCost in this loop. If it is, then the
104763: ** (cost<lowestCost) test below will never be true.
104764: **
104765: ** Use "(double)2" instead of "2.0" in case OMIT_FLOATING_POINT
104766: ** is defined.
104767: */
104768: if( (SQLITE_BIG_DBL/((double)2))<rCost ){
1.2.2.1 ! misho 104769: p->cost.rCost = (SQLITE_BIG_DBL/((double)2));
1.2 misho 104770: }else{
1.2.2.1 ! misho 104771: p->cost.rCost = rCost;
1.2 misho 104772: }
1.2.2.1 ! misho 104773: p->cost.plan.u.pVtabIdx = pIdxInfo;
1.2 misho 104774: if( pIdxInfo->orderByConsumed ){
1.2.2.1 ! misho 104775: p->cost.plan.wsFlags |= WHERE_ORDERED;
! 104776: p->cost.plan.nOBSat = nOrderBy;
! 104777: }else{
! 104778: p->cost.plan.nOBSat = p->i ? p->aLevel[p->i-1].plan.nOBSat : 0;
1.2 misho 104779: }
1.2.2.1 ! misho 104780: p->cost.plan.nEq = 0;
1.2 misho 104781: pIdxInfo->nOrderBy = nOrderBy;
104782:
104783: /* Try to find a more efficient access pattern by using multiple indexes
104784: ** to optimize an OR expression within the WHERE clause.
104785: */
1.2.2.1 ! misho 104786: bestOrClauseIndex(p);
1.2 misho 104787: }
104788: #endif /* SQLITE_OMIT_VIRTUALTABLE */
104789:
104790: #ifdef SQLITE_ENABLE_STAT3
104791: /*
104792: ** Estimate the location of a particular key among all keys in an
104793: ** index. Store the results in aStat as follows:
104794: **
104795: ** aStat[0] Est. number of rows less than pVal
104796: ** aStat[1] Est. number of rows equal to pVal
104797: **
104798: ** Return SQLITE_OK on success.
104799: */
104800: static int whereKeyStats(
104801: Parse *pParse, /* Database connection */
104802: Index *pIdx, /* Index to consider domain of */
104803: sqlite3_value *pVal, /* Value to consider */
104804: int roundUp, /* Round up if true. Round down if false */
104805: tRowcnt *aStat /* OUT: stats written here */
104806: ){
104807: tRowcnt n;
104808: IndexSample *aSample;
104809: int i, eType;
104810: int isEq = 0;
104811: i64 v;
104812: double r, rS;
104813:
104814: assert( roundUp==0 || roundUp==1 );
104815: assert( pIdx->nSample>0 );
104816: if( pVal==0 ) return SQLITE_ERROR;
104817: n = pIdx->aiRowEst[0];
104818: aSample = pIdx->aSample;
104819: eType = sqlite3_value_type(pVal);
104820:
104821: if( eType==SQLITE_INTEGER ){
104822: v = sqlite3_value_int64(pVal);
104823: r = (i64)v;
104824: for(i=0; i<pIdx->nSample; i++){
104825: if( aSample[i].eType==SQLITE_NULL ) continue;
104826: if( aSample[i].eType>=SQLITE_TEXT ) break;
104827: if( aSample[i].eType==SQLITE_INTEGER ){
104828: if( aSample[i].u.i>=v ){
104829: isEq = aSample[i].u.i==v;
104830: break;
104831: }
104832: }else{
104833: assert( aSample[i].eType==SQLITE_FLOAT );
104834: if( aSample[i].u.r>=r ){
104835: isEq = aSample[i].u.r==r;
104836: break;
104837: }
104838: }
104839: }
104840: }else if( eType==SQLITE_FLOAT ){
104841: r = sqlite3_value_double(pVal);
104842: for(i=0; i<pIdx->nSample; i++){
104843: if( aSample[i].eType==SQLITE_NULL ) continue;
104844: if( aSample[i].eType>=SQLITE_TEXT ) break;
104845: if( aSample[i].eType==SQLITE_FLOAT ){
104846: rS = aSample[i].u.r;
104847: }else{
104848: rS = aSample[i].u.i;
104849: }
104850: if( rS>=r ){
104851: isEq = rS==r;
104852: break;
104853: }
104854: }
104855: }else if( eType==SQLITE_NULL ){
104856: i = 0;
104857: if( aSample[0].eType==SQLITE_NULL ) isEq = 1;
104858: }else{
104859: assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB );
104860: for(i=0; i<pIdx->nSample; i++){
104861: if( aSample[i].eType==SQLITE_TEXT || aSample[i].eType==SQLITE_BLOB ){
104862: break;
104863: }
104864: }
104865: if( i<pIdx->nSample ){
104866: sqlite3 *db = pParse->db;
104867: CollSeq *pColl;
104868: const u8 *z;
104869: if( eType==SQLITE_BLOB ){
104870: z = (const u8 *)sqlite3_value_blob(pVal);
104871: pColl = db->pDfltColl;
104872: assert( pColl->enc==SQLITE_UTF8 );
104873: }else{
1.2.2.1 ! misho 104874: pColl = sqlite3GetCollSeq(pParse, SQLITE_UTF8, 0, *pIdx->azColl);
1.2 misho 104875: if( pColl==0 ){
104876: return SQLITE_ERROR;
104877: }
104878: z = (const u8 *)sqlite3ValueText(pVal, pColl->enc);
104879: if( !z ){
104880: return SQLITE_NOMEM;
104881: }
104882: assert( z && pColl && pColl->xCmp );
104883: }
104884: n = sqlite3ValueBytes(pVal, pColl->enc);
104885:
104886: for(; i<pIdx->nSample; i++){
104887: int c;
104888: int eSampletype = aSample[i].eType;
104889: if( eSampletype<eType ) continue;
104890: if( eSampletype!=eType ) break;
104891: #ifndef SQLITE_OMIT_UTF16
104892: if( pColl->enc!=SQLITE_UTF8 ){
104893: int nSample;
104894: char *zSample = sqlite3Utf8to16(
104895: db, pColl->enc, aSample[i].u.z, aSample[i].nByte, &nSample
104896: );
104897: if( !zSample ){
104898: assert( db->mallocFailed );
104899: return SQLITE_NOMEM;
104900: }
104901: c = pColl->xCmp(pColl->pUser, nSample, zSample, n, z);
104902: sqlite3DbFree(db, zSample);
104903: }else
104904: #endif
104905: {
104906: c = pColl->xCmp(pColl->pUser, aSample[i].nByte, aSample[i].u.z, n, z);
104907: }
104908: if( c>=0 ){
104909: if( c==0 ) isEq = 1;
104910: break;
104911: }
104912: }
104913: }
104914: }
104915:
104916: /* At this point, aSample[i] is the first sample that is greater than
104917: ** or equal to pVal. Or if i==pIdx->nSample, then all samples are less
104918: ** than pVal. If aSample[i]==pVal, then isEq==1.
104919: */
104920: if( isEq ){
104921: assert( i<pIdx->nSample );
104922: aStat[0] = aSample[i].nLt;
104923: aStat[1] = aSample[i].nEq;
104924: }else{
104925: tRowcnt iLower, iUpper, iGap;
104926: if( i==0 ){
104927: iLower = 0;
104928: iUpper = aSample[0].nLt;
104929: }else{
104930: iUpper = i>=pIdx->nSample ? n : aSample[i].nLt;
104931: iLower = aSample[i-1].nEq + aSample[i-1].nLt;
104932: }
104933: aStat[1] = pIdx->avgEq;
104934: if( iLower>=iUpper ){
104935: iGap = 0;
104936: }else{
104937: iGap = iUpper - iLower;
104938: }
104939: if( roundUp ){
104940: iGap = (iGap*2)/3;
104941: }else{
104942: iGap = iGap/3;
104943: }
104944: aStat[0] = iLower + iGap;
104945: }
104946: return SQLITE_OK;
104947: }
104948: #endif /* SQLITE_ENABLE_STAT3 */
104949:
104950: /*
104951: ** If expression pExpr represents a literal value, set *pp to point to
104952: ** an sqlite3_value structure containing the same value, with affinity
104953: ** aff applied to it, before returning. It is the responsibility of the
104954: ** caller to eventually release this structure by passing it to
104955: ** sqlite3ValueFree().
104956: **
104957: ** If the current parse is a recompile (sqlite3Reprepare()) and pExpr
104958: ** is an SQL variable that currently has a non-NULL value bound to it,
104959: ** create an sqlite3_value structure containing this value, again with
104960: ** affinity aff applied to it, instead.
104961: **
104962: ** If neither of the above apply, set *pp to NULL.
104963: **
104964: ** If an error occurs, return an error code. Otherwise, SQLITE_OK.
104965: */
104966: #ifdef SQLITE_ENABLE_STAT3
104967: static int valueFromExpr(
104968: Parse *pParse,
104969: Expr *pExpr,
104970: u8 aff,
104971: sqlite3_value **pp
104972: ){
104973: if( pExpr->op==TK_VARIABLE
104974: || (pExpr->op==TK_REGISTER && pExpr->op2==TK_VARIABLE)
104975: ){
104976: int iVar = pExpr->iColumn;
104977: sqlite3VdbeSetVarmask(pParse->pVdbe, iVar);
104978: *pp = sqlite3VdbeGetValue(pParse->pReprepare, iVar, aff);
104979: return SQLITE_OK;
104980: }
104981: return sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, aff, pp);
104982: }
104983: #endif
104984:
104985: /*
104986: ** This function is used to estimate the number of rows that will be visited
104987: ** by scanning an index for a range of values. The range may have an upper
104988: ** bound, a lower bound, or both. The WHERE clause terms that set the upper
104989: ** and lower bounds are represented by pLower and pUpper respectively. For
104990: ** example, assuming that index p is on t1(a):
104991: **
104992: ** ... FROM t1 WHERE a > ? AND a < ? ...
104993: ** |_____| |_____|
104994: ** | |
104995: ** pLower pUpper
104996: **
104997: ** If either of the upper or lower bound is not present, then NULL is passed in
104998: ** place of the corresponding WhereTerm.
104999: **
105000: ** The nEq parameter is passed the index of the index column subject to the
105001: ** range constraint. Or, equivalently, the number of equality constraints
105002: ** optimized by the proposed index scan. For example, assuming index p is
105003: ** on t1(a, b), and the SQL query is:
105004: **
105005: ** ... FROM t1 WHERE a = ? AND b > ? AND b < ? ...
105006: **
105007: ** then nEq should be passed the value 1 (as the range restricted column,
105008: ** b, is the second left-most column of the index). Or, if the query is:
105009: **
105010: ** ... FROM t1 WHERE a > ? AND a < ? ...
105011: **
105012: ** then nEq should be passed 0.
105013: **
105014: ** The returned value is an integer divisor to reduce the estimated
105015: ** search space. A return value of 1 means that range constraints are
105016: ** no help at all. A return value of 2 means range constraints are
105017: ** expected to reduce the search space by half. And so forth...
105018: **
105019: ** In the absence of sqlite_stat3 ANALYZE data, each range inequality
105020: ** reduces the search space by a factor of 4. Hence a single constraint (x>?)
105021: ** results in a return of 4 and a range constraint (x>? AND x<?) results
105022: ** in a return of 16.
105023: */
105024: static int whereRangeScanEst(
105025: Parse *pParse, /* Parsing & code generating context */
105026: Index *p, /* The index containing the range-compared column; "x" */
105027: int nEq, /* index into p->aCol[] of the range-compared column */
105028: WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */
105029: WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */
105030: double *pRangeDiv /* OUT: Reduce search space by this divisor */
105031: ){
105032: int rc = SQLITE_OK;
105033:
105034: #ifdef SQLITE_ENABLE_STAT3
105035:
105036: if( nEq==0 && p->nSample ){
105037: sqlite3_value *pRangeVal;
105038: tRowcnt iLower = 0;
105039: tRowcnt iUpper = p->aiRowEst[0];
105040: tRowcnt a[2];
105041: u8 aff = p->pTable->aCol[p->aiColumn[0]].affinity;
105042:
105043: if( pLower ){
105044: Expr *pExpr = pLower->pExpr->pRight;
105045: rc = valueFromExpr(pParse, pExpr, aff, &pRangeVal);
105046: assert( pLower->eOperator==WO_GT || pLower->eOperator==WO_GE );
105047: if( rc==SQLITE_OK
105048: && whereKeyStats(pParse, p, pRangeVal, 0, a)==SQLITE_OK
105049: ){
105050: iLower = a[0];
105051: if( pLower->eOperator==WO_GT ) iLower += a[1];
105052: }
105053: sqlite3ValueFree(pRangeVal);
105054: }
105055: if( rc==SQLITE_OK && pUpper ){
105056: Expr *pExpr = pUpper->pExpr->pRight;
105057: rc = valueFromExpr(pParse, pExpr, aff, &pRangeVal);
105058: assert( pUpper->eOperator==WO_LT || pUpper->eOperator==WO_LE );
105059: if( rc==SQLITE_OK
105060: && whereKeyStats(pParse, p, pRangeVal, 1, a)==SQLITE_OK
105061: ){
105062: iUpper = a[0];
105063: if( pUpper->eOperator==WO_LE ) iUpper += a[1];
105064: }
105065: sqlite3ValueFree(pRangeVal);
105066: }
105067: if( rc==SQLITE_OK ){
105068: if( iUpper<=iLower ){
105069: *pRangeDiv = (double)p->aiRowEst[0];
105070: }else{
105071: *pRangeDiv = (double)p->aiRowEst[0]/(double)(iUpper - iLower);
105072: }
105073: WHERETRACE(("range scan regions: %u..%u div=%g\n",
105074: (u32)iLower, (u32)iUpper, *pRangeDiv));
105075: return SQLITE_OK;
105076: }
105077: }
105078: #else
105079: UNUSED_PARAMETER(pParse);
105080: UNUSED_PARAMETER(p);
105081: UNUSED_PARAMETER(nEq);
105082: #endif
105083: assert( pLower || pUpper );
105084: *pRangeDiv = (double)1;
105085: if( pLower && (pLower->wtFlags & TERM_VNULL)==0 ) *pRangeDiv *= (double)4;
105086: if( pUpper ) *pRangeDiv *= (double)4;
105087: return rc;
105088: }
105089:
105090: #ifdef SQLITE_ENABLE_STAT3
105091: /*
105092: ** Estimate the number of rows that will be returned based on
105093: ** an equality constraint x=VALUE and where that VALUE occurs in
105094: ** the histogram data. This only works when x is the left-most
105095: ** column of an index and sqlite_stat3 histogram data is available
105096: ** for that index. When pExpr==NULL that means the constraint is
105097: ** "x IS NULL" instead of "x=VALUE".
105098: **
105099: ** Write the estimated row count into *pnRow and return SQLITE_OK.
105100: ** If unable to make an estimate, leave *pnRow unchanged and return
105101: ** non-zero.
105102: **
105103: ** This routine can fail if it is unable to load a collating sequence
105104: ** required for string comparison, or if unable to allocate memory
105105: ** for a UTF conversion required for comparison. The error is stored
105106: ** in the pParse structure.
105107: */
105108: static int whereEqualScanEst(
105109: Parse *pParse, /* Parsing & code generating context */
105110: Index *p, /* The index whose left-most column is pTerm */
105111: Expr *pExpr, /* Expression for VALUE in the x=VALUE constraint */
105112: double *pnRow /* Write the revised row estimate here */
105113: ){
105114: sqlite3_value *pRhs = 0; /* VALUE on right-hand side of pTerm */
105115: u8 aff; /* Column affinity */
105116: int rc; /* Subfunction return code */
105117: tRowcnt a[2]; /* Statistics */
105118:
105119: assert( p->aSample!=0 );
105120: assert( p->nSample>0 );
105121: aff = p->pTable->aCol[p->aiColumn[0]].affinity;
105122: if( pExpr ){
105123: rc = valueFromExpr(pParse, pExpr, aff, &pRhs);
105124: if( rc ) goto whereEqualScanEst_cancel;
105125: }else{
105126: pRhs = sqlite3ValueNew(pParse->db);
105127: }
105128: if( pRhs==0 ) return SQLITE_NOTFOUND;
105129: rc = whereKeyStats(pParse, p, pRhs, 0, a);
105130: if( rc==SQLITE_OK ){
105131: WHERETRACE(("equality scan regions: %d\n", (int)a[1]));
105132: *pnRow = a[1];
105133: }
105134: whereEqualScanEst_cancel:
105135: sqlite3ValueFree(pRhs);
105136: return rc;
105137: }
105138: #endif /* defined(SQLITE_ENABLE_STAT3) */
105139:
105140: #ifdef SQLITE_ENABLE_STAT3
105141: /*
105142: ** Estimate the number of rows that will be returned based on
105143: ** an IN constraint where the right-hand side of the IN operator
105144: ** is a list of values. Example:
105145: **
105146: ** WHERE x IN (1,2,3,4)
105147: **
105148: ** Write the estimated row count into *pnRow and return SQLITE_OK.
105149: ** If unable to make an estimate, leave *pnRow unchanged and return
105150: ** non-zero.
105151: **
105152: ** This routine can fail if it is unable to load a collating sequence
105153: ** required for string comparison, or if unable to allocate memory
105154: ** for a UTF conversion required for comparison. The error is stored
105155: ** in the pParse structure.
105156: */
105157: static int whereInScanEst(
105158: Parse *pParse, /* Parsing & code generating context */
105159: Index *p, /* The index whose left-most column is pTerm */
105160: ExprList *pList, /* The value list on the RHS of "x IN (v1,v2,v3,...)" */
105161: double *pnRow /* Write the revised row estimate here */
105162: ){
105163: int rc = SQLITE_OK; /* Subfunction return code */
105164: double nEst; /* Number of rows for a single term */
105165: double nRowEst = (double)0; /* New estimate of the number of rows */
105166: int i; /* Loop counter */
105167:
105168: assert( p->aSample!=0 );
105169: for(i=0; rc==SQLITE_OK && i<pList->nExpr; i++){
105170: nEst = p->aiRowEst[0];
105171: rc = whereEqualScanEst(pParse, p, pList->a[i].pExpr, &nEst);
105172: nRowEst += nEst;
105173: }
105174: if( rc==SQLITE_OK ){
105175: if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0];
105176: *pnRow = nRowEst;
105177: WHERETRACE(("IN row estimate: est=%g\n", nRowEst));
105178: }
105179: return rc;
105180: }
105181: #endif /* defined(SQLITE_ENABLE_STAT3) */
105182:
1.2.2.1 ! misho 105183: /*
! 105184: ** Check to see if column iCol of the table with cursor iTab will appear
! 105185: ** in sorted order according to the current query plan.
! 105186: **
! 105187: ** Return values:
! 105188: **
! 105189: ** 0 iCol is not ordered
! 105190: ** 1 iCol has only a single value
! 105191: ** 2 iCol is in ASC order
! 105192: ** 3 iCol is in DESC order
! 105193: */
! 105194: static int isOrderedColumn(
! 105195: WhereBestIdx *p,
! 105196: int iTab,
! 105197: int iCol
! 105198: ){
! 105199: int i, j;
! 105200: WhereLevel *pLevel = &p->aLevel[p->i-1];
! 105201: Index *pIdx;
! 105202: u8 sortOrder;
! 105203: for(i=p->i-1; i>=0; i--, pLevel--){
! 105204: if( pLevel->iTabCur!=iTab ) continue;
! 105205: if( (pLevel->plan.wsFlags & WHERE_ALL_UNIQUE)!=0 ){
! 105206: return 1;
! 105207: }
! 105208: assert( (pLevel->plan.wsFlags & WHERE_ORDERED)!=0 );
! 105209: if( (pIdx = pLevel->plan.u.pIdx)!=0 ){
! 105210: if( iCol<0 ){
! 105211: sortOrder = 0;
! 105212: testcase( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 );
! 105213: }else{
! 105214: int n = pIdx->nColumn;
! 105215: for(j=0; j<n; j++){
! 105216: if( iCol==pIdx->aiColumn[j] ) break;
! 105217: }
! 105218: if( j>=n ) return 0;
! 105219: sortOrder = pIdx->aSortOrder[j];
! 105220: testcase( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 );
! 105221: }
! 105222: }else{
! 105223: if( iCol!=(-1) ) return 0;
! 105224: sortOrder = 0;
! 105225: testcase( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 );
! 105226: }
! 105227: if( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 ){
! 105228: assert( sortOrder==0 || sortOrder==1 );
! 105229: testcase( sortOrder==1 );
! 105230: sortOrder = 1 - sortOrder;
! 105231: }
! 105232: return sortOrder+2;
! 105233: }
! 105234: return 0;
! 105235: }
! 105236:
! 105237: /*
! 105238: ** This routine decides if pIdx can be used to satisfy the ORDER BY
! 105239: ** clause, either in whole or in part. The return value is the
! 105240: ** cumulative number of terms in the ORDER BY clause that are satisfied
! 105241: ** by the index pIdx and other indices in outer loops.
! 105242: **
! 105243: ** The table being queried has a cursor number of "base". pIdx is the
! 105244: ** index that is postulated for use to access the table.
! 105245: **
! 105246: ** The *pbRev value is set to 0 order 1 depending on whether or not
! 105247: ** pIdx should be run in the forward order or in reverse order.
! 105248: */
! 105249: static int isSortingIndex(
! 105250: WhereBestIdx *p, /* Best index search context */
! 105251: Index *pIdx, /* The index we are testing */
! 105252: int base, /* Cursor number for the table to be sorted */
! 105253: int *pbRev /* Set to 1 for reverse-order scan of pIdx */
! 105254: ){
! 105255: int i; /* Number of pIdx terms used */
! 105256: int j; /* Number of ORDER BY terms satisfied */
! 105257: int sortOrder = 2; /* 0: forward. 1: backward. 2: unknown */
! 105258: int nTerm; /* Number of ORDER BY terms */
! 105259: struct ExprList_item *pOBItem;/* A term of the ORDER BY clause */
! 105260: Table *pTab = pIdx->pTable; /* Table that owns index pIdx */
! 105261: ExprList *pOrderBy; /* The ORDER BY clause */
! 105262: Parse *pParse = p->pParse; /* Parser context */
! 105263: sqlite3 *db = pParse->db; /* Database connection */
! 105264: int nPriorSat; /* ORDER BY terms satisfied by outer loops */
! 105265: int seenRowid = 0; /* True if an ORDER BY rowid term is seen */
! 105266: int uniqueNotNull; /* pIdx is UNIQUE with all terms are NOT NULL */
! 105267:
! 105268: if( p->i==0 ){
! 105269: nPriorSat = 0;
! 105270: }else{
! 105271: nPriorSat = p->aLevel[p->i-1].plan.nOBSat;
! 105272: if( (p->aLevel[p->i-1].plan.wsFlags & WHERE_ORDERED)==0 ){
! 105273: /* This loop cannot be ordered unless the next outer loop is
! 105274: ** also ordered */
! 105275: return nPriorSat;
! 105276: }
! 105277: if( OptimizationDisabled(db, SQLITE_OrderByIdxJoin) ){
! 105278: /* Only look at the outer-most loop if the OrderByIdxJoin
! 105279: ** optimization is disabled */
! 105280: return nPriorSat;
! 105281: }
! 105282: }
! 105283: pOrderBy = p->pOrderBy;
! 105284: assert( pOrderBy!=0 );
! 105285: if( pIdx->bUnordered ){
! 105286: /* Hash indices (indicated by the "unordered" tag on sqlite_stat1) cannot
! 105287: ** be used for sorting */
! 105288: return nPriorSat;
! 105289: }
! 105290: nTerm = pOrderBy->nExpr;
! 105291: uniqueNotNull = pIdx->onError!=OE_None;
! 105292: assert( nTerm>0 );
! 105293:
! 105294: /* Argument pIdx must either point to a 'real' named index structure,
! 105295: ** or an index structure allocated on the stack by bestBtreeIndex() to
! 105296: ** represent the rowid index that is part of every table. */
! 105297: assert( pIdx->zName || (pIdx->nColumn==1 && pIdx->aiColumn[0]==-1) );
! 105298:
! 105299: /* Match terms of the ORDER BY clause against columns of
! 105300: ** the index.
! 105301: **
! 105302: ** Note that indices have pIdx->nColumn regular columns plus
! 105303: ** one additional column containing the rowid. The rowid column
! 105304: ** of the index is also allowed to match against the ORDER BY
! 105305: ** clause.
! 105306: */
! 105307: j = nPriorSat;
! 105308: for(i=0,pOBItem=&pOrderBy->a[j]; j<nTerm && i<=pIdx->nColumn; i++){
! 105309: Expr *pOBExpr; /* The expression of the ORDER BY pOBItem */
! 105310: CollSeq *pColl; /* The collating sequence of pOBExpr */
! 105311: int termSortOrder; /* Sort order for this term */
! 105312: int iColumn; /* The i-th column of the index. -1 for rowid */
! 105313: int iSortOrder; /* 1 for DESC, 0 for ASC on the i-th index term */
! 105314: int isEq; /* Subject to an == or IS NULL constraint */
! 105315: int isMatch; /* ORDER BY term matches the index term */
! 105316: const char *zColl; /* Name of collating sequence for i-th index term */
! 105317: WhereTerm *pConstraint; /* A constraint in the WHERE clause */
! 105318:
! 105319: /* If the next term of the ORDER BY clause refers to anything other than
! 105320: ** a column in the "base" table, then this index will not be of any
! 105321: ** further use in handling the ORDER BY. */
! 105322: pOBExpr = sqlite3ExprSkipCollate(pOBItem->pExpr);
! 105323: if( pOBExpr->op!=TK_COLUMN || pOBExpr->iTable!=base ){
! 105324: break;
! 105325: }
! 105326:
! 105327: /* Find column number and collating sequence for the next entry
! 105328: ** in the index */
! 105329: if( pIdx->zName && i<pIdx->nColumn ){
! 105330: iColumn = pIdx->aiColumn[i];
! 105331: if( iColumn==pIdx->pTable->iPKey ){
! 105332: iColumn = -1;
! 105333: }
! 105334: iSortOrder = pIdx->aSortOrder[i];
! 105335: zColl = pIdx->azColl[i];
! 105336: assert( zColl!=0 );
! 105337: }else{
! 105338: iColumn = -1;
! 105339: iSortOrder = 0;
! 105340: zColl = 0;
! 105341: }
! 105342:
! 105343: /* Check to see if the column number and collating sequence of the
! 105344: ** index match the column number and collating sequence of the ORDER BY
! 105345: ** clause entry. Set isMatch to 1 if they both match. */
! 105346: if( pOBExpr->iColumn==iColumn ){
! 105347: if( zColl ){
! 105348: pColl = sqlite3ExprCollSeq(pParse, pOBItem->pExpr);
! 105349: if( !pColl ) pColl = db->pDfltColl;
! 105350: isMatch = sqlite3StrICmp(pColl->zName, zColl)==0;
! 105351: }else{
! 105352: isMatch = 1;
! 105353: }
! 105354: }else{
! 105355: isMatch = 0;
! 105356: }
! 105357:
! 105358: /* termSortOrder is 0 or 1 for whether or not the access loop should
! 105359: ** run forward or backwards (respectively) in order to satisfy this
! 105360: ** term of the ORDER BY clause. */
! 105361: assert( pOBItem->sortOrder==0 || pOBItem->sortOrder==1 );
! 105362: assert( iSortOrder==0 || iSortOrder==1 );
! 105363: termSortOrder = iSortOrder ^ pOBItem->sortOrder;
! 105364:
! 105365: /* If X is the column in the index and ORDER BY clause, check to see
! 105366: ** if there are any X= or X IS NULL constraints in the WHERE clause. */
! 105367: pConstraint = findTerm(p->pWC, base, iColumn, p->notReady,
! 105368: WO_EQ|WO_ISNULL|WO_IN, pIdx);
! 105369: if( pConstraint==0 ){
! 105370: isEq = 0;
! 105371: }else if( pConstraint->eOperator==WO_IN ){
! 105372: /* Constraints of the form: "X IN ..." cannot be used with an ORDER BY
! 105373: ** because we do not know in what order the values on the RHS of the IN
! 105374: ** operator will occur. */
! 105375: break;
! 105376: }else if( pConstraint->eOperator==WO_ISNULL ){
! 105377: uniqueNotNull = 0;
! 105378: isEq = 1; /* "X IS NULL" means X has only a single value */
! 105379: }else if( pConstraint->prereqRight==0 ){
! 105380: isEq = 1; /* Constraint "X=constant" means X has only a single value */
! 105381: }else{
! 105382: Expr *pRight = pConstraint->pExpr->pRight;
! 105383: if( pRight->op==TK_COLUMN ){
! 105384: WHERETRACE((" .. isOrderedColumn(tab=%d,col=%d)",
! 105385: pRight->iTable, pRight->iColumn));
! 105386: isEq = isOrderedColumn(p, pRight->iTable, pRight->iColumn);
! 105387: WHERETRACE((" -> isEq=%d\n", isEq));
! 105388:
! 105389: /* If the constraint is of the form X=Y where Y is an ordered value
! 105390: ** in an outer loop, then make sure the sort order of Y matches the
! 105391: ** sort order required for X. */
! 105392: if( isMatch && isEq>=2 && isEq!=pOBItem->sortOrder+2 ){
! 105393: testcase( isEq==2 );
! 105394: testcase( isEq==3 );
! 105395: break;
! 105396: }
! 105397: }else{
! 105398: isEq = 0; /* "X=expr" places no ordering constraints on X */
! 105399: }
! 105400: }
! 105401: if( !isMatch ){
! 105402: if( isEq==0 ){
! 105403: break;
! 105404: }else{
! 105405: continue;
! 105406: }
! 105407: }else if( isEq!=1 ){
! 105408: if( sortOrder==2 ){
! 105409: sortOrder = termSortOrder;
! 105410: }else if( termSortOrder!=sortOrder ){
! 105411: break;
! 105412: }
! 105413: }
! 105414: j++;
! 105415: pOBItem++;
! 105416: if( iColumn<0 ){
! 105417: seenRowid = 1;
! 105418: break;
! 105419: }else if( pTab->aCol[iColumn].notNull==0 && isEq!=1 ){
! 105420: testcase( isEq==0 );
! 105421: testcase( isEq==2 );
! 105422: testcase( isEq==3 );
! 105423: uniqueNotNull = 0;
! 105424: }
! 105425: }
! 105426:
! 105427: /* If we have not found at least one ORDER BY term that matches the
! 105428: ** index, then show no progress. */
! 105429: if( pOBItem==&pOrderBy->a[nPriorSat] ) return nPriorSat;
! 105430:
! 105431: /* Return the necessary scan order back to the caller */
! 105432: *pbRev = sortOrder & 1;
! 105433:
! 105434: /* If there was an "ORDER BY rowid" term that matched, or it is only
! 105435: ** possible for a single row from this table to match, then skip over
! 105436: ** any additional ORDER BY terms dealing with this table.
! 105437: */
! 105438: if( seenRowid || (uniqueNotNull && i>=pIdx->nColumn) ){
! 105439: /* Advance j over additional ORDER BY terms associated with base */
! 105440: WhereMaskSet *pMS = p->pWC->pMaskSet;
! 105441: Bitmask m = ~getMask(pMS, base);
! 105442: while( j<nTerm && (exprTableUsage(pMS, pOrderBy->a[j].pExpr)&m)==0 ){
! 105443: j++;
! 105444: }
! 105445: }
! 105446: return j;
! 105447: }
1.2 misho 105448:
105449: /*
105450: ** Find the best query plan for accessing a particular table. Write the
1.2.2.1 ! misho 105451: ** best query plan and its cost into the p->cost.
1.2 misho 105452: **
105453: ** The lowest cost plan wins. The cost is an estimate of the amount of
105454: ** CPU and disk I/O needed to process the requested result.
105455: ** Factors that influence cost include:
105456: **
105457: ** * The estimated number of rows that will be retrieved. (The
105458: ** fewer the better.)
105459: **
105460: ** * Whether or not sorting must occur.
105461: **
105462: ** * Whether or not there must be separate lookups in the
105463: ** index and in the main table.
105464: **
105465: ** If there was an INDEXED BY clause (pSrc->pIndex) attached to the table in
105466: ** the SQL statement, then this function only considers plans using the
105467: ** named index. If no such plan is found, then the returned cost is
105468: ** SQLITE_BIG_DBL. If a plan is found that uses the named index,
105469: ** then the cost is calculated in the usual way.
105470: **
1.2.2.1 ! misho 105471: ** If a NOT INDEXED clause was attached to the table
1.2 misho 105472: ** in the SELECT statement, then no indexes are considered. However, the
105473: ** selected plan may still take advantage of the built-in rowid primary key
105474: ** index.
105475: */
1.2.2.1 ! misho 105476: static void bestBtreeIndex(WhereBestIdx *p){
! 105477: Parse *pParse = p->pParse; /* The parsing context */
! 105478: WhereClause *pWC = p->pWC; /* The WHERE clause */
! 105479: struct SrcList_item *pSrc = p->pSrc; /* The FROM clause term to search */
1.2 misho 105480: int iCur = pSrc->iCursor; /* The cursor of the table to be accessed */
105481: Index *pProbe; /* An index we are evaluating */
105482: Index *pIdx; /* Copy of pProbe, or zero for IPK index */
105483: int eqTermMask; /* Current mask of valid equality operators */
105484: int idxEqTermMask; /* Index mask of valid equality operators */
105485: Index sPk; /* A fake index object for the primary key */
105486: tRowcnt aiRowEstPk[2]; /* The aiRowEst[] value for the sPk index */
105487: int aiColumnPk = -1; /* The aColumn[] value for the sPk index */
1.2.2.1 ! misho 105488: int wsFlagMask; /* Allowed flags in p->cost.plan.wsFlag */
! 105489: int nPriorSat; /* ORDER BY terms satisfied by outer loops */
! 105490: int nOrderBy; /* Number of ORDER BY terms */
! 105491: char bSortInit; /* Initializer for bSort in inner loop */
! 105492: char bDistInit; /* Initializer for bDist in inner loop */
! 105493:
1.2 misho 105494:
105495: /* Initialize the cost to a worst-case value */
1.2.2.1 ! misho 105496: memset(&p->cost, 0, sizeof(p->cost));
! 105497: p->cost.rCost = SQLITE_BIG_DBL;
1.2 misho 105498:
105499: /* If the pSrc table is the right table of a LEFT JOIN then we may not
105500: ** use an index to satisfy IS NULL constraints on that table. This is
105501: ** because columns might end up being NULL if the table does not match -
105502: ** a circumstance which the index cannot help us discover. Ticket #2177.
105503: */
105504: if( pSrc->jointype & JT_LEFT ){
105505: idxEqTermMask = WO_EQ|WO_IN;
105506: }else{
105507: idxEqTermMask = WO_EQ|WO_IN|WO_ISNULL;
105508: }
105509:
105510: if( pSrc->pIndex ){
105511: /* An INDEXED BY clause specifies a particular index to use */
105512: pIdx = pProbe = pSrc->pIndex;
105513: wsFlagMask = ~(WHERE_ROWID_EQ|WHERE_ROWID_RANGE);
105514: eqTermMask = idxEqTermMask;
105515: }else{
105516: /* There is no INDEXED BY clause. Create a fake Index object in local
105517: ** variable sPk to represent the rowid primary key index. Make this
105518: ** fake index the first in a chain of Index objects with all of the real
105519: ** indices to follow */
105520: Index *pFirst; /* First of real indices on the table */
105521: memset(&sPk, 0, sizeof(Index));
105522: sPk.nColumn = 1;
105523: sPk.aiColumn = &aiColumnPk;
105524: sPk.aiRowEst = aiRowEstPk;
105525: sPk.onError = OE_Replace;
105526: sPk.pTable = pSrc->pTab;
105527: aiRowEstPk[0] = pSrc->pTab->nRowEst;
105528: aiRowEstPk[1] = 1;
105529: pFirst = pSrc->pTab->pIndex;
105530: if( pSrc->notIndexed==0 ){
105531: /* The real indices of the table are only considered if the
105532: ** NOT INDEXED qualifier is omitted from the FROM clause */
105533: sPk.pNext = pFirst;
105534: }
105535: pProbe = &sPk;
105536: wsFlagMask = ~(
105537: WHERE_COLUMN_IN|WHERE_COLUMN_EQ|WHERE_COLUMN_NULL|WHERE_COLUMN_RANGE
105538: );
105539: eqTermMask = WO_EQ|WO_IN;
105540: pIdx = 0;
105541: }
105542:
1.2.2.1 ! misho 105543: nOrderBy = p->pOrderBy ? p->pOrderBy->nExpr : 0;
! 105544: if( p->i ){
! 105545: nPriorSat = p->aLevel[p->i-1].plan.nOBSat;
! 105546: bSortInit = nPriorSat<nOrderBy;
! 105547: bDistInit = 0;
! 105548: }else{
! 105549: nPriorSat = 0;
! 105550: bSortInit = nOrderBy>0;
! 105551: bDistInit = p->pDistinct!=0;
! 105552: }
! 105553:
1.2 misho 105554: /* Loop over all indices looking for the best one to use
105555: */
105556: for(; pProbe; pIdx=pProbe=pProbe->pNext){
105557: const tRowcnt * const aiRowEst = pProbe->aiRowEst;
1.2.2.1 ! misho 105558: WhereCost pc; /* Cost of using pProbe */
1.2 misho 105559: double log10N = (double)1; /* base-10 logarithm of nRow (inexact) */
105560:
105561: /* The following variables are populated based on the properties of
105562: ** index being evaluated. They are then used to determine the expected
105563: ** cost and number of rows returned.
105564: **
1.2.2.1 ! misho 105565: ** pc.plan.nEq:
1.2 misho 105566: ** Number of equality terms that can be implemented using the index.
105567: ** In other words, the number of initial fields in the index that
105568: ** are used in == or IN or NOT NULL constraints of the WHERE clause.
105569: **
105570: ** nInMul:
105571: ** The "in-multiplier". This is an estimate of how many seek operations
105572: ** SQLite must perform on the index in question. For example, if the
105573: ** WHERE clause is:
105574: **
105575: ** WHERE a IN (1, 2, 3) AND b IN (4, 5, 6)
105576: **
105577: ** SQLite must perform 9 lookups on an index on (a, b), so nInMul is
105578: ** set to 9. Given the same schema and either of the following WHERE
105579: ** clauses:
105580: **
105581: ** WHERE a = 1
105582: ** WHERE a >= 2
105583: **
105584: ** nInMul is set to 1.
105585: **
105586: ** If there exists a WHERE term of the form "x IN (SELECT ...)", then
105587: ** the sub-select is assumed to return 25 rows for the purposes of
105588: ** determining nInMul.
105589: **
105590: ** bInEst:
105591: ** Set to true if there was at least one "x IN (SELECT ...)" term used
105592: ** in determining the value of nInMul. Note that the RHS of the
105593: ** IN operator must be a SELECT, not a value list, for this variable
105594: ** to be true.
105595: **
105596: ** rangeDiv:
105597: ** An estimate of a divisor by which to reduce the search space due
105598: ** to inequality constraints. In the absence of sqlite_stat3 ANALYZE
105599: ** data, a single inequality reduces the search space to 1/4rd its
105600: ** original size (rangeDiv==4). Two inequalities reduce the search
105601: ** space to 1/16th of its original size (rangeDiv==16).
105602: **
105603: ** bSort:
105604: ** Boolean. True if there is an ORDER BY clause that will require an
105605: ** external sort (i.e. scanning the index being evaluated will not
105606: ** correctly order records).
105607: **
1.2.2.1 ! misho 105608: ** bDist:
! 105609: ** Boolean. True if there is a DISTINCT clause that will require an
! 105610: ** external btree.
! 105611: **
1.2 misho 105612: ** bLookup:
105613: ** Boolean. True if a table lookup is required for each index entry
105614: ** visited. In other words, true if this is not a covering index.
105615: ** This is always false for the rowid primary key index of a table.
105616: ** For other indexes, it is true unless all the columns of the table
105617: ** used by the SELECT statement are present in the index (such an
105618: ** index is sometimes described as a covering index).
105619: ** For example, given the index on (a, b), the second of the following
105620: ** two queries requires table b-tree lookups in order to find the value
105621: ** of column c, but the first does not because columns a and b are
105622: ** both available in the index.
105623: **
105624: ** SELECT a, b FROM tbl WHERE a = 1;
105625: ** SELECT a, b, c FROM tbl WHERE a = 1;
105626: */
105627: int bInEst = 0; /* True if "x IN (SELECT...)" seen */
105628: int nInMul = 1; /* Number of distinct equalities to lookup */
105629: double rangeDiv = (double)1; /* Estimated reduction in search space */
105630: int nBound = 0; /* Number of range constraints seen */
1.2.2.1 ! misho 105631: char bSort = bSortInit; /* True if external sort required */
! 105632: char bDist = bDistInit; /* True if index cannot help with DISTINCT */
! 105633: char bLookup = 0; /* True if not a covering index */
1.2 misho 105634: WhereTerm *pTerm; /* A single term of the WHERE clause */
105635: #ifdef SQLITE_ENABLE_STAT3
105636: WhereTerm *pFirstTerm = 0; /* First term matching the index */
105637: #endif
105638:
1.2.2.1 ! misho 105639: WHERETRACE((
! 105640: " %s(%s):\n",
! 105641: pSrc->pTab->zName, (pIdx ? pIdx->zName : "ipk")
! 105642: ));
! 105643: memset(&pc, 0, sizeof(pc));
! 105644: pc.plan.nOBSat = nPriorSat;
! 105645:
! 105646: /* Determine the values of pc.plan.nEq and nInMul */
! 105647: for(pc.plan.nEq=0; pc.plan.nEq<pProbe->nColumn; pc.plan.nEq++){
! 105648: int j = pProbe->aiColumn[pc.plan.nEq];
! 105649: pTerm = findTerm(pWC, iCur, j, p->notReady, eqTermMask, pIdx);
1.2 misho 105650: if( pTerm==0 ) break;
1.2.2.1 ! misho 105651: pc.plan.wsFlags |= (WHERE_COLUMN_EQ|WHERE_ROWID_EQ);
1.2 misho 105652: testcase( pTerm->pWC!=pWC );
105653: if( pTerm->eOperator & WO_IN ){
105654: Expr *pExpr = pTerm->pExpr;
1.2.2.1 ! misho 105655: pc.plan.wsFlags |= WHERE_COLUMN_IN;
1.2 misho 105656: if( ExprHasProperty(pExpr, EP_xIsSelect) ){
105657: /* "x IN (SELECT ...)": Assume the SELECT returns 25 rows */
105658: nInMul *= 25;
105659: bInEst = 1;
105660: }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){
105661: /* "x IN (value, value, ...)" */
105662: nInMul *= pExpr->x.pList->nExpr;
105663: }
105664: }else if( pTerm->eOperator & WO_ISNULL ){
1.2.2.1 ! misho 105665: pc.plan.wsFlags |= WHERE_COLUMN_NULL;
1.2 misho 105666: }
105667: #ifdef SQLITE_ENABLE_STAT3
1.2.2.1 ! misho 105668: if( pc.plan.nEq==0 && pProbe->aSample ) pFirstTerm = pTerm;
1.2 misho 105669: #endif
1.2.2.1 ! misho 105670: pc.used |= pTerm->prereqRight;
1.2 misho 105671: }
105672:
105673: /* If the index being considered is UNIQUE, and there is an equality
105674: ** constraint for all columns in the index, then this search will find
105675: ** at most a single row. In this case set the WHERE_UNIQUE flag to
105676: ** indicate this to the caller.
105677: **
105678: ** Otherwise, if the search may find more than one row, test to see if
1.2.2.1 ! misho 105679: ** there is a range constraint on indexed column (pc.plan.nEq+1) that can be
1.2 misho 105680: ** optimized using the index.
105681: */
1.2.2.1 ! misho 105682: if( pc.plan.nEq==pProbe->nColumn && pProbe->onError!=OE_None ){
! 105683: testcase( pc.plan.wsFlags & WHERE_COLUMN_IN );
! 105684: testcase( pc.plan.wsFlags & WHERE_COLUMN_NULL );
! 105685: if( (pc.plan.wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0 ){
! 105686: pc.plan.wsFlags |= WHERE_UNIQUE;
! 105687: if( p->i==0 || (p->aLevel[p->i-1].plan.wsFlags & WHERE_ALL_UNIQUE)!=0 ){
! 105688: pc.plan.wsFlags |= WHERE_ALL_UNIQUE;
! 105689: }
1.2 misho 105690: }
105691: }else if( pProbe->bUnordered==0 ){
1.2.2.1 ! misho 105692: int j;
! 105693: j = (pc.plan.nEq==pProbe->nColumn ? -1 : pProbe->aiColumn[pc.plan.nEq]);
! 105694: if( findTerm(pWC, iCur, j, p->notReady, WO_LT|WO_LE|WO_GT|WO_GE, pIdx) ){
! 105695: WhereTerm *pTop, *pBtm;
! 105696: pTop = findTerm(pWC, iCur, j, p->notReady, WO_LT|WO_LE, pIdx);
! 105697: pBtm = findTerm(pWC, iCur, j, p->notReady, WO_GT|WO_GE, pIdx);
! 105698: whereRangeScanEst(pParse, pProbe, pc.plan.nEq, pBtm, pTop, &rangeDiv);
1.2 misho 105699: if( pTop ){
105700: nBound = 1;
1.2.2.1 ! misho 105701: pc.plan.wsFlags |= WHERE_TOP_LIMIT;
! 105702: pc.used |= pTop->prereqRight;
1.2 misho 105703: testcase( pTop->pWC!=pWC );
105704: }
105705: if( pBtm ){
105706: nBound++;
1.2.2.1 ! misho 105707: pc.plan.wsFlags |= WHERE_BTM_LIMIT;
! 105708: pc.used |= pBtm->prereqRight;
1.2 misho 105709: testcase( pBtm->pWC!=pWC );
105710: }
1.2.2.1 ! misho 105711: pc.plan.wsFlags |= (WHERE_COLUMN_RANGE|WHERE_ROWID_RANGE);
1.2 misho 105712: }
105713: }
105714:
105715: /* If there is an ORDER BY clause and the index being considered will
105716: ** naturally scan rows in the required order, set the appropriate flags
1.2.2.1 ! misho 105717: ** in pc.plan.wsFlags. Otherwise, if there is an ORDER BY clause but
! 105718: ** the index will scan rows in a different order, set the bSort
! 105719: ** variable. */
! 105720: if( bSort && (pSrc->jointype & JT_LEFT)==0 ){
! 105721: int bRev = 2;
! 105722: WHERETRACE((" --> before isSortingIndex: nPriorSat=%d\n",nPriorSat));
! 105723: pc.plan.nOBSat = isSortingIndex(p, pProbe, iCur, &bRev);
! 105724: WHERETRACE((" --> after isSortingIndex: bRev=%d nOBSat=%d\n",
! 105725: bRev, pc.plan.nOBSat));
! 105726: if( nPriorSat<pc.plan.nOBSat || (pc.plan.wsFlags & WHERE_ALL_UNIQUE)!=0 ){
! 105727: pc.plan.wsFlags |= WHERE_ORDERED;
! 105728: }
! 105729: if( nOrderBy==pc.plan.nOBSat ){
! 105730: bSort = 0;
! 105731: pc.plan.wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE;
! 105732: }
! 105733: if( bRev & 1 ) pc.plan.wsFlags |= WHERE_REVERSE;
1.2 misho 105734: }
105735:
105736: /* If there is a DISTINCT qualifier and this index will scan rows in
105737: ** order of the DISTINCT expressions, clear bDist and set the appropriate
1.2.2.1 ! misho 105738: ** flags in pc.plan.wsFlags. */
! 105739: if( bDist
! 105740: && isDistinctIndex(pParse, pWC, pProbe, iCur, p->pDistinct, pc.plan.nEq)
! 105741: && (pc.plan.wsFlags & WHERE_COLUMN_IN)==0
! 105742: ){
1.2 misho 105743: bDist = 0;
1.2.2.1 ! misho 105744: pc.plan.wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_DISTINCT;
1.2 misho 105745: }
105746:
105747: /* If currently calculating the cost of using an index (not the IPK
105748: ** index), determine if all required column data may be obtained without
105749: ** using the main table (i.e. if the index is a covering
105750: ** index for this query). If it is, set the WHERE_IDX_ONLY flag in
1.2.2.1 ! misho 105751: ** pc.plan.wsFlags. Otherwise, set the bLookup variable to true. */
! 105752: if( pIdx ){
1.2 misho 105753: Bitmask m = pSrc->colUsed;
105754: int j;
105755: for(j=0; j<pIdx->nColumn; j++){
105756: int x = pIdx->aiColumn[j];
105757: if( x<BMS-1 ){
105758: m &= ~(((Bitmask)1)<<x);
105759: }
105760: }
105761: if( m==0 ){
1.2.2.1 ! misho 105762: pc.plan.wsFlags |= WHERE_IDX_ONLY;
1.2 misho 105763: }else{
105764: bLookup = 1;
105765: }
105766: }
105767:
105768: /*
105769: ** Estimate the number of rows of output. For an "x IN (SELECT...)"
105770: ** constraint, do not let the estimate exceed half the rows in the table.
105771: */
1.2.2.1 ! misho 105772: pc.plan.nRow = (double)(aiRowEst[pc.plan.nEq] * nInMul);
! 105773: if( bInEst && pc.plan.nRow*2>aiRowEst[0] ){
! 105774: pc.plan.nRow = aiRowEst[0]/2;
! 105775: nInMul = (int)(pc.plan.nRow / aiRowEst[pc.plan.nEq]);
1.2 misho 105776: }
105777:
105778: #ifdef SQLITE_ENABLE_STAT3
105779: /* If the constraint is of the form x=VALUE or x IN (E1,E2,...)
105780: ** and we do not think that values of x are unique and if histogram
105781: ** data is available for column x, then it might be possible
105782: ** to get a better estimate on the number of rows based on
105783: ** VALUE and how common that value is according to the histogram.
105784: */
1.2.2.1 ! misho 105785: if( pc.plan.nRow>(double)1 && pc.plan.nEq==1
! 105786: && pFirstTerm!=0 && aiRowEst[1]>1 ){
1.2 misho 105787: assert( (pFirstTerm->eOperator & (WO_EQ|WO_ISNULL|WO_IN))!=0 );
105788: if( pFirstTerm->eOperator & (WO_EQ|WO_ISNULL) ){
105789: testcase( pFirstTerm->eOperator==WO_EQ );
105790: testcase( pFirstTerm->eOperator==WO_ISNULL );
1.2.2.1 ! misho 105791: whereEqualScanEst(pParse, pProbe, pFirstTerm->pExpr->pRight,
! 105792: &pc.plan.nRow);
1.2 misho 105793: }else if( bInEst==0 ){
105794: assert( pFirstTerm->eOperator==WO_IN );
1.2.2.1 ! misho 105795: whereInScanEst(pParse, pProbe, pFirstTerm->pExpr->x.pList,
! 105796: &pc.plan.nRow);
1.2 misho 105797: }
105798: }
105799: #endif /* SQLITE_ENABLE_STAT3 */
105800:
105801: /* Adjust the number of output rows and downward to reflect rows
105802: ** that are excluded by range constraints.
105803: */
1.2.2.1 ! misho 105804: pc.plan.nRow = pc.plan.nRow/rangeDiv;
! 105805: if( pc.plan.nRow<1 ) pc.plan.nRow = 1;
1.2 misho 105806:
105807: /* Experiments run on real SQLite databases show that the time needed
105808: ** to do a binary search to locate a row in a table or index is roughly
105809: ** log10(N) times the time to move from one row to the next row within
105810: ** a table or index. The actual times can vary, with the size of
105811: ** records being an important factor. Both moves and searches are
105812: ** slower with larger records, presumably because fewer records fit
105813: ** on one page and hence more pages have to be fetched.
105814: **
105815: ** The ANALYZE command and the sqlite_stat1 and sqlite_stat3 tables do
105816: ** not give us data on the relative sizes of table and index records.
105817: ** So this computation assumes table records are about twice as big
105818: ** as index records
105819: */
1.2.2.1 ! misho 105820: if( (pc.plan.wsFlags&~(WHERE_REVERSE|WHERE_ORDERED))==WHERE_IDX_ONLY
! 105821: && (pWC->wctrlFlags & WHERE_ONEPASS_DESIRED)==0
! 105822: && sqlite3GlobalConfig.bUseCis
! 105823: && OptimizationEnabled(pParse->db, SQLITE_CoverIdxScan)
! 105824: ){
! 105825: /* This index is not useful for indexing, but it is a covering index.
! 105826: ** A full-scan of the index might be a little faster than a full-scan
! 105827: ** of the table, so give this case a cost slightly less than a table
! 105828: ** scan. */
! 105829: pc.rCost = aiRowEst[0]*3 + pProbe->nColumn;
! 105830: pc.plan.wsFlags |= WHERE_COVER_SCAN|WHERE_COLUMN_RANGE;
! 105831: }else if( (pc.plan.wsFlags & WHERE_NOT_FULLSCAN)==0 ){
1.2 misho 105832: /* The cost of a full table scan is a number of move operations equal
105833: ** to the number of rows in the table.
105834: **
105835: ** We add an additional 4x penalty to full table scans. This causes
105836: ** the cost function to err on the side of choosing an index over
105837: ** choosing a full scan. This 4x full-scan penalty is an arguable
105838: ** decision and one which we expect to revisit in the future. But
105839: ** it seems to be working well enough at the moment.
105840: */
1.2.2.1 ! misho 105841: pc.rCost = aiRowEst[0]*4;
! 105842: pc.plan.wsFlags &= ~WHERE_IDX_ONLY;
! 105843: if( pIdx ){
! 105844: pc.plan.wsFlags &= ~WHERE_ORDERED;
! 105845: pc.plan.nOBSat = nPriorSat;
! 105846: }
1.2 misho 105847: }else{
105848: log10N = estLog(aiRowEst[0]);
1.2.2.1 ! misho 105849: pc.rCost = pc.plan.nRow;
1.2 misho 105850: if( pIdx ){
105851: if( bLookup ){
105852: /* For an index lookup followed by a table lookup:
105853: ** nInMul index searches to find the start of each index range
105854: ** + nRow steps through the index
105855: ** + nRow table searches to lookup the table entry using the rowid
105856: */
1.2.2.1 ! misho 105857: pc.rCost += (nInMul + pc.plan.nRow)*log10N;
1.2 misho 105858: }else{
105859: /* For a covering index:
105860: ** nInMul index searches to find the initial entry
105861: ** + nRow steps through the index
105862: */
1.2.2.1 ! misho 105863: pc.rCost += nInMul*log10N;
1.2 misho 105864: }
105865: }else{
105866: /* For a rowid primary key lookup:
105867: ** nInMult table searches to find the initial entry for each range
105868: ** + nRow steps through the table
105869: */
1.2.2.1 ! misho 105870: pc.rCost += nInMul*log10N;
1.2 misho 105871: }
105872: }
105873:
105874: /* Add in the estimated cost of sorting the result. Actual experimental
105875: ** measurements of sorting performance in SQLite show that sorting time
105876: ** adds C*N*log10(N) to the cost, where N is the number of rows to be
105877: ** sorted and C is a factor between 1.95 and 4.3. We will split the
105878: ** difference and select C of 3.0.
105879: */
105880: if( bSort ){
1.2.2.1 ! misho 105881: double m = estLog(pc.plan.nRow*(nOrderBy - pc.plan.nOBSat)/nOrderBy);
! 105882: m *= (double)(pc.plan.nOBSat ? 2 : 3);
! 105883: pc.rCost += pc.plan.nRow*m;
1.2 misho 105884: }
105885: if( bDist ){
1.2.2.1 ! misho 105886: pc.rCost += pc.plan.nRow*estLog(pc.plan.nRow)*3;
1.2 misho 105887: }
105888:
105889: /**** Cost of using this index has now been computed ****/
105890:
105891: /* If there are additional constraints on this table that cannot
105892: ** be used with the current index, but which might lower the number
105893: ** of output rows, adjust the nRow value accordingly. This only
105894: ** matters if the current index is the least costly, so do not bother
105895: ** with this step if we already know this index will not be chosen.
105896: ** Also, never reduce the output row count below 2 using this step.
105897: **
105898: ** It is critical that the notValid mask be used here instead of
105899: ** the notReady mask. When computing an "optimal" index, the notReady
105900: ** mask will only have one bit set - the bit for the current table.
105901: ** The notValid mask, on the other hand, always has all bits set for
105902: ** tables that are not in outer loops. If notReady is used here instead
105903: ** of notValid, then a optimal index that depends on inner joins loops
105904: ** might be selected even when there exists an optimal index that has
105905: ** no such dependency.
105906: */
1.2.2.1 ! misho 105907: if( pc.plan.nRow>2 && pc.rCost<=p->cost.rCost ){
1.2 misho 105908: int k; /* Loop counter */
1.2.2.1 ! misho 105909: int nSkipEq = pc.plan.nEq; /* Number of == constraints to skip */
1.2 misho 105910: int nSkipRange = nBound; /* Number of < constraints to skip */
105911: Bitmask thisTab; /* Bitmap for pSrc */
105912:
105913: thisTab = getMask(pWC->pMaskSet, iCur);
1.2.2.1 ! misho 105914: for(pTerm=pWC->a, k=pWC->nTerm; pc.plan.nRow>2 && k; k--, pTerm++){
1.2 misho 105915: if( pTerm->wtFlags & TERM_VIRTUAL ) continue;
1.2.2.1 ! misho 105916: if( (pTerm->prereqAll & p->notValid)!=thisTab ) continue;
1.2 misho 105917: if( pTerm->eOperator & (WO_EQ|WO_IN|WO_ISNULL) ){
105918: if( nSkipEq ){
1.2.2.1 ! misho 105919: /* Ignore the first pc.plan.nEq equality matches since the index
1.2 misho 105920: ** has already accounted for these */
105921: nSkipEq--;
105922: }else{
105923: /* Assume each additional equality match reduces the result
105924: ** set size by a factor of 10 */
1.2.2.1 ! misho 105925: pc.plan.nRow /= 10;
1.2 misho 105926: }
105927: }else if( pTerm->eOperator & (WO_LT|WO_LE|WO_GT|WO_GE) ){
105928: if( nSkipRange ){
105929: /* Ignore the first nSkipRange range constraints since the index
105930: ** has already accounted for these */
105931: nSkipRange--;
105932: }else{
105933: /* Assume each additional range constraint reduces the result
105934: ** set size by a factor of 3. Indexed range constraints reduce
105935: ** the search space by a larger factor: 4. We make indexed range
105936: ** more selective intentionally because of the subjective
105937: ** observation that indexed range constraints really are more
105938: ** selective in practice, on average. */
1.2.2.1 ! misho 105939: pc.plan.nRow /= 3;
1.2 misho 105940: }
105941: }else if( pTerm->eOperator!=WO_NOOP ){
105942: /* Any other expression lowers the output row count by half */
1.2.2.1 ! misho 105943: pc.plan.nRow /= 2;
1.2 misho 105944: }
105945: }
1.2.2.1 ! misho 105946: if( pc.plan.nRow<2 ) pc.plan.nRow = 2;
1.2 misho 105947: }
105948:
105949:
105950: WHERETRACE((
1.2.2.1 ! misho 105951: " nEq=%d nInMul=%d rangeDiv=%d bSort=%d bLookup=%d wsFlags=0x%08x\n"
! 105952: " notReady=0x%llx log10N=%.1f nRow=%.1f cost=%.1f\n"
! 105953: " used=0x%llx nOBSat=%d\n",
! 105954: pc.plan.nEq, nInMul, (int)rangeDiv, bSort, bLookup, pc.plan.wsFlags,
! 105955: p->notReady, log10N, pc.plan.nRow, pc.rCost, pc.used,
! 105956: pc.plan.nOBSat
1.2 misho 105957: ));
105958:
105959: /* If this index is the best we have seen so far, then record this
1.2.2.1 ! misho 105960: ** index and its cost in the p->cost structure.
1.2 misho 105961: */
1.2.2.1 ! misho 105962: if( (!pIdx || pc.plan.wsFlags) && compareCost(&pc, &p->cost) ){
! 105963: p->cost = pc;
! 105964: p->cost.plan.wsFlags &= wsFlagMask;
! 105965: p->cost.plan.u.pIdx = pIdx;
1.2 misho 105966: }
105967:
105968: /* If there was an INDEXED BY clause, then only that one index is
105969: ** considered. */
105970: if( pSrc->pIndex ) break;
105971:
105972: /* Reset masks for the next index in the loop */
105973: wsFlagMask = ~(WHERE_ROWID_EQ|WHERE_ROWID_RANGE);
105974: eqTermMask = idxEqTermMask;
105975: }
105976:
105977: /* If there is no ORDER BY clause and the SQLITE_ReverseOrder flag
105978: ** is set, then reverse the order that the index will be scanned
105979: ** in. This is used for application testing, to help find cases
105980: ** where application behaviour depends on the (undefined) order that
105981: ** SQLite outputs rows in in the absence of an ORDER BY clause. */
1.2.2.1 ! misho 105982: if( !p->pOrderBy && pParse->db->flags & SQLITE_ReverseOrder ){
! 105983: p->cost.plan.wsFlags |= WHERE_REVERSE;
1.2 misho 105984: }
105985:
1.2.2.1 ! misho 105986: assert( p->pOrderBy || (p->cost.plan.wsFlags&WHERE_ORDERED)==0 );
! 105987: assert( p->cost.plan.u.pIdx==0 || (p->cost.plan.wsFlags&WHERE_ROWID_EQ)==0 );
1.2 misho 105988: assert( pSrc->pIndex==0
1.2.2.1 ! misho 105989: || p->cost.plan.u.pIdx==0
! 105990: || p->cost.plan.u.pIdx==pSrc->pIndex
1.2 misho 105991: );
105992:
1.2.2.1 ! misho 105993: WHERETRACE((" best index is: %s\n",
! 105994: p->cost.plan.u.pIdx ? p->cost.plan.u.pIdx->zName : "ipk"));
1.2 misho 105995:
1.2.2.1 ! misho 105996: bestOrClauseIndex(p);
! 105997: bestAutomaticIndex(p);
! 105998: p->cost.plan.wsFlags |= eqTermMask;
1.2 misho 105999: }
106000:
106001: /*
106002: ** Find the query plan for accessing table pSrc->pTab. Write the
106003: ** best query plan and its cost into the WhereCost object supplied
106004: ** as the last parameter. This function may calculate the cost of
106005: ** both real and virtual table scans.
1.2.2.1 ! misho 106006: **
! 106007: ** This function does not take ORDER BY or DISTINCT into account. Nor
! 106008: ** does it remember the virtual table query plan. All it does is compute
! 106009: ** the cost while determining if an OR optimization is applicable. The
! 106010: ** details will be reconsidered later if the optimization is found to be
! 106011: ** applicable.
1.2 misho 106012: */
1.2.2.1 ! misho 106013: static void bestIndex(WhereBestIdx *p){
1.2 misho 106014: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 106015: if( IsVirtual(p->pSrc->pTab) ){
! 106016: sqlite3_index_info *pIdxInfo = 0;
! 106017: p->ppIdxInfo = &pIdxInfo;
! 106018: bestVirtualIndex(p);
! 106019: if( pIdxInfo->needToFreeIdxStr ){
! 106020: sqlite3_free(pIdxInfo->idxStr);
1.2 misho 106021: }
1.2.2.1 ! misho 106022: sqlite3DbFree(p->pParse->db, pIdxInfo);
1.2 misho 106023: }else
106024: #endif
106025: {
1.2.2.1 ! misho 106026: bestBtreeIndex(p);
1.2 misho 106027: }
106028: }
106029:
106030: /*
106031: ** Disable a term in the WHERE clause. Except, do not disable the term
106032: ** if it controls a LEFT OUTER JOIN and it did not originate in the ON
106033: ** or USING clause of that join.
106034: **
106035: ** Consider the term t2.z='ok' in the following queries:
106036: **
106037: ** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok'
106038: ** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok'
106039: ** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok'
106040: **
106041: ** The t2.z='ok' is disabled in the in (2) because it originates
106042: ** in the ON clause. The term is disabled in (3) because it is not part
106043: ** of a LEFT OUTER JOIN. In (1), the term is not disabled.
106044: **
106045: ** IMPLEMENTATION-OF: R-24597-58655 No tests are done for terms that are
106046: ** completely satisfied by indices.
106047: **
106048: ** Disabling a term causes that term to not be tested in the inner loop
106049: ** of the join. Disabling is an optimization. When terms are satisfied
106050: ** by indices, we disable them to prevent redundant tests in the inner
106051: ** loop. We would get the correct results if nothing were ever disabled,
106052: ** but joins might run a little slower. The trick is to disable as much
106053: ** as we can without disabling too much. If we disabled in (1), we'd get
106054: ** the wrong answer. See ticket #813.
106055: */
106056: static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){
106057: if( pTerm
106058: && (pTerm->wtFlags & TERM_CODED)==0
106059: && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin))
106060: ){
106061: pTerm->wtFlags |= TERM_CODED;
106062: if( pTerm->iParent>=0 ){
106063: WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent];
106064: if( (--pOther->nChild)==0 ){
106065: disableTerm(pLevel, pOther);
106066: }
106067: }
106068: }
106069: }
106070:
106071: /*
106072: ** Code an OP_Affinity opcode to apply the column affinity string zAff
106073: ** to the n registers starting at base.
106074: **
106075: ** As an optimization, SQLITE_AFF_NONE entries (which are no-ops) at the
106076: ** beginning and end of zAff are ignored. If all entries in zAff are
106077: ** SQLITE_AFF_NONE, then no code gets generated.
106078: **
106079: ** This routine makes its own copy of zAff so that the caller is free
106080: ** to modify zAff after this routine returns.
106081: */
106082: static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){
106083: Vdbe *v = pParse->pVdbe;
106084: if( zAff==0 ){
106085: assert( pParse->db->mallocFailed );
106086: return;
106087: }
106088: assert( v!=0 );
106089:
106090: /* Adjust base and n to skip over SQLITE_AFF_NONE entries at the beginning
106091: ** and end of the affinity string.
106092: */
106093: while( n>0 && zAff[0]==SQLITE_AFF_NONE ){
106094: n--;
106095: base++;
106096: zAff++;
106097: }
106098: while( n>1 && zAff[n-1]==SQLITE_AFF_NONE ){
106099: n--;
106100: }
106101:
106102: /* Code the OP_Affinity opcode if there is anything left to do. */
106103: if( n>0 ){
106104: sqlite3VdbeAddOp2(v, OP_Affinity, base, n);
106105: sqlite3VdbeChangeP4(v, -1, zAff, n);
106106: sqlite3ExprCacheAffinityChange(pParse, base, n);
106107: }
106108: }
106109:
106110:
106111: /*
106112: ** Generate code for a single equality term of the WHERE clause. An equality
106113: ** term can be either X=expr or X IN (...). pTerm is the term to be
106114: ** coded.
106115: **
106116: ** The current value for the constraint is left in register iReg.
106117: **
106118: ** For a constraint of the form X=expr, the expression is evaluated and its
106119: ** result is left on the stack. For constraints of the form X IN (...)
106120: ** this routine sets up a loop that will iterate over all values of X.
106121: */
106122: static int codeEqualityTerm(
106123: Parse *pParse, /* The parsing context */
106124: WhereTerm *pTerm, /* The term of the WHERE clause to be coded */
106125: WhereLevel *pLevel, /* When level of the FROM clause we are working on */
106126: int iTarget /* Attempt to leave results in this register */
106127: ){
106128: Expr *pX = pTerm->pExpr;
106129: Vdbe *v = pParse->pVdbe;
106130: int iReg; /* Register holding results */
106131:
106132: assert( iTarget>0 );
106133: if( pX->op==TK_EQ ){
106134: iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget);
106135: }else if( pX->op==TK_ISNULL ){
106136: iReg = iTarget;
106137: sqlite3VdbeAddOp2(v, OP_Null, 0, iReg);
106138: #ifndef SQLITE_OMIT_SUBQUERY
106139: }else{
106140: int eType;
106141: int iTab;
106142: struct InLoop *pIn;
106143:
106144: assert( pX->op==TK_IN );
106145: iReg = iTarget;
106146: eType = sqlite3FindInIndex(pParse, pX, 0);
106147: iTab = pX->iTable;
106148: sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0);
106149: assert( pLevel->plan.wsFlags & WHERE_IN_ABLE );
106150: if( pLevel->u.in.nIn==0 ){
106151: pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
106152: }
106153: pLevel->u.in.nIn++;
106154: pLevel->u.in.aInLoop =
106155: sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop,
106156: sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn);
106157: pIn = pLevel->u.in.aInLoop;
106158: if( pIn ){
106159: pIn += pLevel->u.in.nIn - 1;
106160: pIn->iCur = iTab;
106161: if( eType==IN_INDEX_ROWID ){
106162: pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg);
106163: }else{
106164: pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg);
106165: }
106166: sqlite3VdbeAddOp1(v, OP_IsNull, iReg);
106167: }else{
106168: pLevel->u.in.nIn = 0;
106169: }
106170: #endif
106171: }
106172: disableTerm(pLevel, pTerm);
106173: return iReg;
106174: }
106175:
106176: /*
106177: ** Generate code that will evaluate all == and IN constraints for an
106178: ** index.
106179: **
106180: ** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c).
106181: ** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10
106182: ** The index has as many as three equality constraints, but in this
106183: ** example, the third "c" value is an inequality. So only two
106184: ** constraints are coded. This routine will generate code to evaluate
106185: ** a==5 and b IN (1,2,3). The current values for a and b will be stored
106186: ** in consecutive registers and the index of the first register is returned.
106187: **
106188: ** In the example above nEq==2. But this subroutine works for any value
106189: ** of nEq including 0. If nEq==0, this routine is nearly a no-op.
106190: ** The only thing it does is allocate the pLevel->iMem memory cell and
106191: ** compute the affinity string.
106192: **
106193: ** This routine always allocates at least one memory cell and returns
106194: ** the index of that memory cell. The code that
106195: ** calls this routine will use that memory cell to store the termination
106196: ** key value of the loop. If one or more IN operators appear, then
106197: ** this routine allocates an additional nEq memory cells for internal
106198: ** use.
106199: **
106200: ** Before returning, *pzAff is set to point to a buffer containing a
106201: ** copy of the column affinity string of the index allocated using
106202: ** sqlite3DbMalloc(). Except, entries in the copy of the string associated
106203: ** with equality constraints that use NONE affinity are set to
106204: ** SQLITE_AFF_NONE. This is to deal with SQL such as the following:
106205: **
106206: ** CREATE TABLE t1(a TEXT PRIMARY KEY, b);
106207: ** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b;
106208: **
106209: ** In the example above, the index on t1(a) has TEXT affinity. But since
106210: ** the right hand side of the equality constraint (t2.b) has NONE affinity,
106211: ** no conversion should be attempted before using a t2.b value as part of
106212: ** a key to search the index. Hence the first byte in the returned affinity
106213: ** string in this example would be set to SQLITE_AFF_NONE.
106214: */
106215: static int codeAllEqualityTerms(
106216: Parse *pParse, /* Parsing context */
106217: WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */
106218: WhereClause *pWC, /* The WHERE clause */
106219: Bitmask notReady, /* Which parts of FROM have not yet been coded */
106220: int nExtraReg, /* Number of extra registers to allocate */
106221: char **pzAff /* OUT: Set to point to affinity string */
106222: ){
106223: int nEq = pLevel->plan.nEq; /* The number of == or IN constraints to code */
106224: Vdbe *v = pParse->pVdbe; /* The vm under construction */
106225: Index *pIdx; /* The index being used for this loop */
106226: int iCur = pLevel->iTabCur; /* The cursor of the table */
106227: WhereTerm *pTerm; /* A single constraint term */
106228: int j; /* Loop counter */
106229: int regBase; /* Base register */
106230: int nReg; /* Number of registers to allocate */
106231: char *zAff; /* Affinity string to return */
106232:
106233: /* This module is only called on query plans that use an index. */
106234: assert( pLevel->plan.wsFlags & WHERE_INDEXED );
106235: pIdx = pLevel->plan.u.pIdx;
106236:
106237: /* Figure out how many memory cells we will need then allocate them.
106238: */
106239: regBase = pParse->nMem + 1;
106240: nReg = pLevel->plan.nEq + nExtraReg;
106241: pParse->nMem += nReg;
106242:
106243: zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(v, pIdx));
106244: if( !zAff ){
106245: pParse->db->mallocFailed = 1;
106246: }
106247:
106248: /* Evaluate the equality constraints
106249: */
106250: assert( pIdx->nColumn>=nEq );
106251: for(j=0; j<nEq; j++){
106252: int r1;
106253: int k = pIdx->aiColumn[j];
106254: pTerm = findTerm(pWC, iCur, k, notReady, pLevel->plan.wsFlags, pIdx);
1.2.2.1 ! misho 106255: if( pTerm==0 ) break;
1.2 misho 106256: /* The following true for indices with redundant columns.
106257: ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */
106258: testcase( (pTerm->wtFlags & TERM_CODED)!=0 );
106259: testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106260: r1 = codeEqualityTerm(pParse, pTerm, pLevel, regBase+j);
106261: if( r1!=regBase+j ){
106262: if( nReg==1 ){
106263: sqlite3ReleaseTempReg(pParse, regBase);
106264: regBase = r1;
106265: }else{
106266: sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j);
106267: }
106268: }
106269: testcase( pTerm->eOperator & WO_ISNULL );
106270: testcase( pTerm->eOperator & WO_IN );
106271: if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){
106272: Expr *pRight = pTerm->pExpr->pRight;
106273: sqlite3ExprCodeIsNullJump(v, pRight, regBase+j, pLevel->addrBrk);
106274: if( zAff ){
106275: if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_NONE ){
106276: zAff[j] = SQLITE_AFF_NONE;
106277: }
106278: if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){
106279: zAff[j] = SQLITE_AFF_NONE;
106280: }
106281: }
106282: }
106283: }
106284: *pzAff = zAff;
106285: return regBase;
106286: }
106287:
106288: #ifndef SQLITE_OMIT_EXPLAIN
106289: /*
106290: ** This routine is a helper for explainIndexRange() below
106291: **
106292: ** pStr holds the text of an expression that we are building up one term
106293: ** at a time. This routine adds a new term to the end of the expression.
106294: ** Terms are separated by AND so add the "AND" text for second and subsequent
106295: ** terms only.
106296: */
106297: static void explainAppendTerm(
106298: StrAccum *pStr, /* The text expression being built */
106299: int iTerm, /* Index of this term. First is zero */
106300: const char *zColumn, /* Name of the column */
106301: const char *zOp /* Name of the operator */
106302: ){
106303: if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5);
106304: sqlite3StrAccumAppend(pStr, zColumn, -1);
106305: sqlite3StrAccumAppend(pStr, zOp, 1);
106306: sqlite3StrAccumAppend(pStr, "?", 1);
106307: }
106308:
106309: /*
106310: ** Argument pLevel describes a strategy for scanning table pTab. This
106311: ** function returns a pointer to a string buffer containing a description
106312: ** of the subset of table rows scanned by the strategy in the form of an
106313: ** SQL expression. Or, if all rows are scanned, NULL is returned.
106314: **
106315: ** For example, if the query:
106316: **
106317: ** SELECT * FROM t1 WHERE a=1 AND b>2;
106318: **
106319: ** is run and there is an index on (a, b), then this function returns a
106320: ** string similar to:
106321: **
106322: ** "a=? AND b>?"
106323: **
106324: ** The returned pointer points to memory obtained from sqlite3DbMalloc().
106325: ** It is the responsibility of the caller to free the buffer when it is
106326: ** no longer required.
106327: */
106328: static char *explainIndexRange(sqlite3 *db, WhereLevel *pLevel, Table *pTab){
106329: WherePlan *pPlan = &pLevel->plan;
106330: Index *pIndex = pPlan->u.pIdx;
106331: int nEq = pPlan->nEq;
106332: int i, j;
106333: Column *aCol = pTab->aCol;
106334: int *aiColumn = pIndex->aiColumn;
106335: StrAccum txt;
106336:
106337: if( nEq==0 && (pPlan->wsFlags & (WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ){
106338: return 0;
106339: }
106340: sqlite3StrAccumInit(&txt, 0, 0, SQLITE_MAX_LENGTH);
106341: txt.db = db;
106342: sqlite3StrAccumAppend(&txt, " (", 2);
106343: for(i=0; i<nEq; i++){
106344: explainAppendTerm(&txt, i, aCol[aiColumn[i]].zName, "=");
106345: }
106346:
106347: j = i;
106348: if( pPlan->wsFlags&WHERE_BTM_LIMIT ){
106349: char *z = (j==pIndex->nColumn ) ? "rowid" : aCol[aiColumn[j]].zName;
106350: explainAppendTerm(&txt, i++, z, ">");
106351: }
106352: if( pPlan->wsFlags&WHERE_TOP_LIMIT ){
106353: char *z = (j==pIndex->nColumn ) ? "rowid" : aCol[aiColumn[j]].zName;
106354: explainAppendTerm(&txt, i, z, "<");
106355: }
106356: sqlite3StrAccumAppend(&txt, ")", 1);
106357: return sqlite3StrAccumFinish(&txt);
106358: }
106359:
106360: /*
106361: ** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN
106362: ** command. If the query being compiled is an EXPLAIN QUERY PLAN, a single
106363: ** record is added to the output to describe the table scan strategy in
106364: ** pLevel.
106365: */
106366: static void explainOneScan(
106367: Parse *pParse, /* Parse context */
106368: SrcList *pTabList, /* Table list this loop refers to */
106369: WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */
106370: int iLevel, /* Value for "level" column of output */
106371: int iFrom, /* Value for "from" column of output */
106372: u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */
106373: ){
106374: if( pParse->explain==2 ){
106375: u32 flags = pLevel->plan.wsFlags;
106376: struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom];
106377: Vdbe *v = pParse->pVdbe; /* VM being constructed */
106378: sqlite3 *db = pParse->db; /* Database handle */
106379: char *zMsg; /* Text to add to EQP output */
106380: sqlite3_int64 nRow; /* Expected number of rows visited by scan */
106381: int iId = pParse->iSelectId; /* Select id (left-most output column) */
106382: int isSearch; /* True for a SEARCH. False for SCAN. */
106383:
106384: if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_ONETABLE_ONLY) ) return;
106385:
106386: isSearch = (pLevel->plan.nEq>0)
106387: || (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0
106388: || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX));
106389:
106390: zMsg = sqlite3MPrintf(db, "%s", isSearch?"SEARCH":"SCAN");
106391: if( pItem->pSelect ){
106392: zMsg = sqlite3MAppendf(db, zMsg, "%s SUBQUERY %d", zMsg,pItem->iSelectId);
106393: }else{
106394: zMsg = sqlite3MAppendf(db, zMsg, "%s TABLE %s", zMsg, pItem->zName);
106395: }
106396:
106397: if( pItem->zAlias ){
106398: zMsg = sqlite3MAppendf(db, zMsg, "%s AS %s", zMsg, pItem->zAlias);
106399: }
106400: if( (flags & WHERE_INDEXED)!=0 ){
106401: char *zWhere = explainIndexRange(db, pLevel, pItem->pTab);
106402: zMsg = sqlite3MAppendf(db, zMsg, "%s USING %s%sINDEX%s%s%s", zMsg,
106403: ((flags & WHERE_TEMP_INDEX)?"AUTOMATIC ":""),
106404: ((flags & WHERE_IDX_ONLY)?"COVERING ":""),
106405: ((flags & WHERE_TEMP_INDEX)?"":" "),
106406: ((flags & WHERE_TEMP_INDEX)?"": pLevel->plan.u.pIdx->zName),
106407: zWhere
106408: );
106409: sqlite3DbFree(db, zWhere);
106410: }else if( flags & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
106411: zMsg = sqlite3MAppendf(db, zMsg, "%s USING INTEGER PRIMARY KEY", zMsg);
106412:
106413: if( flags&WHERE_ROWID_EQ ){
106414: zMsg = sqlite3MAppendf(db, zMsg, "%s (rowid=?)", zMsg);
106415: }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){
106416: zMsg = sqlite3MAppendf(db, zMsg, "%s (rowid>? AND rowid<?)", zMsg);
106417: }else if( flags&WHERE_BTM_LIMIT ){
106418: zMsg = sqlite3MAppendf(db, zMsg, "%s (rowid>?)", zMsg);
106419: }else if( flags&WHERE_TOP_LIMIT ){
106420: zMsg = sqlite3MAppendf(db, zMsg, "%s (rowid<?)", zMsg);
106421: }
106422: }
106423: #ifndef SQLITE_OMIT_VIRTUALTABLE
106424: else if( (flags & WHERE_VIRTUALTABLE)!=0 ){
106425: sqlite3_index_info *pVtabIdx = pLevel->plan.u.pVtabIdx;
106426: zMsg = sqlite3MAppendf(db, zMsg, "%s VIRTUAL TABLE INDEX %d:%s", zMsg,
106427: pVtabIdx->idxNum, pVtabIdx->idxStr);
106428: }
106429: #endif
106430: if( wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX) ){
106431: testcase( wctrlFlags & WHERE_ORDERBY_MIN );
106432: nRow = 1;
106433: }else{
106434: nRow = (sqlite3_int64)pLevel->plan.nRow;
106435: }
106436: zMsg = sqlite3MAppendf(db, zMsg, "%s (~%lld rows)", zMsg, nRow);
106437: sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg, P4_DYNAMIC);
106438: }
106439: }
106440: #else
106441: # define explainOneScan(u,v,w,x,y,z)
106442: #endif /* SQLITE_OMIT_EXPLAIN */
106443:
106444:
106445: /*
106446: ** Generate code for the start of the iLevel-th loop in the WHERE clause
106447: ** implementation described by pWInfo.
106448: */
106449: static Bitmask codeOneLoopStart(
106450: WhereInfo *pWInfo, /* Complete information about the WHERE clause */
106451: int iLevel, /* Which level of pWInfo->a[] should be coded */
106452: u16 wctrlFlags, /* One of the WHERE_* flags defined in sqliteInt.h */
1.2.2.1 ! misho 106453: Bitmask notReady /* Which tables are currently available */
1.2 misho 106454: ){
106455: int j, k; /* Loop counters */
106456: int iCur; /* The VDBE cursor for the table */
106457: int addrNxt; /* Where to jump to continue with the next IN case */
106458: int omitTable; /* True if we use the index only */
106459: int bRev; /* True if we need to scan in reverse order */
106460: WhereLevel *pLevel; /* The where level to be coded */
106461: WhereClause *pWC; /* Decomposition of the entire WHERE clause */
106462: WhereTerm *pTerm; /* A WHERE clause term */
106463: Parse *pParse; /* Parsing context */
106464: Vdbe *v; /* The prepared stmt under constructions */
106465: struct SrcList_item *pTabItem; /* FROM clause term being coded */
106466: int addrBrk; /* Jump here to break out of the loop */
106467: int addrCont; /* Jump here to continue with next cycle */
106468: int iRowidReg = 0; /* Rowid is stored in this register, if not zero */
106469: int iReleaseReg = 0; /* Temp register to free before returning */
106470:
106471: pParse = pWInfo->pParse;
106472: v = pParse->pVdbe;
106473: pWC = pWInfo->pWC;
106474: pLevel = &pWInfo->a[iLevel];
106475: pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
106476: iCur = pTabItem->iCursor;
106477: bRev = (pLevel->plan.wsFlags & WHERE_REVERSE)!=0;
106478: omitTable = (pLevel->plan.wsFlags & WHERE_IDX_ONLY)!=0
106479: && (wctrlFlags & WHERE_FORCE_TABLE)==0;
106480:
106481: /* Create labels for the "break" and "continue" instructions
106482: ** for the current loop. Jump to addrBrk to break out of a loop.
106483: ** Jump to cont to go immediately to the next iteration of the
106484: ** loop.
106485: **
106486: ** When there is an IN operator, we also have a "addrNxt" label that
106487: ** means to continue with the next IN value combination. When
106488: ** there are no IN operators in the constraints, the "addrNxt" label
106489: ** is the same as "addrBrk".
106490: */
106491: addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v);
106492: addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v);
106493:
106494: /* If this is the right table of a LEFT OUTER JOIN, allocate and
106495: ** initialize a memory cell that records if this table matches any
106496: ** row of the left table of the join.
106497: */
106498: if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){
106499: pLevel->iLeftJoin = ++pParse->nMem;
106500: sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin);
106501: VdbeComment((v, "init LEFT JOIN no-match flag"));
106502: }
106503:
1.2.2.1 ! misho 106504: /* Special case of a FROM clause subquery implemented as a co-routine */
! 106505: if( pTabItem->viaCoroutine ){
! 106506: int regYield = pTabItem->regReturn;
! 106507: sqlite3VdbeAddOp2(v, OP_Integer, pTabItem->addrFillSub-1, regYield);
! 106508: pLevel->p2 = sqlite3VdbeAddOp1(v, OP_Yield, regYield);
! 106509: VdbeComment((v, "next row of co-routine %s", pTabItem->pTab->zName));
! 106510: sqlite3VdbeAddOp2(v, OP_If, regYield+1, addrBrk);
! 106511: pLevel->op = OP_Goto;
! 106512: }else
! 106513:
1.2 misho 106514: #ifndef SQLITE_OMIT_VIRTUALTABLE
106515: if( (pLevel->plan.wsFlags & WHERE_VIRTUALTABLE)!=0 ){
106516: /* Case 0: The table is a virtual-table. Use the VFilter and VNext
106517: ** to access the data.
106518: */
106519: int iReg; /* P3 Value for OP_VFilter */
106520: sqlite3_index_info *pVtabIdx = pLevel->plan.u.pVtabIdx;
106521: int nConstraint = pVtabIdx->nConstraint;
106522: struct sqlite3_index_constraint_usage *aUsage =
106523: pVtabIdx->aConstraintUsage;
106524: const struct sqlite3_index_constraint *aConstraint =
106525: pVtabIdx->aConstraint;
106526:
106527: sqlite3ExprCachePush(pParse);
106528: iReg = sqlite3GetTempRange(pParse, nConstraint+2);
106529: for(j=1; j<=nConstraint; j++){
106530: for(k=0; k<nConstraint; k++){
106531: if( aUsage[k].argvIndex==j ){
106532: int iTerm = aConstraint[k].iTermOffset;
106533: sqlite3ExprCode(pParse, pWC->a[iTerm].pExpr->pRight, iReg+j+1);
106534: break;
106535: }
106536: }
106537: if( k==nConstraint ) break;
106538: }
106539: sqlite3VdbeAddOp2(v, OP_Integer, pVtabIdx->idxNum, iReg);
106540: sqlite3VdbeAddOp2(v, OP_Integer, j-1, iReg+1);
106541: sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrBrk, iReg, pVtabIdx->idxStr,
106542: pVtabIdx->needToFreeIdxStr ? P4_MPRINTF : P4_STATIC);
106543: pVtabIdx->needToFreeIdxStr = 0;
106544: for(j=0; j<nConstraint; j++){
106545: if( aUsage[j].omit ){
106546: int iTerm = aConstraint[j].iTermOffset;
106547: disableTerm(pLevel, &pWC->a[iTerm]);
106548: }
106549: }
106550: pLevel->op = OP_VNext;
106551: pLevel->p1 = iCur;
106552: pLevel->p2 = sqlite3VdbeCurrentAddr(v);
106553: sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
106554: sqlite3ExprCachePop(pParse, 1);
106555: }else
106556: #endif /* SQLITE_OMIT_VIRTUALTABLE */
106557:
106558: if( pLevel->plan.wsFlags & WHERE_ROWID_EQ ){
106559: /* Case 1: We can directly reference a single row using an
106560: ** equality comparison against the ROWID field. Or
106561: ** we reference multiple rows using a "rowid IN (...)"
106562: ** construct.
106563: */
106564: iReleaseReg = sqlite3GetTempReg(pParse);
106565: pTerm = findTerm(pWC, iCur, -1, notReady, WO_EQ|WO_IN, 0);
106566: assert( pTerm!=0 );
106567: assert( pTerm->pExpr!=0 );
106568: assert( pTerm->leftCursor==iCur );
106569: assert( omitTable==0 );
106570: testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106571: iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, iReleaseReg);
106572: addrNxt = pLevel->addrNxt;
106573: sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt);
106574: sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg);
106575: sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
106576: VdbeComment((v, "pk"));
106577: pLevel->op = OP_Noop;
106578: }else if( pLevel->plan.wsFlags & WHERE_ROWID_RANGE ){
106579: /* Case 2: We have an inequality comparison against the ROWID field.
106580: */
106581: int testOp = OP_Noop;
106582: int start;
106583: int memEndValue = 0;
106584: WhereTerm *pStart, *pEnd;
106585:
106586: assert( omitTable==0 );
106587: pStart = findTerm(pWC, iCur, -1, notReady, WO_GT|WO_GE, 0);
106588: pEnd = findTerm(pWC, iCur, -1, notReady, WO_LT|WO_LE, 0);
106589: if( bRev ){
106590: pTerm = pStart;
106591: pStart = pEnd;
106592: pEnd = pTerm;
106593: }
106594: if( pStart ){
106595: Expr *pX; /* The expression that defines the start bound */
106596: int r1, rTemp; /* Registers for holding the start boundary */
106597:
106598: /* The following constant maps TK_xx codes into corresponding
106599: ** seek opcodes. It depends on a particular ordering of TK_xx
106600: */
106601: const u8 aMoveOp[] = {
106602: /* TK_GT */ OP_SeekGt,
106603: /* TK_LE */ OP_SeekLe,
106604: /* TK_LT */ OP_SeekLt,
106605: /* TK_GE */ OP_SeekGe
106606: };
106607: assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */
106608: assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */
106609: assert( TK_GE==TK_GT+3 ); /* ... is correcct. */
106610:
106611: testcase( pStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106612: pX = pStart->pExpr;
106613: assert( pX!=0 );
106614: assert( pStart->leftCursor==iCur );
106615: r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
106616: sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1);
106617: VdbeComment((v, "pk"));
106618: sqlite3ExprCacheAffinityChange(pParse, r1, 1);
106619: sqlite3ReleaseTempReg(pParse, rTemp);
106620: disableTerm(pLevel, pStart);
106621: }else{
106622: sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk);
106623: }
106624: if( pEnd ){
106625: Expr *pX;
106626: pX = pEnd->pExpr;
106627: assert( pX!=0 );
106628: assert( pEnd->leftCursor==iCur );
106629: testcase( pEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106630: memEndValue = ++pParse->nMem;
106631: sqlite3ExprCode(pParse, pX->pRight, memEndValue);
106632: if( pX->op==TK_LT || pX->op==TK_GT ){
106633: testOp = bRev ? OP_Le : OP_Ge;
106634: }else{
106635: testOp = bRev ? OP_Lt : OP_Gt;
106636: }
106637: disableTerm(pLevel, pEnd);
106638: }
106639: start = sqlite3VdbeCurrentAddr(v);
106640: pLevel->op = bRev ? OP_Prev : OP_Next;
106641: pLevel->p1 = iCur;
106642: pLevel->p2 = start;
106643: if( pStart==0 && pEnd==0 ){
106644: pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP;
106645: }else{
106646: assert( pLevel->p5==0 );
106647: }
106648: if( testOp!=OP_Noop ){
106649: iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse);
106650: sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg);
106651: sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
106652: sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg);
106653: sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL);
106654: }
106655: }else if( pLevel->plan.wsFlags & (WHERE_COLUMN_RANGE|WHERE_COLUMN_EQ) ){
106656: /* Case 3: A scan using an index.
106657: **
106658: ** The WHERE clause may contain zero or more equality
106659: ** terms ("==" or "IN" operators) that refer to the N
106660: ** left-most columns of the index. It may also contain
106661: ** inequality constraints (>, <, >= or <=) on the indexed
106662: ** column that immediately follows the N equalities. Only
106663: ** the right-most column can be an inequality - the rest must
106664: ** use the "==" and "IN" operators. For example, if the
106665: ** index is on (x,y,z), then the following clauses are all
106666: ** optimized:
106667: **
106668: ** x=5
106669: ** x=5 AND y=10
106670: ** x=5 AND y<10
106671: ** x=5 AND y>5 AND y<10
106672: ** x=5 AND y=5 AND z<=10
106673: **
106674: ** The z<10 term of the following cannot be used, only
106675: ** the x=5 term:
106676: **
106677: ** x=5 AND z<10
106678: **
106679: ** N may be zero if there are inequality constraints.
106680: ** If there are no inequality constraints, then N is at
106681: ** least one.
106682: **
106683: ** This case is also used when there are no WHERE clause
106684: ** constraints but an index is selected anyway, in order
106685: ** to force the output order to conform to an ORDER BY.
106686: */
106687: static const u8 aStartOp[] = {
106688: 0,
106689: 0,
106690: OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */
106691: OP_Last, /* 3: (!start_constraints && startEq && bRev) */
106692: OP_SeekGt, /* 4: (start_constraints && !startEq && !bRev) */
106693: OP_SeekLt, /* 5: (start_constraints && !startEq && bRev) */
106694: OP_SeekGe, /* 6: (start_constraints && startEq && !bRev) */
106695: OP_SeekLe /* 7: (start_constraints && startEq && bRev) */
106696: };
106697: static const u8 aEndOp[] = {
106698: OP_Noop, /* 0: (!end_constraints) */
106699: OP_IdxGE, /* 1: (end_constraints && !bRev) */
106700: OP_IdxLT /* 2: (end_constraints && bRev) */
106701: };
106702: int nEq = pLevel->plan.nEq; /* Number of == or IN terms */
106703: int isMinQuery = 0; /* If this is an optimized SELECT min(x).. */
106704: int regBase; /* Base register holding constraint values */
106705: int r1; /* Temp register */
106706: WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */
106707: WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */
106708: int startEq; /* True if range start uses ==, >= or <= */
106709: int endEq; /* True if range end uses ==, >= or <= */
106710: int start_constraints; /* Start of range is constrained */
106711: int nConstraint; /* Number of constraint terms */
106712: Index *pIdx; /* The index we will be using */
106713: int iIdxCur; /* The VDBE cursor for the index */
106714: int nExtraReg = 0; /* Number of extra registers needed */
106715: int op; /* Instruction opcode */
106716: char *zStartAff; /* Affinity for start of range constraint */
106717: char *zEndAff; /* Affinity for end of range constraint */
106718:
106719: pIdx = pLevel->plan.u.pIdx;
106720: iIdxCur = pLevel->iIdxCur;
106721: k = (nEq==pIdx->nColumn ? -1 : pIdx->aiColumn[nEq]);
106722:
106723: /* If this loop satisfies a sort order (pOrderBy) request that
106724: ** was passed to this function to implement a "SELECT min(x) ..."
106725: ** query, then the caller will only allow the loop to run for
106726: ** a single iteration. This means that the first row returned
106727: ** should not have a NULL value stored in 'x'. If column 'x' is
106728: ** the first one after the nEq equality constraints in the index,
106729: ** this requires some special handling.
106730: */
106731: if( (wctrlFlags&WHERE_ORDERBY_MIN)!=0
1.2.2.1 ! misho 106732: && (pLevel->plan.wsFlags&WHERE_ORDERED)
1.2 misho 106733: && (pIdx->nColumn>nEq)
106734: ){
106735: /* assert( pOrderBy->nExpr==1 ); */
106736: /* assert( pOrderBy->a[0].pExpr->iColumn==pIdx->aiColumn[nEq] ); */
106737: isMinQuery = 1;
106738: nExtraReg = 1;
106739: }
106740:
106741: /* Find any inequality constraint terms for the start and end
106742: ** of the range.
106743: */
106744: if( pLevel->plan.wsFlags & WHERE_TOP_LIMIT ){
106745: pRangeEnd = findTerm(pWC, iCur, k, notReady, (WO_LT|WO_LE), pIdx);
106746: nExtraReg = 1;
106747: }
106748: if( pLevel->plan.wsFlags & WHERE_BTM_LIMIT ){
106749: pRangeStart = findTerm(pWC, iCur, k, notReady, (WO_GT|WO_GE), pIdx);
106750: nExtraReg = 1;
106751: }
106752:
106753: /* Generate code to evaluate all constraint terms using == or IN
106754: ** and store the values of those terms in an array of registers
106755: ** starting at regBase.
106756: */
106757: regBase = codeAllEqualityTerms(
106758: pParse, pLevel, pWC, notReady, nExtraReg, &zStartAff
106759: );
106760: zEndAff = sqlite3DbStrDup(pParse->db, zStartAff);
106761: addrNxt = pLevel->addrNxt;
106762:
106763: /* If we are doing a reverse order scan on an ascending index, or
106764: ** a forward order scan on a descending index, interchange the
106765: ** start and end terms (pRangeStart and pRangeEnd).
106766: */
106767: if( (nEq<pIdx->nColumn && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC))
106768: || (bRev && pIdx->nColumn==nEq)
106769: ){
106770: SWAP(WhereTerm *, pRangeEnd, pRangeStart);
106771: }
106772:
106773: testcase( pRangeStart && pRangeStart->eOperator & WO_LE );
106774: testcase( pRangeStart && pRangeStart->eOperator & WO_GE );
106775: testcase( pRangeEnd && pRangeEnd->eOperator & WO_LE );
106776: testcase( pRangeEnd && pRangeEnd->eOperator & WO_GE );
106777: startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE);
106778: endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE);
106779: start_constraints = pRangeStart || nEq>0;
106780:
106781: /* Seek the index cursor to the start of the range. */
106782: nConstraint = nEq;
106783: if( pRangeStart ){
106784: Expr *pRight = pRangeStart->pExpr->pRight;
106785: sqlite3ExprCode(pParse, pRight, regBase+nEq);
106786: if( (pRangeStart->wtFlags & TERM_VNULL)==0 ){
106787: sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt);
106788: }
106789: if( zStartAff ){
106790: if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_NONE){
106791: /* Since the comparison is to be performed with no conversions
106792: ** applied to the operands, set the affinity to apply to pRight to
106793: ** SQLITE_AFF_NONE. */
106794: zStartAff[nEq] = SQLITE_AFF_NONE;
106795: }
106796: if( sqlite3ExprNeedsNoAffinityChange(pRight, zStartAff[nEq]) ){
106797: zStartAff[nEq] = SQLITE_AFF_NONE;
106798: }
106799: }
106800: nConstraint++;
106801: testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106802: }else if( isMinQuery ){
106803: sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq);
106804: nConstraint++;
106805: startEq = 0;
106806: start_constraints = 1;
106807: }
106808: codeApplyAffinity(pParse, regBase, nConstraint, zStartAff);
106809: op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev];
106810: assert( op!=0 );
106811: testcase( op==OP_Rewind );
106812: testcase( op==OP_Last );
106813: testcase( op==OP_SeekGt );
106814: testcase( op==OP_SeekGe );
106815: testcase( op==OP_SeekLe );
106816: testcase( op==OP_SeekLt );
106817: sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint);
106818:
106819: /* Load the value for the inequality constraint at the end of the
106820: ** range (if any).
106821: */
106822: nConstraint = nEq;
106823: if( pRangeEnd ){
106824: Expr *pRight = pRangeEnd->pExpr->pRight;
106825: sqlite3ExprCacheRemove(pParse, regBase+nEq, 1);
106826: sqlite3ExprCode(pParse, pRight, regBase+nEq);
106827: if( (pRangeEnd->wtFlags & TERM_VNULL)==0 ){
106828: sqlite3ExprCodeIsNullJump(v, pRight, regBase+nEq, addrNxt);
106829: }
106830: if( zEndAff ){
106831: if( sqlite3CompareAffinity(pRight, zEndAff[nEq])==SQLITE_AFF_NONE){
106832: /* Since the comparison is to be performed with no conversions
106833: ** applied to the operands, set the affinity to apply to pRight to
106834: ** SQLITE_AFF_NONE. */
106835: zEndAff[nEq] = SQLITE_AFF_NONE;
106836: }
106837: if( sqlite3ExprNeedsNoAffinityChange(pRight, zEndAff[nEq]) ){
106838: zEndAff[nEq] = SQLITE_AFF_NONE;
106839: }
106840: }
106841: codeApplyAffinity(pParse, regBase, nEq+1, zEndAff);
106842: nConstraint++;
106843: testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); /* EV: R-30575-11662 */
106844: }
106845: sqlite3DbFree(pParse->db, zStartAff);
106846: sqlite3DbFree(pParse->db, zEndAff);
106847:
106848: /* Top of the loop body */
106849: pLevel->p2 = sqlite3VdbeCurrentAddr(v);
106850:
106851: /* Check if the index cursor is past the end of the range. */
106852: op = aEndOp[(pRangeEnd || nEq) * (1 + bRev)];
106853: testcase( op==OP_Noop );
106854: testcase( op==OP_IdxGE );
106855: testcase( op==OP_IdxLT );
106856: if( op!=OP_Noop ){
106857: sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint);
106858: sqlite3VdbeChangeP5(v, endEq!=bRev ?1:0);
106859: }
106860:
106861: /* If there are inequality constraints, check that the value
106862: ** of the table column that the inequality contrains is not NULL.
106863: ** If it is, jump to the next iteration of the loop.
106864: */
106865: r1 = sqlite3GetTempReg(pParse);
106866: testcase( pLevel->plan.wsFlags & WHERE_BTM_LIMIT );
106867: testcase( pLevel->plan.wsFlags & WHERE_TOP_LIMIT );
106868: if( (pLevel->plan.wsFlags & (WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 ){
106869: sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, nEq, r1);
106870: sqlite3VdbeAddOp2(v, OP_IsNull, r1, addrCont);
106871: }
106872: sqlite3ReleaseTempReg(pParse, r1);
106873:
106874: /* Seek the table cursor, if required */
106875: disableTerm(pLevel, pRangeStart);
106876: disableTerm(pLevel, pRangeEnd);
106877: if( !omitTable ){
106878: iRowidReg = iReleaseReg = sqlite3GetTempReg(pParse);
106879: sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg);
106880: sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg);
106881: sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */
106882: }
106883:
106884: /* Record the instruction used to terminate the loop. Disable
106885: ** WHERE clause terms made redundant by the index range scan.
106886: */
106887: if( pLevel->plan.wsFlags & WHERE_UNIQUE ){
106888: pLevel->op = OP_Noop;
106889: }else if( bRev ){
106890: pLevel->op = OP_Prev;
106891: }else{
106892: pLevel->op = OP_Next;
106893: }
106894: pLevel->p1 = iIdxCur;
1.2.2.1 ! misho 106895: if( pLevel->plan.wsFlags & WHERE_COVER_SCAN ){
! 106896: pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP;
! 106897: }else{
! 106898: assert( pLevel->p5==0 );
! 106899: }
1.2 misho 106900: }else
106901:
106902: #ifndef SQLITE_OMIT_OR_OPTIMIZATION
106903: if( pLevel->plan.wsFlags & WHERE_MULTI_OR ){
106904: /* Case 4: Two or more separately indexed terms connected by OR
106905: **
106906: ** Example:
106907: **
106908: ** CREATE TABLE t1(a,b,c,d);
106909: ** CREATE INDEX i1 ON t1(a);
106910: ** CREATE INDEX i2 ON t1(b);
106911: ** CREATE INDEX i3 ON t1(c);
106912: **
106913: ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13)
106914: **
106915: ** In the example, there are three indexed terms connected by OR.
106916: ** The top of the loop looks like this:
106917: **
106918: ** Null 1 # Zero the rowset in reg 1
106919: **
106920: ** Then, for each indexed term, the following. The arguments to
106921: ** RowSetTest are such that the rowid of the current row is inserted
106922: ** into the RowSet. If it is already present, control skips the
106923: ** Gosub opcode and jumps straight to the code generated by WhereEnd().
106924: **
106925: ** sqlite3WhereBegin(<term>)
106926: ** RowSetTest # Insert rowid into rowset
106927: ** Gosub 2 A
106928: ** sqlite3WhereEnd()
106929: **
106930: ** Following the above, code to terminate the loop. Label A, the target
106931: ** of the Gosub above, jumps to the instruction right after the Goto.
106932: **
106933: ** Null 1 # Zero the rowset in reg 1
106934: ** Goto B # The loop is finished.
106935: **
106936: ** A: <loop body> # Return data, whatever.
106937: **
106938: ** Return 2 # Jump back to the Gosub
106939: **
106940: ** B: <after the loop>
106941: **
106942: */
106943: WhereClause *pOrWc; /* The OR-clause broken out into subterms */
106944: SrcList *pOrTab; /* Shortened table list or OR-clause generation */
1.2.2.1 ! misho 106945: Index *pCov = 0; /* Potential covering index (or NULL) */
! 106946: int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */
1.2 misho 106947:
106948: int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */
106949: int regRowset = 0; /* Register for RowSet object */
106950: int regRowid = 0; /* Register holding rowid */
106951: int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */
106952: int iRetInit; /* Address of regReturn init */
106953: int untestedTerms = 0; /* Some terms not completely tested */
106954: int ii; /* Loop counter */
106955: Expr *pAndExpr = 0; /* An ".. AND (...)" expression */
106956:
106957: pTerm = pLevel->plan.u.pTerm;
106958: assert( pTerm!=0 );
106959: assert( pTerm->eOperator==WO_OR );
106960: assert( (pTerm->wtFlags & TERM_ORINFO)!=0 );
106961: pOrWc = &pTerm->u.pOrInfo->wc;
106962: pLevel->op = OP_Return;
106963: pLevel->p1 = regReturn;
106964:
1.2.2.1 ! misho 106965: /* Set up a new SrcList in pOrTab containing the table being scanned
1.2 misho 106966: ** by this loop in the a[0] slot and all notReady tables in a[1..] slots.
106967: ** This becomes the SrcList in the recursive call to sqlite3WhereBegin().
106968: */
106969: if( pWInfo->nLevel>1 ){
106970: int nNotReady; /* The number of notReady tables */
106971: struct SrcList_item *origSrc; /* Original list of tables */
106972: nNotReady = pWInfo->nLevel - iLevel - 1;
106973: pOrTab = sqlite3StackAllocRaw(pParse->db,
106974: sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0]));
106975: if( pOrTab==0 ) return notReady;
106976: pOrTab->nAlloc = (i16)(nNotReady + 1);
106977: pOrTab->nSrc = pOrTab->nAlloc;
106978: memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem));
106979: origSrc = pWInfo->pTabList->a;
106980: for(k=1; k<=nNotReady; k++){
106981: memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k]));
106982: }
106983: }else{
106984: pOrTab = pWInfo->pTabList;
106985: }
106986:
106987: /* Initialize the rowset register to contain NULL. An SQL NULL is
106988: ** equivalent to an empty rowset.
106989: **
106990: ** Also initialize regReturn to contain the address of the instruction
106991: ** immediately following the OP_Return at the bottom of the loop. This
106992: ** is required in a few obscure LEFT JOIN cases where control jumps
106993: ** over the top of the loop into the body of it. In this case the
106994: ** correct response for the end-of-loop code (the OP_Return) is to
106995: ** fall through to the next instruction, just as an OP_Next does if
106996: ** called on an uninitialized cursor.
106997: */
106998: if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
106999: regRowset = ++pParse->nMem;
107000: regRowid = ++pParse->nMem;
107001: sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset);
107002: }
107003: iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn);
107004:
107005: /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y
107006: ** Then for every term xN, evaluate as the subexpression: xN AND z
107007: ** That way, terms in y that are factored into the disjunction will
107008: ** be picked up by the recursive calls to sqlite3WhereBegin() below.
1.2.2.1 ! misho 107009: **
! 107010: ** Actually, each subexpression is converted to "xN AND w" where w is
! 107011: ** the "interesting" terms of z - terms that did not originate in the
! 107012: ** ON or USING clause of a LEFT JOIN, and terms that are usable as
! 107013: ** indices.
1.2 misho 107014: */
107015: if( pWC->nTerm>1 ){
1.2.2.1 ! misho 107016: int iTerm;
! 107017: for(iTerm=0; iTerm<pWC->nTerm; iTerm++){
! 107018: Expr *pExpr = pWC->a[iTerm].pExpr;
! 107019: if( ExprHasProperty(pExpr, EP_FromJoin) ) continue;
! 107020: if( pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_ORINFO) ) continue;
! 107021: if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
! 107022: pExpr = sqlite3ExprDup(pParse->db, pExpr, 0);
! 107023: pAndExpr = sqlite3ExprAnd(pParse->db, pAndExpr, pExpr);
! 107024: }
! 107025: if( pAndExpr ){
! 107026: pAndExpr = sqlite3PExpr(pParse, TK_AND, 0, pAndExpr, 0);
! 107027: }
1.2 misho 107028: }
107029:
107030: for(ii=0; ii<pOrWc->nTerm; ii++){
107031: WhereTerm *pOrTerm = &pOrWc->a[ii];
107032: if( pOrTerm->leftCursor==iCur || pOrTerm->eOperator==WO_AND ){
107033: WhereInfo *pSubWInfo; /* Info for single OR-term scan */
107034: Expr *pOrExpr = pOrTerm->pExpr;
107035: if( pAndExpr ){
107036: pAndExpr->pLeft = pOrExpr;
107037: pOrExpr = pAndExpr;
107038: }
107039: /* Loop through table entries that match term pOrTerm. */
107040: pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0,
107041: WHERE_OMIT_OPEN_CLOSE | WHERE_AND_ONLY |
1.2.2.1 ! misho 107042: WHERE_FORCE_TABLE | WHERE_ONETABLE_ONLY, iCovCur);
! 107043: assert( pSubWInfo || pParse->nErr || pParse->db->mallocFailed );
1.2 misho 107044: if( pSubWInfo ){
1.2.2.1 ! misho 107045: WhereLevel *pLvl;
1.2 misho 107046: explainOneScan(
107047: pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0
107048: );
107049: if( (wctrlFlags & WHERE_DUPLICATES_OK)==0 ){
107050: int iSet = ((ii==pOrWc->nTerm-1)?-1:ii);
107051: int r;
107052: r = sqlite3ExprCodeGetColumn(pParse, pTabItem->pTab, -1, iCur,
1.2.2.1 ! misho 107053: regRowid, 0);
1.2 misho 107054: sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset,
107055: sqlite3VdbeCurrentAddr(v)+2, r, iSet);
107056: }
107057: sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody);
107058:
107059: /* The pSubWInfo->untestedTerms flag means that this OR term
107060: ** contained one or more AND term from a notReady table. The
107061: ** terms from the notReady table could not be tested and will
107062: ** need to be tested later.
107063: */
107064: if( pSubWInfo->untestedTerms ) untestedTerms = 1;
107065:
1.2.2.1 ! misho 107066: /* If all of the OR-connected terms are optimized using the same
! 107067: ** index, and the index is opened using the same cursor number
! 107068: ** by each call to sqlite3WhereBegin() made by this loop, it may
! 107069: ** be possible to use that index as a covering index.
! 107070: **
! 107071: ** If the call to sqlite3WhereBegin() above resulted in a scan that
! 107072: ** uses an index, and this is either the first OR-connected term
! 107073: ** processed or the index is the same as that used by all previous
! 107074: ** terms, set pCov to the candidate covering index. Otherwise, set
! 107075: ** pCov to NULL to indicate that no candidate covering index will
! 107076: ** be available.
! 107077: */
! 107078: pLvl = &pSubWInfo->a[0];
! 107079: if( (pLvl->plan.wsFlags & WHERE_INDEXED)!=0
! 107080: && (pLvl->plan.wsFlags & WHERE_TEMP_INDEX)==0
! 107081: && (ii==0 || pLvl->plan.u.pIdx==pCov)
! 107082: ){
! 107083: assert( pLvl->iIdxCur==iCovCur );
! 107084: pCov = pLvl->plan.u.pIdx;
! 107085: }else{
! 107086: pCov = 0;
! 107087: }
! 107088:
1.2 misho 107089: /* Finish the loop through table entries that match term pOrTerm. */
107090: sqlite3WhereEnd(pSubWInfo);
107091: }
107092: }
107093: }
1.2.2.1 ! misho 107094: pLevel->u.pCovidx = pCov;
! 107095: if( pCov ) pLevel->iIdxCur = iCovCur;
! 107096: if( pAndExpr ){
! 107097: pAndExpr->pLeft = 0;
! 107098: sqlite3ExprDelete(pParse->db, pAndExpr);
! 107099: }
1.2 misho 107100: sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v));
107101: sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk);
107102: sqlite3VdbeResolveLabel(v, iLoopBody);
107103:
107104: if( pWInfo->nLevel>1 ) sqlite3StackFree(pParse->db, pOrTab);
107105: if( !untestedTerms ) disableTerm(pLevel, pTerm);
107106: }else
107107: #endif /* SQLITE_OMIT_OR_OPTIMIZATION */
107108:
107109: {
107110: /* Case 5: There is no usable index. We must do a complete
107111: ** scan of the entire table.
107112: */
107113: static const u8 aStep[] = { OP_Next, OP_Prev };
107114: static const u8 aStart[] = { OP_Rewind, OP_Last };
107115: assert( bRev==0 || bRev==1 );
107116: assert( omitTable==0 );
107117: pLevel->op = aStep[bRev];
107118: pLevel->p1 = iCur;
107119: pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk);
107120: pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP;
107121: }
107122: notReady &= ~getMask(pWC->pMaskSet, iCur);
107123:
107124: /* Insert code to test every subexpression that can be completely
107125: ** computed using the current set of tables.
107126: **
107127: ** IMPLEMENTATION-OF: R-49525-50935 Terms that cannot be satisfied through
107128: ** the use of indices become tests that are evaluated against each row of
107129: ** the relevant input tables.
107130: */
107131: for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){
107132: Expr *pE;
107133: testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* IMP: R-30575-11662 */
107134: testcase( pTerm->wtFlags & TERM_CODED );
107135: if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
107136: if( (pTerm->prereqAll & notReady)!=0 ){
107137: testcase( pWInfo->untestedTerms==0
107138: && (pWInfo->wctrlFlags & WHERE_ONETABLE_ONLY)!=0 );
107139: pWInfo->untestedTerms = 1;
107140: continue;
107141: }
107142: pE = pTerm->pExpr;
107143: assert( pE!=0 );
107144: if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){
107145: continue;
107146: }
107147: sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL);
107148: pTerm->wtFlags |= TERM_CODED;
107149: }
107150:
107151: /* For a LEFT OUTER JOIN, generate code that will record the fact that
107152: ** at least one row of the right table has matched the left table.
107153: */
107154: if( pLevel->iLeftJoin ){
107155: pLevel->addrFirst = sqlite3VdbeCurrentAddr(v);
107156: sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin);
107157: VdbeComment((v, "record LEFT JOIN hit"));
107158: sqlite3ExprCacheClear(pParse);
107159: for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){
107160: testcase( pTerm->wtFlags & TERM_VIRTUAL ); /* IMP: R-30575-11662 */
107161: testcase( pTerm->wtFlags & TERM_CODED );
107162: if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue;
107163: if( (pTerm->prereqAll & notReady)!=0 ){
107164: assert( pWInfo->untestedTerms );
107165: continue;
107166: }
107167: assert( pTerm->pExpr );
107168: sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL);
107169: pTerm->wtFlags |= TERM_CODED;
107170: }
107171: }
107172: sqlite3ReleaseTempReg(pParse, iReleaseReg);
107173:
107174: return notReady;
107175: }
107176:
107177: #if defined(SQLITE_TEST)
107178: /*
107179: ** The following variable holds a text description of query plan generated
107180: ** by the most recent call to sqlite3WhereBegin(). Each call to WhereBegin
107181: ** overwrites the previous. This information is used for testing and
107182: ** analysis only.
107183: */
107184: SQLITE_API char sqlite3_query_plan[BMS*2*40]; /* Text of the join */
107185: static int nQPlan = 0; /* Next free slow in _query_plan[] */
107186:
107187: #endif /* SQLITE_TEST */
107188:
107189:
107190: /*
107191: ** Free a WhereInfo structure
107192: */
107193: static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){
107194: if( ALWAYS(pWInfo) ){
107195: int i;
107196: for(i=0; i<pWInfo->nLevel; i++){
107197: sqlite3_index_info *pInfo = pWInfo->a[i].pIdxInfo;
107198: if( pInfo ){
107199: /* assert( pInfo->needToFreeIdxStr==0 || db->mallocFailed ); */
107200: if( pInfo->needToFreeIdxStr ){
107201: sqlite3_free(pInfo->idxStr);
107202: }
107203: sqlite3DbFree(db, pInfo);
107204: }
107205: if( pWInfo->a[i].plan.wsFlags & WHERE_TEMP_INDEX ){
107206: Index *pIdx = pWInfo->a[i].plan.u.pIdx;
107207: if( pIdx ){
107208: sqlite3DbFree(db, pIdx->zColAff);
107209: sqlite3DbFree(db, pIdx);
107210: }
107211: }
107212: }
107213: whereClauseClear(pWInfo->pWC);
107214: sqlite3DbFree(db, pWInfo);
107215: }
107216: }
107217:
107218:
107219: /*
107220: ** Generate the beginning of the loop used for WHERE clause processing.
107221: ** The return value is a pointer to an opaque structure that contains
107222: ** information needed to terminate the loop. Later, the calling routine
107223: ** should invoke sqlite3WhereEnd() with the return value of this function
107224: ** in order to complete the WHERE clause processing.
107225: **
107226: ** If an error occurs, this routine returns NULL.
107227: **
107228: ** The basic idea is to do a nested loop, one loop for each table in
107229: ** the FROM clause of a select. (INSERT and UPDATE statements are the
107230: ** same as a SELECT with only a single table in the FROM clause.) For
107231: ** example, if the SQL is this:
107232: **
107233: ** SELECT * FROM t1, t2, t3 WHERE ...;
107234: **
107235: ** Then the code generated is conceptually like the following:
107236: **
107237: ** foreach row1 in t1 do \ Code generated
107238: ** foreach row2 in t2 do |-- by sqlite3WhereBegin()
107239: ** foreach row3 in t3 do /
107240: ** ...
107241: ** end \ Code generated
107242: ** end |-- by sqlite3WhereEnd()
107243: ** end /
107244: **
107245: ** Note that the loops might not be nested in the order in which they
107246: ** appear in the FROM clause if a different order is better able to make
107247: ** use of indices. Note also that when the IN operator appears in
107248: ** the WHERE clause, it might result in additional nested loops for
107249: ** scanning through all values on the right-hand side of the IN.
107250: **
107251: ** There are Btree cursors associated with each table. t1 uses cursor
107252: ** number pTabList->a[0].iCursor. t2 uses the cursor pTabList->a[1].iCursor.
107253: ** And so forth. This routine generates code to open those VDBE cursors
107254: ** and sqlite3WhereEnd() generates the code to close them.
107255: **
107256: ** The code that sqlite3WhereBegin() generates leaves the cursors named
107257: ** in pTabList pointing at their appropriate entries. The [...] code
107258: ** can use OP_Column and OP_Rowid opcodes on these cursors to extract
107259: ** data from the various tables of the loop.
107260: **
107261: ** If the WHERE clause is empty, the foreach loops must each scan their
107262: ** entire tables. Thus a three-way join is an O(N^3) operation. But if
107263: ** the tables have indices and there are terms in the WHERE clause that
107264: ** refer to those indices, a complete table scan can be avoided and the
107265: ** code will run much faster. Most of the work of this routine is checking
107266: ** to see if there are indices that can be used to speed up the loop.
107267: **
107268: ** Terms of the WHERE clause are also used to limit which rows actually
107269: ** make it to the "..." in the middle of the loop. After each "foreach",
107270: ** terms of the WHERE clause that use only terms in that loop and outer
107271: ** loops are evaluated and if false a jump is made around all subsequent
107272: ** inner loops (or around the "..." if the test occurs within the inner-
107273: ** most loop)
107274: **
107275: ** OUTER JOINS
107276: **
107277: ** An outer join of tables t1 and t2 is conceptally coded as follows:
107278: **
107279: ** foreach row1 in t1 do
107280: ** flag = 0
107281: ** foreach row2 in t2 do
107282: ** start:
107283: ** ...
107284: ** flag = 1
107285: ** end
107286: ** if flag==0 then
107287: ** move the row2 cursor to a null row
107288: ** goto start
107289: ** fi
107290: ** end
107291: **
107292: ** ORDER BY CLAUSE PROCESSING
107293: **
1.2.2.1 ! misho 107294: ** pOrderBy is a pointer to the ORDER BY clause of a SELECT statement,
1.2 misho 107295: ** if there is one. If there is no ORDER BY clause or if this routine
1.2.2.1 ! misho 107296: ** is called from an UPDATE or DELETE statement, then pOrderBy is NULL.
1.2 misho 107297: **
107298: ** If an index can be used so that the natural output order of the table
107299: ** scan is correct for the ORDER BY clause, then that index is used and
1.2.2.1 ! misho 107300: ** the returned WhereInfo.nOBSat field is set to pOrderBy->nExpr. This
! 107301: ** is an optimization that prevents an unnecessary sort of the result set
! 107302: ** if an index appropriate for the ORDER BY clause already exists.
1.2 misho 107303: **
107304: ** If the where clause loops cannot be arranged to provide the correct
1.2.2.1 ! misho 107305: ** output order, then WhereInfo.nOBSat is 0.
1.2 misho 107306: */
107307: SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
107308: Parse *pParse, /* The parser context */
107309: SrcList *pTabList, /* A list of all tables to be scanned */
107310: Expr *pWhere, /* The WHERE clause */
1.2.2.1 ! misho 107311: ExprList *pOrderBy, /* An ORDER BY clause, or NULL */
1.2 misho 107312: ExprList *pDistinct, /* The select-list for DISTINCT queries - or NULL */
1.2.2.1 ! misho 107313: u16 wctrlFlags, /* One of the WHERE_* flags defined in sqliteInt.h */
! 107314: int iIdxCur /* If WHERE_ONETABLE_ONLY is set, index cursor number */
1.2 misho 107315: ){
107316: int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */
107317: int nTabList; /* Number of elements in pTabList */
107318: WhereInfo *pWInfo; /* Will become the return value of this function */
107319: Vdbe *v = pParse->pVdbe; /* The virtual database engine */
107320: Bitmask notReady; /* Cursors that are not yet positioned */
1.2.2.1 ! misho 107321: WhereBestIdx sWBI; /* Best index search context */
1.2 misho 107322: WhereMaskSet *pMaskSet; /* The expression mask set */
1.2.2.1 ! misho 107323: WhereLevel *pLevel; /* A single level in pWInfo->a[] */
! 107324: int iFrom; /* First unused FROM clause element */
1.2 misho 107325: int andFlags; /* AND-ed combination of all pWC->a[].wtFlags */
1.2.2.1 ! misho 107326: int ii; /* Loop counter */
1.2 misho 107327: sqlite3 *db; /* Database connection */
107328:
1.2.2.1 ! misho 107329:
! 107330: /* Variable initialization */
! 107331: memset(&sWBI, 0, sizeof(sWBI));
! 107332: sWBI.pParse = pParse;
! 107333:
1.2 misho 107334: /* The number of tables in the FROM clause is limited by the number of
107335: ** bits in a Bitmask
107336: */
107337: testcase( pTabList->nSrc==BMS );
107338: if( pTabList->nSrc>BMS ){
107339: sqlite3ErrorMsg(pParse, "at most %d tables in a join", BMS);
107340: return 0;
107341: }
107342:
107343: /* This function normally generates a nested loop for all tables in
107344: ** pTabList. But if the WHERE_ONETABLE_ONLY flag is set, then we should
107345: ** only generate code for the first table in pTabList and assume that
107346: ** any cursors associated with subsequent tables are uninitialized.
107347: */
107348: nTabList = (wctrlFlags & WHERE_ONETABLE_ONLY) ? 1 : pTabList->nSrc;
107349:
107350: /* Allocate and initialize the WhereInfo structure that will become the
107351: ** return value. A single allocation is used to store the WhereInfo
107352: ** struct, the contents of WhereInfo.a[], the WhereClause structure
107353: ** and the WhereMaskSet structure. Since WhereClause contains an 8-byte
107354: ** field (type Bitmask) it must be aligned on an 8-byte boundary on
107355: ** some architectures. Hence the ROUND8() below.
107356: */
107357: db = pParse->db;
107358: nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel));
107359: pWInfo = sqlite3DbMallocZero(db,
107360: nByteWInfo +
107361: sizeof(WhereClause) +
107362: sizeof(WhereMaskSet)
107363: );
107364: if( db->mallocFailed ){
107365: sqlite3DbFree(db, pWInfo);
107366: pWInfo = 0;
107367: goto whereBeginError;
107368: }
107369: pWInfo->nLevel = nTabList;
107370: pWInfo->pParse = pParse;
107371: pWInfo->pTabList = pTabList;
107372: pWInfo->iBreak = sqlite3VdbeMakeLabel(v);
1.2.2.1 ! misho 107373: pWInfo->pWC = sWBI.pWC = (WhereClause *)&((u8 *)pWInfo)[nByteWInfo];
1.2 misho 107374: pWInfo->wctrlFlags = wctrlFlags;
107375: pWInfo->savedNQueryLoop = pParse->nQueryLoop;
1.2.2.1 ! misho 107376: pMaskSet = (WhereMaskSet*)&sWBI.pWC[1];
! 107377: sWBI.aLevel = pWInfo->a;
1.2 misho 107378:
107379: /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via
107380: ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */
1.2.2.1 ! misho 107381: if( OptimizationDisabled(db, SQLITE_DistinctOpt) ) pDistinct = 0;
1.2 misho 107382:
107383: /* Split the WHERE clause into separate subexpressions where each
107384: ** subexpression is separated by an AND operator.
107385: */
107386: initMaskSet(pMaskSet);
1.2.2.1 ! misho 107387: whereClauseInit(sWBI.pWC, pParse, pMaskSet, wctrlFlags);
1.2 misho 107388: sqlite3ExprCodeConstants(pParse, pWhere);
1.2.2.1 ! misho 107389: whereSplit(sWBI.pWC, pWhere, TK_AND); /* IMP: R-15842-53296 */
1.2 misho 107390:
107391: /* Special case: a WHERE clause that is constant. Evaluate the
107392: ** expression and either jump over all of the code or fall thru.
107393: */
107394: if( pWhere && (nTabList==0 || sqlite3ExprIsConstantNotJoin(pWhere)) ){
107395: sqlite3ExprIfFalse(pParse, pWhere, pWInfo->iBreak, SQLITE_JUMPIFNULL);
107396: pWhere = 0;
107397: }
107398:
107399: /* Assign a bit from the bitmask to every term in the FROM clause.
107400: **
107401: ** When assigning bitmask values to FROM clause cursors, it must be
107402: ** the case that if X is the bitmask for the N-th FROM clause term then
107403: ** the bitmask for all FROM clause terms to the left of the N-th term
107404: ** is (X-1). An expression from the ON clause of a LEFT JOIN can use
107405: ** its Expr.iRightJoinTable value to find the bitmask of the right table
107406: ** of the join. Subtracting one from the right table bitmask gives a
107407: ** bitmask for all tables to the left of the join. Knowing the bitmask
107408: ** for all tables to the left of a left join is important. Ticket #3015.
107409: **
107410: ** Configure the WhereClause.vmask variable so that bits that correspond
107411: ** to virtual table cursors are set. This is used to selectively disable
107412: ** the OR-to-IN transformation in exprAnalyzeOrTerm(). It is not helpful
107413: ** with virtual tables.
107414: **
107415: ** Note that bitmasks are created for all pTabList->nSrc tables in
107416: ** pTabList, not just the first nTabList tables. nTabList is normally
107417: ** equal to pTabList->nSrc but might be shortened to 1 if the
107418: ** WHERE_ONETABLE_ONLY flag is set.
107419: */
1.2.2.1 ! misho 107420: assert( sWBI.pWC->vmask==0 && pMaskSet->n==0 );
! 107421: for(ii=0; ii<pTabList->nSrc; ii++){
! 107422: createMask(pMaskSet, pTabList->a[ii].iCursor);
1.2 misho 107423: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 107424: if( ALWAYS(pTabList->a[ii].pTab) && IsVirtual(pTabList->a[ii].pTab) ){
! 107425: sWBI.pWC->vmask |= ((Bitmask)1 << ii);
1.2 misho 107426: }
107427: #endif
107428: }
107429: #ifndef NDEBUG
107430: {
107431: Bitmask toTheLeft = 0;
1.2.2.1 ! misho 107432: for(ii=0; ii<pTabList->nSrc; ii++){
! 107433: Bitmask m = getMask(pMaskSet, pTabList->a[ii].iCursor);
1.2 misho 107434: assert( (m-1)==toTheLeft );
107435: toTheLeft |= m;
107436: }
107437: }
107438: #endif
107439:
107440: /* Analyze all of the subexpressions. Note that exprAnalyze() might
107441: ** add new virtual terms onto the end of the WHERE clause. We do not
107442: ** want to analyze these virtual terms, so start analyzing at the end
107443: ** and work forward so that the added virtual terms are never processed.
107444: */
1.2.2.1 ! misho 107445: exprAnalyzeAll(pTabList, sWBI.pWC);
1.2 misho 107446: if( db->mallocFailed ){
107447: goto whereBeginError;
107448: }
107449:
107450: /* Check if the DISTINCT qualifier, if there is one, is redundant.
107451: ** If it is, then set pDistinct to NULL and WhereInfo.eDistinct to
107452: ** WHERE_DISTINCT_UNIQUE to tell the caller to ignore the DISTINCT.
107453: */
1.2.2.1 ! misho 107454: if( pDistinct && isDistinctRedundant(pParse, pTabList, sWBI.pWC, pDistinct) ){
1.2 misho 107455: pDistinct = 0;
107456: pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
107457: }
107458:
107459: /* Chose the best index to use for each table in the FROM clause.
107460: **
107461: ** This loop fills in the following fields:
107462: **
107463: ** pWInfo->a[].pIdx The index to use for this level of the loop.
107464: ** pWInfo->a[].wsFlags WHERE_xxx flags associated with pIdx
107465: ** pWInfo->a[].nEq The number of == and IN constraints
107466: ** pWInfo->a[].iFrom Which term of the FROM clause is being coded
107467: ** pWInfo->a[].iTabCur The VDBE cursor for the database table
107468: ** pWInfo->a[].iIdxCur The VDBE cursor for the index
107469: ** pWInfo->a[].pTerm When wsFlags==WO_OR, the OR-clause term
107470: **
107471: ** This loop also figures out the nesting order of tables in the FROM
107472: ** clause.
107473: */
1.2.2.1 ! misho 107474: sWBI.notValid = ~(Bitmask)0;
! 107475: sWBI.pOrderBy = pOrderBy;
! 107476: sWBI.n = nTabList;
! 107477: sWBI.pDistinct = pDistinct;
1.2 misho 107478: andFlags = ~0;
107479: WHERETRACE(("*** Optimizer Start ***\n"));
1.2.2.1 ! misho 107480: for(sWBI.i=iFrom=0, pLevel=pWInfo->a; sWBI.i<nTabList; sWBI.i++, pLevel++){
1.2 misho 107481: WhereCost bestPlan; /* Most efficient plan seen so far */
107482: Index *pIdx; /* Index for FROM table at pTabItem */
107483: int j; /* For looping over FROM tables */
107484: int bestJ = -1; /* The value of j */
107485: Bitmask m; /* Bitmask value for j or bestJ */
107486: int isOptimal; /* Iterator for optimal/non-optimal search */
107487: int nUnconstrained; /* Number tables without INDEXED BY */
107488: Bitmask notIndexed; /* Mask of tables that cannot use an index */
107489:
107490: memset(&bestPlan, 0, sizeof(bestPlan));
107491: bestPlan.rCost = SQLITE_BIG_DBL;
1.2.2.1 ! misho 107492: WHERETRACE(("*** Begin search for loop %d ***\n", sWBI.i));
1.2 misho 107493:
107494: /* Loop through the remaining entries in the FROM clause to find the
107495: ** next nested loop. The loop tests all FROM clause entries
107496: ** either once or twice.
107497: **
107498: ** The first test is always performed if there are two or more entries
107499: ** remaining and never performed if there is only one FROM clause entry
107500: ** to choose from. The first test looks for an "optimal" scan. In
107501: ** this context an optimal scan is one that uses the same strategy
107502: ** for the given FROM clause entry as would be selected if the entry
107503: ** were used as the innermost nested loop. In other words, a table
107504: ** is chosen such that the cost of running that table cannot be reduced
107505: ** by waiting for other tables to run first. This "optimal" test works
107506: ** by first assuming that the FROM clause is on the inner loop and finding
107507: ** its query plan, then checking to see if that query plan uses any
1.2.2.1 ! misho 107508: ** other FROM clause terms that are sWBI.notValid. If no notValid terms
! 107509: ** are used then the "optimal" query plan works.
1.2 misho 107510: **
107511: ** Note that the WhereCost.nRow parameter for an optimal scan might
107512: ** not be as small as it would be if the table really were the innermost
107513: ** join. The nRow value can be reduced by WHERE clause constraints
107514: ** that do not use indices. But this nRow reduction only happens if the
107515: ** table really is the innermost join.
107516: **
107517: ** The second loop iteration is only performed if no optimal scan
107518: ** strategies were found by the first iteration. This second iteration
107519: ** is used to search for the lowest cost scan overall.
107520: **
107521: ** Previous versions of SQLite performed only the second iteration -
107522: ** the next outermost loop was always that with the lowest overall
107523: ** cost. However, this meant that SQLite could select the wrong plan
107524: ** for scripts such as the following:
107525: **
107526: ** CREATE TABLE t1(a, b);
107527: ** CREATE TABLE t2(c, d);
107528: ** SELECT * FROM t2, t1 WHERE t2.rowid = t1.a;
107529: **
107530: ** The best strategy is to iterate through table t1 first. However it
107531: ** is not possible to determine this with a simple greedy algorithm.
107532: ** Since the cost of a linear scan through table t2 is the same
107533: ** as the cost of a linear scan through table t1, a simple greedy
107534: ** algorithm may choose to use t2 for the outer loop, which is a much
107535: ** costlier approach.
107536: */
107537: nUnconstrained = 0;
107538: notIndexed = 0;
107539: for(isOptimal=(iFrom<nTabList-1); isOptimal>=0 && bestJ<0; isOptimal--){
1.2.2.1 ! misho 107540: for(j=iFrom, sWBI.pSrc=&pTabList->a[j]; j<nTabList; j++, sWBI.pSrc++){
1.2 misho 107541: int doNotReorder; /* True if this table should not be reordered */
107542:
1.2.2.1 ! misho 107543: doNotReorder = (sWBI.pSrc->jointype & (JT_LEFT|JT_CROSS))!=0;
1.2 misho 107544: if( j!=iFrom && doNotReorder ) break;
1.2.2.1 ! misho 107545: m = getMask(pMaskSet, sWBI.pSrc->iCursor);
! 107546: if( (m & sWBI.notValid)==0 ){
1.2 misho 107547: if( j==iFrom ) iFrom++;
107548: continue;
107549: }
1.2.2.1 ! misho 107550: sWBI.notReady = (isOptimal ? m : sWBI.notValid);
! 107551: if( sWBI.pSrc->pIndex==0 ) nUnconstrained++;
! 107552:
! 107553: WHERETRACE((" === trying table %d (%s) with isOptimal=%d ===\n",
! 107554: j, sWBI.pSrc->pTab->zName, isOptimal));
! 107555: assert( sWBI.pSrc->pTab );
1.2 misho 107556: #ifndef SQLITE_OMIT_VIRTUALTABLE
1.2.2.1 ! misho 107557: if( IsVirtual(sWBI.pSrc->pTab) ){
! 107558: sWBI.ppIdxInfo = &pWInfo->a[j].pIdxInfo;
! 107559: bestVirtualIndex(&sWBI);
1.2 misho 107560: }else
107561: #endif
107562: {
1.2.2.1 ! misho 107563: bestBtreeIndex(&sWBI);
1.2 misho 107564: }
1.2.2.1 ! misho 107565: assert( isOptimal || (sWBI.cost.used&sWBI.notValid)==0 );
1.2 misho 107566:
107567: /* If an INDEXED BY clause is present, then the plan must use that
107568: ** index if it uses any index at all */
1.2.2.1 ! misho 107569: assert( sWBI.pSrc->pIndex==0
! 107570: || (sWBI.cost.plan.wsFlags & WHERE_NOT_FULLSCAN)==0
! 107571: || sWBI.cost.plan.u.pIdx==sWBI.pSrc->pIndex );
1.2 misho 107572:
1.2.2.1 ! misho 107573: if( isOptimal && (sWBI.cost.plan.wsFlags & WHERE_NOT_FULLSCAN)==0 ){
1.2 misho 107574: notIndexed |= m;
107575: }
1.2.2.1 ! misho 107576: if( isOptimal ){
! 107577: pWInfo->a[j].rOptCost = sWBI.cost.rCost;
! 107578: }else if( iFrom<nTabList-1 ){
! 107579: /* If two or more tables have nearly the same outer loop cost,
! 107580: ** very different inner loop (optimal) cost, we want to choose
! 107581: ** for the outer loop that table which benefits the least from
! 107582: ** being in the inner loop. The following code scales the
! 107583: ** outer loop cost estimate to accomplish that. */
! 107584: WHERETRACE((" scaling cost from %.1f to %.1f\n",
! 107585: sWBI.cost.rCost,
! 107586: sWBI.cost.rCost/pWInfo->a[j].rOptCost));
! 107587: sWBI.cost.rCost /= pWInfo->a[j].rOptCost;
! 107588: }
1.2 misho 107589:
107590: /* Conditions under which this table becomes the best so far:
107591: **
107592: ** (1) The table must not depend on other tables that have not
1.2.2.1 ! misho 107593: ** yet run. (In other words, it must not depend on tables
! 107594: ** in inner loops.)
1.2 misho 107595: **
1.2.2.1 ! misho 107596: ** (2) (This rule was removed on 2012-11-09. The scaling of the
! 107597: ** cost using the optimal scan cost made this rule obsolete.)
1.2 misho 107598: **
107599: ** (3) All tables have an INDEXED BY clause or this table lacks an
107600: ** INDEXED BY clause or this table uses the specific
107601: ** index specified by its INDEXED BY clause. This rule ensures
107602: ** that a best-so-far is always selected even if an impossible
107603: ** combination of INDEXED BY clauses are given. The error
107604: ** will be detected and relayed back to the application later.
107605: ** The NEVER() comes about because rule (2) above prevents
107606: ** An indexable full-table-scan from reaching rule (3).
107607: **
1.2.2.1 ! misho 107608: ** (4) The plan cost must be lower than prior plans, where "cost"
! 107609: ** is defined by the compareCost() function above.
1.2 misho 107610: */
1.2.2.1 ! misho 107611: if( (sWBI.cost.used&sWBI.notValid)==0 /* (1) */
! 107612: && (nUnconstrained==0 || sWBI.pSrc->pIndex==0 /* (3) */
! 107613: || NEVER((sWBI.cost.plan.wsFlags & WHERE_NOT_FULLSCAN)!=0))
! 107614: && (bestJ<0 || compareCost(&sWBI.cost, &bestPlan)) /* (4) */
1.2 misho 107615: ){
1.2.2.1 ! misho 107616: WHERETRACE((" === table %d (%s) is best so far\n"
! 107617: " cost=%.1f, nRow=%.1f, nOBSat=%d, wsFlags=%08x\n",
! 107618: j, sWBI.pSrc->pTab->zName,
! 107619: sWBI.cost.rCost, sWBI.cost.plan.nRow,
! 107620: sWBI.cost.plan.nOBSat, sWBI.cost.plan.wsFlags));
! 107621: bestPlan = sWBI.cost;
1.2 misho 107622: bestJ = j;
107623: }
107624: if( doNotReorder ) break;
107625: }
107626: }
107627: assert( bestJ>=0 );
1.2.2.1 ! misho 107628: assert( sWBI.notValid & getMask(pMaskSet, pTabList->a[bestJ].iCursor) );
! 107629: WHERETRACE(("*** Optimizer selects table %d (%s) for loop %d with:\n"
! 107630: " cost=%.1f, nRow=%.1f, nOBSat=%d, wsFlags=0x%08x\n",
! 107631: bestJ, pTabList->a[bestJ].pTab->zName,
! 107632: pLevel-pWInfo->a, bestPlan.rCost, bestPlan.plan.nRow,
! 107633: bestPlan.plan.nOBSat, bestPlan.plan.wsFlags));
1.2 misho 107634: if( (bestPlan.plan.wsFlags & WHERE_DISTINCT)!=0 ){
107635: assert( pWInfo->eDistinct==0 );
107636: pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
107637: }
107638: andFlags &= bestPlan.plan.wsFlags;
107639: pLevel->plan = bestPlan.plan;
1.2.2.1 ! misho 107640: pLevel->iTabCur = pTabList->a[bestJ].iCursor;
1.2 misho 107641: testcase( bestPlan.plan.wsFlags & WHERE_INDEXED );
107642: testcase( bestPlan.plan.wsFlags & WHERE_TEMP_INDEX );
107643: if( bestPlan.plan.wsFlags & (WHERE_INDEXED|WHERE_TEMP_INDEX) ){
1.2.2.1 ! misho 107644: if( (wctrlFlags & WHERE_ONETABLE_ONLY)
! 107645: && (bestPlan.plan.wsFlags & WHERE_TEMP_INDEX)==0
! 107646: ){
! 107647: pLevel->iIdxCur = iIdxCur;
! 107648: }else{
! 107649: pLevel->iIdxCur = pParse->nTab++;
! 107650: }
1.2 misho 107651: }else{
107652: pLevel->iIdxCur = -1;
107653: }
1.2.2.1 ! misho 107654: sWBI.notValid &= ~getMask(pMaskSet, pTabList->a[bestJ].iCursor);
1.2 misho 107655: pLevel->iFrom = (u8)bestJ;
107656: if( bestPlan.plan.nRow>=(double)1 ){
107657: pParse->nQueryLoop *= bestPlan.plan.nRow;
107658: }
107659:
107660: /* Check that if the table scanned by this loop iteration had an
107661: ** INDEXED BY clause attached to it, that the named index is being
107662: ** used for the scan. If not, then query compilation has failed.
107663: ** Return an error.
107664: */
107665: pIdx = pTabList->a[bestJ].pIndex;
107666: if( pIdx ){
107667: if( (bestPlan.plan.wsFlags & WHERE_INDEXED)==0 ){
107668: sqlite3ErrorMsg(pParse, "cannot use index: %s", pIdx->zName);
107669: goto whereBeginError;
107670: }else{
107671: /* If an INDEXED BY clause is used, the bestIndex() function is
107672: ** guaranteed to find the index specified in the INDEXED BY clause
107673: ** if it find an index at all. */
107674: assert( bestPlan.plan.u.pIdx==pIdx );
107675: }
107676: }
107677: }
107678: WHERETRACE(("*** Optimizer Finished ***\n"));
107679: if( pParse->nErr || db->mallocFailed ){
107680: goto whereBeginError;
107681: }
1.2.2.1 ! misho 107682: if( nTabList ){
! 107683: pLevel--;
! 107684: pWInfo->nOBSat = pLevel->plan.nOBSat;
! 107685: }else{
! 107686: pWInfo->nOBSat = 0;
! 107687: }
1.2 misho 107688:
107689: /* If the total query only selects a single row, then the ORDER BY
107690: ** clause is irrelevant.
107691: */
1.2.2.1 ! misho 107692: if( (andFlags & WHERE_UNIQUE)!=0 && pOrderBy ){
! 107693: assert( nTabList==0 || (pLevel->plan.wsFlags & WHERE_ALL_UNIQUE)!=0 );
! 107694: pWInfo->nOBSat = pOrderBy->nExpr;
1.2 misho 107695: }
107696:
107697: /* If the caller is an UPDATE or DELETE statement that is requesting
107698: ** to use a one-pass algorithm, determine if this is appropriate.
107699: ** The one-pass algorithm only works if the WHERE clause constraints
107700: ** the statement to update a single row.
107701: */
107702: assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
107703: if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 && (andFlags & WHERE_UNIQUE)!=0 ){
107704: pWInfo->okOnePass = 1;
107705: pWInfo->a[0].plan.wsFlags &= ~WHERE_IDX_ONLY;
107706: }
107707:
107708: /* Open all tables in the pTabList and any indices selected for
107709: ** searching those tables.
107710: */
107711: sqlite3CodeVerifySchema(pParse, -1); /* Insert the cookie verifier Goto */
107712: notReady = ~(Bitmask)0;
107713: pWInfo->nRowOut = (double)1;
1.2.2.1 ! misho 107714: for(ii=0, pLevel=pWInfo->a; ii<nTabList; ii++, pLevel++){
1.2 misho 107715: Table *pTab; /* Table to open */
107716: int iDb; /* Index of database containing table/index */
1.2.2.1 ! misho 107717: struct SrcList_item *pTabItem;
1.2 misho 107718:
107719: pTabItem = &pTabList->a[pLevel->iFrom];
107720: pTab = pTabItem->pTab;
107721: pWInfo->nRowOut *= pLevel->plan.nRow;
107722: iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
107723: if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ){
107724: /* Do nothing */
107725: }else
107726: #ifndef SQLITE_OMIT_VIRTUALTABLE
107727: if( (pLevel->plan.wsFlags & WHERE_VIRTUALTABLE)!=0 ){
107728: const char *pVTab = (const char *)sqlite3GetVTable(db, pTab);
107729: int iCur = pTabItem->iCursor;
107730: sqlite3VdbeAddOp4(v, OP_VOpen, iCur, 0, 0, pVTab, P4_VTAB);
1.2.2.1 ! misho 107731: }else if( IsVirtual(pTab) ){
! 107732: /* noop */
1.2 misho 107733: }else
107734: #endif
107735: if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0
107736: && (wctrlFlags & WHERE_OMIT_OPEN_CLOSE)==0 ){
107737: int op = pWInfo->okOnePass ? OP_OpenWrite : OP_OpenRead;
107738: sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op);
107739: testcase( pTab->nCol==BMS-1 );
107740: testcase( pTab->nCol==BMS );
107741: if( !pWInfo->okOnePass && pTab->nCol<BMS ){
107742: Bitmask b = pTabItem->colUsed;
107743: int n = 0;
107744: for(; b; b=b>>1, n++){}
107745: sqlite3VdbeChangeP4(v, sqlite3VdbeCurrentAddr(v)-1,
107746: SQLITE_INT_TO_PTR(n), P4_INT32);
107747: assert( n<=pTab->nCol );
107748: }
107749: }else{
107750: sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
107751: }
107752: #ifndef SQLITE_OMIT_AUTOMATIC_INDEX
107753: if( (pLevel->plan.wsFlags & WHERE_TEMP_INDEX)!=0 ){
1.2.2.1 ! misho 107754: constructAutomaticIndex(pParse, sWBI.pWC, pTabItem, notReady, pLevel);
1.2 misho 107755: }else
107756: #endif
107757: if( (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 ){
107758: Index *pIx = pLevel->plan.u.pIdx;
107759: KeyInfo *pKey = sqlite3IndexKeyinfo(pParse, pIx);
1.2.2.1 ! misho 107760: int iIndexCur = pLevel->iIdxCur;
1.2 misho 107761: assert( pIx->pSchema==pTab->pSchema );
1.2.2.1 ! misho 107762: assert( iIndexCur>=0 );
! 107763: sqlite3VdbeAddOp4(v, OP_OpenRead, iIndexCur, pIx->tnum, iDb,
1.2 misho 107764: (char*)pKey, P4_KEYINFO_HANDOFF);
107765: VdbeComment((v, "%s", pIx->zName));
107766: }
107767: sqlite3CodeVerifySchema(pParse, iDb);
1.2.2.1 ! misho 107768: notReady &= ~getMask(sWBI.pWC->pMaskSet, pTabItem->iCursor);
1.2 misho 107769: }
107770: pWInfo->iTop = sqlite3VdbeCurrentAddr(v);
107771: if( db->mallocFailed ) goto whereBeginError;
107772:
107773: /* Generate the code to do the search. Each iteration of the for
107774: ** loop below generates code for a single nested loop of the VM
107775: ** program.
107776: */
107777: notReady = ~(Bitmask)0;
1.2.2.1 ! misho 107778: for(ii=0; ii<nTabList; ii++){
! 107779: pLevel = &pWInfo->a[ii];
! 107780: explainOneScan(pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags);
! 107781: notReady = codeOneLoopStart(pWInfo, ii, wctrlFlags, notReady);
1.2 misho 107782: pWInfo->iContinue = pLevel->addrCont;
107783: }
107784:
107785: #ifdef SQLITE_TEST /* For testing and debugging use only */
107786: /* Record in the query plan information about the current table
107787: ** and the index used to access it (if any). If the table itself
107788: ** is not used, its name is just '{}'. If no index is used
107789: ** the index is listed as "{}". If the primary key is used the
107790: ** index name is '*'.
107791: */
1.2.2.1 ! misho 107792: for(ii=0; ii<nTabList; ii++){
1.2 misho 107793: char *z;
107794: int n;
1.2.2.1 ! misho 107795: int w;
! 107796: struct SrcList_item *pTabItem;
! 107797:
! 107798: pLevel = &pWInfo->a[ii];
! 107799: w = pLevel->plan.wsFlags;
1.2 misho 107800: pTabItem = &pTabList->a[pLevel->iFrom];
107801: z = pTabItem->zAlias;
107802: if( z==0 ) z = pTabItem->pTab->zName;
107803: n = sqlite3Strlen30(z);
107804: if( n+nQPlan < sizeof(sqlite3_query_plan)-10 ){
1.2.2.1 ! misho 107805: if( (w & WHERE_IDX_ONLY)!=0 && (w & WHERE_COVER_SCAN)==0 ){
1.2 misho 107806: memcpy(&sqlite3_query_plan[nQPlan], "{}", 2);
107807: nQPlan += 2;
107808: }else{
107809: memcpy(&sqlite3_query_plan[nQPlan], z, n);
107810: nQPlan += n;
107811: }
107812: sqlite3_query_plan[nQPlan++] = ' ';
107813: }
1.2.2.1 ! misho 107814: testcase( w & WHERE_ROWID_EQ );
! 107815: testcase( w & WHERE_ROWID_RANGE );
! 107816: if( w & (WHERE_ROWID_EQ|WHERE_ROWID_RANGE) ){
1.2 misho 107817: memcpy(&sqlite3_query_plan[nQPlan], "* ", 2);
107818: nQPlan += 2;
1.2.2.1 ! misho 107819: }else if( (w & WHERE_INDEXED)!=0 && (w & WHERE_COVER_SCAN)==0 ){
1.2 misho 107820: n = sqlite3Strlen30(pLevel->plan.u.pIdx->zName);
107821: if( n+nQPlan < sizeof(sqlite3_query_plan)-2 ){
107822: memcpy(&sqlite3_query_plan[nQPlan], pLevel->plan.u.pIdx->zName, n);
107823: nQPlan += n;
107824: sqlite3_query_plan[nQPlan++] = ' ';
107825: }
107826: }else{
107827: memcpy(&sqlite3_query_plan[nQPlan], "{} ", 3);
107828: nQPlan += 3;
107829: }
107830: }
107831: while( nQPlan>0 && sqlite3_query_plan[nQPlan-1]==' ' ){
107832: sqlite3_query_plan[--nQPlan] = 0;
107833: }
107834: sqlite3_query_plan[nQPlan] = 0;
107835: nQPlan = 0;
107836: #endif /* SQLITE_TEST // Testing and debugging use only */
107837:
107838: /* Record the continuation address in the WhereInfo structure. Then
107839: ** clean up and return.
107840: */
107841: return pWInfo;
107842:
107843: /* Jump here if malloc fails */
107844: whereBeginError:
107845: if( pWInfo ){
107846: pParse->nQueryLoop = pWInfo->savedNQueryLoop;
107847: whereInfoFree(db, pWInfo);
107848: }
107849: return 0;
107850: }
107851:
107852: /*
107853: ** Generate the end of the WHERE loop. See comments on
107854: ** sqlite3WhereBegin() for additional information.
107855: */
107856: SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
107857: Parse *pParse = pWInfo->pParse;
107858: Vdbe *v = pParse->pVdbe;
107859: int i;
107860: WhereLevel *pLevel;
107861: SrcList *pTabList = pWInfo->pTabList;
107862: sqlite3 *db = pParse->db;
107863:
107864: /* Generate loop termination code.
107865: */
107866: sqlite3ExprCacheClear(pParse);
107867: for(i=pWInfo->nLevel-1; i>=0; i--){
107868: pLevel = &pWInfo->a[i];
107869: sqlite3VdbeResolveLabel(v, pLevel->addrCont);
107870: if( pLevel->op!=OP_Noop ){
107871: sqlite3VdbeAddOp2(v, pLevel->op, pLevel->p1, pLevel->p2);
107872: sqlite3VdbeChangeP5(v, pLevel->p5);
107873: }
107874: if( pLevel->plan.wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){
107875: struct InLoop *pIn;
107876: int j;
107877: sqlite3VdbeResolveLabel(v, pLevel->addrNxt);
107878: for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){
107879: sqlite3VdbeJumpHere(v, pIn->addrInTop+1);
107880: sqlite3VdbeAddOp2(v, OP_Next, pIn->iCur, pIn->addrInTop);
107881: sqlite3VdbeJumpHere(v, pIn->addrInTop-1);
107882: }
107883: sqlite3DbFree(db, pLevel->u.in.aInLoop);
107884: }
107885: sqlite3VdbeResolveLabel(v, pLevel->addrBrk);
107886: if( pLevel->iLeftJoin ){
107887: int addr;
107888: addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin);
107889: assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0
107890: || (pLevel->plan.wsFlags & WHERE_INDEXED)!=0 );
107891: if( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0 ){
107892: sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor);
107893: }
107894: if( pLevel->iIdxCur>=0 ){
107895: sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur);
107896: }
107897: if( pLevel->op==OP_Return ){
107898: sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst);
107899: }else{
107900: sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrFirst);
107901: }
107902: sqlite3VdbeJumpHere(v, addr);
107903: }
107904: }
107905:
107906: /* The "break" point is here, just past the end of the outer loop.
107907: ** Set it.
107908: */
107909: sqlite3VdbeResolveLabel(v, pWInfo->iBreak);
107910:
107911: /* Close all of the cursors that were opened by sqlite3WhereBegin.
107912: */
107913: assert( pWInfo->nLevel==1 || pWInfo->nLevel==pTabList->nSrc );
107914: for(i=0, pLevel=pWInfo->a; i<pWInfo->nLevel; i++, pLevel++){
1.2.2.1 ! misho 107915: Index *pIdx = 0;
1.2 misho 107916: struct SrcList_item *pTabItem = &pTabList->a[pLevel->iFrom];
107917: Table *pTab = pTabItem->pTab;
107918: assert( pTab!=0 );
107919: if( (pTab->tabFlags & TF_Ephemeral)==0
107920: && pTab->pSelect==0
107921: && (pWInfo->wctrlFlags & WHERE_OMIT_OPEN_CLOSE)==0
107922: ){
107923: int ws = pLevel->plan.wsFlags;
107924: if( !pWInfo->okOnePass && (ws & WHERE_IDX_ONLY)==0 ){
107925: sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor);
107926: }
107927: if( (ws & WHERE_INDEXED)!=0 && (ws & WHERE_TEMP_INDEX)==0 ){
107928: sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur);
107929: }
107930: }
107931:
107932: /* If this scan uses an index, make code substitutions to read data
107933: ** from the index in preference to the table. Sometimes, this means
107934: ** the table need never be read from. This is a performance boost,
107935: ** as the vdbe level waits until the table is read before actually
107936: ** seeking the table cursor to the record corresponding to the current
107937: ** position in the index.
107938: **
107939: ** Calls to the code generator in between sqlite3WhereBegin and
107940: ** sqlite3WhereEnd will have created code that references the table
107941: ** directly. This loop scans all that code looking for opcodes
107942: ** that reference the table and converts them into opcodes that
107943: ** reference the index.
107944: */
1.2.2.1 ! misho 107945: if( pLevel->plan.wsFlags & WHERE_INDEXED ){
! 107946: pIdx = pLevel->plan.u.pIdx;
! 107947: }else if( pLevel->plan.wsFlags & WHERE_MULTI_OR ){
! 107948: pIdx = pLevel->u.pCovidx;
! 107949: }
! 107950: if( pIdx && !db->mallocFailed){
1.2 misho 107951: int k, j, last;
107952: VdbeOp *pOp;
107953:
107954: pOp = sqlite3VdbeGetOp(v, pWInfo->iTop);
107955: last = sqlite3VdbeCurrentAddr(v);
107956: for(k=pWInfo->iTop; k<last; k++, pOp++){
107957: if( pOp->p1!=pLevel->iTabCur ) continue;
107958: if( pOp->opcode==OP_Column ){
107959: for(j=0; j<pIdx->nColumn; j++){
107960: if( pOp->p2==pIdx->aiColumn[j] ){
107961: pOp->p2 = j;
107962: pOp->p1 = pLevel->iIdxCur;
107963: break;
107964: }
107965: }
107966: assert( (pLevel->plan.wsFlags & WHERE_IDX_ONLY)==0
107967: || j<pIdx->nColumn );
107968: }else if( pOp->opcode==OP_Rowid ){
107969: pOp->p1 = pLevel->iIdxCur;
107970: pOp->opcode = OP_IdxRowid;
107971: }
107972: }
107973: }
107974: }
107975:
107976: /* Final cleanup
107977: */
107978: pParse->nQueryLoop = pWInfo->savedNQueryLoop;
107979: whereInfoFree(db, pWInfo);
107980: return;
107981: }
107982:
107983: /************** End of where.c ***********************************************/
107984: /************** Begin file parse.c *******************************************/
107985: /* Driver template for the LEMON parser generator.
107986: ** The author disclaims copyright to this source code.
107987: **
107988: ** This version of "lempar.c" is modified, slightly, for use by SQLite.
107989: ** The only modifications are the addition of a couple of NEVER()
107990: ** macros to disable tests that are needed in the case of a general
107991: ** LALR(1) grammar but which are always false in the
107992: ** specific grammar used by SQLite.
107993: */
107994: /* First off, code is included that follows the "include" declaration
107995: ** in the input grammar file. */
107996: /* #include <stdio.h> */
107997:
107998:
107999: /*
108000: ** Disable all error recovery processing in the parser push-down
108001: ** automaton.
108002: */
108003: #define YYNOERRORRECOVERY 1
108004:
108005: /*
108006: ** Make yytestcase() the same as testcase()
108007: */
108008: #define yytestcase(X) testcase(X)
108009:
108010: /*
108011: ** An instance of this structure holds information about the
108012: ** LIMIT clause of a SELECT statement.
108013: */
108014: struct LimitVal {
108015: Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
108016: Expr *pOffset; /* The OFFSET expression. NULL if there is none */
108017: };
108018:
108019: /*
108020: ** An instance of this structure is used to store the LIKE,
108021: ** GLOB, NOT LIKE, and NOT GLOB operators.
108022: */
108023: struct LikeOp {
108024: Token eOperator; /* "like" or "glob" or "regexp" */
1.2.2.1 ! misho 108025: int bNot; /* True if the NOT keyword is present */
1.2 misho 108026: };
108027:
108028: /*
108029: ** An instance of the following structure describes the event of a
108030: ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
108031: ** TK_DELETE, or TK_INSTEAD. If the event is of the form
108032: **
108033: ** UPDATE ON (a,b,c)
108034: **
108035: ** Then the "b" IdList records the list "a,b,c".
108036: */
108037: struct TrigEvent { int a; IdList * b; };
108038:
108039: /*
108040: ** An instance of this structure holds the ATTACH key and the key type.
108041: */
108042: struct AttachKey { int type; Token key; };
108043:
1.2.2.1 ! misho 108044: /*
! 108045: ** One or more VALUES claues
! 108046: */
! 108047: struct ValueList {
! 108048: ExprList *pList;
! 108049: Select *pSelect;
! 108050: };
! 108051:
1.2 misho 108052:
108053: /* This is a utility routine used to set the ExprSpan.zStart and
108054: ** ExprSpan.zEnd values of pOut so that the span covers the complete
108055: ** range of text beginning with pStart and going to the end of pEnd.
108056: */
108057: static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
108058: pOut->zStart = pStart->z;
108059: pOut->zEnd = &pEnd->z[pEnd->n];
108060: }
108061:
108062: /* Construct a new Expr object from a single identifier. Use the
108063: ** new Expr to populate pOut. Set the span of pOut to be the identifier
108064: ** that created the expression.
108065: */
108066: static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
108067: pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
108068: pOut->zStart = pValue->z;
108069: pOut->zEnd = &pValue->z[pValue->n];
108070: }
108071:
108072: /* This routine constructs a binary expression node out of two ExprSpan
108073: ** objects and uses the result to populate a new ExprSpan object.
108074: */
108075: static void spanBinaryExpr(
108076: ExprSpan *pOut, /* Write the result here */
108077: Parse *pParse, /* The parsing context. Errors accumulate here */
108078: int op, /* The binary operation */
108079: ExprSpan *pLeft, /* The left operand */
108080: ExprSpan *pRight /* The right operand */
108081: ){
108082: pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
108083: pOut->zStart = pLeft->zStart;
108084: pOut->zEnd = pRight->zEnd;
108085: }
108086:
108087: /* Construct an expression node for a unary postfix operator
108088: */
108089: static void spanUnaryPostfix(
108090: ExprSpan *pOut, /* Write the new expression node here */
108091: Parse *pParse, /* Parsing context to record errors */
108092: int op, /* The operator */
108093: ExprSpan *pOperand, /* The operand */
108094: Token *pPostOp /* The operand token for setting the span */
108095: ){
108096: pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
108097: pOut->zStart = pOperand->zStart;
108098: pOut->zEnd = &pPostOp->z[pPostOp->n];
108099: }
108100:
108101: /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
108102: ** unary TK_ISNULL or TK_NOTNULL expression. */
108103: static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
108104: sqlite3 *db = pParse->db;
108105: if( db->mallocFailed==0 && pY->op==TK_NULL ){
108106: pA->op = (u8)op;
108107: sqlite3ExprDelete(db, pA->pRight);
108108: pA->pRight = 0;
108109: }
108110: }
108111:
108112: /* Construct an expression node for a unary prefix operator
108113: */
108114: static void spanUnaryPrefix(
108115: ExprSpan *pOut, /* Write the new expression node here */
108116: Parse *pParse, /* Parsing context to record errors */
108117: int op, /* The operator */
108118: ExprSpan *pOperand, /* The operand */
108119: Token *pPreOp /* The operand token for setting the span */
108120: ){
108121: pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
108122: pOut->zStart = pPreOp->z;
108123: pOut->zEnd = pOperand->zEnd;
108124: }
108125: /* Next is all token values, in a form suitable for use by makeheaders.
108126: ** This section will be null unless lemon is run with the -m switch.
108127: */
108128: /*
108129: ** These constants (all generated automatically by the parser generator)
108130: ** specify the various kinds of tokens (terminals) that the parser
108131: ** understands.
108132: **
108133: ** Each symbol here is a terminal symbol in the grammar.
108134: */
108135: /* Make sure the INTERFACE macro is defined.
108136: */
108137: #ifndef INTERFACE
108138: # define INTERFACE 1
108139: #endif
108140: /* The next thing included is series of defines which control
108141: ** various aspects of the generated parser.
108142: ** YYCODETYPE is the data type used for storing terminal
108143: ** and nonterminal numbers. "unsigned char" is
108144: ** used if there are fewer than 250 terminals
108145: ** and nonterminals. "int" is used otherwise.
108146: ** YYNOCODE is a number of type YYCODETYPE which corresponds
108147: ** to no legal terminal or nonterminal number. This
108148: ** number is used to fill in empty slots of the hash
108149: ** table.
108150: ** YYFALLBACK If defined, this indicates that one or more tokens
108151: ** have fall-back values which should be used if the
108152: ** original value of the token will not parse.
108153: ** YYACTIONTYPE is the data type used for storing terminal
108154: ** and nonterminal numbers. "unsigned char" is
108155: ** used if there are fewer than 250 rules and
108156: ** states combined. "int" is used otherwise.
108157: ** sqlite3ParserTOKENTYPE is the data type used for minor tokens given
108158: ** directly to the parser from the tokenizer.
108159: ** YYMINORTYPE is the data type used for all minor tokens.
108160: ** This is typically a union of many types, one of
108161: ** which is sqlite3ParserTOKENTYPE. The entry in the union
108162: ** for base tokens is called "yy0".
108163: ** YYSTACKDEPTH is the maximum depth of the parser's stack. If
108164: ** zero the stack is dynamically sized using realloc()
108165: ** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument
108166: ** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument
108167: ** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser
108168: ** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser
108169: ** YYNSTATE the combined number of states.
108170: ** YYNRULE the number of rules in the grammar
108171: ** YYERRORSYMBOL is the code number of the error symbol. If not
108172: ** defined, then do no error processing.
108173: */
108174: #define YYCODETYPE unsigned char
1.2.2.1 ! misho 108175: #define YYNOCODE 251
1.2 misho 108176: #define YYACTIONTYPE unsigned short int
108177: #define YYWILDCARD 67
108178: #define sqlite3ParserTOKENTYPE Token
108179: typedef union {
108180: int yyinit;
108181: sqlite3ParserTOKENTYPE yy0;
1.2.2.1 ! misho 108182: struct LimitVal yy64;
! 108183: Expr* yy122;
! 108184: Select* yy159;
! 108185: IdList* yy180;
! 108186: struct {int value; int mask;} yy207;
! 108187: u8 yy258;
! 108188: struct LikeOp yy318;
! 108189: TriggerStep* yy327;
! 108190: ExprSpan yy342;
! 108191: SrcList* yy347;
! 108192: int yy392;
! 108193: struct TrigEvent yy410;
! 108194: ExprList* yy442;
! 108195: struct ValueList yy487;
1.2 misho 108196: } YYMINORTYPE;
108197: #ifndef YYSTACKDEPTH
108198: #define YYSTACKDEPTH 100
108199: #endif
108200: #define sqlite3ParserARG_SDECL Parse *pParse;
108201: #define sqlite3ParserARG_PDECL ,Parse *pParse
108202: #define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse
108203: #define sqlite3ParserARG_STORE yypParser->pParse = pParse
1.2.2.1 ! misho 108204: #define YYNSTATE 627
! 108205: #define YYNRULE 327
1.2 misho 108206: #define YYFALLBACK 1
108207: #define YY_NO_ACTION (YYNSTATE+YYNRULE+2)
108208: #define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1)
108209: #define YY_ERROR_ACTION (YYNSTATE+YYNRULE)
108210:
108211: /* The yyzerominor constant is used to initialize instances of
108212: ** YYMINORTYPE objects to zero. */
108213: static const YYMINORTYPE yyzerominor = { 0 };
108214:
108215: /* Define the yytestcase() macro to be a no-op if is not already defined
108216: ** otherwise.
108217: **
108218: ** Applications can choose to define yytestcase() in the %include section
108219: ** to a macro that can assist in verifying code coverage. For production
108220: ** code the yytestcase() macro should be turned off. But it is useful
108221: ** for testing.
108222: */
108223: #ifndef yytestcase
108224: # define yytestcase(X)
108225: #endif
108226:
108227:
108228: /* Next are the tables used to determine what action to take based on the
108229: ** current state and lookahead token. These tables are used to implement
108230: ** functions that take a state number and lookahead value and return an
108231: ** action integer.
108232: **
108233: ** Suppose the action integer is N. Then the action is determined as
108234: ** follows
108235: **
108236: ** 0 <= N < YYNSTATE Shift N. That is, push the lookahead
108237: ** token onto the stack and goto state N.
108238: **
108239: ** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE.
108240: **
108241: ** N == YYNSTATE+YYNRULE A syntax error has occurred.
108242: **
108243: ** N == YYNSTATE+YYNRULE+1 The parser accepts its input.
108244: **
108245: ** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused
108246: ** slots in the yy_action[] table.
108247: **
108248: ** The action table is constructed as a single large table named yy_action[].
108249: ** Given state S and lookahead X, the action is computed as
108250: **
108251: ** yy_action[ yy_shift_ofst[S] + X ]
108252: **
108253: ** If the index value yy_shift_ofst[S]+X is out of range or if the value
108254: ** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S]
108255: ** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table
108256: ** and that yy_default[S] should be used instead.
108257: **
108258: ** The formula above is for computing the action when the lookahead is
108259: ** a terminal symbol. If the lookahead is a non-terminal (as occurs after
108260: ** a reduce action) then the yy_reduce_ofst[] array is used in place of
108261: ** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of
108262: ** YY_SHIFT_USE_DFLT.
108263: **
108264: ** The following are the tables generated in this section:
108265: **
108266: ** yy_action[] A single table containing all actions.
108267: ** yy_lookahead[] A table containing the lookahead for each entry in
108268: ** yy_action. Used to detect hash collisions.
108269: ** yy_shift_ofst[] For each state, the offset into yy_action for
108270: ** shifting terminals.
108271: ** yy_reduce_ofst[] For each state, the offset into yy_action for
108272: ** shifting non-terminals after a reduce.
108273: ** yy_default[] Default action for each state.
108274: */
1.2.2.1 ! misho 108275: #define YY_ACTTAB_COUNT (1564)
1.2 misho 108276: static const YYACTIONTYPE yy_action[] = {
1.2.2.1 ! misho 108277: /* 0 */ 309, 955, 184, 417, 2, 171, 624, 594, 56, 56,
! 108278: /* 10 */ 56, 56, 49, 54, 54, 54, 54, 53, 53, 52,
! 108279: /* 20 */ 52, 52, 51, 233, 620, 619, 298, 620, 619, 234,
! 108280: /* 30 */ 587, 581, 56, 56, 56, 56, 19, 54, 54, 54,
! 108281: /* 40 */ 54, 53, 53, 52, 52, 52, 51, 233, 605, 57,
! 108282: /* 50 */ 58, 48, 579, 578, 580, 580, 55, 55, 56, 56,
! 108283: /* 60 */ 56, 56, 541, 54, 54, 54, 54, 53, 53, 52,
! 108284: /* 70 */ 52, 52, 51, 233, 309, 594, 325, 196, 195, 194,
! 108285: /* 80 */ 33, 54, 54, 54, 54, 53, 53, 52, 52, 52,
! 108286: /* 90 */ 51, 233, 617, 616, 165, 617, 616, 380, 377, 376,
! 108287: /* 100 */ 407, 532, 576, 576, 587, 581, 303, 422, 375, 59,
! 108288: /* 110 */ 53, 53, 52, 52, 52, 51, 233, 50, 47, 146,
! 108289: /* 120 */ 574, 545, 65, 57, 58, 48, 579, 578, 580, 580,
! 108290: /* 130 */ 55, 55, 56, 56, 56, 56, 213, 54, 54, 54,
! 108291: /* 140 */ 54, 53, 53, 52, 52, 52, 51, 233, 309, 223,
! 108292: /* 150 */ 539, 420, 170, 176, 138, 280, 383, 275, 382, 168,
! 108293: /* 160 */ 489, 551, 409, 668, 620, 619, 271, 438, 409, 438,
! 108294: /* 170 */ 550, 604, 67, 482, 507, 618, 599, 412, 587, 581,
! 108295: /* 180 */ 600, 483, 618, 412, 618, 598, 91, 439, 440, 439,
! 108296: /* 190 */ 335, 598, 73, 669, 222, 266, 480, 57, 58, 48,
! 108297: /* 200 */ 579, 578, 580, 580, 55, 55, 56, 56, 56, 56,
! 108298: /* 210 */ 670, 54, 54, 54, 54, 53, 53, 52, 52, 52,
! 108299: /* 220 */ 51, 233, 309, 279, 232, 231, 1, 132, 200, 385,
! 108300: /* 230 */ 620, 619, 617, 616, 278, 435, 289, 563, 175, 262,
! 108301: /* 240 */ 409, 264, 437, 497, 436, 166, 441, 568, 336, 568,
! 108302: /* 250 */ 201, 537, 587, 581, 599, 412, 165, 594, 600, 380,
! 108303: /* 260 */ 377, 376, 597, 598, 92, 523, 618, 569, 569, 592,
! 108304: /* 270 */ 375, 57, 58, 48, 579, 578, 580, 580, 55, 55,
! 108305: /* 280 */ 56, 56, 56, 56, 597, 54, 54, 54, 54, 53,
! 108306: /* 290 */ 53, 52, 52, 52, 51, 233, 309, 463, 617, 616,
! 108307: /* 300 */ 590, 590, 590, 174, 272, 396, 409, 272, 409, 548,
! 108308: /* 310 */ 397, 620, 619, 68, 326, 620, 619, 620, 619, 618,
! 108309: /* 320 */ 546, 412, 618, 412, 471, 594, 587, 581, 472, 598,
! 108310: /* 330 */ 92, 598, 92, 52, 52, 52, 51, 233, 513, 512,
! 108311: /* 340 */ 206, 322, 363, 464, 221, 57, 58, 48, 579, 578,
! 108312: /* 350 */ 580, 580, 55, 55, 56, 56, 56, 56, 529, 54,
! 108313: /* 360 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 233,
! 108314: /* 370 */ 309, 396, 409, 396, 597, 372, 386, 530, 347, 617,
! 108315: /* 380 */ 616, 575, 202, 617, 616, 617, 616, 412, 620, 619,
! 108316: /* 390 */ 145, 255, 346, 254, 577, 598, 74, 351, 45, 489,
! 108317: /* 400 */ 587, 581, 235, 189, 464, 544, 167, 296, 187, 469,
! 108318: /* 410 */ 479, 67, 62, 39, 618, 546, 597, 345, 573, 57,
! 108319: /* 420 */ 58, 48, 579, 578, 580, 580, 55, 55, 56, 56,
! 108320: /* 430 */ 56, 56, 6, 54, 54, 54, 54, 53, 53, 52,
! 108321: /* 440 */ 52, 52, 51, 233, 309, 562, 558, 407, 528, 576,
! 108322: /* 450 */ 576, 344, 255, 346, 254, 182, 617, 616, 503, 504,
! 108323: /* 460 */ 314, 409, 557, 235, 166, 271, 409, 352, 564, 181,
! 108324: /* 470 */ 407, 546, 576, 576, 587, 581, 412, 537, 556, 561,
! 108325: /* 480 */ 517, 412, 618, 249, 598, 16, 7, 36, 467, 598,
! 108326: /* 490 */ 92, 516, 618, 57, 58, 48, 579, 578, 580, 580,
! 108327: /* 500 */ 55, 55, 56, 56, 56, 56, 541, 54, 54, 54,
! 108328: /* 510 */ 54, 53, 53, 52, 52, 52, 51, 233, 309, 327,
! 108329: /* 520 */ 572, 571, 525, 558, 560, 394, 871, 246, 409, 248,
! 108330: /* 530 */ 171, 392, 594, 219, 407, 409, 576, 576, 502, 557,
! 108331: /* 540 */ 364, 145, 510, 412, 407, 229, 576, 576, 587, 581,
! 108332: /* 550 */ 412, 598, 92, 381, 269, 556, 166, 400, 598, 69,
! 108333: /* 560 */ 501, 419, 945, 199, 945, 198, 546, 57, 58, 48,
! 108334: /* 570 */ 579, 578, 580, 580, 55, 55, 56, 56, 56, 56,
! 108335: /* 580 */ 568, 54, 54, 54, 54, 53, 53, 52, 52, 52,
! 108336: /* 590 */ 51, 233, 309, 317, 419, 944, 508, 944, 308, 597,
! 108337: /* 600 */ 594, 565, 490, 212, 173, 247, 423, 615, 614, 613,
! 108338: /* 610 */ 323, 197, 143, 405, 572, 571, 489, 66, 50, 47,
! 108339: /* 620 */ 146, 594, 587, 581, 232, 231, 559, 427, 67, 555,
! 108340: /* 630 */ 15, 618, 186, 543, 303, 421, 35, 206, 432, 423,
! 108341: /* 640 */ 552, 57, 58, 48, 579, 578, 580, 580, 55, 55,
! 108342: /* 650 */ 56, 56, 56, 56, 205, 54, 54, 54, 54, 53,
! 108343: /* 660 */ 53, 52, 52, 52, 51, 233, 309, 569, 569, 260,
! 108344: /* 670 */ 268, 597, 12, 373, 568, 166, 409, 313, 409, 420,
! 108345: /* 680 */ 409, 473, 473, 365, 618, 50, 47, 146, 597, 594,
! 108346: /* 690 */ 468, 412, 166, 412, 351, 412, 587, 581, 32, 598,
! 108347: /* 700 */ 94, 598, 97, 598, 95, 627, 625, 329, 142, 50,
! 108348: /* 710 */ 47, 146, 333, 349, 358, 57, 58, 48, 579, 578,
! 108349: /* 720 */ 580, 580, 55, 55, 56, 56, 56, 56, 409, 54,
! 108350: /* 730 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 233,
! 108351: /* 740 */ 309, 409, 388, 412, 409, 22, 565, 404, 212, 362,
! 108352: /* 750 */ 389, 598, 104, 359, 409, 156, 412, 409, 603, 412,
! 108353: /* 760 */ 537, 331, 569, 569, 598, 103, 493, 598, 105, 412,
! 108354: /* 770 */ 587, 581, 412, 260, 549, 618, 11, 598, 106, 521,
! 108355: /* 780 */ 598, 133, 169, 457, 456, 170, 35, 601, 618, 57,
! 108356: /* 790 */ 58, 48, 579, 578, 580, 580, 55, 55, 56, 56,
! 108357: /* 800 */ 56, 56, 409, 54, 54, 54, 54, 53, 53, 52,
! 108358: /* 810 */ 52, 52, 51, 233, 309, 409, 259, 412, 409, 50,
! 108359: /* 820 */ 47, 146, 357, 318, 355, 598, 134, 527, 352, 337,
! 108360: /* 830 */ 412, 409, 356, 412, 357, 409, 357, 618, 598, 98,
! 108361: /* 840 */ 129, 598, 102, 618, 587, 581, 412, 21, 235, 618,
! 108362: /* 850 */ 412, 618, 211, 143, 598, 101, 30, 167, 598, 93,
! 108363: /* 860 */ 350, 535, 203, 57, 58, 48, 579, 578, 580, 580,
! 108364: /* 870 */ 55, 55, 56, 56, 56, 56, 409, 54, 54, 54,
! 108365: /* 880 */ 54, 53, 53, 52, 52, 52, 51, 233, 309, 409,
! 108366: /* 890 */ 526, 412, 409, 425, 215, 305, 597, 551, 141, 598,
! 108367: /* 900 */ 100, 40, 409, 38, 412, 409, 550, 412, 409, 228,
! 108368: /* 910 */ 220, 314, 598, 77, 500, 598, 96, 412, 587, 581,
! 108369: /* 920 */ 412, 338, 253, 412, 218, 598, 137, 379, 598, 136,
! 108370: /* 930 */ 28, 598, 135, 270, 715, 210, 481, 57, 58, 48,
! 108371: /* 940 */ 579, 578, 580, 580, 55, 55, 56, 56, 56, 56,
! 108372: /* 950 */ 409, 54, 54, 54, 54, 53, 53, 52, 52, 52,
! 108373: /* 960 */ 51, 233, 309, 409, 272, 412, 409, 315, 147, 597,
! 108374: /* 970 */ 272, 626, 2, 598, 76, 209, 409, 127, 412, 618,
! 108375: /* 980 */ 126, 412, 409, 621, 235, 618, 598, 90, 374, 598,
! 108376: /* 990 */ 89, 412, 587, 581, 27, 260, 350, 412, 618, 598,
! 108377: /* 1000 */ 75, 321, 541, 541, 125, 598, 88, 320, 278, 597,
! 108378: /* 1010 */ 618, 57, 46, 48, 579, 578, 580, 580, 55, 55,
! 108379: /* 1020 */ 56, 56, 56, 56, 409, 54, 54, 54, 54, 53,
! 108380: /* 1030 */ 53, 52, 52, 52, 51, 233, 309, 409, 450, 412,
! 108381: /* 1040 */ 164, 284, 282, 272, 609, 424, 304, 598, 87, 370,
! 108382: /* 1050 */ 409, 477, 412, 409, 608, 409, 607, 602, 618, 618,
! 108383: /* 1060 */ 598, 99, 586, 585, 122, 412, 587, 581, 412, 618,
! 108384: /* 1070 */ 412, 618, 618, 598, 86, 366, 598, 17, 598, 85,
! 108385: /* 1080 */ 319, 185, 519, 518, 583, 582, 58, 48, 579, 578,
! 108386: /* 1090 */ 580, 580, 55, 55, 56, 56, 56, 56, 409, 54,
! 108387: /* 1100 */ 54, 54, 54, 53, 53, 52, 52, 52, 51, 233,
! 108388: /* 1110 */ 309, 584, 409, 412, 409, 260, 260, 260, 408, 591,
! 108389: /* 1120 */ 474, 598, 84, 170, 409, 466, 518, 412, 121, 412,
! 108390: /* 1130 */ 618, 618, 618, 618, 618, 598, 83, 598, 72, 412,
! 108391: /* 1140 */ 587, 581, 51, 233, 625, 329, 470, 598, 71, 257,
! 108392: /* 1150 */ 159, 120, 14, 462, 157, 158, 117, 260, 448, 447,
! 108393: /* 1160 */ 446, 48, 579, 578, 580, 580, 55, 55, 56, 56,
! 108394: /* 1170 */ 56, 56, 618, 54, 54, 54, 54, 53, 53, 52,
! 108395: /* 1180 */ 52, 52, 51, 233, 44, 403, 260, 3, 409, 459,
! 108396: /* 1190 */ 260, 413, 619, 118, 398, 10, 25, 24, 554, 348,
! 108397: /* 1200 */ 217, 618, 406, 412, 409, 618, 4, 44, 403, 618,
! 108398: /* 1210 */ 3, 598, 82, 618, 413, 619, 455, 542, 115, 412,
! 108399: /* 1220 */ 538, 401, 536, 274, 506, 406, 251, 598, 81, 216,
! 108400: /* 1230 */ 273, 563, 618, 243, 453, 618, 154, 618, 618, 618,
! 108401: /* 1240 */ 449, 416, 623, 110, 401, 618, 409, 236, 64, 123,
! 108402: /* 1250 */ 487, 41, 42, 531, 563, 204, 409, 267, 43, 411,
! 108403: /* 1260 */ 410, 412, 265, 592, 108, 618, 107, 434, 332, 598,
! 108404: /* 1270 */ 80, 412, 618, 263, 41, 42, 443, 618, 409, 598,
! 108405: /* 1280 */ 70, 43, 411, 410, 433, 261, 592, 149, 618, 597,
! 108406: /* 1290 */ 256, 237, 188, 412, 590, 590, 590, 589, 588, 13,
! 108407: /* 1300 */ 618, 598, 18, 328, 235, 618, 44, 403, 360, 3,
! 108408: /* 1310 */ 418, 461, 339, 413, 619, 227, 124, 590, 590, 590,
! 108409: /* 1320 */ 589, 588, 13, 618, 406, 409, 618, 409, 139, 34,
! 108410: /* 1330 */ 403, 387, 3, 148, 622, 312, 413, 619, 311, 330,
! 108411: /* 1340 */ 412, 460, 412, 401, 180, 353, 412, 406, 598, 79,
! 108412: /* 1350 */ 598, 78, 250, 563, 598, 9, 618, 612, 611, 610,
! 108413: /* 1360 */ 618, 8, 452, 442, 242, 415, 401, 618, 239, 235,
! 108414: /* 1370 */ 179, 238, 428, 41, 42, 288, 563, 618, 618, 618,
! 108415: /* 1380 */ 43, 411, 410, 618, 144, 592, 618, 618, 177, 61,
! 108416: /* 1390 */ 618, 596, 391, 620, 619, 287, 41, 42, 414, 618,
! 108417: /* 1400 */ 293, 30, 393, 43, 411, 410, 292, 618, 592, 31,
! 108418: /* 1410 */ 618, 395, 291, 60, 230, 37, 590, 590, 590, 589,
! 108419: /* 1420 */ 588, 13, 214, 553, 183, 290, 172, 301, 300, 299,
! 108420: /* 1430 */ 178, 297, 595, 563, 451, 29, 285, 390, 540, 590,
! 108421: /* 1440 */ 590, 590, 589, 588, 13, 283, 520, 534, 150, 533,
! 108422: /* 1450 */ 241, 281, 384, 192, 191, 324, 515, 514, 276, 240,
! 108423: /* 1460 */ 510, 523, 307, 511, 128, 592, 509, 225, 226, 486,
! 108424: /* 1470 */ 485, 224, 152, 491, 464, 306, 484, 163, 153, 371,
! 108425: /* 1480 */ 478, 151, 162, 258, 369, 161, 367, 208, 475, 476,
! 108426: /* 1490 */ 26, 160, 465, 140, 361, 131, 590, 590, 590, 116,
! 108427: /* 1500 */ 119, 454, 343, 155, 114, 342, 113, 112, 445, 111,
! 108428: /* 1510 */ 130, 109, 431, 316, 426, 430, 23, 429, 20, 606,
! 108429: /* 1520 */ 190, 507, 255, 341, 244, 63, 294, 593, 310, 570,
! 108430: /* 1530 */ 277, 402, 354, 235, 567, 496, 495, 492, 494, 302,
! 108431: /* 1540 */ 458, 378, 286, 245, 566, 5, 252, 547, 193, 444,
! 108432: /* 1550 */ 233, 340, 207, 524, 368, 505, 334, 522, 499, 399,
! 108433: /* 1560 */ 295, 498, 956, 488,
1.2 misho 108434: };
108435: static const YYCODETYPE yy_lookahead[] = {
108436: /* 0 */ 19, 142, 143, 144, 145, 24, 1, 26, 77, 78,
108437: /* 10 */ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
1.2.2.1 ! misho 108438: /* 20 */ 89, 90, 91, 92, 26, 27, 15, 26, 27, 197,
! 108439: /* 30 */ 49, 50, 77, 78, 79, 80, 204, 82, 83, 84,
! 108440: /* 40 */ 85, 86, 87, 88, 89, 90, 91, 92, 23, 68,
1.2 misho 108441: /* 50 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
1.2.2.1 ! misho 108442: /* 60 */ 79, 80, 166, 82, 83, 84, 85, 86, 87, 88,
! 108443: /* 70 */ 89, 90, 91, 92, 19, 94, 19, 105, 106, 107,
1.2 misho 108444: /* 80 */ 25, 82, 83, 84, 85, 86, 87, 88, 89, 90,
1.2.2.1 ! misho 108445: /* 90 */ 91, 92, 94, 95, 96, 94, 95, 99, 100, 101,
! 108446: /* 100 */ 112, 205, 114, 115, 49, 50, 22, 23, 110, 54,
! 108447: /* 110 */ 86, 87, 88, 89, 90, 91, 92, 221, 222, 223,
! 108448: /* 120 */ 23, 120, 25, 68, 69, 70, 71, 72, 73, 74,
! 108449: /* 130 */ 75, 76, 77, 78, 79, 80, 22, 82, 83, 84,
! 108450: /* 140 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 92,
! 108451: /* 150 */ 23, 67, 25, 96, 97, 98, 99, 100, 101, 102,
! 108452: /* 160 */ 150, 32, 150, 118, 26, 27, 109, 150, 150, 150,
! 108453: /* 170 */ 41, 161, 162, 180, 181, 165, 113, 165, 49, 50,
! 108454: /* 180 */ 117, 188, 165, 165, 165, 173, 174, 170, 171, 170,
! 108455: /* 190 */ 171, 173, 174, 118, 184, 16, 186, 68, 69, 70,
1.2 misho 108456: /* 200 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
1.2.2.1 ! misho 108457: /* 210 */ 118, 82, 83, 84, 85, 86, 87, 88, 89, 90,
! 108458: /* 220 */ 91, 92, 19, 98, 86, 87, 22, 24, 160, 88,
! 108459: /* 230 */ 26, 27, 94, 95, 109, 97, 224, 66, 118, 60,
! 108460: /* 240 */ 150, 62, 104, 23, 106, 25, 229, 230, 229, 230,
! 108461: /* 250 */ 160, 150, 49, 50, 113, 165, 96, 26, 117, 99,
! 108462: /* 260 */ 100, 101, 194, 173, 174, 94, 165, 129, 130, 98,
! 108463: /* 270 */ 110, 68, 69, 70, 71, 72, 73, 74, 75, 76,
! 108464: /* 280 */ 77, 78, 79, 80, 194, 82, 83, 84, 85, 86,
! 108465: /* 290 */ 87, 88, 89, 90, 91, 92, 19, 11, 94, 95,
! 108466: /* 300 */ 129, 130, 131, 118, 150, 215, 150, 150, 150, 25,
! 108467: /* 310 */ 220, 26, 27, 22, 213, 26, 27, 26, 27, 165,
! 108468: /* 320 */ 25, 165, 165, 165, 30, 94, 49, 50, 34, 173,
! 108469: /* 330 */ 174, 173, 174, 88, 89, 90, 91, 92, 7, 8,
! 108470: /* 340 */ 160, 187, 48, 57, 187, 68, 69, 70, 71, 72,
! 108471: /* 350 */ 73, 74, 75, 76, 77, 78, 79, 80, 23, 82,
1.2 misho 108472: /* 360 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
1.2.2.1 ! misho 108473: /* 370 */ 19, 215, 150, 215, 194, 19, 220, 88, 220, 94,
! 108474: /* 380 */ 95, 23, 160, 94, 95, 94, 95, 165, 26, 27,
! 108475: /* 390 */ 95, 105, 106, 107, 113, 173, 174, 217, 22, 150,
! 108476: /* 400 */ 49, 50, 116, 119, 57, 120, 50, 158, 22, 21,
! 108477: /* 410 */ 161, 162, 232, 136, 165, 120, 194, 237, 23, 68,
1.2 misho 108478: /* 420 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
1.2.2.1 ! misho 108479: /* 430 */ 79, 80, 22, 82, 83, 84, 85, 86, 87, 88,
! 108480: /* 440 */ 89, 90, 91, 92, 19, 23, 12, 112, 23, 114,
! 108481: /* 450 */ 115, 63, 105, 106, 107, 23, 94, 95, 97, 98,
! 108482: /* 460 */ 104, 150, 28, 116, 25, 109, 150, 150, 23, 23,
! 108483: /* 470 */ 112, 25, 114, 115, 49, 50, 165, 150, 44, 11,
! 108484: /* 480 */ 46, 165, 165, 16, 173, 174, 76, 136, 100, 173,
! 108485: /* 490 */ 174, 57, 165, 68, 69, 70, 71, 72, 73, 74,
! 108486: /* 500 */ 75, 76, 77, 78, 79, 80, 166, 82, 83, 84,
! 108487: /* 510 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 169,
! 108488: /* 520 */ 170, 171, 23, 12, 23, 214, 138, 60, 150, 62,
! 108489: /* 530 */ 24, 215, 26, 216, 112, 150, 114, 115, 36, 28,
! 108490: /* 540 */ 213, 95, 103, 165, 112, 205, 114, 115, 49, 50,
! 108491: /* 550 */ 165, 173, 174, 51, 23, 44, 25, 46, 173, 174,
! 108492: /* 560 */ 58, 22, 23, 22, 25, 160, 120, 68, 69, 70,
1.2 misho 108493: /* 570 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
1.2.2.1 ! misho 108494: /* 580 */ 230, 82, 83, 84, 85, 86, 87, 88, 89, 90,
! 108495: /* 590 */ 91, 92, 19, 215, 22, 23, 23, 25, 163, 194,
! 108496: /* 600 */ 94, 166, 167, 168, 25, 138, 67, 7, 8, 9,
! 108497: /* 610 */ 108, 206, 207, 169, 170, 171, 150, 22, 221, 222,
! 108498: /* 620 */ 223, 26, 49, 50, 86, 87, 23, 161, 162, 23,
! 108499: /* 630 */ 22, 165, 24, 120, 22, 23, 25, 160, 241, 67,
! 108500: /* 640 */ 176, 68, 69, 70, 71, 72, 73, 74, 75, 76,
! 108501: /* 650 */ 77, 78, 79, 80, 160, 82, 83, 84, 85, 86,
! 108502: /* 660 */ 87, 88, 89, 90, 91, 92, 19, 129, 130, 150,
! 108503: /* 670 */ 23, 194, 35, 23, 230, 25, 150, 155, 150, 67,
! 108504: /* 680 */ 150, 105, 106, 107, 165, 221, 222, 223, 194, 94,
! 108505: /* 690 */ 23, 165, 25, 165, 217, 165, 49, 50, 25, 173,
! 108506: /* 700 */ 174, 173, 174, 173, 174, 0, 1, 2, 118, 221,
! 108507: /* 710 */ 222, 223, 193, 219, 237, 68, 69, 70, 71, 72,
1.2 misho 108508: /* 720 */ 73, 74, 75, 76, 77, 78, 79, 80, 150, 82,
108509: /* 730 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
1.2.2.1 ! misho 108510: /* 740 */ 19, 150, 19, 165, 150, 24, 166, 167, 168, 227,
! 108511: /* 750 */ 27, 173, 174, 231, 150, 25, 165, 150, 172, 165,
! 108512: /* 760 */ 150, 242, 129, 130, 173, 174, 180, 173, 174, 165,
! 108513: /* 770 */ 49, 50, 165, 150, 176, 165, 35, 173, 174, 165,
! 108514: /* 780 */ 173, 174, 35, 23, 23, 25, 25, 173, 165, 68,
1.2 misho 108515: /* 790 */ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
108516: /* 800 */ 79, 80, 150, 82, 83, 84, 85, 86, 87, 88,
1.2.2.1 ! misho 108517: /* 810 */ 89, 90, 91, 92, 19, 150, 193, 165, 150, 221,
! 108518: /* 820 */ 222, 223, 150, 213, 19, 173, 174, 23, 150, 97,
! 108519: /* 830 */ 165, 150, 27, 165, 150, 150, 150, 165, 173, 174,
! 108520: /* 840 */ 22, 173, 174, 165, 49, 50, 165, 52, 116, 165,
! 108521: /* 850 */ 165, 165, 206, 207, 173, 174, 126, 50, 173, 174,
! 108522: /* 860 */ 128, 27, 160, 68, 69, 70, 71, 72, 73, 74,
1.2 misho 108523: /* 870 */ 75, 76, 77, 78, 79, 80, 150, 82, 83, 84,
108524: /* 880 */ 85, 86, 87, 88, 89, 90, 91, 92, 19, 150,
1.2.2.1 ! misho 108525: /* 890 */ 23, 165, 150, 23, 216, 25, 194, 32, 39, 173,
! 108526: /* 900 */ 174, 135, 150, 137, 165, 150, 41, 165, 150, 52,
! 108527: /* 910 */ 238, 104, 173, 174, 29, 173, 174, 165, 49, 50,
! 108528: /* 920 */ 165, 219, 238, 165, 238, 173, 174, 52, 173, 174,
! 108529: /* 930 */ 22, 173, 174, 23, 23, 160, 25, 68, 69, 70,
1.2 misho 108530: /* 940 */ 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
108531: /* 950 */ 150, 82, 83, 84, 85, 86, 87, 88, 89, 90,
1.2.2.1 ! misho 108532: /* 960 */ 91, 92, 19, 150, 150, 165, 150, 245, 246, 194,
! 108533: /* 970 */ 150, 144, 145, 173, 174, 160, 150, 22, 165, 165,
! 108534: /* 980 */ 22, 165, 150, 150, 116, 165, 173, 174, 52, 173,
! 108535: /* 990 */ 174, 165, 49, 50, 22, 150, 128, 165, 165, 173,
! 108536: /* 1000 */ 174, 187, 166, 166, 22, 173, 174, 187, 109, 194,
! 108537: /* 1010 */ 165, 68, 69, 70, 71, 72, 73, 74, 75, 76,
1.2 misho 108538: /* 1020 */ 77, 78, 79, 80, 150, 82, 83, 84, 85, 86,
1.2.2.1 ! misho 108539: /* 1030 */ 87, 88, 89, 90, 91, 92, 19, 150, 193, 165,
! 108540: /* 1040 */ 102, 205, 205, 150, 150, 247, 248, 173, 174, 19,
! 108541: /* 1050 */ 150, 20, 165, 150, 150, 150, 150, 150, 165, 165,
! 108542: /* 1060 */ 173, 174, 49, 50, 104, 165, 49, 50, 165, 165,
! 108543: /* 1070 */ 165, 165, 165, 173, 174, 43, 173, 174, 173, 174,
! 108544: /* 1080 */ 187, 24, 190, 191, 71, 72, 69, 70, 71, 72,
! 108545: /* 1090 */ 73, 74, 75, 76, 77, 78, 79, 80, 150, 82,
1.2 misho 108546: /* 1100 */ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
1.2.2.1 ! misho 108547: /* 1110 */ 19, 98, 150, 165, 150, 150, 150, 150, 150, 150,
! 108548: /* 1120 */ 59, 173, 174, 25, 150, 190, 191, 165, 53, 165,
! 108549: /* 1130 */ 165, 165, 165, 165, 165, 173, 174, 173, 174, 165,
! 108550: /* 1140 */ 49, 50, 91, 92, 1, 2, 53, 173, 174, 138,
! 108551: /* 1150 */ 104, 22, 5, 1, 35, 118, 127, 150, 193, 193,
! 108552: /* 1160 */ 193, 70, 71, 72, 73, 74, 75, 76, 77, 78,
! 108553: /* 1170 */ 79, 80, 165, 82, 83, 84, 85, 86, 87, 88,
! 108554: /* 1180 */ 89, 90, 91, 92, 19, 20, 150, 22, 150, 27,
! 108555: /* 1190 */ 150, 26, 27, 108, 150, 22, 76, 76, 150, 25,
! 108556: /* 1200 */ 193, 165, 37, 165, 150, 165, 22, 19, 20, 165,
! 108557: /* 1210 */ 22, 173, 174, 165, 26, 27, 23, 150, 119, 165,
! 108558: /* 1220 */ 150, 56, 150, 150, 150, 37, 16, 173, 174, 193,
! 108559: /* 1230 */ 150, 66, 165, 193, 1, 165, 121, 165, 165, 165,
! 108560: /* 1240 */ 20, 146, 147, 119, 56, 165, 150, 152, 16, 154,
! 108561: /* 1250 */ 150, 86, 87, 88, 66, 160, 150, 150, 93, 94,
! 108562: /* 1260 */ 95, 165, 150, 98, 108, 165, 127, 23, 65, 173,
! 108563: /* 1270 */ 174, 165, 165, 150, 86, 87, 128, 165, 150, 173,
! 108564: /* 1280 */ 174, 93, 94, 95, 23, 150, 98, 15, 165, 194,
! 108565: /* 1290 */ 150, 140, 22, 165, 129, 130, 131, 132, 133, 134,
! 108566: /* 1300 */ 165, 173, 174, 3, 116, 165, 19, 20, 150, 22,
! 108567: /* 1310 */ 4, 150, 217, 26, 27, 179, 179, 129, 130, 131,
! 108568: /* 1320 */ 132, 133, 134, 165, 37, 150, 165, 150, 164, 19,
! 108569: /* 1330 */ 20, 150, 22, 246, 149, 249, 26, 27, 249, 244,
! 108570: /* 1340 */ 165, 150, 165, 56, 6, 150, 165, 37, 173, 174,
! 108571: /* 1350 */ 173, 174, 150, 66, 173, 174, 165, 149, 149, 13,
! 108572: /* 1360 */ 165, 25, 150, 150, 150, 149, 56, 165, 150, 116,
! 108573: /* 1370 */ 151, 150, 150, 86, 87, 150, 66, 165, 165, 165,
! 108574: /* 1380 */ 93, 94, 95, 165, 150, 98, 165, 165, 151, 22,
! 108575: /* 1390 */ 165, 194, 150, 26, 27, 150, 86, 87, 159, 165,
! 108576: /* 1400 */ 199, 126, 123, 93, 94, 95, 200, 165, 98, 124,
! 108577: /* 1410 */ 165, 122, 201, 125, 225, 135, 129, 130, 131, 132,
! 108578: /* 1420 */ 133, 134, 5, 157, 157, 202, 118, 10, 11, 12,
! 108579: /* 1430 */ 13, 14, 203, 66, 17, 104, 210, 121, 211, 129,
! 108580: /* 1440 */ 130, 131, 132, 133, 134, 210, 175, 211, 31, 211,
! 108581: /* 1450 */ 33, 210, 104, 86, 87, 47, 175, 183, 175, 42,
! 108582: /* 1460 */ 103, 94, 178, 177, 22, 98, 175, 92, 228, 175,
! 108583: /* 1470 */ 175, 228, 55, 183, 57, 178, 175, 156, 61, 18,
! 108584: /* 1480 */ 157, 64, 156, 235, 157, 156, 45, 157, 236, 157,
! 108585: /* 1490 */ 135, 156, 189, 68, 157, 218, 129, 130, 131, 22,
! 108586: /* 1500 */ 189, 199, 157, 156, 192, 18, 192, 192, 199, 192,
! 108587: /* 1510 */ 218, 189, 40, 157, 38, 157, 240, 157, 240, 153,
! 108588: /* 1520 */ 196, 181, 105, 106, 107, 243, 198, 166, 111, 230,
! 108589: /* 1530 */ 176, 226, 239, 116, 230, 176, 166, 166, 176, 148,
! 108590: /* 1540 */ 199, 177, 209, 209, 166, 196, 239, 208, 185, 199,
! 108591: /* 1550 */ 92, 209, 233, 173, 234, 182, 139, 173, 182, 191,
! 108592: /* 1560 */ 195, 182, 250, 186,
! 108593: };
! 108594: #define YY_SHIFT_USE_DFLT (-70)
! 108595: #define YY_SHIFT_COUNT (416)
! 108596: #define YY_SHIFT_MIN (-69)
! 108597: #define YY_SHIFT_MAX (1487)
1.2 misho 108598: static const short yy_shift_ofst[] = {
1.2.2.1 ! misho 108599: /* 0 */ 1143, 1188, 1417, 1188, 1287, 1287, 138, 138, -2, -19,
! 108600: /* 10 */ 1287, 1287, 1287, 1287, 347, 362, 129, 129, 795, 1165,
! 108601: /* 20 */ 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287,
! 108602: /* 30 */ 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287,
! 108603: /* 40 */ 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1310, 1287,
! 108604: /* 50 */ 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287,
! 108605: /* 60 */ 1287, 1287, 286, 362, 362, 538, 538, 231, 1253, 55,
! 108606: /* 70 */ 721, 647, 573, 499, 425, 351, 277, 203, 869, 869,
! 108607: /* 80 */ 869, 869, 869, 869, 869, 869, 869, 869, 869, 869,
! 108608: /* 90 */ 869, 869, 869, 943, 869, 1017, 1091, 1091, -69, -45,
! 108609: /* 100 */ -45, -45, -45, -45, -1, 24, 245, 362, 362, 362,
! 108610: /* 110 */ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
! 108611: /* 120 */ 362, 362, 362, 388, 356, 362, 362, 362, 362, 362,
! 108612: /* 130 */ 732, 868, 231, 1051, 1458, -70, -70, -70, 1367, 57,
! 108613: /* 140 */ 434, 434, 289, 291, 285, 1, 204, 572, 539, 362,
! 108614: /* 150 */ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
! 108615: /* 160 */ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
! 108616: /* 170 */ 362, 362, 362, 362, 362, 362, 362, 362, 362, 362,
! 108617: /* 180 */ 362, 506, 506, 506, 705, 1253, 1253, 1253, -70, -70,
! 108618: /* 190 */ -70, 171, 171, 160, 502, 502, 502, 446, 432, 511,
! 108619: /* 200 */ 422, 358, 335, -12, -12, -12, -12, 576, 294, -12,
! 108620: /* 210 */ -12, 295, 595, 141, 600, 730, 723, 723, 805, 730,
! 108621: /* 220 */ 805, 439, 911, 231, 865, 231, 865, 807, 865, 723,
! 108622: /* 230 */ 766, 633, 633, 231, 284, 63, 608, 1476, 1308, 1308,
! 108623: /* 240 */ 1472, 1472, 1308, 1477, 1425, 1275, 1487, 1487, 1487, 1487,
! 108624: /* 250 */ 1308, 1461, 1275, 1477, 1425, 1425, 1308, 1461, 1355, 1441,
! 108625: /* 260 */ 1308, 1308, 1461, 1308, 1461, 1308, 1461, 1442, 1348, 1348,
! 108626: /* 270 */ 1348, 1408, 1375, 1375, 1442, 1348, 1357, 1348, 1408, 1348,
! 108627: /* 280 */ 1348, 1316, 1331, 1316, 1331, 1316, 1331, 1308, 1308, 1280,
! 108628: /* 290 */ 1288, 1289, 1285, 1279, 1275, 1253, 1336, 1346, 1346, 1338,
! 108629: /* 300 */ 1338, 1338, 1338, -70, -70, -70, -70, -70, -70, 1013,
! 108630: /* 310 */ 467, 612, 84, 179, -28, 870, 410, 761, 760, 667,
! 108631: /* 320 */ 650, 531, 220, 361, 331, 125, 127, 97, 1306, 1300,
! 108632: /* 330 */ 1270, 1151, 1272, 1203, 1232, 1261, 1244, 1148, 1174, 1139,
! 108633: /* 340 */ 1156, 1124, 1220, 1115, 1210, 1233, 1099, 1193, 1184, 1174,
! 108634: /* 350 */ 1173, 1029, 1121, 1120, 1085, 1162, 1119, 1037, 1152, 1147,
! 108635: /* 360 */ 1129, 1046, 1011, 1093, 1098, 1075, 1061, 1032, 960, 1057,
! 108636: /* 370 */ 1031, 1030, 899, 938, 982, 936, 972, 958, 910, 955,
! 108637: /* 380 */ 875, 885, 908, 857, 859, 867, 804, 590, 834, 747,
! 108638: /* 390 */ 818, 513, 611, 741, 673, 637, 611, 606, 603, 579,
! 108639: /* 400 */ 501, 541, 468, 386, 445, 395, 376, 281, 185, 120,
! 108640: /* 410 */ 92, 75, 45, 114, 25, 11, 5,
! 108641: };
! 108642: #define YY_REDUCE_USE_DFLT (-169)
! 108643: #define YY_REDUCE_COUNT (308)
! 108644: #define YY_REDUCE_MIN (-168)
! 108645: #define YY_REDUCE_MAX (1391)
1.2 misho 108646: static const short yy_reduce_ofst[] = {
1.2.2.1 ! misho 108647: /* 0 */ -141, 90, 1095, 222, 158, 156, 19, 17, 10, -104,
! 108648: /* 10 */ 378, 316, 311, 12, 180, 249, 598, 464, 397, 1181,
! 108649: /* 20 */ 1177, 1175, 1128, 1106, 1096, 1054, 1038, 974, 964, 962,
! 108650: /* 30 */ 948, 905, 903, 900, 887, 874, 832, 826, 816, 813,
! 108651: /* 40 */ 800, 758, 755, 752, 742, 739, 726, 685, 681, 668,
! 108652: /* 50 */ 665, 652, 607, 604, 594, 591, 578, 530, 528, 526,
! 108653: /* 60 */ 385, 18, 477, 466, 519, 444, 350, 435, 405, 488,
! 108654: /* 70 */ 488, 488, 488, 488, 488, 488, 488, 488, 488, 488,
! 108655: /* 80 */ 488, 488, 488, 488, 488, 488, 488, 488, 488, 488,
! 108656: /* 90 */ 488, 488, 488, 488, 488, 488, 488, 488, 488, 488,
! 108657: /* 100 */ 488, 488, 488, 488, 488, 488, 488, 1040, 678, 1036,
! 108658: /* 110 */ 1007, 967, 966, 965, 845, 686, 610, 684, 317, 672,
! 108659: /* 120 */ 893, 327, 623, 522, -7, 820, 814, 157, 154, 101,
! 108660: /* 130 */ 702, 494, 580, 488, 488, 488, 488, 488, 614, 586,
! 108661: /* 140 */ 935, 892, 968, 1245, 1242, 1234, 1225, 798, 798, 1222,
! 108662: /* 150 */ 1221, 1218, 1214, 1213, 1212, 1202, 1195, 1191, 1161, 1158,
! 108663: /* 160 */ 1140, 1135, 1123, 1112, 1107, 1100, 1080, 1074, 1073, 1072,
! 108664: /* 170 */ 1070, 1067, 1048, 1044, 969, 968, 907, 906, 904, 894,
! 108665: /* 180 */ 833, 837, 836, 340, 827, 815, 775, 68, 722, 646,
! 108666: /* 190 */ -168, 1384, 1380, 1377, 1379, 1376, 1373, 1339, 1365, 1368,
! 108667: /* 200 */ 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1320, 1319, 1365,
! 108668: /* 210 */ 1365, 1339, 1378, 1349, 1391, 1350, 1342, 1334, 1307, 1341,
! 108669: /* 220 */ 1293, 1364, 1363, 1371, 1362, 1370, 1359, 1340, 1354, 1333,
! 108670: /* 230 */ 1305, 1304, 1299, 1361, 1328, 1324, 1366, 1282, 1360, 1358,
! 108671: /* 240 */ 1278, 1276, 1356, 1292, 1322, 1309, 1317, 1315, 1314, 1312,
! 108672: /* 250 */ 1345, 1347, 1302, 1277, 1311, 1303, 1337, 1335, 1252, 1248,
! 108673: /* 260 */ 1332, 1330, 1329, 1327, 1326, 1323, 1321, 1297, 1301, 1295,
! 108674: /* 270 */ 1294, 1290, 1243, 1240, 1284, 1291, 1286, 1283, 1274, 1281,
! 108675: /* 280 */ 1271, 1238, 1241, 1236, 1235, 1227, 1226, 1267, 1266, 1189,
! 108676: /* 290 */ 1229, 1223, 1211, 1206, 1201, 1197, 1239, 1237, 1219, 1216,
! 108677: /* 300 */ 1209, 1208, 1185, 1089, 1086, 1087, 1137, 1136, 1164,
1.2 misho 108678: };
108679: static const YYACTIONTYPE yy_default[] = {
1.2.2.1 ! misho 108680: /* 0 */ 632, 866, 954, 954, 866, 866, 954, 954, 954, 756,
! 108681: /* 10 */ 954, 954, 954, 864, 954, 954, 784, 784, 928, 954,
! 108682: /* 20 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108683: /* 30 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108684: /* 40 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108685: /* 50 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108686: /* 60 */ 954, 954, 954, 954, 954, 954, 954, 671, 760, 790,
! 108687: /* 70 */ 954, 954, 954, 954, 954, 954, 954, 954, 927, 929,
! 108688: /* 80 */ 798, 797, 907, 771, 795, 788, 792, 867, 860, 861,
! 108689: /* 90 */ 859, 863, 868, 954, 791, 827, 844, 826, 838, 843,
! 108690: /* 100 */ 850, 842, 839, 829, 828, 830, 831, 954, 954, 954,
! 108691: /* 110 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108692: /* 120 */ 954, 954, 954, 658, 725, 954, 954, 954, 954, 954,
! 108693: /* 130 */ 954, 954, 954, 832, 833, 847, 846, 845, 954, 663,
! 108694: /* 140 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108695: /* 150 */ 934, 932, 954, 879, 954, 954, 954, 954, 954, 954,
! 108696: /* 160 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108697: /* 170 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108698: /* 180 */ 638, 756, 756, 756, 632, 954, 954, 954, 946, 760,
! 108699: /* 190 */ 750, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108700: /* 200 */ 954, 954, 954, 800, 739, 917, 919, 954, 900, 737,
! 108701: /* 210 */ 660, 758, 673, 748, 640, 794, 773, 773, 912, 794,
! 108702: /* 220 */ 912, 696, 719, 954, 784, 954, 784, 693, 784, 773,
! 108703: /* 230 */ 862, 954, 954, 954, 757, 748, 954, 939, 764, 764,
! 108704: /* 240 */ 931, 931, 764, 806, 729, 794, 736, 736, 736, 736,
! 108705: /* 250 */ 764, 655, 794, 806, 729, 729, 764, 655, 906, 904,
! 108706: /* 260 */ 764, 764, 655, 764, 655, 764, 655, 872, 727, 727,
! 108707: /* 270 */ 727, 711, 876, 876, 872, 727, 696, 727, 711, 727,
! 108708: /* 280 */ 727, 777, 772, 777, 772, 777, 772, 764, 764, 954,
! 108709: /* 290 */ 789, 778, 787, 785, 794, 954, 714, 648, 648, 637,
! 108710: /* 300 */ 637, 637, 637, 951, 951, 946, 698, 698, 681, 954,
! 108711: /* 310 */ 954, 954, 954, 954, 954, 954, 881, 954, 954, 954,
! 108712: /* 320 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 633,
! 108713: /* 330 */ 941, 954, 954, 938, 954, 954, 954, 954, 799, 954,
! 108714: /* 340 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 916,
! 108715: /* 350 */ 954, 954, 954, 954, 954, 954, 954, 910, 954, 954,
! 108716: /* 360 */ 954, 954, 954, 954, 903, 902, 954, 954, 954, 954,
! 108717: /* 370 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108718: /* 380 */ 954, 954, 954, 954, 954, 954, 954, 954, 954, 954,
! 108719: /* 390 */ 954, 954, 786, 954, 779, 954, 865, 954, 954, 954,
! 108720: /* 400 */ 954, 954, 954, 954, 954, 954, 954, 742, 815, 954,
! 108721: /* 410 */ 814, 818, 813, 665, 954, 646, 954, 629, 634, 950,
! 108722: /* 420 */ 953, 952, 949, 948, 947, 942, 940, 937, 936, 935,
! 108723: /* 430 */ 933, 930, 926, 885, 883, 890, 889, 888, 887, 886,
! 108724: /* 440 */ 884, 882, 880, 801, 796, 793, 925, 878, 738, 735,
! 108725: /* 450 */ 734, 654, 943, 909, 918, 805, 804, 807, 915, 914,
! 108726: /* 460 */ 913, 911, 908, 895, 803, 802, 730, 870, 869, 657,
! 108727: /* 470 */ 899, 898, 897, 901, 905, 896, 766, 656, 653, 662,
! 108728: /* 480 */ 717, 718, 726, 724, 723, 722, 721, 720, 716, 664,
! 108729: /* 490 */ 672, 710, 695, 694, 875, 877, 874, 873, 703, 702,
! 108730: /* 500 */ 708, 707, 706, 705, 704, 701, 700, 699, 692, 691,
! 108731: /* 510 */ 697, 690, 713, 712, 709, 689, 733, 732, 731, 728,
! 108732: /* 520 */ 688, 687, 686, 818, 685, 684, 824, 823, 811, 854,
! 108733: /* 530 */ 753, 752, 751, 763, 762, 775, 774, 809, 808, 776,
! 108734: /* 540 */ 761, 755, 754, 770, 769, 768, 767, 759, 749, 781,
! 108735: /* 550 */ 783, 782, 780, 856, 765, 853, 924, 923, 922, 921,
! 108736: /* 560 */ 920, 858, 857, 825, 822, 676, 677, 893, 892, 894,
! 108737: /* 570 */ 891, 679, 678, 675, 674, 855, 744, 743, 851, 848,
! 108738: /* 580 */ 840, 836, 852, 849, 841, 837, 835, 834, 820, 819,
! 108739: /* 590 */ 817, 816, 812, 821, 667, 745, 741, 740, 810, 747,
! 108740: /* 600 */ 746, 683, 682, 680, 661, 659, 652, 650, 649, 651,
! 108741: /* 610 */ 647, 645, 644, 643, 642, 641, 670, 669, 668, 666,
! 108742: /* 620 */ 665, 639, 636, 635, 631, 630, 628,
1.2 misho 108743: };
108744:
108745: /* The next table maps tokens into fallback tokens. If a construct
108746: ** like the following:
108747: **
108748: ** %fallback ID X Y Z.
108749: **
108750: ** appears in the grammar, then ID becomes a fallback token for X, Y,
108751: ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser
108752: ** but it does not parse, the type of the token is changed to ID and
108753: ** the parse is retried before an error is thrown.
108754: */
108755: #ifdef YYFALLBACK
108756: static const YYCODETYPE yyFallback[] = {
108757: 0, /* $ => nothing */
108758: 0, /* SEMI => nothing */
108759: 26, /* EXPLAIN => ID */
108760: 26, /* QUERY => ID */
108761: 26, /* PLAN => ID */
108762: 26, /* BEGIN => ID */
108763: 0, /* TRANSACTION => nothing */
108764: 26, /* DEFERRED => ID */
108765: 26, /* IMMEDIATE => ID */
108766: 26, /* EXCLUSIVE => ID */
108767: 0, /* COMMIT => nothing */
108768: 26, /* END => ID */
108769: 26, /* ROLLBACK => ID */
108770: 26, /* SAVEPOINT => ID */
108771: 26, /* RELEASE => ID */
108772: 0, /* TO => nothing */
108773: 0, /* TABLE => nothing */
108774: 0, /* CREATE => nothing */
108775: 26, /* IF => ID */
108776: 0, /* NOT => nothing */
108777: 0, /* EXISTS => nothing */
108778: 26, /* TEMP => ID */
108779: 0, /* LP => nothing */
108780: 0, /* RP => nothing */
108781: 0, /* AS => nothing */
108782: 0, /* COMMA => nothing */
108783: 0, /* ID => nothing */
108784: 0, /* INDEXED => nothing */
108785: 26, /* ABORT => ID */
108786: 26, /* ACTION => ID */
108787: 26, /* AFTER => ID */
108788: 26, /* ANALYZE => ID */
108789: 26, /* ASC => ID */
108790: 26, /* ATTACH => ID */
108791: 26, /* BEFORE => ID */
108792: 26, /* BY => ID */
108793: 26, /* CASCADE => ID */
108794: 26, /* CAST => ID */
108795: 26, /* COLUMNKW => ID */
108796: 26, /* CONFLICT => ID */
108797: 26, /* DATABASE => ID */
108798: 26, /* DESC => ID */
108799: 26, /* DETACH => ID */
108800: 26, /* EACH => ID */
108801: 26, /* FAIL => ID */
108802: 26, /* FOR => ID */
108803: 26, /* IGNORE => ID */
108804: 26, /* INITIALLY => ID */
108805: 26, /* INSTEAD => ID */
108806: 26, /* LIKE_KW => ID */
108807: 26, /* MATCH => ID */
108808: 26, /* NO => ID */
108809: 26, /* KEY => ID */
108810: 26, /* OF => ID */
108811: 26, /* OFFSET => ID */
108812: 26, /* PRAGMA => ID */
108813: 26, /* RAISE => ID */
108814: 26, /* REPLACE => ID */
108815: 26, /* RESTRICT => ID */
108816: 26, /* ROW => ID */
108817: 26, /* TRIGGER => ID */
108818: 26, /* VACUUM => ID */
108819: 26, /* VIEW => ID */
108820: 26, /* VIRTUAL => ID */
108821: 26, /* REINDEX => ID */
108822: 26, /* RENAME => ID */
108823: 26, /* CTIME_KW => ID */
108824: };
108825: #endif /* YYFALLBACK */
108826:
108827: /* The following structure represents a single element of the
108828: ** parser's stack. Information stored includes:
108829: **
108830: ** + The state number for the parser at this level of the stack.
108831: **
108832: ** + The value of the token stored at this level of the stack.
108833: ** (In other words, the "major" token.)
108834: **
108835: ** + The semantic value stored at this level of the stack. This is
108836: ** the information used by the action routines in the grammar.
108837: ** It is sometimes called the "minor" token.
108838: */
108839: struct yyStackEntry {
108840: YYACTIONTYPE stateno; /* The state-number */
108841: YYCODETYPE major; /* The major token value. This is the code
108842: ** number for the token at this stack level */
108843: YYMINORTYPE minor; /* The user-supplied minor token value. This
108844: ** is the value of the token */
108845: };
108846: typedef struct yyStackEntry yyStackEntry;
108847:
108848: /* The state of the parser is completely contained in an instance of
108849: ** the following structure */
108850: struct yyParser {
108851: int yyidx; /* Index of top element in stack */
108852: #ifdef YYTRACKMAXSTACKDEPTH
108853: int yyidxMax; /* Maximum value of yyidx */
108854: #endif
108855: int yyerrcnt; /* Shifts left before out of the error */
108856: sqlite3ParserARG_SDECL /* A place to hold %extra_argument */
108857: #if YYSTACKDEPTH<=0
108858: int yystksz; /* Current side of the stack */
108859: yyStackEntry *yystack; /* The parser's stack */
108860: #else
108861: yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */
108862: #endif
108863: };
108864: typedef struct yyParser yyParser;
108865:
108866: #ifndef NDEBUG
108867: /* #include <stdio.h> */
108868: static FILE *yyTraceFILE = 0;
108869: static char *yyTracePrompt = 0;
108870: #endif /* NDEBUG */
108871:
108872: #ifndef NDEBUG
108873: /*
108874: ** Turn parser tracing on by giving a stream to which to write the trace
108875: ** and a prompt to preface each trace message. Tracing is turned off
108876: ** by making either argument NULL
108877: **
108878: ** Inputs:
108879: ** <ul>
108880: ** <li> A FILE* to which trace output should be written.
108881: ** If NULL, then tracing is turned off.
108882: ** <li> A prefix string written at the beginning of every
108883: ** line of trace output. If NULL, then tracing is
108884: ** turned off.
108885: ** </ul>
108886: **
108887: ** Outputs:
108888: ** None.
108889: */
108890: SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){
108891: yyTraceFILE = TraceFILE;
108892: yyTracePrompt = zTracePrompt;
108893: if( yyTraceFILE==0 ) yyTracePrompt = 0;
108894: else if( yyTracePrompt==0 ) yyTraceFILE = 0;
108895: }
108896: #endif /* NDEBUG */
108897:
108898: #ifndef NDEBUG
108899: /* For tracing shifts, the names of all terminals and nonterminals
108900: ** are required. The following table supplies these names */
108901: static const char *const yyTokenName[] = {
108902: "$", "SEMI", "EXPLAIN", "QUERY",
108903: "PLAN", "BEGIN", "TRANSACTION", "DEFERRED",
108904: "IMMEDIATE", "EXCLUSIVE", "COMMIT", "END",
108905: "ROLLBACK", "SAVEPOINT", "RELEASE", "TO",
108906: "TABLE", "CREATE", "IF", "NOT",
108907: "EXISTS", "TEMP", "LP", "RP",
108908: "AS", "COMMA", "ID", "INDEXED",
108909: "ABORT", "ACTION", "AFTER", "ANALYZE",
108910: "ASC", "ATTACH", "BEFORE", "BY",
108911: "CASCADE", "CAST", "COLUMNKW", "CONFLICT",
108912: "DATABASE", "DESC", "DETACH", "EACH",
108913: "FAIL", "FOR", "IGNORE", "INITIALLY",
108914: "INSTEAD", "LIKE_KW", "MATCH", "NO",
108915: "KEY", "OF", "OFFSET", "PRAGMA",
108916: "RAISE", "REPLACE", "RESTRICT", "ROW",
108917: "TRIGGER", "VACUUM", "VIEW", "VIRTUAL",
108918: "REINDEX", "RENAME", "CTIME_KW", "ANY",
108919: "OR", "AND", "IS", "BETWEEN",
108920: "IN", "ISNULL", "NOTNULL", "NE",
108921: "EQ", "GT", "LE", "LT",
108922: "GE", "ESCAPE", "BITAND", "BITOR",
108923: "LSHIFT", "RSHIFT", "PLUS", "MINUS",
108924: "STAR", "SLASH", "REM", "CONCAT",
108925: "COLLATE", "BITNOT", "STRING", "JOIN_KW",
108926: "CONSTRAINT", "DEFAULT", "NULL", "PRIMARY",
108927: "UNIQUE", "CHECK", "REFERENCES", "AUTOINCR",
108928: "ON", "INSERT", "DELETE", "UPDATE",
108929: "SET", "DEFERRABLE", "FOREIGN", "DROP",
108930: "UNION", "ALL", "EXCEPT", "INTERSECT",
108931: "SELECT", "DISTINCT", "DOT", "FROM",
108932: "JOIN", "USING", "ORDER", "GROUP",
108933: "HAVING", "LIMIT", "WHERE", "INTO",
108934: "VALUES", "INTEGER", "FLOAT", "BLOB",
108935: "REGISTER", "VARIABLE", "CASE", "WHEN",
108936: "THEN", "ELSE", "INDEX", "ALTER",
108937: "ADD", "error", "input", "cmdlist",
108938: "ecmd", "explain", "cmdx", "cmd",
108939: "transtype", "trans_opt", "nm", "savepoint_opt",
108940: "create_table", "create_table_args", "createkw", "temp",
108941: "ifnotexists", "dbnm", "columnlist", "conslist_opt",
108942: "select", "column", "columnid", "type",
108943: "carglist", "id", "ids", "typetoken",
108944: "typename", "signed", "plus_num", "minus_num",
1.2.2.1 ! misho 108945: "ccons", "term", "expr", "onconf",
! 108946: "sortorder", "autoinc", "idxlist_opt", "refargs",
! 108947: "defer_subclause", "refarg", "refact", "init_deferred_pred_opt",
! 108948: "conslist", "tconscomma", "tcons", "idxlist",
1.2 misho 108949: "defer_subclause_opt", "orconf", "resolvetype", "raisetype",
108950: "ifexists", "fullname", "oneselect", "multiselect_op",
108951: "distinct", "selcollist", "from", "where_opt",
108952: "groupby_opt", "having_opt", "orderby_opt", "limit_opt",
108953: "sclp", "as", "seltablist", "stl_prefix",
108954: "joinop", "indexed_opt", "on_opt", "using_opt",
1.2.2.1 ! misho 108955: "joinop2", "inscollist", "sortlist", "nexprlist",
! 108956: "setlist", "insert_cmd", "inscollist_opt", "valuelist",
! 108957: "exprlist", "likeop", "between_op", "in_op",
! 108958: "case_operand", "case_exprlist", "case_else", "uniqueflag",
! 108959: "collate", "nmnum", "number", "trigger_decl",
! 108960: "trigger_cmd_list", "trigger_time", "trigger_event", "foreach_clause",
! 108961: "when_clause", "trigger_cmd", "trnm", "tridxby",
! 108962: "database_kw_opt", "key_opt", "add_column_fullname", "kwcolumn_opt",
! 108963: "create_vtab", "vtabarglist", "vtabarg", "vtabargtoken",
! 108964: "lp", "anylist",
1.2 misho 108965: };
108966: #endif /* NDEBUG */
108967:
108968: #ifndef NDEBUG
108969: /* For tracing reduce actions, the names of all rules are required.
108970: */
108971: static const char *const yyRuleName[] = {
108972: /* 0 */ "input ::= cmdlist",
108973: /* 1 */ "cmdlist ::= cmdlist ecmd",
108974: /* 2 */ "cmdlist ::= ecmd",
108975: /* 3 */ "ecmd ::= SEMI",
108976: /* 4 */ "ecmd ::= explain cmdx SEMI",
108977: /* 5 */ "explain ::=",
108978: /* 6 */ "explain ::= EXPLAIN",
108979: /* 7 */ "explain ::= EXPLAIN QUERY PLAN",
108980: /* 8 */ "cmdx ::= cmd",
108981: /* 9 */ "cmd ::= BEGIN transtype trans_opt",
108982: /* 10 */ "trans_opt ::=",
108983: /* 11 */ "trans_opt ::= TRANSACTION",
108984: /* 12 */ "trans_opt ::= TRANSACTION nm",
108985: /* 13 */ "transtype ::=",
108986: /* 14 */ "transtype ::= DEFERRED",
108987: /* 15 */ "transtype ::= IMMEDIATE",
108988: /* 16 */ "transtype ::= EXCLUSIVE",
108989: /* 17 */ "cmd ::= COMMIT trans_opt",
108990: /* 18 */ "cmd ::= END trans_opt",
108991: /* 19 */ "cmd ::= ROLLBACK trans_opt",
108992: /* 20 */ "savepoint_opt ::= SAVEPOINT",
108993: /* 21 */ "savepoint_opt ::=",
108994: /* 22 */ "cmd ::= SAVEPOINT nm",
108995: /* 23 */ "cmd ::= RELEASE savepoint_opt nm",
108996: /* 24 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm",
108997: /* 25 */ "cmd ::= create_table create_table_args",
108998: /* 26 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm",
108999: /* 27 */ "createkw ::= CREATE",
109000: /* 28 */ "ifnotexists ::=",
109001: /* 29 */ "ifnotexists ::= IF NOT EXISTS",
109002: /* 30 */ "temp ::= TEMP",
109003: /* 31 */ "temp ::=",
109004: /* 32 */ "create_table_args ::= LP columnlist conslist_opt RP",
109005: /* 33 */ "create_table_args ::= AS select",
109006: /* 34 */ "columnlist ::= columnlist COMMA column",
109007: /* 35 */ "columnlist ::= column",
109008: /* 36 */ "column ::= columnid type carglist",
109009: /* 37 */ "columnid ::= nm",
109010: /* 38 */ "id ::= ID",
109011: /* 39 */ "id ::= INDEXED",
109012: /* 40 */ "ids ::= ID|STRING",
109013: /* 41 */ "nm ::= id",
109014: /* 42 */ "nm ::= STRING",
109015: /* 43 */ "nm ::= JOIN_KW",
109016: /* 44 */ "type ::=",
109017: /* 45 */ "type ::= typetoken",
109018: /* 46 */ "typetoken ::= typename",
109019: /* 47 */ "typetoken ::= typename LP signed RP",
109020: /* 48 */ "typetoken ::= typename LP signed COMMA signed RP",
109021: /* 49 */ "typename ::= ids",
109022: /* 50 */ "typename ::= typename ids",
109023: /* 51 */ "signed ::= plus_num",
109024: /* 52 */ "signed ::= minus_num",
1.2.2.1 ! misho 109025: /* 53 */ "carglist ::= carglist ccons",
1.2 misho 109026: /* 54 */ "carglist ::=",
1.2.2.1 ! misho 109027: /* 55 */ "ccons ::= CONSTRAINT nm",
! 109028: /* 56 */ "ccons ::= DEFAULT term",
! 109029: /* 57 */ "ccons ::= DEFAULT LP expr RP",
! 109030: /* 58 */ "ccons ::= DEFAULT PLUS term",
! 109031: /* 59 */ "ccons ::= DEFAULT MINUS term",
! 109032: /* 60 */ "ccons ::= DEFAULT id",
! 109033: /* 61 */ "ccons ::= NULL onconf",
! 109034: /* 62 */ "ccons ::= NOT NULL onconf",
! 109035: /* 63 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc",
! 109036: /* 64 */ "ccons ::= UNIQUE onconf",
! 109037: /* 65 */ "ccons ::= CHECK LP expr RP",
! 109038: /* 66 */ "ccons ::= REFERENCES nm idxlist_opt refargs",
! 109039: /* 67 */ "ccons ::= defer_subclause",
! 109040: /* 68 */ "ccons ::= COLLATE ids",
! 109041: /* 69 */ "autoinc ::=",
! 109042: /* 70 */ "autoinc ::= AUTOINCR",
! 109043: /* 71 */ "refargs ::=",
! 109044: /* 72 */ "refargs ::= refargs refarg",
! 109045: /* 73 */ "refarg ::= MATCH nm",
! 109046: /* 74 */ "refarg ::= ON INSERT refact",
! 109047: /* 75 */ "refarg ::= ON DELETE refact",
! 109048: /* 76 */ "refarg ::= ON UPDATE refact",
! 109049: /* 77 */ "refact ::= SET NULL",
! 109050: /* 78 */ "refact ::= SET DEFAULT",
! 109051: /* 79 */ "refact ::= CASCADE",
! 109052: /* 80 */ "refact ::= RESTRICT",
! 109053: /* 81 */ "refact ::= NO ACTION",
! 109054: /* 82 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt",
! 109055: /* 83 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt",
! 109056: /* 84 */ "init_deferred_pred_opt ::=",
! 109057: /* 85 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED",
! 109058: /* 86 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE",
! 109059: /* 87 */ "conslist_opt ::=",
! 109060: /* 88 */ "conslist_opt ::= COMMA conslist",
! 109061: /* 89 */ "conslist ::= conslist tconscomma tcons",
! 109062: /* 90 */ "conslist ::= tcons",
! 109063: /* 91 */ "tconscomma ::= COMMA",
! 109064: /* 92 */ "tconscomma ::=",
1.2 misho 109065: /* 93 */ "tcons ::= CONSTRAINT nm",
109066: /* 94 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf",
109067: /* 95 */ "tcons ::= UNIQUE LP idxlist RP onconf",
109068: /* 96 */ "tcons ::= CHECK LP expr RP onconf",
109069: /* 97 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt",
109070: /* 98 */ "defer_subclause_opt ::=",
109071: /* 99 */ "defer_subclause_opt ::= defer_subclause",
109072: /* 100 */ "onconf ::=",
109073: /* 101 */ "onconf ::= ON CONFLICT resolvetype",
109074: /* 102 */ "orconf ::=",
109075: /* 103 */ "orconf ::= OR resolvetype",
109076: /* 104 */ "resolvetype ::= raisetype",
109077: /* 105 */ "resolvetype ::= IGNORE",
109078: /* 106 */ "resolvetype ::= REPLACE",
109079: /* 107 */ "cmd ::= DROP TABLE ifexists fullname",
109080: /* 108 */ "ifexists ::= IF EXISTS",
109081: /* 109 */ "ifexists ::=",
109082: /* 110 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select",
109083: /* 111 */ "cmd ::= DROP VIEW ifexists fullname",
109084: /* 112 */ "cmd ::= select",
109085: /* 113 */ "select ::= oneselect",
109086: /* 114 */ "select ::= select multiselect_op oneselect",
109087: /* 115 */ "multiselect_op ::= UNION",
109088: /* 116 */ "multiselect_op ::= UNION ALL",
109089: /* 117 */ "multiselect_op ::= EXCEPT|INTERSECT",
109090: /* 118 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt",
109091: /* 119 */ "distinct ::= DISTINCT",
109092: /* 120 */ "distinct ::= ALL",
109093: /* 121 */ "distinct ::=",
109094: /* 122 */ "sclp ::= selcollist COMMA",
109095: /* 123 */ "sclp ::=",
109096: /* 124 */ "selcollist ::= sclp expr as",
109097: /* 125 */ "selcollist ::= sclp STAR",
109098: /* 126 */ "selcollist ::= sclp nm DOT STAR",
109099: /* 127 */ "as ::= AS nm",
109100: /* 128 */ "as ::= ids",
109101: /* 129 */ "as ::=",
109102: /* 130 */ "from ::=",
109103: /* 131 */ "from ::= FROM seltablist",
109104: /* 132 */ "stl_prefix ::= seltablist joinop",
109105: /* 133 */ "stl_prefix ::=",
109106: /* 134 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt",
109107: /* 135 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt",
109108: /* 136 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt",
109109: /* 137 */ "dbnm ::=",
109110: /* 138 */ "dbnm ::= DOT nm",
109111: /* 139 */ "fullname ::= nm dbnm",
109112: /* 140 */ "joinop ::= COMMA|JOIN",
109113: /* 141 */ "joinop ::= JOIN_KW JOIN",
109114: /* 142 */ "joinop ::= JOIN_KW nm JOIN",
109115: /* 143 */ "joinop ::= JOIN_KW nm nm JOIN",
109116: /* 144 */ "on_opt ::= ON expr",
109117: /* 145 */ "on_opt ::=",
109118: /* 146 */ "indexed_opt ::=",
109119: /* 147 */ "indexed_opt ::= INDEXED BY nm",
109120: /* 148 */ "indexed_opt ::= NOT INDEXED",
109121: /* 149 */ "using_opt ::= USING LP inscollist RP",
109122: /* 150 */ "using_opt ::=",
109123: /* 151 */ "orderby_opt ::=",
109124: /* 152 */ "orderby_opt ::= ORDER BY sortlist",
1.2.2.1 ! misho 109125: /* 153 */ "sortlist ::= sortlist COMMA expr sortorder",
! 109126: /* 154 */ "sortlist ::= expr sortorder",
! 109127: /* 155 */ "sortorder ::= ASC",
! 109128: /* 156 */ "sortorder ::= DESC",
! 109129: /* 157 */ "sortorder ::=",
! 109130: /* 158 */ "groupby_opt ::=",
! 109131: /* 159 */ "groupby_opt ::= GROUP BY nexprlist",
! 109132: /* 160 */ "having_opt ::=",
! 109133: /* 161 */ "having_opt ::= HAVING expr",
! 109134: /* 162 */ "limit_opt ::=",
! 109135: /* 163 */ "limit_opt ::= LIMIT expr",
! 109136: /* 164 */ "limit_opt ::= LIMIT expr OFFSET expr",
! 109137: /* 165 */ "limit_opt ::= LIMIT expr COMMA expr",
! 109138: /* 166 */ "cmd ::= DELETE FROM fullname indexed_opt where_opt",
! 109139: /* 167 */ "where_opt ::=",
! 109140: /* 168 */ "where_opt ::= WHERE expr",
! 109141: /* 169 */ "cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt",
! 109142: /* 170 */ "setlist ::= setlist COMMA nm EQ expr",
! 109143: /* 171 */ "setlist ::= nm EQ expr",
! 109144: /* 172 */ "cmd ::= insert_cmd INTO fullname inscollist_opt valuelist",
! 109145: /* 173 */ "cmd ::= insert_cmd INTO fullname inscollist_opt select",
! 109146: /* 174 */ "cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES",
! 109147: /* 175 */ "insert_cmd ::= INSERT orconf",
! 109148: /* 176 */ "insert_cmd ::= REPLACE",
! 109149: /* 177 */ "valuelist ::= VALUES LP nexprlist RP",
! 109150: /* 178 */ "valuelist ::= valuelist COMMA LP exprlist RP",
! 109151: /* 179 */ "inscollist_opt ::=",
! 109152: /* 180 */ "inscollist_opt ::= LP inscollist RP",
! 109153: /* 181 */ "inscollist ::= inscollist COMMA nm",
! 109154: /* 182 */ "inscollist ::= nm",
! 109155: /* 183 */ "expr ::= term",
! 109156: /* 184 */ "expr ::= LP expr RP",
! 109157: /* 185 */ "term ::= NULL",
! 109158: /* 186 */ "expr ::= id",
! 109159: /* 187 */ "expr ::= JOIN_KW",
! 109160: /* 188 */ "expr ::= nm DOT nm",
! 109161: /* 189 */ "expr ::= nm DOT nm DOT nm",
! 109162: /* 190 */ "term ::= INTEGER|FLOAT|BLOB",
! 109163: /* 191 */ "term ::= STRING",
! 109164: /* 192 */ "expr ::= REGISTER",
! 109165: /* 193 */ "expr ::= VARIABLE",
! 109166: /* 194 */ "expr ::= expr COLLATE ids",
! 109167: /* 195 */ "expr ::= CAST LP expr AS typetoken RP",
! 109168: /* 196 */ "expr ::= ID LP distinct exprlist RP",
! 109169: /* 197 */ "expr ::= ID LP STAR RP",
! 109170: /* 198 */ "term ::= CTIME_KW",
! 109171: /* 199 */ "expr ::= expr AND expr",
! 109172: /* 200 */ "expr ::= expr OR expr",
! 109173: /* 201 */ "expr ::= expr LT|GT|GE|LE expr",
! 109174: /* 202 */ "expr ::= expr EQ|NE expr",
! 109175: /* 203 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr",
! 109176: /* 204 */ "expr ::= expr PLUS|MINUS expr",
! 109177: /* 205 */ "expr ::= expr STAR|SLASH|REM expr",
! 109178: /* 206 */ "expr ::= expr CONCAT expr",
! 109179: /* 207 */ "likeop ::= LIKE_KW",
! 109180: /* 208 */ "likeop ::= NOT LIKE_KW",
! 109181: /* 209 */ "likeop ::= MATCH",
! 109182: /* 210 */ "likeop ::= NOT MATCH",
! 109183: /* 211 */ "expr ::= expr likeop expr",
! 109184: /* 212 */ "expr ::= expr likeop expr ESCAPE expr",
! 109185: /* 213 */ "expr ::= expr ISNULL|NOTNULL",
! 109186: /* 214 */ "expr ::= expr NOT NULL",
! 109187: /* 215 */ "expr ::= expr IS expr",
! 109188: /* 216 */ "expr ::= expr IS NOT expr",
! 109189: /* 217 */ "expr ::= NOT expr",
! 109190: /* 218 */ "expr ::= BITNOT expr",
! 109191: /* 219 */ "expr ::= MINUS expr",
! 109192: /* 220 */ "expr ::= PLUS expr",
! 109193: /* 221 */ "between_op ::= BETWEEN",
! 109194: /* 222 */ "between_op ::= NOT BETWEEN",
! 109195: /* 223 */ "expr ::= expr between_op expr AND expr",
! 109196: /* 224 */ "in_op ::= IN",
! 109197: /* 225 */ "in_op ::= NOT IN",
! 109198: /* 226 */ "expr ::= expr in_op LP exprlist RP",
! 109199: /* 227 */ "expr ::= LP select RP",
! 109200: /* 228 */ "expr ::= expr in_op LP select RP",
! 109201: /* 229 */ "expr ::= expr in_op nm dbnm",
! 109202: /* 230 */ "expr ::= EXISTS LP select RP",
! 109203: /* 231 */ "expr ::= CASE case_operand case_exprlist case_else END",
! 109204: /* 232 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr",
! 109205: /* 233 */ "case_exprlist ::= WHEN expr THEN expr",
! 109206: /* 234 */ "case_else ::= ELSE expr",
! 109207: /* 235 */ "case_else ::=",
! 109208: /* 236 */ "case_operand ::= expr",
! 109209: /* 237 */ "case_operand ::=",
! 109210: /* 238 */ "exprlist ::= nexprlist",
! 109211: /* 239 */ "exprlist ::=",
! 109212: /* 240 */ "nexprlist ::= nexprlist COMMA expr",
! 109213: /* 241 */ "nexprlist ::= expr",
! 109214: /* 242 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP",
! 109215: /* 243 */ "uniqueflag ::= UNIQUE",
! 109216: /* 244 */ "uniqueflag ::=",
! 109217: /* 245 */ "idxlist_opt ::=",
! 109218: /* 246 */ "idxlist_opt ::= LP idxlist RP",
! 109219: /* 247 */ "idxlist ::= idxlist COMMA nm collate sortorder",
! 109220: /* 248 */ "idxlist ::= nm collate sortorder",
! 109221: /* 249 */ "collate ::=",
! 109222: /* 250 */ "collate ::= COLLATE ids",
! 109223: /* 251 */ "cmd ::= DROP INDEX ifexists fullname",
! 109224: /* 252 */ "cmd ::= VACUUM",
! 109225: /* 253 */ "cmd ::= VACUUM nm",
! 109226: /* 254 */ "cmd ::= PRAGMA nm dbnm",
! 109227: /* 255 */ "cmd ::= PRAGMA nm dbnm EQ nmnum",
! 109228: /* 256 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP",
! 109229: /* 257 */ "cmd ::= PRAGMA nm dbnm EQ minus_num",
! 109230: /* 258 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP",
! 109231: /* 259 */ "nmnum ::= plus_num",
! 109232: /* 260 */ "nmnum ::= nm",
! 109233: /* 261 */ "nmnum ::= ON",
! 109234: /* 262 */ "nmnum ::= DELETE",
! 109235: /* 263 */ "nmnum ::= DEFAULT",
! 109236: /* 264 */ "plus_num ::= PLUS number",
! 109237: /* 265 */ "plus_num ::= number",
1.2 misho 109238: /* 266 */ "minus_num ::= MINUS number",
109239: /* 267 */ "number ::= INTEGER|FLOAT",
1.2.2.1 ! misho 109240: /* 268 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END",
! 109241: /* 269 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause",
! 109242: /* 270 */ "trigger_time ::= BEFORE",
! 109243: /* 271 */ "trigger_time ::= AFTER",
! 109244: /* 272 */ "trigger_time ::= INSTEAD OF",
! 109245: /* 273 */ "trigger_time ::=",
! 109246: /* 274 */ "trigger_event ::= DELETE|INSERT",
! 109247: /* 275 */ "trigger_event ::= UPDATE",
! 109248: /* 276 */ "trigger_event ::= UPDATE OF inscollist",
! 109249: /* 277 */ "foreach_clause ::=",
! 109250: /* 278 */ "foreach_clause ::= FOR EACH ROW",
! 109251: /* 279 */ "when_clause ::=",
! 109252: /* 280 */ "when_clause ::= WHEN expr",
! 109253: /* 281 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI",
! 109254: /* 282 */ "trigger_cmd_list ::= trigger_cmd SEMI",
! 109255: /* 283 */ "trnm ::= nm",
! 109256: /* 284 */ "trnm ::= nm DOT nm",
! 109257: /* 285 */ "tridxby ::=",
! 109258: /* 286 */ "tridxby ::= INDEXED BY nm",
! 109259: /* 287 */ "tridxby ::= NOT INDEXED",
! 109260: /* 288 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt",
! 109261: /* 289 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt valuelist",
! 109262: /* 290 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select",
! 109263: /* 291 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt",
! 109264: /* 292 */ "trigger_cmd ::= select",
! 109265: /* 293 */ "expr ::= RAISE LP IGNORE RP",
! 109266: /* 294 */ "expr ::= RAISE LP raisetype COMMA nm RP",
! 109267: /* 295 */ "raisetype ::= ROLLBACK",
! 109268: /* 296 */ "raisetype ::= ABORT",
! 109269: /* 297 */ "raisetype ::= FAIL",
! 109270: /* 298 */ "cmd ::= DROP TRIGGER ifexists fullname",
! 109271: /* 299 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt",
! 109272: /* 300 */ "cmd ::= DETACH database_kw_opt expr",
! 109273: /* 301 */ "key_opt ::=",
! 109274: /* 302 */ "key_opt ::= KEY expr",
! 109275: /* 303 */ "database_kw_opt ::= DATABASE",
! 109276: /* 304 */ "database_kw_opt ::=",
! 109277: /* 305 */ "cmd ::= REINDEX",
! 109278: /* 306 */ "cmd ::= REINDEX nm dbnm",
! 109279: /* 307 */ "cmd ::= ANALYZE",
! 109280: /* 308 */ "cmd ::= ANALYZE nm dbnm",
! 109281: /* 309 */ "cmd ::= ALTER TABLE fullname RENAME TO nm",
! 109282: /* 310 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column",
! 109283: /* 311 */ "add_column_fullname ::= fullname",
! 109284: /* 312 */ "kwcolumn_opt ::=",
! 109285: /* 313 */ "kwcolumn_opt ::= COLUMNKW",
! 109286: /* 314 */ "cmd ::= create_vtab",
! 109287: /* 315 */ "cmd ::= create_vtab LP vtabarglist RP",
! 109288: /* 316 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm",
! 109289: /* 317 */ "vtabarglist ::= vtabarg",
! 109290: /* 318 */ "vtabarglist ::= vtabarglist COMMA vtabarg",
! 109291: /* 319 */ "vtabarg ::=",
! 109292: /* 320 */ "vtabarg ::= vtabarg vtabargtoken",
! 109293: /* 321 */ "vtabargtoken ::= ANY",
! 109294: /* 322 */ "vtabargtoken ::= lp anylist RP",
! 109295: /* 323 */ "lp ::= LP",
! 109296: /* 324 */ "anylist ::=",
! 109297: /* 325 */ "anylist ::= anylist LP anylist RP",
! 109298: /* 326 */ "anylist ::= anylist ANY",
1.2 misho 109299: };
109300: #endif /* NDEBUG */
109301:
109302:
109303: #if YYSTACKDEPTH<=0
109304: /*
109305: ** Try to increase the size of the parser stack.
109306: */
109307: static void yyGrowStack(yyParser *p){
109308: int newSize;
109309: yyStackEntry *pNew;
109310:
109311: newSize = p->yystksz*2 + 100;
109312: pNew = realloc(p->yystack, newSize*sizeof(pNew[0]));
109313: if( pNew ){
109314: p->yystack = pNew;
109315: p->yystksz = newSize;
109316: #ifndef NDEBUG
109317: if( yyTraceFILE ){
109318: fprintf(yyTraceFILE,"%sStack grows to %d entries!\n",
109319: yyTracePrompt, p->yystksz);
109320: }
109321: #endif
109322: }
109323: }
109324: #endif
109325:
109326: /*
109327: ** This function allocates a new parser.
109328: ** The only argument is a pointer to a function which works like
109329: ** malloc.
109330: **
109331: ** Inputs:
109332: ** A pointer to the function used to allocate memory.
109333: **
109334: ** Outputs:
109335: ** A pointer to a parser. This pointer is used in subsequent calls
109336: ** to sqlite3Parser and sqlite3ParserFree.
109337: */
109338: SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(size_t)){
109339: yyParser *pParser;
109340: pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser) );
109341: if( pParser ){
109342: pParser->yyidx = -1;
109343: #ifdef YYTRACKMAXSTACKDEPTH
109344: pParser->yyidxMax = 0;
109345: #endif
109346: #if YYSTACKDEPTH<=0
109347: pParser->yystack = NULL;
109348: pParser->yystksz = 0;
109349: yyGrowStack(pParser);
109350: #endif
109351: }
109352: return pParser;
109353: }
109354:
109355: /* The following function deletes the value associated with a
109356: ** symbol. The symbol can be either a terminal or nonterminal.
109357: ** "yymajor" is the symbol code, and "yypminor" is a pointer to
109358: ** the value.
109359: */
109360: static void yy_destructor(
109361: yyParser *yypParser, /* The parser */
109362: YYCODETYPE yymajor, /* Type code for object to destroy */
109363: YYMINORTYPE *yypminor /* The object to be destroyed */
109364: ){
109365: sqlite3ParserARG_FETCH;
109366: switch( yymajor ){
109367: /* Here is inserted the actions which take place when a
109368: ** terminal or non-terminal is destroyed. This can happen
109369: ** when the symbol is popped from the stack during a
109370: ** reduce or during error processing or when a parser is
109371: ** being destroyed before it is finished parsing.
109372: **
109373: ** Note: during a reduce, the only symbols destroyed are those
109374: ** which appear on the RHS of the rule, but which are not used
109375: ** inside the C code.
109376: */
109377: case 160: /* select */
109378: case 194: /* oneselect */
109379: {
1.2.2.1 ! misho 109380: sqlite3SelectDelete(pParse->db, (yypminor->yy159));
1.2 misho 109381: }
109382: break;
1.2.2.1 ! misho 109383: case 173: /* term */
! 109384: case 174: /* expr */
1.2 misho 109385: {
1.2.2.1 ! misho 109386: sqlite3ExprDelete(pParse->db, (yypminor->yy342).pExpr);
1.2 misho 109387: }
109388: break;
1.2.2.1 ! misho 109389: case 178: /* idxlist_opt */
1.2 misho 109390: case 187: /* idxlist */
109391: case 197: /* selcollist */
109392: case 200: /* groupby_opt */
109393: case 202: /* orderby_opt */
109394: case 204: /* sclp */
109395: case 214: /* sortlist */
1.2.2.1 ! misho 109396: case 215: /* nexprlist */
! 109397: case 216: /* setlist */
! 109398: case 220: /* exprlist */
! 109399: case 225: /* case_exprlist */
1.2 misho 109400: {
1.2.2.1 ! misho 109401: sqlite3ExprListDelete(pParse->db, (yypminor->yy442));
1.2 misho 109402: }
109403: break;
109404: case 193: /* fullname */
109405: case 198: /* from */
109406: case 206: /* seltablist */
109407: case 207: /* stl_prefix */
109408: {
1.2.2.1 ! misho 109409: sqlite3SrcListDelete(pParse->db, (yypminor->yy347));
1.2 misho 109410: }
109411: break;
109412: case 199: /* where_opt */
109413: case 201: /* having_opt */
109414: case 210: /* on_opt */
1.2.2.1 ! misho 109415: case 224: /* case_operand */
! 109416: case 226: /* case_else */
! 109417: case 236: /* when_clause */
! 109418: case 241: /* key_opt */
1.2 misho 109419: {
1.2.2.1 ! misho 109420: sqlite3ExprDelete(pParse->db, (yypminor->yy122));
1.2 misho 109421: }
109422: break;
109423: case 211: /* using_opt */
109424: case 213: /* inscollist */
1.2.2.1 ! misho 109425: case 218: /* inscollist_opt */
! 109426: {
! 109427: sqlite3IdListDelete(pParse->db, (yypminor->yy180));
! 109428: }
! 109429: break;
! 109430: case 219: /* valuelist */
1.2 misho 109431: {
1.2.2.1 ! misho 109432:
! 109433: sqlite3ExprListDelete(pParse->db, (yypminor->yy487).pList);
! 109434: sqlite3SelectDelete(pParse->db, (yypminor->yy487).pSelect);
! 109435:
1.2 misho 109436: }
109437: break;
1.2.2.1 ! misho 109438: case 232: /* trigger_cmd_list */
! 109439: case 237: /* trigger_cmd */
1.2 misho 109440: {
1.2.2.1 ! misho 109441: sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy327));
1.2 misho 109442: }
109443: break;
1.2.2.1 ! misho 109444: case 234: /* trigger_event */
1.2 misho 109445: {
1.2.2.1 ! misho 109446: sqlite3IdListDelete(pParse->db, (yypminor->yy410).b);
1.2 misho 109447: }
109448: break;
109449: default: break; /* If no destructor action specified: do nothing */
109450: }
109451: }
109452:
109453: /*
109454: ** Pop the parser's stack once.
109455: **
109456: ** If there is a destructor routine associated with the token which
109457: ** is popped from the stack, then call it.
109458: **
109459: ** Return the major token number for the symbol popped.
109460: */
109461: static int yy_pop_parser_stack(yyParser *pParser){
109462: YYCODETYPE yymajor;
109463: yyStackEntry *yytos = &pParser->yystack[pParser->yyidx];
109464:
109465: /* There is no mechanism by which the parser stack can be popped below
109466: ** empty in SQLite. */
109467: if( NEVER(pParser->yyidx<0) ) return 0;
109468: #ifndef NDEBUG
109469: if( yyTraceFILE && pParser->yyidx>=0 ){
109470: fprintf(yyTraceFILE,"%sPopping %s\n",
109471: yyTracePrompt,
109472: yyTokenName[yytos->major]);
109473: }
109474: #endif
109475: yymajor = yytos->major;
109476: yy_destructor(pParser, yymajor, &yytos->minor);
109477: pParser->yyidx--;
109478: return yymajor;
109479: }
109480:
109481: /*
109482: ** Deallocate and destroy a parser. Destructors are all called for
109483: ** all stack elements before shutting the parser down.
109484: **
109485: ** Inputs:
109486: ** <ul>
109487: ** <li> A pointer to the parser. This should be a pointer
109488: ** obtained from sqlite3ParserAlloc.
109489: ** <li> A pointer to a function used to reclaim memory obtained
109490: ** from malloc.
109491: ** </ul>
109492: */
109493: SQLITE_PRIVATE void sqlite3ParserFree(
109494: void *p, /* The parser to be deleted */
109495: void (*freeProc)(void*) /* Function used to reclaim memory */
109496: ){
109497: yyParser *pParser = (yyParser*)p;
109498: /* In SQLite, we never try to destroy a parser that was not successfully
109499: ** created in the first place. */
109500: if( NEVER(pParser==0) ) return;
109501: while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser);
109502: #if YYSTACKDEPTH<=0
109503: free(pParser->yystack);
109504: #endif
109505: (*freeProc)((void*)pParser);
109506: }
109507:
109508: /*
109509: ** Return the peak depth of the stack for a parser.
109510: */
109511: #ifdef YYTRACKMAXSTACKDEPTH
109512: SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){
109513: yyParser *pParser = (yyParser*)p;
109514: return pParser->yyidxMax;
109515: }
109516: #endif
109517:
109518: /*
109519: ** Find the appropriate action for a parser given the terminal
109520: ** look-ahead token iLookAhead.
109521: **
109522: ** If the look-ahead token is YYNOCODE, then check to see if the action is
109523: ** independent of the look-ahead. If it is, return the action, otherwise
109524: ** return YY_NO_ACTION.
109525: */
109526: static int yy_find_shift_action(
109527: yyParser *pParser, /* The parser */
109528: YYCODETYPE iLookAhead /* The look-ahead token */
109529: ){
109530: int i;
109531: int stateno = pParser->yystack[pParser->yyidx].stateno;
109532:
109533: if( stateno>YY_SHIFT_COUNT
109534: || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){
109535: return yy_default[stateno];
109536: }
109537: assert( iLookAhead!=YYNOCODE );
109538: i += iLookAhead;
109539: if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
109540: if( iLookAhead>0 ){
109541: #ifdef YYFALLBACK
109542: YYCODETYPE iFallback; /* Fallback token */
109543: if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0])
109544: && (iFallback = yyFallback[iLookAhead])!=0 ){
109545: #ifndef NDEBUG
109546: if( yyTraceFILE ){
109547: fprintf(yyTraceFILE, "%sFALLBACK %s => %s\n",
109548: yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]);
109549: }
109550: #endif
109551: return yy_find_shift_action(pParser, iFallback);
109552: }
109553: #endif
109554: #ifdef YYWILDCARD
109555: {
109556: int j = i - iLookAhead + YYWILDCARD;
109557: if(
109558: #if YY_SHIFT_MIN+YYWILDCARD<0
109559: j>=0 &&
109560: #endif
109561: #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT
109562: j<YY_ACTTAB_COUNT &&
109563: #endif
109564: yy_lookahead[j]==YYWILDCARD
109565: ){
109566: #ifndef NDEBUG
109567: if( yyTraceFILE ){
109568: fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n",
109569: yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]);
109570: }
109571: #endif /* NDEBUG */
109572: return yy_action[j];
109573: }
109574: }
109575: #endif /* YYWILDCARD */
109576: }
109577: return yy_default[stateno];
109578: }else{
109579: return yy_action[i];
109580: }
109581: }
109582:
109583: /*
109584: ** Find the appropriate action for a parser given the non-terminal
109585: ** look-ahead token iLookAhead.
109586: **
109587: ** If the look-ahead token is YYNOCODE, then check to see if the action is
109588: ** independent of the look-ahead. If it is, return the action, otherwise
109589: ** return YY_NO_ACTION.
109590: */
109591: static int yy_find_reduce_action(
109592: int stateno, /* Current state number */
109593: YYCODETYPE iLookAhead /* The look-ahead token */
109594: ){
109595: int i;
109596: #ifdef YYERRORSYMBOL
109597: if( stateno>YY_REDUCE_COUNT ){
109598: return yy_default[stateno];
109599: }
109600: #else
109601: assert( stateno<=YY_REDUCE_COUNT );
109602: #endif
109603: i = yy_reduce_ofst[stateno];
109604: assert( i!=YY_REDUCE_USE_DFLT );
109605: assert( iLookAhead!=YYNOCODE );
109606: i += iLookAhead;
109607: #ifdef YYERRORSYMBOL
109608: if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){
109609: return yy_default[stateno];
109610: }
109611: #else
109612: assert( i>=0 && i<YY_ACTTAB_COUNT );
109613: assert( yy_lookahead[i]==iLookAhead );
109614: #endif
109615: return yy_action[i];
109616: }
109617:
109618: /*
109619: ** The following routine is called if the stack overflows.
109620: */
109621: static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
109622: sqlite3ParserARG_FETCH;
109623: yypParser->yyidx--;
109624: #ifndef NDEBUG
109625: if( yyTraceFILE ){
109626: fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt);
109627: }
109628: #endif
109629: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
109630: /* Here code is inserted which will execute if the parser
109631: ** stack every overflows */
109632:
109633: UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
109634: sqlite3ErrorMsg(pParse, "parser stack overflow");
109635: sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */
109636: }
109637:
109638: /*
109639: ** Perform a shift action.
109640: */
109641: static void yy_shift(
109642: yyParser *yypParser, /* The parser to be shifted */
109643: int yyNewState, /* The new state to shift in */
109644: int yyMajor, /* The major token to shift in */
109645: YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */
109646: ){
109647: yyStackEntry *yytos;
109648: yypParser->yyidx++;
109649: #ifdef YYTRACKMAXSTACKDEPTH
109650: if( yypParser->yyidx>yypParser->yyidxMax ){
109651: yypParser->yyidxMax = yypParser->yyidx;
109652: }
109653: #endif
109654: #if YYSTACKDEPTH>0
109655: if( yypParser->yyidx>=YYSTACKDEPTH ){
109656: yyStackOverflow(yypParser, yypMinor);
109657: return;
109658: }
109659: #else
109660: if( yypParser->yyidx>=yypParser->yystksz ){
109661: yyGrowStack(yypParser);
109662: if( yypParser->yyidx>=yypParser->yystksz ){
109663: yyStackOverflow(yypParser, yypMinor);
109664: return;
109665: }
109666: }
109667: #endif
109668: yytos = &yypParser->yystack[yypParser->yyidx];
109669: yytos->stateno = (YYACTIONTYPE)yyNewState;
109670: yytos->major = (YYCODETYPE)yyMajor;
109671: yytos->minor = *yypMinor;
109672: #ifndef NDEBUG
109673: if( yyTraceFILE && yypParser->yyidx>0 ){
109674: int i;
109675: fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState);
109676: fprintf(yyTraceFILE,"%sStack:",yyTracePrompt);
109677: for(i=1; i<=yypParser->yyidx; i++)
109678: fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]);
109679: fprintf(yyTraceFILE,"\n");
109680: }
109681: #endif
109682: }
109683:
109684: /* The following table contains information about every rule that
109685: ** is used during the reduce.
109686: */
109687: static const struct {
109688: YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */
109689: unsigned char nrhs; /* Number of right-hand side symbols in the rule */
109690: } yyRuleInfo[] = {
109691: { 142, 1 },
109692: { 143, 2 },
109693: { 143, 1 },
109694: { 144, 1 },
109695: { 144, 3 },
109696: { 145, 0 },
109697: { 145, 1 },
109698: { 145, 3 },
109699: { 146, 1 },
109700: { 147, 3 },
109701: { 149, 0 },
109702: { 149, 1 },
109703: { 149, 2 },
109704: { 148, 0 },
109705: { 148, 1 },
109706: { 148, 1 },
109707: { 148, 1 },
109708: { 147, 2 },
109709: { 147, 2 },
109710: { 147, 2 },
109711: { 151, 1 },
109712: { 151, 0 },
109713: { 147, 2 },
109714: { 147, 3 },
109715: { 147, 5 },
109716: { 147, 2 },
109717: { 152, 6 },
109718: { 154, 1 },
109719: { 156, 0 },
109720: { 156, 3 },
109721: { 155, 1 },
109722: { 155, 0 },
109723: { 153, 4 },
109724: { 153, 2 },
109725: { 158, 3 },
109726: { 158, 1 },
109727: { 161, 3 },
109728: { 162, 1 },
109729: { 165, 1 },
109730: { 165, 1 },
109731: { 166, 1 },
109732: { 150, 1 },
109733: { 150, 1 },
109734: { 150, 1 },
109735: { 163, 0 },
109736: { 163, 1 },
109737: { 167, 1 },
109738: { 167, 4 },
109739: { 167, 6 },
109740: { 168, 1 },
109741: { 168, 2 },
109742: { 169, 1 },
109743: { 169, 1 },
109744: { 164, 2 },
109745: { 164, 0 },
1.2.2.1 ! misho 109746: { 172, 2 },
! 109747: { 172, 2 },
! 109748: { 172, 4 },
1.2 misho 109749: { 172, 3 },
1.2.2.1 ! misho 109750: { 172, 3 },
! 109751: { 172, 2 },
! 109752: { 172, 2 },
! 109753: { 172, 3 },
! 109754: { 172, 5 },
! 109755: { 172, 2 },
! 109756: { 172, 4 },
! 109757: { 172, 4 },
1.2 misho 109758: { 172, 1 },
1.2.2.1 ! misho 109759: { 172, 2 },
! 109760: { 177, 0 },
! 109761: { 177, 1 },
! 109762: { 179, 0 },
! 109763: { 179, 2 },
! 109764: { 181, 2 },
! 109765: { 181, 3 },
! 109766: { 181, 3 },
! 109767: { 181, 3 },
1.2 misho 109768: { 182, 2 },
1.2.2.1 ! misho 109769: { 182, 2 },
! 109770: { 182, 1 },
! 109771: { 182, 1 },
! 109772: { 182, 2 },
! 109773: { 180, 3 },
! 109774: { 180, 2 },
! 109775: { 183, 0 },
1.2 misho 109776: { 183, 2 },
109777: { 183, 2 },
109778: { 159, 0 },
109779: { 159, 2 },
1.2.2.1 ! misho 109780: { 184, 3 },
! 109781: { 184, 1 },
1.2 misho 109782: { 185, 1 },
1.2.2.1 ! misho 109783: { 185, 0 },
1.2 misho 109784: { 186, 2 },
109785: { 186, 7 },
109786: { 186, 5 },
109787: { 186, 5 },
109788: { 186, 10 },
109789: { 188, 0 },
109790: { 188, 1 },
1.2.2.1 ! misho 109791: { 175, 0 },
! 109792: { 175, 3 },
1.2 misho 109793: { 189, 0 },
109794: { 189, 2 },
109795: { 190, 1 },
109796: { 190, 1 },
109797: { 190, 1 },
109798: { 147, 4 },
109799: { 192, 2 },
109800: { 192, 0 },
109801: { 147, 8 },
109802: { 147, 4 },
109803: { 147, 1 },
109804: { 160, 1 },
109805: { 160, 3 },
109806: { 195, 1 },
109807: { 195, 2 },
109808: { 195, 1 },
109809: { 194, 9 },
109810: { 196, 1 },
109811: { 196, 1 },
109812: { 196, 0 },
109813: { 204, 2 },
109814: { 204, 0 },
109815: { 197, 3 },
109816: { 197, 2 },
109817: { 197, 4 },
109818: { 205, 2 },
109819: { 205, 1 },
109820: { 205, 0 },
109821: { 198, 0 },
109822: { 198, 2 },
109823: { 207, 2 },
109824: { 207, 0 },
109825: { 206, 7 },
109826: { 206, 7 },
109827: { 206, 7 },
109828: { 157, 0 },
109829: { 157, 2 },
109830: { 193, 2 },
109831: { 208, 1 },
109832: { 208, 2 },
109833: { 208, 3 },
109834: { 208, 4 },
109835: { 210, 2 },
109836: { 210, 0 },
109837: { 209, 0 },
109838: { 209, 3 },
109839: { 209, 2 },
109840: { 211, 4 },
109841: { 211, 0 },
109842: { 202, 0 },
109843: { 202, 3 },
109844: { 214, 4 },
109845: { 214, 2 },
1.2.2.1 ! misho 109846: { 176, 1 },
! 109847: { 176, 1 },
! 109848: { 176, 0 },
1.2 misho 109849: { 200, 0 },
109850: { 200, 3 },
109851: { 201, 0 },
109852: { 201, 2 },
109853: { 203, 0 },
109854: { 203, 2 },
109855: { 203, 4 },
109856: { 203, 4 },
109857: { 147, 5 },
109858: { 199, 0 },
109859: { 199, 2 },
109860: { 147, 7 },
1.2.2.1 ! misho 109861: { 216, 5 },
! 109862: { 216, 3 },
! 109863: { 147, 5 },
1.2 misho 109864: { 147, 5 },
109865: { 147, 6 },
1.2.2.1 ! misho 109866: { 217, 2 },
! 109867: { 217, 1 },
! 109868: { 219, 4 },
! 109869: { 219, 5 },
! 109870: { 218, 0 },
! 109871: { 218, 3 },
1.2 misho 109872: { 213, 3 },
109873: { 213, 1 },
109874: { 174, 1 },
1.2.2.1 ! misho 109875: { 174, 3 },
! 109876: { 173, 1 },
1.2 misho 109877: { 174, 1 },
109878: { 174, 1 },
1.2.2.1 ! misho 109879: { 174, 3 },
! 109880: { 174, 5 },
! 109881: { 173, 1 },
! 109882: { 173, 1 },
1.2 misho 109883: { 174, 1 },
1.2.2.1 ! misho 109884: { 174, 1 },
! 109885: { 174, 3 },
! 109886: { 174, 6 },
! 109887: { 174, 5 },
! 109888: { 174, 4 },
! 109889: { 173, 1 },
! 109890: { 174, 3 },
! 109891: { 174, 3 },
! 109892: { 174, 3 },
! 109893: { 174, 3 },
! 109894: { 174, 3 },
! 109895: { 174, 3 },
! 109896: { 174, 3 },
! 109897: { 174, 3 },
! 109898: { 221, 1 },
! 109899: { 221, 2 },
! 109900: { 221, 1 },
! 109901: { 221, 2 },
! 109902: { 174, 3 },
! 109903: { 174, 5 },
! 109904: { 174, 2 },
! 109905: { 174, 3 },
! 109906: { 174, 3 },
! 109907: { 174, 4 },
! 109908: { 174, 2 },
! 109909: { 174, 2 },
! 109910: { 174, 2 },
! 109911: { 174, 2 },
1.2 misho 109912: { 222, 1 },
109913: { 222, 2 },
1.2.2.1 ! misho 109914: { 174, 5 },
1.2 misho 109915: { 223, 1 },
109916: { 223, 2 },
1.2.2.1 ! misho 109917: { 174, 5 },
! 109918: { 174, 3 },
! 109919: { 174, 5 },
! 109920: { 174, 4 },
! 109921: { 174, 4 },
! 109922: { 174, 5 },
! 109923: { 225, 5 },
! 109924: { 225, 4 },
! 109925: { 226, 2 },
! 109926: { 226, 0 },
1.2 misho 109927: { 224, 1 },
1.2.2.1 ! misho 109928: { 224, 0 },
! 109929: { 220, 1 },
! 109930: { 220, 0 },
! 109931: { 215, 3 },
! 109932: { 215, 1 },
1.2 misho 109933: { 147, 11 },
1.2.2.1 ! misho 109934: { 227, 1 },
! 109935: { 227, 0 },
! 109936: { 178, 0 },
! 109937: { 178, 3 },
1.2 misho 109938: { 187, 5 },
109939: { 187, 3 },
1.2.2.1 ! misho 109940: { 228, 0 },
! 109941: { 228, 2 },
1.2 misho 109942: { 147, 4 },
109943: { 147, 1 },
109944: { 147, 2 },
109945: { 147, 3 },
109946: { 147, 5 },
109947: { 147, 6 },
109948: { 147, 5 },
109949: { 147, 6 },
1.2.2.1 ! misho 109950: { 229, 1 },
! 109951: { 229, 1 },
! 109952: { 229, 1 },
! 109953: { 229, 1 },
! 109954: { 229, 1 },
1.2 misho 109955: { 170, 2 },
1.2.2.1 ! misho 109956: { 170, 1 },
1.2 misho 109957: { 171, 2 },
1.2.2.1 ! misho 109958: { 230, 1 },
1.2 misho 109959: { 147, 5 },
1.2.2.1 ! misho 109960: { 231, 11 },
! 109961: { 233, 1 },
! 109962: { 233, 1 },
! 109963: { 233, 2 },
! 109964: { 233, 0 },
! 109965: { 234, 1 },
! 109966: { 234, 1 },
1.2 misho 109967: { 234, 3 },
1.2.2.1 ! misho 109968: { 235, 0 },
! 109969: { 235, 3 },
! 109970: { 236, 0 },
! 109971: { 236, 2 },
! 109972: { 232, 3 },
! 109973: { 232, 2 },
! 109974: { 238, 1 },
! 109975: { 238, 3 },
! 109976: { 239, 0 },
! 109977: { 239, 3 },
! 109978: { 239, 2 },
! 109979: { 237, 7 },
! 109980: { 237, 5 },
! 109981: { 237, 5 },
! 109982: { 237, 5 },
! 109983: { 237, 1 },
! 109984: { 174, 4 },
! 109985: { 174, 6 },
1.2 misho 109986: { 191, 1 },
109987: { 191, 1 },
109988: { 191, 1 },
109989: { 147, 4 },
109990: { 147, 6 },
109991: { 147, 3 },
1.2.2.1 ! misho 109992: { 241, 0 },
! 109993: { 241, 2 },
! 109994: { 240, 1 },
! 109995: { 240, 0 },
1.2 misho 109996: { 147, 1 },
109997: { 147, 3 },
109998: { 147, 1 },
109999: { 147, 3 },
110000: { 147, 6 },
110001: { 147, 6 },
1.2.2.1 ! misho 110002: { 242, 1 },
! 110003: { 243, 0 },
! 110004: { 243, 1 },
1.2 misho 110005: { 147, 1 },
110006: { 147, 4 },
1.2.2.1 ! misho 110007: { 244, 8 },
! 110008: { 245, 1 },
! 110009: { 245, 3 },
! 110010: { 246, 0 },
! 110011: { 246, 2 },
1.2 misho 110012: { 247, 1 },
110013: { 247, 3 },
1.2.2.1 ! misho 110014: { 248, 1 },
! 110015: { 249, 0 },
! 110016: { 249, 4 },
! 110017: { 249, 2 },
1.2 misho 110018: };
110019:
110020: static void yy_accept(yyParser*); /* Forward Declaration */
110021:
110022: /*
110023: ** Perform a reduce action and the shift that must immediately
110024: ** follow the reduce.
110025: */
110026: static void yy_reduce(
110027: yyParser *yypParser, /* The parser */
110028: int yyruleno /* Number of the rule by which to reduce */
110029: ){
110030: int yygoto; /* The next state */
110031: int yyact; /* The next action */
110032: YYMINORTYPE yygotominor; /* The LHS of the rule reduced */
110033: yyStackEntry *yymsp; /* The top of the parser's stack */
110034: int yysize; /* Amount to pop the stack */
110035: sqlite3ParserARG_FETCH;
110036: yymsp = &yypParser->yystack[yypParser->yyidx];
110037: #ifndef NDEBUG
110038: if( yyTraceFILE && yyruleno>=0
110039: && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){
110040: fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt,
110041: yyRuleName[yyruleno]);
110042: }
110043: #endif /* NDEBUG */
110044:
110045: /* Silence complaints from purify about yygotominor being uninitialized
110046: ** in some cases when it is copied into the stack after the following
110047: ** switch. yygotominor is uninitialized when a rule reduces that does
110048: ** not set the value of its left-hand side nonterminal. Leaving the
110049: ** value of the nonterminal uninitialized is utterly harmless as long
110050: ** as the value is never used. So really the only thing this code
110051: ** accomplishes is to quieten purify.
110052: **
110053: ** 2007-01-16: The wireshark project (www.wireshark.org) reports that
110054: ** without this code, their parser segfaults. I'm not sure what there
110055: ** parser is doing to make this happen. This is the second bug report
110056: ** from wireshark this week. Clearly they are stressing Lemon in ways
110057: ** that it has not been previously stressed... (SQLite ticket #2172)
110058: */
110059: /*memset(&yygotominor, 0, sizeof(yygotominor));*/
110060: yygotominor = yyzerominor;
110061:
110062:
110063: switch( yyruleno ){
110064: /* Beginning here are the reduction cases. A typical example
110065: ** follows:
110066: ** case 0:
110067: ** #line <lineno> <grammarfile>
110068: ** { ... } // User supplied code
110069: ** #line <lineno> <thisfile>
110070: ** break;
110071: */
110072: case 5: /* explain ::= */
110073: { sqlite3BeginParse(pParse, 0); }
110074: break;
110075: case 6: /* explain ::= EXPLAIN */
110076: { sqlite3BeginParse(pParse, 1); }
110077: break;
110078: case 7: /* explain ::= EXPLAIN QUERY PLAN */
110079: { sqlite3BeginParse(pParse, 2); }
110080: break;
110081: case 8: /* cmdx ::= cmd */
110082: { sqlite3FinishCoding(pParse); }
110083: break;
110084: case 9: /* cmd ::= BEGIN transtype trans_opt */
1.2.2.1 ! misho 110085: {sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy392);}
1.2 misho 110086: break;
110087: case 13: /* transtype ::= */
1.2.2.1 ! misho 110088: {yygotominor.yy392 = TK_DEFERRED;}
1.2 misho 110089: break;
110090: case 14: /* transtype ::= DEFERRED */
110091: case 15: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==15);
110092: case 16: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==16);
110093: case 115: /* multiselect_op ::= UNION */ yytestcase(yyruleno==115);
110094: case 117: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==117);
1.2.2.1 ! misho 110095: {yygotominor.yy392 = yymsp[0].major;}
1.2 misho 110096: break;
110097: case 17: /* cmd ::= COMMIT trans_opt */
110098: case 18: /* cmd ::= END trans_opt */ yytestcase(yyruleno==18);
110099: {sqlite3CommitTransaction(pParse);}
110100: break;
110101: case 19: /* cmd ::= ROLLBACK trans_opt */
110102: {sqlite3RollbackTransaction(pParse);}
110103: break;
110104: case 22: /* cmd ::= SAVEPOINT nm */
110105: {
110106: sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0);
110107: }
110108: break;
110109: case 23: /* cmd ::= RELEASE savepoint_opt nm */
110110: {
110111: sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0);
110112: }
110113: break;
110114: case 24: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */
110115: {
110116: sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0);
110117: }
110118: break;
110119: case 26: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */
110120: {
1.2.2.1 ! misho 110121: sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy392,0,0,yymsp[-2].minor.yy392);
1.2 misho 110122: }
110123: break;
110124: case 27: /* createkw ::= CREATE */
110125: {
110126: pParse->db->lookaside.bEnabled = 0;
110127: yygotominor.yy0 = yymsp[0].minor.yy0;
110128: }
110129: break;
110130: case 28: /* ifnotexists ::= */
110131: case 31: /* temp ::= */ yytestcase(yyruleno==31);
1.2.2.1 ! misho 110132: case 69: /* autoinc ::= */ yytestcase(yyruleno==69);
! 110133: case 82: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ yytestcase(yyruleno==82);
! 110134: case 84: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==84);
! 110135: case 86: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ yytestcase(yyruleno==86);
1.2 misho 110136: case 98: /* defer_subclause_opt ::= */ yytestcase(yyruleno==98);
110137: case 109: /* ifexists ::= */ yytestcase(yyruleno==109);
110138: case 120: /* distinct ::= ALL */ yytestcase(yyruleno==120);
110139: case 121: /* distinct ::= */ yytestcase(yyruleno==121);
1.2.2.1 ! misho 110140: case 221: /* between_op ::= BETWEEN */ yytestcase(yyruleno==221);
! 110141: case 224: /* in_op ::= IN */ yytestcase(yyruleno==224);
! 110142: {yygotominor.yy392 = 0;}
1.2 misho 110143: break;
110144: case 29: /* ifnotexists ::= IF NOT EXISTS */
110145: case 30: /* temp ::= TEMP */ yytestcase(yyruleno==30);
1.2.2.1 ! misho 110146: case 70: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==70);
! 110147: case 85: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ yytestcase(yyruleno==85);
1.2 misho 110148: case 108: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==108);
110149: case 119: /* distinct ::= DISTINCT */ yytestcase(yyruleno==119);
1.2.2.1 ! misho 110150: case 222: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==222);
! 110151: case 225: /* in_op ::= NOT IN */ yytestcase(yyruleno==225);
! 110152: {yygotominor.yy392 = 1;}
1.2 misho 110153: break;
110154: case 32: /* create_table_args ::= LP columnlist conslist_opt RP */
110155: {
110156: sqlite3EndTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0);
110157: }
110158: break;
110159: case 33: /* create_table_args ::= AS select */
110160: {
1.2.2.1 ! misho 110161: sqlite3EndTable(pParse,0,0,yymsp[0].minor.yy159);
! 110162: sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy159);
1.2 misho 110163: }
110164: break;
110165: case 36: /* column ::= columnid type carglist */
110166: {
110167: yygotominor.yy0.z = yymsp[-2].minor.yy0.z;
110168: yygotominor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-2].minor.yy0.z) + pParse->sLastToken.n;
110169: }
110170: break;
110171: case 37: /* columnid ::= nm */
110172: {
110173: sqlite3AddColumn(pParse,&yymsp[0].minor.yy0);
110174: yygotominor.yy0 = yymsp[0].minor.yy0;
1.2.2.1 ! misho 110175: pParse->constraintName.n = 0;
1.2 misho 110176: }
110177: break;
110178: case 38: /* id ::= ID */
110179: case 39: /* id ::= INDEXED */ yytestcase(yyruleno==39);
110180: case 40: /* ids ::= ID|STRING */ yytestcase(yyruleno==40);
110181: case 41: /* nm ::= id */ yytestcase(yyruleno==41);
110182: case 42: /* nm ::= STRING */ yytestcase(yyruleno==42);
110183: case 43: /* nm ::= JOIN_KW */ yytestcase(yyruleno==43);
110184: case 46: /* typetoken ::= typename */ yytestcase(yyruleno==46);
110185: case 49: /* typename ::= ids */ yytestcase(yyruleno==49);
110186: case 127: /* as ::= AS nm */ yytestcase(yyruleno==127);
110187: case 128: /* as ::= ids */ yytestcase(yyruleno==128);
110188: case 138: /* dbnm ::= DOT nm */ yytestcase(yyruleno==138);
110189: case 147: /* indexed_opt ::= INDEXED BY nm */ yytestcase(yyruleno==147);
1.2.2.1 ! misho 110190: case 250: /* collate ::= COLLATE ids */ yytestcase(yyruleno==250);
! 110191: case 259: /* nmnum ::= plus_num */ yytestcase(yyruleno==259);
! 110192: case 260: /* nmnum ::= nm */ yytestcase(yyruleno==260);
! 110193: case 261: /* nmnum ::= ON */ yytestcase(yyruleno==261);
! 110194: case 262: /* nmnum ::= DELETE */ yytestcase(yyruleno==262);
! 110195: case 263: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==263);
! 110196: case 264: /* plus_num ::= PLUS number */ yytestcase(yyruleno==264);
! 110197: case 265: /* plus_num ::= number */ yytestcase(yyruleno==265);
1.2 misho 110198: case 266: /* minus_num ::= MINUS number */ yytestcase(yyruleno==266);
110199: case 267: /* number ::= INTEGER|FLOAT */ yytestcase(yyruleno==267);
1.2.2.1 ! misho 110200: case 283: /* trnm ::= nm */ yytestcase(yyruleno==283);
1.2 misho 110201: {yygotominor.yy0 = yymsp[0].minor.yy0;}
110202: break;
110203: case 45: /* type ::= typetoken */
110204: {sqlite3AddColumnType(pParse,&yymsp[0].minor.yy0);}
110205: break;
110206: case 47: /* typetoken ::= typename LP signed RP */
110207: {
110208: yygotominor.yy0.z = yymsp[-3].minor.yy0.z;
110209: yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z);
110210: }
110211: break;
110212: case 48: /* typetoken ::= typename LP signed COMMA signed RP */
110213: {
110214: yygotominor.yy0.z = yymsp[-5].minor.yy0.z;
110215: yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z);
110216: }
110217: break;
110218: case 50: /* typename ::= typename ids */
110219: {yygotominor.yy0.z=yymsp[-1].minor.yy0.z; yygotominor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);}
110220: break;
1.2.2.1 ! misho 110221: case 55: /* ccons ::= CONSTRAINT nm */
! 110222: case 93: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==93);
! 110223: {pParse->constraintName = yymsp[0].minor.yy0;}
! 110224: break;
! 110225: case 56: /* ccons ::= DEFAULT term */
! 110226: case 58: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==58);
! 110227: {sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy342);}
1.2 misho 110228: break;
1.2.2.1 ! misho 110229: case 57: /* ccons ::= DEFAULT LP expr RP */
! 110230: {sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy342);}
1.2 misho 110231: break;
1.2.2.1 ! misho 110232: case 59: /* ccons ::= DEFAULT MINUS term */
1.2 misho 110233: {
110234: ExprSpan v;
1.2.2.1 ! misho 110235: v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy342.pExpr, 0, 0);
1.2 misho 110236: v.zStart = yymsp[-1].minor.yy0.z;
1.2.2.1 ! misho 110237: v.zEnd = yymsp[0].minor.yy342.zEnd;
1.2 misho 110238: sqlite3AddDefaultValue(pParse,&v);
110239: }
110240: break;
1.2.2.1 ! misho 110241: case 60: /* ccons ::= DEFAULT id */
1.2 misho 110242: {
110243: ExprSpan v;
110244: spanExpr(&v, pParse, TK_STRING, &yymsp[0].minor.yy0);
110245: sqlite3AddDefaultValue(pParse,&v);
110246: }
110247: break;
1.2.2.1 ! misho 110248: case 62: /* ccons ::= NOT NULL onconf */
! 110249: {sqlite3AddNotNull(pParse, yymsp[0].minor.yy392);}
1.2 misho 110250: break;
1.2.2.1 ! misho 110251: case 63: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */
! 110252: {sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy392,yymsp[0].minor.yy392,yymsp[-2].minor.yy392);}
1.2 misho 110253: break;
1.2.2.1 ! misho 110254: case 64: /* ccons ::= UNIQUE onconf */
! 110255: {sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy392,0,0,0,0);}
1.2 misho 110256: break;
1.2.2.1 ! misho 110257: case 65: /* ccons ::= CHECK LP expr RP */
! 110258: {sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy342.pExpr);}
1.2 misho 110259: break;
1.2.2.1 ! misho 110260: case 66: /* ccons ::= REFERENCES nm idxlist_opt refargs */
! 110261: {sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy442,yymsp[0].minor.yy392);}
1.2 misho 110262: break;
1.2.2.1 ! misho 110263: case 67: /* ccons ::= defer_subclause */
! 110264: {sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy392);}
1.2 misho 110265: break;
1.2.2.1 ! misho 110266: case 68: /* ccons ::= COLLATE ids */
1.2 misho 110267: {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);}
110268: break;
1.2.2.1 ! misho 110269: case 71: /* refargs ::= */
! 110270: { yygotominor.yy392 = OE_None*0x0101; /* EV: R-19803-45884 */}
1.2 misho 110271: break;
1.2.2.1 ! misho 110272: case 72: /* refargs ::= refargs refarg */
! 110273: { yygotominor.yy392 = (yymsp[-1].minor.yy392 & ~yymsp[0].minor.yy207.mask) | yymsp[0].minor.yy207.value; }
1.2 misho 110274: break;
1.2.2.1 ! misho 110275: case 73: /* refarg ::= MATCH nm */
! 110276: case 74: /* refarg ::= ON INSERT refact */ yytestcase(yyruleno==74);
! 110277: { yygotominor.yy207.value = 0; yygotominor.yy207.mask = 0x000000; }
1.2 misho 110278: break;
1.2.2.1 ! misho 110279: case 75: /* refarg ::= ON DELETE refact */
! 110280: { yygotominor.yy207.value = yymsp[0].minor.yy392; yygotominor.yy207.mask = 0x0000ff; }
1.2 misho 110281: break;
1.2.2.1 ! misho 110282: case 76: /* refarg ::= ON UPDATE refact */
! 110283: { yygotominor.yy207.value = yymsp[0].minor.yy392<<8; yygotominor.yy207.mask = 0x00ff00; }
1.2 misho 110284: break;
1.2.2.1 ! misho 110285: case 77: /* refact ::= SET NULL */
! 110286: { yygotominor.yy392 = OE_SetNull; /* EV: R-33326-45252 */}
1.2 misho 110287: break;
1.2.2.1 ! misho 110288: case 78: /* refact ::= SET DEFAULT */
! 110289: { yygotominor.yy392 = OE_SetDflt; /* EV: R-33326-45252 */}
1.2 misho 110290: break;
1.2.2.1 ! misho 110291: case 79: /* refact ::= CASCADE */
! 110292: { yygotominor.yy392 = OE_Cascade; /* EV: R-33326-45252 */}
1.2 misho 110293: break;
1.2.2.1 ! misho 110294: case 80: /* refact ::= RESTRICT */
! 110295: { yygotominor.yy392 = OE_Restrict; /* EV: R-33326-45252 */}
1.2 misho 110296: break;
1.2.2.1 ! misho 110297: case 81: /* refact ::= NO ACTION */
! 110298: { yygotominor.yy392 = OE_None; /* EV: R-33326-45252 */}
1.2 misho 110299: break;
1.2.2.1 ! misho 110300: case 83: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */
1.2 misho 110301: case 99: /* defer_subclause_opt ::= defer_subclause */ yytestcase(yyruleno==99);
110302: case 101: /* onconf ::= ON CONFLICT resolvetype */ yytestcase(yyruleno==101);
110303: case 104: /* resolvetype ::= raisetype */ yytestcase(yyruleno==104);
1.2.2.1 ! misho 110304: {yygotominor.yy392 = yymsp[0].minor.yy392;}
1.2 misho 110305: break;
1.2.2.1 ! misho 110306: case 87: /* conslist_opt ::= */
1.2 misho 110307: {yygotominor.yy0.n = 0; yygotominor.yy0.z = 0;}
110308: break;
1.2.2.1 ! misho 110309: case 88: /* conslist_opt ::= COMMA conslist */
1.2 misho 110310: {yygotominor.yy0 = yymsp[-1].minor.yy0;}
110311: break;
1.2.2.1 ! misho 110312: case 91: /* tconscomma ::= COMMA */
! 110313: {pParse->constraintName.n = 0;}
! 110314: break;
1.2 misho 110315: case 94: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */
1.2.2.1 ! misho 110316: {sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy442,yymsp[0].minor.yy392,yymsp[-2].minor.yy392,0);}
1.2 misho 110317: break;
110318: case 95: /* tcons ::= UNIQUE LP idxlist RP onconf */
1.2.2.1 ! misho 110319: {sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy442,yymsp[0].minor.yy392,0,0,0,0);}
1.2 misho 110320: break;
110321: case 96: /* tcons ::= CHECK LP expr RP onconf */
1.2.2.1 ! misho 110322: {sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy342.pExpr);}
1.2 misho 110323: break;
110324: case 97: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */
110325: {
1.2.2.1 ! misho 110326: sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy442, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy442, yymsp[-1].minor.yy392);
! 110327: sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy392);
1.2 misho 110328: }
110329: break;
110330: case 100: /* onconf ::= */
1.2.2.1 ! misho 110331: {yygotominor.yy392 = OE_Default;}
1.2 misho 110332: break;
110333: case 102: /* orconf ::= */
1.2.2.1 ! misho 110334: {yygotominor.yy258 = OE_Default;}
1.2 misho 110335: break;
110336: case 103: /* orconf ::= OR resolvetype */
1.2.2.1 ! misho 110337: {yygotominor.yy258 = (u8)yymsp[0].minor.yy392;}
1.2 misho 110338: break;
110339: case 105: /* resolvetype ::= IGNORE */
1.2.2.1 ! misho 110340: {yygotominor.yy392 = OE_Ignore;}
1.2 misho 110341: break;
110342: case 106: /* resolvetype ::= REPLACE */
1.2.2.1 ! misho 110343: {yygotominor.yy392 = OE_Replace;}
1.2 misho 110344: break;
110345: case 107: /* cmd ::= DROP TABLE ifexists fullname */
110346: {
1.2.2.1 ! misho 110347: sqlite3DropTable(pParse, yymsp[0].minor.yy347, 0, yymsp[-1].minor.yy392);
1.2 misho 110348: }
110349: break;
110350: case 110: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select */
110351: {
1.2.2.1 ! misho 110352: sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, yymsp[0].minor.yy159, yymsp[-6].minor.yy392, yymsp[-4].minor.yy392);
1.2 misho 110353: }
110354: break;
110355: case 111: /* cmd ::= DROP VIEW ifexists fullname */
110356: {
1.2.2.1 ! misho 110357: sqlite3DropTable(pParse, yymsp[0].minor.yy347, 1, yymsp[-1].minor.yy392);
1.2 misho 110358: }
110359: break;
110360: case 112: /* cmd ::= select */
110361: {
110362: SelectDest dest = {SRT_Output, 0, 0, 0, 0};
1.2.2.1 ! misho 110363: sqlite3Select(pParse, yymsp[0].minor.yy159, &dest);
1.2 misho 110364: sqlite3ExplainBegin(pParse->pVdbe);
1.2.2.1 ! misho 110365: sqlite3ExplainSelect(pParse->pVdbe, yymsp[0].minor.yy159);
1.2 misho 110366: sqlite3ExplainFinish(pParse->pVdbe);
1.2.2.1 ! misho 110367: sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy159);
1.2 misho 110368: }
110369: break;
110370: case 113: /* select ::= oneselect */
1.2.2.1 ! misho 110371: {yygotominor.yy159 = yymsp[0].minor.yy159;}
1.2 misho 110372: break;
110373: case 114: /* select ::= select multiselect_op oneselect */
110374: {
1.2.2.1 ! misho 110375: if( yymsp[0].minor.yy159 ){
! 110376: yymsp[0].minor.yy159->op = (u8)yymsp[-1].minor.yy392;
! 110377: yymsp[0].minor.yy159->pPrior = yymsp[-2].minor.yy159;
1.2 misho 110378: }else{
1.2.2.1 ! misho 110379: sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy159);
1.2 misho 110380: }
1.2.2.1 ! misho 110381: yygotominor.yy159 = yymsp[0].minor.yy159;
1.2 misho 110382: }
110383: break;
110384: case 116: /* multiselect_op ::= UNION ALL */
1.2.2.1 ! misho 110385: {yygotominor.yy392 = TK_ALL;}
1.2 misho 110386: break;
110387: case 118: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */
110388: {
1.2.2.1 ! misho 110389: yygotominor.yy159 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy442,yymsp[-5].minor.yy347,yymsp[-4].minor.yy122,yymsp[-3].minor.yy442,yymsp[-2].minor.yy122,yymsp[-1].minor.yy442,yymsp[-7].minor.yy392,yymsp[0].minor.yy64.pLimit,yymsp[0].minor.yy64.pOffset);
1.2 misho 110390: }
110391: break;
110392: case 122: /* sclp ::= selcollist COMMA */
1.2.2.1 ! misho 110393: case 246: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==246);
! 110394: {yygotominor.yy442 = yymsp[-1].minor.yy442;}
1.2 misho 110395: break;
110396: case 123: /* sclp ::= */
110397: case 151: /* orderby_opt ::= */ yytestcase(yyruleno==151);
1.2.2.1 ! misho 110398: case 158: /* groupby_opt ::= */ yytestcase(yyruleno==158);
! 110399: case 239: /* exprlist ::= */ yytestcase(yyruleno==239);
! 110400: case 245: /* idxlist_opt ::= */ yytestcase(yyruleno==245);
! 110401: {yygotominor.yy442 = 0;}
1.2 misho 110402: break;
110403: case 124: /* selcollist ::= sclp expr as */
110404: {
1.2.2.1 ! misho 110405: yygotominor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy442, yymsp[-1].minor.yy342.pExpr);
! 110406: if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy442, &yymsp[0].minor.yy0, 1);
! 110407: sqlite3ExprListSetSpan(pParse,yygotominor.yy442,&yymsp[-1].minor.yy342);
1.2 misho 110408: }
110409: break;
110410: case 125: /* selcollist ::= sclp STAR */
110411: {
110412: Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
1.2.2.1 ! misho 110413: yygotominor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy442, p);
1.2 misho 110414: }
110415: break;
110416: case 126: /* selcollist ::= sclp nm DOT STAR */
110417: {
110418: Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &yymsp[0].minor.yy0);
110419: Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
110420: Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
1.2.2.1 ! misho 110421: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy442, pDot);
1.2 misho 110422: }
110423: break;
110424: case 129: /* as ::= */
110425: {yygotominor.yy0.n = 0;}
110426: break;
110427: case 130: /* from ::= */
1.2.2.1 ! misho 110428: {yygotominor.yy347 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy347));}
1.2 misho 110429: break;
110430: case 131: /* from ::= FROM seltablist */
110431: {
1.2.2.1 ! misho 110432: yygotominor.yy347 = yymsp[0].minor.yy347;
! 110433: sqlite3SrcListShiftJoinType(yygotominor.yy347);
1.2 misho 110434: }
110435: break;
110436: case 132: /* stl_prefix ::= seltablist joinop */
110437: {
1.2.2.1 ! misho 110438: yygotominor.yy347 = yymsp[-1].minor.yy347;
! 110439: if( ALWAYS(yygotominor.yy347 && yygotominor.yy347->nSrc>0) ) yygotominor.yy347->a[yygotominor.yy347->nSrc-1].jointype = (u8)yymsp[0].minor.yy392;
1.2 misho 110440: }
110441: break;
110442: case 133: /* stl_prefix ::= */
1.2.2.1 ! misho 110443: {yygotominor.yy347 = 0;}
1.2 misho 110444: break;
110445: case 134: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */
110446: {
1.2.2.1 ! misho 110447: yygotominor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
! 110448: sqlite3SrcListIndexedBy(pParse, yygotominor.yy347, &yymsp[-2].minor.yy0);
1.2 misho 110449: }
110450: break;
110451: case 135: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */
110452: {
1.2.2.1 ! misho 110453: yygotominor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy159,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
1.2 misho 110454: }
110455: break;
110456: case 136: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */
110457: {
1.2.2.1 ! misho 110458: if( yymsp[-6].minor.yy347==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy122==0 && yymsp[0].minor.yy180==0 ){
! 110459: yygotominor.yy347 = yymsp[-4].minor.yy347;
1.2 misho 110460: }else{
110461: Select *pSubquery;
1.2.2.1 ! misho 110462: sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy347);
! 110463: pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy347,0,0,0,0,0,0,0);
! 110464: yygotominor.yy347 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy347,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy122,yymsp[0].minor.yy180);
1.2 misho 110465: }
110466: }
110467: break;
110468: case 137: /* dbnm ::= */
110469: case 146: /* indexed_opt ::= */ yytestcase(yyruleno==146);
110470: {yygotominor.yy0.z=0; yygotominor.yy0.n=0;}
110471: break;
110472: case 139: /* fullname ::= nm dbnm */
1.2.2.1 ! misho 110473: {yygotominor.yy347 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);}
1.2 misho 110474: break;
110475: case 140: /* joinop ::= COMMA|JOIN */
1.2.2.1 ! misho 110476: { yygotominor.yy392 = JT_INNER; }
1.2 misho 110477: break;
110478: case 141: /* joinop ::= JOIN_KW JOIN */
1.2.2.1 ! misho 110479: { yygotominor.yy392 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); }
1.2 misho 110480: break;
110481: case 142: /* joinop ::= JOIN_KW nm JOIN */
1.2.2.1 ! misho 110482: { yygotominor.yy392 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); }
1.2 misho 110483: break;
110484: case 143: /* joinop ::= JOIN_KW nm nm JOIN */
1.2.2.1 ! misho 110485: { yygotominor.yy392 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); }
1.2 misho 110486: break;
110487: case 144: /* on_opt ::= ON expr */
1.2.2.1 ! misho 110488: case 161: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==161);
! 110489: case 168: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==168);
! 110490: case 234: /* case_else ::= ELSE expr */ yytestcase(yyruleno==234);
! 110491: case 236: /* case_operand ::= expr */ yytestcase(yyruleno==236);
! 110492: {yygotominor.yy122 = yymsp[0].minor.yy342.pExpr;}
1.2 misho 110493: break;
110494: case 145: /* on_opt ::= */
1.2.2.1 ! misho 110495: case 160: /* having_opt ::= */ yytestcase(yyruleno==160);
! 110496: case 167: /* where_opt ::= */ yytestcase(yyruleno==167);
! 110497: case 235: /* case_else ::= */ yytestcase(yyruleno==235);
! 110498: case 237: /* case_operand ::= */ yytestcase(yyruleno==237);
! 110499: {yygotominor.yy122 = 0;}
1.2 misho 110500: break;
110501: case 148: /* indexed_opt ::= NOT INDEXED */
110502: {yygotominor.yy0.z=0; yygotominor.yy0.n=1;}
110503: break;
110504: case 149: /* using_opt ::= USING LP inscollist RP */
1.2.2.1 ! misho 110505: case 180: /* inscollist_opt ::= LP inscollist RP */ yytestcase(yyruleno==180);
! 110506: {yygotominor.yy180 = yymsp[-1].minor.yy180;}
1.2 misho 110507: break;
110508: case 150: /* using_opt ::= */
1.2.2.1 ! misho 110509: case 179: /* inscollist_opt ::= */ yytestcase(yyruleno==179);
! 110510: {yygotominor.yy180 = 0;}
1.2 misho 110511: break;
110512: case 152: /* orderby_opt ::= ORDER BY sortlist */
1.2.2.1 ! misho 110513: case 159: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==159);
! 110514: case 238: /* exprlist ::= nexprlist */ yytestcase(yyruleno==238);
! 110515: {yygotominor.yy442 = yymsp[0].minor.yy442;}
1.2 misho 110516: break;
1.2.2.1 ! misho 110517: case 153: /* sortlist ::= sortlist COMMA expr sortorder */
1.2 misho 110518: {
1.2.2.1 ! misho 110519: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy442,yymsp[-1].minor.yy342.pExpr);
! 110520: if( yygotominor.yy442 ) yygotominor.yy442->a[yygotominor.yy442->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy392;
1.2 misho 110521: }
110522: break;
1.2.2.1 ! misho 110523: case 154: /* sortlist ::= expr sortorder */
1.2 misho 110524: {
1.2.2.1 ! misho 110525: yygotominor.yy442 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy342.pExpr);
! 110526: if( yygotominor.yy442 && ALWAYS(yygotominor.yy442->a) ) yygotominor.yy442->a[0].sortOrder = (u8)yymsp[0].minor.yy392;
1.2 misho 110527: }
110528: break;
1.2.2.1 ! misho 110529: case 155: /* sortorder ::= ASC */
! 110530: case 157: /* sortorder ::= */ yytestcase(yyruleno==157);
! 110531: {yygotominor.yy392 = SQLITE_SO_ASC;}
1.2 misho 110532: break;
1.2.2.1 ! misho 110533: case 156: /* sortorder ::= DESC */
! 110534: {yygotominor.yy392 = SQLITE_SO_DESC;}
1.2 misho 110535: break;
1.2.2.1 ! misho 110536: case 162: /* limit_opt ::= */
! 110537: {yygotominor.yy64.pLimit = 0; yygotominor.yy64.pOffset = 0;}
1.2 misho 110538: break;
1.2.2.1 ! misho 110539: case 163: /* limit_opt ::= LIMIT expr */
! 110540: {yygotominor.yy64.pLimit = yymsp[0].minor.yy342.pExpr; yygotominor.yy64.pOffset = 0;}
1.2 misho 110541: break;
1.2.2.1 ! misho 110542: case 164: /* limit_opt ::= LIMIT expr OFFSET expr */
! 110543: {yygotominor.yy64.pLimit = yymsp[-2].minor.yy342.pExpr; yygotominor.yy64.pOffset = yymsp[0].minor.yy342.pExpr;}
1.2 misho 110544: break;
1.2.2.1 ! misho 110545: case 165: /* limit_opt ::= LIMIT expr COMMA expr */
! 110546: {yygotominor.yy64.pOffset = yymsp[-2].minor.yy342.pExpr; yygotominor.yy64.pLimit = yymsp[0].minor.yy342.pExpr;}
1.2 misho 110547: break;
1.2.2.1 ! misho 110548: case 166: /* cmd ::= DELETE FROM fullname indexed_opt where_opt */
1.2 misho 110549: {
1.2.2.1 ! misho 110550: sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy347, &yymsp[-1].minor.yy0);
! 110551: sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy347,yymsp[0].minor.yy122);
1.2 misho 110552: }
110553: break;
1.2.2.1 ! misho 110554: case 169: /* cmd ::= UPDATE orconf fullname indexed_opt SET setlist where_opt */
1.2 misho 110555: {
1.2.2.1 ! misho 110556: sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy347, &yymsp[-3].minor.yy0);
! 110557: sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy442,"set list");
! 110558: sqlite3Update(pParse,yymsp[-4].minor.yy347,yymsp[-1].minor.yy442,yymsp[0].minor.yy122,yymsp[-5].minor.yy258);
1.2 misho 110559: }
110560: break;
1.2.2.1 ! misho 110561: case 170: /* setlist ::= setlist COMMA nm EQ expr */
1.2 misho 110562: {
1.2.2.1 ! misho 110563: yygotominor.yy442 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy442, yymsp[0].minor.yy342.pExpr);
! 110564: sqlite3ExprListSetName(pParse, yygotominor.yy442, &yymsp[-2].minor.yy0, 1);
1.2 misho 110565: }
110566: break;
1.2.2.1 ! misho 110567: case 171: /* setlist ::= nm EQ expr */
1.2 misho 110568: {
1.2.2.1 ! misho 110569: yygotominor.yy442 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy342.pExpr);
! 110570: sqlite3ExprListSetName(pParse, yygotominor.yy442, &yymsp[-2].minor.yy0, 1);
1.2 misho 110571: }
110572: break;
1.2.2.1 ! misho 110573: case 172: /* cmd ::= insert_cmd INTO fullname inscollist_opt valuelist */
! 110574: {sqlite3Insert(pParse, yymsp[-2].minor.yy347, yymsp[0].minor.yy487.pList, yymsp[0].minor.yy487.pSelect, yymsp[-1].minor.yy180, yymsp[-4].minor.yy258);}
1.2 misho 110575: break;
1.2.2.1 ! misho 110576: case 173: /* cmd ::= insert_cmd INTO fullname inscollist_opt select */
! 110577: {sqlite3Insert(pParse, yymsp[-2].minor.yy347, 0, yymsp[0].minor.yy159, yymsp[-1].minor.yy180, yymsp[-4].minor.yy258);}
1.2 misho 110578: break;
1.2.2.1 ! misho 110579: case 174: /* cmd ::= insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */
! 110580: {sqlite3Insert(pParse, yymsp[-3].minor.yy347, 0, 0, yymsp[-2].minor.yy180, yymsp[-5].minor.yy258);}
1.2 misho 110581: break;
1.2.2.1 ! misho 110582: case 175: /* insert_cmd ::= INSERT orconf */
! 110583: {yygotominor.yy258 = yymsp[0].minor.yy258;}
1.2 misho 110584: break;
1.2.2.1 ! misho 110585: case 176: /* insert_cmd ::= REPLACE */
! 110586: {yygotominor.yy258 = OE_Replace;}
1.2 misho 110587: break;
1.2.2.1 ! misho 110588: case 177: /* valuelist ::= VALUES LP nexprlist RP */
! 110589: {
! 110590: yygotominor.yy487.pList = yymsp[-1].minor.yy442;
! 110591: yygotominor.yy487.pSelect = 0;
! 110592: }
1.2 misho 110593: break;
1.2.2.1 ! misho 110594: case 178: /* valuelist ::= valuelist COMMA LP exprlist RP */
! 110595: {
! 110596: Select *pRight = sqlite3SelectNew(pParse, yymsp[-1].minor.yy442, 0, 0, 0, 0, 0, 0, 0, 0);
! 110597: if( yymsp[-4].minor.yy487.pList ){
! 110598: yymsp[-4].minor.yy487.pSelect = sqlite3SelectNew(pParse, yymsp[-4].minor.yy487.pList, 0, 0, 0, 0, 0, 0, 0, 0);
! 110599: yymsp[-4].minor.yy487.pList = 0;
! 110600: }
! 110601: yygotominor.yy487.pList = 0;
! 110602: if( yymsp[-4].minor.yy487.pSelect==0 || pRight==0 ){
! 110603: sqlite3SelectDelete(pParse->db, pRight);
! 110604: sqlite3SelectDelete(pParse->db, yymsp[-4].minor.yy487.pSelect);
! 110605: yygotominor.yy487.pSelect = 0;
! 110606: }else{
! 110607: pRight->op = TK_ALL;
! 110608: pRight->pPrior = yymsp[-4].minor.yy487.pSelect;
! 110609: pRight->selFlags |= SF_Values;
! 110610: pRight->pPrior->selFlags |= SF_Values;
! 110611: yygotominor.yy487.pSelect = pRight;
! 110612: }
! 110613: }
1.2 misho 110614: break;
1.2.2.1 ! misho 110615: case 181: /* inscollist ::= inscollist COMMA nm */
! 110616: {yygotominor.yy180 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy180,&yymsp[0].minor.yy0);}
1.2 misho 110617: break;
1.2.2.1 ! misho 110618: case 182: /* inscollist ::= nm */
! 110619: {yygotominor.yy180 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);}
1.2 misho 110620: break;
1.2.2.1 ! misho 110621: case 183: /* expr ::= term */
! 110622: {yygotominor.yy342 = yymsp[0].minor.yy342;}
1.2 misho 110623: break;
1.2.2.1 ! misho 110624: case 184: /* expr ::= LP expr RP */
! 110625: {yygotominor.yy342.pExpr = yymsp[-1].minor.yy342.pExpr; spanSet(&yygotominor.yy342,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);}
1.2 misho 110626: break;
1.2.2.1 ! misho 110627: case 185: /* term ::= NULL */
! 110628: case 190: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==190);
! 110629: case 191: /* term ::= STRING */ yytestcase(yyruleno==191);
! 110630: {spanExpr(&yygotominor.yy342, pParse, yymsp[0].major, &yymsp[0].minor.yy0);}
1.2 misho 110631: break;
1.2.2.1 ! misho 110632: case 186: /* expr ::= id */
! 110633: case 187: /* expr ::= JOIN_KW */ yytestcase(yyruleno==187);
! 110634: {spanExpr(&yygotominor.yy342, pParse, TK_ID, &yymsp[0].minor.yy0);}
1.2 misho 110635: break;
1.2.2.1 ! misho 110636: case 188: /* expr ::= nm DOT nm */
1.2 misho 110637: {
110638: Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
110639: Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0);
1.2.2.1 ! misho 110640: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
! 110641: spanSet(&yygotominor.yy342,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);
1.2 misho 110642: }
110643: break;
1.2.2.1 ! misho 110644: case 189: /* expr ::= nm DOT nm DOT nm */
1.2 misho 110645: {
110646: Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy0);
110647: Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0);
110648: Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0);
110649: Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
1.2.2.1 ! misho 110650: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
! 110651: spanSet(&yygotominor.yy342,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
1.2 misho 110652: }
110653: break;
1.2.2.1 ! misho 110654: case 192: /* expr ::= REGISTER */
1.2 misho 110655: {
110656: /* When doing a nested parse, one can include terms in an expression
110657: ** that look like this: #1 #2 ... These terms refer to registers
110658: ** in the virtual machine. #N is the N-th register. */
110659: if( pParse->nested==0 ){
110660: sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &yymsp[0].minor.yy0);
1.2.2.1 ! misho 110661: yygotominor.yy342.pExpr = 0;
1.2 misho 110662: }else{
1.2.2.1 ! misho 110663: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &yymsp[0].minor.yy0);
! 110664: if( yygotominor.yy342.pExpr ) sqlite3GetInt32(&yymsp[0].minor.yy0.z[1], &yygotominor.yy342.pExpr->iTable);
1.2 misho 110665: }
1.2.2.1 ! misho 110666: spanSet(&yygotominor.yy342, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
1.2 misho 110667: }
110668: break;
1.2.2.1 ! misho 110669: case 193: /* expr ::= VARIABLE */
1.2 misho 110670: {
1.2.2.1 ! misho 110671: spanExpr(&yygotominor.yy342, pParse, TK_VARIABLE, &yymsp[0].minor.yy0);
! 110672: sqlite3ExprAssignVarNumber(pParse, yygotominor.yy342.pExpr);
! 110673: spanSet(&yygotominor.yy342, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
1.2 misho 110674: }
110675: break;
1.2.2.1 ! misho 110676: case 194: /* expr ::= expr COLLATE ids */
1.2 misho 110677: {
1.2.2.1 ! misho 110678: yygotominor.yy342.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy342.pExpr, &yymsp[0].minor.yy0);
! 110679: yygotominor.yy342.zStart = yymsp[-2].minor.yy342.zStart;
! 110680: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110681: }
110682: break;
1.2.2.1 ! misho 110683: case 195: /* expr ::= CAST LP expr AS typetoken RP */
1.2 misho 110684: {
1.2.2.1 ! misho 110685: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy342.pExpr, 0, &yymsp[-1].minor.yy0);
! 110686: spanSet(&yygotominor.yy342,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0);
1.2 misho 110687: }
110688: break;
1.2.2.1 ! misho 110689: case 196: /* expr ::= ID LP distinct exprlist RP */
1.2 misho 110690: {
1.2.2.1 ! misho 110691: if( yymsp[-1].minor.yy442 && yymsp[-1].minor.yy442->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
1.2 misho 110692: sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0);
110693: }
1.2.2.1 ! misho 110694: yygotominor.yy342.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy442, &yymsp[-4].minor.yy0);
! 110695: spanSet(&yygotominor.yy342,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0);
! 110696: if( yymsp[-2].minor.yy392 && yygotominor.yy342.pExpr ){
! 110697: yygotominor.yy342.pExpr->flags |= EP_Distinct;
1.2 misho 110698: }
110699: }
110700: break;
1.2.2.1 ! misho 110701: case 197: /* expr ::= ID LP STAR RP */
1.2 misho 110702: {
1.2.2.1 ! misho 110703: yygotominor.yy342.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0);
! 110704: spanSet(&yygotominor.yy342,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0);
1.2 misho 110705: }
110706: break;
1.2.2.1 ! misho 110707: case 198: /* term ::= CTIME_KW */
1.2 misho 110708: {
110709: /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
110710: ** treated as functions that return constants */
1.2.2.1 ! misho 110711: yygotominor.yy342.pExpr = sqlite3ExprFunction(pParse, 0,&yymsp[0].minor.yy0);
! 110712: if( yygotominor.yy342.pExpr ){
! 110713: yygotominor.yy342.pExpr->op = TK_CONST_FUNC;
! 110714: }
! 110715: spanSet(&yygotominor.yy342, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0);
! 110716: }
! 110717: break;
! 110718: case 199: /* expr ::= expr AND expr */
! 110719: case 200: /* expr ::= expr OR expr */ yytestcase(yyruleno==200);
! 110720: case 201: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==201);
! 110721: case 202: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==202);
! 110722: case 203: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==203);
! 110723: case 204: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==204);
! 110724: case 205: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==205);
! 110725: case 206: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==206);
! 110726: {spanBinaryExpr(&yygotominor.yy342,pParse,yymsp[-1].major,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy342);}
! 110727: break;
! 110728: case 207: /* likeop ::= LIKE_KW */
! 110729: case 209: /* likeop ::= MATCH */ yytestcase(yyruleno==209);
! 110730: {yygotominor.yy318.eOperator = yymsp[0].minor.yy0; yygotominor.yy318.bNot = 0;}
! 110731: break;
! 110732: case 208: /* likeop ::= NOT LIKE_KW */
! 110733: case 210: /* likeop ::= NOT MATCH */ yytestcase(yyruleno==210);
! 110734: {yygotominor.yy318.eOperator = yymsp[0].minor.yy0; yygotominor.yy318.bNot = 1;}
1.2 misho 110735: break;
1.2.2.1 ! misho 110736: case 211: /* expr ::= expr likeop expr */
1.2 misho 110737: {
110738: ExprList *pList;
1.2.2.1 ! misho 110739: pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy342.pExpr);
! 110740: pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy342.pExpr);
! 110741: yygotominor.yy342.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy318.eOperator);
! 110742: if( yymsp[-1].minor.yy318.bNot ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
! 110743: yygotominor.yy342.zStart = yymsp[-2].minor.yy342.zStart;
! 110744: yygotominor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
! 110745: if( yygotominor.yy342.pExpr ) yygotominor.yy342.pExpr->flags |= EP_InfixFunc;
1.2 misho 110746: }
110747: break;
1.2.2.1 ! misho 110748: case 212: /* expr ::= expr likeop expr ESCAPE expr */
1.2 misho 110749: {
110750: ExprList *pList;
1.2.2.1 ! misho 110751: pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy342.pExpr);
! 110752: pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy342.pExpr);
! 110753: pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy342.pExpr);
! 110754: yygotominor.yy342.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy318.eOperator);
! 110755: if( yymsp[-3].minor.yy318.bNot ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
! 110756: yygotominor.yy342.zStart = yymsp[-4].minor.yy342.zStart;
! 110757: yygotominor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
! 110758: if( yygotominor.yy342.pExpr ) yygotominor.yy342.pExpr->flags |= EP_InfixFunc;
1.2 misho 110759: }
110760: break;
1.2.2.1 ! misho 110761: case 213: /* expr ::= expr ISNULL|NOTNULL */
! 110762: {spanUnaryPostfix(&yygotominor.yy342,pParse,yymsp[0].major,&yymsp[-1].minor.yy342,&yymsp[0].minor.yy0);}
1.2 misho 110763: break;
1.2.2.1 ! misho 110764: case 214: /* expr ::= expr NOT NULL */
! 110765: {spanUnaryPostfix(&yygotominor.yy342,pParse,TK_NOTNULL,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy0);}
1.2 misho 110766: break;
1.2.2.1 ! misho 110767: case 215: /* expr ::= expr IS expr */
1.2 misho 110768: {
1.2.2.1 ! misho 110769: spanBinaryExpr(&yygotominor.yy342,pParse,TK_IS,&yymsp[-2].minor.yy342,&yymsp[0].minor.yy342);
! 110770: binaryToUnaryIfNull(pParse, yymsp[0].minor.yy342.pExpr, yygotominor.yy342.pExpr, TK_ISNULL);
1.2 misho 110771: }
110772: break;
1.2.2.1 ! misho 110773: case 216: /* expr ::= expr IS NOT expr */
1.2 misho 110774: {
1.2.2.1 ! misho 110775: spanBinaryExpr(&yygotominor.yy342,pParse,TK_ISNOT,&yymsp[-3].minor.yy342,&yymsp[0].minor.yy342);
! 110776: binaryToUnaryIfNull(pParse, yymsp[0].minor.yy342.pExpr, yygotominor.yy342.pExpr, TK_NOTNULL);
1.2 misho 110777: }
110778: break;
1.2.2.1 ! misho 110779: case 217: /* expr ::= NOT expr */
! 110780: case 218: /* expr ::= BITNOT expr */ yytestcase(yyruleno==218);
! 110781: {spanUnaryPrefix(&yygotominor.yy342,pParse,yymsp[-1].major,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);}
1.2 misho 110782: break;
1.2.2.1 ! misho 110783: case 219: /* expr ::= MINUS expr */
! 110784: {spanUnaryPrefix(&yygotominor.yy342,pParse,TK_UMINUS,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);}
1.2 misho 110785: break;
1.2.2.1 ! misho 110786: case 220: /* expr ::= PLUS expr */
! 110787: {spanUnaryPrefix(&yygotominor.yy342,pParse,TK_UPLUS,&yymsp[0].minor.yy342,&yymsp[-1].minor.yy0);}
1.2 misho 110788: break;
1.2.2.1 ! misho 110789: case 223: /* expr ::= expr between_op expr AND expr */
1.2 misho 110790: {
1.2.2.1 ! misho 110791: ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy342.pExpr);
! 110792: pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy342.pExpr);
! 110793: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy342.pExpr, 0, 0);
! 110794: if( yygotominor.yy342.pExpr ){
! 110795: yygotominor.yy342.pExpr->x.pList = pList;
1.2 misho 110796: }else{
110797: sqlite3ExprListDelete(pParse->db, pList);
110798: }
1.2.2.1 ! misho 110799: if( yymsp[-3].minor.yy392 ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
! 110800: yygotominor.yy342.zStart = yymsp[-4].minor.yy342.zStart;
! 110801: yygotominor.yy342.zEnd = yymsp[0].minor.yy342.zEnd;
1.2 misho 110802: }
110803: break;
1.2.2.1 ! misho 110804: case 226: /* expr ::= expr in_op LP exprlist RP */
1.2 misho 110805: {
1.2.2.1 ! misho 110806: if( yymsp[-1].minor.yy442==0 ){
1.2 misho 110807: /* Expressions of the form
110808: **
110809: ** expr1 IN ()
110810: ** expr1 NOT IN ()
110811: **
110812: ** simplify to constants 0 (false) and 1 (true), respectively,
110813: ** regardless of the value of expr1.
110814: */
1.2.2.1 ! misho 110815: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[yymsp[-3].minor.yy392]);
! 110816: sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy342.pExpr);
1.2 misho 110817: }else{
1.2.2.1 ! misho 110818: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy342.pExpr, 0, 0);
! 110819: if( yygotominor.yy342.pExpr ){
! 110820: yygotominor.yy342.pExpr->x.pList = yymsp[-1].minor.yy442;
! 110821: sqlite3ExprSetHeight(pParse, yygotominor.yy342.pExpr);
1.2 misho 110822: }else{
1.2.2.1 ! misho 110823: sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy442);
1.2 misho 110824: }
1.2.2.1 ! misho 110825: if( yymsp[-3].minor.yy392 ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
1.2 misho 110826: }
1.2.2.1 ! misho 110827: yygotominor.yy342.zStart = yymsp[-4].minor.yy342.zStart;
! 110828: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110829: }
110830: break;
1.2.2.1 ! misho 110831: case 227: /* expr ::= LP select RP */
1.2 misho 110832: {
1.2.2.1 ! misho 110833: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
! 110834: if( yygotominor.yy342.pExpr ){
! 110835: yygotominor.yy342.pExpr->x.pSelect = yymsp[-1].minor.yy159;
! 110836: ExprSetProperty(yygotominor.yy342.pExpr, EP_xIsSelect);
! 110837: sqlite3ExprSetHeight(pParse, yygotominor.yy342.pExpr);
1.2 misho 110838: }else{
1.2.2.1 ! misho 110839: sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy159);
1.2 misho 110840: }
1.2.2.1 ! misho 110841: yygotominor.yy342.zStart = yymsp[-2].minor.yy0.z;
! 110842: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110843: }
110844: break;
1.2.2.1 ! misho 110845: case 228: /* expr ::= expr in_op LP select RP */
1.2 misho 110846: {
1.2.2.1 ! misho 110847: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy342.pExpr, 0, 0);
! 110848: if( yygotominor.yy342.pExpr ){
! 110849: yygotominor.yy342.pExpr->x.pSelect = yymsp[-1].minor.yy159;
! 110850: ExprSetProperty(yygotominor.yy342.pExpr, EP_xIsSelect);
! 110851: sqlite3ExprSetHeight(pParse, yygotominor.yy342.pExpr);
1.2 misho 110852: }else{
1.2.2.1 ! misho 110853: sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy159);
1.2 misho 110854: }
1.2.2.1 ! misho 110855: if( yymsp[-3].minor.yy392 ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
! 110856: yygotominor.yy342.zStart = yymsp[-4].minor.yy342.zStart;
! 110857: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110858: }
110859: break;
1.2.2.1 ! misho 110860: case 229: /* expr ::= expr in_op nm dbnm */
1.2 misho 110861: {
110862: SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);
1.2.2.1 ! misho 110863: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy342.pExpr, 0, 0);
! 110864: if( yygotominor.yy342.pExpr ){
! 110865: yygotominor.yy342.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
! 110866: ExprSetProperty(yygotominor.yy342.pExpr, EP_xIsSelect);
! 110867: sqlite3ExprSetHeight(pParse, yygotominor.yy342.pExpr);
1.2 misho 110868: }else{
110869: sqlite3SrcListDelete(pParse->db, pSrc);
110870: }
1.2.2.1 ! misho 110871: if( yymsp[-2].minor.yy392 ) yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy342.pExpr, 0, 0);
! 110872: yygotominor.yy342.zStart = yymsp[-3].minor.yy342.zStart;
! 110873: yygotominor.yy342.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n];
1.2 misho 110874: }
110875: break;
1.2.2.1 ! misho 110876: case 230: /* expr ::= EXISTS LP select RP */
1.2 misho 110877: {
1.2.2.1 ! misho 110878: Expr *p = yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
1.2 misho 110879: if( p ){
1.2.2.1 ! misho 110880: p->x.pSelect = yymsp[-1].minor.yy159;
1.2 misho 110881: ExprSetProperty(p, EP_xIsSelect);
110882: sqlite3ExprSetHeight(pParse, p);
110883: }else{
1.2.2.1 ! misho 110884: sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy159);
1.2 misho 110885: }
1.2.2.1 ! misho 110886: yygotominor.yy342.zStart = yymsp[-3].minor.yy0.z;
! 110887: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110888: }
110889: break;
1.2.2.1 ! misho 110890: case 231: /* expr ::= CASE case_operand case_exprlist case_else END */
1.2 misho 110891: {
1.2.2.1 ! misho 110892: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy122, yymsp[-1].minor.yy122, 0);
! 110893: if( yygotominor.yy342.pExpr ){
! 110894: yygotominor.yy342.pExpr->x.pList = yymsp[-2].minor.yy442;
! 110895: sqlite3ExprSetHeight(pParse, yygotominor.yy342.pExpr);
1.2 misho 110896: }else{
1.2.2.1 ! misho 110897: sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy442);
1.2 misho 110898: }
1.2.2.1 ! misho 110899: yygotominor.yy342.zStart = yymsp[-4].minor.yy0.z;
! 110900: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 110901: }
110902: break;
1.2.2.1 ! misho 110903: case 232: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */
1.2 misho 110904: {
1.2.2.1 ! misho 110905: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy442, yymsp[-2].minor.yy342.pExpr);
! 110906: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yygotominor.yy442, yymsp[0].minor.yy342.pExpr);
1.2 misho 110907: }
110908: break;
1.2.2.1 ! misho 110909: case 233: /* case_exprlist ::= WHEN expr THEN expr */
1.2 misho 110910: {
1.2.2.1 ! misho 110911: yygotominor.yy442 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy342.pExpr);
! 110912: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yygotominor.yy442, yymsp[0].minor.yy342.pExpr);
1.2 misho 110913: }
110914: break;
1.2.2.1 ! misho 110915: case 240: /* nexprlist ::= nexprlist COMMA expr */
! 110916: {yygotominor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy442,yymsp[0].minor.yy342.pExpr);}
! 110917: break;
! 110918: case 241: /* nexprlist ::= expr */
! 110919: {yygotominor.yy442 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy342.pExpr);}
! 110920: break;
! 110921: case 242: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP */
1.2 misho 110922: {
110923: sqlite3CreateIndex(pParse, &yymsp[-6].minor.yy0, &yymsp[-5].minor.yy0,
1.2.2.1 ! misho 110924: sqlite3SrcListAppend(pParse->db,0,&yymsp[-3].minor.yy0,0), yymsp[-1].minor.yy442, yymsp[-9].minor.yy392,
! 110925: &yymsp[-10].minor.yy0, &yymsp[0].minor.yy0, SQLITE_SO_ASC, yymsp[-7].minor.yy392);
1.2 misho 110926: }
110927: break;
1.2.2.1 ! misho 110928: case 243: /* uniqueflag ::= UNIQUE */
! 110929: case 296: /* raisetype ::= ABORT */ yytestcase(yyruleno==296);
! 110930: {yygotominor.yy392 = OE_Abort;}
1.2 misho 110931: break;
1.2.2.1 ! misho 110932: case 244: /* uniqueflag ::= */
! 110933: {yygotominor.yy392 = OE_None;}
1.2 misho 110934: break;
1.2.2.1 ! misho 110935: case 247: /* idxlist ::= idxlist COMMA nm collate sortorder */
1.2 misho 110936: {
1.2.2.1 ! misho 110937: Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0);
! 110938: yygotominor.yy442 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy442, p);
! 110939: sqlite3ExprListSetName(pParse,yygotominor.yy442,&yymsp[-2].minor.yy0,1);
! 110940: sqlite3ExprListCheckLength(pParse, yygotominor.yy442, "index");
! 110941: if( yygotominor.yy442 ) yygotominor.yy442->a[yygotominor.yy442->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy392;
1.2 misho 110942: }
110943: break;
1.2.2.1 ! misho 110944: case 248: /* idxlist ::= nm collate sortorder */
1.2 misho 110945: {
1.2.2.1 ! misho 110946: Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0);
! 110947: yygotominor.yy442 = sqlite3ExprListAppend(pParse,0, p);
! 110948: sqlite3ExprListSetName(pParse, yygotominor.yy442, &yymsp[-2].minor.yy0, 1);
! 110949: sqlite3ExprListCheckLength(pParse, yygotominor.yy442, "index");
! 110950: if( yygotominor.yy442 ) yygotominor.yy442->a[yygotominor.yy442->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy392;
1.2 misho 110951: }
110952: break;
1.2.2.1 ! misho 110953: case 249: /* collate ::= */
1.2 misho 110954: {yygotominor.yy0.z = 0; yygotominor.yy0.n = 0;}
110955: break;
1.2.2.1 ! misho 110956: case 251: /* cmd ::= DROP INDEX ifexists fullname */
! 110957: {sqlite3DropIndex(pParse, yymsp[0].minor.yy347, yymsp[-1].minor.yy392);}
1.2 misho 110958: break;
1.2.2.1 ! misho 110959: case 252: /* cmd ::= VACUUM */
! 110960: case 253: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==253);
1.2 misho 110961: {sqlite3Vacuum(pParse);}
110962: break;
1.2.2.1 ! misho 110963: case 254: /* cmd ::= PRAGMA nm dbnm */
1.2 misho 110964: {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);}
110965: break;
1.2.2.1 ! misho 110966: case 255: /* cmd ::= PRAGMA nm dbnm EQ nmnum */
1.2 misho 110967: {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);}
110968: break;
1.2.2.1 ! misho 110969: case 256: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */
1.2 misho 110970: {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);}
110971: break;
1.2.2.1 ! misho 110972: case 257: /* cmd ::= PRAGMA nm dbnm EQ minus_num */
1.2 misho 110973: {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);}
110974: break;
1.2.2.1 ! misho 110975: case 258: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */
1.2 misho 110976: {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);}
110977: break;
1.2.2.1 ! misho 110978: case 268: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */
1.2 misho 110979: {
110980: Token all;
110981: all.z = yymsp[-3].minor.yy0.z;
110982: all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n;
1.2.2.1 ! misho 110983: sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy327, &all);
1.2 misho 110984: }
110985: break;
1.2.2.1 ! misho 110986: case 269: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */
1.2 misho 110987: {
1.2.2.1 ! misho 110988: sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy392, yymsp[-4].minor.yy410.a, yymsp[-4].minor.yy410.b, yymsp[-2].minor.yy347, yymsp[0].minor.yy122, yymsp[-10].minor.yy392, yymsp[-8].minor.yy392);
1.2 misho 110989: yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0);
110990: }
110991: break;
1.2.2.1 ! misho 110992: case 270: /* trigger_time ::= BEFORE */
! 110993: case 273: /* trigger_time ::= */ yytestcase(yyruleno==273);
! 110994: { yygotominor.yy392 = TK_BEFORE; }
1.2 misho 110995: break;
1.2.2.1 ! misho 110996: case 271: /* trigger_time ::= AFTER */
! 110997: { yygotominor.yy392 = TK_AFTER; }
1.2 misho 110998: break;
1.2.2.1 ! misho 110999: case 272: /* trigger_time ::= INSTEAD OF */
! 111000: { yygotominor.yy392 = TK_INSTEAD;}
1.2 misho 111001: break;
1.2.2.1 ! misho 111002: case 274: /* trigger_event ::= DELETE|INSERT */
! 111003: case 275: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==275);
! 111004: {yygotominor.yy410.a = yymsp[0].major; yygotominor.yy410.b = 0;}
1.2 misho 111005: break;
1.2.2.1 ! misho 111006: case 276: /* trigger_event ::= UPDATE OF inscollist */
! 111007: {yygotominor.yy410.a = TK_UPDATE; yygotominor.yy410.b = yymsp[0].minor.yy180;}
1.2 misho 111008: break;
1.2.2.1 ! misho 111009: case 279: /* when_clause ::= */
! 111010: case 301: /* key_opt ::= */ yytestcase(yyruleno==301);
! 111011: { yygotominor.yy122 = 0; }
1.2 misho 111012: break;
1.2.2.1 ! misho 111013: case 280: /* when_clause ::= WHEN expr */
! 111014: case 302: /* key_opt ::= KEY expr */ yytestcase(yyruleno==302);
! 111015: { yygotominor.yy122 = yymsp[0].minor.yy342.pExpr; }
1.2 misho 111016: break;
1.2.2.1 ! misho 111017: case 281: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */
1.2 misho 111018: {
1.2.2.1 ! misho 111019: assert( yymsp[-2].minor.yy327!=0 );
! 111020: yymsp[-2].minor.yy327->pLast->pNext = yymsp[-1].minor.yy327;
! 111021: yymsp[-2].minor.yy327->pLast = yymsp[-1].minor.yy327;
! 111022: yygotominor.yy327 = yymsp[-2].minor.yy327;
1.2 misho 111023: }
111024: break;
1.2.2.1 ! misho 111025: case 282: /* trigger_cmd_list ::= trigger_cmd SEMI */
1.2 misho 111026: {
1.2.2.1 ! misho 111027: assert( yymsp[-1].minor.yy327!=0 );
! 111028: yymsp[-1].minor.yy327->pLast = yymsp[-1].minor.yy327;
! 111029: yygotominor.yy327 = yymsp[-1].minor.yy327;
1.2 misho 111030: }
111031: break;
1.2.2.1 ! misho 111032: case 284: /* trnm ::= nm DOT nm */
1.2 misho 111033: {
111034: yygotominor.yy0 = yymsp[0].minor.yy0;
111035: sqlite3ErrorMsg(pParse,
111036: "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
111037: "statements within triggers");
111038: }
111039: break;
1.2.2.1 ! misho 111040: case 286: /* tridxby ::= INDEXED BY nm */
1.2 misho 111041: {
111042: sqlite3ErrorMsg(pParse,
111043: "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
111044: "within triggers");
111045: }
111046: break;
1.2.2.1 ! misho 111047: case 287: /* tridxby ::= NOT INDEXED */
1.2 misho 111048: {
111049: sqlite3ErrorMsg(pParse,
111050: "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
111051: "within triggers");
111052: }
111053: break;
1.2.2.1 ! misho 111054: case 288: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */
! 111055: { yygotominor.yy327 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy442, yymsp[0].minor.yy122, yymsp[-5].minor.yy258); }
1.2 misho 111056: break;
1.2.2.1 ! misho 111057: case 289: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt valuelist */
! 111058: {yygotominor.yy327 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy180, yymsp[0].minor.yy487.pList, yymsp[0].minor.yy487.pSelect, yymsp[-4].minor.yy258);}
1.2 misho 111059: break;
1.2.2.1 ! misho 111060: case 290: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */
! 111061: {yygotominor.yy327 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy180, 0, yymsp[0].minor.yy159, yymsp[-4].minor.yy258);}
1.2 misho 111062: break;
1.2.2.1 ! misho 111063: case 291: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */
! 111064: {yygotominor.yy327 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy122);}
1.2 misho 111065: break;
1.2.2.1 ! misho 111066: case 292: /* trigger_cmd ::= select */
! 111067: {yygotominor.yy327 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy159); }
1.2 misho 111068: break;
1.2.2.1 ! misho 111069: case 293: /* expr ::= RAISE LP IGNORE RP */
1.2 misho 111070: {
1.2.2.1 ! misho 111071: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
! 111072: if( yygotominor.yy342.pExpr ){
! 111073: yygotominor.yy342.pExpr->affinity = OE_Ignore;
1.2 misho 111074: }
1.2.2.1 ! misho 111075: yygotominor.yy342.zStart = yymsp[-3].minor.yy0.z;
! 111076: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 111077: }
111078: break;
1.2.2.1 ! misho 111079: case 294: /* expr ::= RAISE LP raisetype COMMA nm RP */
1.2 misho 111080: {
1.2.2.1 ! misho 111081: yygotominor.yy342.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0);
! 111082: if( yygotominor.yy342.pExpr ) {
! 111083: yygotominor.yy342.pExpr->affinity = (char)yymsp[-3].minor.yy392;
1.2 misho 111084: }
1.2.2.1 ! misho 111085: yygotominor.yy342.zStart = yymsp[-5].minor.yy0.z;
! 111086: yygotominor.yy342.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n];
1.2 misho 111087: }
111088: break;
1.2.2.1 ! misho 111089: case 295: /* raisetype ::= ROLLBACK */
! 111090: {yygotominor.yy392 = OE_Rollback;}
1.2 misho 111091: break;
1.2.2.1 ! misho 111092: case 297: /* raisetype ::= FAIL */
! 111093: {yygotominor.yy392 = OE_Fail;}
1.2 misho 111094: break;
1.2.2.1 ! misho 111095: case 298: /* cmd ::= DROP TRIGGER ifexists fullname */
1.2 misho 111096: {
1.2.2.1 ! misho 111097: sqlite3DropTrigger(pParse,yymsp[0].minor.yy347,yymsp[-1].minor.yy392);
1.2 misho 111098: }
111099: break;
1.2.2.1 ! misho 111100: case 299: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */
1.2 misho 111101: {
1.2.2.1 ! misho 111102: sqlite3Attach(pParse, yymsp[-3].minor.yy342.pExpr, yymsp[-1].minor.yy342.pExpr, yymsp[0].minor.yy122);
1.2 misho 111103: }
111104: break;
1.2.2.1 ! misho 111105: case 300: /* cmd ::= DETACH database_kw_opt expr */
1.2 misho 111106: {
1.2.2.1 ! misho 111107: sqlite3Detach(pParse, yymsp[0].minor.yy342.pExpr);
1.2 misho 111108: }
111109: break;
1.2.2.1 ! misho 111110: case 305: /* cmd ::= REINDEX */
1.2 misho 111111: {sqlite3Reindex(pParse, 0, 0);}
111112: break;
1.2.2.1 ! misho 111113: case 306: /* cmd ::= REINDEX nm dbnm */
1.2 misho 111114: {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
111115: break;
1.2.2.1 ! misho 111116: case 307: /* cmd ::= ANALYZE */
1.2 misho 111117: {sqlite3Analyze(pParse, 0, 0);}
111118: break;
1.2.2.1 ! misho 111119: case 308: /* cmd ::= ANALYZE nm dbnm */
1.2 misho 111120: {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);}
111121: break;
1.2.2.1 ! misho 111122: case 309: /* cmd ::= ALTER TABLE fullname RENAME TO nm */
1.2 misho 111123: {
1.2.2.1 ! misho 111124: sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy347,&yymsp[0].minor.yy0);
1.2 misho 111125: }
111126: break;
1.2.2.1 ! misho 111127: case 310: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */
1.2 misho 111128: {
111129: sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0);
111130: }
111131: break;
1.2.2.1 ! misho 111132: case 311: /* add_column_fullname ::= fullname */
1.2 misho 111133: {
111134: pParse->db->lookaside.bEnabled = 0;
1.2.2.1 ! misho 111135: sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy347);
1.2 misho 111136: }
111137: break;
1.2.2.1 ! misho 111138: case 314: /* cmd ::= create_vtab */
1.2 misho 111139: {sqlite3VtabFinishParse(pParse,0);}
111140: break;
1.2.2.1 ! misho 111141: case 315: /* cmd ::= create_vtab LP vtabarglist RP */
1.2 misho 111142: {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);}
111143: break;
1.2.2.1 ! misho 111144: case 316: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */
1.2 misho 111145: {
1.2.2.1 ! misho 111146: sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy392);
1.2 misho 111147: }
111148: break;
1.2.2.1 ! misho 111149: case 319: /* vtabarg ::= */
1.2 misho 111150: {sqlite3VtabArgInit(pParse);}
111151: break;
1.2.2.1 ! misho 111152: case 321: /* vtabargtoken ::= ANY */
! 111153: case 322: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==322);
! 111154: case 323: /* lp ::= LP */ yytestcase(yyruleno==323);
1.2 misho 111155: {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);}
111156: break;
111157: default:
111158: /* (0) input ::= cmdlist */ yytestcase(yyruleno==0);
111159: /* (1) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==1);
111160: /* (2) cmdlist ::= ecmd */ yytestcase(yyruleno==2);
111161: /* (3) ecmd ::= SEMI */ yytestcase(yyruleno==3);
111162: /* (4) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==4);
111163: /* (10) trans_opt ::= */ yytestcase(yyruleno==10);
111164: /* (11) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==11);
111165: /* (12) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==12);
111166: /* (20) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==20);
111167: /* (21) savepoint_opt ::= */ yytestcase(yyruleno==21);
111168: /* (25) cmd ::= create_table create_table_args */ yytestcase(yyruleno==25);
111169: /* (34) columnlist ::= columnlist COMMA column */ yytestcase(yyruleno==34);
111170: /* (35) columnlist ::= column */ yytestcase(yyruleno==35);
111171: /* (44) type ::= */ yytestcase(yyruleno==44);
111172: /* (51) signed ::= plus_num */ yytestcase(yyruleno==51);
111173: /* (52) signed ::= minus_num */ yytestcase(yyruleno==52);
1.2.2.1 ! misho 111174: /* (53) carglist ::= carglist ccons */ yytestcase(yyruleno==53);
1.2 misho 111175: /* (54) carglist ::= */ yytestcase(yyruleno==54);
1.2.2.1 ! misho 111176: /* (61) ccons ::= NULL onconf */ yytestcase(yyruleno==61);
! 111177: /* (89) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==89);
! 111178: /* (90) conslist ::= tcons */ yytestcase(yyruleno==90);
! 111179: /* (92) tconscomma ::= */ yytestcase(yyruleno==92);
! 111180: /* (277) foreach_clause ::= */ yytestcase(yyruleno==277);
! 111181: /* (278) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==278);
! 111182: /* (285) tridxby ::= */ yytestcase(yyruleno==285);
! 111183: /* (303) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==303);
! 111184: /* (304) database_kw_opt ::= */ yytestcase(yyruleno==304);
! 111185: /* (312) kwcolumn_opt ::= */ yytestcase(yyruleno==312);
! 111186: /* (313) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==313);
! 111187: /* (317) vtabarglist ::= vtabarg */ yytestcase(yyruleno==317);
! 111188: /* (318) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==318);
! 111189: /* (320) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==320);
! 111190: /* (324) anylist ::= */ yytestcase(yyruleno==324);
! 111191: /* (325) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==325);
! 111192: /* (326) anylist ::= anylist ANY */ yytestcase(yyruleno==326);
1.2 misho 111193: break;
111194: };
1.2.2.1 ! misho 111195: assert( yyruleno>=0 && yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) );
1.2 misho 111196: yygoto = yyRuleInfo[yyruleno].lhs;
111197: yysize = yyRuleInfo[yyruleno].nrhs;
111198: yypParser->yyidx -= yysize;
111199: yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto);
111200: if( yyact < YYNSTATE ){
111201: #ifdef NDEBUG
111202: /* If we are not debugging and the reduce action popped at least
111203: ** one element off the stack, then we can push the new element back
111204: ** onto the stack here, and skip the stack overflow test in yy_shift().
111205: ** That gives a significant speed improvement. */
111206: if( yysize ){
111207: yypParser->yyidx++;
111208: yymsp -= yysize-1;
111209: yymsp->stateno = (YYACTIONTYPE)yyact;
111210: yymsp->major = (YYCODETYPE)yygoto;
111211: yymsp->minor = yygotominor;
111212: }else
111213: #endif
111214: {
111215: yy_shift(yypParser,yyact,yygoto,&yygotominor);
111216: }
111217: }else{
111218: assert( yyact == YYNSTATE + YYNRULE + 1 );
111219: yy_accept(yypParser);
111220: }
111221: }
111222:
111223: /*
111224: ** The following code executes when the parse fails
111225: */
111226: #ifndef YYNOERRORRECOVERY
111227: static void yy_parse_failed(
111228: yyParser *yypParser /* The parser */
111229: ){
111230: sqlite3ParserARG_FETCH;
111231: #ifndef NDEBUG
111232: if( yyTraceFILE ){
111233: fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt);
111234: }
111235: #endif
111236: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
111237: /* Here code is inserted which will be executed whenever the
111238: ** parser fails */
111239: sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
111240: }
111241: #endif /* YYNOERRORRECOVERY */
111242:
111243: /*
111244: ** The following code executes when a syntax error first occurs.
111245: */
111246: static void yy_syntax_error(
111247: yyParser *yypParser, /* The parser */
111248: int yymajor, /* The major type of the error token */
111249: YYMINORTYPE yyminor /* The minor type of the error token */
111250: ){
111251: sqlite3ParserARG_FETCH;
111252: #define TOKEN (yyminor.yy0)
111253:
111254: UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
111255: assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
111256: sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
111257: sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
111258: }
111259:
111260: /*
111261: ** The following is executed when the parser accepts
111262: */
111263: static void yy_accept(
111264: yyParser *yypParser /* The parser */
111265: ){
111266: sqlite3ParserARG_FETCH;
111267: #ifndef NDEBUG
111268: if( yyTraceFILE ){
111269: fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt);
111270: }
111271: #endif
111272: while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
111273: /* Here code is inserted which will be executed whenever the
111274: ** parser accepts */
111275: sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */
111276: }
111277:
111278: /* The main parser program.
111279: ** The first argument is a pointer to a structure obtained from
111280: ** "sqlite3ParserAlloc" which describes the current state of the parser.
111281: ** The second argument is the major token number. The third is
111282: ** the minor token. The fourth optional argument is whatever the
111283: ** user wants (and specified in the grammar) and is available for
111284: ** use by the action routines.
111285: **
111286: ** Inputs:
111287: ** <ul>
111288: ** <li> A pointer to the parser (an opaque structure.)
111289: ** <li> The major token number.
111290: ** <li> The minor token number.
111291: ** <li> An option argument of a grammar-specified type.
111292: ** </ul>
111293: **
111294: ** Outputs:
111295: ** None.
111296: */
111297: SQLITE_PRIVATE void sqlite3Parser(
111298: void *yyp, /* The parser */
111299: int yymajor, /* The major token code number */
111300: sqlite3ParserTOKENTYPE yyminor /* The value for the token */
111301: sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */
111302: ){
111303: YYMINORTYPE yyminorunion;
111304: int yyact; /* The parser action. */
111305: #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
111306: int yyendofinput; /* True if we are at the end of input */
111307: #endif
111308: #ifdef YYERRORSYMBOL
111309: int yyerrorhit = 0; /* True if yymajor has invoked an error */
111310: #endif
111311: yyParser *yypParser; /* The parser */
111312:
111313: /* (re)initialize the parser, if necessary */
111314: yypParser = (yyParser*)yyp;
111315: if( yypParser->yyidx<0 ){
111316: #if YYSTACKDEPTH<=0
111317: if( yypParser->yystksz <=0 ){
111318: /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/
111319: yyminorunion = yyzerominor;
111320: yyStackOverflow(yypParser, &yyminorunion);
111321: return;
111322: }
111323: #endif
111324: yypParser->yyidx = 0;
111325: yypParser->yyerrcnt = -1;
111326: yypParser->yystack[0].stateno = 0;
111327: yypParser->yystack[0].major = 0;
111328: }
111329: yyminorunion.yy0 = yyminor;
111330: #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY)
111331: yyendofinput = (yymajor==0);
111332: #endif
111333: sqlite3ParserARG_STORE;
111334:
111335: #ifndef NDEBUG
111336: if( yyTraceFILE ){
111337: fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]);
111338: }
111339: #endif
111340:
111341: do{
111342: yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor);
111343: if( yyact<YYNSTATE ){
111344: yy_shift(yypParser,yyact,yymajor,&yyminorunion);
111345: yypParser->yyerrcnt--;
111346: yymajor = YYNOCODE;
111347: }else if( yyact < YYNSTATE + YYNRULE ){
111348: yy_reduce(yypParser,yyact-YYNSTATE);
111349: }else{
111350: assert( yyact == YY_ERROR_ACTION );
111351: #ifdef YYERRORSYMBOL
111352: int yymx;
111353: #endif
111354: #ifndef NDEBUG
111355: if( yyTraceFILE ){
111356: fprintf(yyTraceFILE,"%sSyntax Error!\n",yyTracePrompt);
111357: }
111358: #endif
111359: #ifdef YYERRORSYMBOL
111360: /* A syntax error has occurred.
111361: ** The response to an error depends upon whether or not the
111362: ** grammar defines an error token "ERROR".
111363: **
111364: ** This is what we do if the grammar does define ERROR:
111365: **
111366: ** * Call the %syntax_error function.
111367: **
111368: ** * Begin popping the stack until we enter a state where
111369: ** it is legal to shift the error symbol, then shift
111370: ** the error symbol.
111371: **
111372: ** * Set the error count to three.
111373: **
111374: ** * Begin accepting and shifting new tokens. No new error
111375: ** processing will occur until three tokens have been
111376: ** shifted successfully.
111377: **
111378: */
111379: if( yypParser->yyerrcnt<0 ){
111380: yy_syntax_error(yypParser,yymajor,yyminorunion);
111381: }
111382: yymx = yypParser->yystack[yypParser->yyidx].major;
111383: if( yymx==YYERRORSYMBOL || yyerrorhit ){
111384: #ifndef NDEBUG
111385: if( yyTraceFILE ){
111386: fprintf(yyTraceFILE,"%sDiscard input token %s\n",
111387: yyTracePrompt,yyTokenName[yymajor]);
111388: }
111389: #endif
111390: yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion);
111391: yymajor = YYNOCODE;
111392: }else{
111393: while(
111394: yypParser->yyidx >= 0 &&
111395: yymx != YYERRORSYMBOL &&
111396: (yyact = yy_find_reduce_action(
111397: yypParser->yystack[yypParser->yyidx].stateno,
111398: YYERRORSYMBOL)) >= YYNSTATE
111399: ){
111400: yy_pop_parser_stack(yypParser);
111401: }
111402: if( yypParser->yyidx < 0 || yymajor==0 ){
111403: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
111404: yy_parse_failed(yypParser);
111405: yymajor = YYNOCODE;
111406: }else if( yymx!=YYERRORSYMBOL ){
111407: YYMINORTYPE u2;
111408: u2.YYERRSYMDT = 0;
111409: yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2);
111410: }
111411: }
111412: yypParser->yyerrcnt = 3;
111413: yyerrorhit = 1;
111414: #elif defined(YYNOERRORRECOVERY)
111415: /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to
111416: ** do any kind of error recovery. Instead, simply invoke the syntax
111417: ** error routine and continue going as if nothing had happened.
111418: **
111419: ** Applications can set this macro (for example inside %include) if
111420: ** they intend to abandon the parse upon the first syntax error seen.
111421: */
111422: yy_syntax_error(yypParser,yymajor,yyminorunion);
111423: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
111424: yymajor = YYNOCODE;
111425:
111426: #else /* YYERRORSYMBOL is not defined */
111427: /* This is what we do if the grammar does not define ERROR:
111428: **
111429: ** * Report an error message, and throw away the input token.
111430: **
111431: ** * If the input token is $, then fail the parse.
111432: **
111433: ** As before, subsequent error messages are suppressed until
111434: ** three input tokens have been successfully shifted.
111435: */
111436: if( yypParser->yyerrcnt<=0 ){
111437: yy_syntax_error(yypParser,yymajor,yyminorunion);
111438: }
111439: yypParser->yyerrcnt = 3;
111440: yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion);
111441: if( yyendofinput ){
111442: yy_parse_failed(yypParser);
111443: }
111444: yymajor = YYNOCODE;
111445: #endif
111446: }
111447: }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 );
111448: return;
111449: }
111450:
111451: /************** End of parse.c ***********************************************/
111452: /************** Begin file tokenize.c ****************************************/
111453: /*
111454: ** 2001 September 15
111455: **
111456: ** The author disclaims copyright to this source code. In place of
111457: ** a legal notice, here is a blessing:
111458: **
111459: ** May you do good and not evil.
111460: ** May you find forgiveness for yourself and forgive others.
111461: ** May you share freely, never taking more than you give.
111462: **
111463: *************************************************************************
111464: ** An tokenizer for SQL
111465: **
111466: ** This file contains C code that splits an SQL input string up into
111467: ** individual tokens and sends those tokens one-by-one over to the
111468: ** parser for analysis.
111469: */
111470: /* #include <stdlib.h> */
111471:
111472: /*
111473: ** The charMap() macro maps alphabetic characters into their
111474: ** lower-case ASCII equivalent. On ASCII machines, this is just
111475: ** an upper-to-lower case map. On EBCDIC machines we also need
111476: ** to adjust the encoding. Only alphabetic characters and underscores
111477: ** need to be translated.
111478: */
111479: #ifdef SQLITE_ASCII
111480: # define charMap(X) sqlite3UpperToLower[(unsigned char)X]
111481: #endif
111482: #ifdef SQLITE_EBCDIC
111483: # define charMap(X) ebcdicToAscii[(unsigned char)X]
111484: const unsigned char ebcdicToAscii[] = {
111485: /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
111486: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */
111487: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */
111488: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */
111489: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 3x */
111490: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 4x */
111491: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 5x */
111492: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, /* 6x */
111493: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 7x */
111494: 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* 8x */
111495: 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* 9x */
111496: 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ax */
111497: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */
111498: 0, 97, 98, 99,100,101,102,103,104,105, 0, 0, 0, 0, 0, 0, /* Cx */
111499: 0,106,107,108,109,110,111,112,113,114, 0, 0, 0, 0, 0, 0, /* Dx */
111500: 0, 0,115,116,117,118,119,120,121,122, 0, 0, 0, 0, 0, 0, /* Ex */
111501: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Fx */
111502: };
111503: #endif
111504:
111505: /*
111506: ** The sqlite3KeywordCode function looks up an identifier to determine if
111507: ** it is a keyword. If it is a keyword, the token code of that keyword is
111508: ** returned. If the input is not a keyword, TK_ID is returned.
111509: **
111510: ** The implementation of this routine was generated by a program,
111511: ** mkkeywordhash.h, located in the tool subdirectory of the distribution.
111512: ** The output of the mkkeywordhash.c program is written into a file
111513: ** named keywordhash.h and then included into this source file by
111514: ** the #include below.
111515: */
111516: /************** Include keywordhash.h in the middle of tokenize.c ************/
111517: /************** Begin file keywordhash.h *************************************/
111518: /***** This file contains automatically generated code ******
111519: **
111520: ** The code in this file has been automatically generated by
111521: **
111522: ** sqlite/tool/mkkeywordhash.c
111523: **
111524: ** The code in this file implements a function that determines whether
111525: ** or not a given identifier is really an SQL keyword. The same thing
111526: ** might be implemented more directly using a hand-written hash table.
111527: ** But by using this automatically generated code, the size of the code
111528: ** is substantially reduced. This is important for embedded applications
111529: ** on platforms with limited memory.
111530: */
111531: /* Hash score: 175 */
111532: static int keywordCode(const char *z, int n){
111533: /* zText[] encodes 811 bytes of keywords in 541 bytes */
111534: /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */
111535: /* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */
111536: /* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */
111537: /* UNIQUERYATTACHAVINGROUPDATEBEGINNERELEASEBETWEENOTNULLIKE */
111538: /* CASCADELETECASECOLLATECREATECURRENT_DATEDETACHIMMEDIATEJOIN */
111539: /* SERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHENWHERENAME */
111540: /* AFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSS */
111541: /* CURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAILFROMFULLGLOBYIF */
111542: /* ISNULLORDERESTRICTOUTERIGHTROLLBACKROWUNIONUSINGVACUUMVIEW */
111543: /* INITIALLY */
111544: static const char zText[540] = {
111545: 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H',
111546: 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G',
111547: 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A',
111548: 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F',
111549: 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N',
111550: 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I',
111551: 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E',
111552: 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E',
111553: 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T',
111554: 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q',
111555: 'U','E','R','Y','A','T','T','A','C','H','A','V','I','N','G','R','O','U',
111556: 'P','D','A','T','E','B','E','G','I','N','N','E','R','E','L','E','A','S',
111557: 'E','B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C',
111558: 'A','S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L',
111559: 'A','T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D',
111560: 'A','T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E',
111561: 'J','O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A',
111562: 'L','Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U',
111563: 'E','S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W',
111564: 'H','E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C',
111565: 'E','A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R',
111566: 'E','M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M',
111567: 'M','I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U',
111568: 'R','R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M',
111569: 'A','R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T',
111570: 'D','R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L',
111571: 'O','B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S',
111572: 'T','R','I','C','T','O','U','T','E','R','I','G','H','T','R','O','L','L',
111573: 'B','A','C','K','R','O','W','U','N','I','O','N','U','S','I','N','G','V',
111574: 'A','C','U','U','M','V','I','E','W','I','N','I','T','I','A','L','L','Y',
111575: };
111576: static const unsigned char aHash[127] = {
111577: 72, 101, 114, 70, 0, 45, 0, 0, 78, 0, 73, 0, 0,
111578: 42, 12, 74, 15, 0, 113, 81, 50, 108, 0, 19, 0, 0,
111579: 118, 0, 116, 111, 0, 22, 89, 0, 9, 0, 0, 66, 67,
111580: 0, 65, 6, 0, 48, 86, 98, 0, 115, 97, 0, 0, 44,
111581: 0, 99, 24, 0, 17, 0, 119, 49, 23, 0, 5, 106, 25,
111582: 92, 0, 0, 121, 102, 56, 120, 53, 28, 51, 0, 87, 0,
111583: 96, 26, 0, 95, 0, 0, 0, 91, 88, 93, 84, 105, 14,
111584: 39, 104, 0, 77, 0, 18, 85, 107, 32, 0, 117, 76, 109,
111585: 58, 46, 80, 0, 0, 90, 40, 0, 112, 0, 36, 0, 0,
111586: 29, 0, 82, 59, 60, 0, 20, 57, 0, 52,
111587: };
111588: static const unsigned char aNext[121] = {
111589: 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
111590: 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
111591: 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111592: 0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 43, 3, 47,
111593: 0, 0, 0, 0, 30, 0, 54, 0, 38, 0, 0, 0, 1,
111594: 62, 0, 0, 63, 0, 41, 0, 0, 0, 0, 0, 0, 0,
111595: 61, 0, 0, 0, 0, 31, 55, 16, 34, 10, 0, 0, 0,
111596: 0, 0, 0, 0, 11, 68, 75, 0, 8, 0, 100, 94, 0,
111597: 103, 0, 83, 0, 71, 0, 0, 110, 27, 37, 69, 79, 0,
111598: 35, 64, 0, 0,
111599: };
111600: static const unsigned char aLen[121] = {
111601: 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6,
111602: 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6,
111603: 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10,
111604: 4, 6, 2, 3, 9, 4, 2, 6, 5, 6, 6, 5, 6,
111605: 5, 5, 7, 7, 7, 3, 2, 4, 4, 7, 3, 6, 4,
111606: 7, 6, 12, 6, 9, 4, 6, 5, 4, 7, 6, 5, 6,
111607: 7, 5, 4, 5, 6, 5, 7, 3, 7, 13, 2, 2, 4,
111608: 6, 6, 8, 5, 17, 12, 7, 8, 8, 2, 4, 4, 4,
111609: 4, 4, 2, 2, 6, 5, 8, 5, 5, 8, 3, 5, 5,
111610: 6, 4, 9, 3,
111611: };
111612: static const unsigned short int aOffset[121] = {
111613: 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33,
111614: 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81,
111615: 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152,
111616: 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 189, 194, 197,
111617: 203, 206, 210, 217, 223, 223, 223, 226, 229, 233, 234, 238, 244,
111618: 248, 255, 261, 273, 279, 288, 290, 296, 301, 303, 310, 315, 320,
111619: 326, 332, 337, 341, 344, 350, 354, 361, 363, 370, 372, 374, 383,
111620: 387, 393, 399, 407, 412, 412, 428, 435, 442, 443, 450, 454, 458,
111621: 462, 466, 469, 471, 473, 479, 483, 491, 495, 500, 508, 511, 516,
111622: 521, 527, 531, 536,
111623: };
111624: static const unsigned char aCode[121] = {
111625: TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE,
111626: TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN,
111627: TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD,
111628: TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE,
111629: TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE,
111630: TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW,
111631: TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT,
111632: TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO,
111633: TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP,
111634: TK_OR, TK_UNIQUE, TK_QUERY, TK_ATTACH, TK_HAVING,
111635: TK_GROUP, TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RELEASE,
111636: TK_BETWEEN, TK_NOTNULL, TK_NOT, TK_NO, TK_NULL,
111637: TK_LIKE_KW, TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE,
111638: TK_COLLATE, TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE,
111639: TK_JOIN, TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE,
111640: TK_PRAGMA, TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT,
111641: TK_WHEN, TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE,
111642: TK_AND, TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN,
111643: TK_CAST, TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW,
111644: TK_CTIME_KW, TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT,
111645: TK_IS, TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW,
111646: TK_LIKE_KW, TK_BY, TK_IF, TK_ISNULL, TK_ORDER,
111647: TK_RESTRICT, TK_JOIN_KW, TK_JOIN_KW, TK_ROLLBACK, TK_ROW,
111648: TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_INITIALLY,
111649: TK_ALL,
111650: };
111651: int h, i;
111652: if( n<2 ) return TK_ID;
111653: h = ((charMap(z[0])*4) ^
111654: (charMap(z[n-1])*3) ^
111655: n) % 127;
111656: for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){
111657: if( aLen[i]==n && sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){
111658: testcase( i==0 ); /* REINDEX */
111659: testcase( i==1 ); /* INDEXED */
111660: testcase( i==2 ); /* INDEX */
111661: testcase( i==3 ); /* DESC */
111662: testcase( i==4 ); /* ESCAPE */
111663: testcase( i==5 ); /* EACH */
111664: testcase( i==6 ); /* CHECK */
111665: testcase( i==7 ); /* KEY */
111666: testcase( i==8 ); /* BEFORE */
111667: testcase( i==9 ); /* FOREIGN */
111668: testcase( i==10 ); /* FOR */
111669: testcase( i==11 ); /* IGNORE */
111670: testcase( i==12 ); /* REGEXP */
111671: testcase( i==13 ); /* EXPLAIN */
111672: testcase( i==14 ); /* INSTEAD */
111673: testcase( i==15 ); /* ADD */
111674: testcase( i==16 ); /* DATABASE */
111675: testcase( i==17 ); /* AS */
111676: testcase( i==18 ); /* SELECT */
111677: testcase( i==19 ); /* TABLE */
111678: testcase( i==20 ); /* LEFT */
111679: testcase( i==21 ); /* THEN */
111680: testcase( i==22 ); /* END */
111681: testcase( i==23 ); /* DEFERRABLE */
111682: testcase( i==24 ); /* ELSE */
111683: testcase( i==25 ); /* EXCEPT */
111684: testcase( i==26 ); /* TRANSACTION */
111685: testcase( i==27 ); /* ACTION */
111686: testcase( i==28 ); /* ON */
111687: testcase( i==29 ); /* NATURAL */
111688: testcase( i==30 ); /* ALTER */
111689: testcase( i==31 ); /* RAISE */
111690: testcase( i==32 ); /* EXCLUSIVE */
111691: testcase( i==33 ); /* EXISTS */
111692: testcase( i==34 ); /* SAVEPOINT */
111693: testcase( i==35 ); /* INTERSECT */
111694: testcase( i==36 ); /* TRIGGER */
111695: testcase( i==37 ); /* REFERENCES */
111696: testcase( i==38 ); /* CONSTRAINT */
111697: testcase( i==39 ); /* INTO */
111698: testcase( i==40 ); /* OFFSET */
111699: testcase( i==41 ); /* OF */
111700: testcase( i==42 ); /* SET */
111701: testcase( i==43 ); /* TEMPORARY */
111702: testcase( i==44 ); /* TEMP */
111703: testcase( i==45 ); /* OR */
111704: testcase( i==46 ); /* UNIQUE */
111705: testcase( i==47 ); /* QUERY */
111706: testcase( i==48 ); /* ATTACH */
111707: testcase( i==49 ); /* HAVING */
111708: testcase( i==50 ); /* GROUP */
111709: testcase( i==51 ); /* UPDATE */
111710: testcase( i==52 ); /* BEGIN */
111711: testcase( i==53 ); /* INNER */
111712: testcase( i==54 ); /* RELEASE */
111713: testcase( i==55 ); /* BETWEEN */
111714: testcase( i==56 ); /* NOTNULL */
111715: testcase( i==57 ); /* NOT */
111716: testcase( i==58 ); /* NO */
111717: testcase( i==59 ); /* NULL */
111718: testcase( i==60 ); /* LIKE */
111719: testcase( i==61 ); /* CASCADE */
111720: testcase( i==62 ); /* ASC */
111721: testcase( i==63 ); /* DELETE */
111722: testcase( i==64 ); /* CASE */
111723: testcase( i==65 ); /* COLLATE */
111724: testcase( i==66 ); /* CREATE */
111725: testcase( i==67 ); /* CURRENT_DATE */
111726: testcase( i==68 ); /* DETACH */
111727: testcase( i==69 ); /* IMMEDIATE */
111728: testcase( i==70 ); /* JOIN */
111729: testcase( i==71 ); /* INSERT */
111730: testcase( i==72 ); /* MATCH */
111731: testcase( i==73 ); /* PLAN */
111732: testcase( i==74 ); /* ANALYZE */
111733: testcase( i==75 ); /* PRAGMA */
111734: testcase( i==76 ); /* ABORT */
111735: testcase( i==77 ); /* VALUES */
111736: testcase( i==78 ); /* VIRTUAL */
111737: testcase( i==79 ); /* LIMIT */
111738: testcase( i==80 ); /* WHEN */
111739: testcase( i==81 ); /* WHERE */
111740: testcase( i==82 ); /* RENAME */
111741: testcase( i==83 ); /* AFTER */
111742: testcase( i==84 ); /* REPLACE */
111743: testcase( i==85 ); /* AND */
111744: testcase( i==86 ); /* DEFAULT */
111745: testcase( i==87 ); /* AUTOINCREMENT */
111746: testcase( i==88 ); /* TO */
111747: testcase( i==89 ); /* IN */
111748: testcase( i==90 ); /* CAST */
111749: testcase( i==91 ); /* COLUMN */
111750: testcase( i==92 ); /* COMMIT */
111751: testcase( i==93 ); /* CONFLICT */
111752: testcase( i==94 ); /* CROSS */
111753: testcase( i==95 ); /* CURRENT_TIMESTAMP */
111754: testcase( i==96 ); /* CURRENT_TIME */
111755: testcase( i==97 ); /* PRIMARY */
111756: testcase( i==98 ); /* DEFERRED */
111757: testcase( i==99 ); /* DISTINCT */
111758: testcase( i==100 ); /* IS */
111759: testcase( i==101 ); /* DROP */
111760: testcase( i==102 ); /* FAIL */
111761: testcase( i==103 ); /* FROM */
111762: testcase( i==104 ); /* FULL */
111763: testcase( i==105 ); /* GLOB */
111764: testcase( i==106 ); /* BY */
111765: testcase( i==107 ); /* IF */
111766: testcase( i==108 ); /* ISNULL */
111767: testcase( i==109 ); /* ORDER */
111768: testcase( i==110 ); /* RESTRICT */
111769: testcase( i==111 ); /* OUTER */
111770: testcase( i==112 ); /* RIGHT */
111771: testcase( i==113 ); /* ROLLBACK */
111772: testcase( i==114 ); /* ROW */
111773: testcase( i==115 ); /* UNION */
111774: testcase( i==116 ); /* USING */
111775: testcase( i==117 ); /* VACUUM */
111776: testcase( i==118 ); /* VIEW */
111777: testcase( i==119 ); /* INITIALLY */
111778: testcase( i==120 ); /* ALL */
111779: return aCode[i];
111780: }
111781: }
111782: return TK_ID;
111783: }
111784: SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){
111785: return keywordCode((char*)z, n);
111786: }
111787: #define SQLITE_N_KEYWORD 121
111788:
111789: /************** End of keywordhash.h *****************************************/
111790: /************** Continuing where we left off in tokenize.c *******************/
111791:
111792:
111793: /*
111794: ** If X is a character that can be used in an identifier then
111795: ** IdChar(X) will be true. Otherwise it is false.
111796: **
111797: ** For ASCII, any character with the high-order bit set is
111798: ** allowed in an identifier. For 7-bit characters,
111799: ** sqlite3IsIdChar[X] must be 1.
111800: **
111801: ** For EBCDIC, the rules are more complex but have the same
111802: ** end result.
111803: **
111804: ** Ticket #1066. the SQL standard does not allow '$' in the
111805: ** middle of identfiers. But many SQL implementations do.
111806: ** SQLite will allow '$' in identifiers for compatibility.
111807: ** But the feature is undocumented.
111808: */
111809: #ifdef SQLITE_ASCII
111810: #define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0)
111811: #endif
111812: #ifdef SQLITE_EBCDIC
111813: SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = {
111814: /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
111815: 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 4x */
111816: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, /* 5x */
111817: 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, /* 6x */
111818: 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, /* 7x */
111819: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, /* 8x */
111820: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, /* 9x */
111821: 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, /* Ax */
111822: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Bx */
111823: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Cx */
111824: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Dx */
111825: 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, /* Ex */
111826: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, /* Fx */
111827: };
111828: #define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
111829: #endif
111830:
111831:
111832: /*
111833: ** Return the length of the token that begins at z[0].
111834: ** Store the token type in *tokenType before returning.
111835: */
111836: SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
111837: int i, c;
111838: switch( *z ){
111839: case ' ': case '\t': case '\n': case '\f': case '\r': {
111840: testcase( z[0]==' ' );
111841: testcase( z[0]=='\t' );
111842: testcase( z[0]=='\n' );
111843: testcase( z[0]=='\f' );
111844: testcase( z[0]=='\r' );
111845: for(i=1; sqlite3Isspace(z[i]); i++){}
111846: *tokenType = TK_SPACE;
111847: return i;
111848: }
111849: case '-': {
111850: if( z[1]=='-' ){
111851: /* IMP: R-50417-27976 -- syntax diagram for comments */
111852: for(i=2; (c=z[i])!=0 && c!='\n'; i++){}
111853: *tokenType = TK_SPACE; /* IMP: R-22934-25134 */
111854: return i;
111855: }
111856: *tokenType = TK_MINUS;
111857: return 1;
111858: }
111859: case '(': {
111860: *tokenType = TK_LP;
111861: return 1;
111862: }
111863: case ')': {
111864: *tokenType = TK_RP;
111865: return 1;
111866: }
111867: case ';': {
111868: *tokenType = TK_SEMI;
111869: return 1;
111870: }
111871: case '+': {
111872: *tokenType = TK_PLUS;
111873: return 1;
111874: }
111875: case '*': {
111876: *tokenType = TK_STAR;
111877: return 1;
111878: }
111879: case '/': {
111880: if( z[1]!='*' || z[2]==0 ){
111881: *tokenType = TK_SLASH;
111882: return 1;
111883: }
111884: /* IMP: R-50417-27976 -- syntax diagram for comments */
111885: for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){}
111886: if( c ) i++;
111887: *tokenType = TK_SPACE; /* IMP: R-22934-25134 */
111888: return i;
111889: }
111890: case '%': {
111891: *tokenType = TK_REM;
111892: return 1;
111893: }
111894: case '=': {
111895: *tokenType = TK_EQ;
111896: return 1 + (z[1]=='=');
111897: }
111898: case '<': {
111899: if( (c=z[1])=='=' ){
111900: *tokenType = TK_LE;
111901: return 2;
111902: }else if( c=='>' ){
111903: *tokenType = TK_NE;
111904: return 2;
111905: }else if( c=='<' ){
111906: *tokenType = TK_LSHIFT;
111907: return 2;
111908: }else{
111909: *tokenType = TK_LT;
111910: return 1;
111911: }
111912: }
111913: case '>': {
111914: if( (c=z[1])=='=' ){
111915: *tokenType = TK_GE;
111916: return 2;
111917: }else if( c=='>' ){
111918: *tokenType = TK_RSHIFT;
111919: return 2;
111920: }else{
111921: *tokenType = TK_GT;
111922: return 1;
111923: }
111924: }
111925: case '!': {
111926: if( z[1]!='=' ){
111927: *tokenType = TK_ILLEGAL;
111928: return 2;
111929: }else{
111930: *tokenType = TK_NE;
111931: return 2;
111932: }
111933: }
111934: case '|': {
111935: if( z[1]!='|' ){
111936: *tokenType = TK_BITOR;
111937: return 1;
111938: }else{
111939: *tokenType = TK_CONCAT;
111940: return 2;
111941: }
111942: }
111943: case ',': {
111944: *tokenType = TK_COMMA;
111945: return 1;
111946: }
111947: case '&': {
111948: *tokenType = TK_BITAND;
111949: return 1;
111950: }
111951: case '~': {
111952: *tokenType = TK_BITNOT;
111953: return 1;
111954: }
111955: case '`':
111956: case '\'':
111957: case '"': {
111958: int delim = z[0];
111959: testcase( delim=='`' );
111960: testcase( delim=='\'' );
111961: testcase( delim=='"' );
111962: for(i=1; (c=z[i])!=0; i++){
111963: if( c==delim ){
111964: if( z[i+1]==delim ){
111965: i++;
111966: }else{
111967: break;
111968: }
111969: }
111970: }
111971: if( c=='\'' ){
111972: *tokenType = TK_STRING;
111973: return i+1;
111974: }else if( c!=0 ){
111975: *tokenType = TK_ID;
111976: return i+1;
111977: }else{
111978: *tokenType = TK_ILLEGAL;
111979: return i;
111980: }
111981: }
111982: case '.': {
111983: #ifndef SQLITE_OMIT_FLOATING_POINT
111984: if( !sqlite3Isdigit(z[1]) )
111985: #endif
111986: {
111987: *tokenType = TK_DOT;
111988: return 1;
111989: }
111990: /* If the next character is a digit, this is a floating point
111991: ** number that begins with ".". Fall thru into the next case */
111992: }
111993: case '0': case '1': case '2': case '3': case '4':
111994: case '5': case '6': case '7': case '8': case '9': {
111995: testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' );
111996: testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' );
111997: testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' );
111998: testcase( z[0]=='9' );
111999: *tokenType = TK_INTEGER;
112000: for(i=0; sqlite3Isdigit(z[i]); i++){}
112001: #ifndef SQLITE_OMIT_FLOATING_POINT
112002: if( z[i]=='.' ){
112003: i++;
112004: while( sqlite3Isdigit(z[i]) ){ i++; }
112005: *tokenType = TK_FLOAT;
112006: }
112007: if( (z[i]=='e' || z[i]=='E') &&
112008: ( sqlite3Isdigit(z[i+1])
112009: || ((z[i+1]=='+' || z[i+1]=='-') && sqlite3Isdigit(z[i+2]))
112010: )
112011: ){
112012: i += 2;
112013: while( sqlite3Isdigit(z[i]) ){ i++; }
112014: *tokenType = TK_FLOAT;
112015: }
112016: #endif
112017: while( IdChar(z[i]) ){
112018: *tokenType = TK_ILLEGAL;
112019: i++;
112020: }
112021: return i;
112022: }
112023: case '[': {
112024: for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){}
112025: *tokenType = c==']' ? TK_ID : TK_ILLEGAL;
112026: return i;
112027: }
112028: case '?': {
112029: *tokenType = TK_VARIABLE;
112030: for(i=1; sqlite3Isdigit(z[i]); i++){}
112031: return i;
112032: }
112033: case '#': {
112034: for(i=1; sqlite3Isdigit(z[i]); i++){}
112035: if( i>1 ){
112036: /* Parameters of the form #NNN (where NNN is a number) are used
112037: ** internally by sqlite3NestedParse. */
112038: *tokenType = TK_REGISTER;
112039: return i;
112040: }
112041: /* Fall through into the next case if the '#' is not followed by
112042: ** a digit. Try to match #AAAA where AAAA is a parameter name. */
112043: }
112044: #ifndef SQLITE_OMIT_TCL_VARIABLE
112045: case '$':
112046: #endif
112047: case '@': /* For compatibility with MS SQL Server */
112048: case ':': {
112049: int n = 0;
112050: testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' );
112051: *tokenType = TK_VARIABLE;
112052: for(i=1; (c=z[i])!=0; i++){
112053: if( IdChar(c) ){
112054: n++;
112055: #ifndef SQLITE_OMIT_TCL_VARIABLE
112056: }else if( c=='(' && n>0 ){
112057: do{
112058: i++;
112059: }while( (c=z[i])!=0 && !sqlite3Isspace(c) && c!=')' );
112060: if( c==')' ){
112061: i++;
112062: }else{
112063: *tokenType = TK_ILLEGAL;
112064: }
112065: break;
112066: }else if( c==':' && z[i+1]==':' ){
112067: i++;
112068: #endif
112069: }else{
112070: break;
112071: }
112072: }
112073: if( n==0 ) *tokenType = TK_ILLEGAL;
112074: return i;
112075: }
112076: #ifndef SQLITE_OMIT_BLOB_LITERAL
112077: case 'x': case 'X': {
112078: testcase( z[0]=='x' ); testcase( z[0]=='X' );
112079: if( z[1]=='\'' ){
112080: *tokenType = TK_BLOB;
112081: for(i=2; sqlite3Isxdigit(z[i]); i++){}
112082: if( z[i]!='\'' || i%2 ){
112083: *tokenType = TK_ILLEGAL;
112084: while( z[i] && z[i]!='\'' ){ i++; }
112085: }
112086: if( z[i] ) i++;
112087: return i;
112088: }
112089: /* Otherwise fall through to the next case */
112090: }
112091: #endif
112092: default: {
112093: if( !IdChar(*z) ){
112094: break;
112095: }
112096: for(i=1; IdChar(z[i]); i++){}
112097: *tokenType = keywordCode((char*)z, i);
112098: return i;
112099: }
112100: }
112101: *tokenType = TK_ILLEGAL;
112102: return 1;
112103: }
112104:
112105: /*
112106: ** Run the parser on the given SQL string. The parser structure is
112107: ** passed in. An SQLITE_ status code is returned. If an error occurs
112108: ** then an and attempt is made to write an error message into
112109: ** memory obtained from sqlite3_malloc() and to make *pzErrMsg point to that
112110: ** error message.
112111: */
112112: SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
112113: int nErr = 0; /* Number of errors encountered */
112114: int i; /* Loop counter */
112115: void *pEngine; /* The LEMON-generated LALR(1) parser */
112116: int tokenType; /* type of the next token */
112117: int lastTokenParsed = -1; /* type of the previous token */
112118: u8 enableLookaside; /* Saved value of db->lookaside.bEnabled */
112119: sqlite3 *db = pParse->db; /* The database connection */
112120: int mxSqlLen; /* Max length of an SQL string */
112121:
112122:
112123: mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH];
112124: if( db->activeVdbeCnt==0 ){
112125: db->u1.isInterrupted = 0;
112126: }
112127: pParse->rc = SQLITE_OK;
112128: pParse->zTail = zSql;
112129: i = 0;
112130: assert( pzErrMsg!=0 );
112131: pEngine = sqlite3ParserAlloc((void*(*)(size_t))sqlite3Malloc);
112132: if( pEngine==0 ){
112133: db->mallocFailed = 1;
112134: return SQLITE_NOMEM;
112135: }
112136: assert( pParse->pNewTable==0 );
112137: assert( pParse->pNewTrigger==0 );
112138: assert( pParse->nVar==0 );
112139: assert( pParse->nzVar==0 );
112140: assert( pParse->azVar==0 );
112141: enableLookaside = db->lookaside.bEnabled;
112142: if( db->lookaside.pStart ) db->lookaside.bEnabled = 1;
112143: while( !db->mallocFailed && zSql[i]!=0 ){
112144: assert( i>=0 );
112145: pParse->sLastToken.z = &zSql[i];
112146: pParse->sLastToken.n = sqlite3GetToken((unsigned char*)&zSql[i],&tokenType);
112147: i += pParse->sLastToken.n;
112148: if( i>mxSqlLen ){
112149: pParse->rc = SQLITE_TOOBIG;
112150: break;
112151: }
112152: switch( tokenType ){
112153: case TK_SPACE: {
112154: if( db->u1.isInterrupted ){
112155: sqlite3ErrorMsg(pParse, "interrupt");
112156: pParse->rc = SQLITE_INTERRUPT;
112157: goto abort_parse;
112158: }
112159: break;
112160: }
112161: case TK_ILLEGAL: {
112162: sqlite3DbFree(db, *pzErrMsg);
112163: *pzErrMsg = sqlite3MPrintf(db, "unrecognized token: \"%T\"",
112164: &pParse->sLastToken);
112165: nErr++;
112166: goto abort_parse;
112167: }
112168: case TK_SEMI: {
112169: pParse->zTail = &zSql[i];
112170: /* Fall thru into the default case */
112171: }
112172: default: {
112173: sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse);
112174: lastTokenParsed = tokenType;
112175: if( pParse->rc!=SQLITE_OK ){
112176: goto abort_parse;
112177: }
112178: break;
112179: }
112180: }
112181: }
112182: abort_parse:
112183: if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){
112184: if( lastTokenParsed!=TK_SEMI ){
112185: sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse);
112186: pParse->zTail = &zSql[i];
112187: }
112188: sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse);
112189: }
112190: #ifdef YYTRACKMAXSTACKDEPTH
112191: sqlite3StatusSet(SQLITE_STATUS_PARSER_STACK,
112192: sqlite3ParserStackPeak(pEngine)
112193: );
112194: #endif /* YYDEBUG */
112195: sqlite3ParserFree(pEngine, sqlite3_free);
112196: db->lookaside.bEnabled = enableLookaside;
112197: if( db->mallocFailed ){
112198: pParse->rc = SQLITE_NOMEM;
112199: }
112200: if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){
112201: sqlite3SetString(&pParse->zErrMsg, db, "%s", sqlite3ErrStr(pParse->rc));
112202: }
112203: assert( pzErrMsg!=0 );
112204: if( pParse->zErrMsg ){
112205: *pzErrMsg = pParse->zErrMsg;
112206: sqlite3_log(pParse->rc, "%s", *pzErrMsg);
112207: pParse->zErrMsg = 0;
112208: nErr++;
112209: }
112210: if( pParse->pVdbe && pParse->nErr>0 && pParse->nested==0 ){
112211: sqlite3VdbeDelete(pParse->pVdbe);
112212: pParse->pVdbe = 0;
112213: }
112214: #ifndef SQLITE_OMIT_SHARED_CACHE
112215: if( pParse->nested==0 ){
112216: sqlite3DbFree(db, pParse->aTableLock);
112217: pParse->aTableLock = 0;
112218: pParse->nTableLock = 0;
112219: }
112220: #endif
112221: #ifndef SQLITE_OMIT_VIRTUALTABLE
112222: sqlite3_free(pParse->apVtabLock);
112223: #endif
112224:
112225: if( !IN_DECLARE_VTAB ){
112226: /* If the pParse->declareVtab flag is set, do not delete any table
112227: ** structure built up in pParse->pNewTable. The calling code (see vtab.c)
112228: ** will take responsibility for freeing the Table structure.
112229: */
112230: sqlite3DeleteTable(db, pParse->pNewTable);
112231: }
112232:
112233: sqlite3DeleteTrigger(db, pParse->pNewTrigger);
112234: for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]);
112235: sqlite3DbFree(db, pParse->azVar);
112236: sqlite3DbFree(db, pParse->aAlias);
112237: while( pParse->pAinc ){
112238: AutoincInfo *p = pParse->pAinc;
112239: pParse->pAinc = p->pNext;
112240: sqlite3DbFree(db, p);
112241: }
112242: while( pParse->pZombieTab ){
112243: Table *p = pParse->pZombieTab;
112244: pParse->pZombieTab = p->pNextZombie;
112245: sqlite3DeleteTable(db, p);
112246: }
112247: if( nErr>0 && pParse->rc==SQLITE_OK ){
112248: pParse->rc = SQLITE_ERROR;
112249: }
112250: return nErr;
112251: }
112252:
112253: /************** End of tokenize.c ********************************************/
112254: /************** Begin file complete.c ****************************************/
112255: /*
112256: ** 2001 September 15
112257: **
112258: ** The author disclaims copyright to this source code. In place of
112259: ** a legal notice, here is a blessing:
112260: **
112261: ** May you do good and not evil.
112262: ** May you find forgiveness for yourself and forgive others.
112263: ** May you share freely, never taking more than you give.
112264: **
112265: *************************************************************************
112266: ** An tokenizer for SQL
112267: **
112268: ** This file contains C code that implements the sqlite3_complete() API.
112269: ** This code used to be part of the tokenizer.c source file. But by
112270: ** separating it out, the code will be automatically omitted from
112271: ** static links that do not use it.
112272: */
112273: #ifndef SQLITE_OMIT_COMPLETE
112274:
112275: /*
112276: ** This is defined in tokenize.c. We just have to import the definition.
112277: */
112278: #ifndef SQLITE_AMALGAMATION
112279: #ifdef SQLITE_ASCII
112280: #define IdChar(C) ((sqlite3CtypeMap[(unsigned char)C]&0x46)!=0)
112281: #endif
112282: #ifdef SQLITE_EBCDIC
112283: SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[];
112284: #define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40]))
112285: #endif
112286: #endif /* SQLITE_AMALGAMATION */
112287:
112288:
112289: /*
112290: ** Token types used by the sqlite3_complete() routine. See the header
112291: ** comments on that procedure for additional information.
112292: */
112293: #define tkSEMI 0
112294: #define tkWS 1
112295: #define tkOTHER 2
112296: #ifndef SQLITE_OMIT_TRIGGER
112297: #define tkEXPLAIN 3
112298: #define tkCREATE 4
112299: #define tkTEMP 5
112300: #define tkTRIGGER 6
112301: #define tkEND 7
112302: #endif
112303:
112304: /*
112305: ** Return TRUE if the given SQL string ends in a semicolon.
112306: **
112307: ** Special handling is require for CREATE TRIGGER statements.
112308: ** Whenever the CREATE TRIGGER keywords are seen, the statement
112309: ** must end with ";END;".
112310: **
112311: ** This implementation uses a state machine with 8 states:
112312: **
112313: ** (0) INVALID We have not yet seen a non-whitespace character.
112314: **
112315: ** (1) START At the beginning or end of an SQL statement. This routine
112316: ** returns 1 if it ends in the START state and 0 if it ends
112317: ** in any other state.
112318: **
112319: ** (2) NORMAL We are in the middle of statement which ends with a single
112320: ** semicolon.
112321: **
112322: ** (3) EXPLAIN The keyword EXPLAIN has been seen at the beginning of
112323: ** a statement.
112324: **
112325: ** (4) CREATE The keyword CREATE has been seen at the beginning of a
112326: ** statement, possibly preceeded by EXPLAIN and/or followed by
112327: ** TEMP or TEMPORARY
112328: **
112329: ** (5) TRIGGER We are in the middle of a trigger definition that must be
112330: ** ended by a semicolon, the keyword END, and another semicolon.
112331: **
112332: ** (6) SEMI We've seen the first semicolon in the ";END;" that occurs at
112333: ** the end of a trigger definition.
112334: **
112335: ** (7) END We've seen the ";END" of the ";END;" that occurs at the end
112336: ** of a trigger difinition.
112337: **
112338: ** Transitions between states above are determined by tokens extracted
112339: ** from the input. The following tokens are significant:
112340: **
112341: ** (0) tkSEMI A semicolon.
112342: ** (1) tkWS Whitespace.
112343: ** (2) tkOTHER Any other SQL token.
112344: ** (3) tkEXPLAIN The "explain" keyword.
112345: ** (4) tkCREATE The "create" keyword.
112346: ** (5) tkTEMP The "temp" or "temporary" keyword.
112347: ** (6) tkTRIGGER The "trigger" keyword.
112348: ** (7) tkEND The "end" keyword.
112349: **
112350: ** Whitespace never causes a state transition and is always ignored.
112351: ** This means that a SQL string of all whitespace is invalid.
112352: **
112353: ** If we compile with SQLITE_OMIT_TRIGGER, all of the computation needed
112354: ** to recognize the end of a trigger can be omitted. All we have to do
112355: ** is look for a semicolon that is not part of an string or comment.
112356: */
112357: SQLITE_API int sqlite3_complete(const char *zSql){
112358: u8 state = 0; /* Current state, using numbers defined in header comment */
112359: u8 token; /* Value of the next token */
112360:
112361: #ifndef SQLITE_OMIT_TRIGGER
112362: /* A complex statement machine used to detect the end of a CREATE TRIGGER
112363: ** statement. This is the normal case.
112364: */
112365: static const u8 trans[8][8] = {
112366: /* Token: */
112367: /* State: ** SEMI WS OTHER EXPLAIN CREATE TEMP TRIGGER END */
112368: /* 0 INVALID: */ { 1, 0, 2, 3, 4, 2, 2, 2, },
112369: /* 1 START: */ { 1, 1, 2, 3, 4, 2, 2, 2, },
112370: /* 2 NORMAL: */ { 1, 2, 2, 2, 2, 2, 2, 2, },
112371: /* 3 EXPLAIN: */ { 1, 3, 3, 2, 4, 2, 2, 2, },
112372: /* 4 CREATE: */ { 1, 4, 2, 2, 2, 4, 5, 2, },
112373: /* 5 TRIGGER: */ { 6, 5, 5, 5, 5, 5, 5, 5, },
112374: /* 6 SEMI: */ { 6, 6, 5, 5, 5, 5, 5, 7, },
112375: /* 7 END: */ { 1, 7, 5, 5, 5, 5, 5, 5, },
112376: };
112377: #else
112378: /* If triggers are not supported by this compile then the statement machine
112379: ** used to detect the end of a statement is much simplier
112380: */
112381: static const u8 trans[3][3] = {
112382: /* Token: */
112383: /* State: ** SEMI WS OTHER */
112384: /* 0 INVALID: */ { 1, 0, 2, },
112385: /* 1 START: */ { 1, 1, 2, },
112386: /* 2 NORMAL: */ { 1, 2, 2, },
112387: };
112388: #endif /* SQLITE_OMIT_TRIGGER */
112389:
112390: while( *zSql ){
112391: switch( *zSql ){
112392: case ';': { /* A semicolon */
112393: token = tkSEMI;
112394: break;
112395: }
112396: case ' ':
112397: case '\r':
112398: case '\t':
112399: case '\n':
112400: case '\f': { /* White space is ignored */
112401: token = tkWS;
112402: break;
112403: }
112404: case '/': { /* C-style comments */
112405: if( zSql[1]!='*' ){
112406: token = tkOTHER;
112407: break;
112408: }
112409: zSql += 2;
112410: while( zSql[0] && (zSql[0]!='*' || zSql[1]!='/') ){ zSql++; }
112411: if( zSql[0]==0 ) return 0;
112412: zSql++;
112413: token = tkWS;
112414: break;
112415: }
112416: case '-': { /* SQL-style comments from "--" to end of line */
112417: if( zSql[1]!='-' ){
112418: token = tkOTHER;
112419: break;
112420: }
112421: while( *zSql && *zSql!='\n' ){ zSql++; }
112422: if( *zSql==0 ) return state==1;
112423: token = tkWS;
112424: break;
112425: }
112426: case '[': { /* Microsoft-style identifiers in [...] */
112427: zSql++;
112428: while( *zSql && *zSql!=']' ){ zSql++; }
112429: if( *zSql==0 ) return 0;
112430: token = tkOTHER;
112431: break;
112432: }
112433: case '`': /* Grave-accent quoted symbols used by MySQL */
112434: case '"': /* single- and double-quoted strings */
112435: case '\'': {
112436: int c = *zSql;
112437: zSql++;
112438: while( *zSql && *zSql!=c ){ zSql++; }
112439: if( *zSql==0 ) return 0;
112440: token = tkOTHER;
112441: break;
112442: }
112443: default: {
112444: #ifdef SQLITE_EBCDIC
112445: unsigned char c;
112446: #endif
112447: if( IdChar((u8)*zSql) ){
112448: /* Keywords and unquoted identifiers */
112449: int nId;
112450: for(nId=1; IdChar(zSql[nId]); nId++){}
112451: #ifdef SQLITE_OMIT_TRIGGER
112452: token = tkOTHER;
112453: #else
112454: switch( *zSql ){
112455: case 'c': case 'C': {
112456: if( nId==6 && sqlite3StrNICmp(zSql, "create", 6)==0 ){
112457: token = tkCREATE;
112458: }else{
112459: token = tkOTHER;
112460: }
112461: break;
112462: }
112463: case 't': case 'T': {
112464: if( nId==7 && sqlite3StrNICmp(zSql, "trigger", 7)==0 ){
112465: token = tkTRIGGER;
112466: }else if( nId==4 && sqlite3StrNICmp(zSql, "temp", 4)==0 ){
112467: token = tkTEMP;
112468: }else if( nId==9 && sqlite3StrNICmp(zSql, "temporary", 9)==0 ){
112469: token = tkTEMP;
112470: }else{
112471: token = tkOTHER;
112472: }
112473: break;
112474: }
112475: case 'e': case 'E': {
112476: if( nId==3 && sqlite3StrNICmp(zSql, "end", 3)==0 ){
112477: token = tkEND;
112478: }else
112479: #ifndef SQLITE_OMIT_EXPLAIN
112480: if( nId==7 && sqlite3StrNICmp(zSql, "explain", 7)==0 ){
112481: token = tkEXPLAIN;
112482: }else
112483: #endif
112484: {
112485: token = tkOTHER;
112486: }
112487: break;
112488: }
112489: default: {
112490: token = tkOTHER;
112491: break;
112492: }
112493: }
112494: #endif /* SQLITE_OMIT_TRIGGER */
112495: zSql += nId-1;
112496: }else{
112497: /* Operators and special symbols */
112498: token = tkOTHER;
112499: }
112500: break;
112501: }
112502: }
112503: state = trans[state][token];
112504: zSql++;
112505: }
112506: return state==1;
112507: }
112508:
112509: #ifndef SQLITE_OMIT_UTF16
112510: /*
112511: ** This routine is the same as the sqlite3_complete() routine described
112512: ** above, except that the parameter is required to be UTF-16 encoded, not
112513: ** UTF-8.
112514: */
112515: SQLITE_API int sqlite3_complete16(const void *zSql){
112516: sqlite3_value *pVal;
112517: char const *zSql8;
112518: int rc = SQLITE_NOMEM;
112519:
112520: #ifndef SQLITE_OMIT_AUTOINIT
112521: rc = sqlite3_initialize();
112522: if( rc ) return rc;
112523: #endif
112524: pVal = sqlite3ValueNew(0);
112525: sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC);
112526: zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8);
112527: if( zSql8 ){
112528: rc = sqlite3_complete(zSql8);
112529: }else{
112530: rc = SQLITE_NOMEM;
112531: }
112532: sqlite3ValueFree(pVal);
112533: return sqlite3ApiExit(0, rc);
112534: }
112535: #endif /* SQLITE_OMIT_UTF16 */
112536: #endif /* SQLITE_OMIT_COMPLETE */
112537:
112538: /************** End of complete.c ********************************************/
112539: /************** Begin file main.c ********************************************/
112540: /*
112541: ** 2001 September 15
112542: **
112543: ** The author disclaims copyright to this source code. In place of
112544: ** a legal notice, here is a blessing:
112545: **
112546: ** May you do good and not evil.
112547: ** May you find forgiveness for yourself and forgive others.
112548: ** May you share freely, never taking more than you give.
112549: **
112550: *************************************************************************
112551: ** Main file for the SQLite library. The routines in this file
112552: ** implement the programmer interface to the library. Routines in
112553: ** other files are for internal use by SQLite and should not be
112554: ** accessed by users of the library.
112555: */
112556:
112557: #ifdef SQLITE_ENABLE_FTS3
112558: /************** Include fts3.h in the middle of main.c ***********************/
112559: /************** Begin file fts3.h ********************************************/
112560: /*
112561: ** 2006 Oct 10
112562: **
112563: ** The author disclaims copyright to this source code. In place of
112564: ** a legal notice, here is a blessing:
112565: **
112566: ** May you do good and not evil.
112567: ** May you find forgiveness for yourself and forgive others.
112568: ** May you share freely, never taking more than you give.
112569: **
112570: ******************************************************************************
112571: **
112572: ** This header file is used by programs that want to link against the
112573: ** FTS3 library. All it does is declare the sqlite3Fts3Init() interface.
112574: */
112575:
112576: #if 0
112577: extern "C" {
112578: #endif /* __cplusplus */
112579:
112580: SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db);
112581:
112582: #if 0
112583: } /* extern "C" */
112584: #endif /* __cplusplus */
112585:
112586: /************** End of fts3.h ************************************************/
112587: /************** Continuing where we left off in main.c ***********************/
112588: #endif
112589: #ifdef SQLITE_ENABLE_RTREE
112590: /************** Include rtree.h in the middle of main.c **********************/
112591: /************** Begin file rtree.h *******************************************/
112592: /*
112593: ** 2008 May 26
112594: **
112595: ** The author disclaims copyright to this source code. In place of
112596: ** a legal notice, here is a blessing:
112597: **
112598: ** May you do good and not evil.
112599: ** May you find forgiveness for yourself and forgive others.
112600: ** May you share freely, never taking more than you give.
112601: **
112602: ******************************************************************************
112603: **
112604: ** This header file is used by programs that want to link against the
112605: ** RTREE library. All it does is declare the sqlite3RtreeInit() interface.
112606: */
112607:
112608: #if 0
112609: extern "C" {
112610: #endif /* __cplusplus */
112611:
112612: SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db);
112613:
112614: #if 0
112615: } /* extern "C" */
112616: #endif /* __cplusplus */
112617:
112618: /************** End of rtree.h ***********************************************/
112619: /************** Continuing where we left off in main.c ***********************/
112620: #endif
112621: #ifdef SQLITE_ENABLE_ICU
112622: /************** Include sqliteicu.h in the middle of main.c ******************/
112623: /************** Begin file sqliteicu.h ***************************************/
112624: /*
112625: ** 2008 May 26
112626: **
112627: ** The author disclaims copyright to this source code. In place of
112628: ** a legal notice, here is a blessing:
112629: **
112630: ** May you do good and not evil.
112631: ** May you find forgiveness for yourself and forgive others.
112632: ** May you share freely, never taking more than you give.
112633: **
112634: ******************************************************************************
112635: **
112636: ** This header file is used by programs that want to link against the
112637: ** ICU extension. All it does is declare the sqlite3IcuInit() interface.
112638: */
112639:
112640: #if 0
112641: extern "C" {
112642: #endif /* __cplusplus */
112643:
112644: SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db);
112645:
112646: #if 0
112647: } /* extern "C" */
112648: #endif /* __cplusplus */
112649:
112650:
112651: /************** End of sqliteicu.h *******************************************/
112652: /************** Continuing where we left off in main.c ***********************/
112653: #endif
112654:
112655: #ifndef SQLITE_AMALGAMATION
112656: /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant
112657: ** contains the text of SQLITE_VERSION macro.
112658: */
112659: SQLITE_API const char sqlite3_version[] = SQLITE_VERSION;
112660: #endif
112661:
112662: /* IMPLEMENTATION-OF: R-53536-42575 The sqlite3_libversion() function returns
112663: ** a pointer to the to the sqlite3_version[] string constant.
112664: */
112665: SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; }
112666:
112667: /* IMPLEMENTATION-OF: R-63124-39300 The sqlite3_sourceid() function returns a
112668: ** pointer to a string constant whose value is the same as the
112669: ** SQLITE_SOURCE_ID C preprocessor macro.
112670: */
112671: SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
112672:
112673: /* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function
112674: ** returns an integer equal to SQLITE_VERSION_NUMBER.
112675: */
112676: SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; }
112677:
112678: /* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns
112679: ** zero if and only if SQLite was compiled with mutexing code omitted due to
112680: ** the SQLITE_THREADSAFE compile-time option being set to 0.
112681: */
112682: SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }
112683:
112684: #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE)
112685: /*
112686: ** If the following function pointer is not NULL and if
112687: ** SQLITE_ENABLE_IOTRACE is enabled, then messages describing
112688: ** I/O active are written using this function. These messages
112689: ** are intended for debugging activity only.
112690: */
112691: SQLITE_PRIVATE void (*sqlite3IoTrace)(const char*, ...) = 0;
112692: #endif
112693:
112694: /*
112695: ** If the following global variable points to a string which is the
112696: ** name of a directory, then that directory will be used to store
112697: ** temporary files.
112698: **
112699: ** See also the "PRAGMA temp_store_directory" SQL command.
112700: */
112701: SQLITE_API char *sqlite3_temp_directory = 0;
112702:
112703: /*
1.2.2.1 ! misho 112704: ** If the following global variable points to a string which is the
! 112705: ** name of a directory, then that directory will be used to store
! 112706: ** all database files specified with a relative pathname.
! 112707: **
! 112708: ** See also the "PRAGMA data_store_directory" SQL command.
! 112709: */
! 112710: SQLITE_API char *sqlite3_data_directory = 0;
! 112711:
! 112712: /*
1.2 misho 112713: ** Initialize SQLite.
112714: **
112715: ** This routine must be called to initialize the memory allocation,
112716: ** VFS, and mutex subsystems prior to doing any serious work with
112717: ** SQLite. But as long as you do not compile with SQLITE_OMIT_AUTOINIT
112718: ** this routine will be called automatically by key routines such as
112719: ** sqlite3_open().
112720: **
112721: ** This routine is a no-op except on its very first call for the process,
112722: ** or for the first call after a call to sqlite3_shutdown.
112723: **
112724: ** The first thread to call this routine runs the initialization to
112725: ** completion. If subsequent threads call this routine before the first
112726: ** thread has finished the initialization process, then the subsequent
112727: ** threads must block until the first thread finishes with the initialization.
112728: **
112729: ** The first thread might call this routine recursively. Recursive
112730: ** calls to this routine should not block, of course. Otherwise the
112731: ** initialization process would never complete.
112732: **
112733: ** Let X be the first thread to enter this routine. Let Y be some other
112734: ** thread. Then while the initial invocation of this routine by X is
112735: ** incomplete, it is required that:
112736: **
112737: ** * Calls to this routine from Y must block until the outer-most
112738: ** call by X completes.
112739: **
112740: ** * Recursive calls to this routine from thread X return immediately
112741: ** without blocking.
112742: */
112743: SQLITE_API int sqlite3_initialize(void){
112744: MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */
112745: int rc; /* Result code */
112746:
112747: #ifdef SQLITE_OMIT_WSD
112748: rc = sqlite3_wsd_init(4096, 24);
112749: if( rc!=SQLITE_OK ){
112750: return rc;
112751: }
112752: #endif
112753:
112754: /* If SQLite is already completely initialized, then this call
112755: ** to sqlite3_initialize() should be a no-op. But the initialization
112756: ** must be complete. So isInit must not be set until the very end
112757: ** of this routine.
112758: */
112759: if( sqlite3GlobalConfig.isInit ) return SQLITE_OK;
112760:
1.2.2.1 ! misho 112761: #ifdef SQLITE_ENABLE_SQLLOG
! 112762: {
! 112763: extern void sqlite3_init_sqllog(void);
! 112764: sqlite3_init_sqllog();
! 112765: }
! 112766: #endif
! 112767:
1.2 misho 112768: /* Make sure the mutex subsystem is initialized. If unable to
112769: ** initialize the mutex subsystem, return early with the error.
112770: ** If the system is so sick that we are unable to allocate a mutex,
112771: ** there is not much SQLite is going to be able to do.
112772: **
112773: ** The mutex subsystem must take care of serializing its own
112774: ** initialization.
112775: */
112776: rc = sqlite3MutexInit();
112777: if( rc ) return rc;
112778:
112779: /* Initialize the malloc() system and the recursive pInitMutex mutex.
112780: ** This operation is protected by the STATIC_MASTER mutex. Note that
112781: ** MutexAlloc() is called for a static mutex prior to initializing the
112782: ** malloc subsystem - this implies that the allocation of a static
112783: ** mutex must not require support from the malloc subsystem.
112784: */
112785: MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
112786: sqlite3_mutex_enter(pMaster);
112787: sqlite3GlobalConfig.isMutexInit = 1;
112788: if( !sqlite3GlobalConfig.isMallocInit ){
112789: rc = sqlite3MallocInit();
112790: }
112791: if( rc==SQLITE_OK ){
112792: sqlite3GlobalConfig.isMallocInit = 1;
112793: if( !sqlite3GlobalConfig.pInitMutex ){
112794: sqlite3GlobalConfig.pInitMutex =
112795: sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
112796: if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){
112797: rc = SQLITE_NOMEM;
112798: }
112799: }
112800: }
112801: if( rc==SQLITE_OK ){
112802: sqlite3GlobalConfig.nRefInitMutex++;
112803: }
112804: sqlite3_mutex_leave(pMaster);
112805:
112806: /* If rc is not SQLITE_OK at this point, then either the malloc
112807: ** subsystem could not be initialized or the system failed to allocate
112808: ** the pInitMutex mutex. Return an error in either case. */
112809: if( rc!=SQLITE_OK ){
112810: return rc;
112811: }
112812:
112813: /* Do the rest of the initialization under the recursive mutex so
112814: ** that we will be able to handle recursive calls into
112815: ** sqlite3_initialize(). The recursive calls normally come through
112816: ** sqlite3_os_init() when it invokes sqlite3_vfs_register(), but other
112817: ** recursive calls might also be possible.
112818: **
112819: ** IMPLEMENTATION-OF: R-00140-37445 SQLite automatically serializes calls
112820: ** to the xInit method, so the xInit method need not be threadsafe.
112821: **
112822: ** The following mutex is what serializes access to the appdef pcache xInit
112823: ** methods. The sqlite3_pcache_methods.xInit() all is embedded in the
112824: ** call to sqlite3PcacheInitialize().
112825: */
112826: sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex);
112827: if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){
112828: FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
112829: sqlite3GlobalConfig.inProgress = 1;
112830: memset(pHash, 0, sizeof(sqlite3GlobalFunctions));
112831: sqlite3RegisterGlobalFunctions();
112832: if( sqlite3GlobalConfig.isPCacheInit==0 ){
112833: rc = sqlite3PcacheInitialize();
112834: }
112835: if( rc==SQLITE_OK ){
112836: sqlite3GlobalConfig.isPCacheInit = 1;
112837: rc = sqlite3OsInit();
112838: }
112839: if( rc==SQLITE_OK ){
112840: sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage,
112841: sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage);
112842: sqlite3GlobalConfig.isInit = 1;
112843: }
112844: sqlite3GlobalConfig.inProgress = 0;
112845: }
112846: sqlite3_mutex_leave(sqlite3GlobalConfig.pInitMutex);
112847:
112848: /* Go back under the static mutex and clean up the recursive
112849: ** mutex to prevent a resource leak.
112850: */
112851: sqlite3_mutex_enter(pMaster);
112852: sqlite3GlobalConfig.nRefInitMutex--;
112853: if( sqlite3GlobalConfig.nRefInitMutex<=0 ){
112854: assert( sqlite3GlobalConfig.nRefInitMutex==0 );
112855: sqlite3_mutex_free(sqlite3GlobalConfig.pInitMutex);
112856: sqlite3GlobalConfig.pInitMutex = 0;
112857: }
112858: sqlite3_mutex_leave(pMaster);
112859:
112860: /* The following is just a sanity check to make sure SQLite has
112861: ** been compiled correctly. It is important to run this code, but
112862: ** we don't want to run it too often and soak up CPU cycles for no
112863: ** reason. So we run it once during initialization.
112864: */
112865: #ifndef NDEBUG
112866: #ifndef SQLITE_OMIT_FLOATING_POINT
112867: /* This section of code's only "output" is via assert() statements. */
112868: if ( rc==SQLITE_OK ){
112869: u64 x = (((u64)1)<<63)-1;
112870: double y;
112871: assert(sizeof(x)==8);
112872: assert(sizeof(x)==sizeof(y));
112873: memcpy(&y, &x, 8);
112874: assert( sqlite3IsNaN(y) );
112875: }
112876: #endif
112877: #endif
112878:
112879: /* Do extra initialization steps requested by the SQLITE_EXTRA_INIT
112880: ** compile-time option.
112881: */
112882: #ifdef SQLITE_EXTRA_INIT
112883: if( rc==SQLITE_OK && sqlite3GlobalConfig.isInit ){
112884: int SQLITE_EXTRA_INIT(const char*);
112885: rc = SQLITE_EXTRA_INIT(0);
112886: }
112887: #endif
112888:
112889: return rc;
112890: }
112891:
112892: /*
112893: ** Undo the effects of sqlite3_initialize(). Must not be called while
112894: ** there are outstanding database connections or memory allocations or
112895: ** while any part of SQLite is otherwise in use in any thread. This
112896: ** routine is not threadsafe. But it is safe to invoke this routine
112897: ** on when SQLite is already shut down. If SQLite is already shut down
112898: ** when this routine is invoked, then this routine is a harmless no-op.
112899: */
112900: SQLITE_API int sqlite3_shutdown(void){
112901: if( sqlite3GlobalConfig.isInit ){
112902: #ifdef SQLITE_EXTRA_SHUTDOWN
112903: void SQLITE_EXTRA_SHUTDOWN(void);
112904: SQLITE_EXTRA_SHUTDOWN();
112905: #endif
112906: sqlite3_os_end();
112907: sqlite3_reset_auto_extension();
112908: sqlite3GlobalConfig.isInit = 0;
112909: }
112910: if( sqlite3GlobalConfig.isPCacheInit ){
112911: sqlite3PcacheShutdown();
112912: sqlite3GlobalConfig.isPCacheInit = 0;
112913: }
112914: if( sqlite3GlobalConfig.isMallocInit ){
112915: sqlite3MallocEnd();
112916: sqlite3GlobalConfig.isMallocInit = 0;
1.2.2.1 ! misho 112917:
! 112918: #ifndef SQLITE_OMIT_SHUTDOWN_DIRECTORIES
! 112919: /* The heap subsystem has now been shutdown and these values are supposed
! 112920: ** to be NULL or point to memory that was obtained from sqlite3_malloc(),
! 112921: ** which would rely on that heap subsystem; therefore, make sure these
! 112922: ** values cannot refer to heap memory that was just invalidated when the
! 112923: ** heap subsystem was shutdown. This is only done if the current call to
! 112924: ** this function resulted in the heap subsystem actually being shutdown.
! 112925: */
! 112926: sqlite3_data_directory = 0;
! 112927: sqlite3_temp_directory = 0;
! 112928: #endif
1.2 misho 112929: }
112930: if( sqlite3GlobalConfig.isMutexInit ){
112931: sqlite3MutexEnd();
112932: sqlite3GlobalConfig.isMutexInit = 0;
112933: }
112934:
112935: return SQLITE_OK;
112936: }
112937:
112938: /*
112939: ** This API allows applications to modify the global configuration of
112940: ** the SQLite library at run-time.
112941: **
112942: ** This routine should only be called when there are no outstanding
112943: ** database connections or memory allocations. This routine is not
112944: ** threadsafe. Failure to heed these warnings can lead to unpredictable
112945: ** behavior.
112946: */
112947: SQLITE_API int sqlite3_config(int op, ...){
112948: va_list ap;
112949: int rc = SQLITE_OK;
112950:
112951: /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while
112952: ** the SQLite library is in use. */
112953: if( sqlite3GlobalConfig.isInit ) return SQLITE_MISUSE_BKPT;
112954:
112955: va_start(ap, op);
112956: switch( op ){
112957:
112958: /* Mutex configuration options are only available in a threadsafe
112959: ** compile.
112960: */
112961: #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0
112962: case SQLITE_CONFIG_SINGLETHREAD: {
112963: /* Disable all mutexing */
112964: sqlite3GlobalConfig.bCoreMutex = 0;
112965: sqlite3GlobalConfig.bFullMutex = 0;
112966: break;
112967: }
112968: case SQLITE_CONFIG_MULTITHREAD: {
112969: /* Disable mutexing of database connections */
112970: /* Enable mutexing of core data structures */
112971: sqlite3GlobalConfig.bCoreMutex = 1;
112972: sqlite3GlobalConfig.bFullMutex = 0;
112973: break;
112974: }
112975: case SQLITE_CONFIG_SERIALIZED: {
112976: /* Enable all mutexing */
112977: sqlite3GlobalConfig.bCoreMutex = 1;
112978: sqlite3GlobalConfig.bFullMutex = 1;
112979: break;
112980: }
112981: case SQLITE_CONFIG_MUTEX: {
112982: /* Specify an alternative mutex implementation */
112983: sqlite3GlobalConfig.mutex = *va_arg(ap, sqlite3_mutex_methods*);
112984: break;
112985: }
112986: case SQLITE_CONFIG_GETMUTEX: {
112987: /* Retrieve the current mutex implementation */
112988: *va_arg(ap, sqlite3_mutex_methods*) = sqlite3GlobalConfig.mutex;
112989: break;
112990: }
112991: #endif
112992:
112993:
112994: case SQLITE_CONFIG_MALLOC: {
112995: /* Specify an alternative malloc implementation */
112996: sqlite3GlobalConfig.m = *va_arg(ap, sqlite3_mem_methods*);
112997: break;
112998: }
112999: case SQLITE_CONFIG_GETMALLOC: {
113000: /* Retrieve the current malloc() implementation */
113001: if( sqlite3GlobalConfig.m.xMalloc==0 ) sqlite3MemSetDefault();
113002: *va_arg(ap, sqlite3_mem_methods*) = sqlite3GlobalConfig.m;
113003: break;
113004: }
113005: case SQLITE_CONFIG_MEMSTATUS: {
113006: /* Enable or disable the malloc status collection */
113007: sqlite3GlobalConfig.bMemstat = va_arg(ap, int);
113008: break;
113009: }
113010: case SQLITE_CONFIG_SCRATCH: {
113011: /* Designate a buffer for scratch memory space */
113012: sqlite3GlobalConfig.pScratch = va_arg(ap, void*);
113013: sqlite3GlobalConfig.szScratch = va_arg(ap, int);
113014: sqlite3GlobalConfig.nScratch = va_arg(ap, int);
113015: break;
113016: }
113017: case SQLITE_CONFIG_PAGECACHE: {
113018: /* Designate a buffer for page cache memory space */
113019: sqlite3GlobalConfig.pPage = va_arg(ap, void*);
113020: sqlite3GlobalConfig.szPage = va_arg(ap, int);
113021: sqlite3GlobalConfig.nPage = va_arg(ap, int);
113022: break;
113023: }
113024:
113025: case SQLITE_CONFIG_PCACHE: {
113026: /* no-op */
113027: break;
113028: }
113029: case SQLITE_CONFIG_GETPCACHE: {
113030: /* now an error */
113031: rc = SQLITE_ERROR;
113032: break;
113033: }
113034:
113035: case SQLITE_CONFIG_PCACHE2: {
113036: /* Specify an alternative page cache implementation */
113037: sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*);
113038: break;
113039: }
113040: case SQLITE_CONFIG_GETPCACHE2: {
113041: if( sqlite3GlobalConfig.pcache2.xInit==0 ){
113042: sqlite3PCacheSetDefault();
113043: }
113044: *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2;
113045: break;
113046: }
113047:
113048: #if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
113049: case SQLITE_CONFIG_HEAP: {
113050: /* Designate a buffer for heap memory space */
113051: sqlite3GlobalConfig.pHeap = va_arg(ap, void*);
113052: sqlite3GlobalConfig.nHeap = va_arg(ap, int);
113053: sqlite3GlobalConfig.mnReq = va_arg(ap, int);
113054:
113055: if( sqlite3GlobalConfig.mnReq<1 ){
113056: sqlite3GlobalConfig.mnReq = 1;
113057: }else if( sqlite3GlobalConfig.mnReq>(1<<12) ){
113058: /* cap min request size at 2^12 */
113059: sqlite3GlobalConfig.mnReq = (1<<12);
113060: }
113061:
113062: if( sqlite3GlobalConfig.pHeap==0 ){
113063: /* If the heap pointer is NULL, then restore the malloc implementation
113064: ** back to NULL pointers too. This will cause the malloc to go
113065: ** back to its default implementation when sqlite3_initialize() is
113066: ** run.
113067: */
113068: memset(&sqlite3GlobalConfig.m, 0, sizeof(sqlite3GlobalConfig.m));
113069: }else{
113070: /* The heap pointer is not NULL, then install one of the
113071: ** mem5.c/mem3.c methods. If neither ENABLE_MEMSYS3 nor
113072: ** ENABLE_MEMSYS5 is defined, return an error.
113073: */
113074: #ifdef SQLITE_ENABLE_MEMSYS3
113075: sqlite3GlobalConfig.m = *sqlite3MemGetMemsys3();
113076: #endif
113077: #ifdef SQLITE_ENABLE_MEMSYS5
113078: sqlite3GlobalConfig.m = *sqlite3MemGetMemsys5();
113079: #endif
113080: }
113081: break;
113082: }
113083: #endif
113084:
113085: case SQLITE_CONFIG_LOOKASIDE: {
113086: sqlite3GlobalConfig.szLookaside = va_arg(ap, int);
113087: sqlite3GlobalConfig.nLookaside = va_arg(ap, int);
113088: break;
113089: }
113090:
113091: /* Record a pointer to the logger funcction and its first argument.
113092: ** The default is NULL. Logging is disabled if the function pointer is
113093: ** NULL.
113094: */
113095: case SQLITE_CONFIG_LOG: {
113096: /* MSVC is picky about pulling func ptrs from va lists.
113097: ** http://support.microsoft.com/kb/47961
113098: ** sqlite3GlobalConfig.xLog = va_arg(ap, void(*)(void*,int,const char*));
113099: */
113100: typedef void(*LOGFUNC_t)(void*,int,const char*);
113101: sqlite3GlobalConfig.xLog = va_arg(ap, LOGFUNC_t);
113102: sqlite3GlobalConfig.pLogArg = va_arg(ap, void*);
113103: break;
113104: }
113105:
113106: case SQLITE_CONFIG_URI: {
113107: sqlite3GlobalConfig.bOpenUri = va_arg(ap, int);
113108: break;
113109: }
113110:
1.2.2.1 ! misho 113111: case SQLITE_CONFIG_COVERING_INDEX_SCAN: {
! 113112: sqlite3GlobalConfig.bUseCis = va_arg(ap, int);
! 113113: break;
! 113114: }
! 113115:
! 113116: #ifdef SQLITE_ENABLE_SQLLOG
! 113117: case SQLITE_CONFIG_SQLLOG: {
! 113118: typedef void(*SQLLOGFUNC_t)(void*, sqlite3*, const char*, int);
! 113119: sqlite3GlobalConfig.xSqllog = va_arg(ap, SQLLOGFUNC_t);
! 113120: sqlite3GlobalConfig.pSqllogArg = va_arg(ap, void *);
! 113121: break;
! 113122: }
! 113123: #endif
! 113124:
1.2 misho 113125: default: {
113126: rc = SQLITE_ERROR;
113127: break;
113128: }
113129: }
113130: va_end(ap);
113131: return rc;
113132: }
113133:
113134: /*
113135: ** Set up the lookaside buffers for a database connection.
113136: ** Return SQLITE_OK on success.
113137: ** If lookaside is already active, return SQLITE_BUSY.
113138: **
113139: ** The sz parameter is the number of bytes in each lookaside slot.
113140: ** The cnt parameter is the number of slots. If pStart is NULL the
113141: ** space for the lookaside memory is obtained from sqlite3_malloc().
113142: ** If pStart is not NULL then it is sz*cnt bytes of memory to use for
113143: ** the lookaside memory.
113144: */
113145: static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){
113146: void *pStart;
113147: if( db->lookaside.nOut ){
113148: return SQLITE_BUSY;
113149: }
113150: /* Free any existing lookaside buffer for this handle before
113151: ** allocating a new one so we don't have to have space for
113152: ** both at the same time.
113153: */
113154: if( db->lookaside.bMalloced ){
113155: sqlite3_free(db->lookaside.pStart);
113156: }
113157: /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger
113158: ** than a pointer to be useful.
113159: */
113160: sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */
113161: if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0;
113162: if( cnt<0 ) cnt = 0;
113163: if( sz==0 || cnt==0 ){
113164: sz = 0;
113165: pStart = 0;
113166: }else if( pBuf==0 ){
113167: sqlite3BeginBenignMalloc();
113168: pStart = sqlite3Malloc( sz*cnt ); /* IMP: R-61949-35727 */
113169: sqlite3EndBenignMalloc();
113170: if( pStart ) cnt = sqlite3MallocSize(pStart)/sz;
113171: }else{
113172: pStart = pBuf;
113173: }
113174: db->lookaside.pStart = pStart;
113175: db->lookaside.pFree = 0;
113176: db->lookaside.sz = (u16)sz;
113177: if( pStart ){
113178: int i;
113179: LookasideSlot *p;
113180: assert( sz > (int)sizeof(LookasideSlot*) );
113181: p = (LookasideSlot*)pStart;
113182: for(i=cnt-1; i>=0; i--){
113183: p->pNext = db->lookaside.pFree;
113184: db->lookaside.pFree = p;
113185: p = (LookasideSlot*)&((u8*)p)[sz];
113186: }
113187: db->lookaside.pEnd = p;
113188: db->lookaside.bEnabled = 1;
113189: db->lookaside.bMalloced = pBuf==0 ?1:0;
113190: }else{
113191: db->lookaside.pEnd = 0;
113192: db->lookaside.bEnabled = 0;
113193: db->lookaside.bMalloced = 0;
113194: }
113195: return SQLITE_OK;
113196: }
113197:
113198: /*
113199: ** Return the mutex associated with a database connection.
113200: */
113201: SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3 *db){
113202: return db->mutex;
113203: }
113204:
113205: /*
113206: ** Free up as much memory as we can from the given database
113207: ** connection.
113208: */
113209: SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){
113210: int i;
113211: sqlite3_mutex_enter(db->mutex);
113212: sqlite3BtreeEnterAll(db);
113213: for(i=0; i<db->nDb; i++){
113214: Btree *pBt = db->aDb[i].pBt;
113215: if( pBt ){
113216: Pager *pPager = sqlite3BtreePager(pBt);
113217: sqlite3PagerShrink(pPager);
113218: }
113219: }
113220: sqlite3BtreeLeaveAll(db);
113221: sqlite3_mutex_leave(db->mutex);
113222: return SQLITE_OK;
113223: }
113224:
113225: /*
113226: ** Configuration settings for an individual database connection
113227: */
113228: SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){
113229: va_list ap;
113230: int rc;
113231: va_start(ap, op);
113232: switch( op ){
113233: case SQLITE_DBCONFIG_LOOKASIDE: {
113234: void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */
113235: int sz = va_arg(ap, int); /* IMP: R-47871-25994 */
113236: int cnt = va_arg(ap, int); /* IMP: R-04460-53386 */
113237: rc = setupLookaside(db, pBuf, sz, cnt);
113238: break;
113239: }
113240: default: {
113241: static const struct {
113242: int op; /* The opcode */
113243: u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */
113244: } aFlagOp[] = {
113245: { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys },
113246: { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger },
113247: };
113248: unsigned int i;
113249: rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
113250: for(i=0; i<ArraySize(aFlagOp); i++){
113251: if( aFlagOp[i].op==op ){
113252: int onoff = va_arg(ap, int);
113253: int *pRes = va_arg(ap, int*);
113254: int oldFlags = db->flags;
113255: if( onoff>0 ){
113256: db->flags |= aFlagOp[i].mask;
113257: }else if( onoff==0 ){
113258: db->flags &= ~aFlagOp[i].mask;
113259: }
113260: if( oldFlags!=db->flags ){
113261: sqlite3ExpirePreparedStatements(db);
113262: }
113263: if( pRes ){
113264: *pRes = (db->flags & aFlagOp[i].mask)!=0;
113265: }
113266: rc = SQLITE_OK;
113267: break;
113268: }
113269: }
113270: break;
113271: }
113272: }
113273: va_end(ap);
113274: return rc;
113275: }
113276:
113277:
113278: /*
113279: ** Return true if the buffer z[0..n-1] contains all spaces.
113280: */
113281: static int allSpaces(const char *z, int n){
113282: while( n>0 && z[n-1]==' ' ){ n--; }
113283: return n==0;
113284: }
113285:
113286: /*
113287: ** This is the default collating function named "BINARY" which is always
113288: ** available.
113289: **
113290: ** If the padFlag argument is not NULL then space padding at the end
113291: ** of strings is ignored. This implements the RTRIM collation.
113292: */
113293: static int binCollFunc(
113294: void *padFlag,
113295: int nKey1, const void *pKey1,
113296: int nKey2, const void *pKey2
113297: ){
113298: int rc, n;
113299: n = nKey1<nKey2 ? nKey1 : nKey2;
113300: rc = memcmp(pKey1, pKey2, n);
113301: if( rc==0 ){
113302: if( padFlag
113303: && allSpaces(((char*)pKey1)+n, nKey1-n)
113304: && allSpaces(((char*)pKey2)+n, nKey2-n)
113305: ){
113306: /* Leave rc unchanged at 0 */
113307: }else{
113308: rc = nKey1 - nKey2;
113309: }
113310: }
113311: return rc;
113312: }
113313:
113314: /*
113315: ** Another built-in collating sequence: NOCASE.
113316: **
113317: ** This collating sequence is intended to be used for "case independant
113318: ** comparison". SQLite's knowledge of upper and lower case equivalents
113319: ** extends only to the 26 characters used in the English language.
113320: **
113321: ** At the moment there is only a UTF-8 implementation.
113322: */
113323: static int nocaseCollatingFunc(
113324: void *NotUsed,
113325: int nKey1, const void *pKey1,
113326: int nKey2, const void *pKey2
113327: ){
113328: int r = sqlite3StrNICmp(
113329: (const char *)pKey1, (const char *)pKey2, (nKey1<nKey2)?nKey1:nKey2);
113330: UNUSED_PARAMETER(NotUsed);
113331: if( 0==r ){
113332: r = nKey1-nKey2;
113333: }
113334: return r;
113335: }
113336:
113337: /*
113338: ** Return the ROWID of the most recent insert
113339: */
113340: SQLITE_API sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){
113341: return db->lastRowid;
113342: }
113343:
113344: /*
113345: ** Return the number of changes in the most recent call to sqlite3_exec().
113346: */
113347: SQLITE_API int sqlite3_changes(sqlite3 *db){
113348: return db->nChange;
113349: }
113350:
113351: /*
113352: ** Return the number of changes since the database handle was opened.
113353: */
113354: SQLITE_API int sqlite3_total_changes(sqlite3 *db){
113355: return db->nTotalChange;
113356: }
113357:
113358: /*
113359: ** Close all open savepoints. This function only manipulates fields of the
113360: ** database handle object, it does not close any savepoints that may be open
113361: ** at the b-tree/pager level.
113362: */
113363: SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){
113364: while( db->pSavepoint ){
113365: Savepoint *pTmp = db->pSavepoint;
113366: db->pSavepoint = pTmp->pNext;
113367: sqlite3DbFree(db, pTmp);
113368: }
113369: db->nSavepoint = 0;
113370: db->nStatement = 0;
113371: db->isTransactionSavepoint = 0;
113372: }
113373:
113374: /*
113375: ** Invoke the destructor function associated with FuncDef p, if any. Except,
113376: ** if this is not the last copy of the function, do not invoke it. Multiple
113377: ** copies of a single function are created when create_function() is called
113378: ** with SQLITE_ANY as the encoding.
113379: */
113380: static void functionDestroy(sqlite3 *db, FuncDef *p){
113381: FuncDestructor *pDestructor = p->pDestructor;
113382: if( pDestructor ){
113383: pDestructor->nRef--;
113384: if( pDestructor->nRef==0 ){
113385: pDestructor->xDestroy(pDestructor->pUserData);
113386: sqlite3DbFree(db, pDestructor);
113387: }
113388: }
113389: }
113390:
113391: /*
1.2.2.1 ! misho 113392: ** Disconnect all sqlite3_vtab objects that belong to database connection
! 113393: ** db. This is called when db is being closed.
1.2 misho 113394: */
1.2.2.1 ! misho 113395: static void disconnectAllVtab(sqlite3 *db){
! 113396: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 113397: int i;
! 113398: sqlite3BtreeEnterAll(db);
! 113399: for(i=0; i<db->nDb; i++){
! 113400: Schema *pSchema = db->aDb[i].pSchema;
! 113401: if( db->aDb[i].pSchema ){
! 113402: HashElem *p;
! 113403: for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){
! 113404: Table *pTab = (Table *)sqliteHashData(p);
! 113405: if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab);
! 113406: }
! 113407: }
! 113408: }
! 113409: sqlite3BtreeLeaveAll(db);
! 113410: #else
! 113411: UNUSED_PARAMETER(db);
! 113412: #endif
! 113413: }
! 113414:
! 113415: /*
! 113416: ** Return TRUE if database connection db has unfinalized prepared
! 113417: ** statements or unfinished sqlite3_backup objects.
! 113418: */
! 113419: static int connectionIsBusy(sqlite3 *db){
1.2 misho 113420: int j;
1.2.2.1 ! misho 113421: assert( sqlite3_mutex_held(db->mutex) );
! 113422: if( db->pVdbe ) return 1;
! 113423: for(j=0; j<db->nDb; j++){
! 113424: Btree *pBt = db->aDb[j].pBt;
! 113425: if( pBt && sqlite3BtreeIsInBackup(pBt) ) return 1;
! 113426: }
! 113427: return 0;
! 113428: }
1.2 misho 113429:
1.2.2.1 ! misho 113430: /*
! 113431: ** Close an existing SQLite database
! 113432: */
! 113433: static int sqlite3Close(sqlite3 *db, int forceZombie){
1.2 misho 113434: if( !db ){
113435: return SQLITE_OK;
113436: }
113437: if( !sqlite3SafetyCheckSickOrOk(db) ){
113438: return SQLITE_MISUSE_BKPT;
113439: }
113440: sqlite3_mutex_enter(db->mutex);
113441:
1.2.2.1 ! misho 113442: /* Force xDisconnect calls on all virtual tables */
! 113443: disconnectAllVtab(db);
1.2 misho 113444:
1.2.2.1 ! misho 113445: /* If a transaction is open, the disconnectAllVtab() call above
1.2 misho 113446: ** will not have called the xDisconnect() method on any virtual
113447: ** tables in the db->aVTrans[] array. The following sqlite3VtabRollback()
113448: ** call will do so. We need to do this before the check for active
113449: ** SQL statements below, as the v-table implementation may be storing
113450: ** some prepared statements internally.
113451: */
113452: sqlite3VtabRollback(db);
113453:
1.2.2.1 ! misho 113454: /* Legacy behavior (sqlite3_close() behavior) is to return
! 113455: ** SQLITE_BUSY if the connection can not be closed immediately.
! 113456: */
! 113457: if( !forceZombie && connectionIsBusy(db) ){
! 113458: sqlite3Error(db, SQLITE_BUSY, "unable to close due to unfinalized "
! 113459: "statements or unfinished backups");
1.2 misho 113460: sqlite3_mutex_leave(db->mutex);
113461: return SQLITE_BUSY;
113462: }
113463:
1.2.2.1 ! misho 113464: #ifdef SQLITE_ENABLE_SQLLOG
! 113465: if( sqlite3GlobalConfig.xSqllog ){
! 113466: /* Closing the handle. Fourth parameter is passed the value 2. */
! 113467: sqlite3GlobalConfig.xSqllog(sqlite3GlobalConfig.pSqllogArg, db, 0, 2);
! 113468: }
! 113469: #endif
! 113470:
! 113471: /* Convert the connection into a zombie and then close it.
! 113472: */
! 113473: db->magic = SQLITE_MAGIC_ZOMBIE;
! 113474: sqlite3LeaveMutexAndCloseZombie(db);
! 113475: return SQLITE_OK;
! 113476: }
! 113477:
! 113478: /*
! 113479: ** Two variations on the public interface for closing a database
! 113480: ** connection. The sqlite3_close() version returns SQLITE_BUSY and
! 113481: ** leaves the connection option if there are unfinalized prepared
! 113482: ** statements or unfinished sqlite3_backups. The sqlite3_close_v2()
! 113483: ** version forces the connection to become a zombie if there are
! 113484: ** unclosed resources, and arranges for deallocation when the last
! 113485: ** prepare statement or sqlite3_backup closes.
! 113486: */
! 113487: SQLITE_API int sqlite3_close(sqlite3 *db){ return sqlite3Close(db,0); }
! 113488: SQLITE_API int sqlite3_close_v2(sqlite3 *db){ return sqlite3Close(db,1); }
! 113489:
! 113490:
! 113491: /*
! 113492: ** Close the mutex on database connection db.
! 113493: **
! 113494: ** Furthermore, if database connection db is a zombie (meaning that there
! 113495: ** has been a prior call to sqlite3_close(db) or sqlite3_close_v2(db)) and
! 113496: ** every sqlite3_stmt has now been finalized and every sqlite3_backup has
! 113497: ** finished, then free all resources.
! 113498: */
! 113499: SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){
! 113500: HashElem *i; /* Hash table iterator */
! 113501: int j;
! 113502:
! 113503: /* If there are outstanding sqlite3_stmt or sqlite3_backup objects
! 113504: ** or if the connection has not yet been closed by sqlite3_close_v2(),
! 113505: ** then just leave the mutex and return.
! 113506: */
! 113507: if( db->magic!=SQLITE_MAGIC_ZOMBIE || connectionIsBusy(db) ){
! 113508: sqlite3_mutex_leave(db->mutex);
! 113509: return;
1.2 misho 113510: }
113511:
1.2.2.1 ! misho 113512: /* If we reach this point, it means that the database connection has
! 113513: ** closed all sqlite3_stmt and sqlite3_backup objects and has been
! 113514: ** pased to sqlite3_close (meaning that it is a zombie). Therefore,
! 113515: ** go ahead and free all resources.
! 113516: */
! 113517:
1.2 misho 113518: /* Free any outstanding Savepoint structures. */
113519: sqlite3CloseSavepoints(db);
113520:
1.2.2.1 ! misho 113521: /* Close all database connections */
1.2 misho 113522: for(j=0; j<db->nDb; j++){
113523: struct Db *pDb = &db->aDb[j];
113524: if( pDb->pBt ){
113525: sqlite3BtreeClose(pDb->pBt);
113526: pDb->pBt = 0;
113527: if( j!=1 ){
113528: pDb->pSchema = 0;
113529: }
113530: }
113531: }
1.2.2.1 ! misho 113532: /* Clear the TEMP schema separately and last */
! 113533: if( db->aDb[1].pSchema ){
! 113534: sqlite3SchemaClear(db->aDb[1].pSchema);
! 113535: }
! 113536: sqlite3VtabUnlockList(db);
! 113537:
! 113538: /* Free up the array of auxiliary databases */
! 113539: sqlite3CollapseDatabaseArray(db);
! 113540: assert( db->nDb<=2 );
! 113541: assert( db->aDb==db->aDbStatic );
1.2 misho 113542:
113543: /* Tell the code in notify.c that the connection no longer holds any
113544: ** locks and does not require any further unlock-notify callbacks.
113545: */
113546: sqlite3ConnectionClosed(db);
113547:
113548: for(j=0; j<ArraySize(db->aFunc.a); j++){
113549: FuncDef *pNext, *pHash, *p;
113550: for(p=db->aFunc.a[j]; p; p=pHash){
113551: pHash = p->pHash;
113552: while( p ){
113553: functionDestroy(db, p);
113554: pNext = p->pNext;
113555: sqlite3DbFree(db, p);
113556: p = pNext;
113557: }
113558: }
113559: }
113560: for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){
113561: CollSeq *pColl = (CollSeq *)sqliteHashData(i);
113562: /* Invoke any destructors registered for collation sequence user data. */
113563: for(j=0; j<3; j++){
113564: if( pColl[j].xDel ){
113565: pColl[j].xDel(pColl[j].pUser);
113566: }
113567: }
113568: sqlite3DbFree(db, pColl);
113569: }
113570: sqlite3HashClear(&db->aCollSeq);
113571: #ifndef SQLITE_OMIT_VIRTUALTABLE
113572: for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){
113573: Module *pMod = (Module *)sqliteHashData(i);
113574: if( pMod->xDestroy ){
113575: pMod->xDestroy(pMod->pAux);
113576: }
113577: sqlite3DbFree(db, pMod);
113578: }
113579: sqlite3HashClear(&db->aModule);
113580: #endif
113581:
113582: sqlite3Error(db, SQLITE_OK, 0); /* Deallocates any cached error strings. */
113583: if( db->pErr ){
113584: sqlite3ValueFree(db->pErr);
113585: }
113586: sqlite3CloseExtensions(db);
113587:
113588: db->magic = SQLITE_MAGIC_ERROR;
113589:
113590: /* The temp-database schema is allocated differently from the other schema
113591: ** objects (using sqliteMalloc() directly, instead of sqlite3BtreeSchema()).
113592: ** So it needs to be freed here. Todo: Why not roll the temp schema into
113593: ** the same sqliteMalloc() as the one that allocates the database
113594: ** structure?
113595: */
113596: sqlite3DbFree(db, db->aDb[1].pSchema);
113597: sqlite3_mutex_leave(db->mutex);
113598: db->magic = SQLITE_MAGIC_CLOSED;
113599: sqlite3_mutex_free(db->mutex);
113600: assert( db->lookaside.nOut==0 ); /* Fails on a lookaside memory leak */
113601: if( db->lookaside.bMalloced ){
113602: sqlite3_free(db->lookaside.pStart);
113603: }
113604: sqlite3_free(db);
113605: }
113606:
113607: /*
1.2.2.1 ! misho 113608: ** Rollback all database files. If tripCode is not SQLITE_OK, then
! 113609: ** any open cursors are invalidated ("tripped" - as in "tripping a circuit
! 113610: ** breaker") and made to return tripCode if there are any further
! 113611: ** attempts to use that cursor.
1.2 misho 113612: */
1.2.2.1 ! misho 113613: SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){
1.2 misho 113614: int i;
113615: int inTrans = 0;
113616: assert( sqlite3_mutex_held(db->mutex) );
113617: sqlite3BeginBenignMalloc();
113618: for(i=0; i<db->nDb; i++){
1.2.2.1 ! misho 113619: Btree *p = db->aDb[i].pBt;
! 113620: if( p ){
! 113621: if( sqlite3BtreeIsInTrans(p) ){
1.2 misho 113622: inTrans = 1;
113623: }
1.2.2.1 ! misho 113624: sqlite3BtreeRollback(p, tripCode);
1.2 misho 113625: db->aDb[i].inTrans = 0;
113626: }
113627: }
113628: sqlite3VtabRollback(db);
113629: sqlite3EndBenignMalloc();
113630:
113631: if( db->flags&SQLITE_InternChanges ){
113632: sqlite3ExpirePreparedStatements(db);
1.2.2.1 ! misho 113633: sqlite3ResetAllSchemasOfConnection(db);
1.2 misho 113634: }
113635:
113636: /* Any deferred constraint violations have now been resolved. */
113637: db->nDeferredCons = 0;
113638:
113639: /* If one has been configured, invoke the rollback-hook callback */
113640: if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){
113641: db->xRollbackCallback(db->pRollbackArg);
113642: }
113643: }
113644:
113645: /*
113646: ** Return a static string that describes the kind of error specified in the
113647: ** argument.
113648: */
113649: SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){
113650: static const char* const aMsg[] = {
113651: /* SQLITE_OK */ "not an error",
113652: /* SQLITE_ERROR */ "SQL logic error or missing database",
113653: /* SQLITE_INTERNAL */ 0,
113654: /* SQLITE_PERM */ "access permission denied",
113655: /* SQLITE_ABORT */ "callback requested query abort",
113656: /* SQLITE_BUSY */ "database is locked",
113657: /* SQLITE_LOCKED */ "database table is locked",
113658: /* SQLITE_NOMEM */ "out of memory",
113659: /* SQLITE_READONLY */ "attempt to write a readonly database",
113660: /* SQLITE_INTERRUPT */ "interrupted",
113661: /* SQLITE_IOERR */ "disk I/O error",
113662: /* SQLITE_CORRUPT */ "database disk image is malformed",
113663: /* SQLITE_NOTFOUND */ "unknown operation",
113664: /* SQLITE_FULL */ "database or disk is full",
113665: /* SQLITE_CANTOPEN */ "unable to open database file",
113666: /* SQLITE_PROTOCOL */ "locking protocol",
113667: /* SQLITE_EMPTY */ "table contains no data",
113668: /* SQLITE_SCHEMA */ "database schema has changed",
113669: /* SQLITE_TOOBIG */ "string or blob too big",
113670: /* SQLITE_CONSTRAINT */ "constraint failed",
113671: /* SQLITE_MISMATCH */ "datatype mismatch",
113672: /* SQLITE_MISUSE */ "library routine called out of sequence",
113673: /* SQLITE_NOLFS */ "large file support is disabled",
113674: /* SQLITE_AUTH */ "authorization denied",
113675: /* SQLITE_FORMAT */ "auxiliary database format error",
113676: /* SQLITE_RANGE */ "bind or column index out of range",
113677: /* SQLITE_NOTADB */ "file is encrypted or is not a database",
113678: };
1.2.2.1 ! misho 113679: const char *zErr = "unknown error";
! 113680: switch( rc ){
! 113681: case SQLITE_ABORT_ROLLBACK: {
! 113682: zErr = "abort due to ROLLBACK";
! 113683: break;
! 113684: }
! 113685: default: {
! 113686: rc &= 0xff;
! 113687: if( ALWAYS(rc>=0) && rc<ArraySize(aMsg) && aMsg[rc]!=0 ){
! 113688: zErr = aMsg[rc];
! 113689: }
! 113690: break;
! 113691: }
1.2 misho 113692: }
1.2.2.1 ! misho 113693: return zErr;
1.2 misho 113694: }
113695:
113696: /*
113697: ** This routine implements a busy callback that sleeps and tries
113698: ** again until a timeout value is reached. The timeout value is
113699: ** an integer number of milliseconds passed in as the first
113700: ** argument.
113701: */
113702: static int sqliteDefaultBusyCallback(
113703: void *ptr, /* Database connection */
113704: int count /* Number of times table has been busy */
113705: ){
113706: #if SQLITE_OS_WIN || (defined(HAVE_USLEEP) && HAVE_USLEEP)
113707: static const u8 delays[] =
113708: { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 };
113709: static const u8 totals[] =
113710: { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 };
113711: # define NDELAY ArraySize(delays)
113712: sqlite3 *db = (sqlite3 *)ptr;
113713: int timeout = db->busyTimeout;
113714: int delay, prior;
113715:
113716: assert( count>=0 );
113717: if( count < NDELAY ){
113718: delay = delays[count];
113719: prior = totals[count];
113720: }else{
113721: delay = delays[NDELAY-1];
113722: prior = totals[NDELAY-1] + delay*(count-(NDELAY-1));
113723: }
113724: if( prior + delay > timeout ){
113725: delay = timeout - prior;
113726: if( delay<=0 ) return 0;
113727: }
113728: sqlite3OsSleep(db->pVfs, delay*1000);
113729: return 1;
113730: #else
113731: sqlite3 *db = (sqlite3 *)ptr;
113732: int timeout = ((sqlite3 *)ptr)->busyTimeout;
113733: if( (count+1)*1000 > timeout ){
113734: return 0;
113735: }
113736: sqlite3OsSleep(db->pVfs, 1000000);
113737: return 1;
113738: #endif
113739: }
113740:
113741: /*
113742: ** Invoke the given busy handler.
113743: **
113744: ** This routine is called when an operation failed with a lock.
113745: ** If this routine returns non-zero, the lock is retried. If it
113746: ** returns 0, the operation aborts with an SQLITE_BUSY error.
113747: */
113748: SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){
113749: int rc;
113750: if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0;
113751: rc = p->xFunc(p->pArg, p->nBusy);
113752: if( rc==0 ){
113753: p->nBusy = -1;
113754: }else{
113755: p->nBusy++;
113756: }
113757: return rc;
113758: }
113759:
113760: /*
113761: ** This routine sets the busy callback for an Sqlite database to the
113762: ** given callback function with the given argument.
113763: */
113764: SQLITE_API int sqlite3_busy_handler(
113765: sqlite3 *db,
113766: int (*xBusy)(void*,int),
113767: void *pArg
113768: ){
113769: sqlite3_mutex_enter(db->mutex);
113770: db->busyHandler.xFunc = xBusy;
113771: db->busyHandler.pArg = pArg;
113772: db->busyHandler.nBusy = 0;
1.2.2.1 ! misho 113773: db->busyTimeout = 0;
1.2 misho 113774: sqlite3_mutex_leave(db->mutex);
113775: return SQLITE_OK;
113776: }
113777:
113778: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
113779: /*
113780: ** This routine sets the progress callback for an Sqlite database to the
113781: ** given callback function with the given argument. The progress callback will
113782: ** be invoked every nOps opcodes.
113783: */
113784: SQLITE_API void sqlite3_progress_handler(
113785: sqlite3 *db,
113786: int nOps,
113787: int (*xProgress)(void*),
113788: void *pArg
113789: ){
113790: sqlite3_mutex_enter(db->mutex);
113791: if( nOps>0 ){
113792: db->xProgress = xProgress;
113793: db->nProgressOps = nOps;
113794: db->pProgressArg = pArg;
113795: }else{
113796: db->xProgress = 0;
113797: db->nProgressOps = 0;
113798: db->pProgressArg = 0;
113799: }
113800: sqlite3_mutex_leave(db->mutex);
113801: }
113802: #endif
113803:
113804:
113805: /*
113806: ** This routine installs a default busy handler that waits for the
113807: ** specified number of milliseconds before returning 0.
113808: */
113809: SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){
113810: if( ms>0 ){
113811: sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db);
1.2.2.1 ! misho 113812: db->busyTimeout = ms;
1.2 misho 113813: }else{
113814: sqlite3_busy_handler(db, 0, 0);
113815: }
113816: return SQLITE_OK;
113817: }
113818:
113819: /*
113820: ** Cause any pending operation to stop at its earliest opportunity.
113821: */
113822: SQLITE_API void sqlite3_interrupt(sqlite3 *db){
113823: db->u1.isInterrupted = 1;
113824: }
113825:
113826:
113827: /*
113828: ** This function is exactly the same as sqlite3_create_function(), except
113829: ** that it is designed to be called by internal code. The difference is
113830: ** that if a malloc() fails in sqlite3_create_function(), an error code
113831: ** is returned and the mallocFailed flag cleared.
113832: */
113833: SQLITE_PRIVATE int sqlite3CreateFunc(
113834: sqlite3 *db,
113835: const char *zFunctionName,
113836: int nArg,
113837: int enc,
113838: void *pUserData,
113839: void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
113840: void (*xStep)(sqlite3_context*,int,sqlite3_value **),
113841: void (*xFinal)(sqlite3_context*),
113842: FuncDestructor *pDestructor
113843: ){
113844: FuncDef *p;
113845: int nName;
113846:
113847: assert( sqlite3_mutex_held(db->mutex) );
113848: if( zFunctionName==0 ||
113849: (xFunc && (xFinal || xStep)) ||
113850: (!xFunc && (xFinal && !xStep)) ||
113851: (!xFunc && (!xFinal && xStep)) ||
113852: (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) ||
113853: (255<(nName = sqlite3Strlen30( zFunctionName))) ){
113854: return SQLITE_MISUSE_BKPT;
113855: }
113856:
113857: #ifndef SQLITE_OMIT_UTF16
113858: /* If SQLITE_UTF16 is specified as the encoding type, transform this
113859: ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
113860: ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
113861: **
113862: ** If SQLITE_ANY is specified, add three versions of the function
113863: ** to the hash table.
113864: */
113865: if( enc==SQLITE_UTF16 ){
113866: enc = SQLITE_UTF16NATIVE;
113867: }else if( enc==SQLITE_ANY ){
113868: int rc;
113869: rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8,
113870: pUserData, xFunc, xStep, xFinal, pDestructor);
113871: if( rc==SQLITE_OK ){
113872: rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE,
113873: pUserData, xFunc, xStep, xFinal, pDestructor);
113874: }
113875: if( rc!=SQLITE_OK ){
113876: return rc;
113877: }
113878: enc = SQLITE_UTF16BE;
113879: }
113880: #else
113881: enc = SQLITE_UTF8;
113882: #endif
113883:
113884: /* Check if an existing function is being overridden or deleted. If so,
113885: ** and there are active VMs, then return SQLITE_BUSY. If a function
113886: ** is being overridden/deleted but there are no active VMs, allow the
113887: ** operation to continue but invalidate all precompiled statements.
113888: */
113889: p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 0);
113890: if( p && p->iPrefEnc==enc && p->nArg==nArg ){
113891: if( db->activeVdbeCnt ){
113892: sqlite3Error(db, SQLITE_BUSY,
113893: "unable to delete/modify user-function due to active statements");
113894: assert( !db->mallocFailed );
113895: return SQLITE_BUSY;
113896: }else{
113897: sqlite3ExpirePreparedStatements(db);
113898: }
113899: }
113900:
113901: p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 1);
113902: assert(p || db->mallocFailed);
113903: if( !p ){
113904: return SQLITE_NOMEM;
113905: }
113906:
113907: /* If an older version of the function with a configured destructor is
113908: ** being replaced invoke the destructor function here. */
113909: functionDestroy(db, p);
113910:
113911: if( pDestructor ){
113912: pDestructor->nRef++;
113913: }
113914: p->pDestructor = pDestructor;
113915: p->flags = 0;
113916: p->xFunc = xFunc;
113917: p->xStep = xStep;
113918: p->xFinalize = xFinal;
113919: p->pUserData = pUserData;
113920: p->nArg = (u16)nArg;
113921: return SQLITE_OK;
113922: }
113923:
113924: /*
113925: ** Create new user functions.
113926: */
113927: SQLITE_API int sqlite3_create_function(
113928: sqlite3 *db,
113929: const char *zFunc,
113930: int nArg,
113931: int enc,
113932: void *p,
113933: void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
113934: void (*xStep)(sqlite3_context*,int,sqlite3_value **),
113935: void (*xFinal)(sqlite3_context*)
113936: ){
113937: return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xFunc, xStep,
113938: xFinal, 0);
113939: }
113940:
113941: SQLITE_API int sqlite3_create_function_v2(
113942: sqlite3 *db,
113943: const char *zFunc,
113944: int nArg,
113945: int enc,
113946: void *p,
113947: void (*xFunc)(sqlite3_context*,int,sqlite3_value **),
113948: void (*xStep)(sqlite3_context*,int,sqlite3_value **),
113949: void (*xFinal)(sqlite3_context*),
113950: void (*xDestroy)(void *)
113951: ){
113952: int rc = SQLITE_ERROR;
113953: FuncDestructor *pArg = 0;
113954: sqlite3_mutex_enter(db->mutex);
113955: if( xDestroy ){
113956: pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor));
113957: if( !pArg ){
113958: xDestroy(p);
113959: goto out;
113960: }
113961: pArg->xDestroy = xDestroy;
113962: pArg->pUserData = p;
113963: }
113964: rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xFunc, xStep, xFinal, pArg);
113965: if( pArg && pArg->nRef==0 ){
113966: assert( rc!=SQLITE_OK );
113967: xDestroy(p);
113968: sqlite3DbFree(db, pArg);
113969: }
113970:
113971: out:
113972: rc = sqlite3ApiExit(db, rc);
113973: sqlite3_mutex_leave(db->mutex);
113974: return rc;
113975: }
113976:
113977: #ifndef SQLITE_OMIT_UTF16
113978: SQLITE_API int sqlite3_create_function16(
113979: sqlite3 *db,
113980: const void *zFunctionName,
113981: int nArg,
113982: int eTextRep,
113983: void *p,
113984: void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
113985: void (*xStep)(sqlite3_context*,int,sqlite3_value**),
113986: void (*xFinal)(sqlite3_context*)
113987: ){
113988: int rc;
113989: char *zFunc8;
113990: sqlite3_mutex_enter(db->mutex);
113991: assert( !db->mallocFailed );
113992: zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE);
113993: rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal,0);
113994: sqlite3DbFree(db, zFunc8);
113995: rc = sqlite3ApiExit(db, rc);
113996: sqlite3_mutex_leave(db->mutex);
113997: return rc;
113998: }
113999: #endif
114000:
114001:
114002: /*
114003: ** Declare that a function has been overloaded by a virtual table.
114004: **
114005: ** If the function already exists as a regular global function, then
114006: ** this routine is a no-op. If the function does not exist, then create
114007: ** a new one that always throws a run-time error.
114008: **
114009: ** When virtual tables intend to provide an overloaded function, they
114010: ** should call this routine to make sure the global function exists.
114011: ** A global function must exist in order for name resolution to work
114012: ** properly.
114013: */
114014: SQLITE_API int sqlite3_overload_function(
114015: sqlite3 *db,
114016: const char *zName,
114017: int nArg
114018: ){
114019: int nName = sqlite3Strlen30(zName);
114020: int rc = SQLITE_OK;
114021: sqlite3_mutex_enter(db->mutex);
114022: if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){
114023: rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8,
114024: 0, sqlite3InvalidFunction, 0, 0, 0);
114025: }
114026: rc = sqlite3ApiExit(db, rc);
114027: sqlite3_mutex_leave(db->mutex);
114028: return rc;
114029: }
114030:
114031: #ifndef SQLITE_OMIT_TRACE
114032: /*
114033: ** Register a trace function. The pArg from the previously registered trace
114034: ** is returned.
114035: **
114036: ** A NULL trace function means that no tracing is executes. A non-NULL
114037: ** trace is a pointer to a function that is invoked at the start of each
114038: ** SQL statement.
114039: */
114040: SQLITE_API void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){
114041: void *pOld;
114042: sqlite3_mutex_enter(db->mutex);
114043: pOld = db->pTraceArg;
114044: db->xTrace = xTrace;
114045: db->pTraceArg = pArg;
114046: sqlite3_mutex_leave(db->mutex);
114047: return pOld;
114048: }
114049: /*
114050: ** Register a profile function. The pArg from the previously registered
114051: ** profile function is returned.
114052: **
114053: ** A NULL profile function means that no profiling is executes. A non-NULL
114054: ** profile is a pointer to a function that is invoked at the conclusion of
114055: ** each SQL statement that is run.
114056: */
114057: SQLITE_API void *sqlite3_profile(
114058: sqlite3 *db,
114059: void (*xProfile)(void*,const char*,sqlite_uint64),
114060: void *pArg
114061: ){
114062: void *pOld;
114063: sqlite3_mutex_enter(db->mutex);
114064: pOld = db->pProfileArg;
114065: db->xProfile = xProfile;
114066: db->pProfileArg = pArg;
114067: sqlite3_mutex_leave(db->mutex);
114068: return pOld;
114069: }
114070: #endif /* SQLITE_OMIT_TRACE */
114071:
1.2.2.1 ! misho 114072: /*
! 114073: ** Register a function to be invoked when a transaction commits.
1.2 misho 114074: ** If the invoked function returns non-zero, then the commit becomes a
114075: ** rollback.
114076: */
114077: SQLITE_API void *sqlite3_commit_hook(
114078: sqlite3 *db, /* Attach the hook to this database */
114079: int (*xCallback)(void*), /* Function to invoke on each commit */
114080: void *pArg /* Argument to the function */
114081: ){
114082: void *pOld;
114083: sqlite3_mutex_enter(db->mutex);
114084: pOld = db->pCommitArg;
114085: db->xCommitCallback = xCallback;
114086: db->pCommitArg = pArg;
114087: sqlite3_mutex_leave(db->mutex);
114088: return pOld;
114089: }
114090:
114091: /*
114092: ** Register a callback to be invoked each time a row is updated,
114093: ** inserted or deleted using this database connection.
114094: */
114095: SQLITE_API void *sqlite3_update_hook(
114096: sqlite3 *db, /* Attach the hook to this database */
114097: void (*xCallback)(void*,int,char const *,char const *,sqlite_int64),
114098: void *pArg /* Argument to the function */
114099: ){
114100: void *pRet;
114101: sqlite3_mutex_enter(db->mutex);
114102: pRet = db->pUpdateArg;
114103: db->xUpdateCallback = xCallback;
114104: db->pUpdateArg = pArg;
114105: sqlite3_mutex_leave(db->mutex);
114106: return pRet;
114107: }
114108:
114109: /*
114110: ** Register a callback to be invoked each time a transaction is rolled
114111: ** back by this database connection.
114112: */
114113: SQLITE_API void *sqlite3_rollback_hook(
114114: sqlite3 *db, /* Attach the hook to this database */
114115: void (*xCallback)(void*), /* Callback function */
114116: void *pArg /* Argument to the function */
114117: ){
114118: void *pRet;
114119: sqlite3_mutex_enter(db->mutex);
114120: pRet = db->pRollbackArg;
114121: db->xRollbackCallback = xCallback;
114122: db->pRollbackArg = pArg;
114123: sqlite3_mutex_leave(db->mutex);
114124: return pRet;
114125: }
114126:
114127: #ifndef SQLITE_OMIT_WAL
114128: /*
114129: ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint().
114130: ** Invoke sqlite3_wal_checkpoint if the number of frames in the log file
114131: ** is greater than sqlite3.pWalArg cast to an integer (the value configured by
114132: ** wal_autocheckpoint()).
114133: */
114134: SQLITE_PRIVATE int sqlite3WalDefaultHook(
114135: void *pClientData, /* Argument */
114136: sqlite3 *db, /* Connection */
114137: const char *zDb, /* Database */
114138: int nFrame /* Size of WAL */
114139: ){
114140: if( nFrame>=SQLITE_PTR_TO_INT(pClientData) ){
114141: sqlite3BeginBenignMalloc();
114142: sqlite3_wal_checkpoint(db, zDb);
114143: sqlite3EndBenignMalloc();
114144: }
114145: return SQLITE_OK;
114146: }
114147: #endif /* SQLITE_OMIT_WAL */
114148:
114149: /*
114150: ** Configure an sqlite3_wal_hook() callback to automatically checkpoint
114151: ** a database after committing a transaction if there are nFrame or
114152: ** more frames in the log file. Passing zero or a negative value as the
114153: ** nFrame parameter disables automatic checkpoints entirely.
114154: **
114155: ** The callback registered by this function replaces any existing callback
114156: ** registered using sqlite3_wal_hook(). Likewise, registering a callback
114157: ** using sqlite3_wal_hook() disables the automatic checkpoint mechanism
114158: ** configured by this function.
114159: */
114160: SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int nFrame){
114161: #ifdef SQLITE_OMIT_WAL
114162: UNUSED_PARAMETER(db);
114163: UNUSED_PARAMETER(nFrame);
114164: #else
114165: if( nFrame>0 ){
114166: sqlite3_wal_hook(db, sqlite3WalDefaultHook, SQLITE_INT_TO_PTR(nFrame));
114167: }else{
114168: sqlite3_wal_hook(db, 0, 0);
114169: }
114170: #endif
114171: return SQLITE_OK;
114172: }
114173:
114174: /*
114175: ** Register a callback to be invoked each time a transaction is written
114176: ** into the write-ahead-log by this database connection.
114177: */
114178: SQLITE_API void *sqlite3_wal_hook(
114179: sqlite3 *db, /* Attach the hook to this db handle */
114180: int(*xCallback)(void *, sqlite3*, const char*, int),
114181: void *pArg /* First argument passed to xCallback() */
114182: ){
114183: #ifndef SQLITE_OMIT_WAL
114184: void *pRet;
114185: sqlite3_mutex_enter(db->mutex);
114186: pRet = db->pWalArg;
114187: db->xWalCallback = xCallback;
114188: db->pWalArg = pArg;
114189: sqlite3_mutex_leave(db->mutex);
114190: return pRet;
114191: #else
114192: return 0;
114193: #endif
114194: }
114195:
114196: /*
114197: ** Checkpoint database zDb.
114198: */
114199: SQLITE_API int sqlite3_wal_checkpoint_v2(
114200: sqlite3 *db, /* Database handle */
114201: const char *zDb, /* Name of attached database (or NULL) */
114202: int eMode, /* SQLITE_CHECKPOINT_* value */
114203: int *pnLog, /* OUT: Size of WAL log in frames */
114204: int *pnCkpt /* OUT: Total number of frames checkpointed */
114205: ){
114206: #ifdef SQLITE_OMIT_WAL
114207: return SQLITE_OK;
114208: #else
114209: int rc; /* Return code */
114210: int iDb = SQLITE_MAX_ATTACHED; /* sqlite3.aDb[] index of db to checkpoint */
114211:
114212: /* Initialize the output variables to -1 in case an error occurs. */
114213: if( pnLog ) *pnLog = -1;
114214: if( pnCkpt ) *pnCkpt = -1;
114215:
114216: assert( SQLITE_CHECKPOINT_FULL>SQLITE_CHECKPOINT_PASSIVE );
114217: assert( SQLITE_CHECKPOINT_FULL<SQLITE_CHECKPOINT_RESTART );
114218: assert( SQLITE_CHECKPOINT_PASSIVE+2==SQLITE_CHECKPOINT_RESTART );
114219: if( eMode<SQLITE_CHECKPOINT_PASSIVE || eMode>SQLITE_CHECKPOINT_RESTART ){
114220: return SQLITE_MISUSE;
114221: }
114222:
114223: sqlite3_mutex_enter(db->mutex);
114224: if( zDb && zDb[0] ){
114225: iDb = sqlite3FindDbName(db, zDb);
114226: }
114227: if( iDb<0 ){
114228: rc = SQLITE_ERROR;
114229: sqlite3Error(db, SQLITE_ERROR, "unknown database: %s", zDb);
114230: }else{
114231: rc = sqlite3Checkpoint(db, iDb, eMode, pnLog, pnCkpt);
114232: sqlite3Error(db, rc, 0);
114233: }
114234: rc = sqlite3ApiExit(db, rc);
114235: sqlite3_mutex_leave(db->mutex);
114236: return rc;
114237: #endif
114238: }
114239:
114240:
114241: /*
114242: ** Checkpoint database zDb. If zDb is NULL, or if the buffer zDb points
114243: ** to contains a zero-length string, all attached databases are
114244: ** checkpointed.
114245: */
114246: SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){
114247: return sqlite3_wal_checkpoint_v2(db, zDb, SQLITE_CHECKPOINT_PASSIVE, 0, 0);
114248: }
114249:
114250: #ifndef SQLITE_OMIT_WAL
114251: /*
114252: ** Run a checkpoint on database iDb. This is a no-op if database iDb is
114253: ** not currently open in WAL mode.
114254: **
114255: ** If a transaction is open on the database being checkpointed, this
114256: ** function returns SQLITE_LOCKED and a checkpoint is not attempted. If
114257: ** an error occurs while running the checkpoint, an SQLite error code is
114258: ** returned (i.e. SQLITE_IOERR). Otherwise, SQLITE_OK.
114259: **
114260: ** The mutex on database handle db should be held by the caller. The mutex
114261: ** associated with the specific b-tree being checkpointed is taken by
114262: ** this function while the checkpoint is running.
114263: **
114264: ** If iDb is passed SQLITE_MAX_ATTACHED, then all attached databases are
114265: ** checkpointed. If an error is encountered it is returned immediately -
114266: ** no attempt is made to checkpoint any remaining databases.
114267: **
114268: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
114269: */
114270: SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){
114271: int rc = SQLITE_OK; /* Return code */
114272: int i; /* Used to iterate through attached dbs */
114273: int bBusy = 0; /* True if SQLITE_BUSY has been encountered */
114274:
114275: assert( sqlite3_mutex_held(db->mutex) );
114276: assert( !pnLog || *pnLog==-1 );
114277: assert( !pnCkpt || *pnCkpt==-1 );
114278:
114279: for(i=0; i<db->nDb && rc==SQLITE_OK; i++){
114280: if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){
114281: rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt, eMode, pnLog, pnCkpt);
114282: pnLog = 0;
114283: pnCkpt = 0;
114284: if( rc==SQLITE_BUSY ){
114285: bBusy = 1;
114286: rc = SQLITE_OK;
114287: }
114288: }
114289: }
114290:
114291: return (rc==SQLITE_OK && bBusy) ? SQLITE_BUSY : rc;
114292: }
114293: #endif /* SQLITE_OMIT_WAL */
114294:
114295: /*
114296: ** This function returns true if main-memory should be used instead of
114297: ** a temporary file for transient pager files and statement journals.
114298: ** The value returned depends on the value of db->temp_store (runtime
114299: ** parameter) and the compile time value of SQLITE_TEMP_STORE. The
114300: ** following table describes the relationship between these two values
114301: ** and this functions return value.
114302: **
114303: ** SQLITE_TEMP_STORE db->temp_store Location of temporary database
114304: ** ----------------- -------------- ------------------------------
114305: ** 0 any file (return 0)
114306: ** 1 1 file (return 0)
114307: ** 1 2 memory (return 1)
114308: ** 1 0 file (return 0)
114309: ** 2 1 file (return 0)
114310: ** 2 2 memory (return 1)
114311: ** 2 0 memory (return 1)
114312: ** 3 any memory (return 1)
114313: */
114314: SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){
114315: #if SQLITE_TEMP_STORE==1
114316: return ( db->temp_store==2 );
114317: #endif
114318: #if SQLITE_TEMP_STORE==2
114319: return ( db->temp_store!=1 );
114320: #endif
114321: #if SQLITE_TEMP_STORE==3
114322: return 1;
114323: #endif
114324: #if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3
114325: return 0;
114326: #endif
114327: }
114328:
114329: /*
114330: ** Return UTF-8 encoded English language explanation of the most recent
114331: ** error.
114332: */
114333: SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){
114334: const char *z;
114335: if( !db ){
114336: return sqlite3ErrStr(SQLITE_NOMEM);
114337: }
114338: if( !sqlite3SafetyCheckSickOrOk(db) ){
114339: return sqlite3ErrStr(SQLITE_MISUSE_BKPT);
114340: }
114341: sqlite3_mutex_enter(db->mutex);
114342: if( db->mallocFailed ){
114343: z = sqlite3ErrStr(SQLITE_NOMEM);
114344: }else{
114345: z = (char*)sqlite3_value_text(db->pErr);
114346: assert( !db->mallocFailed );
114347: if( z==0 ){
114348: z = sqlite3ErrStr(db->errCode);
114349: }
114350: }
114351: sqlite3_mutex_leave(db->mutex);
114352: return z;
114353: }
114354:
114355: #ifndef SQLITE_OMIT_UTF16
114356: /*
114357: ** Return UTF-16 encoded English language explanation of the most recent
114358: ** error.
114359: */
114360: SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){
114361: static const u16 outOfMem[] = {
114362: 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0
114363: };
114364: static const u16 misuse[] = {
114365: 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ',
114366: 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ',
114367: 'c', 'a', 'l', 'l', 'e', 'd', ' ',
114368: 'o', 'u', 't', ' ',
114369: 'o', 'f', ' ',
114370: 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0
114371: };
114372:
114373: const void *z;
114374: if( !db ){
114375: return (void *)outOfMem;
114376: }
114377: if( !sqlite3SafetyCheckSickOrOk(db) ){
114378: return (void *)misuse;
114379: }
114380: sqlite3_mutex_enter(db->mutex);
114381: if( db->mallocFailed ){
114382: z = (void *)outOfMem;
114383: }else{
114384: z = sqlite3_value_text16(db->pErr);
114385: if( z==0 ){
114386: sqlite3ValueSetStr(db->pErr, -1, sqlite3ErrStr(db->errCode),
114387: SQLITE_UTF8, SQLITE_STATIC);
114388: z = sqlite3_value_text16(db->pErr);
114389: }
114390: /* A malloc() may have failed within the call to sqlite3_value_text16()
114391: ** above. If this is the case, then the db->mallocFailed flag needs to
114392: ** be cleared before returning. Do this directly, instead of via
114393: ** sqlite3ApiExit(), to avoid setting the database handle error message.
114394: */
114395: db->mallocFailed = 0;
114396: }
114397: sqlite3_mutex_leave(db->mutex);
114398: return z;
114399: }
114400: #endif /* SQLITE_OMIT_UTF16 */
114401:
114402: /*
114403: ** Return the most recent error code generated by an SQLite routine. If NULL is
114404: ** passed to this function, we assume a malloc() failed during sqlite3_open().
114405: */
114406: SQLITE_API int sqlite3_errcode(sqlite3 *db){
114407: if( db && !sqlite3SafetyCheckSickOrOk(db) ){
114408: return SQLITE_MISUSE_BKPT;
114409: }
114410: if( !db || db->mallocFailed ){
114411: return SQLITE_NOMEM;
114412: }
114413: return db->errCode & db->errMask;
114414: }
114415: SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){
114416: if( db && !sqlite3SafetyCheckSickOrOk(db) ){
114417: return SQLITE_MISUSE_BKPT;
114418: }
114419: if( !db || db->mallocFailed ){
114420: return SQLITE_NOMEM;
114421: }
114422: return db->errCode;
114423: }
114424:
114425: /*
1.2.2.1 ! misho 114426: ** Return a string that describes the kind of error specified in the
! 114427: ** argument. For now, this simply calls the internal sqlite3ErrStr()
! 114428: ** function.
! 114429: */
! 114430: SQLITE_API const char *sqlite3_errstr(int rc){
! 114431: return sqlite3ErrStr(rc);
! 114432: }
! 114433:
! 114434: /*
1.2 misho 114435: ** Create a new collating function for database "db". The name is zName
114436: ** and the encoding is enc.
114437: */
114438: static int createCollation(
114439: sqlite3* db,
114440: const char *zName,
114441: u8 enc,
114442: void* pCtx,
114443: int(*xCompare)(void*,int,const void*,int,const void*),
114444: void(*xDel)(void*)
114445: ){
114446: CollSeq *pColl;
114447: int enc2;
114448: int nName = sqlite3Strlen30(zName);
114449:
114450: assert( sqlite3_mutex_held(db->mutex) );
114451:
114452: /* If SQLITE_UTF16 is specified as the encoding type, transform this
114453: ** to one of SQLITE_UTF16LE or SQLITE_UTF16BE using the
114454: ** SQLITE_UTF16NATIVE macro. SQLITE_UTF16 is not used internally.
114455: */
114456: enc2 = enc;
114457: testcase( enc2==SQLITE_UTF16 );
114458: testcase( enc2==SQLITE_UTF16_ALIGNED );
114459: if( enc2==SQLITE_UTF16 || enc2==SQLITE_UTF16_ALIGNED ){
114460: enc2 = SQLITE_UTF16NATIVE;
114461: }
114462: if( enc2<SQLITE_UTF8 || enc2>SQLITE_UTF16BE ){
114463: return SQLITE_MISUSE_BKPT;
114464: }
114465:
114466: /* Check if this call is removing or replacing an existing collation
114467: ** sequence. If so, and there are active VMs, return busy. If there
114468: ** are no active VMs, invalidate any pre-compiled statements.
114469: */
114470: pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 0);
114471: if( pColl && pColl->xCmp ){
114472: if( db->activeVdbeCnt ){
114473: sqlite3Error(db, SQLITE_BUSY,
114474: "unable to delete/modify collation sequence due to active statements");
114475: return SQLITE_BUSY;
114476: }
114477: sqlite3ExpirePreparedStatements(db);
114478:
114479: /* If collation sequence pColl was created directly by a call to
114480: ** sqlite3_create_collation, and not generated by synthCollSeq(),
114481: ** then any copies made by synthCollSeq() need to be invalidated.
114482: ** Also, collation destructor - CollSeq.xDel() - function may need
114483: ** to be called.
114484: */
114485: if( (pColl->enc & ~SQLITE_UTF16_ALIGNED)==enc2 ){
114486: CollSeq *aColl = sqlite3HashFind(&db->aCollSeq, zName, nName);
114487: int j;
114488: for(j=0; j<3; j++){
114489: CollSeq *p = &aColl[j];
114490: if( p->enc==pColl->enc ){
114491: if( p->xDel ){
114492: p->xDel(p->pUser);
114493: }
114494: p->xCmp = 0;
114495: }
114496: }
114497: }
114498: }
114499:
114500: pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1);
114501: if( pColl==0 ) return SQLITE_NOMEM;
114502: pColl->xCmp = xCompare;
114503: pColl->pUser = pCtx;
114504: pColl->xDel = xDel;
114505: pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED));
114506: sqlite3Error(db, SQLITE_OK, 0);
114507: return SQLITE_OK;
114508: }
114509:
114510:
114511: /*
114512: ** This array defines hard upper bounds on limit values. The
114513: ** initializer must be kept in sync with the SQLITE_LIMIT_*
114514: ** #defines in sqlite3.h.
114515: */
114516: static const int aHardLimit[] = {
114517: SQLITE_MAX_LENGTH,
114518: SQLITE_MAX_SQL_LENGTH,
114519: SQLITE_MAX_COLUMN,
114520: SQLITE_MAX_EXPR_DEPTH,
114521: SQLITE_MAX_COMPOUND_SELECT,
114522: SQLITE_MAX_VDBE_OP,
114523: SQLITE_MAX_FUNCTION_ARG,
114524: SQLITE_MAX_ATTACHED,
114525: SQLITE_MAX_LIKE_PATTERN_LENGTH,
114526: SQLITE_MAX_VARIABLE_NUMBER,
114527: SQLITE_MAX_TRIGGER_DEPTH,
114528: };
114529:
114530: /*
114531: ** Make sure the hard limits are set to reasonable values
114532: */
114533: #if SQLITE_MAX_LENGTH<100
114534: # error SQLITE_MAX_LENGTH must be at least 100
114535: #endif
114536: #if SQLITE_MAX_SQL_LENGTH<100
114537: # error SQLITE_MAX_SQL_LENGTH must be at least 100
114538: #endif
114539: #if SQLITE_MAX_SQL_LENGTH>SQLITE_MAX_LENGTH
114540: # error SQLITE_MAX_SQL_LENGTH must not be greater than SQLITE_MAX_LENGTH
114541: #endif
114542: #if SQLITE_MAX_COMPOUND_SELECT<2
114543: # error SQLITE_MAX_COMPOUND_SELECT must be at least 2
114544: #endif
114545: #if SQLITE_MAX_VDBE_OP<40
114546: # error SQLITE_MAX_VDBE_OP must be at least 40
114547: #endif
114548: #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000
114549: # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000
114550: #endif
114551: #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>62
114552: # error SQLITE_MAX_ATTACHED must be between 0 and 62
114553: #endif
114554: #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
114555: # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1
114556: #endif
114557: #if SQLITE_MAX_COLUMN>32767
114558: # error SQLITE_MAX_COLUMN must not exceed 32767
114559: #endif
114560: #if SQLITE_MAX_TRIGGER_DEPTH<1
114561: # error SQLITE_MAX_TRIGGER_DEPTH must be at least 1
114562: #endif
114563:
114564:
114565: /*
114566: ** Change the value of a limit. Report the old value.
114567: ** If an invalid limit index is supplied, report -1.
114568: ** Make no changes but still report the old value if the
114569: ** new limit is negative.
114570: **
114571: ** A new lower limit does not shrink existing constructs.
114572: ** It merely prevents new constructs that exceed the limit
114573: ** from forming.
114574: */
114575: SQLITE_API int sqlite3_limit(sqlite3 *db, int limitId, int newLimit){
114576: int oldLimit;
114577:
114578:
114579: /* EVIDENCE-OF: R-30189-54097 For each limit category SQLITE_LIMIT_NAME
114580: ** there is a hard upper bound set at compile-time by a C preprocessor
114581: ** macro called SQLITE_MAX_NAME. (The "_LIMIT_" in the name is changed to
114582: ** "_MAX_".)
114583: */
114584: assert( aHardLimit[SQLITE_LIMIT_LENGTH]==SQLITE_MAX_LENGTH );
114585: assert( aHardLimit[SQLITE_LIMIT_SQL_LENGTH]==SQLITE_MAX_SQL_LENGTH );
114586: assert( aHardLimit[SQLITE_LIMIT_COLUMN]==SQLITE_MAX_COLUMN );
114587: assert( aHardLimit[SQLITE_LIMIT_EXPR_DEPTH]==SQLITE_MAX_EXPR_DEPTH );
114588: assert( aHardLimit[SQLITE_LIMIT_COMPOUND_SELECT]==SQLITE_MAX_COMPOUND_SELECT);
114589: assert( aHardLimit[SQLITE_LIMIT_VDBE_OP]==SQLITE_MAX_VDBE_OP );
114590: assert( aHardLimit[SQLITE_LIMIT_FUNCTION_ARG]==SQLITE_MAX_FUNCTION_ARG );
114591: assert( aHardLimit[SQLITE_LIMIT_ATTACHED]==SQLITE_MAX_ATTACHED );
114592: assert( aHardLimit[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]==
114593: SQLITE_MAX_LIKE_PATTERN_LENGTH );
114594: assert( aHardLimit[SQLITE_LIMIT_VARIABLE_NUMBER]==SQLITE_MAX_VARIABLE_NUMBER);
114595: assert( aHardLimit[SQLITE_LIMIT_TRIGGER_DEPTH]==SQLITE_MAX_TRIGGER_DEPTH );
114596: assert( SQLITE_LIMIT_TRIGGER_DEPTH==(SQLITE_N_LIMIT-1) );
114597:
114598:
114599: if( limitId<0 || limitId>=SQLITE_N_LIMIT ){
114600: return -1;
114601: }
114602: oldLimit = db->aLimit[limitId];
114603: if( newLimit>=0 ){ /* IMP: R-52476-28732 */
114604: if( newLimit>aHardLimit[limitId] ){
114605: newLimit = aHardLimit[limitId]; /* IMP: R-51463-25634 */
114606: }
114607: db->aLimit[limitId] = newLimit;
114608: }
114609: return oldLimit; /* IMP: R-53341-35419 */
114610: }
114611:
114612: /*
114613: ** This function is used to parse both URIs and non-URI filenames passed by the
114614: ** user to API functions sqlite3_open() or sqlite3_open_v2(), and for database
114615: ** URIs specified as part of ATTACH statements.
114616: **
114617: ** The first argument to this function is the name of the VFS to use (or
114618: ** a NULL to signify the default VFS) if the URI does not contain a "vfs=xxx"
114619: ** query parameter. The second argument contains the URI (or non-URI filename)
114620: ** itself. When this function is called the *pFlags variable should contain
114621: ** the default flags to open the database handle with. The value stored in
114622: ** *pFlags may be updated before returning if the URI filename contains
114623: ** "cache=xxx" or "mode=xxx" query parameters.
114624: **
114625: ** If successful, SQLITE_OK is returned. In this case *ppVfs is set to point to
114626: ** the VFS that should be used to open the database file. *pzFile is set to
114627: ** point to a buffer containing the name of the file to open. It is the
114628: ** responsibility of the caller to eventually call sqlite3_free() to release
114629: ** this buffer.
114630: **
114631: ** If an error occurs, then an SQLite error code is returned and *pzErrMsg
114632: ** may be set to point to a buffer containing an English language error
114633: ** message. It is the responsibility of the caller to eventually release
114634: ** this buffer by calling sqlite3_free().
114635: */
114636: SQLITE_PRIVATE int sqlite3ParseUri(
114637: const char *zDefaultVfs, /* VFS to use if no "vfs=xxx" query option */
114638: const char *zUri, /* Nul-terminated URI to parse */
114639: unsigned int *pFlags, /* IN/OUT: SQLITE_OPEN_XXX flags */
114640: sqlite3_vfs **ppVfs, /* OUT: VFS to use */
114641: char **pzFile, /* OUT: Filename component of URI */
114642: char **pzErrMsg /* OUT: Error message (if rc!=SQLITE_OK) */
114643: ){
114644: int rc = SQLITE_OK;
114645: unsigned int flags = *pFlags;
114646: const char *zVfs = zDefaultVfs;
114647: char *zFile;
114648: char c;
114649: int nUri = sqlite3Strlen30(zUri);
114650:
114651: assert( *pzErrMsg==0 );
114652:
114653: if( ((flags & SQLITE_OPEN_URI) || sqlite3GlobalConfig.bOpenUri)
114654: && nUri>=5 && memcmp(zUri, "file:", 5)==0
114655: ){
114656: char *zOpt;
114657: int eState; /* Parser state when parsing URI */
114658: int iIn; /* Input character index */
114659: int iOut = 0; /* Output character index */
114660: int nByte = nUri+2; /* Bytes of space to allocate */
114661:
114662: /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen
114663: ** method that there may be extra parameters following the file-name. */
114664: flags |= SQLITE_OPEN_URI;
114665:
114666: for(iIn=0; iIn<nUri; iIn++) nByte += (zUri[iIn]=='&');
114667: zFile = sqlite3_malloc(nByte);
114668: if( !zFile ) return SQLITE_NOMEM;
114669:
114670: /* Discard the scheme and authority segments of the URI. */
114671: if( zUri[5]=='/' && zUri[6]=='/' ){
114672: iIn = 7;
114673: while( zUri[iIn] && zUri[iIn]!='/' ) iIn++;
114674:
114675: if( iIn!=7 && (iIn!=16 || memcmp("localhost", &zUri[7], 9)) ){
114676: *pzErrMsg = sqlite3_mprintf("invalid uri authority: %.*s",
114677: iIn-7, &zUri[7]);
114678: rc = SQLITE_ERROR;
114679: goto parse_uri_out;
114680: }
114681: }else{
114682: iIn = 5;
114683: }
114684:
114685: /* Copy the filename and any query parameters into the zFile buffer.
114686: ** Decode %HH escape codes along the way.
114687: **
114688: ** Within this loop, variable eState may be set to 0, 1 or 2, depending
114689: ** on the parsing context. As follows:
114690: **
114691: ** 0: Parsing file-name.
114692: ** 1: Parsing name section of a name=value query parameter.
114693: ** 2: Parsing value section of a name=value query parameter.
114694: */
114695: eState = 0;
114696: while( (c = zUri[iIn])!=0 && c!='#' ){
114697: iIn++;
114698: if( c=='%'
114699: && sqlite3Isxdigit(zUri[iIn])
114700: && sqlite3Isxdigit(zUri[iIn+1])
114701: ){
114702: int octet = (sqlite3HexToInt(zUri[iIn++]) << 4);
114703: octet += sqlite3HexToInt(zUri[iIn++]);
114704:
114705: assert( octet>=0 && octet<256 );
114706: if( octet==0 ){
114707: /* This branch is taken when "%00" appears within the URI. In this
114708: ** case we ignore all text in the remainder of the path, name or
114709: ** value currently being parsed. So ignore the current character
114710: ** and skip to the next "?", "=" or "&", as appropriate. */
114711: while( (c = zUri[iIn])!=0 && c!='#'
114712: && (eState!=0 || c!='?')
114713: && (eState!=1 || (c!='=' && c!='&'))
114714: && (eState!=2 || c!='&')
114715: ){
114716: iIn++;
114717: }
114718: continue;
114719: }
114720: c = octet;
114721: }else if( eState==1 && (c=='&' || c=='=') ){
114722: if( zFile[iOut-1]==0 ){
114723: /* An empty option name. Ignore this option altogether. */
114724: while( zUri[iIn] && zUri[iIn]!='#' && zUri[iIn-1]!='&' ) iIn++;
114725: continue;
114726: }
114727: if( c=='&' ){
114728: zFile[iOut++] = '\0';
114729: }else{
114730: eState = 2;
114731: }
114732: c = 0;
114733: }else if( (eState==0 && c=='?') || (eState==2 && c=='&') ){
114734: c = 0;
114735: eState = 1;
114736: }
114737: zFile[iOut++] = c;
114738: }
114739: if( eState==1 ) zFile[iOut++] = '\0';
114740: zFile[iOut++] = '\0';
114741: zFile[iOut++] = '\0';
114742:
114743: /* Check if there were any options specified that should be interpreted
114744: ** here. Options that are interpreted here include "vfs" and those that
114745: ** correspond to flags that may be passed to the sqlite3_open_v2()
114746: ** method. */
114747: zOpt = &zFile[sqlite3Strlen30(zFile)+1];
114748: while( zOpt[0] ){
114749: int nOpt = sqlite3Strlen30(zOpt);
114750: char *zVal = &zOpt[nOpt+1];
114751: int nVal = sqlite3Strlen30(zVal);
114752:
114753: if( nOpt==3 && memcmp("vfs", zOpt, 3)==0 ){
114754: zVfs = zVal;
114755: }else{
114756: struct OpenMode {
114757: const char *z;
114758: int mode;
114759: } *aMode = 0;
114760: char *zModeType = 0;
114761: int mask = 0;
114762: int limit = 0;
114763:
114764: if( nOpt==5 && memcmp("cache", zOpt, 5)==0 ){
114765: static struct OpenMode aCacheMode[] = {
114766: { "shared", SQLITE_OPEN_SHAREDCACHE },
114767: { "private", SQLITE_OPEN_PRIVATECACHE },
114768: { 0, 0 }
114769: };
114770:
114771: mask = SQLITE_OPEN_SHAREDCACHE|SQLITE_OPEN_PRIVATECACHE;
114772: aMode = aCacheMode;
114773: limit = mask;
114774: zModeType = "cache";
114775: }
114776: if( nOpt==4 && memcmp("mode", zOpt, 4)==0 ){
114777: static struct OpenMode aOpenMode[] = {
114778: { "ro", SQLITE_OPEN_READONLY },
114779: { "rw", SQLITE_OPEN_READWRITE },
114780: { "rwc", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE },
1.2.2.1 ! misho 114781: { "memory", SQLITE_OPEN_MEMORY },
1.2 misho 114782: { 0, 0 }
114783: };
114784:
1.2.2.1 ! misho 114785: mask = SQLITE_OPEN_READONLY | SQLITE_OPEN_READWRITE
! 114786: | SQLITE_OPEN_CREATE | SQLITE_OPEN_MEMORY;
1.2 misho 114787: aMode = aOpenMode;
114788: limit = mask & flags;
114789: zModeType = "access";
114790: }
114791:
114792: if( aMode ){
114793: int i;
114794: int mode = 0;
114795: for(i=0; aMode[i].z; i++){
114796: const char *z = aMode[i].z;
114797: if( nVal==sqlite3Strlen30(z) && 0==memcmp(zVal, z, nVal) ){
114798: mode = aMode[i].mode;
114799: break;
114800: }
114801: }
114802: if( mode==0 ){
114803: *pzErrMsg = sqlite3_mprintf("no such %s mode: %s", zModeType, zVal);
114804: rc = SQLITE_ERROR;
114805: goto parse_uri_out;
114806: }
1.2.2.1 ! misho 114807: if( (mode & ~SQLITE_OPEN_MEMORY)>limit ){
1.2 misho 114808: *pzErrMsg = sqlite3_mprintf("%s mode not allowed: %s",
114809: zModeType, zVal);
114810: rc = SQLITE_PERM;
114811: goto parse_uri_out;
114812: }
114813: flags = (flags & ~mask) | mode;
114814: }
114815: }
114816:
114817: zOpt = &zVal[nVal+1];
114818: }
114819:
114820: }else{
114821: zFile = sqlite3_malloc(nUri+2);
114822: if( !zFile ) return SQLITE_NOMEM;
114823: memcpy(zFile, zUri, nUri);
114824: zFile[nUri] = '\0';
114825: zFile[nUri+1] = '\0';
1.2.2.1 ! misho 114826: flags &= ~SQLITE_OPEN_URI;
1.2 misho 114827: }
114828:
114829: *ppVfs = sqlite3_vfs_find(zVfs);
114830: if( *ppVfs==0 ){
114831: *pzErrMsg = sqlite3_mprintf("no such vfs: %s", zVfs);
114832: rc = SQLITE_ERROR;
114833: }
114834: parse_uri_out:
114835: if( rc!=SQLITE_OK ){
114836: sqlite3_free(zFile);
114837: zFile = 0;
114838: }
114839: *pFlags = flags;
114840: *pzFile = zFile;
114841: return rc;
114842: }
114843:
114844:
114845: /*
114846: ** This routine does the work of opening a database on behalf of
114847: ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename"
114848: ** is UTF-8 encoded.
114849: */
114850: static int openDatabase(
114851: const char *zFilename, /* Database filename UTF-8 encoded */
114852: sqlite3 **ppDb, /* OUT: Returned database handle */
114853: unsigned int flags, /* Operational flags */
114854: const char *zVfs /* Name of the VFS to use */
114855: ){
114856: sqlite3 *db; /* Store allocated handle here */
114857: int rc; /* Return code */
114858: int isThreadsafe; /* True for threadsafe connections */
114859: char *zOpen = 0; /* Filename argument to pass to BtreeOpen() */
114860: char *zErrMsg = 0; /* Error message from sqlite3ParseUri() */
114861:
114862: *ppDb = 0;
114863: #ifndef SQLITE_OMIT_AUTOINIT
114864: rc = sqlite3_initialize();
114865: if( rc ) return rc;
114866: #endif
114867:
114868: /* Only allow sensible combinations of bits in the flags argument.
114869: ** Throw an error if any non-sense combination is used. If we
114870: ** do not block illegal combinations here, it could trigger
114871: ** assert() statements in deeper layers. Sensible combinations
114872: ** are:
114873: **
114874: ** 1: SQLITE_OPEN_READONLY
114875: ** 2: SQLITE_OPEN_READWRITE
114876: ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
114877: */
114878: assert( SQLITE_OPEN_READONLY == 0x01 );
114879: assert( SQLITE_OPEN_READWRITE == 0x02 );
114880: assert( SQLITE_OPEN_CREATE == 0x04 );
114881: testcase( (1<<(flags&7))==0x02 ); /* READONLY */
114882: testcase( (1<<(flags&7))==0x04 ); /* READWRITE */
114883: testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */
114884: if( ((1<<(flags&7)) & 0x46)==0 ) return SQLITE_MISUSE_BKPT;
114885:
114886: if( sqlite3GlobalConfig.bCoreMutex==0 ){
114887: isThreadsafe = 0;
114888: }else if( flags & SQLITE_OPEN_NOMUTEX ){
114889: isThreadsafe = 0;
114890: }else if( flags & SQLITE_OPEN_FULLMUTEX ){
114891: isThreadsafe = 1;
114892: }else{
114893: isThreadsafe = sqlite3GlobalConfig.bFullMutex;
114894: }
114895: if( flags & SQLITE_OPEN_PRIVATECACHE ){
114896: flags &= ~SQLITE_OPEN_SHAREDCACHE;
114897: }else if( sqlite3GlobalConfig.sharedCacheEnabled ){
114898: flags |= SQLITE_OPEN_SHAREDCACHE;
114899: }
114900:
114901: /* Remove harmful bits from the flags parameter
114902: **
114903: ** The SQLITE_OPEN_NOMUTEX and SQLITE_OPEN_FULLMUTEX flags were
114904: ** dealt with in the previous code block. Besides these, the only
114905: ** valid input flags for sqlite3_open_v2() are SQLITE_OPEN_READONLY,
114906: ** SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_SHAREDCACHE,
114907: ** SQLITE_OPEN_PRIVATECACHE, and some reserved bits. Silently mask
114908: ** off all other flags.
114909: */
114910: flags &= ~( SQLITE_OPEN_DELETEONCLOSE |
114911: SQLITE_OPEN_EXCLUSIVE |
114912: SQLITE_OPEN_MAIN_DB |
114913: SQLITE_OPEN_TEMP_DB |
114914: SQLITE_OPEN_TRANSIENT_DB |
114915: SQLITE_OPEN_MAIN_JOURNAL |
114916: SQLITE_OPEN_TEMP_JOURNAL |
114917: SQLITE_OPEN_SUBJOURNAL |
114918: SQLITE_OPEN_MASTER_JOURNAL |
114919: SQLITE_OPEN_NOMUTEX |
114920: SQLITE_OPEN_FULLMUTEX |
114921: SQLITE_OPEN_WAL
114922: );
114923:
114924: /* Allocate the sqlite data structure */
114925: db = sqlite3MallocZero( sizeof(sqlite3) );
114926: if( db==0 ) goto opendb_out;
114927: if( isThreadsafe ){
114928: db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE);
114929: if( db->mutex==0 ){
114930: sqlite3_free(db);
114931: db = 0;
114932: goto opendb_out;
114933: }
114934: }
114935: sqlite3_mutex_enter(db->mutex);
114936: db->errMask = 0xff;
114937: db->nDb = 2;
114938: db->magic = SQLITE_MAGIC_BUSY;
114939: db->aDb = db->aDbStatic;
114940:
114941: assert( sizeof(db->aLimit)==sizeof(aHardLimit) );
114942: memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit));
114943: db->autoCommit = 1;
114944: db->nextAutovac = -1;
114945: db->nextPagesize = 0;
114946: db->flags |= SQLITE_ShortColNames | SQLITE_AutoIndex | SQLITE_EnableTrigger
114947: #if SQLITE_DEFAULT_FILE_FORMAT<4
114948: | SQLITE_LegacyFileFmt
114949: #endif
114950: #ifdef SQLITE_ENABLE_LOAD_EXTENSION
114951: | SQLITE_LoadExtension
114952: #endif
114953: #if SQLITE_DEFAULT_RECURSIVE_TRIGGERS
114954: | SQLITE_RecTriggers
114955: #endif
114956: #if defined(SQLITE_DEFAULT_FOREIGN_KEYS) && SQLITE_DEFAULT_FOREIGN_KEYS
114957: | SQLITE_ForeignKeys
114958: #endif
114959: ;
114960: sqlite3HashInit(&db->aCollSeq);
114961: #ifndef SQLITE_OMIT_VIRTUALTABLE
114962: sqlite3HashInit(&db->aModule);
114963: #endif
114964:
114965: /* Add the default collation sequence BINARY. BINARY works for both UTF-8
114966: ** and UTF-16, so add a version for each to avoid any unnecessary
114967: ** conversions. The only error that can occur here is a malloc() failure.
114968: */
114969: createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0);
114970: createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0);
114971: createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0);
114972: createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0);
114973: if( db->mallocFailed ){
114974: goto opendb_out;
114975: }
114976: db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0);
114977: assert( db->pDfltColl!=0 );
114978:
114979: /* Also add a UTF-8 case-insensitive collation sequence. */
114980: createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0);
114981:
114982: /* Parse the filename/URI argument. */
114983: db->openFlags = flags;
114984: rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg);
114985: if( rc!=SQLITE_OK ){
114986: if( rc==SQLITE_NOMEM ) db->mallocFailed = 1;
114987: sqlite3Error(db, rc, zErrMsg ? "%s" : 0, zErrMsg);
114988: sqlite3_free(zErrMsg);
114989: goto opendb_out;
114990: }
114991:
114992: /* Open the backend database driver */
114993: rc = sqlite3BtreeOpen(db->pVfs, zOpen, db, &db->aDb[0].pBt, 0,
114994: flags | SQLITE_OPEN_MAIN_DB);
114995: if( rc!=SQLITE_OK ){
114996: if( rc==SQLITE_IOERR_NOMEM ){
114997: rc = SQLITE_NOMEM;
114998: }
114999: sqlite3Error(db, rc, 0);
115000: goto opendb_out;
115001: }
115002: db->aDb[0].pSchema = sqlite3SchemaGet(db, db->aDb[0].pBt);
115003: db->aDb[1].pSchema = sqlite3SchemaGet(db, 0);
115004:
115005:
115006: /* The default safety_level for the main database is 'full'; for the temp
115007: ** database it is 'NONE'. This matches the pager layer defaults.
115008: */
115009: db->aDb[0].zName = "main";
115010: db->aDb[0].safety_level = 3;
115011: db->aDb[1].zName = "temp";
115012: db->aDb[1].safety_level = 1;
115013:
115014: db->magic = SQLITE_MAGIC_OPEN;
115015: if( db->mallocFailed ){
115016: goto opendb_out;
115017: }
115018:
115019: /* Register all built-in functions, but do not attempt to read the
115020: ** database schema yet. This is delayed until the first time the database
115021: ** is accessed.
115022: */
115023: sqlite3Error(db, SQLITE_OK, 0);
115024: sqlite3RegisterBuiltinFunctions(db);
115025:
115026: /* Load automatic extensions - extensions that have been registered
115027: ** using the sqlite3_automatic_extension() API.
115028: */
115029: rc = sqlite3_errcode(db);
115030: if( rc==SQLITE_OK ){
115031: sqlite3AutoLoadExtensions(db);
115032: rc = sqlite3_errcode(db);
115033: if( rc!=SQLITE_OK ){
115034: goto opendb_out;
115035: }
115036: }
115037:
115038: #ifdef SQLITE_ENABLE_FTS1
115039: if( !db->mallocFailed ){
115040: extern int sqlite3Fts1Init(sqlite3*);
115041: rc = sqlite3Fts1Init(db);
115042: }
115043: #endif
115044:
115045: #ifdef SQLITE_ENABLE_FTS2
115046: if( !db->mallocFailed && rc==SQLITE_OK ){
115047: extern int sqlite3Fts2Init(sqlite3*);
115048: rc = sqlite3Fts2Init(db);
115049: }
115050: #endif
115051:
115052: #ifdef SQLITE_ENABLE_FTS3
115053: if( !db->mallocFailed && rc==SQLITE_OK ){
115054: rc = sqlite3Fts3Init(db);
115055: }
115056: #endif
115057:
115058: #ifdef SQLITE_ENABLE_ICU
115059: if( !db->mallocFailed && rc==SQLITE_OK ){
115060: rc = sqlite3IcuInit(db);
115061: }
115062: #endif
115063:
115064: #ifdef SQLITE_ENABLE_RTREE
115065: if( !db->mallocFailed && rc==SQLITE_OK){
115066: rc = sqlite3RtreeInit(db);
115067: }
115068: #endif
115069:
115070: sqlite3Error(db, rc, 0);
115071:
115072: /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking
115073: ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking
115074: ** mode. Doing nothing at all also makes NORMAL the default.
115075: */
115076: #ifdef SQLITE_DEFAULT_LOCKING_MODE
115077: db->dfltLockMode = SQLITE_DEFAULT_LOCKING_MODE;
115078: sqlite3PagerLockingMode(sqlite3BtreePager(db->aDb[0].pBt),
115079: SQLITE_DEFAULT_LOCKING_MODE);
115080: #endif
115081:
115082: /* Enable the lookaside-malloc subsystem */
115083: setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside,
115084: sqlite3GlobalConfig.nLookaside);
115085:
115086: sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT);
115087:
115088: opendb_out:
115089: sqlite3_free(zOpen);
115090: if( db ){
115091: assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 );
115092: sqlite3_mutex_leave(db->mutex);
115093: }
115094: rc = sqlite3_errcode(db);
115095: assert( db!=0 || rc==SQLITE_NOMEM );
115096: if( rc==SQLITE_NOMEM ){
115097: sqlite3_close(db);
115098: db = 0;
115099: }else if( rc!=SQLITE_OK ){
115100: db->magic = SQLITE_MAGIC_SICK;
115101: }
115102: *ppDb = db;
1.2.2.1 ! misho 115103: #ifdef SQLITE_ENABLE_SQLLOG
! 115104: if( sqlite3GlobalConfig.xSqllog ){
! 115105: /* Opening a db handle. Fourth parameter is passed 0. */
! 115106: void *pArg = sqlite3GlobalConfig.pSqllogArg;
! 115107: sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0);
! 115108: }
! 115109: #endif
1.2 misho 115110: return sqlite3ApiExit(0, rc);
115111: }
115112:
115113: /*
115114: ** Open a new database handle.
115115: */
115116: SQLITE_API int sqlite3_open(
115117: const char *zFilename,
115118: sqlite3 **ppDb
115119: ){
115120: return openDatabase(zFilename, ppDb,
115121: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
115122: }
115123: SQLITE_API int sqlite3_open_v2(
115124: const char *filename, /* Database filename (UTF-8) */
115125: sqlite3 **ppDb, /* OUT: SQLite db handle */
115126: int flags, /* Flags */
115127: const char *zVfs /* Name of VFS module to use */
115128: ){
115129: return openDatabase(filename, ppDb, (unsigned int)flags, zVfs);
115130: }
115131:
115132: #ifndef SQLITE_OMIT_UTF16
115133: /*
115134: ** Open a new database handle.
115135: */
115136: SQLITE_API int sqlite3_open16(
115137: const void *zFilename,
115138: sqlite3 **ppDb
115139: ){
115140: char const *zFilename8; /* zFilename encoded in UTF-8 instead of UTF-16 */
115141: sqlite3_value *pVal;
115142: int rc;
115143:
115144: assert( zFilename );
115145: assert( ppDb );
115146: *ppDb = 0;
115147: #ifndef SQLITE_OMIT_AUTOINIT
115148: rc = sqlite3_initialize();
115149: if( rc ) return rc;
115150: #endif
115151: pVal = sqlite3ValueNew(0);
115152: sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
115153: zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
115154: if( zFilename8 ){
115155: rc = openDatabase(zFilename8, ppDb,
115156: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
115157: assert( *ppDb || rc==SQLITE_NOMEM );
115158: if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
115159: ENC(*ppDb) = SQLITE_UTF16NATIVE;
115160: }
115161: }else{
115162: rc = SQLITE_NOMEM;
115163: }
115164: sqlite3ValueFree(pVal);
115165:
115166: return sqlite3ApiExit(0, rc);
115167: }
115168: #endif /* SQLITE_OMIT_UTF16 */
115169:
115170: /*
115171: ** Register a new collation sequence with the database handle db.
115172: */
115173: SQLITE_API int sqlite3_create_collation(
115174: sqlite3* db,
115175: const char *zName,
115176: int enc,
115177: void* pCtx,
115178: int(*xCompare)(void*,int,const void*,int,const void*)
115179: ){
115180: int rc;
115181: sqlite3_mutex_enter(db->mutex);
115182: assert( !db->mallocFailed );
115183: rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, 0);
115184: rc = sqlite3ApiExit(db, rc);
115185: sqlite3_mutex_leave(db->mutex);
115186: return rc;
115187: }
115188:
115189: /*
115190: ** Register a new collation sequence with the database handle db.
115191: */
115192: SQLITE_API int sqlite3_create_collation_v2(
115193: sqlite3* db,
115194: const char *zName,
115195: int enc,
115196: void* pCtx,
115197: int(*xCompare)(void*,int,const void*,int,const void*),
115198: void(*xDel)(void*)
115199: ){
115200: int rc;
115201: sqlite3_mutex_enter(db->mutex);
115202: assert( !db->mallocFailed );
115203: rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel);
115204: rc = sqlite3ApiExit(db, rc);
115205: sqlite3_mutex_leave(db->mutex);
115206: return rc;
115207: }
115208:
115209: #ifndef SQLITE_OMIT_UTF16
115210: /*
115211: ** Register a new collation sequence with the database handle db.
115212: */
115213: SQLITE_API int sqlite3_create_collation16(
115214: sqlite3* db,
115215: const void *zName,
115216: int enc,
115217: void* pCtx,
115218: int(*xCompare)(void*,int,const void*,int,const void*)
115219: ){
115220: int rc = SQLITE_OK;
115221: char *zName8;
115222: sqlite3_mutex_enter(db->mutex);
115223: assert( !db->mallocFailed );
115224: zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE);
115225: if( zName8 ){
115226: rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0);
115227: sqlite3DbFree(db, zName8);
115228: }
115229: rc = sqlite3ApiExit(db, rc);
115230: sqlite3_mutex_leave(db->mutex);
115231: return rc;
115232: }
115233: #endif /* SQLITE_OMIT_UTF16 */
115234:
115235: /*
115236: ** Register a collation sequence factory callback with the database handle
115237: ** db. Replace any previously installed collation sequence factory.
115238: */
115239: SQLITE_API int sqlite3_collation_needed(
115240: sqlite3 *db,
115241: void *pCollNeededArg,
115242: void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*)
115243: ){
115244: sqlite3_mutex_enter(db->mutex);
115245: db->xCollNeeded = xCollNeeded;
115246: db->xCollNeeded16 = 0;
115247: db->pCollNeededArg = pCollNeededArg;
115248: sqlite3_mutex_leave(db->mutex);
115249: return SQLITE_OK;
115250: }
115251:
115252: #ifndef SQLITE_OMIT_UTF16
115253: /*
115254: ** Register a collation sequence factory callback with the database handle
115255: ** db. Replace any previously installed collation sequence factory.
115256: */
115257: SQLITE_API int sqlite3_collation_needed16(
115258: sqlite3 *db,
115259: void *pCollNeededArg,
115260: void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*)
115261: ){
115262: sqlite3_mutex_enter(db->mutex);
115263: db->xCollNeeded = 0;
115264: db->xCollNeeded16 = xCollNeeded16;
115265: db->pCollNeededArg = pCollNeededArg;
115266: sqlite3_mutex_leave(db->mutex);
115267: return SQLITE_OK;
115268: }
115269: #endif /* SQLITE_OMIT_UTF16 */
115270:
115271: #ifndef SQLITE_OMIT_DEPRECATED
115272: /*
115273: ** This function is now an anachronism. It used to be used to recover from a
115274: ** malloc() failure, but SQLite now does this automatically.
115275: */
115276: SQLITE_API int sqlite3_global_recover(void){
115277: return SQLITE_OK;
115278: }
115279: #endif
115280:
115281: /*
115282: ** Test to see whether or not the database connection is in autocommit
115283: ** mode. Return TRUE if it is and FALSE if not. Autocommit mode is on
115284: ** by default. Autocommit is disabled by a BEGIN statement and reenabled
115285: ** by the next COMMIT or ROLLBACK.
115286: **
115287: ******* THIS IS AN EXPERIMENTAL API AND IS SUBJECT TO CHANGE ******
115288: */
115289: SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){
115290: return db->autoCommit;
115291: }
115292:
115293: /*
115294: ** The following routines are subtitutes for constants SQLITE_CORRUPT,
115295: ** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_IOERR and possibly other error
115296: ** constants. They server two purposes:
115297: **
115298: ** 1. Serve as a convenient place to set a breakpoint in a debugger
115299: ** to detect when version error conditions occurs.
115300: **
115301: ** 2. Invoke sqlite3_log() to provide the source code location where
115302: ** a low-level error is first detected.
115303: */
115304: SQLITE_PRIVATE int sqlite3CorruptError(int lineno){
115305: testcase( sqlite3GlobalConfig.xLog!=0 );
115306: sqlite3_log(SQLITE_CORRUPT,
115307: "database corruption at line %d of [%.10s]",
115308: lineno, 20+sqlite3_sourceid());
115309: return SQLITE_CORRUPT;
115310: }
115311: SQLITE_PRIVATE int sqlite3MisuseError(int lineno){
115312: testcase( sqlite3GlobalConfig.xLog!=0 );
115313: sqlite3_log(SQLITE_MISUSE,
115314: "misuse at line %d of [%.10s]",
115315: lineno, 20+sqlite3_sourceid());
115316: return SQLITE_MISUSE;
115317: }
115318: SQLITE_PRIVATE int sqlite3CantopenError(int lineno){
115319: testcase( sqlite3GlobalConfig.xLog!=0 );
115320: sqlite3_log(SQLITE_CANTOPEN,
115321: "cannot open file at line %d of [%.10s]",
115322: lineno, 20+sqlite3_sourceid());
115323: return SQLITE_CANTOPEN;
115324: }
115325:
115326:
115327: #ifndef SQLITE_OMIT_DEPRECATED
115328: /*
115329: ** This is a convenience routine that makes sure that all thread-specific
115330: ** data for this thread has been deallocated.
115331: **
115332: ** SQLite no longer uses thread-specific data so this routine is now a
115333: ** no-op. It is retained for historical compatibility.
115334: */
115335: SQLITE_API void sqlite3_thread_cleanup(void){
115336: }
115337: #endif
115338:
115339: /*
115340: ** Return meta information about a specific column of a database table.
115341: ** See comment in sqlite3.h (sqlite.h.in) for details.
115342: */
115343: #ifdef SQLITE_ENABLE_COLUMN_METADATA
115344: SQLITE_API int sqlite3_table_column_metadata(
115345: sqlite3 *db, /* Connection handle */
115346: const char *zDbName, /* Database name or NULL */
115347: const char *zTableName, /* Table name */
115348: const char *zColumnName, /* Column name */
115349: char const **pzDataType, /* OUTPUT: Declared data type */
115350: char const **pzCollSeq, /* OUTPUT: Collation sequence name */
115351: int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */
115352: int *pPrimaryKey, /* OUTPUT: True if column part of PK */
115353: int *pAutoinc /* OUTPUT: True if column is auto-increment */
115354: ){
115355: int rc;
115356: char *zErrMsg = 0;
115357: Table *pTab = 0;
115358: Column *pCol = 0;
115359: int iCol;
115360:
115361: char const *zDataType = 0;
115362: char const *zCollSeq = 0;
115363: int notnull = 0;
115364: int primarykey = 0;
115365: int autoinc = 0;
115366:
115367: /* Ensure the database schema has been loaded */
115368: sqlite3_mutex_enter(db->mutex);
115369: sqlite3BtreeEnterAll(db);
115370: rc = sqlite3Init(db, &zErrMsg);
115371: if( SQLITE_OK!=rc ){
115372: goto error_out;
115373: }
115374:
115375: /* Locate the table in question */
115376: pTab = sqlite3FindTable(db, zTableName, zDbName);
115377: if( !pTab || pTab->pSelect ){
115378: pTab = 0;
115379: goto error_out;
115380: }
115381:
115382: /* Find the column for which info is requested */
115383: if( sqlite3IsRowid(zColumnName) ){
115384: iCol = pTab->iPKey;
115385: if( iCol>=0 ){
115386: pCol = &pTab->aCol[iCol];
115387: }
115388: }else{
115389: for(iCol=0; iCol<pTab->nCol; iCol++){
115390: pCol = &pTab->aCol[iCol];
115391: if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){
115392: break;
115393: }
115394: }
115395: if( iCol==pTab->nCol ){
115396: pTab = 0;
115397: goto error_out;
115398: }
115399: }
115400:
115401: /* The following block stores the meta information that will be returned
115402: ** to the caller in local variables zDataType, zCollSeq, notnull, primarykey
115403: ** and autoinc. At this point there are two possibilities:
115404: **
115405: ** 1. The specified column name was rowid", "oid" or "_rowid_"
115406: ** and there is no explicitly declared IPK column.
115407: **
115408: ** 2. The table is not a view and the column name identified an
115409: ** explicitly declared column. Copy meta information from *pCol.
115410: */
115411: if( pCol ){
115412: zDataType = pCol->zType;
115413: zCollSeq = pCol->zColl;
115414: notnull = pCol->notNull!=0;
1.2.2.1 ! misho 115415: primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0;
1.2 misho 115416: autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0;
115417: }else{
115418: zDataType = "INTEGER";
115419: primarykey = 1;
115420: }
115421: if( !zCollSeq ){
115422: zCollSeq = "BINARY";
115423: }
115424:
115425: error_out:
115426: sqlite3BtreeLeaveAll(db);
115427:
115428: /* Whether the function call succeeded or failed, set the output parameters
115429: ** to whatever their local counterparts contain. If an error did occur,
115430: ** this has the effect of zeroing all output parameters.
115431: */
115432: if( pzDataType ) *pzDataType = zDataType;
115433: if( pzCollSeq ) *pzCollSeq = zCollSeq;
115434: if( pNotNull ) *pNotNull = notnull;
115435: if( pPrimaryKey ) *pPrimaryKey = primarykey;
115436: if( pAutoinc ) *pAutoinc = autoinc;
115437:
115438: if( SQLITE_OK==rc && !pTab ){
115439: sqlite3DbFree(db, zErrMsg);
115440: zErrMsg = sqlite3MPrintf(db, "no such table column: %s.%s", zTableName,
115441: zColumnName);
115442: rc = SQLITE_ERROR;
115443: }
115444: sqlite3Error(db, rc, (zErrMsg?"%s":0), zErrMsg);
115445: sqlite3DbFree(db, zErrMsg);
115446: rc = sqlite3ApiExit(db, rc);
115447: sqlite3_mutex_leave(db->mutex);
115448: return rc;
115449: }
115450: #endif
115451:
115452: /*
115453: ** Sleep for a little while. Return the amount of time slept.
115454: */
115455: SQLITE_API int sqlite3_sleep(int ms){
115456: sqlite3_vfs *pVfs;
115457: int rc;
115458: pVfs = sqlite3_vfs_find(0);
115459: if( pVfs==0 ) return 0;
115460:
115461: /* This function works in milliseconds, but the underlying OsSleep()
115462: ** API uses microseconds. Hence the 1000's.
115463: */
115464: rc = (sqlite3OsSleep(pVfs, 1000*ms)/1000);
115465: return rc;
115466: }
115467:
115468: /*
115469: ** Enable or disable the extended result codes.
115470: */
115471: SQLITE_API int sqlite3_extended_result_codes(sqlite3 *db, int onoff){
115472: sqlite3_mutex_enter(db->mutex);
115473: db->errMask = onoff ? 0xffffffff : 0xff;
115474: sqlite3_mutex_leave(db->mutex);
115475: return SQLITE_OK;
115476: }
115477:
115478: /*
115479: ** Invoke the xFileControl method on a particular database.
115480: */
115481: SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg){
115482: int rc = SQLITE_ERROR;
1.2.2.1 ! misho 115483: Btree *pBtree;
! 115484:
1.2 misho 115485: sqlite3_mutex_enter(db->mutex);
1.2.2.1 ! misho 115486: pBtree = sqlite3DbNameToBtree(db, zDbName);
! 115487: if( pBtree ){
! 115488: Pager *pPager;
! 115489: sqlite3_file *fd;
! 115490: sqlite3BtreeEnter(pBtree);
! 115491: pPager = sqlite3BtreePager(pBtree);
! 115492: assert( pPager!=0 );
! 115493: fd = sqlite3PagerFile(pPager);
! 115494: assert( fd!=0 );
! 115495: if( op==SQLITE_FCNTL_FILE_POINTER ){
! 115496: *(sqlite3_file**)pArg = fd;
! 115497: rc = SQLITE_OK;
! 115498: }else if( fd->pMethods ){
! 115499: rc = sqlite3OsFileControl(fd, op, pArg);
! 115500: }else{
! 115501: rc = SQLITE_NOTFOUND;
1.2 misho 115502: }
1.2.2.1 ! misho 115503: sqlite3BtreeLeave(pBtree);
1.2 misho 115504: }
115505: sqlite3_mutex_leave(db->mutex);
115506: return rc;
115507: }
115508:
115509: /*
115510: ** Interface to the testing logic.
115511: */
115512: SQLITE_API int sqlite3_test_control(int op, ...){
115513: int rc = 0;
115514: #ifndef SQLITE_OMIT_BUILTIN_TEST
115515: va_list ap;
115516: va_start(ap, op);
115517: switch( op ){
115518:
115519: /*
115520: ** Save the current state of the PRNG.
115521: */
115522: case SQLITE_TESTCTRL_PRNG_SAVE: {
115523: sqlite3PrngSaveState();
115524: break;
115525: }
115526:
115527: /*
115528: ** Restore the state of the PRNG to the last state saved using
115529: ** PRNG_SAVE. If PRNG_SAVE has never before been called, then
115530: ** this verb acts like PRNG_RESET.
115531: */
115532: case SQLITE_TESTCTRL_PRNG_RESTORE: {
115533: sqlite3PrngRestoreState();
115534: break;
115535: }
115536:
115537: /*
115538: ** Reset the PRNG back to its uninitialized state. The next call
115539: ** to sqlite3_randomness() will reseed the PRNG using a single call
115540: ** to the xRandomness method of the default VFS.
115541: */
115542: case SQLITE_TESTCTRL_PRNG_RESET: {
115543: sqlite3PrngResetState();
115544: break;
115545: }
115546:
115547: /*
115548: ** sqlite3_test_control(BITVEC_TEST, size, program)
115549: **
115550: ** Run a test against a Bitvec object of size. The program argument
115551: ** is an array of integers that defines the test. Return -1 on a
115552: ** memory allocation error, 0 on success, or non-zero for an error.
115553: ** See the sqlite3BitvecBuiltinTest() for additional information.
115554: */
115555: case SQLITE_TESTCTRL_BITVEC_TEST: {
115556: int sz = va_arg(ap, int);
115557: int *aProg = va_arg(ap, int*);
115558: rc = sqlite3BitvecBuiltinTest(sz, aProg);
115559: break;
115560: }
115561:
115562: /*
115563: ** sqlite3_test_control(BENIGN_MALLOC_HOOKS, xBegin, xEnd)
115564: **
115565: ** Register hooks to call to indicate which malloc() failures
115566: ** are benign.
115567: */
115568: case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: {
115569: typedef void (*void_function)(void);
115570: void_function xBenignBegin;
115571: void_function xBenignEnd;
115572: xBenignBegin = va_arg(ap, void_function);
115573: xBenignEnd = va_arg(ap, void_function);
115574: sqlite3BenignMallocHooks(xBenignBegin, xBenignEnd);
115575: break;
115576: }
115577:
115578: /*
115579: ** sqlite3_test_control(SQLITE_TESTCTRL_PENDING_BYTE, unsigned int X)
115580: **
115581: ** Set the PENDING byte to the value in the argument, if X>0.
115582: ** Make no changes if X==0. Return the value of the pending byte
115583: ** as it existing before this routine was called.
115584: **
115585: ** IMPORTANT: Changing the PENDING byte from 0x40000000 results in
115586: ** an incompatible database file format. Changing the PENDING byte
115587: ** while any database connection is open results in undefined and
115588: ** dileterious behavior.
115589: */
115590: case SQLITE_TESTCTRL_PENDING_BYTE: {
115591: rc = PENDING_BYTE;
115592: #ifndef SQLITE_OMIT_WSD
115593: {
115594: unsigned int newVal = va_arg(ap, unsigned int);
115595: if( newVal ) sqlite3PendingByte = newVal;
115596: }
115597: #endif
115598: break;
115599: }
115600:
115601: /*
115602: ** sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, int X)
115603: **
115604: ** This action provides a run-time test to see whether or not
115605: ** assert() was enabled at compile-time. If X is true and assert()
115606: ** is enabled, then the return value is true. If X is true and
115607: ** assert() is disabled, then the return value is zero. If X is
115608: ** false and assert() is enabled, then the assertion fires and the
115609: ** process aborts. If X is false and assert() is disabled, then the
115610: ** return value is zero.
115611: */
115612: case SQLITE_TESTCTRL_ASSERT: {
115613: volatile int x = 0;
115614: assert( (x = va_arg(ap,int))!=0 );
115615: rc = x;
115616: break;
115617: }
115618:
115619:
115620: /*
115621: ** sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, int X)
115622: **
115623: ** This action provides a run-time test to see how the ALWAYS and
115624: ** NEVER macros were defined at compile-time.
115625: **
115626: ** The return value is ALWAYS(X).
115627: **
115628: ** The recommended test is X==2. If the return value is 2, that means
115629: ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the
115630: ** default setting. If the return value is 1, then ALWAYS() is either
115631: ** hard-coded to true or else it asserts if its argument is false.
115632: ** The first behavior (hard-coded to true) is the case if
115633: ** SQLITE_TESTCTRL_ASSERT shows that assert() is disabled and the second
115634: ** behavior (assert if the argument to ALWAYS() is false) is the case if
115635: ** SQLITE_TESTCTRL_ASSERT shows that assert() is enabled.
115636: **
115637: ** The run-time test procedure might look something like this:
115638: **
115639: ** if( sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, 2)==2 ){
115640: ** // ALWAYS() and NEVER() are no-op pass-through macros
115641: ** }else if( sqlite3_test_control(SQLITE_TESTCTRL_ASSERT, 1) ){
115642: ** // ALWAYS(x) asserts that x is true. NEVER(x) asserts x is false.
115643: ** }else{
115644: ** // ALWAYS(x) is a constant 1. NEVER(x) is a constant 0.
115645: ** }
115646: */
115647: case SQLITE_TESTCTRL_ALWAYS: {
115648: int x = va_arg(ap,int);
115649: rc = ALWAYS(x);
115650: break;
115651: }
115652:
115653: /* sqlite3_test_control(SQLITE_TESTCTRL_RESERVE, sqlite3 *db, int N)
115654: **
115655: ** Set the nReserve size to N for the main database on the database
115656: ** connection db.
115657: */
115658: case SQLITE_TESTCTRL_RESERVE: {
115659: sqlite3 *db = va_arg(ap, sqlite3*);
115660: int x = va_arg(ap,int);
115661: sqlite3_mutex_enter(db->mutex);
115662: sqlite3BtreeSetPageSize(db->aDb[0].pBt, 0, x, 0);
115663: sqlite3_mutex_leave(db->mutex);
115664: break;
115665: }
115666:
115667: /* sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, sqlite3 *db, int N)
115668: **
115669: ** Enable or disable various optimizations for testing purposes. The
115670: ** argument N is a bitmask of optimizations to be disabled. For normal
115671: ** operation N should be 0. The idea is that a test program (like the
115672: ** SQL Logic Test or SLT test module) can run the same SQL multiple times
115673: ** with various optimizations disabled to verify that the same answer
115674: ** is obtained in every case.
115675: */
115676: case SQLITE_TESTCTRL_OPTIMIZATIONS: {
115677: sqlite3 *db = va_arg(ap, sqlite3*);
1.2.2.1 ! misho 115678: db->dbOptFlags = (u16)(va_arg(ap, int) & 0xffff);
1.2 misho 115679: break;
115680: }
115681:
115682: #ifdef SQLITE_N_KEYWORD
115683: /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord)
115684: **
115685: ** If zWord is a keyword recognized by the parser, then return the
115686: ** number of keywords. Or if zWord is not a keyword, return 0.
115687: **
115688: ** This test feature is only available in the amalgamation since
115689: ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite
115690: ** is built using separate source files.
115691: */
115692: case SQLITE_TESTCTRL_ISKEYWORD: {
115693: const char *zWord = va_arg(ap, const char*);
115694: int n = sqlite3Strlen30(zWord);
115695: rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0;
115696: break;
115697: }
115698: #endif
115699:
115700: /* sqlite3_test_control(SQLITE_TESTCTRL_SCRATCHMALLOC, sz, &pNew, pFree);
115701: **
115702: ** Pass pFree into sqlite3ScratchFree().
115703: ** If sz>0 then allocate a scratch buffer into pNew.
115704: */
115705: case SQLITE_TESTCTRL_SCRATCHMALLOC: {
115706: void *pFree, **ppNew;
115707: int sz;
115708: sz = va_arg(ap, int);
115709: ppNew = va_arg(ap, void**);
115710: pFree = va_arg(ap, void*);
115711: if( sz ) *ppNew = sqlite3ScratchMalloc(sz);
115712: sqlite3ScratchFree(pFree);
115713: break;
115714: }
115715:
115716: /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
115717: **
115718: ** If parameter onoff is non-zero, configure the wrappers so that all
115719: ** subsequent calls to localtime() and variants fail. If onoff is zero,
115720: ** undo this setting.
115721: */
115722: case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
115723: sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
115724: break;
115725: }
115726:
115727: #if defined(SQLITE_ENABLE_TREE_EXPLAIN)
115728: /* sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT,
115729: ** sqlite3_stmt*,const char**);
115730: **
115731: ** If compiled with SQLITE_ENABLE_TREE_EXPLAIN, each sqlite3_stmt holds
115732: ** a string that describes the optimized parse tree. This test-control
115733: ** returns a pointer to that string.
115734: */
115735: case SQLITE_TESTCTRL_EXPLAIN_STMT: {
115736: sqlite3_stmt *pStmt = va_arg(ap, sqlite3_stmt*);
115737: const char **pzRet = va_arg(ap, const char**);
115738: *pzRet = sqlite3VdbeExplanation((Vdbe*)pStmt);
115739: break;
115740: }
115741: #endif
115742:
115743: }
115744: va_end(ap);
115745: #endif /* SQLITE_OMIT_BUILTIN_TEST */
115746: return rc;
115747: }
115748:
115749: /*
115750: ** This is a utility routine, useful to VFS implementations, that checks
115751: ** to see if a database file was a URI that contained a specific query
115752: ** parameter, and if so obtains the value of the query parameter.
115753: **
115754: ** The zFilename argument is the filename pointer passed into the xOpen()
115755: ** method of a VFS implementation. The zParam argument is the name of the
115756: ** query parameter we seek. This routine returns the value of the zParam
115757: ** parameter if it exists. If the parameter does not exist, this routine
115758: ** returns a NULL pointer.
115759: */
115760: SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){
115761: if( zFilename==0 ) return 0;
115762: zFilename += sqlite3Strlen30(zFilename) + 1;
115763: while( zFilename[0] ){
115764: int x = strcmp(zFilename, zParam);
115765: zFilename += sqlite3Strlen30(zFilename) + 1;
115766: if( x==0 ) return zFilename;
115767: zFilename += sqlite3Strlen30(zFilename) + 1;
115768: }
115769: return 0;
115770: }
115771:
115772: /*
115773: ** Return a boolean value for a query parameter.
115774: */
115775: SQLITE_API int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){
115776: const char *z = sqlite3_uri_parameter(zFilename, zParam);
1.2.2.1 ! misho 115777: bDflt = bDflt!=0;
! 115778: return z ? sqlite3GetBoolean(z, bDflt) : bDflt;
1.2 misho 115779: }
115780:
115781: /*
115782: ** Return a 64-bit integer value for a query parameter.
115783: */
115784: SQLITE_API sqlite3_int64 sqlite3_uri_int64(
115785: const char *zFilename, /* Filename as passed to xOpen */
115786: const char *zParam, /* URI parameter sought */
115787: sqlite3_int64 bDflt /* return if parameter is missing */
115788: ){
115789: const char *z = sqlite3_uri_parameter(zFilename, zParam);
115790: sqlite3_int64 v;
115791: if( z && sqlite3Atoi64(z, &v, sqlite3Strlen30(z), SQLITE_UTF8)==SQLITE_OK ){
115792: bDflt = v;
115793: }
115794: return bDflt;
115795: }
115796:
115797: /*
1.2.2.1 ! misho 115798: ** Return the Btree pointer identified by zDbName. Return NULL if not found.
1.2 misho 115799: */
1.2.2.1 ! misho 115800: SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){
1.2 misho 115801: int i;
115802: for(i=0; i<db->nDb; i++){
1.2.2.1 ! misho 115803: if( db->aDb[i].pBt
! 115804: && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zName)==0)
! 115805: ){
! 115806: return db->aDb[i].pBt;
1.2 misho 115807: }
115808: }
115809: return 0;
115810: }
115811:
1.2.2.1 ! misho 115812: /*
! 115813: ** Return the filename of the database associated with a database
! 115814: ** connection.
! 115815: */
! 115816: SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){
! 115817: Btree *pBt = sqlite3DbNameToBtree(db, zDbName);
! 115818: return pBt ? sqlite3BtreeGetFilename(pBt) : 0;
! 115819: }
! 115820:
! 115821: /*
! 115822: ** Return 1 if database is read-only or 0 if read/write. Return -1 if
! 115823: ** no such database exists.
! 115824: */
! 115825: SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){
! 115826: Btree *pBt = sqlite3DbNameToBtree(db, zDbName);
! 115827: return pBt ? sqlite3PagerIsreadonly(sqlite3BtreePager(pBt)) : -1;
! 115828: }
! 115829:
1.2 misho 115830: /************** End of main.c ************************************************/
115831: /************** Begin file notify.c ******************************************/
115832: /*
115833: ** 2009 March 3
115834: **
115835: ** The author disclaims copyright to this source code. In place of
115836: ** a legal notice, here is a blessing:
115837: **
115838: ** May you do good and not evil.
115839: ** May you find forgiveness for yourself and forgive others.
115840: ** May you share freely, never taking more than you give.
115841: **
115842: *************************************************************************
115843: **
115844: ** This file contains the implementation of the sqlite3_unlock_notify()
115845: ** API method and its associated functionality.
115846: */
115847:
115848: /* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */
115849: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
115850:
115851: /*
115852: ** Public interfaces:
115853: **
115854: ** sqlite3ConnectionBlocked()
115855: ** sqlite3ConnectionUnlocked()
115856: ** sqlite3ConnectionClosed()
115857: ** sqlite3_unlock_notify()
115858: */
115859:
115860: #define assertMutexHeld() \
115861: assert( sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)) )
115862:
115863: /*
115864: ** Head of a linked list of all sqlite3 objects created by this process
115865: ** for which either sqlite3.pBlockingConnection or sqlite3.pUnlockConnection
115866: ** is not NULL. This variable may only accessed while the STATIC_MASTER
115867: ** mutex is held.
115868: */
115869: static sqlite3 *SQLITE_WSD sqlite3BlockedList = 0;
115870:
115871: #ifndef NDEBUG
115872: /*
115873: ** This function is a complex assert() that verifies the following
115874: ** properties of the blocked connections list:
115875: **
115876: ** 1) Each entry in the list has a non-NULL value for either
115877: ** pUnlockConnection or pBlockingConnection, or both.
115878: **
115879: ** 2) All entries in the list that share a common value for
115880: ** xUnlockNotify are grouped together.
115881: **
115882: ** 3) If the argument db is not NULL, then none of the entries in the
115883: ** blocked connections list have pUnlockConnection or pBlockingConnection
115884: ** set to db. This is used when closing connection db.
115885: */
115886: static void checkListProperties(sqlite3 *db){
115887: sqlite3 *p;
115888: for(p=sqlite3BlockedList; p; p=p->pNextBlocked){
115889: int seen = 0;
115890: sqlite3 *p2;
115891:
115892: /* Verify property (1) */
115893: assert( p->pUnlockConnection || p->pBlockingConnection );
115894:
115895: /* Verify property (2) */
115896: for(p2=sqlite3BlockedList; p2!=p; p2=p2->pNextBlocked){
115897: if( p2->xUnlockNotify==p->xUnlockNotify ) seen = 1;
115898: assert( p2->xUnlockNotify==p->xUnlockNotify || !seen );
115899: assert( db==0 || p->pUnlockConnection!=db );
115900: assert( db==0 || p->pBlockingConnection!=db );
115901: }
115902: }
115903: }
115904: #else
115905: # define checkListProperties(x)
115906: #endif
115907:
115908: /*
115909: ** Remove connection db from the blocked connections list. If connection
115910: ** db is not currently a part of the list, this function is a no-op.
115911: */
115912: static void removeFromBlockedList(sqlite3 *db){
115913: sqlite3 **pp;
115914: assertMutexHeld();
115915: for(pp=&sqlite3BlockedList; *pp; pp = &(*pp)->pNextBlocked){
115916: if( *pp==db ){
115917: *pp = (*pp)->pNextBlocked;
115918: break;
115919: }
115920: }
115921: }
115922:
115923: /*
115924: ** Add connection db to the blocked connections list. It is assumed
115925: ** that it is not already a part of the list.
115926: */
115927: static void addToBlockedList(sqlite3 *db){
115928: sqlite3 **pp;
115929: assertMutexHeld();
115930: for(
115931: pp=&sqlite3BlockedList;
115932: *pp && (*pp)->xUnlockNotify!=db->xUnlockNotify;
115933: pp=&(*pp)->pNextBlocked
115934: );
115935: db->pNextBlocked = *pp;
115936: *pp = db;
115937: }
115938:
115939: /*
115940: ** Obtain the STATIC_MASTER mutex.
115941: */
115942: static void enterMutex(void){
115943: sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
115944: checkListProperties(0);
115945: }
115946:
115947: /*
115948: ** Release the STATIC_MASTER mutex.
115949: */
115950: static void leaveMutex(void){
115951: assertMutexHeld();
115952: checkListProperties(0);
115953: sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
115954: }
115955:
115956: /*
115957: ** Register an unlock-notify callback.
115958: **
115959: ** This is called after connection "db" has attempted some operation
115960: ** but has received an SQLITE_LOCKED error because another connection
115961: ** (call it pOther) in the same process was busy using the same shared
115962: ** cache. pOther is found by looking at db->pBlockingConnection.
115963: **
115964: ** If there is no blocking connection, the callback is invoked immediately,
115965: ** before this routine returns.
115966: **
115967: ** If pOther is already blocked on db, then report SQLITE_LOCKED, to indicate
115968: ** a deadlock.
115969: **
115970: ** Otherwise, make arrangements to invoke xNotify when pOther drops
115971: ** its locks.
115972: **
115973: ** Each call to this routine overrides any prior callbacks registered
115974: ** on the same "db". If xNotify==0 then any prior callbacks are immediately
115975: ** cancelled.
115976: */
115977: SQLITE_API int sqlite3_unlock_notify(
115978: sqlite3 *db,
115979: void (*xNotify)(void **, int),
115980: void *pArg
115981: ){
115982: int rc = SQLITE_OK;
115983:
115984: sqlite3_mutex_enter(db->mutex);
115985: enterMutex();
115986:
115987: if( xNotify==0 ){
115988: removeFromBlockedList(db);
115989: db->pBlockingConnection = 0;
115990: db->pUnlockConnection = 0;
115991: db->xUnlockNotify = 0;
115992: db->pUnlockArg = 0;
115993: }else if( 0==db->pBlockingConnection ){
115994: /* The blocking transaction has been concluded. Or there never was a
115995: ** blocking transaction. In either case, invoke the notify callback
115996: ** immediately.
115997: */
115998: xNotify(&pArg, 1);
115999: }else{
116000: sqlite3 *p;
116001:
116002: for(p=db->pBlockingConnection; p && p!=db; p=p->pUnlockConnection){}
116003: if( p ){
116004: rc = SQLITE_LOCKED; /* Deadlock detected. */
116005: }else{
116006: db->pUnlockConnection = db->pBlockingConnection;
116007: db->xUnlockNotify = xNotify;
116008: db->pUnlockArg = pArg;
116009: removeFromBlockedList(db);
116010: addToBlockedList(db);
116011: }
116012: }
116013:
116014: leaveMutex();
116015: assert( !db->mallocFailed );
116016: sqlite3Error(db, rc, (rc?"database is deadlocked":0));
116017: sqlite3_mutex_leave(db->mutex);
116018: return rc;
116019: }
116020:
116021: /*
116022: ** This function is called while stepping or preparing a statement
116023: ** associated with connection db. The operation will return SQLITE_LOCKED
116024: ** to the user because it requires a lock that will not be available
116025: ** until connection pBlocker concludes its current transaction.
116026: */
116027: SQLITE_PRIVATE void sqlite3ConnectionBlocked(sqlite3 *db, sqlite3 *pBlocker){
116028: enterMutex();
116029: if( db->pBlockingConnection==0 && db->pUnlockConnection==0 ){
116030: addToBlockedList(db);
116031: }
116032: db->pBlockingConnection = pBlocker;
116033: leaveMutex();
116034: }
116035:
116036: /*
116037: ** This function is called when
116038: ** the transaction opened by database db has just finished. Locks held
116039: ** by database connection db have been released.
116040: **
116041: ** This function loops through each entry in the blocked connections
116042: ** list and does the following:
116043: **
116044: ** 1) If the sqlite3.pBlockingConnection member of a list entry is
116045: ** set to db, then set pBlockingConnection=0.
116046: **
116047: ** 2) If the sqlite3.pUnlockConnection member of a list entry is
116048: ** set to db, then invoke the configured unlock-notify callback and
116049: ** set pUnlockConnection=0.
116050: **
116051: ** 3) If the two steps above mean that pBlockingConnection==0 and
116052: ** pUnlockConnection==0, remove the entry from the blocked connections
116053: ** list.
116054: */
116055: SQLITE_PRIVATE void sqlite3ConnectionUnlocked(sqlite3 *db){
116056: void (*xUnlockNotify)(void **, int) = 0; /* Unlock-notify cb to invoke */
116057: int nArg = 0; /* Number of entries in aArg[] */
116058: sqlite3 **pp; /* Iterator variable */
116059: void **aArg; /* Arguments to the unlock callback */
116060: void **aDyn = 0; /* Dynamically allocated space for aArg[] */
116061: void *aStatic[16]; /* Starter space for aArg[]. No malloc required */
116062:
116063: aArg = aStatic;
116064: enterMutex(); /* Enter STATIC_MASTER mutex */
116065:
116066: /* This loop runs once for each entry in the blocked-connections list. */
116067: for(pp=&sqlite3BlockedList; *pp; /* no-op */ ){
116068: sqlite3 *p = *pp;
116069:
116070: /* Step 1. */
116071: if( p->pBlockingConnection==db ){
116072: p->pBlockingConnection = 0;
116073: }
116074:
116075: /* Step 2. */
116076: if( p->pUnlockConnection==db ){
116077: assert( p->xUnlockNotify );
116078: if( p->xUnlockNotify!=xUnlockNotify && nArg!=0 ){
116079: xUnlockNotify(aArg, nArg);
116080: nArg = 0;
116081: }
116082:
116083: sqlite3BeginBenignMalloc();
116084: assert( aArg==aDyn || (aDyn==0 && aArg==aStatic) );
116085: assert( nArg<=(int)ArraySize(aStatic) || aArg==aDyn );
116086: if( (!aDyn && nArg==(int)ArraySize(aStatic))
116087: || (aDyn && nArg==(int)(sqlite3MallocSize(aDyn)/sizeof(void*)))
116088: ){
116089: /* The aArg[] array needs to grow. */
116090: void **pNew = (void **)sqlite3Malloc(nArg*sizeof(void *)*2);
116091: if( pNew ){
116092: memcpy(pNew, aArg, nArg*sizeof(void *));
116093: sqlite3_free(aDyn);
116094: aDyn = aArg = pNew;
116095: }else{
116096: /* This occurs when the array of context pointers that need to
116097: ** be passed to the unlock-notify callback is larger than the
116098: ** aStatic[] array allocated on the stack and the attempt to
116099: ** allocate a larger array from the heap has failed.
116100: **
116101: ** This is a difficult situation to handle. Returning an error
116102: ** code to the caller is insufficient, as even if an error code
116103: ** is returned the transaction on connection db will still be
116104: ** closed and the unlock-notify callbacks on blocked connections
116105: ** will go unissued. This might cause the application to wait
116106: ** indefinitely for an unlock-notify callback that will never
116107: ** arrive.
116108: **
116109: ** Instead, invoke the unlock-notify callback with the context
116110: ** array already accumulated. We can then clear the array and
116111: ** begin accumulating any further context pointers without
116112: ** requiring any dynamic allocation. This is sub-optimal because
116113: ** it means that instead of one callback with a large array of
116114: ** context pointers the application will receive two or more
116115: ** callbacks with smaller arrays of context pointers, which will
116116: ** reduce the applications ability to prioritize multiple
116117: ** connections. But it is the best that can be done under the
116118: ** circumstances.
116119: */
116120: xUnlockNotify(aArg, nArg);
116121: nArg = 0;
116122: }
116123: }
116124: sqlite3EndBenignMalloc();
116125:
116126: aArg[nArg++] = p->pUnlockArg;
116127: xUnlockNotify = p->xUnlockNotify;
116128: p->pUnlockConnection = 0;
116129: p->xUnlockNotify = 0;
116130: p->pUnlockArg = 0;
116131: }
116132:
116133: /* Step 3. */
116134: if( p->pBlockingConnection==0 && p->pUnlockConnection==0 ){
116135: /* Remove connection p from the blocked connections list. */
116136: *pp = p->pNextBlocked;
116137: p->pNextBlocked = 0;
116138: }else{
116139: pp = &p->pNextBlocked;
116140: }
116141: }
116142:
116143: if( nArg!=0 ){
116144: xUnlockNotify(aArg, nArg);
116145: }
116146: sqlite3_free(aDyn);
116147: leaveMutex(); /* Leave STATIC_MASTER mutex */
116148: }
116149:
116150: /*
116151: ** This is called when the database connection passed as an argument is
116152: ** being closed. The connection is removed from the blocked list.
116153: */
116154: SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){
116155: sqlite3ConnectionUnlocked(db);
116156: enterMutex();
116157: removeFromBlockedList(db);
116158: checkListProperties(db);
116159: leaveMutex();
116160: }
116161: #endif
116162:
116163: /************** End of notify.c **********************************************/
116164: /************** Begin file fts3.c ********************************************/
116165: /*
116166: ** 2006 Oct 10
116167: **
116168: ** The author disclaims copyright to this source code. In place of
116169: ** a legal notice, here is a blessing:
116170: **
116171: ** May you do good and not evil.
116172: ** May you find forgiveness for yourself and forgive others.
116173: ** May you share freely, never taking more than you give.
116174: **
116175: ******************************************************************************
116176: **
116177: ** This is an SQLite module implementing full-text search.
116178: */
116179:
116180: /*
116181: ** The code in this file is only compiled if:
116182: **
116183: ** * The FTS3 module is being built as an extension
116184: ** (in which case SQLITE_CORE is not defined), or
116185: **
116186: ** * The FTS3 module is being built into the core of
116187: ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
116188: */
116189:
116190: /* The full-text index is stored in a series of b+tree (-like)
116191: ** structures called segments which map terms to doclists. The
116192: ** structures are like b+trees in layout, but are constructed from the
116193: ** bottom up in optimal fashion and are not updatable. Since trees
116194: ** are built from the bottom up, things will be described from the
116195: ** bottom up.
116196: **
116197: **
116198: **** Varints ****
116199: ** The basic unit of encoding is a variable-length integer called a
116200: ** varint. We encode variable-length integers in little-endian order
116201: ** using seven bits * per byte as follows:
116202: **
116203: ** KEY:
116204: ** A = 0xxxxxxx 7 bits of data and one flag bit
116205: ** B = 1xxxxxxx 7 bits of data and one flag bit
116206: **
116207: ** 7 bits - A
116208: ** 14 bits - BA
116209: ** 21 bits - BBA
116210: ** and so on.
116211: **
116212: ** This is similar in concept to how sqlite encodes "varints" but
116213: ** the encoding is not the same. SQLite varints are big-endian
116214: ** are are limited to 9 bytes in length whereas FTS3 varints are
116215: ** little-endian and can be up to 10 bytes in length (in theory).
116216: **
116217: ** Example encodings:
116218: **
116219: ** 1: 0x01
116220: ** 127: 0x7f
116221: ** 128: 0x81 0x00
116222: **
116223: **
116224: **** Document lists ****
116225: ** A doclist (document list) holds a docid-sorted list of hits for a
116226: ** given term. Doclists hold docids and associated token positions.
116227: ** A docid is the unique integer identifier for a single document.
116228: ** A position is the index of a word within the document. The first
116229: ** word of the document has a position of 0.
116230: **
116231: ** FTS3 used to optionally store character offsets using a compile-time
116232: ** option. But that functionality is no longer supported.
116233: **
116234: ** A doclist is stored like this:
116235: **
116236: ** array {
1.2.2.1 ! misho 116237: ** varint docid; (delta from previous doclist)
1.2 misho 116238: ** array { (position list for column 0)
116239: ** varint position; (2 more than the delta from previous position)
116240: ** }
116241: ** array {
116242: ** varint POS_COLUMN; (marks start of position list for new column)
116243: ** varint column; (index of new column)
116244: ** array {
116245: ** varint position; (2 more than the delta from previous position)
116246: ** }
116247: ** }
116248: ** varint POS_END; (marks end of positions for this document.
116249: ** }
116250: **
116251: ** Here, array { X } means zero or more occurrences of X, adjacent in
116252: ** memory. A "position" is an index of a token in the token stream
116253: ** generated by the tokenizer. Note that POS_END and POS_COLUMN occur
116254: ** in the same logical place as the position element, and act as sentinals
116255: ** ending a position list array. POS_END is 0. POS_COLUMN is 1.
116256: ** The positions numbers are not stored literally but rather as two more
116257: ** than the difference from the prior position, or the just the position plus
116258: ** 2 for the first position. Example:
116259: **
116260: ** label: A B C D E F G H I J K
116261: ** value: 123 5 9 1 1 14 35 0 234 72 0
116262: **
116263: ** The 123 value is the first docid. For column zero in this document
116264: ** there are two matches at positions 3 and 10 (5-2 and 9-2+3). The 1
116265: ** at D signals the start of a new column; the 1 at E indicates that the
116266: ** new column is column number 1. There are two positions at 12 and 45
116267: ** (14-2 and 35-2+12). The 0 at H indicate the end-of-document. The
1.2.2.1 ! misho 116268: ** 234 at I is the delta to next docid (357). It has one position 70
! 116269: ** (72-2) and then terminates with the 0 at K.
1.2 misho 116270: **
116271: ** A "position-list" is the list of positions for multiple columns for
116272: ** a single docid. A "column-list" is the set of positions for a single
116273: ** column. Hence, a position-list consists of one or more column-lists,
116274: ** a document record consists of a docid followed by a position-list and
116275: ** a doclist consists of one or more document records.
116276: **
116277: ** A bare doclist omits the position information, becoming an
116278: ** array of varint-encoded docids.
116279: **
116280: **** Segment leaf nodes ****
116281: ** Segment leaf nodes store terms and doclists, ordered by term. Leaf
116282: ** nodes are written using LeafWriter, and read using LeafReader (to
116283: ** iterate through a single leaf node's data) and LeavesReader (to
116284: ** iterate through a segment's entire leaf layer). Leaf nodes have
116285: ** the format:
116286: **
116287: ** varint iHeight; (height from leaf level, always 0)
116288: ** varint nTerm; (length of first term)
116289: ** char pTerm[nTerm]; (content of first term)
116290: ** varint nDoclist; (length of term's associated doclist)
116291: ** char pDoclist[nDoclist]; (content of doclist)
116292: ** array {
116293: ** (further terms are delta-encoded)
116294: ** varint nPrefix; (length of prefix shared with previous term)
116295: ** varint nSuffix; (length of unshared suffix)
116296: ** char pTermSuffix[nSuffix];(unshared suffix of next term)
116297: ** varint nDoclist; (length of term's associated doclist)
116298: ** char pDoclist[nDoclist]; (content of doclist)
116299: ** }
116300: **
116301: ** Here, array { X } means zero or more occurrences of X, adjacent in
116302: ** memory.
116303: **
116304: ** Leaf nodes are broken into blocks which are stored contiguously in
116305: ** the %_segments table in sorted order. This means that when the end
116306: ** of a node is reached, the next term is in the node with the next
116307: ** greater node id.
116308: **
116309: ** New data is spilled to a new leaf node when the current node
116310: ** exceeds LEAF_MAX bytes (default 2048). New data which itself is
116311: ** larger than STANDALONE_MIN (default 1024) is placed in a standalone
116312: ** node (a leaf node with a single term and doclist). The goal of
116313: ** these settings is to pack together groups of small doclists while
116314: ** making it efficient to directly access large doclists. The
116315: ** assumption is that large doclists represent terms which are more
116316: ** likely to be query targets.
116317: **
116318: ** TODO(shess) It may be useful for blocking decisions to be more
116319: ** dynamic. For instance, it may make more sense to have a 2.5k leaf
116320: ** node rather than splitting into 2k and .5k nodes. My intuition is
116321: ** that this might extend through 2x or 4x the pagesize.
116322: **
116323: **
116324: **** Segment interior nodes ****
116325: ** Segment interior nodes store blockids for subtree nodes and terms
116326: ** to describe what data is stored by the each subtree. Interior
116327: ** nodes are written using InteriorWriter, and read using
116328: ** InteriorReader. InteriorWriters are created as needed when
116329: ** SegmentWriter creates new leaf nodes, or when an interior node
116330: ** itself grows too big and must be split. The format of interior
116331: ** nodes:
116332: **
116333: ** varint iHeight; (height from leaf level, always >0)
116334: ** varint iBlockid; (block id of node's leftmost subtree)
116335: ** optional {
116336: ** varint nTerm; (length of first term)
116337: ** char pTerm[nTerm]; (content of first term)
116338: ** array {
116339: ** (further terms are delta-encoded)
116340: ** varint nPrefix; (length of shared prefix with previous term)
116341: ** varint nSuffix; (length of unshared suffix)
116342: ** char pTermSuffix[nSuffix]; (unshared suffix of next term)
116343: ** }
116344: ** }
116345: **
116346: ** Here, optional { X } means an optional element, while array { X }
116347: ** means zero or more occurrences of X, adjacent in memory.
116348: **
116349: ** An interior node encodes n terms separating n+1 subtrees. The
116350: ** subtree blocks are contiguous, so only the first subtree's blockid
116351: ** is encoded. The subtree at iBlockid will contain all terms less
116352: ** than the first term encoded (or all terms if no term is encoded).
116353: ** Otherwise, for terms greater than or equal to pTerm[i] but less
116354: ** than pTerm[i+1], the subtree for that term will be rooted at
116355: ** iBlockid+i. Interior nodes only store enough term data to
116356: ** distinguish adjacent children (if the rightmost term of the left
116357: ** child is "something", and the leftmost term of the right child is
116358: ** "wicked", only "w" is stored).
116359: **
116360: ** New data is spilled to a new interior node at the same height when
116361: ** the current node exceeds INTERIOR_MAX bytes (default 2048).
116362: ** INTERIOR_MIN_TERMS (default 7) keeps large terms from monopolizing
116363: ** interior nodes and making the tree too skinny. The interior nodes
116364: ** at a given height are naturally tracked by interior nodes at
116365: ** height+1, and so on.
116366: **
116367: **
116368: **** Segment directory ****
116369: ** The segment directory in table %_segdir stores meta-information for
116370: ** merging and deleting segments, and also the root node of the
116371: ** segment's tree.
116372: **
116373: ** The root node is the top node of the segment's tree after encoding
116374: ** the entire segment, restricted to ROOT_MAX bytes (default 1024).
116375: ** This could be either a leaf node or an interior node. If the top
116376: ** node requires more than ROOT_MAX bytes, it is flushed to %_segments
116377: ** and a new root interior node is generated (which should always fit
116378: ** within ROOT_MAX because it only needs space for 2 varints, the
116379: ** height and the blockid of the previous root).
116380: **
116381: ** The meta-information in the segment directory is:
116382: ** level - segment level (see below)
116383: ** idx - index within level
116384: ** - (level,idx uniquely identify a segment)
116385: ** start_block - first leaf node
116386: ** leaves_end_block - last leaf node
116387: ** end_block - last block (including interior nodes)
116388: ** root - contents of root node
116389: **
116390: ** If the root node is a leaf node, then start_block,
116391: ** leaves_end_block, and end_block are all 0.
116392: **
116393: **
116394: **** Segment merging ****
116395: ** To amortize update costs, segments are grouped into levels and
116396: ** merged in batches. Each increase in level represents exponentially
116397: ** more documents.
116398: **
116399: ** New documents (actually, document updates) are tokenized and
116400: ** written individually (using LeafWriter) to a level 0 segment, with
116401: ** incrementing idx. When idx reaches MERGE_COUNT (default 16), all
116402: ** level 0 segments are merged into a single level 1 segment. Level 1
116403: ** is populated like level 0, and eventually MERGE_COUNT level 1
116404: ** segments are merged to a single level 2 segment (representing
116405: ** MERGE_COUNT^2 updates), and so on.
116406: **
116407: ** A segment merge traverses all segments at a given level in
116408: ** parallel, performing a straightforward sorted merge. Since segment
116409: ** leaf nodes are written in to the %_segments table in order, this
116410: ** merge traverses the underlying sqlite disk structures efficiently.
116411: ** After the merge, all segment blocks from the merged level are
116412: ** deleted.
116413: **
116414: ** MERGE_COUNT controls how often we merge segments. 16 seems to be
116415: ** somewhat of a sweet spot for insertion performance. 32 and 64 show
116416: ** very similar performance numbers to 16 on insertion, though they're
116417: ** a tiny bit slower (perhaps due to more overhead in merge-time
116418: ** sorting). 8 is about 20% slower than 16, 4 about 50% slower than
116419: ** 16, 2 about 66% slower than 16.
116420: **
116421: ** At query time, high MERGE_COUNT increases the number of segments
116422: ** which need to be scanned and merged. For instance, with 100k docs
116423: ** inserted:
116424: **
116425: ** MERGE_COUNT segments
116426: ** 16 25
116427: ** 8 12
116428: ** 4 10
116429: ** 2 6
116430: **
116431: ** This appears to have only a moderate impact on queries for very
116432: ** frequent terms (which are somewhat dominated by segment merge
116433: ** costs), and infrequent and non-existent terms still seem to be fast
116434: ** even with many segments.
116435: **
116436: ** TODO(shess) That said, it would be nice to have a better query-side
116437: ** argument for MERGE_COUNT of 16. Also, it is possible/likely that
116438: ** optimizations to things like doclist merging will swing the sweet
116439: ** spot around.
116440: **
116441: **
116442: **
116443: **** Handling of deletions and updates ****
116444: ** Since we're using a segmented structure, with no docid-oriented
116445: ** index into the term index, we clearly cannot simply update the term
116446: ** index when a document is deleted or updated. For deletions, we
116447: ** write an empty doclist (varint(docid) varint(POS_END)), for updates
116448: ** we simply write the new doclist. Segment merges overwrite older
116449: ** data for a particular docid with newer data, so deletes or updates
116450: ** will eventually overtake the earlier data and knock it out. The
116451: ** query logic likewise merges doclists so that newer data knocks out
116452: ** older data.
116453: */
116454:
116455: /************** Include fts3Int.h in the middle of fts3.c ********************/
116456: /************** Begin file fts3Int.h *****************************************/
116457: /*
116458: ** 2009 Nov 12
116459: **
116460: ** The author disclaims copyright to this source code. In place of
116461: ** a legal notice, here is a blessing:
116462: **
116463: ** May you do good and not evil.
116464: ** May you find forgiveness for yourself and forgive others.
116465: ** May you share freely, never taking more than you give.
116466: **
116467: ******************************************************************************
116468: **
116469: */
116470: #ifndef _FTSINT_H
116471: #define _FTSINT_H
116472:
116473: #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
116474: # define NDEBUG 1
116475: #endif
116476:
116477: /*
116478: ** FTS4 is really an extension for FTS3. It is enabled using the
116479: ** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all
116480: ** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3.
116481: */
116482: #if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3)
116483: # define SQLITE_ENABLE_FTS3
116484: #endif
116485:
116486: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
116487:
116488: /* If not building as part of the core, include sqlite3ext.h. */
116489: #ifndef SQLITE_CORE
116490: SQLITE_API extern const sqlite3_api_routines *sqlite3_api;
116491: #endif
116492:
116493: /************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/
116494: /************** Begin file fts3_tokenizer.h **********************************/
116495: /*
116496: ** 2006 July 10
116497: **
116498: ** The author disclaims copyright to this source code.
116499: **
116500: *************************************************************************
116501: ** Defines the interface to tokenizers used by fulltext-search. There
116502: ** are three basic components:
116503: **
116504: ** sqlite3_tokenizer_module is a singleton defining the tokenizer
116505: ** interface functions. This is essentially the class structure for
116506: ** tokenizers.
116507: **
116508: ** sqlite3_tokenizer is used to define a particular tokenizer, perhaps
116509: ** including customization information defined at creation time.
116510: **
116511: ** sqlite3_tokenizer_cursor is generated by a tokenizer to generate
116512: ** tokens from a particular input.
116513: */
116514: #ifndef _FTS3_TOKENIZER_H_
116515: #define _FTS3_TOKENIZER_H_
116516:
116517: /* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time.
116518: ** If tokenizers are to be allowed to call sqlite3_*() functions, then
116519: ** we will need a way to register the API consistently.
116520: */
116521:
116522: /*
116523: ** Structures used by the tokenizer interface. When a new tokenizer
116524: ** implementation is registered, the caller provides a pointer to
116525: ** an sqlite3_tokenizer_module containing pointers to the callback
116526: ** functions that make up an implementation.
116527: **
116528: ** When an fts3 table is created, it passes any arguments passed to
116529: ** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the
116530: ** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer
116531: ** implementation. The xCreate() function in turn returns an
116532: ** sqlite3_tokenizer structure representing the specific tokenizer to
116533: ** be used for the fts3 table (customized by the tokenizer clause arguments).
116534: **
116535: ** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen()
116536: ** method is called. It returns an sqlite3_tokenizer_cursor object
116537: ** that may be used to tokenize a specific input buffer based on
116538: ** the tokenization rules supplied by a specific sqlite3_tokenizer
116539: ** object.
116540: */
116541: typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module;
116542: typedef struct sqlite3_tokenizer sqlite3_tokenizer;
116543: typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor;
116544:
116545: struct sqlite3_tokenizer_module {
116546:
116547: /*
1.2.2.1 ! misho 116548: ** Structure version. Should always be set to 0 or 1.
1.2 misho 116549: */
116550: int iVersion;
116551:
116552: /*
116553: ** Create a new tokenizer. The values in the argv[] array are the
116554: ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL
116555: ** TABLE statement that created the fts3 table. For example, if
116556: ** the following SQL is executed:
116557: **
116558: ** CREATE .. USING fts3( ... , tokenizer <tokenizer-name> arg1 arg2)
116559: **
116560: ** then argc is set to 2, and the argv[] array contains pointers
116561: ** to the strings "arg1" and "arg2".
116562: **
116563: ** This method should return either SQLITE_OK (0), or an SQLite error
116564: ** code. If SQLITE_OK is returned, then *ppTokenizer should be set
116565: ** to point at the newly created tokenizer structure. The generic
116566: ** sqlite3_tokenizer.pModule variable should not be initialised by
116567: ** this callback. The caller will do so.
116568: */
116569: int (*xCreate)(
116570: int argc, /* Size of argv array */
116571: const char *const*argv, /* Tokenizer argument strings */
116572: sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */
116573: );
116574:
116575: /*
116576: ** Destroy an existing tokenizer. The fts3 module calls this method
116577: ** exactly once for each successful call to xCreate().
116578: */
116579: int (*xDestroy)(sqlite3_tokenizer *pTokenizer);
116580:
116581: /*
116582: ** Create a tokenizer cursor to tokenize an input buffer. The caller
116583: ** is responsible for ensuring that the input buffer remains valid
116584: ** until the cursor is closed (using the xClose() method).
116585: */
116586: int (*xOpen)(
116587: sqlite3_tokenizer *pTokenizer, /* Tokenizer object */
116588: const char *pInput, int nBytes, /* Input buffer */
116589: sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */
116590: );
116591:
116592: /*
116593: ** Destroy an existing tokenizer cursor. The fts3 module calls this
116594: ** method exactly once for each successful call to xOpen().
116595: */
116596: int (*xClose)(sqlite3_tokenizer_cursor *pCursor);
116597:
116598: /*
116599: ** Retrieve the next token from the tokenizer cursor pCursor. This
116600: ** method should either return SQLITE_OK and set the values of the
116601: ** "OUT" variables identified below, or SQLITE_DONE to indicate that
116602: ** the end of the buffer has been reached, or an SQLite error code.
116603: **
116604: ** *ppToken should be set to point at a buffer containing the
116605: ** normalized version of the token (i.e. after any case-folding and/or
116606: ** stemming has been performed). *pnBytes should be set to the length
116607: ** of this buffer in bytes. The input text that generated the token is
116608: ** identified by the byte offsets returned in *piStartOffset and
116609: ** *piEndOffset. *piStartOffset should be set to the index of the first
116610: ** byte of the token in the input buffer. *piEndOffset should be set
116611: ** to the index of the first byte just past the end of the token in
116612: ** the input buffer.
116613: **
116614: ** The buffer *ppToken is set to point at is managed by the tokenizer
116615: ** implementation. It is only required to be valid until the next call
116616: ** to xNext() or xClose().
116617: */
116618: /* TODO(shess) current implementation requires pInput to be
116619: ** nul-terminated. This should either be fixed, or pInput/nBytes
116620: ** should be converted to zInput.
116621: */
116622: int (*xNext)(
116623: sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */
116624: const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */
116625: int *piStartOffset, /* OUT: Byte offset of token in input buffer */
116626: int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */
116627: int *piPosition /* OUT: Number of tokens returned before this one */
116628: );
1.2.2.1 ! misho 116629:
! 116630: /***********************************************************************
! 116631: ** Methods below this point are only available if iVersion>=1.
! 116632: */
! 116633:
! 116634: /*
! 116635: ** Configure the language id of a tokenizer cursor.
! 116636: */
! 116637: int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid);
1.2 misho 116638: };
116639:
116640: struct sqlite3_tokenizer {
116641: const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */
116642: /* Tokenizer implementations will typically add additional fields */
116643: };
116644:
116645: struct sqlite3_tokenizer_cursor {
116646: sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */
116647: /* Tokenizer implementations will typically add additional fields */
116648: };
116649:
116650: int fts3_global_term_cnt(int iTerm, int iCol);
116651: int fts3_term_cnt(int iTerm, int iCol);
116652:
116653:
116654: #endif /* _FTS3_TOKENIZER_H_ */
116655:
116656: /************** End of fts3_tokenizer.h **************************************/
116657: /************** Continuing where we left off in fts3Int.h ********************/
116658: /************** Include fts3_hash.h in the middle of fts3Int.h ***************/
116659: /************** Begin file fts3_hash.h ***************************************/
116660: /*
116661: ** 2001 September 22
116662: **
116663: ** The author disclaims copyright to this source code. In place of
116664: ** a legal notice, here is a blessing:
116665: **
116666: ** May you do good and not evil.
116667: ** May you find forgiveness for yourself and forgive others.
116668: ** May you share freely, never taking more than you give.
116669: **
116670: *************************************************************************
116671: ** This is the header file for the generic hash-table implemenation
116672: ** used in SQLite. We've modified it slightly to serve as a standalone
116673: ** hash table implementation for the full-text indexing module.
116674: **
116675: */
116676: #ifndef _FTS3_HASH_H_
116677: #define _FTS3_HASH_H_
116678:
116679: /* Forward declarations of structures. */
116680: typedef struct Fts3Hash Fts3Hash;
116681: typedef struct Fts3HashElem Fts3HashElem;
116682:
116683: /* A complete hash table is an instance of the following structure.
116684: ** The internals of this structure are intended to be opaque -- client
116685: ** code should not attempt to access or modify the fields of this structure
116686: ** directly. Change this structure only by using the routines below.
116687: ** However, many of the "procedures" and "functions" for modifying and
116688: ** accessing this structure are really macros, so we can't really make
116689: ** this structure opaque.
116690: */
116691: struct Fts3Hash {
116692: char keyClass; /* HASH_INT, _POINTER, _STRING, _BINARY */
116693: char copyKey; /* True if copy of key made on insert */
116694: int count; /* Number of entries in this table */
116695: Fts3HashElem *first; /* The first element of the array */
116696: int htsize; /* Number of buckets in the hash table */
116697: struct _fts3ht { /* the hash table */
116698: int count; /* Number of entries with this hash */
116699: Fts3HashElem *chain; /* Pointer to first entry with this hash */
116700: } *ht;
116701: };
116702:
116703: /* Each element in the hash table is an instance of the following
116704: ** structure. All elements are stored on a single doubly-linked list.
116705: **
116706: ** Again, this structure is intended to be opaque, but it can't really
116707: ** be opaque because it is used by macros.
116708: */
116709: struct Fts3HashElem {
116710: Fts3HashElem *next, *prev; /* Next and previous elements in the table */
116711: void *data; /* Data associated with this element */
116712: void *pKey; int nKey; /* Key associated with this element */
116713: };
116714:
116715: /*
116716: ** There are 2 different modes of operation for a hash table:
116717: **
116718: ** FTS3_HASH_STRING pKey points to a string that is nKey bytes long
116719: ** (including the null-terminator, if any). Case
116720: ** is respected in comparisons.
116721: **
116722: ** FTS3_HASH_BINARY pKey points to binary data nKey bytes long.
116723: ** memcmp() is used to compare keys.
116724: **
116725: ** A copy of the key is made if the copyKey parameter to fts3HashInit is 1.
116726: */
116727: #define FTS3_HASH_STRING 1
116728: #define FTS3_HASH_BINARY 2
116729:
116730: /*
116731: ** Access routines. To delete, insert a NULL pointer.
116732: */
116733: SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey);
116734: SQLITE_PRIVATE void *sqlite3Fts3HashInsert(Fts3Hash*, const void *pKey, int nKey, void *pData);
116735: SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash*, const void *pKey, int nKey);
116736: SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash*);
116737: SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const void *, int);
116738:
116739: /*
116740: ** Shorthand for the functions above
116741: */
116742: #define fts3HashInit sqlite3Fts3HashInit
116743: #define fts3HashInsert sqlite3Fts3HashInsert
116744: #define fts3HashFind sqlite3Fts3HashFind
116745: #define fts3HashClear sqlite3Fts3HashClear
116746: #define fts3HashFindElem sqlite3Fts3HashFindElem
116747:
116748: /*
116749: ** Macros for looping over all elements of a hash table. The idiom is
116750: ** like this:
116751: **
116752: ** Fts3Hash h;
116753: ** Fts3HashElem *p;
116754: ** ...
116755: ** for(p=fts3HashFirst(&h); p; p=fts3HashNext(p)){
116756: ** SomeStructure *pData = fts3HashData(p);
116757: ** // do something with pData
116758: ** }
116759: */
116760: #define fts3HashFirst(H) ((H)->first)
116761: #define fts3HashNext(E) ((E)->next)
116762: #define fts3HashData(E) ((E)->data)
116763: #define fts3HashKey(E) ((E)->pKey)
116764: #define fts3HashKeysize(E) ((E)->nKey)
116765:
116766: /*
116767: ** Number of entries in a hash table
116768: */
116769: #define fts3HashCount(H) ((H)->count)
116770:
116771: #endif /* _FTS3_HASH_H_ */
116772:
116773: /************** End of fts3_hash.h *******************************************/
116774: /************** Continuing where we left off in fts3Int.h ********************/
116775:
116776: /*
116777: ** This constant controls how often segments are merged. Once there are
116778: ** FTS3_MERGE_COUNT segments of level N, they are merged into a single
116779: ** segment of level N+1.
116780: */
116781: #define FTS3_MERGE_COUNT 16
116782:
116783: /*
116784: ** This is the maximum amount of data (in bytes) to store in the
116785: ** Fts3Table.pendingTerms hash table. Normally, the hash table is
116786: ** populated as documents are inserted/updated/deleted in a transaction
116787: ** and used to create a new segment when the transaction is committed.
116788: ** However if this limit is reached midway through a transaction, a new
116789: ** segment is created and the hash table cleared immediately.
116790: */
116791: #define FTS3_MAX_PENDING_DATA (1*1024*1024)
116792:
116793: /*
116794: ** Macro to return the number of elements in an array. SQLite has a
116795: ** similar macro called ArraySize(). Use a different name to avoid
116796: ** a collision when building an amalgamation with built-in FTS3.
116797: */
116798: #define SizeofArray(X) ((int)(sizeof(X)/sizeof(X[0])))
116799:
116800:
116801: #ifndef MIN
116802: # define MIN(x,y) ((x)<(y)?(x):(y))
116803: #endif
1.2.2.1 ! misho 116804: #ifndef MAX
! 116805: # define MAX(x,y) ((x)>(y)?(x):(y))
! 116806: #endif
1.2 misho 116807:
116808: /*
116809: ** Maximum length of a varint encoded integer. The varint format is different
116810: ** from that used by SQLite, so the maximum length is 10, not 9.
116811: */
116812: #define FTS3_VARINT_MAX 10
116813:
116814: /*
116815: ** FTS4 virtual tables may maintain multiple indexes - one index of all terms
116816: ** in the document set and zero or more prefix indexes. All indexes are stored
116817: ** as one or more b+-trees in the %_segments and %_segdir tables.
116818: **
116819: ** It is possible to determine which index a b+-tree belongs to based on the
116820: ** value stored in the "%_segdir.level" column. Given this value L, the index
116821: ** that the b+-tree belongs to is (L<<10). In other words, all b+-trees with
116822: ** level values between 0 and 1023 (inclusive) belong to index 0, all levels
116823: ** between 1024 and 2047 to index 1, and so on.
116824: **
116825: ** It is considered impossible for an index to use more than 1024 levels. In
116826: ** theory though this may happen, but only after at least
116827: ** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables.
116828: */
116829: #define FTS3_SEGDIR_MAXLEVEL 1024
116830: #define FTS3_SEGDIR_MAXLEVEL_STR "1024"
116831:
116832: /*
116833: ** The testcase() macro is only used by the amalgamation. If undefined,
116834: ** make it a no-op.
116835: */
116836: #ifndef testcase
116837: # define testcase(X)
116838: #endif
116839:
116840: /*
116841: ** Terminator values for position-lists and column-lists.
116842: */
116843: #define POS_COLUMN (1) /* Column-list terminator */
116844: #define POS_END (0) /* Position-list terminator */
116845:
116846: /*
116847: ** This section provides definitions to allow the
116848: ** FTS3 extension to be compiled outside of the
116849: ** amalgamation.
116850: */
116851: #ifndef SQLITE_AMALGAMATION
116852: /*
116853: ** Macros indicating that conditional expressions are always true or
116854: ** false.
116855: */
116856: #ifdef SQLITE_COVERAGE_TEST
116857: # define ALWAYS(x) (1)
116858: # define NEVER(X) (0)
116859: #else
116860: # define ALWAYS(x) (x)
1.2.2.1 ! misho 116861: # define NEVER(x) (x)
1.2 misho 116862: #endif
116863:
116864: /*
116865: ** Internal types used by SQLite.
116866: */
116867: typedef unsigned char u8; /* 1-byte (or larger) unsigned integer */
116868: typedef short int i16; /* 2-byte (or larger) signed integer */
116869: typedef unsigned int u32; /* 4-byte unsigned integer */
116870: typedef sqlite3_uint64 u64; /* 8-byte unsigned integer */
1.2.2.1 ! misho 116871: typedef sqlite3_int64 i64; /* 8-byte signed integer */
1.2 misho 116872:
116873: /*
116874: ** Macro used to suppress compiler warnings for unused parameters.
116875: */
116876: #define UNUSED_PARAMETER(x) (void)(x)
116877:
116878: /*
116879: ** Activate assert() only if SQLITE_TEST is enabled.
116880: */
116881: #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
116882: # define NDEBUG 1
116883: #endif
116884:
116885: /*
116886: ** The TESTONLY macro is used to enclose variable declarations or
116887: ** other bits of code that are needed to support the arguments
116888: ** within testcase() and assert() macros.
116889: */
116890: #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
116891: # define TESTONLY(X) X
116892: #else
116893: # define TESTONLY(X)
116894: #endif
116895:
116896: #endif /* SQLITE_AMALGAMATION */
116897:
116898: #ifdef SQLITE_DEBUG
116899: SQLITE_PRIVATE int sqlite3Fts3Corrupt(void);
116900: # define FTS_CORRUPT_VTAB sqlite3Fts3Corrupt()
116901: #else
116902: # define FTS_CORRUPT_VTAB SQLITE_CORRUPT_VTAB
116903: #endif
116904:
116905: typedef struct Fts3Table Fts3Table;
116906: typedef struct Fts3Cursor Fts3Cursor;
116907: typedef struct Fts3Expr Fts3Expr;
116908: typedef struct Fts3Phrase Fts3Phrase;
116909: typedef struct Fts3PhraseToken Fts3PhraseToken;
116910:
116911: typedef struct Fts3Doclist Fts3Doclist;
116912: typedef struct Fts3SegFilter Fts3SegFilter;
116913: typedef struct Fts3DeferredToken Fts3DeferredToken;
116914: typedef struct Fts3SegReader Fts3SegReader;
116915: typedef struct Fts3MultiSegReader Fts3MultiSegReader;
116916:
116917: /*
116918: ** A connection to a fulltext index is an instance of the following
116919: ** structure. The xCreate and xConnect methods create an instance
116920: ** of this structure and xDestroy and xDisconnect free that instance.
116921: ** All other methods receive a pointer to the structure as one of their
116922: ** arguments.
116923: */
116924: struct Fts3Table {
116925: sqlite3_vtab base; /* Base class used by SQLite core */
116926: sqlite3 *db; /* The database connection */
116927: const char *zDb; /* logical database name */
116928: const char *zName; /* virtual table name */
116929: int nColumn; /* number of named columns in virtual table */
116930: char **azColumn; /* column names. malloced */
116931: sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */
116932: char *zContentTbl; /* content=xxx option, or NULL */
1.2.2.1 ! misho 116933: char *zLanguageid; /* languageid=xxx option, or NULL */
! 116934: u8 bAutoincrmerge; /* True if automerge=1 */
! 116935: u32 nLeafAdd; /* Number of leaf blocks added this trans */
1.2 misho 116936:
116937: /* Precompiled statements used by the implementation. Each of these
116938: ** statements is run and reset within a single virtual table API call.
116939: */
1.2.2.1 ! misho 116940: sqlite3_stmt *aStmt[37];
1.2 misho 116941:
116942: char *zReadExprlist;
116943: char *zWriteExprlist;
116944:
116945: int nNodeSize; /* Soft limit for node size */
1.2.2.1 ! misho 116946: u8 bFts4; /* True for FTS4, false for FTS3 */
1.2 misho 116947: u8 bHasStat; /* True if %_stat table exists */
116948: u8 bHasDocsize; /* True if %_docsize table exists */
116949: u8 bDescIdx; /* True if doclists are in reverse order */
1.2.2.1 ! misho 116950: u8 bIgnoreSavepoint; /* True to ignore xSavepoint invocations */
1.2 misho 116951: int nPgsz; /* Page size for host database */
116952: char *zSegmentsTbl; /* Name of %_segments table */
116953: sqlite3_blob *pSegments; /* Blob handle open on %_segments table */
116954:
1.2.2.1 ! misho 116955: /*
! 116956: ** The following array of hash tables is used to buffer pending index
! 116957: ** updates during transactions. All pending updates buffered at any one
! 116958: ** time must share a common language-id (see the FTS4 langid= feature).
! 116959: ** The current language id is stored in variable iPrevLangid.
1.2 misho 116960: **
116961: ** A single FTS4 table may have multiple full-text indexes. For each index
116962: ** there is an entry in the aIndex[] array. Index 0 is an index of all the
116963: ** terms that appear in the document set. Each subsequent index in aIndex[]
116964: ** is an index of prefixes of a specific length.
1.2.2.1 ! misho 116965: **
! 116966: ** Variable nPendingData contains an estimate the memory consumed by the
! 116967: ** pending data structures, including hash table overhead, but not including
! 116968: ** malloc overhead. When nPendingData exceeds nMaxPendingData, all hash
! 116969: ** tables are flushed to disk. Variable iPrevDocid is the docid of the most
! 116970: ** recently inserted record.
1.2 misho 116971: */
116972: int nIndex; /* Size of aIndex[] */
116973: struct Fts3Index {
116974: int nPrefix; /* Prefix length (0 for main terms index) */
116975: Fts3Hash hPending; /* Pending terms table for this index */
116976: } *aIndex;
116977: int nMaxPendingData; /* Max pending data before flush to disk */
116978: int nPendingData; /* Current bytes of pending data */
116979: sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */
1.2.2.1 ! misho 116980: int iPrevLangid; /* Langid of recently inserted document */
1.2 misho 116981:
116982: #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
116983: /* State variables used for validating that the transaction control
116984: ** methods of the virtual table are called at appropriate times. These
1.2.2.1 ! misho 116985: ** values do not contribute to FTS functionality; they are used for
! 116986: ** verifying the operation of the SQLite core.
1.2 misho 116987: */
116988: int inTransaction; /* True after xBegin but before xCommit/xRollback */
116989: int mxSavepoint; /* Largest valid xSavepoint integer */
116990: #endif
116991: };
116992:
116993: /*
116994: ** When the core wants to read from the virtual table, it creates a
116995: ** virtual table cursor (an instance of the following structure) using
116996: ** the xOpen method. Cursors are destroyed using the xClose method.
116997: */
116998: struct Fts3Cursor {
116999: sqlite3_vtab_cursor base; /* Base class used by SQLite core */
117000: i16 eSearch; /* Search strategy (see below) */
117001: u8 isEof; /* True if at End Of Results */
117002: u8 isRequireSeek; /* True if must seek pStmt to %_content row */
117003: sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */
117004: Fts3Expr *pExpr; /* Parsed MATCH query string */
1.2.2.1 ! misho 117005: int iLangid; /* Language being queried for */
1.2 misho 117006: int nPhrase; /* Number of matchable phrases in query */
117007: Fts3DeferredToken *pDeferred; /* Deferred search tokens, if any */
117008: sqlite3_int64 iPrevId; /* Previous id read from aDoclist */
117009: char *pNextId; /* Pointer into the body of aDoclist */
117010: char *aDoclist; /* List of docids for full-text queries */
117011: int nDoclist; /* Size of buffer at aDoclist */
117012: u8 bDesc; /* True to sort in descending order */
117013: int eEvalmode; /* An FTS3_EVAL_XX constant */
117014: int nRowAvg; /* Average size of database rows, in pages */
117015: sqlite3_int64 nDoc; /* Documents in table */
117016:
117017: int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */
117018: u32 *aMatchinfo; /* Information about most recent match */
117019: int nMatchinfo; /* Number of elements in aMatchinfo[] */
117020: char *zMatchinfo; /* Matchinfo specification */
117021: };
117022:
117023: #define FTS3_EVAL_FILTER 0
117024: #define FTS3_EVAL_NEXT 1
117025: #define FTS3_EVAL_MATCHINFO 2
117026:
117027: /*
117028: ** The Fts3Cursor.eSearch member is always set to one of the following.
117029: ** Actualy, Fts3Cursor.eSearch can be greater than or equal to
117030: ** FTS3_FULLTEXT_SEARCH. If so, then Fts3Cursor.eSearch - 2 is the index
117031: ** of the column to be searched. For example, in
117032: **
117033: ** CREATE VIRTUAL TABLE ex1 USING fts3(a,b,c,d);
117034: ** SELECT docid FROM ex1 WHERE b MATCH 'one two three';
117035: **
117036: ** Because the LHS of the MATCH operator is 2nd column "b",
117037: ** Fts3Cursor.eSearch will be set to FTS3_FULLTEXT_SEARCH+1. (+0 for a,
117038: ** +1 for b, +2 for c, +3 for d.) If the LHS of MATCH were "ex1"
117039: ** indicating that all columns should be searched,
117040: ** then eSearch would be set to FTS3_FULLTEXT_SEARCH+4.
117041: */
117042: #define FTS3_FULLSCAN_SEARCH 0 /* Linear scan of %_content table */
117043: #define FTS3_DOCID_SEARCH 1 /* Lookup by rowid on %_content table */
117044: #define FTS3_FULLTEXT_SEARCH 2 /* Full-text index search */
117045:
117046:
117047: struct Fts3Doclist {
117048: char *aAll; /* Array containing doclist (or NULL) */
117049: int nAll; /* Size of a[] in bytes */
117050: char *pNextDocid; /* Pointer to next docid */
117051:
117052: sqlite3_int64 iDocid; /* Current docid (if pList!=0) */
117053: int bFreeList; /* True if pList should be sqlite3_free()d */
117054: char *pList; /* Pointer to position list following iDocid */
117055: int nList; /* Length of position list */
117056: };
117057:
117058: /*
117059: ** A "phrase" is a sequence of one or more tokens that must match in
117060: ** sequence. A single token is the base case and the most common case.
117061: ** For a sequence of tokens contained in double-quotes (i.e. "one two three")
117062: ** nToken will be the number of tokens in the string.
117063: */
117064: struct Fts3PhraseToken {
117065: char *z; /* Text of the token */
117066: int n; /* Number of bytes in buffer z */
117067: int isPrefix; /* True if token ends with a "*" character */
117068: int bFirst; /* True if token must appear at position 0 */
117069:
117070: /* Variables above this point are populated when the expression is
117071: ** parsed (by code in fts3_expr.c). Below this point the variables are
117072: ** used when evaluating the expression. */
117073: Fts3DeferredToken *pDeferred; /* Deferred token object for this token */
117074: Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */
117075: };
117076:
117077: struct Fts3Phrase {
117078: /* Cache of doclist for this phrase. */
117079: Fts3Doclist doclist;
117080: int bIncr; /* True if doclist is loaded incrementally */
117081: int iDoclistToken;
117082:
117083: /* Variables below this point are populated by fts3_expr.c when parsing
117084: ** a MATCH expression. Everything above is part of the evaluation phase.
117085: */
117086: int nToken; /* Number of tokens in the phrase */
117087: int iColumn; /* Index of column this phrase must match */
117088: Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */
117089: };
117090:
117091: /*
117092: ** A tree of these objects forms the RHS of a MATCH operator.
117093: **
117094: ** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist
117095: ** points to a malloced buffer, size nDoclist bytes, containing the results
117096: ** of this phrase query in FTS3 doclist format. As usual, the initial
117097: ** "Length" field found in doclists stored on disk is omitted from this
117098: ** buffer.
117099: **
117100: ** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global
117101: ** matchinfo data. If it is not NULL, it points to an array of size nCol*3,
117102: ** where nCol is the number of columns in the queried FTS table. The array
117103: ** is populated as follows:
117104: **
117105: ** aMI[iCol*3 + 0] = Undefined
117106: ** aMI[iCol*3 + 1] = Number of occurrences
117107: ** aMI[iCol*3 + 2] = Number of rows containing at least one instance
117108: **
117109: ** The aMI array is allocated using sqlite3_malloc(). It should be freed
117110: ** when the expression node is.
117111: */
117112: struct Fts3Expr {
117113: int eType; /* One of the FTSQUERY_XXX values defined below */
117114: int nNear; /* Valid if eType==FTSQUERY_NEAR */
117115: Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */
117116: Fts3Expr *pLeft; /* Left operand */
117117: Fts3Expr *pRight; /* Right operand */
117118: Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */
117119:
117120: /* The following are used by the fts3_eval.c module. */
117121: sqlite3_int64 iDocid; /* Current docid */
117122: u8 bEof; /* True this expression is at EOF already */
117123: u8 bStart; /* True if iDocid is valid */
117124: u8 bDeferred; /* True if this expression is entirely deferred */
117125:
117126: u32 *aMI;
117127: };
117128:
117129: /*
117130: ** Candidate values for Fts3Query.eType. Note that the order of the first
117131: ** four values is in order of precedence when parsing expressions. For
117132: ** example, the following:
117133: **
117134: ** "a OR b AND c NOT d NEAR e"
117135: **
117136: ** is equivalent to:
117137: **
117138: ** "a OR (b AND (c NOT (d NEAR e)))"
117139: */
117140: #define FTSQUERY_NEAR 1
117141: #define FTSQUERY_NOT 2
117142: #define FTSQUERY_AND 3
117143: #define FTSQUERY_OR 4
117144: #define FTSQUERY_PHRASE 5
117145:
117146:
117147: /* fts3_write.c */
117148: SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(sqlite3_vtab*,int,sqlite3_value**,sqlite3_int64*);
117149: SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *);
117150: SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *);
117151: SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *);
1.2.2.1 ! misho 117152: SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(int, int, sqlite3_int64,
1.2 misho 117153: sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**);
117154: SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(
117155: Fts3Table*,int,const char*,int,int,Fts3SegReader**);
117156: SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *);
1.2.2.1 ! misho 117157: SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, int, int, sqlite3_stmt **);
1.2 misho 117158: SQLITE_PRIVATE int sqlite3Fts3ReadLock(Fts3Table *);
117159: SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*, int*);
117160:
117161: SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(Fts3Table *, sqlite3_stmt **);
117162: SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(Fts3Table *, sqlite3_int64, sqlite3_stmt **);
117163:
1.2.2.1 ! misho 117164: #ifndef SQLITE_DISABLE_FTS4_DEFERRED
1.2 misho 117165: SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *);
117166: SQLITE_PRIVATE int sqlite3Fts3DeferToken(Fts3Cursor *, Fts3PhraseToken *, int);
117167: SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *);
117168: SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *);
1.2.2.1 ! misho 117169: SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(Fts3DeferredToken *, char **, int *);
! 117170: #else
! 117171: # define sqlite3Fts3FreeDeferredTokens(x)
! 117172: # define sqlite3Fts3DeferToken(x,y,z) SQLITE_OK
! 117173: # define sqlite3Fts3CacheDeferredDoclists(x) SQLITE_OK
! 117174: # define sqlite3Fts3FreeDeferredDoclists(x)
! 117175: # define sqlite3Fts3DeferredTokenList(x,y,z) SQLITE_OK
! 117176: #endif
! 117177:
1.2 misho 117178: SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *);
1.2.2.1 ! misho 117179: SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *, int *);
1.2 misho 117180:
117181: /* Special values interpreted by sqlite3SegReaderCursor() */
117182: #define FTS3_SEGCURSOR_PENDING -1
117183: #define FTS3_SEGCURSOR_ALL -2
117184:
117185: SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Fts3SegFilter*);
117186: SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *);
117187: SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *);
117188:
1.2.2.1 ! misho 117189: SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(Fts3Table *,
! 117190: int, int, int, const char *, int, int, int, Fts3MultiSegReader *);
1.2 misho 117191:
117192: /* Flags allowed as part of the 4th argument to SegmentReaderIterate() */
117193: #define FTS3_SEGMENT_REQUIRE_POS 0x00000001
117194: #define FTS3_SEGMENT_IGNORE_EMPTY 0x00000002
117195: #define FTS3_SEGMENT_COLUMN_FILTER 0x00000004
117196: #define FTS3_SEGMENT_PREFIX 0x00000008
117197: #define FTS3_SEGMENT_SCAN 0x00000010
117198: #define FTS3_SEGMENT_FIRST 0x00000020
117199:
117200: /* Type passed as 4th argument to SegmentReaderIterate() */
117201: struct Fts3SegFilter {
117202: const char *zTerm;
117203: int nTerm;
117204: int iCol;
117205: int flags;
117206: };
117207:
117208: struct Fts3MultiSegReader {
117209: /* Used internally by sqlite3Fts3SegReaderXXX() calls */
117210: Fts3SegReader **apSegment; /* Array of Fts3SegReader objects */
117211: int nSegment; /* Size of apSegment array */
117212: int nAdvance; /* How many seg-readers to advance */
117213: Fts3SegFilter *pFilter; /* Pointer to filter object */
117214: char *aBuffer; /* Buffer to merge doclists in */
117215: int nBuffer; /* Allocated size of aBuffer[] in bytes */
117216:
117217: int iColFilter; /* If >=0, filter for this column */
117218: int bRestart;
117219:
117220: /* Used by fts3.c only. */
117221: int nCost; /* Cost of running iterator */
117222: int bLookup; /* True if a lookup of a single entry. */
117223:
117224: /* Output values. Valid only after Fts3SegReaderStep() returns SQLITE_ROW. */
117225: char *zTerm; /* Pointer to term buffer */
117226: int nTerm; /* Size of zTerm in bytes */
117227: char *aDoclist; /* Pointer to doclist buffer */
117228: int nDoclist; /* Size of aDoclist[] in bytes */
117229: };
117230:
1.2.2.1 ! misho 117231: SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int);
! 117232:
1.2 misho 117233: /* fts3.c */
117234: SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64);
117235: SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *);
117236: SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *);
117237: SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64);
117238: SQLITE_PRIVATE void sqlite3Fts3Dequote(char *);
117239: SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*);
117240: SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *);
117241: SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *);
1.2.2.1 ! misho 117242: SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*);
1.2 misho 117243:
117244: /* fts3_tokenizer.c */
117245: SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *);
117246: SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *);
117247: SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *,
117248: sqlite3_tokenizer **, char **
117249: );
117250: SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char);
117251:
117252: /* fts3_snippet.c */
117253: SQLITE_PRIVATE void sqlite3Fts3Offsets(sqlite3_context*, Fts3Cursor*);
117254: SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const char *,
117255: const char *, const char *, int, int
117256: );
117257: SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *);
117258:
117259: /* fts3_expr.c */
1.2.2.1 ! misho 117260: SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int,
1.2 misho 117261: char **, int, int, int, const char *, int, Fts3Expr **
117262: );
117263: SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *);
117264: #ifdef SQLITE_TEST
117265: SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db);
117266: SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db);
117267: #endif
117268:
1.2.2.1 ! misho 117269: SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(sqlite3_tokenizer *, int, const char *, int,
! 117270: sqlite3_tokenizer_cursor **
! 117271: );
! 117272:
1.2 misho 117273: /* fts3_aux.c */
117274: SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db);
117275:
117276: SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *);
117277:
117278: SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart(
117279: Fts3Table*, Fts3MultiSegReader*, int, const char*, int);
117280: SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext(
117281: Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *);
1.2.2.1 ! misho 117282: SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **);
1.2 misho 117283: SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *);
117284: SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr);
117285:
1.2.2.1 ! misho 117286: /* fts3_unicode2.c (functions generated by parsing unicode text files) */
! 117287: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 117288: SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int, int);
! 117289: SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int);
! 117290: SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int);
! 117291: #endif
1.2 misho 117292:
117293: #endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */
117294: #endif /* _FTSINT_H */
117295:
117296: /************** End of fts3Int.h *********************************************/
117297: /************** Continuing where we left off in fts3.c ***********************/
117298: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
117299:
117300: #if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE)
117301: # define SQLITE_CORE 1
117302: #endif
117303:
117304: /* #include <assert.h> */
117305: /* #include <stdlib.h> */
117306: /* #include <stddef.h> */
117307: /* #include <stdio.h> */
117308: /* #include <string.h> */
117309: /* #include <stdarg.h> */
117310:
117311: #ifndef SQLITE_CORE
117312: SQLITE_EXTENSION_INIT1
117313: #endif
117314:
117315: static int fts3EvalNext(Fts3Cursor *pCsr);
117316: static int fts3EvalStart(Fts3Cursor *pCsr);
117317: static int fts3TermSegReaderCursor(
117318: Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **);
117319:
117320: /*
117321: ** Write a 64-bit variable-length integer to memory starting at p[0].
117322: ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes.
117323: ** The number of bytes written is returned.
117324: */
117325: SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){
117326: unsigned char *q = (unsigned char *) p;
117327: sqlite_uint64 vu = v;
117328: do{
117329: *q++ = (unsigned char) ((vu & 0x7f) | 0x80);
117330: vu >>= 7;
117331: }while( vu!=0 );
117332: q[-1] &= 0x7f; /* turn off high bit in final byte */
117333: assert( q - (unsigned char *)p <= FTS3_VARINT_MAX );
117334: return (int) (q - (unsigned char *)p);
117335: }
117336:
117337: /*
117338: ** Read a 64-bit variable-length integer from memory starting at p[0].
117339: ** Return the number of bytes read, or 0 on error.
117340: ** The value is stored in *v.
117341: */
117342: SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *p, sqlite_int64 *v){
117343: const unsigned char *q = (const unsigned char *) p;
117344: sqlite_uint64 x = 0, y = 1;
117345: while( (*q&0x80)==0x80 && q-(unsigned char *)p<FTS3_VARINT_MAX ){
117346: x += y * (*q++ & 0x7f);
117347: y <<= 7;
117348: }
117349: x += y * (*q++);
117350: *v = (sqlite_int64) x;
117351: return (int) (q - (unsigned char *)p);
117352: }
117353:
117354: /*
117355: ** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to a
117356: ** 32-bit integer before it is returned.
117357: */
117358: SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *p, int *pi){
117359: sqlite_int64 i;
117360: int ret = sqlite3Fts3GetVarint(p, &i);
117361: *pi = (int) i;
117362: return ret;
117363: }
117364:
117365: /*
117366: ** Return the number of bytes required to encode v as a varint
117367: */
117368: SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64 v){
117369: int i = 0;
117370: do{
117371: i++;
117372: v >>= 7;
117373: }while( v!=0 );
117374: return i;
117375: }
117376:
117377: /*
117378: ** Convert an SQL-style quoted string into a normal string by removing
117379: ** the quote characters. The conversion is done in-place. If the
117380: ** input does not begin with a quote character, then this routine
117381: ** is a no-op.
117382: **
117383: ** Examples:
117384: **
117385: ** "abc" becomes abc
117386: ** 'xyz' becomes xyz
117387: ** [pqr] becomes pqr
117388: ** `mno` becomes mno
117389: **
117390: */
117391: SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){
117392: char quote; /* Quote character (if any ) */
117393:
117394: quote = z[0];
117395: if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){
117396: int iIn = 1; /* Index of next byte to read from input */
117397: int iOut = 0; /* Index of next byte to write to output */
117398:
117399: /* If the first byte was a '[', then the close-quote character is a ']' */
117400: if( quote=='[' ) quote = ']';
117401:
117402: while( ALWAYS(z[iIn]) ){
117403: if( z[iIn]==quote ){
117404: if( z[iIn+1]!=quote ) break;
117405: z[iOut++] = quote;
117406: iIn += 2;
117407: }else{
117408: z[iOut++] = z[iIn++];
117409: }
117410: }
117411: z[iOut] = '\0';
117412: }
117413: }
117414:
117415: /*
117416: ** Read a single varint from the doclist at *pp and advance *pp to point
117417: ** to the first byte past the end of the varint. Add the value of the varint
117418: ** to *pVal.
117419: */
117420: static void fts3GetDeltaVarint(char **pp, sqlite3_int64 *pVal){
117421: sqlite3_int64 iVal;
117422: *pp += sqlite3Fts3GetVarint(*pp, &iVal);
117423: *pVal += iVal;
117424: }
117425:
117426: /*
117427: ** When this function is called, *pp points to the first byte following a
117428: ** varint that is part of a doclist (or position-list, or any other list
117429: ** of varints). This function moves *pp to point to the start of that varint,
117430: ** and sets *pVal by the varint value.
117431: **
117432: ** Argument pStart points to the first byte of the doclist that the
117433: ** varint is part of.
117434: */
117435: static void fts3GetReverseVarint(
117436: char **pp,
117437: char *pStart,
117438: sqlite3_int64 *pVal
117439: ){
117440: sqlite3_int64 iVal;
117441: char *p;
117442:
117443: /* Pointer p now points at the first byte past the varint we are
117444: ** interested in. So, unless the doclist is corrupt, the 0x80 bit is
117445: ** clear on character p[-1]. */
117446: for(p = (*pp)-2; p>=pStart && *p&0x80; p--);
117447: p++;
117448: *pp = p;
117449:
117450: sqlite3Fts3GetVarint(p, &iVal);
117451: *pVal = iVal;
117452: }
117453:
117454: /*
117455: ** The xDisconnect() virtual table method.
117456: */
117457: static int fts3DisconnectMethod(sqlite3_vtab *pVtab){
117458: Fts3Table *p = (Fts3Table *)pVtab;
117459: int i;
117460:
117461: assert( p->nPendingData==0 );
117462: assert( p->pSegments==0 );
117463:
117464: /* Free any prepared statements held */
117465: for(i=0; i<SizeofArray(p->aStmt); i++){
117466: sqlite3_finalize(p->aStmt[i]);
117467: }
117468: sqlite3_free(p->zSegmentsTbl);
117469: sqlite3_free(p->zReadExprlist);
117470: sqlite3_free(p->zWriteExprlist);
117471: sqlite3_free(p->zContentTbl);
1.2.2.1 ! misho 117472: sqlite3_free(p->zLanguageid);
1.2 misho 117473:
117474: /* Invoke the tokenizer destructor to free the tokenizer. */
117475: p->pTokenizer->pModule->xDestroy(p->pTokenizer);
117476:
117477: sqlite3_free(p);
117478: return SQLITE_OK;
117479: }
117480:
117481: /*
117482: ** Construct one or more SQL statements from the format string given
117483: ** and then evaluate those statements. The success code is written
117484: ** into *pRc.
117485: **
117486: ** If *pRc is initially non-zero then this routine is a no-op.
117487: */
117488: static void fts3DbExec(
117489: int *pRc, /* Success code */
117490: sqlite3 *db, /* Database in which to run SQL */
117491: const char *zFormat, /* Format string for SQL */
117492: ... /* Arguments to the format string */
117493: ){
117494: va_list ap;
117495: char *zSql;
117496: if( *pRc ) return;
117497: va_start(ap, zFormat);
117498: zSql = sqlite3_vmprintf(zFormat, ap);
117499: va_end(ap);
117500: if( zSql==0 ){
117501: *pRc = SQLITE_NOMEM;
117502: }else{
117503: *pRc = sqlite3_exec(db, zSql, 0, 0, 0);
117504: sqlite3_free(zSql);
117505: }
117506: }
117507:
117508: /*
117509: ** The xDestroy() virtual table method.
117510: */
117511: static int fts3DestroyMethod(sqlite3_vtab *pVtab){
117512: Fts3Table *p = (Fts3Table *)pVtab;
117513: int rc = SQLITE_OK; /* Return code */
117514: const char *zDb = p->zDb; /* Name of database (e.g. "main", "temp") */
117515: sqlite3 *db = p->db; /* Database handle */
117516:
117517: /* Drop the shadow tables */
117518: if( p->zContentTbl==0 ){
117519: fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName);
117520: }
117521: fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName);
117522: fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName);
117523: fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName);
117524: fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName);
117525:
117526: /* If everything has worked, invoke fts3DisconnectMethod() to free the
117527: ** memory associated with the Fts3Table structure and return SQLITE_OK.
117528: ** Otherwise, return an SQLite error code.
117529: */
117530: return (rc==SQLITE_OK ? fts3DisconnectMethod(pVtab) : rc);
117531: }
117532:
117533:
117534: /*
117535: ** Invoke sqlite3_declare_vtab() to declare the schema for the FTS3 table
117536: ** passed as the first argument. This is done as part of the xConnect()
117537: ** and xCreate() methods.
117538: **
117539: ** If *pRc is non-zero when this function is called, it is a no-op.
117540: ** Otherwise, if an error occurs, an SQLite error code is stored in *pRc
117541: ** before returning.
117542: */
117543: static void fts3DeclareVtab(int *pRc, Fts3Table *p){
117544: if( *pRc==SQLITE_OK ){
117545: int i; /* Iterator variable */
117546: int rc; /* Return code */
117547: char *zSql; /* SQL statement passed to declare_vtab() */
117548: char *zCols; /* List of user defined columns */
1.2.2.1 ! misho 117549: const char *zLanguageid;
1.2 misho 117550:
1.2.2.1 ! misho 117551: zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid");
1.2 misho 117552: sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
117553:
117554: /* Create a list of user columns for the virtual table */
117555: zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]);
117556: for(i=1; zCols && i<p->nColumn; i++){
117557: zCols = sqlite3_mprintf("%z%Q, ", zCols, p->azColumn[i]);
117558: }
117559:
117560: /* Create the whole "CREATE TABLE" statement to pass to SQLite */
117561: zSql = sqlite3_mprintf(
1.2.2.1 ! misho 117562: "CREATE TABLE x(%s %Q HIDDEN, docid HIDDEN, %Q HIDDEN)",
! 117563: zCols, p->zName, zLanguageid
1.2 misho 117564: );
117565: if( !zCols || !zSql ){
117566: rc = SQLITE_NOMEM;
117567: }else{
117568: rc = sqlite3_declare_vtab(p->db, zSql);
117569: }
117570:
117571: sqlite3_free(zSql);
117572: sqlite3_free(zCols);
117573: *pRc = rc;
117574: }
117575: }
117576:
117577: /*
1.2.2.1 ! misho 117578: ** Create the %_stat table if it does not already exist.
! 117579: */
! 117580: SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int *pRc, Fts3Table *p){
! 117581: fts3DbExec(pRc, p->db,
! 117582: "CREATE TABLE IF NOT EXISTS %Q.'%q_stat'"
! 117583: "(id INTEGER PRIMARY KEY, value BLOB);",
! 117584: p->zDb, p->zName
! 117585: );
! 117586: if( (*pRc)==SQLITE_OK ) p->bHasStat = 1;
! 117587: }
! 117588:
! 117589: /*
1.2 misho 117590: ** Create the backing store tables (%_content, %_segments and %_segdir)
117591: ** required by the FTS3 table passed as the only argument. This is done
117592: ** as part of the vtab xCreate() method.
117593: **
117594: ** If the p->bHasDocsize boolean is true (indicating that this is an
117595: ** FTS4 table, not an FTS3 table) then also create the %_docsize and
117596: ** %_stat tables required by FTS4.
117597: */
117598: static int fts3CreateTables(Fts3Table *p){
117599: int rc = SQLITE_OK; /* Return code */
117600: int i; /* Iterator variable */
117601: sqlite3 *db = p->db; /* The database connection */
117602:
117603: if( p->zContentTbl==0 ){
1.2.2.1 ! misho 117604: const char *zLanguageid = p->zLanguageid;
1.2 misho 117605: char *zContentCols; /* Columns of %_content table */
117606:
117607: /* Create a list of user columns for the content table */
117608: zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY");
117609: for(i=0; zContentCols && i<p->nColumn; i++){
117610: char *z = p->azColumn[i];
117611: zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z);
117612: }
1.2.2.1 ! misho 117613: if( zLanguageid && zContentCols ){
! 117614: zContentCols = sqlite3_mprintf("%z, langid", zContentCols, zLanguageid);
! 117615: }
1.2 misho 117616: if( zContentCols==0 ) rc = SQLITE_NOMEM;
117617:
117618: /* Create the content table */
117619: fts3DbExec(&rc, db,
117620: "CREATE TABLE %Q.'%q_content'(%s)",
117621: p->zDb, p->zName, zContentCols
117622: );
117623: sqlite3_free(zContentCols);
117624: }
117625:
117626: /* Create other tables */
117627: fts3DbExec(&rc, db,
117628: "CREATE TABLE %Q.'%q_segments'(blockid INTEGER PRIMARY KEY, block BLOB);",
117629: p->zDb, p->zName
117630: );
117631: fts3DbExec(&rc, db,
117632: "CREATE TABLE %Q.'%q_segdir'("
117633: "level INTEGER,"
117634: "idx INTEGER,"
117635: "start_block INTEGER,"
117636: "leaves_end_block INTEGER,"
117637: "end_block INTEGER,"
117638: "root BLOB,"
117639: "PRIMARY KEY(level, idx)"
117640: ");",
117641: p->zDb, p->zName
117642: );
117643: if( p->bHasDocsize ){
117644: fts3DbExec(&rc, db,
117645: "CREATE TABLE %Q.'%q_docsize'(docid INTEGER PRIMARY KEY, size BLOB);",
117646: p->zDb, p->zName
117647: );
117648: }
1.2.2.1 ! misho 117649: assert( p->bHasStat==p->bFts4 );
1.2 misho 117650: if( p->bHasStat ){
1.2.2.1 ! misho 117651: sqlite3Fts3CreateStatTable(&rc, p);
1.2 misho 117652: }
117653: return rc;
117654: }
117655:
117656: /*
117657: ** Store the current database page-size in bytes in p->nPgsz.
117658: **
117659: ** If *pRc is non-zero when this function is called, it is a no-op.
117660: ** Otherwise, if an error occurs, an SQLite error code is stored in *pRc
117661: ** before returning.
117662: */
117663: static void fts3DatabasePageSize(int *pRc, Fts3Table *p){
117664: if( *pRc==SQLITE_OK ){
117665: int rc; /* Return code */
117666: char *zSql; /* SQL text "PRAGMA %Q.page_size" */
117667: sqlite3_stmt *pStmt; /* Compiled "PRAGMA %Q.page_size" statement */
117668:
117669: zSql = sqlite3_mprintf("PRAGMA %Q.page_size", p->zDb);
117670: if( !zSql ){
117671: rc = SQLITE_NOMEM;
117672: }else{
117673: rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
117674: if( rc==SQLITE_OK ){
117675: sqlite3_step(pStmt);
117676: p->nPgsz = sqlite3_column_int(pStmt, 0);
117677: rc = sqlite3_finalize(pStmt);
117678: }else if( rc==SQLITE_AUTH ){
117679: p->nPgsz = 1024;
117680: rc = SQLITE_OK;
117681: }
117682: }
117683: assert( p->nPgsz>0 || rc!=SQLITE_OK );
117684: sqlite3_free(zSql);
117685: *pRc = rc;
117686: }
117687: }
117688:
117689: /*
117690: ** "Special" FTS4 arguments are column specifications of the following form:
117691: **
117692: ** <key> = <value>
117693: **
117694: ** There may not be whitespace surrounding the "=" character. The <value>
117695: ** term may be quoted, but the <key> may not.
117696: */
117697: static int fts3IsSpecialColumn(
117698: const char *z,
117699: int *pnKey,
117700: char **pzValue
117701: ){
117702: char *zValue;
117703: const char *zCsr = z;
117704:
117705: while( *zCsr!='=' ){
117706: if( *zCsr=='\0' ) return 0;
117707: zCsr++;
117708: }
117709:
117710: *pnKey = (int)(zCsr-z);
117711: zValue = sqlite3_mprintf("%s", &zCsr[1]);
117712: if( zValue ){
117713: sqlite3Fts3Dequote(zValue);
117714: }
117715: *pzValue = zValue;
117716: return 1;
117717: }
117718:
117719: /*
117720: ** Append the output of a printf() style formatting to an existing string.
117721: */
117722: static void fts3Appendf(
117723: int *pRc, /* IN/OUT: Error code */
117724: char **pz, /* IN/OUT: Pointer to string buffer */
117725: const char *zFormat, /* Printf format string to append */
117726: ... /* Arguments for printf format string */
117727: ){
117728: if( *pRc==SQLITE_OK ){
117729: va_list ap;
117730: char *z;
117731: va_start(ap, zFormat);
117732: z = sqlite3_vmprintf(zFormat, ap);
117733: va_end(ap);
117734: if( z && *pz ){
117735: char *z2 = sqlite3_mprintf("%s%s", *pz, z);
117736: sqlite3_free(z);
117737: z = z2;
117738: }
117739: if( z==0 ) *pRc = SQLITE_NOMEM;
117740: sqlite3_free(*pz);
117741: *pz = z;
117742: }
117743: }
117744:
117745: /*
117746: ** Return a copy of input string zInput enclosed in double-quotes (") and
117747: ** with all double quote characters escaped. For example:
117748: **
117749: ** fts3QuoteId("un \"zip\"") -> "un \"\"zip\"\""
117750: **
117751: ** The pointer returned points to memory obtained from sqlite3_malloc(). It
117752: ** is the callers responsibility to call sqlite3_free() to release this
117753: ** memory.
117754: */
117755: static char *fts3QuoteId(char const *zInput){
117756: int nRet;
117757: char *zRet;
1.2.2.1 ! misho 117758: nRet = 2 + (int)strlen(zInput)*2 + 1;
1.2 misho 117759: zRet = sqlite3_malloc(nRet);
117760: if( zRet ){
117761: int i;
117762: char *z = zRet;
117763: *(z++) = '"';
117764: for(i=0; zInput[i]; i++){
117765: if( zInput[i]=='"' ) *(z++) = '"';
117766: *(z++) = zInput[i];
117767: }
117768: *(z++) = '"';
117769: *(z++) = '\0';
117770: }
117771: return zRet;
117772: }
117773:
117774: /*
117775: ** Return a list of comma separated SQL expressions and a FROM clause that
117776: ** could be used in a SELECT statement such as the following:
117777: **
117778: ** SELECT <list of expressions> FROM %_content AS x ...
117779: **
117780: ** to return the docid, followed by each column of text data in order
117781: ** from left to write. If parameter zFunc is not NULL, then instead of
117782: ** being returned directly each column of text data is passed to an SQL
117783: ** function named zFunc first. For example, if zFunc is "unzip" and the
117784: ** table has the three user-defined columns "a", "b", and "c", the following
117785: ** string is returned:
117786: **
117787: ** "docid, unzip(x.'a'), unzip(x.'b'), unzip(x.'c') FROM %_content AS x"
117788: **
117789: ** The pointer returned points to a buffer allocated by sqlite3_malloc(). It
117790: ** is the responsibility of the caller to eventually free it.
117791: **
117792: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and
117793: ** a NULL pointer is returned). Otherwise, if an OOM error is encountered
117794: ** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If
117795: ** no error occurs, *pRc is left unmodified.
117796: */
117797: static char *fts3ReadExprList(Fts3Table *p, const char *zFunc, int *pRc){
117798: char *zRet = 0;
117799: char *zFree = 0;
117800: char *zFunction;
117801: int i;
117802:
117803: if( p->zContentTbl==0 ){
117804: if( !zFunc ){
117805: zFunction = "";
117806: }else{
117807: zFree = zFunction = fts3QuoteId(zFunc);
117808: }
117809: fts3Appendf(pRc, &zRet, "docid");
117810: for(i=0; i<p->nColumn; i++){
117811: fts3Appendf(pRc, &zRet, ",%s(x.'c%d%q')", zFunction, i, p->azColumn[i]);
117812: }
1.2.2.1 ! misho 117813: if( p->zLanguageid ){
! 117814: fts3Appendf(pRc, &zRet, ", x.%Q", "langid");
! 117815: }
1.2 misho 117816: sqlite3_free(zFree);
117817: }else{
117818: fts3Appendf(pRc, &zRet, "rowid");
117819: for(i=0; i<p->nColumn; i++){
117820: fts3Appendf(pRc, &zRet, ", x.'%q'", p->azColumn[i]);
117821: }
1.2.2.1 ! misho 117822: if( p->zLanguageid ){
! 117823: fts3Appendf(pRc, &zRet, ", x.%Q", p->zLanguageid);
! 117824: }
1.2 misho 117825: }
1.2.2.1 ! misho 117826: fts3Appendf(pRc, &zRet, " FROM '%q'.'%q%s' AS x",
1.2 misho 117827: p->zDb,
117828: (p->zContentTbl ? p->zContentTbl : p->zName),
117829: (p->zContentTbl ? "" : "_content")
117830: );
117831: return zRet;
117832: }
117833:
117834: /*
117835: ** Return a list of N comma separated question marks, where N is the number
117836: ** of columns in the %_content table (one for the docid plus one for each
117837: ** user-defined text column).
117838: **
117839: ** If argument zFunc is not NULL, then all but the first question mark
117840: ** is preceded by zFunc and an open bracket, and followed by a closed
117841: ** bracket. For example, if zFunc is "zip" and the FTS3 table has three
117842: ** user-defined text columns, the following string is returned:
117843: **
117844: ** "?, zip(?), zip(?), zip(?)"
117845: **
117846: ** The pointer returned points to a buffer allocated by sqlite3_malloc(). It
117847: ** is the responsibility of the caller to eventually free it.
117848: **
117849: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op (and
117850: ** a NULL pointer is returned). Otherwise, if an OOM error is encountered
117851: ** by this function, NULL is returned and *pRc is set to SQLITE_NOMEM. If
117852: ** no error occurs, *pRc is left unmodified.
117853: */
117854: static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){
117855: char *zRet = 0;
117856: char *zFree = 0;
117857: char *zFunction;
117858: int i;
117859:
117860: if( !zFunc ){
117861: zFunction = "";
117862: }else{
117863: zFree = zFunction = fts3QuoteId(zFunc);
117864: }
117865: fts3Appendf(pRc, &zRet, "?");
117866: for(i=0; i<p->nColumn; i++){
117867: fts3Appendf(pRc, &zRet, ",%s(?)", zFunction);
117868: }
1.2.2.1 ! misho 117869: if( p->zLanguageid ){
! 117870: fts3Appendf(pRc, &zRet, ", ?");
! 117871: }
1.2 misho 117872: sqlite3_free(zFree);
117873: return zRet;
117874: }
117875:
117876: /*
117877: ** This function interprets the string at (*pp) as a non-negative integer
117878: ** value. It reads the integer and sets *pnOut to the value read, then
117879: ** sets *pp to point to the byte immediately following the last byte of
117880: ** the integer value.
117881: **
117882: ** Only decimal digits ('0'..'9') may be part of an integer value.
117883: **
117884: ** If *pp does not being with a decimal digit SQLITE_ERROR is returned and
117885: ** the output value undefined. Otherwise SQLITE_OK is returned.
117886: **
117887: ** This function is used when parsing the "prefix=" FTS4 parameter.
117888: */
117889: static int fts3GobbleInt(const char **pp, int *pnOut){
117890: const char *p; /* Iterator pointer */
117891: int nInt = 0; /* Output value */
117892:
117893: for(p=*pp; p[0]>='0' && p[0]<='9'; p++){
117894: nInt = nInt * 10 + (p[0] - '0');
117895: }
117896: if( p==*pp ) return SQLITE_ERROR;
117897: *pnOut = nInt;
117898: *pp = p;
117899: return SQLITE_OK;
117900: }
117901:
117902: /*
117903: ** This function is called to allocate an array of Fts3Index structures
117904: ** representing the indexes maintained by the current FTS table. FTS tables
117905: ** always maintain the main "terms" index, but may also maintain one or
117906: ** more "prefix" indexes, depending on the value of the "prefix=" parameter
117907: ** (if any) specified as part of the CREATE VIRTUAL TABLE statement.
117908: **
117909: ** Argument zParam is passed the value of the "prefix=" option if one was
117910: ** specified, or NULL otherwise.
117911: **
117912: ** If no error occurs, SQLITE_OK is returned and *apIndex set to point to
117913: ** the allocated array. *pnIndex is set to the number of elements in the
117914: ** array. If an error does occur, an SQLite error code is returned.
117915: **
117916: ** Regardless of whether or not an error is returned, it is the responsibility
117917: ** of the caller to call sqlite3_free() on the output array to free it.
117918: */
117919: static int fts3PrefixParameter(
117920: const char *zParam, /* ABC in prefix=ABC parameter to parse */
117921: int *pnIndex, /* OUT: size of *apIndex[] array */
117922: struct Fts3Index **apIndex /* OUT: Array of indexes for this table */
117923: ){
117924: struct Fts3Index *aIndex; /* Allocated array */
117925: int nIndex = 1; /* Number of entries in array */
117926:
117927: if( zParam && zParam[0] ){
117928: const char *p;
117929: nIndex++;
117930: for(p=zParam; *p; p++){
117931: if( *p==',' ) nIndex++;
117932: }
117933: }
117934:
117935: aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex);
117936: *apIndex = aIndex;
117937: *pnIndex = nIndex;
117938: if( !aIndex ){
117939: return SQLITE_NOMEM;
117940: }
117941:
117942: memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex);
117943: if( zParam ){
117944: const char *p = zParam;
117945: int i;
117946: for(i=1; i<nIndex; i++){
117947: int nPrefix;
117948: if( fts3GobbleInt(&p, &nPrefix) ) return SQLITE_ERROR;
117949: aIndex[i].nPrefix = nPrefix;
117950: p++;
117951: }
117952: }
117953:
117954: return SQLITE_OK;
117955: }
117956:
117957: /*
117958: ** This function is called when initializing an FTS4 table that uses the
117959: ** content=xxx option. It determines the number of and names of the columns
117960: ** of the new FTS4 table.
117961: **
117962: ** The third argument passed to this function is the value passed to the
117963: ** config=xxx option (i.e. "xxx"). This function queries the database for
117964: ** a table of that name. If found, the output variables are populated
117965: ** as follows:
117966: **
117967: ** *pnCol: Set to the number of columns table xxx has,
117968: **
117969: ** *pnStr: Set to the total amount of space required to store a copy
117970: ** of each columns name, including the nul-terminator.
117971: **
117972: ** *pazCol: Set to point to an array of *pnCol strings. Each string is
117973: ** the name of the corresponding column in table xxx. The array
117974: ** and its contents are allocated using a single allocation. It
117975: ** is the responsibility of the caller to free this allocation
117976: ** by eventually passing the *pazCol value to sqlite3_free().
117977: **
117978: ** If the table cannot be found, an error code is returned and the output
117979: ** variables are undefined. Or, if an OOM is encountered, SQLITE_NOMEM is
117980: ** returned (and the output variables are undefined).
117981: */
117982: static int fts3ContentColumns(
117983: sqlite3 *db, /* Database handle */
117984: const char *zDb, /* Name of db (i.e. "main", "temp" etc.) */
117985: const char *zTbl, /* Name of content table */
117986: const char ***pazCol, /* OUT: Malloc'd array of column names */
117987: int *pnCol, /* OUT: Size of array *pazCol */
117988: int *pnStr /* OUT: Bytes of string content */
117989: ){
117990: int rc = SQLITE_OK; /* Return code */
117991: char *zSql; /* "SELECT *" statement on zTbl */
117992: sqlite3_stmt *pStmt = 0; /* Compiled version of zSql */
117993:
117994: zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", zDb, zTbl);
117995: if( !zSql ){
117996: rc = SQLITE_NOMEM;
117997: }else{
117998: rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
117999: }
118000: sqlite3_free(zSql);
118001:
118002: if( rc==SQLITE_OK ){
118003: const char **azCol; /* Output array */
118004: int nStr = 0; /* Size of all column names (incl. 0x00) */
118005: int nCol; /* Number of table columns */
118006: int i; /* Used to iterate through columns */
118007:
118008: /* Loop through the returned columns. Set nStr to the number of bytes of
118009: ** space required to store a copy of each column name, including the
118010: ** nul-terminator byte. */
118011: nCol = sqlite3_column_count(pStmt);
118012: for(i=0; i<nCol; i++){
118013: const char *zCol = sqlite3_column_name(pStmt, i);
1.2.2.1 ! misho 118014: nStr += (int)strlen(zCol) + 1;
1.2 misho 118015: }
118016:
118017: /* Allocate and populate the array to return. */
118018: azCol = (const char **)sqlite3_malloc(sizeof(char *) * nCol + nStr);
118019: if( azCol==0 ){
118020: rc = SQLITE_NOMEM;
118021: }else{
118022: char *p = (char *)&azCol[nCol];
118023: for(i=0; i<nCol; i++){
118024: const char *zCol = sqlite3_column_name(pStmt, i);
1.2.2.1 ! misho 118025: int n = (int)strlen(zCol)+1;
1.2 misho 118026: memcpy(p, zCol, n);
118027: azCol[i] = p;
118028: p += n;
118029: }
118030: }
118031: sqlite3_finalize(pStmt);
118032:
118033: /* Set the output variables. */
118034: *pnCol = nCol;
118035: *pnStr = nStr;
118036: *pazCol = azCol;
118037: }
118038:
118039: return rc;
118040: }
118041:
118042: /*
118043: ** This function is the implementation of both the xConnect and xCreate
118044: ** methods of the FTS3 virtual table.
118045: **
118046: ** The argv[] array contains the following:
118047: **
118048: ** argv[0] -> module name ("fts3" or "fts4")
118049: ** argv[1] -> database name
118050: ** argv[2] -> table name
118051: ** argv[...] -> "column name" and other module argument fields.
118052: */
118053: static int fts3InitVtab(
118054: int isCreate, /* True for xCreate, false for xConnect */
118055: sqlite3 *db, /* The SQLite database connection */
118056: void *pAux, /* Hash table containing tokenizers */
118057: int argc, /* Number of elements in argv array */
118058: const char * const *argv, /* xCreate/xConnect argument array */
118059: sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */
118060: char **pzErr /* Write any error message here */
118061: ){
118062: Fts3Hash *pHash = (Fts3Hash *)pAux;
118063: Fts3Table *p = 0; /* Pointer to allocated vtab */
118064: int rc = SQLITE_OK; /* Return code */
118065: int i; /* Iterator variable */
118066: int nByte; /* Size of allocation used for *p */
118067: int iCol; /* Column index */
118068: int nString = 0; /* Bytes required to hold all column names */
118069: int nCol = 0; /* Number of columns in the FTS table */
118070: char *zCsr; /* Space for holding column names */
118071: int nDb; /* Bytes required to hold database name */
118072: int nName; /* Bytes required to hold table name */
118073: int isFts4 = (argv[0][3]=='4'); /* True for FTS4, false for FTS3 */
118074: const char **aCol; /* Array of column names */
118075: sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */
118076:
118077: int nIndex; /* Size of aIndex[] array */
118078: struct Fts3Index *aIndex = 0; /* Array of indexes for this table */
118079:
118080: /* The results of parsing supported FTS4 key=value options: */
118081: int bNoDocsize = 0; /* True to omit %_docsize table */
118082: int bDescIdx = 0; /* True to store descending indexes */
118083: char *zPrefix = 0; /* Prefix parameter value (or NULL) */
118084: char *zCompress = 0; /* compress=? parameter (or NULL) */
118085: char *zUncompress = 0; /* uncompress=? parameter (or NULL) */
118086: char *zContent = 0; /* content=? parameter (or NULL) */
1.2.2.1 ! misho 118087: char *zLanguageid = 0; /* languageid=? parameter (or NULL) */
1.2 misho 118088:
118089: assert( strlen(argv[0])==4 );
118090: assert( (sqlite3_strnicmp(argv[0], "fts4", 4)==0 && isFts4)
118091: || (sqlite3_strnicmp(argv[0], "fts3", 4)==0 && !isFts4)
118092: );
118093:
118094: nDb = (int)strlen(argv[1]) + 1;
118095: nName = (int)strlen(argv[2]) + 1;
118096:
118097: aCol = (const char **)sqlite3_malloc(sizeof(const char *) * (argc-2) );
118098: if( !aCol ) return SQLITE_NOMEM;
118099: memset((void *)aCol, 0, sizeof(const char *) * (argc-2));
118100:
118101: /* Loop through all of the arguments passed by the user to the FTS3/4
118102: ** module (i.e. all the column names and special arguments). This loop
118103: ** does the following:
118104: **
118105: ** + Figures out the number of columns the FTSX table will have, and
118106: ** the number of bytes of space that must be allocated to store copies
118107: ** of the column names.
118108: **
118109: ** + If there is a tokenizer specification included in the arguments,
118110: ** initializes the tokenizer pTokenizer.
118111: */
118112: for(i=3; rc==SQLITE_OK && i<argc; i++){
118113: char const *z = argv[i];
118114: int nKey;
118115: char *zVal;
118116:
118117: /* Check if this is a tokenizer specification */
118118: if( !pTokenizer
118119: && strlen(z)>8
118120: && 0==sqlite3_strnicmp(z, "tokenize", 8)
118121: && 0==sqlite3Fts3IsIdChar(z[8])
118122: ){
118123: rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr);
118124: }
118125:
118126: /* Check if it is an FTS4 special argument. */
118127: else if( isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal) ){
118128: struct Fts4Option {
118129: const char *zOpt;
118130: int nOpt;
118131: } aFts4Opt[] = {
118132: { "matchinfo", 9 }, /* 0 -> MATCHINFO */
118133: { "prefix", 6 }, /* 1 -> PREFIX */
118134: { "compress", 8 }, /* 2 -> COMPRESS */
118135: { "uncompress", 10 }, /* 3 -> UNCOMPRESS */
118136: { "order", 5 }, /* 4 -> ORDER */
1.2.2.1 ! misho 118137: { "content", 7 }, /* 5 -> CONTENT */
! 118138: { "languageid", 10 } /* 6 -> LANGUAGEID */
1.2 misho 118139: };
118140:
118141: int iOpt;
118142: if( !zVal ){
118143: rc = SQLITE_NOMEM;
118144: }else{
118145: for(iOpt=0; iOpt<SizeofArray(aFts4Opt); iOpt++){
118146: struct Fts4Option *pOp = &aFts4Opt[iOpt];
118147: if( nKey==pOp->nOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){
118148: break;
118149: }
118150: }
118151: if( iOpt==SizeofArray(aFts4Opt) ){
118152: *pzErr = sqlite3_mprintf("unrecognized parameter: %s", z);
118153: rc = SQLITE_ERROR;
118154: }else{
118155: switch( iOpt ){
118156: case 0: /* MATCHINFO */
118157: if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){
118158: *pzErr = sqlite3_mprintf("unrecognized matchinfo: %s", zVal);
118159: rc = SQLITE_ERROR;
118160: }
118161: bNoDocsize = 1;
118162: break;
118163:
118164: case 1: /* PREFIX */
118165: sqlite3_free(zPrefix);
118166: zPrefix = zVal;
118167: zVal = 0;
118168: break;
118169:
118170: case 2: /* COMPRESS */
118171: sqlite3_free(zCompress);
118172: zCompress = zVal;
118173: zVal = 0;
118174: break;
118175:
118176: case 3: /* UNCOMPRESS */
118177: sqlite3_free(zUncompress);
118178: zUncompress = zVal;
118179: zVal = 0;
118180: break;
118181:
118182: case 4: /* ORDER */
118183: if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3))
118184: && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4))
118185: ){
118186: *pzErr = sqlite3_mprintf("unrecognized order: %s", zVal);
118187: rc = SQLITE_ERROR;
118188: }
118189: bDescIdx = (zVal[0]=='d' || zVal[0]=='D');
118190: break;
118191:
1.2.2.1 ! misho 118192: case 5: /* CONTENT */
! 118193: sqlite3_free(zContent);
1.2 misho 118194: zContent = zVal;
118195: zVal = 0;
118196: break;
1.2.2.1 ! misho 118197:
! 118198: case 6: /* LANGUAGEID */
! 118199: assert( iOpt==6 );
! 118200: sqlite3_free(zLanguageid);
! 118201: zLanguageid = zVal;
! 118202: zVal = 0;
! 118203: break;
1.2 misho 118204: }
118205: }
118206: sqlite3_free(zVal);
118207: }
118208: }
118209:
118210: /* Otherwise, the argument is a column name. */
118211: else {
118212: nString += (int)(strlen(z) + 1);
118213: aCol[nCol++] = z;
118214: }
118215: }
118216:
118217: /* If a content=xxx option was specified, the following:
118218: **
118219: ** 1. Ignore any compress= and uncompress= options.
118220: **
118221: ** 2. If no column names were specified as part of the CREATE VIRTUAL
118222: ** TABLE statement, use all columns from the content table.
118223: */
118224: if( rc==SQLITE_OK && zContent ){
118225: sqlite3_free(zCompress);
118226: sqlite3_free(zUncompress);
118227: zCompress = 0;
118228: zUncompress = 0;
118229: if( nCol==0 ){
118230: sqlite3_free((void*)aCol);
118231: aCol = 0;
118232: rc = fts3ContentColumns(db, argv[1], zContent, &aCol, &nCol, &nString);
1.2.2.1 ! misho 118233:
! 118234: /* If a languageid= option was specified, remove the language id
! 118235: ** column from the aCol[] array. */
! 118236: if( rc==SQLITE_OK && zLanguageid ){
! 118237: int j;
! 118238: for(j=0; j<nCol; j++){
! 118239: if( sqlite3_stricmp(zLanguageid, aCol[j])==0 ){
! 118240: int k;
! 118241: for(k=j; k<nCol; k++) aCol[k] = aCol[k+1];
! 118242: nCol--;
! 118243: break;
! 118244: }
! 118245: }
! 118246: }
1.2 misho 118247: }
118248: }
118249: if( rc!=SQLITE_OK ) goto fts3_init_out;
118250:
118251: if( nCol==0 ){
118252: assert( nString==0 );
118253: aCol[0] = "content";
118254: nString = 8;
118255: nCol = 1;
118256: }
118257:
118258: if( pTokenizer==0 ){
118259: rc = sqlite3Fts3InitTokenizer(pHash, "simple", &pTokenizer, pzErr);
118260: if( rc!=SQLITE_OK ) goto fts3_init_out;
118261: }
118262: assert( pTokenizer );
118263:
118264: rc = fts3PrefixParameter(zPrefix, &nIndex, &aIndex);
118265: if( rc==SQLITE_ERROR ){
118266: assert( zPrefix );
118267: *pzErr = sqlite3_mprintf("error parsing prefix parameter: %s", zPrefix);
118268: }
118269: if( rc!=SQLITE_OK ) goto fts3_init_out;
118270:
118271: /* Allocate and populate the Fts3Table structure. */
118272: nByte = sizeof(Fts3Table) + /* Fts3Table */
118273: nCol * sizeof(char *) + /* azColumn */
118274: nIndex * sizeof(struct Fts3Index) + /* aIndex */
118275: nName + /* zName */
118276: nDb + /* zDb */
118277: nString; /* Space for azColumn strings */
118278: p = (Fts3Table*)sqlite3_malloc(nByte);
118279: if( p==0 ){
118280: rc = SQLITE_NOMEM;
118281: goto fts3_init_out;
118282: }
118283: memset(p, 0, nByte);
118284: p->db = db;
118285: p->nColumn = nCol;
118286: p->nPendingData = 0;
118287: p->azColumn = (char **)&p[1];
118288: p->pTokenizer = pTokenizer;
118289: p->nMaxPendingData = FTS3_MAX_PENDING_DATA;
118290: p->bHasDocsize = (isFts4 && bNoDocsize==0);
118291: p->bHasStat = isFts4;
1.2.2.1 ! misho 118292: p->bFts4 = isFts4;
1.2 misho 118293: p->bDescIdx = bDescIdx;
1.2.2.1 ! misho 118294: p->bAutoincrmerge = 0xff; /* 0xff means setting unknown */
1.2 misho 118295: p->zContentTbl = zContent;
1.2.2.1 ! misho 118296: p->zLanguageid = zLanguageid;
1.2 misho 118297: zContent = 0;
1.2.2.1 ! misho 118298: zLanguageid = 0;
1.2 misho 118299: TESTONLY( p->inTransaction = -1 );
118300: TESTONLY( p->mxSavepoint = -1 );
118301:
118302: p->aIndex = (struct Fts3Index *)&p->azColumn[nCol];
118303: memcpy(p->aIndex, aIndex, sizeof(struct Fts3Index) * nIndex);
118304: p->nIndex = nIndex;
118305: for(i=0; i<nIndex; i++){
118306: fts3HashInit(&p->aIndex[i].hPending, FTS3_HASH_STRING, 1);
118307: }
118308:
118309: /* Fill in the zName and zDb fields of the vtab structure. */
118310: zCsr = (char *)&p->aIndex[nIndex];
118311: p->zName = zCsr;
118312: memcpy(zCsr, argv[2], nName);
118313: zCsr += nName;
118314: p->zDb = zCsr;
118315: memcpy(zCsr, argv[1], nDb);
118316: zCsr += nDb;
118317:
118318: /* Fill in the azColumn array */
118319: for(iCol=0; iCol<nCol; iCol++){
118320: char *z;
118321: int n = 0;
118322: z = (char *)sqlite3Fts3NextToken(aCol[iCol], &n);
118323: memcpy(zCsr, z, n);
118324: zCsr[n] = '\0';
118325: sqlite3Fts3Dequote(zCsr);
118326: p->azColumn[iCol] = zCsr;
118327: zCsr += n+1;
118328: assert( zCsr <= &((char *)p)[nByte] );
118329: }
118330:
118331: if( (zCompress==0)!=(zUncompress==0) ){
118332: char const *zMiss = (zCompress==0 ? "compress" : "uncompress");
118333: rc = SQLITE_ERROR;
118334: *pzErr = sqlite3_mprintf("missing %s parameter in fts4 constructor", zMiss);
118335: }
118336: p->zReadExprlist = fts3ReadExprList(p, zUncompress, &rc);
118337: p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc);
118338: if( rc!=SQLITE_OK ) goto fts3_init_out;
118339:
118340: /* If this is an xCreate call, create the underlying tables in the
118341: ** database. TODO: For xConnect(), it could verify that said tables exist.
118342: */
118343: if( isCreate ){
118344: rc = fts3CreateTables(p);
118345: }
118346:
1.2.2.1 ! misho 118347: /* Check to see if a legacy fts3 table has been "upgraded" by the
! 118348: ** addition of a %_stat table so that it can use incremental merge.
! 118349: */
! 118350: if( !isFts4 && !isCreate ){
! 118351: int rc2 = SQLITE_OK;
! 118352: fts3DbExec(&rc2, db, "SELECT 1 FROM %Q.'%q_stat' WHERE id=2",
! 118353: p->zDb, p->zName);
! 118354: if( rc2==SQLITE_OK ) p->bHasStat = 1;
! 118355: }
! 118356:
1.2 misho 118357: /* Figure out the page-size for the database. This is required in order to
118358: ** estimate the cost of loading large doclists from the database. */
118359: fts3DatabasePageSize(&rc, p);
118360: p->nNodeSize = p->nPgsz-35;
118361:
118362: /* Declare the table schema to SQLite. */
118363: fts3DeclareVtab(&rc, p);
118364:
118365: fts3_init_out:
118366: sqlite3_free(zPrefix);
118367: sqlite3_free(aIndex);
118368: sqlite3_free(zCompress);
118369: sqlite3_free(zUncompress);
118370: sqlite3_free(zContent);
1.2.2.1 ! misho 118371: sqlite3_free(zLanguageid);
1.2 misho 118372: sqlite3_free((void *)aCol);
118373: if( rc!=SQLITE_OK ){
118374: if( p ){
118375: fts3DisconnectMethod((sqlite3_vtab *)p);
118376: }else if( pTokenizer ){
118377: pTokenizer->pModule->xDestroy(pTokenizer);
118378: }
118379: }else{
118380: assert( p->pSegments==0 );
118381: *ppVTab = &p->base;
118382: }
118383: return rc;
118384: }
118385:
118386: /*
118387: ** The xConnect() and xCreate() methods for the virtual table. All the
118388: ** work is done in function fts3InitVtab().
118389: */
118390: static int fts3ConnectMethod(
118391: sqlite3 *db, /* Database connection */
118392: void *pAux, /* Pointer to tokenizer hash table */
118393: int argc, /* Number of elements in argv array */
118394: const char * const *argv, /* xCreate/xConnect argument array */
118395: sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */
118396: char **pzErr /* OUT: sqlite3_malloc'd error message */
118397: ){
118398: return fts3InitVtab(0, db, pAux, argc, argv, ppVtab, pzErr);
118399: }
118400: static int fts3CreateMethod(
118401: sqlite3 *db, /* Database connection */
118402: void *pAux, /* Pointer to tokenizer hash table */
118403: int argc, /* Number of elements in argv array */
118404: const char * const *argv, /* xCreate/xConnect argument array */
118405: sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */
118406: char **pzErr /* OUT: sqlite3_malloc'd error message */
118407: ){
118408: return fts3InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr);
118409: }
118410:
118411: /*
118412: ** Implementation of the xBestIndex method for FTS3 tables. There
118413: ** are three possible strategies, in order of preference:
118414: **
118415: ** 1. Direct lookup by rowid or docid.
118416: ** 2. Full-text search using a MATCH operator on a non-docid column.
118417: ** 3. Linear scan of %_content table.
118418: */
118419: static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){
118420: Fts3Table *p = (Fts3Table *)pVTab;
118421: int i; /* Iterator variable */
118422: int iCons = -1; /* Index of constraint to use */
1.2.2.1 ! misho 118423: int iLangidCons = -1; /* Index of langid=x constraint, if present */
1.2 misho 118424:
118425: /* By default use a full table scan. This is an expensive option,
118426: ** so search through the constraints to see if a more efficient
118427: ** strategy is possible.
118428: */
118429: pInfo->idxNum = FTS3_FULLSCAN_SEARCH;
118430: pInfo->estimatedCost = 500000;
118431: for(i=0; i<pInfo->nConstraint; i++){
118432: struct sqlite3_index_constraint *pCons = &pInfo->aConstraint[i];
118433: if( pCons->usable==0 ) continue;
118434:
118435: /* A direct lookup on the rowid or docid column. Assign a cost of 1.0. */
1.2.2.1 ! misho 118436: if( iCons<0
! 118437: && pCons->op==SQLITE_INDEX_CONSTRAINT_EQ
1.2 misho 118438: && (pCons->iColumn<0 || pCons->iColumn==p->nColumn+1 )
118439: ){
118440: pInfo->idxNum = FTS3_DOCID_SEARCH;
118441: pInfo->estimatedCost = 1.0;
118442: iCons = i;
118443: }
118444:
118445: /* A MATCH constraint. Use a full-text search.
118446: **
118447: ** If there is more than one MATCH constraint available, use the first
118448: ** one encountered. If there is both a MATCH constraint and a direct
118449: ** rowid/docid lookup, prefer the MATCH strategy. This is done even
118450: ** though the rowid/docid lookup is faster than a MATCH query, selecting
118451: ** it would lead to an "unable to use function MATCH in the requested
118452: ** context" error.
118453: */
118454: if( pCons->op==SQLITE_INDEX_CONSTRAINT_MATCH
118455: && pCons->iColumn>=0 && pCons->iColumn<=p->nColumn
118456: ){
118457: pInfo->idxNum = FTS3_FULLTEXT_SEARCH + pCons->iColumn;
118458: pInfo->estimatedCost = 2.0;
118459: iCons = i;
1.2.2.1 ! misho 118460: }
! 118461:
! 118462: /* Equality constraint on the langid column */
! 118463: if( pCons->op==SQLITE_INDEX_CONSTRAINT_EQ
! 118464: && pCons->iColumn==p->nColumn + 2
! 118465: ){
! 118466: iLangidCons = i;
1.2 misho 118467: }
118468: }
118469:
118470: if( iCons>=0 ){
118471: pInfo->aConstraintUsage[iCons].argvIndex = 1;
118472: pInfo->aConstraintUsage[iCons].omit = 1;
118473: }
1.2.2.1 ! misho 118474: if( iLangidCons>=0 ){
! 118475: pInfo->aConstraintUsage[iLangidCons].argvIndex = 2;
! 118476: }
1.2 misho 118477:
118478: /* Regardless of the strategy selected, FTS can deliver rows in rowid (or
118479: ** docid) order. Both ascending and descending are possible.
118480: */
118481: if( pInfo->nOrderBy==1 ){
118482: struct sqlite3_index_orderby *pOrder = &pInfo->aOrderBy[0];
118483: if( pOrder->iColumn<0 || pOrder->iColumn==p->nColumn+1 ){
118484: if( pOrder->desc ){
118485: pInfo->idxStr = "DESC";
118486: }else{
118487: pInfo->idxStr = "ASC";
118488: }
118489: pInfo->orderByConsumed = 1;
118490: }
118491: }
118492:
118493: assert( p->pSegments==0 );
118494: return SQLITE_OK;
118495: }
118496:
118497: /*
118498: ** Implementation of xOpen method.
118499: */
118500: static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){
118501: sqlite3_vtab_cursor *pCsr; /* Allocated cursor */
118502:
118503: UNUSED_PARAMETER(pVTab);
118504:
118505: /* Allocate a buffer large enough for an Fts3Cursor structure. If the
118506: ** allocation succeeds, zero it and return SQLITE_OK. Otherwise,
118507: ** if the allocation fails, return SQLITE_NOMEM.
118508: */
118509: *ppCsr = pCsr = (sqlite3_vtab_cursor *)sqlite3_malloc(sizeof(Fts3Cursor));
118510: if( !pCsr ){
118511: return SQLITE_NOMEM;
118512: }
118513: memset(pCsr, 0, sizeof(Fts3Cursor));
118514: return SQLITE_OK;
118515: }
118516:
118517: /*
118518: ** Close the cursor. For additional information see the documentation
118519: ** on the xClose method of the virtual table interface.
118520: */
118521: static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){
118522: Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
118523: assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
118524: sqlite3_finalize(pCsr->pStmt);
118525: sqlite3Fts3ExprFree(pCsr->pExpr);
118526: sqlite3Fts3FreeDeferredTokens(pCsr);
118527: sqlite3_free(pCsr->aDoclist);
118528: sqlite3_free(pCsr->aMatchinfo);
118529: assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
118530: sqlite3_free(pCsr);
118531: return SQLITE_OK;
118532: }
118533:
118534: /*
118535: ** If pCsr->pStmt has not been prepared (i.e. if pCsr->pStmt==0), then
118536: ** compose and prepare an SQL statement of the form:
118537: **
118538: ** "SELECT <columns> FROM %_content WHERE rowid = ?"
118539: **
118540: ** (or the equivalent for a content=xxx table) and set pCsr->pStmt to
118541: ** it. If an error occurs, return an SQLite error code.
118542: **
118543: ** Otherwise, set *ppStmt to point to pCsr->pStmt and return SQLITE_OK.
118544: */
118545: static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){
118546: int rc = SQLITE_OK;
118547: if( pCsr->pStmt==0 ){
118548: Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
118549: char *zSql;
118550: zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist);
118551: if( !zSql ) return SQLITE_NOMEM;
118552: rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
118553: sqlite3_free(zSql);
118554: }
118555: *ppStmt = pCsr->pStmt;
118556: return rc;
118557: }
118558:
118559: /*
118560: ** Position the pCsr->pStmt statement so that it is on the row
118561: ** of the %_content table that contains the last match. Return
118562: ** SQLITE_OK on success.
118563: */
118564: static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){
118565: int rc = SQLITE_OK;
118566: if( pCsr->isRequireSeek ){
118567: sqlite3_stmt *pStmt = 0;
118568:
118569: rc = fts3CursorSeekStmt(pCsr, &pStmt);
118570: if( rc==SQLITE_OK ){
118571: sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId);
118572: pCsr->isRequireSeek = 0;
118573: if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){
118574: return SQLITE_OK;
118575: }else{
118576: rc = sqlite3_reset(pCsr->pStmt);
118577: if( rc==SQLITE_OK && ((Fts3Table *)pCsr->base.pVtab)->zContentTbl==0 ){
118578: /* If no row was found and no error has occured, then the %_content
118579: ** table is missing a row that is present in the full-text index.
118580: ** The data structures are corrupt. */
118581: rc = FTS_CORRUPT_VTAB;
118582: pCsr->isEof = 1;
118583: }
118584: }
118585: }
118586: }
118587:
118588: if( rc!=SQLITE_OK && pContext ){
118589: sqlite3_result_error_code(pContext, rc);
118590: }
118591: return rc;
118592: }
118593:
118594: /*
118595: ** This function is used to process a single interior node when searching
118596: ** a b-tree for a term or term prefix. The node data is passed to this
118597: ** function via the zNode/nNode parameters. The term to search for is
118598: ** passed in zTerm/nTerm.
118599: **
118600: ** If piFirst is not NULL, then this function sets *piFirst to the blockid
118601: ** of the child node that heads the sub-tree that may contain the term.
118602: **
118603: ** If piLast is not NULL, then *piLast is set to the right-most child node
118604: ** that heads a sub-tree that may contain a term for which zTerm/nTerm is
118605: ** a prefix.
118606: **
118607: ** If an OOM error occurs, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
118608: */
118609: static int fts3ScanInteriorNode(
118610: const char *zTerm, /* Term to select leaves for */
118611: int nTerm, /* Size of term zTerm in bytes */
118612: const char *zNode, /* Buffer containing segment interior node */
118613: int nNode, /* Size of buffer at zNode */
118614: sqlite3_int64 *piFirst, /* OUT: Selected child node */
118615: sqlite3_int64 *piLast /* OUT: Selected child node */
118616: ){
118617: int rc = SQLITE_OK; /* Return code */
118618: const char *zCsr = zNode; /* Cursor to iterate through node */
118619: const char *zEnd = &zCsr[nNode];/* End of interior node buffer */
118620: char *zBuffer = 0; /* Buffer to load terms into */
118621: int nAlloc = 0; /* Size of allocated buffer */
118622: int isFirstTerm = 1; /* True when processing first term on page */
118623: sqlite3_int64 iChild; /* Block id of child node to descend to */
118624:
118625: /* Skip over the 'height' varint that occurs at the start of every
118626: ** interior node. Then load the blockid of the left-child of the b-tree
118627: ** node into variable iChild.
118628: **
118629: ** Even if the data structure on disk is corrupted, this (reading two
118630: ** varints from the buffer) does not risk an overread. If zNode is a
118631: ** root node, then the buffer comes from a SELECT statement. SQLite does
118632: ** not make this guarantee explicitly, but in practice there are always
118633: ** either more than 20 bytes of allocated space following the nNode bytes of
118634: ** contents, or two zero bytes. Or, if the node is read from the %_segments
118635: ** table, then there are always 20 bytes of zeroed padding following the
118636: ** nNode bytes of content (see sqlite3Fts3ReadBlock() for details).
118637: */
118638: zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
118639: zCsr += sqlite3Fts3GetVarint(zCsr, &iChild);
118640: if( zCsr>zEnd ){
118641: return FTS_CORRUPT_VTAB;
118642: }
118643:
118644: while( zCsr<zEnd && (piFirst || piLast) ){
118645: int cmp; /* memcmp() result */
118646: int nSuffix; /* Size of term suffix */
118647: int nPrefix = 0; /* Size of term prefix */
118648: int nBuffer; /* Total term size */
118649:
118650: /* Load the next term on the node into zBuffer. Use realloc() to expand
118651: ** the size of zBuffer if required. */
118652: if( !isFirstTerm ){
118653: zCsr += sqlite3Fts3GetVarint32(zCsr, &nPrefix);
118654: }
118655: isFirstTerm = 0;
118656: zCsr += sqlite3Fts3GetVarint32(zCsr, &nSuffix);
118657:
118658: if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){
118659: rc = FTS_CORRUPT_VTAB;
118660: goto finish_scan;
118661: }
118662: if( nPrefix+nSuffix>nAlloc ){
118663: char *zNew;
118664: nAlloc = (nPrefix+nSuffix) * 2;
118665: zNew = (char *)sqlite3_realloc(zBuffer, nAlloc);
118666: if( !zNew ){
118667: rc = SQLITE_NOMEM;
118668: goto finish_scan;
118669: }
118670: zBuffer = zNew;
118671: }
118672: assert( zBuffer );
118673: memcpy(&zBuffer[nPrefix], zCsr, nSuffix);
118674: nBuffer = nPrefix + nSuffix;
118675: zCsr += nSuffix;
118676:
118677: /* Compare the term we are searching for with the term just loaded from
118678: ** the interior node. If the specified term is greater than or equal
118679: ** to the term from the interior node, then all terms on the sub-tree
118680: ** headed by node iChild are smaller than zTerm. No need to search
118681: ** iChild.
118682: **
118683: ** If the interior node term is larger than the specified term, then
118684: ** the tree headed by iChild may contain the specified term.
118685: */
118686: cmp = memcmp(zTerm, zBuffer, (nBuffer>nTerm ? nTerm : nBuffer));
118687: if( piFirst && (cmp<0 || (cmp==0 && nBuffer>nTerm)) ){
118688: *piFirst = iChild;
118689: piFirst = 0;
118690: }
118691:
118692: if( piLast && cmp<0 ){
118693: *piLast = iChild;
118694: piLast = 0;
118695: }
118696:
118697: iChild++;
118698: };
118699:
118700: if( piFirst ) *piFirst = iChild;
118701: if( piLast ) *piLast = iChild;
118702:
118703: finish_scan:
118704: sqlite3_free(zBuffer);
118705: return rc;
118706: }
118707:
118708:
118709: /*
118710: ** The buffer pointed to by argument zNode (size nNode bytes) contains an
118711: ** interior node of a b-tree segment. The zTerm buffer (size nTerm bytes)
118712: ** contains a term. This function searches the sub-tree headed by the zNode
118713: ** node for the range of leaf nodes that may contain the specified term
118714: ** or terms for which the specified term is a prefix.
118715: **
118716: ** If piLeaf is not NULL, then *piLeaf is set to the blockid of the
118717: ** left-most leaf node in the tree that may contain the specified term.
118718: ** If piLeaf2 is not NULL, then *piLeaf2 is set to the blockid of the
118719: ** right-most leaf node that may contain a term for which the specified
118720: ** term is a prefix.
118721: **
118722: ** It is possible that the range of returned leaf nodes does not contain
118723: ** the specified term or any terms for which it is a prefix. However, if the
118724: ** segment does contain any such terms, they are stored within the identified
118725: ** range. Because this function only inspects interior segment nodes (and
118726: ** never loads leaf nodes into memory), it is not possible to be sure.
118727: **
118728: ** If an error occurs, an error code other than SQLITE_OK is returned.
118729: */
118730: static int fts3SelectLeaf(
118731: Fts3Table *p, /* Virtual table handle */
118732: const char *zTerm, /* Term to select leaves for */
118733: int nTerm, /* Size of term zTerm in bytes */
118734: const char *zNode, /* Buffer containing segment interior node */
118735: int nNode, /* Size of buffer at zNode */
118736: sqlite3_int64 *piLeaf, /* Selected leaf node */
118737: sqlite3_int64 *piLeaf2 /* Selected leaf node */
118738: ){
118739: int rc; /* Return code */
118740: int iHeight; /* Height of this node in tree */
118741:
118742: assert( piLeaf || piLeaf2 );
118743:
118744: sqlite3Fts3GetVarint32(zNode, &iHeight);
118745: rc = fts3ScanInteriorNode(zTerm, nTerm, zNode, nNode, piLeaf, piLeaf2);
118746: assert( !piLeaf2 || !piLeaf || rc!=SQLITE_OK || (*piLeaf<=*piLeaf2) );
118747:
118748: if( rc==SQLITE_OK && iHeight>1 ){
118749: char *zBlob = 0; /* Blob read from %_segments table */
118750: int nBlob; /* Size of zBlob in bytes */
118751:
118752: if( piLeaf && piLeaf2 && (*piLeaf!=*piLeaf2) ){
118753: rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0);
118754: if( rc==SQLITE_OK ){
118755: rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0);
118756: }
118757: sqlite3_free(zBlob);
118758: piLeaf = 0;
118759: zBlob = 0;
118760: }
118761:
118762: if( rc==SQLITE_OK ){
118763: rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0);
118764: }
118765: if( rc==SQLITE_OK ){
118766: rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2);
118767: }
118768: sqlite3_free(zBlob);
118769: }
118770:
118771: return rc;
118772: }
118773:
118774: /*
118775: ** This function is used to create delta-encoded serialized lists of FTS3
118776: ** varints. Each call to this function appends a single varint to a list.
118777: */
118778: static void fts3PutDeltaVarint(
118779: char **pp, /* IN/OUT: Output pointer */
118780: sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */
118781: sqlite3_int64 iVal /* Write this value to the list */
118782: ){
118783: assert( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
118784: *pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev);
118785: *piPrev = iVal;
118786: }
118787:
118788: /*
118789: ** When this function is called, *ppPoslist is assumed to point to the
118790: ** start of a position-list. After it returns, *ppPoslist points to the
118791: ** first byte after the position-list.
118792: **
118793: ** A position list is list of positions (delta encoded) and columns for
118794: ** a single document record of a doclist. So, in other words, this
118795: ** routine advances *ppPoslist so that it points to the next docid in
118796: ** the doclist, or to the first byte past the end of the doclist.
118797: **
118798: ** If pp is not NULL, then the contents of the position list are copied
118799: ** to *pp. *pp is set to point to the first byte past the last byte copied
118800: ** before this function returns.
118801: */
118802: static void fts3PoslistCopy(char **pp, char **ppPoslist){
118803: char *pEnd = *ppPoslist;
118804: char c = 0;
118805:
118806: /* The end of a position list is marked by a zero encoded as an FTS3
118807: ** varint. A single POS_END (0) byte. Except, if the 0 byte is preceded by
118808: ** a byte with the 0x80 bit set, then it is not a varint 0, but the tail
118809: ** of some other, multi-byte, value.
118810: **
118811: ** The following while-loop moves pEnd to point to the first byte that is not
118812: ** immediately preceded by a byte with the 0x80 bit set. Then increments
118813: ** pEnd once more so that it points to the byte immediately following the
118814: ** last byte in the position-list.
118815: */
118816: while( *pEnd | c ){
118817: c = *pEnd++ & 0x80;
118818: testcase( c!=0 && (*pEnd)==0 );
118819: }
118820: pEnd++; /* Advance past the POS_END terminator byte */
118821:
118822: if( pp ){
118823: int n = (int)(pEnd - *ppPoslist);
118824: char *p = *pp;
118825: memcpy(p, *ppPoslist, n);
118826: p += n;
118827: *pp = p;
118828: }
118829: *ppPoslist = pEnd;
118830: }
118831:
118832: /*
118833: ** When this function is called, *ppPoslist is assumed to point to the
118834: ** start of a column-list. After it returns, *ppPoslist points to the
118835: ** to the terminator (POS_COLUMN or POS_END) byte of the column-list.
118836: **
118837: ** A column-list is list of delta-encoded positions for a single column
118838: ** within a single document within a doclist.
118839: **
118840: ** The column-list is terminated either by a POS_COLUMN varint (1) or
118841: ** a POS_END varint (0). This routine leaves *ppPoslist pointing to
118842: ** the POS_COLUMN or POS_END that terminates the column-list.
118843: **
118844: ** If pp is not NULL, then the contents of the column-list are copied
118845: ** to *pp. *pp is set to point to the first byte past the last byte copied
118846: ** before this function returns. The POS_COLUMN or POS_END terminator
118847: ** is not copied into *pp.
118848: */
118849: static void fts3ColumnlistCopy(char **pp, char **ppPoslist){
118850: char *pEnd = *ppPoslist;
118851: char c = 0;
118852:
118853: /* A column-list is terminated by either a 0x01 or 0x00 byte that is
118854: ** not part of a multi-byte varint.
118855: */
118856: while( 0xFE & (*pEnd | c) ){
118857: c = *pEnd++ & 0x80;
118858: testcase( c!=0 && ((*pEnd)&0xfe)==0 );
118859: }
118860: if( pp ){
118861: int n = (int)(pEnd - *ppPoslist);
118862: char *p = *pp;
118863: memcpy(p, *ppPoslist, n);
118864: p += n;
118865: *pp = p;
118866: }
118867: *ppPoslist = pEnd;
118868: }
118869:
118870: /*
118871: ** Value used to signify the end of an position-list. This is safe because
118872: ** it is not possible to have a document with 2^31 terms.
118873: */
118874: #define POSITION_LIST_END 0x7fffffff
118875:
118876: /*
118877: ** This function is used to help parse position-lists. When this function is
118878: ** called, *pp may point to the start of the next varint in the position-list
118879: ** being parsed, or it may point to 1 byte past the end of the position-list
118880: ** (in which case **pp will be a terminator bytes POS_END (0) or
118881: ** (1)).
118882: **
118883: ** If *pp points past the end of the current position-list, set *pi to
118884: ** POSITION_LIST_END and return. Otherwise, read the next varint from *pp,
118885: ** increment the current value of *pi by the value read, and set *pp to
118886: ** point to the next value before returning.
118887: **
118888: ** Before calling this routine *pi must be initialized to the value of
118889: ** the previous position, or zero if we are reading the first position
118890: ** in the position-list. Because positions are delta-encoded, the value
118891: ** of the previous position is needed in order to compute the value of
118892: ** the next position.
118893: */
118894: static void fts3ReadNextPos(
118895: char **pp, /* IN/OUT: Pointer into position-list buffer */
118896: sqlite3_int64 *pi /* IN/OUT: Value read from position-list */
118897: ){
118898: if( (**pp)&0xFE ){
118899: fts3GetDeltaVarint(pp, pi);
118900: *pi -= 2;
118901: }else{
118902: *pi = POSITION_LIST_END;
118903: }
118904: }
118905:
118906: /*
118907: ** If parameter iCol is not 0, write an POS_COLUMN (1) byte followed by
118908: ** the value of iCol encoded as a varint to *pp. This will start a new
118909: ** column list.
118910: **
118911: ** Set *pp to point to the byte just after the last byte written before
118912: ** returning (do not modify it if iCol==0). Return the total number of bytes
118913: ** written (0 if iCol==0).
118914: */
118915: static int fts3PutColNumber(char **pp, int iCol){
118916: int n = 0; /* Number of bytes written */
118917: if( iCol ){
118918: char *p = *pp; /* Output pointer */
118919: n = 1 + sqlite3Fts3PutVarint(&p[1], iCol);
118920: *p = 0x01;
118921: *pp = &p[n];
118922: }
118923: return n;
118924: }
118925:
118926: /*
118927: ** Compute the union of two position lists. The output written
118928: ** into *pp contains all positions of both *pp1 and *pp2 in sorted
118929: ** order and with any duplicates removed. All pointers are
118930: ** updated appropriately. The caller is responsible for insuring
118931: ** that there is enough space in *pp to hold the complete output.
118932: */
118933: static void fts3PoslistMerge(
118934: char **pp, /* Output buffer */
118935: char **pp1, /* Left input list */
118936: char **pp2 /* Right input list */
118937: ){
118938: char *p = *pp;
118939: char *p1 = *pp1;
118940: char *p2 = *pp2;
118941:
118942: while( *p1 || *p2 ){
118943: int iCol1; /* The current column index in pp1 */
118944: int iCol2; /* The current column index in pp2 */
118945:
118946: if( *p1==POS_COLUMN ) sqlite3Fts3GetVarint32(&p1[1], &iCol1);
118947: else if( *p1==POS_END ) iCol1 = POSITION_LIST_END;
118948: else iCol1 = 0;
118949:
118950: if( *p2==POS_COLUMN ) sqlite3Fts3GetVarint32(&p2[1], &iCol2);
118951: else if( *p2==POS_END ) iCol2 = POSITION_LIST_END;
118952: else iCol2 = 0;
118953:
118954: if( iCol1==iCol2 ){
118955: sqlite3_int64 i1 = 0; /* Last position from pp1 */
118956: sqlite3_int64 i2 = 0; /* Last position from pp2 */
118957: sqlite3_int64 iPrev = 0;
118958: int n = fts3PutColNumber(&p, iCol1);
118959: p1 += n;
118960: p2 += n;
118961:
118962: /* At this point, both p1 and p2 point to the start of column-lists
118963: ** for the same column (the column with index iCol1 and iCol2).
118964: ** A column-list is a list of non-negative delta-encoded varints, each
118965: ** incremented by 2 before being stored. Each list is terminated by a
118966: ** POS_END (0) or POS_COLUMN (1). The following block merges the two lists
118967: ** and writes the results to buffer p. p is left pointing to the byte
118968: ** after the list written. No terminator (POS_END or POS_COLUMN) is
118969: ** written to the output.
118970: */
118971: fts3GetDeltaVarint(&p1, &i1);
118972: fts3GetDeltaVarint(&p2, &i2);
118973: do {
118974: fts3PutDeltaVarint(&p, &iPrev, (i1<i2) ? i1 : i2);
118975: iPrev -= 2;
118976: if( i1==i2 ){
118977: fts3ReadNextPos(&p1, &i1);
118978: fts3ReadNextPos(&p2, &i2);
118979: }else if( i1<i2 ){
118980: fts3ReadNextPos(&p1, &i1);
118981: }else{
118982: fts3ReadNextPos(&p2, &i2);
118983: }
118984: }while( i1!=POSITION_LIST_END || i2!=POSITION_LIST_END );
118985: }else if( iCol1<iCol2 ){
118986: p1 += fts3PutColNumber(&p, iCol1);
118987: fts3ColumnlistCopy(&p, &p1);
118988: }else{
118989: p2 += fts3PutColNumber(&p, iCol2);
118990: fts3ColumnlistCopy(&p, &p2);
118991: }
118992: }
118993:
118994: *p++ = POS_END;
118995: *pp = p;
118996: *pp1 = p1 + 1;
118997: *pp2 = p2 + 1;
118998: }
118999:
119000: /*
119001: ** This function is used to merge two position lists into one. When it is
119002: ** called, *pp1 and *pp2 must both point to position lists. A position-list is
119003: ** the part of a doclist that follows each document id. For example, if a row
119004: ** contains:
119005: **
119006: ** 'a b c'|'x y z'|'a b b a'
119007: **
119008: ** Then the position list for this row for token 'b' would consist of:
119009: **
119010: ** 0x02 0x01 0x02 0x03 0x03 0x00
119011: **
119012: ** When this function returns, both *pp1 and *pp2 are left pointing to the
119013: ** byte following the 0x00 terminator of their respective position lists.
119014: **
119015: ** If isSaveLeft is 0, an entry is added to the output position list for
119016: ** each position in *pp2 for which there exists one or more positions in
119017: ** *pp1 so that (pos(*pp2)>pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e.
119018: ** when the *pp1 token appears before the *pp2 token, but not more than nToken
119019: ** slots before it.
119020: **
119021: ** e.g. nToken==1 searches for adjacent positions.
119022: */
119023: static int fts3PoslistPhraseMerge(
119024: char **pp, /* IN/OUT: Preallocated output buffer */
119025: int nToken, /* Maximum difference in token positions */
119026: int isSaveLeft, /* Save the left position */
119027: int isExact, /* If *pp1 is exactly nTokens before *pp2 */
119028: char **pp1, /* IN/OUT: Left input list */
119029: char **pp2 /* IN/OUT: Right input list */
119030: ){
119031: char *p = *pp;
119032: char *p1 = *pp1;
119033: char *p2 = *pp2;
119034: int iCol1 = 0;
119035: int iCol2 = 0;
119036:
119037: /* Never set both isSaveLeft and isExact for the same invocation. */
119038: assert( isSaveLeft==0 || isExact==0 );
119039:
119040: assert( p!=0 && *p1!=0 && *p2!=0 );
119041: if( *p1==POS_COLUMN ){
119042: p1++;
119043: p1 += sqlite3Fts3GetVarint32(p1, &iCol1);
119044: }
119045: if( *p2==POS_COLUMN ){
119046: p2++;
119047: p2 += sqlite3Fts3GetVarint32(p2, &iCol2);
119048: }
119049:
119050: while( 1 ){
119051: if( iCol1==iCol2 ){
119052: char *pSave = p;
119053: sqlite3_int64 iPrev = 0;
119054: sqlite3_int64 iPos1 = 0;
119055: sqlite3_int64 iPos2 = 0;
119056:
119057: if( iCol1 ){
119058: *p++ = POS_COLUMN;
119059: p += sqlite3Fts3PutVarint(p, iCol1);
119060: }
119061:
119062: assert( *p1!=POS_END && *p1!=POS_COLUMN );
119063: assert( *p2!=POS_END && *p2!=POS_COLUMN );
119064: fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2;
119065: fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2;
119066:
119067: while( 1 ){
119068: if( iPos2==iPos1+nToken
119069: || (isExact==0 && iPos2>iPos1 && iPos2<=iPos1+nToken)
119070: ){
119071: sqlite3_int64 iSave;
119072: iSave = isSaveLeft ? iPos1 : iPos2;
119073: fts3PutDeltaVarint(&p, &iPrev, iSave+2); iPrev -= 2;
119074: pSave = 0;
119075: assert( p );
119076: }
119077: if( (!isSaveLeft && iPos2<=(iPos1+nToken)) || iPos2<=iPos1 ){
119078: if( (*p2&0xFE)==0 ) break;
119079: fts3GetDeltaVarint(&p2, &iPos2); iPos2 -= 2;
119080: }else{
119081: if( (*p1&0xFE)==0 ) break;
119082: fts3GetDeltaVarint(&p1, &iPos1); iPos1 -= 2;
119083: }
119084: }
119085:
119086: if( pSave ){
119087: assert( pp && p );
119088: p = pSave;
119089: }
119090:
119091: fts3ColumnlistCopy(0, &p1);
119092: fts3ColumnlistCopy(0, &p2);
119093: assert( (*p1&0xFE)==0 && (*p2&0xFE)==0 );
119094: if( 0==*p1 || 0==*p2 ) break;
119095:
119096: p1++;
119097: p1 += sqlite3Fts3GetVarint32(p1, &iCol1);
119098: p2++;
119099: p2 += sqlite3Fts3GetVarint32(p2, &iCol2);
119100: }
119101:
119102: /* Advance pointer p1 or p2 (whichever corresponds to the smaller of
119103: ** iCol1 and iCol2) so that it points to either the 0x00 that marks the
119104: ** end of the position list, or the 0x01 that precedes the next
119105: ** column-number in the position list.
119106: */
119107: else if( iCol1<iCol2 ){
119108: fts3ColumnlistCopy(0, &p1);
119109: if( 0==*p1 ) break;
119110: p1++;
119111: p1 += sqlite3Fts3GetVarint32(p1, &iCol1);
119112: }else{
119113: fts3ColumnlistCopy(0, &p2);
119114: if( 0==*p2 ) break;
119115: p2++;
119116: p2 += sqlite3Fts3GetVarint32(p2, &iCol2);
119117: }
119118: }
119119:
119120: fts3PoslistCopy(0, &p2);
119121: fts3PoslistCopy(0, &p1);
119122: *pp1 = p1;
119123: *pp2 = p2;
119124: if( *pp==p ){
119125: return 0;
119126: }
119127: *p++ = 0x00;
119128: *pp = p;
119129: return 1;
119130: }
119131:
119132: /*
119133: ** Merge two position-lists as required by the NEAR operator. The argument
119134: ** position lists correspond to the left and right phrases of an expression
119135: ** like:
119136: **
119137: ** "phrase 1" NEAR "phrase number 2"
119138: **
119139: ** Position list *pp1 corresponds to the left-hand side of the NEAR
119140: ** expression and *pp2 to the right. As usual, the indexes in the position
119141: ** lists are the offsets of the last token in each phrase (tokens "1" and "2"
119142: ** in the example above).
119143: **
119144: ** The output position list - written to *pp - is a copy of *pp2 with those
119145: ** entries that are not sufficiently NEAR entries in *pp1 removed.
119146: */
119147: static int fts3PoslistNearMerge(
119148: char **pp, /* Output buffer */
119149: char *aTmp, /* Temporary buffer space */
119150: int nRight, /* Maximum difference in token positions */
119151: int nLeft, /* Maximum difference in token positions */
119152: char **pp1, /* IN/OUT: Left input list */
119153: char **pp2 /* IN/OUT: Right input list */
119154: ){
119155: char *p1 = *pp1;
119156: char *p2 = *pp2;
119157:
119158: char *pTmp1 = aTmp;
119159: char *pTmp2;
119160: char *aTmp2;
119161: int res = 1;
119162:
119163: fts3PoslistPhraseMerge(&pTmp1, nRight, 0, 0, pp1, pp2);
119164: aTmp2 = pTmp2 = pTmp1;
119165: *pp1 = p1;
119166: *pp2 = p2;
119167: fts3PoslistPhraseMerge(&pTmp2, nLeft, 1, 0, pp2, pp1);
119168: if( pTmp1!=aTmp && pTmp2!=aTmp2 ){
119169: fts3PoslistMerge(pp, &aTmp, &aTmp2);
119170: }else if( pTmp1!=aTmp ){
119171: fts3PoslistCopy(pp, &aTmp);
119172: }else if( pTmp2!=aTmp2 ){
119173: fts3PoslistCopy(pp, &aTmp2);
119174: }else{
119175: res = 0;
119176: }
119177:
119178: return res;
119179: }
119180:
119181: /*
119182: ** An instance of this function is used to merge together the (potentially
119183: ** large number of) doclists for each term that matches a prefix query.
119184: ** See function fts3TermSelectMerge() for details.
119185: */
119186: typedef struct TermSelect TermSelect;
119187: struct TermSelect {
119188: char *aaOutput[16]; /* Malloc'd output buffers */
119189: int anOutput[16]; /* Size each output buffer in bytes */
119190: };
119191:
119192: /*
119193: ** This function is used to read a single varint from a buffer. Parameter
119194: ** pEnd points 1 byte past the end of the buffer. When this function is
119195: ** called, if *pp points to pEnd or greater, then the end of the buffer
119196: ** has been reached. In this case *pp is set to 0 and the function returns.
119197: **
119198: ** If *pp does not point to or past pEnd, then a single varint is read
119199: ** from *pp. *pp is then set to point 1 byte past the end of the read varint.
119200: **
119201: ** If bDescIdx is false, the value read is added to *pVal before returning.
119202: ** If it is true, the value read is subtracted from *pVal before this
119203: ** function returns.
119204: */
119205: static void fts3GetDeltaVarint3(
119206: char **pp, /* IN/OUT: Point to read varint from */
119207: char *pEnd, /* End of buffer */
119208: int bDescIdx, /* True if docids are descending */
119209: sqlite3_int64 *pVal /* IN/OUT: Integer value */
119210: ){
119211: if( *pp>=pEnd ){
119212: *pp = 0;
119213: }else{
119214: sqlite3_int64 iVal;
119215: *pp += sqlite3Fts3GetVarint(*pp, &iVal);
119216: if( bDescIdx ){
119217: *pVal -= iVal;
119218: }else{
119219: *pVal += iVal;
119220: }
119221: }
119222: }
119223:
119224: /*
119225: ** This function is used to write a single varint to a buffer. The varint
119226: ** is written to *pp. Before returning, *pp is set to point 1 byte past the
119227: ** end of the value written.
119228: **
119229: ** If *pbFirst is zero when this function is called, the value written to
119230: ** the buffer is that of parameter iVal.
119231: **
119232: ** If *pbFirst is non-zero when this function is called, then the value
119233: ** written is either (iVal-*piPrev) (if bDescIdx is zero) or (*piPrev-iVal)
119234: ** (if bDescIdx is non-zero).
119235: **
119236: ** Before returning, this function always sets *pbFirst to 1 and *piPrev
119237: ** to the value of parameter iVal.
119238: */
119239: static void fts3PutDeltaVarint3(
119240: char **pp, /* IN/OUT: Output pointer */
119241: int bDescIdx, /* True for descending docids */
119242: sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */
119243: int *pbFirst, /* IN/OUT: True after first int written */
119244: sqlite3_int64 iVal /* Write this value to the list */
119245: ){
119246: sqlite3_int64 iWrite;
119247: if( bDescIdx==0 || *pbFirst==0 ){
119248: iWrite = iVal - *piPrev;
119249: }else{
119250: iWrite = *piPrev - iVal;
119251: }
119252: assert( *pbFirst || *piPrev==0 );
119253: assert( *pbFirst==0 || iWrite>0 );
119254: *pp += sqlite3Fts3PutVarint(*pp, iWrite);
119255: *piPrev = iVal;
119256: *pbFirst = 1;
119257: }
119258:
119259:
119260: /*
119261: ** This macro is used by various functions that merge doclists. The two
119262: ** arguments are 64-bit docid values. If the value of the stack variable
119263: ** bDescDoclist is 0 when this macro is invoked, then it returns (i1-i2).
119264: ** Otherwise, (i2-i1).
119265: **
119266: ** Using this makes it easier to write code that can merge doclists that are
119267: ** sorted in either ascending or descending order.
119268: */
119269: #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1-i2))
119270:
119271: /*
119272: ** This function does an "OR" merge of two doclists (output contains all
119273: ** positions contained in either argument doclist). If the docids in the
119274: ** input doclists are sorted in ascending order, parameter bDescDoclist
119275: ** should be false. If they are sorted in ascending order, it should be
119276: ** passed a non-zero value.
119277: **
119278: ** If no error occurs, *paOut is set to point at an sqlite3_malloc'd buffer
119279: ** containing the output doclist and SQLITE_OK is returned. In this case
119280: ** *pnOut is set to the number of bytes in the output doclist.
119281: **
119282: ** If an error occurs, an SQLite error code is returned. The output values
119283: ** are undefined in this case.
119284: */
119285: static int fts3DoclistOrMerge(
119286: int bDescDoclist, /* True if arguments are desc */
119287: char *a1, int n1, /* First doclist */
119288: char *a2, int n2, /* Second doclist */
119289: char **paOut, int *pnOut /* OUT: Malloc'd doclist */
119290: ){
119291: sqlite3_int64 i1 = 0;
119292: sqlite3_int64 i2 = 0;
119293: sqlite3_int64 iPrev = 0;
119294: char *pEnd1 = &a1[n1];
119295: char *pEnd2 = &a2[n2];
119296: char *p1 = a1;
119297: char *p2 = a2;
119298: char *p;
119299: char *aOut;
119300: int bFirstOut = 0;
119301:
119302: *paOut = 0;
119303: *pnOut = 0;
119304:
119305: /* Allocate space for the output. Both the input and output doclists
119306: ** are delta encoded. If they are in ascending order (bDescDoclist==0),
119307: ** then the first docid in each list is simply encoded as a varint. For
119308: ** each subsequent docid, the varint stored is the difference between the
119309: ** current and previous docid (a positive number - since the list is in
119310: ** ascending order).
119311: **
119312: ** The first docid written to the output is therefore encoded using the
119313: ** same number of bytes as it is in whichever of the input lists it is
119314: ** read from. And each subsequent docid read from the same input list
119315: ** consumes either the same or less bytes as it did in the input (since
119316: ** the difference between it and the previous value in the output must
119317: ** be a positive value less than or equal to the delta value read from
119318: ** the input list). The same argument applies to all but the first docid
119319: ** read from the 'other' list. And to the contents of all position lists
119320: ** that will be copied and merged from the input to the output.
119321: **
119322: ** However, if the first docid copied to the output is a negative number,
119323: ** then the encoding of the first docid from the 'other' input list may
119324: ** be larger in the output than it was in the input (since the delta value
119325: ** may be a larger positive integer than the actual docid).
119326: **
119327: ** The space required to store the output is therefore the sum of the
119328: ** sizes of the two inputs, plus enough space for exactly one of the input
119329: ** docids to grow.
119330: **
119331: ** A symetric argument may be made if the doclists are in descending
119332: ** order.
119333: */
119334: aOut = sqlite3_malloc(n1+n2+FTS3_VARINT_MAX-1);
119335: if( !aOut ) return SQLITE_NOMEM;
119336:
119337: p = aOut;
119338: fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
119339: fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
119340: while( p1 || p2 ){
119341: sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
119342:
119343: if( p2 && p1 && iDiff==0 ){
119344: fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
119345: fts3PoslistMerge(&p, &p1, &p2);
119346: fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
119347: fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
119348: }else if( !p2 || (p1 && iDiff<0) ){
119349: fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
119350: fts3PoslistCopy(&p, &p1);
119351: fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
119352: }else{
119353: fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i2);
119354: fts3PoslistCopy(&p, &p2);
119355: fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
119356: }
119357: }
119358:
119359: *paOut = aOut;
1.2.2.1 ! misho 119360: *pnOut = (int)(p-aOut);
1.2 misho 119361: assert( *pnOut<=n1+n2+FTS3_VARINT_MAX-1 );
119362: return SQLITE_OK;
119363: }
119364:
119365: /*
119366: ** This function does a "phrase" merge of two doclists. In a phrase merge,
119367: ** the output contains a copy of each position from the right-hand input
119368: ** doclist for which there is a position in the left-hand input doclist
119369: ** exactly nDist tokens before it.
119370: **
119371: ** If the docids in the input doclists are sorted in ascending order,
119372: ** parameter bDescDoclist should be false. If they are sorted in ascending
119373: ** order, it should be passed a non-zero value.
119374: **
119375: ** The right-hand input doclist is overwritten by this function.
119376: */
119377: static void fts3DoclistPhraseMerge(
119378: int bDescDoclist, /* True if arguments are desc */
119379: int nDist, /* Distance from left to right (1=adjacent) */
119380: char *aLeft, int nLeft, /* Left doclist */
119381: char *aRight, int *pnRight /* IN/OUT: Right/output doclist */
119382: ){
119383: sqlite3_int64 i1 = 0;
119384: sqlite3_int64 i2 = 0;
119385: sqlite3_int64 iPrev = 0;
119386: char *pEnd1 = &aLeft[nLeft];
119387: char *pEnd2 = &aRight[*pnRight];
119388: char *p1 = aLeft;
119389: char *p2 = aRight;
119390: char *p;
119391: int bFirstOut = 0;
119392: char *aOut = aRight;
119393:
119394: assert( nDist>0 );
119395:
119396: p = aOut;
119397: fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
119398: fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
119399:
119400: while( p1 && p2 ){
119401: sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
119402: if( iDiff==0 ){
119403: char *pSave = p;
119404: sqlite3_int64 iPrevSave = iPrev;
119405: int bFirstOutSave = bFirstOut;
119406:
119407: fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
119408: if( 0==fts3PoslistPhraseMerge(&p, nDist, 0, 1, &p1, &p2) ){
119409: p = pSave;
119410: iPrev = iPrevSave;
119411: bFirstOut = bFirstOutSave;
119412: }
119413: fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
119414: fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
119415: }else if( iDiff<0 ){
119416: fts3PoslistCopy(0, &p1);
119417: fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
119418: }else{
119419: fts3PoslistCopy(0, &p2);
119420: fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
119421: }
119422: }
119423:
1.2.2.1 ! misho 119424: *pnRight = (int)(p - aOut);
1.2 misho 119425: }
119426:
119427: /*
119428: ** Argument pList points to a position list nList bytes in size. This
119429: ** function checks to see if the position list contains any entries for
119430: ** a token in position 0 (of any column). If so, it writes argument iDelta
119431: ** to the output buffer pOut, followed by a position list consisting only
119432: ** of the entries from pList at position 0, and terminated by an 0x00 byte.
119433: ** The value returned is the number of bytes written to pOut (if any).
119434: */
119435: SQLITE_PRIVATE int sqlite3Fts3FirstFilter(
119436: sqlite3_int64 iDelta, /* Varint that may be written to pOut */
119437: char *pList, /* Position list (no 0x00 term) */
119438: int nList, /* Size of pList in bytes */
119439: char *pOut /* Write output here */
119440: ){
119441: int nOut = 0;
119442: int bWritten = 0; /* True once iDelta has been written */
119443: char *p = pList;
119444: char *pEnd = &pList[nList];
119445:
119446: if( *p!=0x01 ){
119447: if( *p==0x02 ){
119448: nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta);
119449: pOut[nOut++] = 0x02;
119450: bWritten = 1;
119451: }
119452: fts3ColumnlistCopy(0, &p);
119453: }
119454:
119455: while( p<pEnd && *p==0x01 ){
119456: sqlite3_int64 iCol;
119457: p++;
119458: p += sqlite3Fts3GetVarint(p, &iCol);
119459: if( *p==0x02 ){
119460: if( bWritten==0 ){
119461: nOut += sqlite3Fts3PutVarint(&pOut[nOut], iDelta);
119462: bWritten = 1;
119463: }
119464: pOut[nOut++] = 0x01;
119465: nOut += sqlite3Fts3PutVarint(&pOut[nOut], iCol);
119466: pOut[nOut++] = 0x02;
119467: }
119468: fts3ColumnlistCopy(0, &p);
119469: }
119470: if( bWritten ){
119471: pOut[nOut++] = 0x00;
119472: }
119473:
119474: return nOut;
119475: }
119476:
119477:
119478: /*
119479: ** Merge all doclists in the TermSelect.aaOutput[] array into a single
119480: ** doclist stored in TermSelect.aaOutput[0]. If successful, delete all
119481: ** other doclists (except the aaOutput[0] one) and return SQLITE_OK.
119482: **
119483: ** If an OOM error occurs, return SQLITE_NOMEM. In this case it is
119484: ** the responsibility of the caller to free any doclists left in the
119485: ** TermSelect.aaOutput[] array.
119486: */
119487: static int fts3TermSelectFinishMerge(Fts3Table *p, TermSelect *pTS){
119488: char *aOut = 0;
119489: int nOut = 0;
119490: int i;
119491:
119492: /* Loop through the doclists in the aaOutput[] array. Merge them all
119493: ** into a single doclist.
119494: */
119495: for(i=0; i<SizeofArray(pTS->aaOutput); i++){
119496: if( pTS->aaOutput[i] ){
119497: if( !aOut ){
119498: aOut = pTS->aaOutput[i];
119499: nOut = pTS->anOutput[i];
119500: pTS->aaOutput[i] = 0;
119501: }else{
119502: int nNew;
119503: char *aNew;
119504:
119505: int rc = fts3DoclistOrMerge(p->bDescIdx,
119506: pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew
119507: );
119508: if( rc!=SQLITE_OK ){
119509: sqlite3_free(aOut);
119510: return rc;
119511: }
119512:
119513: sqlite3_free(pTS->aaOutput[i]);
119514: sqlite3_free(aOut);
119515: pTS->aaOutput[i] = 0;
119516: aOut = aNew;
119517: nOut = nNew;
119518: }
119519: }
119520: }
119521:
119522: pTS->aaOutput[0] = aOut;
119523: pTS->anOutput[0] = nOut;
119524: return SQLITE_OK;
119525: }
119526:
119527: /*
119528: ** Merge the doclist aDoclist/nDoclist into the TermSelect object passed
119529: ** as the first argument. The merge is an "OR" merge (see function
119530: ** fts3DoclistOrMerge() for details).
119531: **
119532: ** This function is called with the doclist for each term that matches
119533: ** a queried prefix. It merges all these doclists into one, the doclist
119534: ** for the specified prefix. Since there can be a very large number of
119535: ** doclists to merge, the merging is done pair-wise using the TermSelect
119536: ** object.
119537: **
119538: ** This function returns SQLITE_OK if the merge is successful, or an
119539: ** SQLite error code (SQLITE_NOMEM) if an error occurs.
119540: */
119541: static int fts3TermSelectMerge(
119542: Fts3Table *p, /* FTS table handle */
119543: TermSelect *pTS, /* TermSelect object to merge into */
119544: char *aDoclist, /* Pointer to doclist */
119545: int nDoclist /* Size of aDoclist in bytes */
119546: ){
119547: if( pTS->aaOutput[0]==0 ){
119548: /* If this is the first term selected, copy the doclist to the output
119549: ** buffer using memcpy(). */
119550: pTS->aaOutput[0] = sqlite3_malloc(nDoclist);
119551: pTS->anOutput[0] = nDoclist;
119552: if( pTS->aaOutput[0] ){
119553: memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
119554: }else{
119555: return SQLITE_NOMEM;
119556: }
119557: }else{
119558: char *aMerge = aDoclist;
119559: int nMerge = nDoclist;
119560: int iOut;
119561:
119562: for(iOut=0; iOut<SizeofArray(pTS->aaOutput); iOut++){
119563: if( pTS->aaOutput[iOut]==0 ){
119564: assert( iOut>0 );
119565: pTS->aaOutput[iOut] = aMerge;
119566: pTS->anOutput[iOut] = nMerge;
119567: break;
119568: }else{
119569: char *aNew;
119570: int nNew;
119571:
119572: int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge,
119573: pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew
119574: );
119575: if( rc!=SQLITE_OK ){
119576: if( aMerge!=aDoclist ) sqlite3_free(aMerge);
119577: return rc;
119578: }
119579:
119580: if( aMerge!=aDoclist ) sqlite3_free(aMerge);
119581: sqlite3_free(pTS->aaOutput[iOut]);
119582: pTS->aaOutput[iOut] = 0;
119583:
119584: aMerge = aNew;
119585: nMerge = nNew;
119586: if( (iOut+1)==SizeofArray(pTS->aaOutput) ){
119587: pTS->aaOutput[iOut] = aMerge;
119588: pTS->anOutput[iOut] = nMerge;
119589: }
119590: }
119591: }
119592: }
119593: return SQLITE_OK;
119594: }
119595:
119596: /*
119597: ** Append SegReader object pNew to the end of the pCsr->apSegment[] array.
119598: */
119599: static int fts3SegReaderCursorAppend(
119600: Fts3MultiSegReader *pCsr,
119601: Fts3SegReader *pNew
119602: ){
119603: if( (pCsr->nSegment%16)==0 ){
119604: Fts3SegReader **apNew;
119605: int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*);
119606: apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte);
119607: if( !apNew ){
119608: sqlite3Fts3SegReaderFree(pNew);
119609: return SQLITE_NOMEM;
119610: }
119611: pCsr->apSegment = apNew;
119612: }
119613: pCsr->apSegment[pCsr->nSegment++] = pNew;
119614: return SQLITE_OK;
119615: }
119616:
119617: /*
119618: ** Add seg-reader objects to the Fts3MultiSegReader object passed as the
119619: ** 8th argument.
119620: **
119621: ** This function returns SQLITE_OK if successful, or an SQLite error code
119622: ** otherwise.
119623: */
119624: static int fts3SegReaderCursor(
119625: Fts3Table *p, /* FTS3 table handle */
1.2.2.1 ! misho 119626: int iLangid, /* Language id */
1.2 misho 119627: int iIndex, /* Index to search (from 0 to p->nIndex-1) */
119628: int iLevel, /* Level of segments to scan */
119629: const char *zTerm, /* Term to query for */
119630: int nTerm, /* Size of zTerm in bytes */
119631: int isPrefix, /* True for a prefix search */
119632: int isScan, /* True to scan from zTerm to EOF */
119633: Fts3MultiSegReader *pCsr /* Cursor object to populate */
119634: ){
119635: int rc = SQLITE_OK; /* Error code */
119636: sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */
119637: int rc2; /* Result of sqlite3_reset() */
119638:
119639: /* If iLevel is less than 0 and this is not a scan, include a seg-reader
119640: ** for the pending-terms. If this is a scan, then this call must be being
119641: ** made by an fts4aux module, not an FTS table. In this case calling
119642: ** Fts3SegReaderPending might segfault, as the data structures used by
119643: ** fts4aux are not completely populated. So it's easiest to filter these
119644: ** calls out here. */
119645: if( iLevel<0 && p->aIndex ){
119646: Fts3SegReader *pSeg = 0;
119647: rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix, &pSeg);
119648: if( rc==SQLITE_OK && pSeg ){
119649: rc = fts3SegReaderCursorAppend(pCsr, pSeg);
119650: }
119651: }
119652:
119653: if( iLevel!=FTS3_SEGCURSOR_PENDING ){
119654: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 119655: rc = sqlite3Fts3AllSegdirs(p, iLangid, iIndex, iLevel, &pStmt);
1.2 misho 119656: }
119657:
119658: while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
119659: Fts3SegReader *pSeg = 0;
119660:
119661: /* Read the values returned by the SELECT into local variables. */
119662: sqlite3_int64 iStartBlock = sqlite3_column_int64(pStmt, 1);
119663: sqlite3_int64 iLeavesEndBlock = sqlite3_column_int64(pStmt, 2);
119664: sqlite3_int64 iEndBlock = sqlite3_column_int64(pStmt, 3);
119665: int nRoot = sqlite3_column_bytes(pStmt, 4);
119666: char const *zRoot = sqlite3_column_blob(pStmt, 4);
119667:
119668: /* If zTerm is not NULL, and this segment is not stored entirely on its
119669: ** root node, the range of leaves scanned can be reduced. Do this. */
119670: if( iStartBlock && zTerm ){
119671: sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0);
119672: rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi);
119673: if( rc!=SQLITE_OK ) goto finished;
119674: if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock;
119675: }
119676:
119677: rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1,
1.2.2.1 ! misho 119678: (isPrefix==0 && isScan==0),
! 119679: iStartBlock, iLeavesEndBlock,
! 119680: iEndBlock, zRoot, nRoot, &pSeg
1.2 misho 119681: );
119682: if( rc!=SQLITE_OK ) goto finished;
119683: rc = fts3SegReaderCursorAppend(pCsr, pSeg);
119684: }
119685: }
119686:
119687: finished:
119688: rc2 = sqlite3_reset(pStmt);
119689: if( rc==SQLITE_DONE ) rc = rc2;
119690:
119691: return rc;
119692: }
119693:
119694: /*
119695: ** Set up a cursor object for iterating through a full-text index or a
119696: ** single level therein.
119697: */
119698: SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(
119699: Fts3Table *p, /* FTS3 table handle */
1.2.2.1 ! misho 119700: int iLangid, /* Language-id to search */
1.2 misho 119701: int iIndex, /* Index to search (from 0 to p->nIndex-1) */
119702: int iLevel, /* Level of segments to scan */
119703: const char *zTerm, /* Term to query for */
119704: int nTerm, /* Size of zTerm in bytes */
119705: int isPrefix, /* True for a prefix search */
119706: int isScan, /* True to scan from zTerm to EOF */
119707: Fts3MultiSegReader *pCsr /* Cursor object to populate */
119708: ){
119709: assert( iIndex>=0 && iIndex<p->nIndex );
119710: assert( iLevel==FTS3_SEGCURSOR_ALL
119711: || iLevel==FTS3_SEGCURSOR_PENDING
119712: || iLevel>=0
119713: );
119714: assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
119715: assert( FTS3_SEGCURSOR_ALL<0 && FTS3_SEGCURSOR_PENDING<0 );
119716: assert( isPrefix==0 || isScan==0 );
119717:
119718: memset(pCsr, 0, sizeof(Fts3MultiSegReader));
119719: return fts3SegReaderCursor(
1.2.2.1 ! misho 119720: p, iLangid, iIndex, iLevel, zTerm, nTerm, isPrefix, isScan, pCsr
1.2 misho 119721: );
119722: }
119723:
119724: /*
119725: ** In addition to its current configuration, have the Fts3MultiSegReader
119726: ** passed as the 4th argument also scan the doclist for term zTerm/nTerm.
119727: **
119728: ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
119729: */
119730: static int fts3SegReaderCursorAddZero(
119731: Fts3Table *p, /* FTS virtual table handle */
1.2.2.1 ! misho 119732: int iLangid,
1.2 misho 119733: const char *zTerm, /* Term to scan doclist of */
119734: int nTerm, /* Number of bytes in zTerm */
119735: Fts3MultiSegReader *pCsr /* Fts3MultiSegReader to modify */
119736: ){
1.2.2.1 ! misho 119737: return fts3SegReaderCursor(p,
! 119738: iLangid, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0,pCsr
! 119739: );
1.2 misho 119740: }
119741:
119742: /*
119743: ** Open an Fts3MultiSegReader to scan the doclist for term zTerm/nTerm. Or,
119744: ** if isPrefix is true, to scan the doclist for all terms for which
119745: ** zTerm/nTerm is a prefix. If successful, return SQLITE_OK and write
119746: ** a pointer to the new Fts3MultiSegReader to *ppSegcsr. Otherwise, return
119747: ** an SQLite error code.
119748: **
119749: ** It is the responsibility of the caller to free this object by eventually
119750: ** passing it to fts3SegReaderCursorFree()
119751: **
119752: ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
119753: ** Output parameter *ppSegcsr is set to 0 if an error occurs.
119754: */
119755: static int fts3TermSegReaderCursor(
119756: Fts3Cursor *pCsr, /* Virtual table cursor handle */
119757: const char *zTerm, /* Term to query for */
119758: int nTerm, /* Size of zTerm in bytes */
119759: int isPrefix, /* True for a prefix search */
119760: Fts3MultiSegReader **ppSegcsr /* OUT: Allocated seg-reader cursor */
119761: ){
119762: Fts3MultiSegReader *pSegcsr; /* Object to allocate and return */
119763: int rc = SQLITE_NOMEM; /* Return code */
119764:
119765: pSegcsr = sqlite3_malloc(sizeof(Fts3MultiSegReader));
119766: if( pSegcsr ){
119767: int i;
119768: int bFound = 0; /* True once an index has been found */
119769: Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
119770:
119771: if( isPrefix ){
119772: for(i=1; bFound==0 && i<p->nIndex; i++){
119773: if( p->aIndex[i].nPrefix==nTerm ){
119774: bFound = 1;
1.2.2.1 ! misho 119775: rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid,
! 119776: i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr
! 119777: );
1.2 misho 119778: pSegcsr->bLookup = 1;
119779: }
119780: }
119781:
119782: for(i=1; bFound==0 && i<p->nIndex; i++){
119783: if( p->aIndex[i].nPrefix==nTerm+1 ){
119784: bFound = 1;
1.2.2.1 ! misho 119785: rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid,
! 119786: i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr
1.2 misho 119787: );
119788: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 119789: rc = fts3SegReaderCursorAddZero(
! 119790: p, pCsr->iLangid, zTerm, nTerm, pSegcsr
! 119791: );
1.2 misho 119792: }
119793: }
119794: }
119795: }
119796:
119797: if( bFound==0 ){
1.2.2.1 ! misho 119798: rc = sqlite3Fts3SegReaderCursor(p, pCsr->iLangid,
! 119799: 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr
1.2 misho 119800: );
119801: pSegcsr->bLookup = !isPrefix;
119802: }
119803: }
119804:
119805: *ppSegcsr = pSegcsr;
119806: return rc;
119807: }
119808:
119809: /*
119810: ** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor().
119811: */
119812: static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){
119813: sqlite3Fts3SegReaderFinish(pSegcsr);
119814: sqlite3_free(pSegcsr);
119815: }
119816:
119817: /*
119818: ** This function retreives the doclist for the specified term (or term
119819: ** prefix) from the database.
119820: */
119821: static int fts3TermSelect(
119822: Fts3Table *p, /* Virtual table handle */
119823: Fts3PhraseToken *pTok, /* Token to query for */
119824: int iColumn, /* Column to query (or -ve for all columns) */
119825: int *pnOut, /* OUT: Size of buffer at *ppOut */
119826: char **ppOut /* OUT: Malloced result buffer */
119827: ){
119828: int rc; /* Return code */
119829: Fts3MultiSegReader *pSegcsr; /* Seg-reader cursor for this term */
119830: TermSelect tsc; /* Object for pair-wise doclist merging */
119831: Fts3SegFilter filter; /* Segment term filter configuration */
119832:
119833: pSegcsr = pTok->pSegcsr;
119834: memset(&tsc, 0, sizeof(TermSelect));
119835:
119836: filter.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS
119837: | (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0)
119838: | (pTok->bFirst ? FTS3_SEGMENT_FIRST : 0)
119839: | (iColumn<p->nColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0);
119840: filter.iCol = iColumn;
119841: filter.zTerm = pTok->z;
119842: filter.nTerm = pTok->n;
119843:
119844: rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter);
119845: while( SQLITE_OK==rc
119846: && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr))
119847: ){
119848: rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist);
119849: }
119850:
119851: if( rc==SQLITE_OK ){
119852: rc = fts3TermSelectFinishMerge(p, &tsc);
119853: }
119854: if( rc==SQLITE_OK ){
119855: *ppOut = tsc.aaOutput[0];
119856: *pnOut = tsc.anOutput[0];
119857: }else{
119858: int i;
119859: for(i=0; i<SizeofArray(tsc.aaOutput); i++){
119860: sqlite3_free(tsc.aaOutput[i]);
119861: }
119862: }
119863:
119864: fts3SegReaderCursorFree(pSegcsr);
119865: pTok->pSegcsr = 0;
119866: return rc;
119867: }
119868:
119869: /*
119870: ** This function counts the total number of docids in the doclist stored
119871: ** in buffer aList[], size nList bytes.
119872: **
119873: ** If the isPoslist argument is true, then it is assumed that the doclist
119874: ** contains a position-list following each docid. Otherwise, it is assumed
119875: ** that the doclist is simply a list of docids stored as delta encoded
119876: ** varints.
119877: */
119878: static int fts3DoclistCountDocids(char *aList, int nList){
119879: int nDoc = 0; /* Return value */
119880: if( aList ){
119881: char *aEnd = &aList[nList]; /* Pointer to one byte after EOF */
119882: char *p = aList; /* Cursor */
119883: while( p<aEnd ){
119884: nDoc++;
119885: while( (*p++)&0x80 ); /* Skip docid varint */
119886: fts3PoslistCopy(0, &p); /* Skip over position list */
119887: }
119888: }
119889:
119890: return nDoc;
119891: }
119892:
119893: /*
119894: ** Advance the cursor to the next row in the %_content table that
119895: ** matches the search criteria. For a MATCH search, this will be
119896: ** the next row that matches. For a full-table scan, this will be
119897: ** simply the next row in the %_content table. For a docid lookup,
119898: ** this routine simply sets the EOF flag.
119899: **
119900: ** Return SQLITE_OK if nothing goes wrong. SQLITE_OK is returned
119901: ** even if we reach end-of-file. The fts3EofMethod() will be called
119902: ** subsequently to determine whether or not an EOF was hit.
119903: */
119904: static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){
119905: int rc;
119906: Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
119907: if( pCsr->eSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){
119908: if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){
119909: pCsr->isEof = 1;
119910: rc = sqlite3_reset(pCsr->pStmt);
119911: }else{
119912: pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0);
119913: rc = SQLITE_OK;
119914: }
119915: }else{
119916: rc = fts3EvalNext((Fts3Cursor *)pCursor);
119917: }
119918: assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
119919: return rc;
119920: }
119921:
119922: /*
119923: ** This is the xFilter interface for the virtual table. See
119924: ** the virtual table xFilter method documentation for additional
119925: ** information.
119926: **
119927: ** If idxNum==FTS3_FULLSCAN_SEARCH then do a full table scan against
119928: ** the %_content table.
119929: **
119930: ** If idxNum==FTS3_DOCID_SEARCH then do a docid lookup for a single entry
119931: ** in the %_content table.
119932: **
119933: ** If idxNum>=FTS3_FULLTEXT_SEARCH then use the full text index. The
119934: ** column on the left-hand side of the MATCH operator is column
119935: ** number idxNum-FTS3_FULLTEXT_SEARCH, 0 indexed. argv[0] is the right-hand
119936: ** side of the MATCH operator.
119937: */
119938: static int fts3FilterMethod(
119939: sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */
119940: int idxNum, /* Strategy index */
119941: const char *idxStr, /* Unused */
119942: int nVal, /* Number of elements in apVal */
119943: sqlite3_value **apVal /* Arguments for the indexing scheme */
119944: ){
119945: int rc;
119946: char *zSql; /* SQL statement used to access %_content */
119947: Fts3Table *p = (Fts3Table *)pCursor->pVtab;
119948: Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
119949:
119950: UNUSED_PARAMETER(idxStr);
119951: UNUSED_PARAMETER(nVal);
119952:
119953: assert( idxNum>=0 && idxNum<=(FTS3_FULLTEXT_SEARCH+p->nColumn) );
1.2.2.1 ! misho 119954: assert( nVal==0 || nVal==1 || nVal==2 );
1.2 misho 119955: assert( (nVal==0)==(idxNum==FTS3_FULLSCAN_SEARCH) );
119956: assert( p->pSegments==0 );
119957:
119958: /* In case the cursor has been used before, clear it now. */
119959: sqlite3_finalize(pCsr->pStmt);
119960: sqlite3_free(pCsr->aDoclist);
119961: sqlite3Fts3ExprFree(pCsr->pExpr);
119962: memset(&pCursor[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor));
119963:
119964: if( idxStr ){
119965: pCsr->bDesc = (idxStr[0]=='D');
119966: }else{
119967: pCsr->bDesc = p->bDescIdx;
119968: }
119969: pCsr->eSearch = (i16)idxNum;
119970:
119971: if( idxNum!=FTS3_DOCID_SEARCH && idxNum!=FTS3_FULLSCAN_SEARCH ){
119972: int iCol = idxNum-FTS3_FULLTEXT_SEARCH;
119973: const char *zQuery = (const char *)sqlite3_value_text(apVal[0]);
119974:
119975: if( zQuery==0 && sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
119976: return SQLITE_NOMEM;
119977: }
119978:
1.2.2.1 ! misho 119979: pCsr->iLangid = 0;
! 119980: if( nVal==2 ) pCsr->iLangid = sqlite3_value_int(apVal[1]);
! 119981:
! 119982: rc = sqlite3Fts3ExprParse(p->pTokenizer, pCsr->iLangid,
! 119983: p->azColumn, p->bFts4, p->nColumn, iCol, zQuery, -1, &pCsr->pExpr
1.2 misho 119984: );
119985: if( rc!=SQLITE_OK ){
119986: if( rc==SQLITE_ERROR ){
119987: static const char *zErr = "malformed MATCH expression: [%s]";
119988: p->base.zErrMsg = sqlite3_mprintf(zErr, zQuery);
119989: }
119990: return rc;
119991: }
119992:
119993: rc = sqlite3Fts3ReadLock(p);
119994: if( rc!=SQLITE_OK ) return rc;
119995:
119996: rc = fts3EvalStart(pCsr);
119997:
119998: sqlite3Fts3SegmentsClose(p);
119999: if( rc!=SQLITE_OK ) return rc;
120000: pCsr->pNextId = pCsr->aDoclist;
120001: pCsr->iPrevId = 0;
120002: }
120003:
120004: /* Compile a SELECT statement for this cursor. For a full-table-scan, the
120005: ** statement loops through all rows of the %_content table. For a
120006: ** full-text query or docid lookup, the statement retrieves a single
120007: ** row by docid.
120008: */
120009: if( idxNum==FTS3_FULLSCAN_SEARCH ){
120010: zSql = sqlite3_mprintf(
120011: "SELECT %s ORDER BY rowid %s",
120012: p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC")
120013: );
120014: if( zSql ){
120015: rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
120016: sqlite3_free(zSql);
120017: }else{
120018: rc = SQLITE_NOMEM;
120019: }
120020: }else if( idxNum==FTS3_DOCID_SEARCH ){
120021: rc = fts3CursorSeekStmt(pCsr, &pCsr->pStmt);
120022: if( rc==SQLITE_OK ){
120023: rc = sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]);
120024: }
120025: }
120026: if( rc!=SQLITE_OK ) return rc;
120027:
120028: return fts3NextMethod(pCursor);
120029: }
120030:
120031: /*
120032: ** This is the xEof method of the virtual table. SQLite calls this
120033: ** routine to find out if it has reached the end of a result set.
120034: */
120035: static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){
120036: return ((Fts3Cursor *)pCursor)->isEof;
120037: }
120038:
120039: /*
120040: ** This is the xRowid method. The SQLite core calls this routine to
120041: ** retrieve the rowid for the current row of the result set. fts3
120042: ** exposes %_content.docid as the rowid for the virtual table. The
120043: ** rowid should be written to *pRowid.
120044: */
120045: static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
120046: Fts3Cursor *pCsr = (Fts3Cursor *) pCursor;
120047: *pRowid = pCsr->iPrevId;
120048: return SQLITE_OK;
120049: }
120050:
120051: /*
120052: ** This is the xColumn method, called by SQLite to request a value from
120053: ** the row that the supplied cursor currently points to.
1.2.2.1 ! misho 120054: **
! 120055: ** If:
! 120056: **
! 120057: ** (iCol < p->nColumn) -> The value of the iCol'th user column.
! 120058: ** (iCol == p->nColumn) -> Magic column with the same name as the table.
! 120059: ** (iCol == p->nColumn+1) -> Docid column
! 120060: ** (iCol == p->nColumn+2) -> Langid column
1.2 misho 120061: */
120062: static int fts3ColumnMethod(
120063: sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */
1.2.2.1 ! misho 120064: sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */
1.2 misho 120065: int iCol /* Index of column to read value from */
120066: ){
120067: int rc = SQLITE_OK; /* Return Code */
120068: Fts3Cursor *pCsr = (Fts3Cursor *) pCursor;
120069: Fts3Table *p = (Fts3Table *)pCursor->pVtab;
120070:
120071: /* The column value supplied by SQLite must be in range. */
1.2.2.1 ! misho 120072: assert( iCol>=0 && iCol<=p->nColumn+2 );
1.2 misho 120073:
120074: if( iCol==p->nColumn+1 ){
120075: /* This call is a request for the "docid" column. Since "docid" is an
120076: ** alias for "rowid", use the xRowid() method to obtain the value.
120077: */
1.2.2.1 ! misho 120078: sqlite3_result_int64(pCtx, pCsr->iPrevId);
1.2 misho 120079: }else if( iCol==p->nColumn ){
120080: /* The extra column whose name is the same as the table.
1.2.2.1 ! misho 120081: ** Return a blob which is a pointer to the cursor. */
! 120082: sqlite3_result_blob(pCtx, &pCsr, sizeof(pCsr), SQLITE_TRANSIENT);
! 120083: }else if( iCol==p->nColumn+2 && pCsr->pExpr ){
! 120084: sqlite3_result_int64(pCtx, pCsr->iLangid);
1.2 misho 120085: }else{
1.2.2.1 ! misho 120086: /* The requested column is either a user column (one that contains
! 120087: ** indexed data), or the language-id column. */
1.2 misho 120088: rc = fts3CursorSeek(0, pCsr);
1.2.2.1 ! misho 120089:
! 120090: if( rc==SQLITE_OK ){
! 120091: if( iCol==p->nColumn+2 ){
! 120092: int iLangid = 0;
! 120093: if( p->zLanguageid ){
! 120094: iLangid = sqlite3_column_int(pCsr->pStmt, p->nColumn+1);
! 120095: }
! 120096: sqlite3_result_int(pCtx, iLangid);
! 120097: }else if( sqlite3_data_count(pCsr->pStmt)>(iCol+1) ){
! 120098: sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1));
! 120099: }
1.2 misho 120100: }
120101: }
120102:
120103: assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
120104: return rc;
120105: }
120106:
120107: /*
120108: ** This function is the implementation of the xUpdate callback used by
120109: ** FTS3 virtual tables. It is invoked by SQLite each time a row is to be
120110: ** inserted, updated or deleted.
120111: */
120112: static int fts3UpdateMethod(
120113: sqlite3_vtab *pVtab, /* Virtual table handle */
120114: int nArg, /* Size of argument array */
120115: sqlite3_value **apVal, /* Array of arguments */
120116: sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */
120117: ){
120118: return sqlite3Fts3UpdateMethod(pVtab, nArg, apVal, pRowid);
120119: }
120120:
120121: /*
120122: ** Implementation of xSync() method. Flush the contents of the pending-terms
120123: ** hash-table to the database.
120124: */
120125: static int fts3SyncMethod(sqlite3_vtab *pVtab){
1.2.2.1 ! misho 120126:
! 120127: /* Following an incremental-merge operation, assuming that the input
! 120128: ** segments are not completely consumed (the usual case), they are updated
! 120129: ** in place to remove the entries that have already been merged. This
! 120130: ** involves updating the leaf block that contains the smallest unmerged
! 120131: ** entry and each block (if any) between the leaf and the root node. So
! 120132: ** if the height of the input segment b-trees is N, and input segments
! 120133: ** are merged eight at a time, updating the input segments at the end
! 120134: ** of an incremental-merge requires writing (8*(1+N)) blocks. N is usually
! 120135: ** small - often between 0 and 2. So the overhead of the incremental
! 120136: ** merge is somewhere between 8 and 24 blocks. To avoid this overhead
! 120137: ** dwarfing the actual productive work accomplished, the incremental merge
! 120138: ** is only attempted if it will write at least 64 leaf blocks. Hence
! 120139: ** nMinMerge.
! 120140: **
! 120141: ** Of course, updating the input segments also involves deleting a bunch
! 120142: ** of blocks from the segments table. But this is not considered overhead
! 120143: ** as it would also be required by a crisis-merge that used the same input
! 120144: ** segments.
! 120145: */
! 120146: const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */
! 120147:
! 120148: Fts3Table *p = (Fts3Table*)pVtab;
! 120149: int rc = sqlite3Fts3PendingTermsFlush(p);
! 120150:
! 120151: if( rc==SQLITE_OK && p->bAutoincrmerge==1 && p->nLeafAdd>(nMinMerge/16) ){
! 120152: int mxLevel = 0; /* Maximum relative level value in db */
! 120153: int A; /* Incr-merge parameter A */
! 120154:
! 120155: rc = sqlite3Fts3MaxLevel(p, &mxLevel);
! 120156: assert( rc==SQLITE_OK || mxLevel==0 );
! 120157: A = p->nLeafAdd * mxLevel;
! 120158: A += (A/2);
! 120159: if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, 8);
! 120160: }
! 120161: sqlite3Fts3SegmentsClose(p);
1.2 misho 120162: return rc;
120163: }
120164:
120165: /*
120166: ** Implementation of xBegin() method. This is a no-op.
120167: */
120168: static int fts3BeginMethod(sqlite3_vtab *pVtab){
1.2.2.1 ! misho 120169: Fts3Table *p = (Fts3Table*)pVtab;
1.2 misho 120170: UNUSED_PARAMETER(pVtab);
120171: assert( p->pSegments==0 );
120172: assert( p->nPendingData==0 );
120173: assert( p->inTransaction!=1 );
120174: TESTONLY( p->inTransaction = 1 );
120175: TESTONLY( p->mxSavepoint = -1; );
1.2.2.1 ! misho 120176: p->nLeafAdd = 0;
1.2 misho 120177: return SQLITE_OK;
120178: }
120179:
120180: /*
120181: ** Implementation of xCommit() method. This is a no-op. The contents of
120182: ** the pending-terms hash-table have already been flushed into the database
120183: ** by fts3SyncMethod().
120184: */
120185: static int fts3CommitMethod(sqlite3_vtab *pVtab){
120186: TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
120187: UNUSED_PARAMETER(pVtab);
120188: assert( p->nPendingData==0 );
120189: assert( p->inTransaction!=0 );
120190: assert( p->pSegments==0 );
120191: TESTONLY( p->inTransaction = 0 );
120192: TESTONLY( p->mxSavepoint = -1; );
120193: return SQLITE_OK;
120194: }
120195:
120196: /*
120197: ** Implementation of xRollback(). Discard the contents of the pending-terms
120198: ** hash-table. Any changes made to the database are reverted by SQLite.
120199: */
120200: static int fts3RollbackMethod(sqlite3_vtab *pVtab){
120201: Fts3Table *p = (Fts3Table*)pVtab;
120202: sqlite3Fts3PendingTermsClear(p);
120203: assert( p->inTransaction!=0 );
120204: TESTONLY( p->inTransaction = 0 );
120205: TESTONLY( p->mxSavepoint = -1; );
120206: return SQLITE_OK;
120207: }
120208:
120209: /*
120210: ** When called, *ppPoslist must point to the byte immediately following the
120211: ** end of a position-list. i.e. ( (*ppPoslist)[-1]==POS_END ). This function
120212: ** moves *ppPoslist so that it instead points to the first byte of the
120213: ** same position list.
120214: */
120215: static void fts3ReversePoslist(char *pStart, char **ppPoslist){
120216: char *p = &(*ppPoslist)[-2];
120217: char c = 0;
120218:
120219: while( p>pStart && (c=*p--)==0 );
120220: while( p>pStart && (*p & 0x80) | c ){
120221: c = *p--;
120222: }
120223: if( p>pStart ){ p = &p[2]; }
120224: while( *p++&0x80 );
120225: *ppPoslist = p;
120226: }
120227:
120228: /*
120229: ** Helper function used by the implementation of the overloaded snippet(),
120230: ** offsets() and optimize() SQL functions.
120231: **
120232: ** If the value passed as the third argument is a blob of size
120233: ** sizeof(Fts3Cursor*), then the blob contents are copied to the
120234: ** output variable *ppCsr and SQLITE_OK is returned. Otherwise, an error
120235: ** message is written to context pContext and SQLITE_ERROR returned. The
120236: ** string passed via zFunc is used as part of the error message.
120237: */
120238: static int fts3FunctionArg(
120239: sqlite3_context *pContext, /* SQL function call context */
120240: const char *zFunc, /* Function name */
120241: sqlite3_value *pVal, /* argv[0] passed to function */
120242: Fts3Cursor **ppCsr /* OUT: Store cursor handle here */
120243: ){
120244: Fts3Cursor *pRet;
120245: if( sqlite3_value_type(pVal)!=SQLITE_BLOB
120246: || sqlite3_value_bytes(pVal)!=sizeof(Fts3Cursor *)
120247: ){
120248: char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc);
120249: sqlite3_result_error(pContext, zErr, -1);
120250: sqlite3_free(zErr);
120251: return SQLITE_ERROR;
120252: }
120253: memcpy(&pRet, sqlite3_value_blob(pVal), sizeof(Fts3Cursor *));
120254: *ppCsr = pRet;
120255: return SQLITE_OK;
120256: }
120257:
120258: /*
120259: ** Implementation of the snippet() function for FTS3
120260: */
120261: static void fts3SnippetFunc(
120262: sqlite3_context *pContext, /* SQLite function call context */
120263: int nVal, /* Size of apVal[] array */
120264: sqlite3_value **apVal /* Array of arguments */
120265: ){
120266: Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */
120267: const char *zStart = "<b>";
120268: const char *zEnd = "</b>";
120269: const char *zEllipsis = "<b>...</b>";
120270: int iCol = -1;
120271: int nToken = 15; /* Default number of tokens in snippet */
120272:
120273: /* There must be at least one argument passed to this function (otherwise
120274: ** the non-overloaded version would have been called instead of this one).
120275: */
120276: assert( nVal>=1 );
120277:
120278: if( nVal>6 ){
120279: sqlite3_result_error(pContext,
120280: "wrong number of arguments to function snippet()", -1);
120281: return;
120282: }
120283: if( fts3FunctionArg(pContext, "snippet", apVal[0], &pCsr) ) return;
120284:
120285: switch( nVal ){
120286: case 6: nToken = sqlite3_value_int(apVal[5]);
120287: case 5: iCol = sqlite3_value_int(apVal[4]);
120288: case 4: zEllipsis = (const char*)sqlite3_value_text(apVal[3]);
120289: case 3: zEnd = (const char*)sqlite3_value_text(apVal[2]);
120290: case 2: zStart = (const char*)sqlite3_value_text(apVal[1]);
120291: }
120292: if( !zEllipsis || !zEnd || !zStart ){
120293: sqlite3_result_error_nomem(pContext);
120294: }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){
120295: sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken);
120296: }
120297: }
120298:
120299: /*
120300: ** Implementation of the offsets() function for FTS3
120301: */
120302: static void fts3OffsetsFunc(
120303: sqlite3_context *pContext, /* SQLite function call context */
120304: int nVal, /* Size of argument array */
120305: sqlite3_value **apVal /* Array of arguments */
120306: ){
120307: Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */
120308:
120309: UNUSED_PARAMETER(nVal);
120310:
120311: assert( nVal==1 );
120312: if( fts3FunctionArg(pContext, "offsets", apVal[0], &pCsr) ) return;
120313: assert( pCsr );
120314: if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){
120315: sqlite3Fts3Offsets(pContext, pCsr);
120316: }
120317: }
120318:
120319: /*
120320: ** Implementation of the special optimize() function for FTS3. This
120321: ** function merges all segments in the database to a single segment.
120322: ** Example usage is:
120323: **
120324: ** SELECT optimize(t) FROM t LIMIT 1;
120325: **
120326: ** where 't' is the name of an FTS3 table.
120327: */
120328: static void fts3OptimizeFunc(
120329: sqlite3_context *pContext, /* SQLite function call context */
120330: int nVal, /* Size of argument array */
120331: sqlite3_value **apVal /* Array of arguments */
120332: ){
120333: int rc; /* Return code */
120334: Fts3Table *p; /* Virtual table handle */
120335: Fts3Cursor *pCursor; /* Cursor handle passed through apVal[0] */
120336:
120337: UNUSED_PARAMETER(nVal);
120338:
120339: assert( nVal==1 );
120340: if( fts3FunctionArg(pContext, "optimize", apVal[0], &pCursor) ) return;
120341: p = (Fts3Table *)pCursor->base.pVtab;
120342: assert( p );
120343:
120344: rc = sqlite3Fts3Optimize(p);
120345:
120346: switch( rc ){
120347: case SQLITE_OK:
120348: sqlite3_result_text(pContext, "Index optimized", -1, SQLITE_STATIC);
120349: break;
120350: case SQLITE_DONE:
120351: sqlite3_result_text(pContext, "Index already optimal", -1, SQLITE_STATIC);
120352: break;
120353: default:
120354: sqlite3_result_error_code(pContext, rc);
120355: break;
120356: }
120357: }
120358:
120359: /*
120360: ** Implementation of the matchinfo() function for FTS3
120361: */
120362: static void fts3MatchinfoFunc(
120363: sqlite3_context *pContext, /* SQLite function call context */
120364: int nVal, /* Size of argument array */
120365: sqlite3_value **apVal /* Array of arguments */
120366: ){
120367: Fts3Cursor *pCsr; /* Cursor handle passed through apVal[0] */
120368: assert( nVal==1 || nVal==2 );
120369: if( SQLITE_OK==fts3FunctionArg(pContext, "matchinfo", apVal[0], &pCsr) ){
120370: const char *zArg = 0;
120371: if( nVal>1 ){
120372: zArg = (const char *)sqlite3_value_text(apVal[1]);
120373: }
120374: sqlite3Fts3Matchinfo(pContext, pCsr, zArg);
120375: }
120376: }
120377:
120378: /*
120379: ** This routine implements the xFindFunction method for the FTS3
120380: ** virtual table.
120381: */
120382: static int fts3FindFunctionMethod(
120383: sqlite3_vtab *pVtab, /* Virtual table handle */
120384: int nArg, /* Number of SQL function arguments */
120385: const char *zName, /* Name of SQL function */
120386: void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */
120387: void **ppArg /* Unused */
120388: ){
120389: struct Overloaded {
120390: const char *zName;
120391: void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
120392: } aOverload[] = {
120393: { "snippet", fts3SnippetFunc },
120394: { "offsets", fts3OffsetsFunc },
120395: { "optimize", fts3OptimizeFunc },
120396: { "matchinfo", fts3MatchinfoFunc },
120397: };
120398: int i; /* Iterator variable */
120399:
120400: UNUSED_PARAMETER(pVtab);
120401: UNUSED_PARAMETER(nArg);
120402: UNUSED_PARAMETER(ppArg);
120403:
120404: for(i=0; i<SizeofArray(aOverload); i++){
120405: if( strcmp(zName, aOverload[i].zName)==0 ){
120406: *pxFunc = aOverload[i].xFunc;
120407: return 1;
120408: }
120409: }
120410:
120411: /* No function of the specified name was found. Return 0. */
120412: return 0;
120413: }
120414:
120415: /*
120416: ** Implementation of FTS3 xRename method. Rename an fts3 table.
120417: */
120418: static int fts3RenameMethod(
120419: sqlite3_vtab *pVtab, /* Virtual table handle */
120420: const char *zName /* New name of table */
120421: ){
120422: Fts3Table *p = (Fts3Table *)pVtab;
120423: sqlite3 *db = p->db; /* Database connection */
120424: int rc; /* Return Code */
120425:
120426: /* As it happens, the pending terms table is always empty here. This is
120427: ** because an "ALTER TABLE RENAME TABLE" statement inside a transaction
120428: ** always opens a savepoint transaction. And the xSavepoint() method
120429: ** flushes the pending terms table. But leave the (no-op) call to
120430: ** PendingTermsFlush() in in case that changes.
120431: */
120432: assert( p->nPendingData==0 );
120433: rc = sqlite3Fts3PendingTermsFlush(p);
120434:
120435: if( p->zContentTbl==0 ){
120436: fts3DbExec(&rc, db,
120437: "ALTER TABLE %Q.'%q_content' RENAME TO '%q_content';",
120438: p->zDb, p->zName, zName
120439: );
120440: }
120441:
120442: if( p->bHasDocsize ){
120443: fts3DbExec(&rc, db,
120444: "ALTER TABLE %Q.'%q_docsize' RENAME TO '%q_docsize';",
120445: p->zDb, p->zName, zName
120446: );
120447: }
120448: if( p->bHasStat ){
120449: fts3DbExec(&rc, db,
120450: "ALTER TABLE %Q.'%q_stat' RENAME TO '%q_stat';",
120451: p->zDb, p->zName, zName
120452: );
120453: }
120454: fts3DbExec(&rc, db,
120455: "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';",
120456: p->zDb, p->zName, zName
120457: );
120458: fts3DbExec(&rc, db,
120459: "ALTER TABLE %Q.'%q_segdir' RENAME TO '%q_segdir';",
120460: p->zDb, p->zName, zName
120461: );
120462: return rc;
120463: }
120464:
120465: /*
120466: ** The xSavepoint() method.
120467: **
120468: ** Flush the contents of the pending-terms table to disk.
120469: */
120470: static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){
1.2.2.1 ! misho 120471: int rc = SQLITE_OK;
1.2 misho 120472: UNUSED_PARAMETER(iSavepoint);
120473: assert( ((Fts3Table *)pVtab)->inTransaction );
120474: assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint );
120475: TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint );
1.2.2.1 ! misho 120476: if( ((Fts3Table *)pVtab)->bIgnoreSavepoint==0 ){
! 120477: rc = fts3SyncMethod(pVtab);
! 120478: }
! 120479: return rc;
1.2 misho 120480: }
120481:
120482: /*
120483: ** The xRelease() method.
120484: **
120485: ** This is a no-op.
120486: */
120487: static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){
120488: TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
120489: UNUSED_PARAMETER(iSavepoint);
120490: UNUSED_PARAMETER(pVtab);
120491: assert( p->inTransaction );
120492: assert( p->mxSavepoint >= iSavepoint );
120493: TESTONLY( p->mxSavepoint = iSavepoint-1 );
120494: return SQLITE_OK;
120495: }
120496:
120497: /*
120498: ** The xRollbackTo() method.
120499: **
120500: ** Discard the contents of the pending terms table.
120501: */
120502: static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){
120503: Fts3Table *p = (Fts3Table*)pVtab;
120504: UNUSED_PARAMETER(iSavepoint);
120505: assert( p->inTransaction );
120506: assert( p->mxSavepoint >= iSavepoint );
120507: TESTONLY( p->mxSavepoint = iSavepoint );
120508: sqlite3Fts3PendingTermsClear(p);
120509: return SQLITE_OK;
120510: }
120511:
120512: static const sqlite3_module fts3Module = {
120513: /* iVersion */ 2,
120514: /* xCreate */ fts3CreateMethod,
120515: /* xConnect */ fts3ConnectMethod,
120516: /* xBestIndex */ fts3BestIndexMethod,
120517: /* xDisconnect */ fts3DisconnectMethod,
120518: /* xDestroy */ fts3DestroyMethod,
120519: /* xOpen */ fts3OpenMethod,
120520: /* xClose */ fts3CloseMethod,
120521: /* xFilter */ fts3FilterMethod,
120522: /* xNext */ fts3NextMethod,
120523: /* xEof */ fts3EofMethod,
120524: /* xColumn */ fts3ColumnMethod,
120525: /* xRowid */ fts3RowidMethod,
120526: /* xUpdate */ fts3UpdateMethod,
120527: /* xBegin */ fts3BeginMethod,
120528: /* xSync */ fts3SyncMethod,
120529: /* xCommit */ fts3CommitMethod,
120530: /* xRollback */ fts3RollbackMethod,
120531: /* xFindFunction */ fts3FindFunctionMethod,
120532: /* xRename */ fts3RenameMethod,
120533: /* xSavepoint */ fts3SavepointMethod,
120534: /* xRelease */ fts3ReleaseMethod,
120535: /* xRollbackTo */ fts3RollbackToMethod,
120536: };
120537:
120538: /*
120539: ** This function is registered as the module destructor (called when an
120540: ** FTS3 enabled database connection is closed). It frees the memory
120541: ** allocated for the tokenizer hash table.
120542: */
120543: static void hashDestroy(void *p){
120544: Fts3Hash *pHash = (Fts3Hash *)p;
120545: sqlite3Fts3HashClear(pHash);
120546: sqlite3_free(pHash);
120547: }
120548:
120549: /*
120550: ** The fts3 built-in tokenizers - "simple", "porter" and "icu"- are
120551: ** implemented in files fts3_tokenizer1.c, fts3_porter.c and fts3_icu.c
120552: ** respectively. The following three forward declarations are for functions
120553: ** declared in these files used to retrieve the respective implementations.
120554: **
120555: ** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed
120556: ** to by the argument to point to the "simple" tokenizer implementation.
120557: ** And so on.
120558: */
120559: SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule);
120560: SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule);
1.2.2.1 ! misho 120561: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 120562: SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const**ppModule);
! 120563: #endif
1.2 misho 120564: #ifdef SQLITE_ENABLE_ICU
120565: SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule);
120566: #endif
120567:
120568: /*
120569: ** Initialise the fts3 extension. If this extension is built as part
120570: ** of the sqlite library, then this function is called directly by
120571: ** SQLite. If fts3 is built as a dynamically loadable extension, this
120572: ** function is called by the sqlite3_extension_init() entry point.
120573: */
120574: SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){
120575: int rc = SQLITE_OK;
120576: Fts3Hash *pHash = 0;
120577: const sqlite3_tokenizer_module *pSimple = 0;
120578: const sqlite3_tokenizer_module *pPorter = 0;
1.2.2.1 ! misho 120579: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 120580: const sqlite3_tokenizer_module *pUnicode = 0;
! 120581: #endif
1.2 misho 120582:
120583: #ifdef SQLITE_ENABLE_ICU
120584: const sqlite3_tokenizer_module *pIcu = 0;
120585: sqlite3Fts3IcuTokenizerModule(&pIcu);
120586: #endif
120587:
1.2.2.1 ! misho 120588: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 120589: sqlite3Fts3UnicodeTokenizer(&pUnicode);
! 120590: #endif
! 120591:
1.2 misho 120592: #ifdef SQLITE_TEST
120593: rc = sqlite3Fts3InitTerm(db);
120594: if( rc!=SQLITE_OK ) return rc;
120595: #endif
120596:
120597: rc = sqlite3Fts3InitAux(db);
120598: if( rc!=SQLITE_OK ) return rc;
120599:
120600: sqlite3Fts3SimpleTokenizerModule(&pSimple);
120601: sqlite3Fts3PorterTokenizerModule(&pPorter);
120602:
120603: /* Allocate and initialise the hash-table used to store tokenizers. */
120604: pHash = sqlite3_malloc(sizeof(Fts3Hash));
120605: if( !pHash ){
120606: rc = SQLITE_NOMEM;
120607: }else{
120608: sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1);
120609: }
120610:
120611: /* Load the built-in tokenizers into the hash table */
120612: if( rc==SQLITE_OK ){
120613: if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple)
120614: || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter)
1.2.2.1 ! misho 120615:
! 120616: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 120617: || sqlite3Fts3HashInsert(pHash, "unicode61", 10, (void *)pUnicode)
! 120618: #endif
1.2 misho 120619: #ifdef SQLITE_ENABLE_ICU
120620: || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu))
120621: #endif
120622: ){
120623: rc = SQLITE_NOMEM;
120624: }
120625: }
120626:
120627: #ifdef SQLITE_TEST
120628: if( rc==SQLITE_OK ){
120629: rc = sqlite3Fts3ExprInitTestInterface(db);
120630: }
120631: #endif
120632:
120633: /* Create the virtual table wrapper around the hash-table and overload
120634: ** the two scalar functions. If this is successful, register the
120635: ** module with sqlite.
120636: */
120637: if( SQLITE_OK==rc
120638: && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer"))
120639: && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1))
120640: && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", 1))
120641: && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 1))
120642: && SQLITE_OK==(rc = sqlite3_overload_function(db, "matchinfo", 2))
120643: && SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", 1))
120644: ){
120645: rc = sqlite3_create_module_v2(
120646: db, "fts3", &fts3Module, (void *)pHash, hashDestroy
120647: );
120648: if( rc==SQLITE_OK ){
120649: rc = sqlite3_create_module_v2(
120650: db, "fts4", &fts3Module, (void *)pHash, 0
120651: );
120652: }
120653: return rc;
120654: }
120655:
120656: /* An error has occurred. Delete the hash table and return the error code. */
120657: assert( rc!=SQLITE_OK );
120658: if( pHash ){
120659: sqlite3Fts3HashClear(pHash);
120660: sqlite3_free(pHash);
120661: }
120662: return rc;
120663: }
120664:
120665: /*
120666: ** Allocate an Fts3MultiSegReader for each token in the expression headed
120667: ** by pExpr.
120668: **
120669: ** An Fts3SegReader object is a cursor that can seek or scan a range of
120670: ** entries within a single segment b-tree. An Fts3MultiSegReader uses multiple
120671: ** Fts3SegReader objects internally to provide an interface to seek or scan
120672: ** within the union of all segments of a b-tree. Hence the name.
120673: **
120674: ** If the allocated Fts3MultiSegReader just seeks to a single entry in a
120675: ** segment b-tree (if the term is not a prefix or it is a prefix for which
120676: ** there exists prefix b-tree of the right length) then it may be traversed
120677: ** and merged incrementally. Otherwise, it has to be merged into an in-memory
120678: ** doclist and then traversed.
120679: */
120680: static void fts3EvalAllocateReaders(
120681: Fts3Cursor *pCsr, /* FTS cursor handle */
120682: Fts3Expr *pExpr, /* Allocate readers for this expression */
120683: int *pnToken, /* OUT: Total number of tokens in phrase. */
120684: int *pnOr, /* OUT: Total number of OR nodes in expr. */
120685: int *pRc /* IN/OUT: Error code */
120686: ){
120687: if( pExpr && SQLITE_OK==*pRc ){
120688: if( pExpr->eType==FTSQUERY_PHRASE ){
120689: int i;
120690: int nToken = pExpr->pPhrase->nToken;
120691: *pnToken += nToken;
120692: for(i=0; i<nToken; i++){
120693: Fts3PhraseToken *pToken = &pExpr->pPhrase->aToken[i];
120694: int rc = fts3TermSegReaderCursor(pCsr,
120695: pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr
120696: );
120697: if( rc!=SQLITE_OK ){
120698: *pRc = rc;
120699: return;
120700: }
120701: }
120702: assert( pExpr->pPhrase->iDoclistToken==0 );
120703: pExpr->pPhrase->iDoclistToken = -1;
120704: }else{
120705: *pnOr += (pExpr->eType==FTSQUERY_OR);
120706: fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc);
120707: fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc);
120708: }
120709: }
120710: }
120711:
120712: /*
120713: ** Arguments pList/nList contain the doclist for token iToken of phrase p.
120714: ** It is merged into the main doclist stored in p->doclist.aAll/nAll.
120715: **
120716: ** This function assumes that pList points to a buffer allocated using
120717: ** sqlite3_malloc(). This function takes responsibility for eventually
120718: ** freeing the buffer.
120719: */
120720: static void fts3EvalPhraseMergeToken(
120721: Fts3Table *pTab, /* FTS Table pointer */
120722: Fts3Phrase *p, /* Phrase to merge pList/nList into */
120723: int iToken, /* Token pList/nList corresponds to */
120724: char *pList, /* Pointer to doclist */
120725: int nList /* Number of bytes in pList */
120726: ){
120727: assert( iToken!=p->iDoclistToken );
120728:
120729: if( pList==0 ){
120730: sqlite3_free(p->doclist.aAll);
120731: p->doclist.aAll = 0;
120732: p->doclist.nAll = 0;
120733: }
120734:
120735: else if( p->iDoclistToken<0 ){
120736: p->doclist.aAll = pList;
120737: p->doclist.nAll = nList;
120738: }
120739:
120740: else if( p->doclist.aAll==0 ){
120741: sqlite3_free(pList);
120742: }
120743:
120744: else {
120745: char *pLeft;
120746: char *pRight;
120747: int nLeft;
120748: int nRight;
120749: int nDiff;
120750:
120751: if( p->iDoclistToken<iToken ){
120752: pLeft = p->doclist.aAll;
120753: nLeft = p->doclist.nAll;
120754: pRight = pList;
120755: nRight = nList;
120756: nDiff = iToken - p->iDoclistToken;
120757: }else{
120758: pRight = p->doclist.aAll;
120759: nRight = p->doclist.nAll;
120760: pLeft = pList;
120761: nLeft = nList;
120762: nDiff = p->iDoclistToken - iToken;
120763: }
120764:
120765: fts3DoclistPhraseMerge(pTab->bDescIdx, nDiff, pLeft, nLeft, pRight,&nRight);
120766: sqlite3_free(pLeft);
120767: p->doclist.aAll = pRight;
120768: p->doclist.nAll = nRight;
120769: }
120770:
120771: if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken;
120772: }
120773:
120774: /*
120775: ** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist
120776: ** does not take deferred tokens into account.
120777: **
120778: ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
120779: */
120780: static int fts3EvalPhraseLoad(
120781: Fts3Cursor *pCsr, /* FTS Cursor handle */
120782: Fts3Phrase *p /* Phrase object */
120783: ){
120784: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
120785: int iToken;
120786: int rc = SQLITE_OK;
120787:
120788: for(iToken=0; rc==SQLITE_OK && iToken<p->nToken; iToken++){
120789: Fts3PhraseToken *pToken = &p->aToken[iToken];
120790: assert( pToken->pDeferred==0 || pToken->pSegcsr==0 );
120791:
120792: if( pToken->pSegcsr ){
120793: int nThis = 0;
120794: char *pThis = 0;
120795: rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis);
120796: if( rc==SQLITE_OK ){
120797: fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
120798: }
120799: }
120800: assert( pToken->pSegcsr==0 );
120801: }
120802:
120803: return rc;
120804: }
120805:
120806: /*
120807: ** This function is called on each phrase after the position lists for
120808: ** any deferred tokens have been loaded into memory. It updates the phrases
120809: ** current position list to include only those positions that are really
120810: ** instances of the phrase (after considering deferred tokens). If this
120811: ** means that the phrase does not appear in the current row, doclist.pList
120812: ** and doclist.nList are both zeroed.
120813: **
120814: ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
120815: */
120816: static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
120817: int iToken; /* Used to iterate through phrase tokens */
120818: char *aPoslist = 0; /* Position list for deferred tokens */
120819: int nPoslist = 0; /* Number of bytes in aPoslist */
120820: int iPrev = -1; /* Token number of previous deferred token */
120821:
120822: assert( pPhrase->doclist.bFreeList==0 );
120823:
120824: for(iToken=0; iToken<pPhrase->nToken; iToken++){
120825: Fts3PhraseToken *pToken = &pPhrase->aToken[iToken];
120826: Fts3DeferredToken *pDeferred = pToken->pDeferred;
120827:
120828: if( pDeferred ){
120829: char *pList;
120830: int nList;
120831: int rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList);
120832: if( rc!=SQLITE_OK ) return rc;
120833:
120834: if( pList==0 ){
120835: sqlite3_free(aPoslist);
120836: pPhrase->doclist.pList = 0;
120837: pPhrase->doclist.nList = 0;
120838: return SQLITE_OK;
120839:
120840: }else if( aPoslist==0 ){
120841: aPoslist = pList;
120842: nPoslist = nList;
120843:
120844: }else{
120845: char *aOut = pList;
120846: char *p1 = aPoslist;
120847: char *p2 = aOut;
120848:
120849: assert( iPrev>=0 );
120850: fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2);
120851: sqlite3_free(aPoslist);
120852: aPoslist = pList;
1.2.2.1 ! misho 120853: nPoslist = (int)(aOut - aPoslist);
1.2 misho 120854: if( nPoslist==0 ){
120855: sqlite3_free(aPoslist);
120856: pPhrase->doclist.pList = 0;
120857: pPhrase->doclist.nList = 0;
120858: return SQLITE_OK;
120859: }
120860: }
120861: iPrev = iToken;
120862: }
120863: }
120864:
120865: if( iPrev>=0 ){
120866: int nMaxUndeferred = pPhrase->iDoclistToken;
120867: if( nMaxUndeferred<0 ){
120868: pPhrase->doclist.pList = aPoslist;
120869: pPhrase->doclist.nList = nPoslist;
120870: pPhrase->doclist.iDocid = pCsr->iPrevId;
120871: pPhrase->doclist.bFreeList = 1;
120872: }else{
120873: int nDistance;
120874: char *p1;
120875: char *p2;
120876: char *aOut;
120877:
120878: if( nMaxUndeferred>iPrev ){
120879: p1 = aPoslist;
120880: p2 = pPhrase->doclist.pList;
120881: nDistance = nMaxUndeferred - iPrev;
120882: }else{
120883: p1 = pPhrase->doclist.pList;
120884: p2 = aPoslist;
120885: nDistance = iPrev - nMaxUndeferred;
120886: }
120887:
120888: aOut = (char *)sqlite3_malloc(nPoslist+8);
120889: if( !aOut ){
120890: sqlite3_free(aPoslist);
120891: return SQLITE_NOMEM;
120892: }
120893:
120894: pPhrase->doclist.pList = aOut;
120895: if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){
120896: pPhrase->doclist.bFreeList = 1;
1.2.2.1 ! misho 120897: pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList);
1.2 misho 120898: }else{
120899: sqlite3_free(aOut);
120900: pPhrase->doclist.pList = 0;
120901: pPhrase->doclist.nList = 0;
120902: }
120903: sqlite3_free(aPoslist);
120904: }
120905: }
120906:
120907: return SQLITE_OK;
120908: }
120909:
120910: /*
120911: ** This function is called for each Fts3Phrase in a full-text query
120912: ** expression to initialize the mechanism for returning rows. Once this
120913: ** function has been called successfully on an Fts3Phrase, it may be
120914: ** used with fts3EvalPhraseNext() to iterate through the matching docids.
120915: **
120916: ** If parameter bOptOk is true, then the phrase may (or may not) use the
120917: ** incremental loading strategy. Otherwise, the entire doclist is loaded into
120918: ** memory within this call.
120919: **
120920: ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
120921: */
120922: static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){
120923: int rc; /* Error code */
120924: Fts3PhraseToken *pFirst = &p->aToken[0];
120925: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
120926:
120927: if( pCsr->bDesc==pTab->bDescIdx
120928: && bOptOk==1
120929: && p->nToken==1
120930: && pFirst->pSegcsr
120931: && pFirst->pSegcsr->bLookup
120932: && pFirst->bFirst==0
120933: ){
120934: /* Use the incremental approach. */
120935: int iCol = (p->iColumn >= pTab->nColumn ? -1 : p->iColumn);
120936: rc = sqlite3Fts3MsrIncrStart(
120937: pTab, pFirst->pSegcsr, iCol, pFirst->z, pFirst->n);
120938: p->bIncr = 1;
120939:
120940: }else{
120941: /* Load the full doclist for the phrase into memory. */
120942: rc = fts3EvalPhraseLoad(pCsr, p);
120943: p->bIncr = 0;
120944: }
120945:
120946: assert( rc!=SQLITE_OK || p->nToken<1 || p->aToken[0].pSegcsr==0 || p->bIncr );
120947: return rc;
120948: }
120949:
120950: /*
120951: ** This function is used to iterate backwards (from the end to start)
120952: ** through doclists. It is used by this module to iterate through phrase
120953: ** doclists in reverse and by the fts3_write.c module to iterate through
120954: ** pending-terms lists when writing to databases with "order=desc".
120955: **
120956: ** The doclist may be sorted in ascending (parameter bDescIdx==0) or
120957: ** descending (parameter bDescIdx==1) order of docid. Regardless, this
120958: ** function iterates from the end of the doclist to the beginning.
120959: */
120960: SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(
120961: int bDescIdx, /* True if the doclist is desc */
120962: char *aDoclist, /* Pointer to entire doclist */
120963: int nDoclist, /* Length of aDoclist in bytes */
120964: char **ppIter, /* IN/OUT: Iterator pointer */
120965: sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */
1.2.2.1 ! misho 120966: int *pnList, /* OUT: List length pointer */
1.2 misho 120967: u8 *pbEof /* OUT: End-of-file flag */
120968: ){
120969: char *p = *ppIter;
120970:
120971: assert( nDoclist>0 );
120972: assert( *pbEof==0 );
120973: assert( p || *piDocid==0 );
120974: assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) );
120975:
120976: if( p==0 ){
120977: sqlite3_int64 iDocid = 0;
120978: char *pNext = 0;
120979: char *pDocid = aDoclist;
120980: char *pEnd = &aDoclist[nDoclist];
120981: int iMul = 1;
120982:
120983: while( pDocid<pEnd ){
120984: sqlite3_int64 iDelta;
120985: pDocid += sqlite3Fts3GetVarint(pDocid, &iDelta);
120986: iDocid += (iMul * iDelta);
120987: pNext = pDocid;
120988: fts3PoslistCopy(0, &pDocid);
120989: while( pDocid<pEnd && *pDocid==0 ) pDocid++;
120990: iMul = (bDescIdx ? -1 : 1);
120991: }
120992:
1.2.2.1 ! misho 120993: *pnList = (int)(pEnd - pNext);
1.2 misho 120994: *ppIter = pNext;
120995: *piDocid = iDocid;
120996: }else{
120997: int iMul = (bDescIdx ? -1 : 1);
120998: sqlite3_int64 iDelta;
120999: fts3GetReverseVarint(&p, aDoclist, &iDelta);
121000: *piDocid -= (iMul * iDelta);
121001:
121002: if( p==aDoclist ){
121003: *pbEof = 1;
121004: }else{
121005: char *pSave = p;
121006: fts3ReversePoslist(aDoclist, &p);
1.2.2.1 ! misho 121007: *pnList = (int)(pSave - p);
1.2 misho 121008: }
121009: *ppIter = p;
121010: }
121011: }
121012:
121013: /*
1.2.2.1 ! misho 121014: ** Iterate forwards through a doclist.
! 121015: */
! 121016: SQLITE_PRIVATE void sqlite3Fts3DoclistNext(
! 121017: int bDescIdx, /* True if the doclist is desc */
! 121018: char *aDoclist, /* Pointer to entire doclist */
! 121019: int nDoclist, /* Length of aDoclist in bytes */
! 121020: char **ppIter, /* IN/OUT: Iterator pointer */
! 121021: sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */
! 121022: u8 *pbEof /* OUT: End-of-file flag */
! 121023: ){
! 121024: char *p = *ppIter;
! 121025:
! 121026: assert( nDoclist>0 );
! 121027: assert( *pbEof==0 );
! 121028: assert( p || *piDocid==0 );
! 121029: assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) );
! 121030:
! 121031: if( p==0 ){
! 121032: p = aDoclist;
! 121033: p += sqlite3Fts3GetVarint(p, piDocid);
! 121034: }else{
! 121035: fts3PoslistCopy(0, &p);
! 121036: if( p>=&aDoclist[nDoclist] ){
! 121037: *pbEof = 1;
! 121038: }else{
! 121039: sqlite3_int64 iVar;
! 121040: p += sqlite3Fts3GetVarint(p, &iVar);
! 121041: *piDocid += ((bDescIdx ? -1 : 1) * iVar);
! 121042: }
! 121043: }
! 121044:
! 121045: *ppIter = p;
! 121046: }
! 121047:
! 121048: /*
1.2 misho 121049: ** Attempt to move the phrase iterator to point to the next matching docid.
121050: ** If an error occurs, return an SQLite error code. Otherwise, return
121051: ** SQLITE_OK.
121052: **
121053: ** If there is no "next" entry and no error occurs, then *pbEof is set to
121054: ** 1 before returning. Otherwise, if no error occurs and the iterator is
121055: ** successfully advanced, *pbEof is set to 0.
121056: */
121057: static int fts3EvalPhraseNext(
121058: Fts3Cursor *pCsr, /* FTS Cursor handle */
121059: Fts3Phrase *p, /* Phrase object to advance to next docid */
121060: u8 *pbEof /* OUT: Set to 1 if EOF */
121061: ){
121062: int rc = SQLITE_OK;
121063: Fts3Doclist *pDL = &p->doclist;
121064: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
121065:
121066: if( p->bIncr ){
121067: assert( p->nToken==1 );
121068: assert( pDL->pNextDocid==0 );
121069: rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr,
121070: &pDL->iDocid, &pDL->pList, &pDL->nList
121071: );
121072: if( rc==SQLITE_OK && !pDL->pList ){
121073: *pbEof = 1;
121074: }
121075: }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){
121076: sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll,
121077: &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof
121078: );
121079: pDL->pList = pDL->pNextDocid;
121080: }else{
121081: char *pIter; /* Used to iterate through aAll */
121082: char *pEnd = &pDL->aAll[pDL->nAll]; /* 1 byte past end of aAll */
121083: if( pDL->pNextDocid ){
121084: pIter = pDL->pNextDocid;
121085: }else{
121086: pIter = pDL->aAll;
121087: }
121088:
121089: if( pIter>=pEnd ){
121090: /* We have already reached the end of this doclist. EOF. */
121091: *pbEof = 1;
121092: }else{
121093: sqlite3_int64 iDelta;
121094: pIter += sqlite3Fts3GetVarint(pIter, &iDelta);
121095: if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){
121096: pDL->iDocid += iDelta;
121097: }else{
121098: pDL->iDocid -= iDelta;
121099: }
121100: pDL->pList = pIter;
121101: fts3PoslistCopy(0, &pIter);
1.2.2.1 ! misho 121102: pDL->nList = (int)(pIter - pDL->pList);
1.2 misho 121103:
121104: /* pIter now points just past the 0x00 that terminates the position-
121105: ** list for document pDL->iDocid. However, if this position-list was
121106: ** edited in place by fts3EvalNearTrim(), then pIter may not actually
121107: ** point to the start of the next docid value. The following line deals
121108: ** with this case by advancing pIter past the zero-padding added by
121109: ** fts3EvalNearTrim(). */
121110: while( pIter<pEnd && *pIter==0 ) pIter++;
121111:
121112: pDL->pNextDocid = pIter;
121113: assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter );
121114: *pbEof = 0;
121115: }
121116: }
121117:
121118: return rc;
121119: }
121120:
121121: /*
121122: **
121123: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
121124: ** Otherwise, fts3EvalPhraseStart() is called on all phrases within the
121125: ** expression. Also the Fts3Expr.bDeferred variable is set to true for any
121126: ** expressions for which all descendent tokens are deferred.
121127: **
121128: ** If parameter bOptOk is zero, then it is guaranteed that the
121129: ** Fts3Phrase.doclist.aAll/nAll variables contain the entire doclist for
121130: ** each phrase in the expression (subject to deferred token processing).
121131: ** Or, if bOptOk is non-zero, then one or more tokens within the expression
121132: ** may be loaded incrementally, meaning doclist.aAll/nAll is not available.
121133: **
121134: ** If an error occurs within this function, *pRc is set to an SQLite error
121135: ** code before returning.
121136: */
121137: static void fts3EvalStartReaders(
121138: Fts3Cursor *pCsr, /* FTS Cursor handle */
121139: Fts3Expr *pExpr, /* Expression to initialize phrases in */
121140: int bOptOk, /* True to enable incremental loading */
121141: int *pRc /* IN/OUT: Error code */
121142: ){
121143: if( pExpr && SQLITE_OK==*pRc ){
121144: if( pExpr->eType==FTSQUERY_PHRASE ){
121145: int i;
121146: int nToken = pExpr->pPhrase->nToken;
121147: for(i=0; i<nToken; i++){
121148: if( pExpr->pPhrase->aToken[i].pDeferred==0 ) break;
121149: }
121150: pExpr->bDeferred = (i==nToken);
121151: *pRc = fts3EvalPhraseStart(pCsr, bOptOk, pExpr->pPhrase);
121152: }else{
121153: fts3EvalStartReaders(pCsr, pExpr->pLeft, bOptOk, pRc);
121154: fts3EvalStartReaders(pCsr, pExpr->pRight, bOptOk, pRc);
121155: pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred);
121156: }
121157: }
121158: }
121159:
121160: /*
121161: ** An array of the following structures is assembled as part of the process
121162: ** of selecting tokens to defer before the query starts executing (as part
121163: ** of the xFilter() method). There is one element in the array for each
121164: ** token in the FTS expression.
121165: **
121166: ** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong
121167: ** to phrases that are connected only by AND and NEAR operators (not OR or
121168: ** NOT). When determining tokens to defer, each AND/NEAR cluster is considered
121169: ** separately. The root of a tokens AND/NEAR cluster is stored in
121170: ** Fts3TokenAndCost.pRoot.
121171: */
121172: typedef struct Fts3TokenAndCost Fts3TokenAndCost;
121173: struct Fts3TokenAndCost {
121174: Fts3Phrase *pPhrase; /* The phrase the token belongs to */
121175: int iToken; /* Position of token in phrase */
121176: Fts3PhraseToken *pToken; /* The token itself */
121177: Fts3Expr *pRoot; /* Root of NEAR/AND cluster */
121178: int nOvfl; /* Number of overflow pages to load doclist */
121179: int iCol; /* The column the token must match */
121180: };
121181:
121182: /*
121183: ** This function is used to populate an allocated Fts3TokenAndCost array.
121184: **
121185: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
121186: ** Otherwise, if an error occurs during execution, *pRc is set to an
121187: ** SQLite error code.
121188: */
121189: static void fts3EvalTokenCosts(
121190: Fts3Cursor *pCsr, /* FTS Cursor handle */
121191: Fts3Expr *pRoot, /* Root of current AND/NEAR cluster */
121192: Fts3Expr *pExpr, /* Expression to consider */
121193: Fts3TokenAndCost **ppTC, /* Write new entries to *(*ppTC)++ */
121194: Fts3Expr ***ppOr, /* Write new OR root to *(*ppOr)++ */
121195: int *pRc /* IN/OUT: Error code */
121196: ){
121197: if( *pRc==SQLITE_OK ){
121198: if( pExpr->eType==FTSQUERY_PHRASE ){
121199: Fts3Phrase *pPhrase = pExpr->pPhrase;
121200: int i;
121201: for(i=0; *pRc==SQLITE_OK && i<pPhrase->nToken; i++){
121202: Fts3TokenAndCost *pTC = (*ppTC)++;
121203: pTC->pPhrase = pPhrase;
121204: pTC->iToken = i;
121205: pTC->pRoot = pRoot;
121206: pTC->pToken = &pPhrase->aToken[i];
121207: pTC->iCol = pPhrase->iColumn;
121208: *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl);
121209: }
121210: }else if( pExpr->eType!=FTSQUERY_NOT ){
121211: assert( pExpr->eType==FTSQUERY_OR
121212: || pExpr->eType==FTSQUERY_AND
121213: || pExpr->eType==FTSQUERY_NEAR
121214: );
121215: assert( pExpr->pLeft && pExpr->pRight );
121216: if( pExpr->eType==FTSQUERY_OR ){
121217: pRoot = pExpr->pLeft;
121218: **ppOr = pRoot;
121219: (*ppOr)++;
121220: }
121221: fts3EvalTokenCosts(pCsr, pRoot, pExpr->pLeft, ppTC, ppOr, pRc);
121222: if( pExpr->eType==FTSQUERY_OR ){
121223: pRoot = pExpr->pRight;
121224: **ppOr = pRoot;
121225: (*ppOr)++;
121226: }
121227: fts3EvalTokenCosts(pCsr, pRoot, pExpr->pRight, ppTC, ppOr, pRc);
121228: }
121229: }
121230: }
121231:
121232: /*
121233: ** Determine the average document (row) size in pages. If successful,
121234: ** write this value to *pnPage and return SQLITE_OK. Otherwise, return
121235: ** an SQLite error code.
121236: **
121237: ** The average document size in pages is calculated by first calculating
121238: ** determining the average size in bytes, B. If B is less than the amount
121239: ** of data that will fit on a single leaf page of an intkey table in
121240: ** this database, then the average docsize is 1. Otherwise, it is 1 plus
121241: ** the number of overflow pages consumed by a record B bytes in size.
121242: */
121243: static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){
121244: if( pCsr->nRowAvg==0 ){
121245: /* The average document size, which is required to calculate the cost
121246: ** of each doclist, has not yet been determined. Read the required
121247: ** data from the %_stat table to calculate it.
121248: **
121249: ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3
121250: ** varints, where nCol is the number of columns in the FTS3 table.
121251: ** The first varint is the number of documents currently stored in
121252: ** the table. The following nCol varints contain the total amount of
121253: ** data stored in all rows of each column of the table, from left
121254: ** to right.
121255: */
121256: int rc;
121257: Fts3Table *p = (Fts3Table*)pCsr->base.pVtab;
121258: sqlite3_stmt *pStmt;
121259: sqlite3_int64 nDoc = 0;
121260: sqlite3_int64 nByte = 0;
121261: const char *pEnd;
121262: const char *a;
121263:
121264: rc = sqlite3Fts3SelectDoctotal(p, &pStmt);
121265: if( rc!=SQLITE_OK ) return rc;
121266: a = sqlite3_column_blob(pStmt, 0);
121267: assert( a );
121268:
121269: pEnd = &a[sqlite3_column_bytes(pStmt, 0)];
121270: a += sqlite3Fts3GetVarint(a, &nDoc);
121271: while( a<pEnd ){
121272: a += sqlite3Fts3GetVarint(a, &nByte);
121273: }
121274: if( nDoc==0 || nByte==0 ){
121275: sqlite3_reset(pStmt);
121276: return FTS_CORRUPT_VTAB;
121277: }
121278:
121279: pCsr->nDoc = nDoc;
121280: pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz);
121281: assert( pCsr->nRowAvg>0 );
121282: rc = sqlite3_reset(pStmt);
121283: if( rc!=SQLITE_OK ) return rc;
121284: }
121285:
121286: *pnPage = pCsr->nRowAvg;
121287: return SQLITE_OK;
121288: }
121289:
121290: /*
121291: ** This function is called to select the tokens (if any) that will be
121292: ** deferred. The array aTC[] has already been populated when this is
121293: ** called.
121294: **
121295: ** This function is called once for each AND/NEAR cluster in the
121296: ** expression. Each invocation determines which tokens to defer within
121297: ** the cluster with root node pRoot. See comments above the definition
121298: ** of struct Fts3TokenAndCost for more details.
121299: **
121300: ** If no error occurs, SQLITE_OK is returned and sqlite3Fts3DeferToken()
121301: ** called on each token to defer. Otherwise, an SQLite error code is
121302: ** returned.
121303: */
121304: static int fts3EvalSelectDeferred(
121305: Fts3Cursor *pCsr, /* FTS Cursor handle */
121306: Fts3Expr *pRoot, /* Consider tokens with this root node */
121307: Fts3TokenAndCost *aTC, /* Array of expression tokens and costs */
121308: int nTC /* Number of entries in aTC[] */
121309: ){
121310: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
121311: int nDocSize = 0; /* Number of pages per doc loaded */
121312: int rc = SQLITE_OK; /* Return code */
121313: int ii; /* Iterator variable for various purposes */
121314: int nOvfl = 0; /* Total overflow pages used by doclists */
121315: int nToken = 0; /* Total number of tokens in cluster */
121316:
121317: int nMinEst = 0; /* The minimum count for any phrase so far. */
121318: int nLoad4 = 1; /* (Phrases that will be loaded)^4. */
121319:
121320: /* Tokens are never deferred for FTS tables created using the content=xxx
121321: ** option. The reason being that it is not guaranteed that the content
121322: ** table actually contains the same data as the index. To prevent this from
121323: ** causing any problems, the deferred token optimization is completely
121324: ** disabled for content=xxx tables. */
121325: if( pTab->zContentTbl ){
121326: return SQLITE_OK;
121327: }
121328:
121329: /* Count the tokens in this AND/NEAR cluster. If none of the doclists
121330: ** associated with the tokens spill onto overflow pages, or if there is
121331: ** only 1 token, exit early. No tokens to defer in this case. */
121332: for(ii=0; ii<nTC; ii++){
121333: if( aTC[ii].pRoot==pRoot ){
121334: nOvfl += aTC[ii].nOvfl;
121335: nToken++;
121336: }
121337: }
121338: if( nOvfl==0 || nToken<2 ) return SQLITE_OK;
121339:
121340: /* Obtain the average docsize (in pages). */
121341: rc = fts3EvalAverageDocsize(pCsr, &nDocSize);
121342: assert( rc!=SQLITE_OK || nDocSize>0 );
121343:
121344:
121345: /* Iterate through all tokens in this AND/NEAR cluster, in ascending order
121346: ** of the number of overflow pages that will be loaded by the pager layer
121347: ** to retrieve the entire doclist for the token from the full-text index.
121348: ** Load the doclists for tokens that are either:
121349: **
121350: ** a. The cheapest token in the entire query (i.e. the one visited by the
121351: ** first iteration of this loop), or
121352: **
121353: ** b. Part of a multi-token phrase.
121354: **
121355: ** After each token doclist is loaded, merge it with the others from the
121356: ** same phrase and count the number of documents that the merged doclist
121357: ** contains. Set variable "nMinEst" to the smallest number of documents in
121358: ** any phrase doclist for which 1 or more token doclists have been loaded.
121359: ** Let nOther be the number of other phrases for which it is certain that
121360: ** one or more tokens will not be deferred.
121361: **
121362: ** Then, for each token, defer it if loading the doclist would result in
121363: ** loading N or more overflow pages into memory, where N is computed as:
121364: **
121365: ** (nMinEst + 4^nOther - 1) / (4^nOther)
121366: */
121367: for(ii=0; ii<nToken && rc==SQLITE_OK; ii++){
121368: int iTC; /* Used to iterate through aTC[] array. */
121369: Fts3TokenAndCost *pTC = 0; /* Set to cheapest remaining token. */
121370:
121371: /* Set pTC to point to the cheapest remaining token. */
121372: for(iTC=0; iTC<nTC; iTC++){
121373: if( aTC[iTC].pToken && aTC[iTC].pRoot==pRoot
121374: && (!pTC || aTC[iTC].nOvfl<pTC->nOvfl)
121375: ){
121376: pTC = &aTC[iTC];
121377: }
121378: }
121379: assert( pTC );
121380:
121381: if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){
121382: /* The number of overflow pages to load for this (and therefore all
121383: ** subsequent) tokens is greater than the estimated number of pages
121384: ** that will be loaded if all subsequent tokens are deferred.
121385: */
121386: Fts3PhraseToken *pToken = pTC->pToken;
121387: rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol);
121388: fts3SegReaderCursorFree(pToken->pSegcsr);
121389: pToken->pSegcsr = 0;
121390: }else{
121391: /* Set nLoad4 to the value of (4^nOther) for the next iteration of the
121392: ** for-loop. Except, limit the value to 2^24 to prevent it from
121393: ** overflowing the 32-bit integer it is stored in. */
121394: if( ii<12 ) nLoad4 = nLoad4*4;
121395:
121396: if( ii==0 || pTC->pPhrase->nToken>1 ){
121397: /* Either this is the cheapest token in the entire query, or it is
121398: ** part of a multi-token phrase. Either way, the entire doclist will
121399: ** (eventually) be loaded into memory. It may as well be now. */
121400: Fts3PhraseToken *pToken = pTC->pToken;
121401: int nList = 0;
121402: char *pList = 0;
121403: rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList);
121404: assert( rc==SQLITE_OK || pList==0 );
121405: if( rc==SQLITE_OK ){
121406: int nCount;
121407: fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken,pList,nList);
121408: nCount = fts3DoclistCountDocids(
121409: pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll
121410: );
121411: if( ii==0 || nCount<nMinEst ) nMinEst = nCount;
121412: }
121413: }
121414: }
121415: pTC->pToken = 0;
121416: }
121417:
121418: return rc;
121419: }
121420:
121421: /*
121422: ** This function is called from within the xFilter method. It initializes
121423: ** the full-text query currently stored in pCsr->pExpr. To iterate through
121424: ** the results of a query, the caller does:
121425: **
121426: ** fts3EvalStart(pCsr);
121427: ** while( 1 ){
121428: ** fts3EvalNext(pCsr);
121429: ** if( pCsr->bEof ) break;
121430: ** ... return row pCsr->iPrevId to the caller ...
121431: ** }
121432: */
121433: static int fts3EvalStart(Fts3Cursor *pCsr){
121434: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
121435: int rc = SQLITE_OK;
121436: int nToken = 0;
121437: int nOr = 0;
121438:
121439: /* Allocate a MultiSegReader for each token in the expression. */
121440: fts3EvalAllocateReaders(pCsr, pCsr->pExpr, &nToken, &nOr, &rc);
121441:
121442: /* Determine which, if any, tokens in the expression should be deferred. */
1.2.2.1 ! misho 121443: #ifndef SQLITE_DISABLE_FTS4_DEFERRED
! 121444: if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){
1.2 misho 121445: Fts3TokenAndCost *aTC;
121446: Fts3Expr **apOr;
121447: aTC = (Fts3TokenAndCost *)sqlite3_malloc(
121448: sizeof(Fts3TokenAndCost) * nToken
121449: + sizeof(Fts3Expr *) * nOr * 2
121450: );
121451: apOr = (Fts3Expr **)&aTC[nToken];
121452:
121453: if( !aTC ){
121454: rc = SQLITE_NOMEM;
121455: }else{
121456: int ii;
121457: Fts3TokenAndCost *pTC = aTC;
121458: Fts3Expr **ppOr = apOr;
121459:
121460: fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc);
1.2.2.1 ! misho 121461: nToken = (int)(pTC-aTC);
! 121462: nOr = (int)(ppOr-apOr);
1.2 misho 121463:
121464: if( rc==SQLITE_OK ){
121465: rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken);
121466: for(ii=0; rc==SQLITE_OK && ii<nOr; ii++){
121467: rc = fts3EvalSelectDeferred(pCsr, apOr[ii], aTC, nToken);
121468: }
121469: }
121470:
121471: sqlite3_free(aTC);
121472: }
121473: }
1.2.2.1 ! misho 121474: #endif
1.2 misho 121475:
121476: fts3EvalStartReaders(pCsr, pCsr->pExpr, 1, &rc);
121477: return rc;
121478: }
121479:
121480: /*
121481: ** Invalidate the current position list for phrase pPhrase.
121482: */
121483: static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){
121484: if( pPhrase->doclist.bFreeList ){
121485: sqlite3_free(pPhrase->doclist.pList);
121486: }
121487: pPhrase->doclist.pList = 0;
121488: pPhrase->doclist.nList = 0;
121489: pPhrase->doclist.bFreeList = 0;
121490: }
121491:
121492: /*
121493: ** This function is called to edit the position list associated with
121494: ** the phrase object passed as the fifth argument according to a NEAR
121495: ** condition. For example:
121496: **
121497: ** abc NEAR/5 "def ghi"
121498: **
121499: ** Parameter nNear is passed the NEAR distance of the expression (5 in
121500: ** the example above). When this function is called, *paPoslist points to
121501: ** the position list, and *pnToken is the number of phrase tokens in, the
121502: ** phrase on the other side of the NEAR operator to pPhrase. For example,
121503: ** if pPhrase refers to the "def ghi" phrase, then *paPoslist points to
121504: ** the position list associated with phrase "abc".
121505: **
121506: ** All positions in the pPhrase position list that are not sufficiently
121507: ** close to a position in the *paPoslist position list are removed. If this
121508: ** leaves 0 positions, zero is returned. Otherwise, non-zero.
121509: **
121510: ** Before returning, *paPoslist is set to point to the position lsit
121511: ** associated with pPhrase. And *pnToken is set to the number of tokens in
121512: ** pPhrase.
121513: */
121514: static int fts3EvalNearTrim(
121515: int nNear, /* NEAR distance. As in "NEAR/nNear". */
121516: char *aTmp, /* Temporary space to use */
121517: char **paPoslist, /* IN/OUT: Position list */
121518: int *pnToken, /* IN/OUT: Tokens in phrase of *paPoslist */
121519: Fts3Phrase *pPhrase /* The phrase object to trim the doclist of */
121520: ){
121521: int nParam1 = nNear + pPhrase->nToken;
121522: int nParam2 = nNear + *pnToken;
121523: int nNew;
121524: char *p2;
121525: char *pOut;
121526: int res;
121527:
121528: assert( pPhrase->doclist.pList );
121529:
121530: p2 = pOut = pPhrase->doclist.pList;
121531: res = fts3PoslistNearMerge(
121532: &pOut, aTmp, nParam1, nParam2, paPoslist, &p2
121533: );
121534: if( res ){
1.2.2.1 ! misho 121535: nNew = (int)(pOut - pPhrase->doclist.pList) - 1;
1.2 misho 121536: assert( pPhrase->doclist.pList[nNew]=='\0' );
121537: assert( nNew<=pPhrase->doclist.nList && nNew>0 );
121538: memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
121539: pPhrase->doclist.nList = nNew;
121540: *paPoslist = pPhrase->doclist.pList;
121541: *pnToken = pPhrase->nToken;
121542: }
121543:
121544: return res;
121545: }
121546:
121547: /*
121548: ** This function is a no-op if *pRc is other than SQLITE_OK when it is called.
121549: ** Otherwise, it advances the expression passed as the second argument to
121550: ** point to the next matching row in the database. Expressions iterate through
121551: ** matching rows in docid order. Ascending order if Fts3Cursor.bDesc is zero,
121552: ** or descending if it is non-zero.
121553: **
121554: ** If an error occurs, *pRc is set to an SQLite error code. Otherwise, if
121555: ** successful, the following variables in pExpr are set:
121556: **
121557: ** Fts3Expr.bEof (non-zero if EOF - there is no next row)
121558: ** Fts3Expr.iDocid (valid if bEof==0. The docid of the next row)
121559: **
121560: ** If the expression is of type FTSQUERY_PHRASE, and the expression is not
121561: ** at EOF, then the following variables are populated with the position list
121562: ** for the phrase for the visited row:
121563: **
121564: ** FTs3Expr.pPhrase->doclist.nList (length of pList in bytes)
121565: ** FTs3Expr.pPhrase->doclist.pList (pointer to position list)
121566: **
121567: ** It says above that this function advances the expression to the next
121568: ** matching row. This is usually true, but there are the following exceptions:
121569: **
121570: ** 1. Deferred tokens are not taken into account. If a phrase consists
121571: ** entirely of deferred tokens, it is assumed to match every row in
121572: ** the db. In this case the position-list is not populated at all.
121573: **
121574: ** Or, if a phrase contains one or more deferred tokens and one or
121575: ** more non-deferred tokens, then the expression is advanced to the
121576: ** next possible match, considering only non-deferred tokens. In other
121577: ** words, if the phrase is "A B C", and "B" is deferred, the expression
121578: ** is advanced to the next row that contains an instance of "A * C",
121579: ** where "*" may match any single token. The position list in this case
121580: ** is populated as for "A * C" before returning.
121581: **
121582: ** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is
121583: ** advanced to point to the next row that matches "x AND y".
121584: **
121585: ** See fts3EvalTestDeferredAndNear() for details on testing if a row is
121586: ** really a match, taking into account deferred tokens and NEAR operators.
121587: */
121588: static void fts3EvalNextRow(
121589: Fts3Cursor *pCsr, /* FTS Cursor handle */
121590: Fts3Expr *pExpr, /* Expr. to advance to next matching row */
121591: int *pRc /* IN/OUT: Error code */
121592: ){
121593: if( *pRc==SQLITE_OK ){
121594: int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */
121595: assert( pExpr->bEof==0 );
121596: pExpr->bStart = 1;
121597:
121598: switch( pExpr->eType ){
121599: case FTSQUERY_NEAR:
121600: case FTSQUERY_AND: {
121601: Fts3Expr *pLeft = pExpr->pLeft;
121602: Fts3Expr *pRight = pExpr->pRight;
121603: assert( !pLeft->bDeferred || !pRight->bDeferred );
121604:
121605: if( pLeft->bDeferred ){
121606: /* LHS is entirely deferred. So we assume it matches every row.
121607: ** Advance the RHS iterator to find the next row visited. */
121608: fts3EvalNextRow(pCsr, pRight, pRc);
121609: pExpr->iDocid = pRight->iDocid;
121610: pExpr->bEof = pRight->bEof;
121611: }else if( pRight->bDeferred ){
121612: /* RHS is entirely deferred. So we assume it matches every row.
121613: ** Advance the LHS iterator to find the next row visited. */
121614: fts3EvalNextRow(pCsr, pLeft, pRc);
121615: pExpr->iDocid = pLeft->iDocid;
121616: pExpr->bEof = pLeft->bEof;
121617: }else{
121618: /* Neither the RHS or LHS are deferred. */
121619: fts3EvalNextRow(pCsr, pLeft, pRc);
121620: fts3EvalNextRow(pCsr, pRight, pRc);
121621: while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){
121622: sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
121623: if( iDiff==0 ) break;
121624: if( iDiff<0 ){
121625: fts3EvalNextRow(pCsr, pLeft, pRc);
121626: }else{
121627: fts3EvalNextRow(pCsr, pRight, pRc);
121628: }
121629: }
121630: pExpr->iDocid = pLeft->iDocid;
121631: pExpr->bEof = (pLeft->bEof || pRight->bEof);
121632: }
121633: break;
121634: }
121635:
121636: case FTSQUERY_OR: {
121637: Fts3Expr *pLeft = pExpr->pLeft;
121638: Fts3Expr *pRight = pExpr->pRight;
121639: sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
121640:
121641: assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid );
121642: assert( pRight->bStart || pLeft->iDocid==pRight->iDocid );
121643:
121644: if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){
121645: fts3EvalNextRow(pCsr, pLeft, pRc);
121646: }else if( pLeft->bEof || (pRight->bEof==0 && iCmp>0) ){
121647: fts3EvalNextRow(pCsr, pRight, pRc);
121648: }else{
121649: fts3EvalNextRow(pCsr, pLeft, pRc);
121650: fts3EvalNextRow(pCsr, pRight, pRc);
121651: }
121652:
121653: pExpr->bEof = (pLeft->bEof && pRight->bEof);
121654: iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
121655: if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){
121656: pExpr->iDocid = pLeft->iDocid;
121657: }else{
121658: pExpr->iDocid = pRight->iDocid;
121659: }
121660:
121661: break;
121662: }
121663:
121664: case FTSQUERY_NOT: {
121665: Fts3Expr *pLeft = pExpr->pLeft;
121666: Fts3Expr *pRight = pExpr->pRight;
121667:
121668: if( pRight->bStart==0 ){
121669: fts3EvalNextRow(pCsr, pRight, pRc);
121670: assert( *pRc!=SQLITE_OK || pRight->bStart );
121671: }
121672:
121673: fts3EvalNextRow(pCsr, pLeft, pRc);
121674: if( pLeft->bEof==0 ){
121675: while( !*pRc
121676: && !pRight->bEof
121677: && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0
121678: ){
121679: fts3EvalNextRow(pCsr, pRight, pRc);
121680: }
121681: }
121682: pExpr->iDocid = pLeft->iDocid;
121683: pExpr->bEof = pLeft->bEof;
121684: break;
121685: }
121686:
121687: default: {
121688: Fts3Phrase *pPhrase = pExpr->pPhrase;
121689: fts3EvalInvalidatePoslist(pPhrase);
121690: *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof);
121691: pExpr->iDocid = pPhrase->doclist.iDocid;
121692: break;
121693: }
121694: }
121695: }
121696: }
121697:
121698: /*
121699: ** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR
121700: ** cluster, then this function returns 1 immediately.
121701: **
121702: ** Otherwise, it checks if the current row really does match the NEAR
121703: ** expression, using the data currently stored in the position lists
121704: ** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression.
121705: **
121706: ** If the current row is a match, the position list associated with each
121707: ** phrase in the NEAR expression is edited in place to contain only those
121708: ** phrase instances sufficiently close to their peers to satisfy all NEAR
121709: ** constraints. In this case it returns 1. If the NEAR expression does not
121710: ** match the current row, 0 is returned. The position lists may or may not
121711: ** be edited if 0 is returned.
121712: */
121713: static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){
121714: int res = 1;
121715:
121716: /* The following block runs if pExpr is the root of a NEAR query.
121717: ** For example, the query:
121718: **
121719: ** "w" NEAR "x" NEAR "y" NEAR "z"
121720: **
121721: ** which is represented in tree form as:
121722: **
121723: ** |
121724: ** +--NEAR--+ <-- root of NEAR query
121725: ** | |
121726: ** +--NEAR--+ "z"
121727: ** | |
121728: ** +--NEAR--+ "y"
121729: ** | |
121730: ** "w" "x"
121731: **
121732: ** The right-hand child of a NEAR node is always a phrase. The
121733: ** left-hand child may be either a phrase or a NEAR node. There are
121734: ** no exceptions to this - it's the way the parser in fts3_expr.c works.
121735: */
121736: if( *pRc==SQLITE_OK
121737: && pExpr->eType==FTSQUERY_NEAR
121738: && pExpr->bEof==0
121739: && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR)
121740: ){
121741: Fts3Expr *p;
121742: int nTmp = 0; /* Bytes of temp space */
121743: char *aTmp; /* Temp space for PoslistNearMerge() */
121744:
121745: /* Allocate temporary working space. */
121746: for(p=pExpr; p->pLeft; p=p->pLeft){
121747: nTmp += p->pRight->pPhrase->doclist.nList;
121748: }
121749: nTmp += p->pPhrase->doclist.nList;
1.2.2.1 ! misho 121750: if( nTmp==0 ){
1.2 misho 121751: res = 0;
121752: }else{
1.2.2.1 ! misho 121753: aTmp = sqlite3_malloc(nTmp*2);
! 121754: if( !aTmp ){
! 121755: *pRc = SQLITE_NOMEM;
! 121756: res = 0;
! 121757: }else{
! 121758: char *aPoslist = p->pPhrase->doclist.pList;
! 121759: int nToken = p->pPhrase->nToken;
! 121760:
! 121761: for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){
! 121762: Fts3Phrase *pPhrase = p->pRight->pPhrase;
! 121763: int nNear = p->nNear;
! 121764: res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
! 121765: }
! 121766:
! 121767: aPoslist = pExpr->pRight->pPhrase->doclist.pList;
! 121768: nToken = pExpr->pRight->pPhrase->nToken;
! 121769: for(p=pExpr->pLeft; p && res; p=p->pLeft){
! 121770: int nNear;
! 121771: Fts3Phrase *pPhrase;
! 121772: assert( p->pParent && p->pParent->pLeft==p );
! 121773: nNear = p->pParent->nNear;
! 121774: pPhrase = (
! 121775: p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase
! 121776: );
! 121777: res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
! 121778: }
1.2 misho 121779: }
121780:
1.2.2.1 ! misho 121781: sqlite3_free(aTmp);
! 121782: }
1.2 misho 121783: }
121784:
121785: return res;
121786: }
121787:
121788: /*
121789: ** This function is a helper function for fts3EvalTestDeferredAndNear().
121790: ** Assuming no error occurs or has occurred, It returns non-zero if the
121791: ** expression passed as the second argument matches the row that pCsr
121792: ** currently points to, or zero if it does not.
121793: **
121794: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
121795: ** If an error occurs during execution of this function, *pRc is set to
121796: ** the appropriate SQLite error code. In this case the returned value is
121797: ** undefined.
121798: */
121799: static int fts3EvalTestExpr(
121800: Fts3Cursor *pCsr, /* FTS cursor handle */
121801: Fts3Expr *pExpr, /* Expr to test. May or may not be root. */
121802: int *pRc /* IN/OUT: Error code */
121803: ){
121804: int bHit = 1; /* Return value */
121805: if( *pRc==SQLITE_OK ){
121806: switch( pExpr->eType ){
121807: case FTSQUERY_NEAR:
121808: case FTSQUERY_AND:
121809: bHit = (
121810: fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc)
121811: && fts3EvalTestExpr(pCsr, pExpr->pRight, pRc)
121812: && fts3EvalNearTest(pExpr, pRc)
121813: );
121814:
121815: /* If the NEAR expression does not match any rows, zero the doclist for
121816: ** all phrases involved in the NEAR. This is because the snippet(),
121817: ** offsets() and matchinfo() functions are not supposed to recognize
121818: ** any instances of phrases that are part of unmatched NEAR queries.
121819: ** For example if this expression:
121820: **
121821: ** ... MATCH 'a OR (b NEAR c)'
121822: **
121823: ** is matched against a row containing:
121824: **
121825: ** 'a b d e'
121826: **
121827: ** then any snippet() should ony highlight the "a" term, not the "b"
121828: ** (as "b" is part of a non-matching NEAR clause).
121829: */
121830: if( bHit==0
121831: && pExpr->eType==FTSQUERY_NEAR
121832: && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR)
121833: ){
121834: Fts3Expr *p;
121835: for(p=pExpr; p->pPhrase==0; p=p->pLeft){
121836: if( p->pRight->iDocid==pCsr->iPrevId ){
121837: fts3EvalInvalidatePoslist(p->pRight->pPhrase);
121838: }
121839: }
121840: if( p->iDocid==pCsr->iPrevId ){
121841: fts3EvalInvalidatePoslist(p->pPhrase);
121842: }
121843: }
121844:
121845: break;
121846:
121847: case FTSQUERY_OR: {
121848: int bHit1 = fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc);
121849: int bHit2 = fts3EvalTestExpr(pCsr, pExpr->pRight, pRc);
121850: bHit = bHit1 || bHit2;
121851: break;
121852: }
121853:
121854: case FTSQUERY_NOT:
121855: bHit = (
121856: fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc)
121857: && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc)
121858: );
121859: break;
121860:
121861: default: {
1.2.2.1 ! misho 121862: #ifndef SQLITE_DISABLE_FTS4_DEFERRED
1.2 misho 121863: if( pCsr->pDeferred
121864: && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred)
121865: ){
121866: Fts3Phrase *pPhrase = pExpr->pPhrase;
121867: assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 );
121868: if( pExpr->bDeferred ){
121869: fts3EvalInvalidatePoslist(pPhrase);
121870: }
121871: *pRc = fts3EvalDeferredPhrase(pCsr, pPhrase);
121872: bHit = (pPhrase->doclist.pList!=0);
121873: pExpr->iDocid = pCsr->iPrevId;
1.2.2.1 ! misho 121874: }else
! 121875: #endif
! 121876: {
1.2 misho 121877: bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId);
121878: }
121879: break;
121880: }
121881: }
121882: }
121883: return bHit;
121884: }
121885:
121886: /*
121887: ** This function is called as the second part of each xNext operation when
121888: ** iterating through the results of a full-text query. At this point the
121889: ** cursor points to a row that matches the query expression, with the
121890: ** following caveats:
121891: **
121892: ** * Up until this point, "NEAR" operators in the expression have been
121893: ** treated as "AND".
121894: **
121895: ** * Deferred tokens have not yet been considered.
121896: **
121897: ** If *pRc is not SQLITE_OK when this function is called, it immediately
121898: ** returns 0. Otherwise, it tests whether or not after considering NEAR
121899: ** operators and deferred tokens the current row is still a match for the
121900: ** expression. It returns 1 if both of the following are true:
121901: **
121902: ** 1. *pRc is SQLITE_OK when this function returns, and
121903: **
121904: ** 2. After scanning the current FTS table row for the deferred tokens,
121905: ** it is determined that the row does *not* match the query.
121906: **
121907: ** Or, if no error occurs and it seems the current row does match the FTS
121908: ** query, return 0.
121909: */
121910: static int fts3EvalTestDeferredAndNear(Fts3Cursor *pCsr, int *pRc){
121911: int rc = *pRc;
121912: int bMiss = 0;
121913: if( rc==SQLITE_OK ){
121914:
121915: /* If there are one or more deferred tokens, load the current row into
121916: ** memory and scan it to determine the position list for each deferred
121917: ** token. Then, see if this row is really a match, considering deferred
121918: ** tokens and NEAR operators (neither of which were taken into account
121919: ** earlier, by fts3EvalNextRow()).
121920: */
121921: if( pCsr->pDeferred ){
121922: rc = fts3CursorSeek(0, pCsr);
121923: if( rc==SQLITE_OK ){
121924: rc = sqlite3Fts3CacheDeferredDoclists(pCsr);
121925: }
121926: }
121927: bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc));
121928:
121929: /* Free the position-lists accumulated for each deferred token above. */
121930: sqlite3Fts3FreeDeferredDoclists(pCsr);
121931: *pRc = rc;
121932: }
121933: return (rc==SQLITE_OK && bMiss);
121934: }
121935:
121936: /*
121937: ** Advance to the next document that matches the FTS expression in
121938: ** Fts3Cursor.pExpr.
121939: */
121940: static int fts3EvalNext(Fts3Cursor *pCsr){
121941: int rc = SQLITE_OK; /* Return Code */
121942: Fts3Expr *pExpr = pCsr->pExpr;
121943: assert( pCsr->isEof==0 );
121944: if( pExpr==0 ){
121945: pCsr->isEof = 1;
121946: }else{
121947: do {
121948: if( pCsr->isRequireSeek==0 ){
121949: sqlite3_reset(pCsr->pStmt);
121950: }
121951: assert( sqlite3_data_count(pCsr->pStmt)==0 );
121952: fts3EvalNextRow(pCsr, pExpr, &rc);
121953: pCsr->isEof = pExpr->bEof;
121954: pCsr->isRequireSeek = 1;
121955: pCsr->isMatchinfoNeeded = 1;
121956: pCsr->iPrevId = pExpr->iDocid;
121957: }while( pCsr->isEof==0 && fts3EvalTestDeferredAndNear(pCsr, &rc) );
121958: }
121959: return rc;
121960: }
121961:
121962: /*
121963: ** Restart interation for expression pExpr so that the next call to
121964: ** fts3EvalNext() visits the first row. Do not allow incremental
121965: ** loading or merging of phrase doclists for this iteration.
121966: **
121967: ** If *pRc is other than SQLITE_OK when this function is called, it is
121968: ** a no-op. If an error occurs within this function, *pRc is set to an
121969: ** SQLite error code before returning.
121970: */
121971: static void fts3EvalRestart(
121972: Fts3Cursor *pCsr,
121973: Fts3Expr *pExpr,
121974: int *pRc
121975: ){
121976: if( pExpr && *pRc==SQLITE_OK ){
121977: Fts3Phrase *pPhrase = pExpr->pPhrase;
121978:
121979: if( pPhrase ){
121980: fts3EvalInvalidatePoslist(pPhrase);
121981: if( pPhrase->bIncr ){
121982: assert( pPhrase->nToken==1 );
121983: assert( pPhrase->aToken[0].pSegcsr );
121984: sqlite3Fts3MsrIncrRestart(pPhrase->aToken[0].pSegcsr);
121985: *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase);
121986: }
121987:
121988: pPhrase->doclist.pNextDocid = 0;
121989: pPhrase->doclist.iDocid = 0;
121990: }
121991:
121992: pExpr->iDocid = 0;
121993: pExpr->bEof = 0;
121994: pExpr->bStart = 0;
121995:
121996: fts3EvalRestart(pCsr, pExpr->pLeft, pRc);
121997: fts3EvalRestart(pCsr, pExpr->pRight, pRc);
121998: }
121999: }
122000:
122001: /*
122002: ** After allocating the Fts3Expr.aMI[] array for each phrase in the
122003: ** expression rooted at pExpr, the cursor iterates through all rows matched
122004: ** by pExpr, calling this function for each row. This function increments
122005: ** the values in Fts3Expr.aMI[] according to the position-list currently
122006: ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase
122007: ** expression nodes.
122008: */
122009: static void fts3EvalUpdateCounts(Fts3Expr *pExpr){
122010: if( pExpr ){
122011: Fts3Phrase *pPhrase = pExpr->pPhrase;
122012: if( pPhrase && pPhrase->doclist.pList ){
122013: int iCol = 0;
122014: char *p = pPhrase->doclist.pList;
122015:
122016: assert( *p );
122017: while( 1 ){
122018: u8 c = 0;
122019: int iCnt = 0;
122020: while( 0xFE & (*p | c) ){
122021: if( (c&0x80)==0 ) iCnt++;
122022: c = *p++ & 0x80;
122023: }
122024:
122025: /* aMI[iCol*3 + 1] = Number of occurrences
122026: ** aMI[iCol*3 + 2] = Number of rows containing at least one instance
122027: */
122028: pExpr->aMI[iCol*3 + 1] += iCnt;
122029: pExpr->aMI[iCol*3 + 2] += (iCnt>0);
122030: if( *p==0x00 ) break;
122031: p++;
122032: p += sqlite3Fts3GetVarint32(p, &iCol);
122033: }
122034: }
122035:
122036: fts3EvalUpdateCounts(pExpr->pLeft);
122037: fts3EvalUpdateCounts(pExpr->pRight);
122038: }
122039: }
122040:
122041: /*
122042: ** Expression pExpr must be of type FTSQUERY_PHRASE.
122043: **
122044: ** If it is not already allocated and populated, this function allocates and
122045: ** populates the Fts3Expr.aMI[] array for expression pExpr. If pExpr is part
122046: ** of a NEAR expression, then it also allocates and populates the same array
122047: ** for all other phrases that are part of the NEAR expression.
122048: **
122049: ** SQLITE_OK is returned if the aMI[] array is successfully allocated and
122050: ** populated. Otherwise, if an error occurs, an SQLite error code is returned.
122051: */
122052: static int fts3EvalGatherStats(
122053: Fts3Cursor *pCsr, /* Cursor object */
122054: Fts3Expr *pExpr /* FTSQUERY_PHRASE expression */
122055: ){
122056: int rc = SQLITE_OK; /* Return code */
122057:
122058: assert( pExpr->eType==FTSQUERY_PHRASE );
122059: if( pExpr->aMI==0 ){
122060: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
122061: Fts3Expr *pRoot; /* Root of NEAR expression */
122062: Fts3Expr *p; /* Iterator used for several purposes */
122063:
122064: sqlite3_int64 iPrevId = pCsr->iPrevId;
122065: sqlite3_int64 iDocid;
122066: u8 bEof;
122067:
122068: /* Find the root of the NEAR expression */
122069: pRoot = pExpr;
122070: while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){
122071: pRoot = pRoot->pParent;
122072: }
122073: iDocid = pRoot->iDocid;
122074: bEof = pRoot->bEof;
122075: assert( pRoot->bStart );
122076:
122077: /* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */
122078: for(p=pRoot; p; p=p->pLeft){
122079: Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight);
122080: assert( pE->aMI==0 );
122081: pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32));
122082: if( !pE->aMI ) return SQLITE_NOMEM;
122083: memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32));
122084: }
122085:
122086: fts3EvalRestart(pCsr, pRoot, &rc);
122087:
122088: while( pCsr->isEof==0 && rc==SQLITE_OK ){
122089:
122090: do {
122091: /* Ensure the %_content statement is reset. */
122092: if( pCsr->isRequireSeek==0 ) sqlite3_reset(pCsr->pStmt);
122093: assert( sqlite3_data_count(pCsr->pStmt)==0 );
122094:
122095: /* Advance to the next document */
122096: fts3EvalNextRow(pCsr, pRoot, &rc);
122097: pCsr->isEof = pRoot->bEof;
122098: pCsr->isRequireSeek = 1;
122099: pCsr->isMatchinfoNeeded = 1;
122100: pCsr->iPrevId = pRoot->iDocid;
122101: }while( pCsr->isEof==0
122102: && pRoot->eType==FTSQUERY_NEAR
122103: && fts3EvalTestDeferredAndNear(pCsr, &rc)
122104: );
122105:
122106: if( rc==SQLITE_OK && pCsr->isEof==0 ){
122107: fts3EvalUpdateCounts(pRoot);
122108: }
122109: }
122110:
122111: pCsr->isEof = 0;
122112: pCsr->iPrevId = iPrevId;
122113:
122114: if( bEof ){
122115: pRoot->bEof = bEof;
122116: }else{
122117: /* Caution: pRoot may iterate through docids in ascending or descending
122118: ** order. For this reason, even though it seems more defensive, the
122119: ** do loop can not be written:
122120: **
122121: ** do {...} while( pRoot->iDocid<iDocid && rc==SQLITE_OK );
122122: */
122123: fts3EvalRestart(pCsr, pRoot, &rc);
122124: do {
122125: fts3EvalNextRow(pCsr, pRoot, &rc);
122126: assert( pRoot->bEof==0 );
122127: }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK );
122128: fts3EvalTestDeferredAndNear(pCsr, &rc);
122129: }
122130: }
122131: return rc;
122132: }
122133:
122134: /*
122135: ** This function is used by the matchinfo() module to query a phrase
122136: ** expression node for the following information:
122137: **
122138: ** 1. The total number of occurrences of the phrase in each column of
122139: ** the FTS table (considering all rows), and
122140: **
122141: ** 2. For each column, the number of rows in the table for which the
122142: ** column contains at least one instance of the phrase.
122143: **
122144: ** If no error occurs, SQLITE_OK is returned and the values for each column
122145: ** written into the array aiOut as follows:
122146: **
122147: ** aiOut[iCol*3 + 1] = Number of occurrences
122148: ** aiOut[iCol*3 + 2] = Number of rows containing at least one instance
122149: **
122150: ** Caveats:
122151: **
122152: ** * If a phrase consists entirely of deferred tokens, then all output
122153: ** values are set to the number of documents in the table. In other
122154: ** words we assume that very common tokens occur exactly once in each
122155: ** column of each row of the table.
122156: **
122157: ** * If a phrase contains some deferred tokens (and some non-deferred
122158: ** tokens), count the potential occurrence identified by considering
122159: ** the non-deferred tokens instead of actual phrase occurrences.
122160: **
122161: ** * If the phrase is part of a NEAR expression, then only phrase instances
122162: ** that meet the NEAR constraint are included in the counts.
122163: */
122164: SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(
122165: Fts3Cursor *pCsr, /* FTS cursor handle */
122166: Fts3Expr *pExpr, /* Phrase expression */
122167: u32 *aiOut /* Array to write results into (see above) */
122168: ){
122169: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
122170: int rc = SQLITE_OK;
122171: int iCol;
122172:
122173: if( pExpr->bDeferred && pExpr->pParent->eType!=FTSQUERY_NEAR ){
122174: assert( pCsr->nDoc>0 );
122175: for(iCol=0; iCol<pTab->nColumn; iCol++){
122176: aiOut[iCol*3 + 1] = (u32)pCsr->nDoc;
122177: aiOut[iCol*3 + 2] = (u32)pCsr->nDoc;
122178: }
122179: }else{
122180: rc = fts3EvalGatherStats(pCsr, pExpr);
122181: if( rc==SQLITE_OK ){
122182: assert( pExpr->aMI );
122183: for(iCol=0; iCol<pTab->nColumn; iCol++){
122184: aiOut[iCol*3 + 1] = pExpr->aMI[iCol*3 + 1];
122185: aiOut[iCol*3 + 2] = pExpr->aMI[iCol*3 + 2];
122186: }
122187: }
122188: }
122189:
122190: return rc;
122191: }
122192:
122193: /*
122194: ** The expression pExpr passed as the second argument to this function
122195: ** must be of type FTSQUERY_PHRASE.
122196: **
122197: ** The returned value is either NULL or a pointer to a buffer containing
122198: ** a position-list indicating the occurrences of the phrase in column iCol
122199: ** of the current row.
122200: **
122201: ** More specifically, the returned buffer contains 1 varint for each
122202: ** occurence of the phrase in the column, stored using the normal (delta+2)
122203: ** compression and is terminated by either an 0x01 or 0x00 byte. For example,
122204: ** if the requested column contains "a b X c d X X" and the position-list
122205: ** for 'X' is requested, the buffer returned may contain:
122206: **
122207: ** 0x04 0x05 0x03 0x01 or 0x04 0x05 0x03 0x00
122208: **
122209: ** This function works regardless of whether or not the phrase is deferred,
122210: ** incremental, or neither.
122211: */
1.2.2.1 ! misho 122212: SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist(
1.2 misho 122213: Fts3Cursor *pCsr, /* FTS3 cursor object */
122214: Fts3Expr *pExpr, /* Phrase to return doclist for */
1.2.2.1 ! misho 122215: int iCol, /* Column to return position list for */
! 122216: char **ppOut /* OUT: Pointer to position list */
1.2 misho 122217: ){
122218: Fts3Phrase *pPhrase = pExpr->pPhrase;
122219: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
1.2.2.1 ! misho 122220: char *pIter;
1.2 misho 122221: int iThis;
1.2.2.1 ! misho 122222: sqlite3_int64 iDocid;
1.2 misho 122223:
1.2.2.1 ! misho 122224: /* If this phrase is applies specifically to some column other than
! 122225: ** column iCol, return a NULL pointer. */
! 122226: *ppOut = 0;
1.2 misho 122227: assert( iCol>=0 && iCol<pTab->nColumn );
1.2.2.1 ! misho 122228: if( (pPhrase->iColumn<pTab->nColumn && pPhrase->iColumn!=iCol) ){
! 122229: return SQLITE_OK;
! 122230: }
! 122231:
! 122232: iDocid = pExpr->iDocid;
! 122233: pIter = pPhrase->doclist.pList;
! 122234: if( iDocid!=pCsr->iPrevId || pExpr->bEof ){
! 122235: int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */
! 122236: int bOr = 0;
! 122237: u8 bEof = 0;
! 122238: Fts3Expr *p;
! 122239:
! 122240: /* Check if this phrase descends from an OR expression node. If not,
! 122241: ** return NULL. Otherwise, the entry that corresponds to docid
! 122242: ** pCsr->iPrevId may lie earlier in the doclist buffer. */
! 122243: for(p=pExpr->pParent; p; p=p->pParent){
! 122244: if( p->eType==FTSQUERY_OR ) bOr = 1;
! 122245: }
! 122246: if( bOr==0 ) return SQLITE_OK;
! 122247:
! 122248: /* This is the descendent of an OR node. In this case we cannot use
! 122249: ** an incremental phrase. Load the entire doclist for the phrase
! 122250: ** into memory in this case. */
! 122251: if( pPhrase->bIncr ){
! 122252: int rc = SQLITE_OK;
! 122253: int bEofSave = pExpr->bEof;
! 122254: fts3EvalRestart(pCsr, pExpr, &rc);
! 122255: while( rc==SQLITE_OK && !pExpr->bEof ){
! 122256: fts3EvalNextRow(pCsr, pExpr, &rc);
! 122257: if( bEofSave==0 && pExpr->iDocid==iDocid ) break;
! 122258: }
! 122259: pIter = pPhrase->doclist.pList;
! 122260: assert( rc!=SQLITE_OK || pPhrase->bIncr==0 );
! 122261: if( rc!=SQLITE_OK ) return rc;
! 122262: }
! 122263:
! 122264: if( pExpr->bEof ){
! 122265: pIter = 0;
! 122266: iDocid = 0;
! 122267: }
! 122268: bEof = (pPhrase->doclist.nAll==0);
! 122269: assert( bDescDoclist==0 || bDescDoclist==1 );
! 122270: assert( pCsr->bDesc==0 || pCsr->bDesc==1 );
! 122271:
! 122272: if( pCsr->bDesc==bDescDoclist ){
! 122273: int dummy;
! 122274: while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
! 122275: sqlite3Fts3DoclistPrev(
! 122276: bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
! 122277: &pIter, &iDocid, &dummy, &bEof
! 122278: );
! 122279: }
! 122280: }else{
! 122281: while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
! 122282: sqlite3Fts3DoclistNext(
! 122283: bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll,
! 122284: &pIter, &iDocid, &bEof
! 122285: );
! 122286: }
! 122287: }
! 122288:
! 122289: if( bEof || iDocid!=pCsr->iPrevId ) pIter = 0;
1.2 misho 122290: }
1.2.2.1 ! misho 122291: if( pIter==0 ) return SQLITE_OK;
1.2 misho 122292:
122293: if( *pIter==0x01 ){
122294: pIter++;
122295: pIter += sqlite3Fts3GetVarint32(pIter, &iThis);
122296: }else{
122297: iThis = 0;
122298: }
122299: while( iThis<iCol ){
122300: fts3ColumnlistCopy(0, &pIter);
122301: if( *pIter==0x00 ) return 0;
122302: pIter++;
122303: pIter += sqlite3Fts3GetVarint32(pIter, &iThis);
122304: }
122305:
1.2.2.1 ! misho 122306: *ppOut = ((iCol==iThis)?pIter:0);
! 122307: return SQLITE_OK;
1.2 misho 122308: }
122309:
122310: /*
122311: ** Free all components of the Fts3Phrase structure that were allocated by
122312: ** the eval module. Specifically, this means to free:
122313: **
122314: ** * the contents of pPhrase->doclist, and
122315: ** * any Fts3MultiSegReader objects held by phrase tokens.
122316: */
122317: SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){
122318: if( pPhrase ){
122319: int i;
122320: sqlite3_free(pPhrase->doclist.aAll);
122321: fts3EvalInvalidatePoslist(pPhrase);
122322: memset(&pPhrase->doclist, 0, sizeof(Fts3Doclist));
122323: for(i=0; i<pPhrase->nToken; i++){
122324: fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr);
122325: pPhrase->aToken[i].pSegcsr = 0;
122326: }
122327: }
122328: }
122329:
1.2.2.1 ! misho 122330:
1.2 misho 122331: /*
122332: ** Return SQLITE_CORRUPT_VTAB.
122333: */
122334: #ifdef SQLITE_DEBUG
122335: SQLITE_PRIVATE int sqlite3Fts3Corrupt(){
122336: return SQLITE_CORRUPT_VTAB;
122337: }
122338: #endif
122339:
122340: #if !SQLITE_CORE
122341: /*
122342: ** Initialize API pointer table, if required.
122343: */
122344: SQLITE_API int sqlite3_extension_init(
122345: sqlite3 *db,
122346: char **pzErrMsg,
122347: const sqlite3_api_routines *pApi
122348: ){
122349: SQLITE_EXTENSION_INIT2(pApi)
122350: return sqlite3Fts3Init(db);
122351: }
122352: #endif
122353:
122354: #endif
122355:
122356: /************** End of fts3.c ************************************************/
122357: /************** Begin file fts3_aux.c ****************************************/
122358: /*
122359: ** 2011 Jan 27
122360: **
122361: ** The author disclaims copyright to this source code. In place of
122362: ** a legal notice, here is a blessing:
122363: **
122364: ** May you do good and not evil.
122365: ** May you find forgiveness for yourself and forgive others.
122366: ** May you share freely, never taking more than you give.
122367: **
122368: ******************************************************************************
122369: **
122370: */
122371: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
122372:
122373: /* #include <string.h> */
122374: /* #include <assert.h> */
122375:
122376: typedef struct Fts3auxTable Fts3auxTable;
122377: typedef struct Fts3auxCursor Fts3auxCursor;
122378:
122379: struct Fts3auxTable {
122380: sqlite3_vtab base; /* Base class used by SQLite core */
122381: Fts3Table *pFts3Tab;
122382: };
122383:
122384: struct Fts3auxCursor {
122385: sqlite3_vtab_cursor base; /* Base class used by SQLite core */
122386: Fts3MultiSegReader csr; /* Must be right after "base" */
122387: Fts3SegFilter filter;
122388: char *zStop;
122389: int nStop; /* Byte-length of string zStop */
122390: int isEof; /* True if cursor is at EOF */
122391: sqlite3_int64 iRowid; /* Current rowid */
122392:
122393: int iCol; /* Current value of 'col' column */
122394: int nStat; /* Size of aStat[] array */
122395: struct Fts3auxColstats {
122396: sqlite3_int64 nDoc; /* 'documents' values for current csr row */
122397: sqlite3_int64 nOcc; /* 'occurrences' values for current csr row */
122398: } *aStat;
122399: };
122400:
122401: /*
122402: ** Schema of the terms table.
122403: */
122404: #define FTS3_TERMS_SCHEMA "CREATE TABLE x(term, col, documents, occurrences)"
122405:
122406: /*
122407: ** This function does all the work for both the xConnect and xCreate methods.
122408: ** These tables have no persistent representation of their own, so xConnect
122409: ** and xCreate are identical operations.
122410: */
122411: static int fts3auxConnectMethod(
122412: sqlite3 *db, /* Database connection */
122413: void *pUnused, /* Unused */
122414: int argc, /* Number of elements in argv array */
122415: const char * const *argv, /* xCreate/xConnect argument array */
122416: sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */
122417: char **pzErr /* OUT: sqlite3_malloc'd error message */
122418: ){
122419: char const *zDb; /* Name of database (e.g. "main") */
122420: char const *zFts3; /* Name of fts3 table */
122421: int nDb; /* Result of strlen(zDb) */
122422: int nFts3; /* Result of strlen(zFts3) */
122423: int nByte; /* Bytes of space to allocate here */
122424: int rc; /* value returned by declare_vtab() */
122425: Fts3auxTable *p; /* Virtual table object to return */
122426:
122427: UNUSED_PARAMETER(pUnused);
122428:
122429: /* The user should specify a single argument - the name of an fts3 table. */
122430: if( argc!=4 ){
122431: *pzErr = sqlite3_mprintf(
122432: "wrong number of arguments to fts4aux constructor"
122433: );
122434: return SQLITE_ERROR;
122435: }
122436:
122437: zDb = argv[1];
1.2.2.1 ! misho 122438: nDb = (int)strlen(zDb);
1.2 misho 122439: zFts3 = argv[3];
1.2.2.1 ! misho 122440: nFts3 = (int)strlen(zFts3);
1.2 misho 122441:
122442: rc = sqlite3_declare_vtab(db, FTS3_TERMS_SCHEMA);
122443: if( rc!=SQLITE_OK ) return rc;
122444:
122445: nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2;
122446: p = (Fts3auxTable *)sqlite3_malloc(nByte);
122447: if( !p ) return SQLITE_NOMEM;
122448: memset(p, 0, nByte);
122449:
122450: p->pFts3Tab = (Fts3Table *)&p[1];
122451: p->pFts3Tab->zDb = (char *)&p->pFts3Tab[1];
122452: p->pFts3Tab->zName = &p->pFts3Tab->zDb[nDb+1];
122453: p->pFts3Tab->db = db;
122454: p->pFts3Tab->nIndex = 1;
122455:
122456: memcpy((char *)p->pFts3Tab->zDb, zDb, nDb);
122457: memcpy((char *)p->pFts3Tab->zName, zFts3, nFts3);
122458: sqlite3Fts3Dequote((char *)p->pFts3Tab->zName);
122459:
122460: *ppVtab = (sqlite3_vtab *)p;
122461: return SQLITE_OK;
122462: }
122463:
122464: /*
122465: ** This function does the work for both the xDisconnect and xDestroy methods.
122466: ** These tables have no persistent representation of their own, so xDisconnect
122467: ** and xDestroy are identical operations.
122468: */
122469: static int fts3auxDisconnectMethod(sqlite3_vtab *pVtab){
122470: Fts3auxTable *p = (Fts3auxTable *)pVtab;
122471: Fts3Table *pFts3 = p->pFts3Tab;
122472: int i;
122473:
122474: /* Free any prepared statements held */
122475: for(i=0; i<SizeofArray(pFts3->aStmt); i++){
122476: sqlite3_finalize(pFts3->aStmt[i]);
122477: }
122478: sqlite3_free(pFts3->zSegmentsTbl);
122479: sqlite3_free(p);
122480: return SQLITE_OK;
122481: }
122482:
122483: #define FTS4AUX_EQ_CONSTRAINT 1
122484: #define FTS4AUX_GE_CONSTRAINT 2
122485: #define FTS4AUX_LE_CONSTRAINT 4
122486:
122487: /*
122488: ** xBestIndex - Analyze a WHERE and ORDER BY clause.
122489: */
122490: static int fts3auxBestIndexMethod(
122491: sqlite3_vtab *pVTab,
122492: sqlite3_index_info *pInfo
122493: ){
122494: int i;
122495: int iEq = -1;
122496: int iGe = -1;
122497: int iLe = -1;
122498:
122499: UNUSED_PARAMETER(pVTab);
122500:
122501: /* This vtab delivers always results in "ORDER BY term ASC" order. */
122502: if( pInfo->nOrderBy==1
122503: && pInfo->aOrderBy[0].iColumn==0
122504: && pInfo->aOrderBy[0].desc==0
122505: ){
122506: pInfo->orderByConsumed = 1;
122507: }
122508:
122509: /* Search for equality and range constraints on the "term" column. */
122510: for(i=0; i<pInfo->nConstraint; i++){
122511: if( pInfo->aConstraint[i].usable && pInfo->aConstraint[i].iColumn==0 ){
122512: int op = pInfo->aConstraint[i].op;
122513: if( op==SQLITE_INDEX_CONSTRAINT_EQ ) iEq = i;
122514: if( op==SQLITE_INDEX_CONSTRAINT_LT ) iLe = i;
122515: if( op==SQLITE_INDEX_CONSTRAINT_LE ) iLe = i;
122516: if( op==SQLITE_INDEX_CONSTRAINT_GT ) iGe = i;
122517: if( op==SQLITE_INDEX_CONSTRAINT_GE ) iGe = i;
122518: }
122519: }
122520:
122521: if( iEq>=0 ){
122522: pInfo->idxNum = FTS4AUX_EQ_CONSTRAINT;
122523: pInfo->aConstraintUsage[iEq].argvIndex = 1;
122524: pInfo->estimatedCost = 5;
122525: }else{
122526: pInfo->idxNum = 0;
122527: pInfo->estimatedCost = 20000;
122528: if( iGe>=0 ){
122529: pInfo->idxNum += FTS4AUX_GE_CONSTRAINT;
122530: pInfo->aConstraintUsage[iGe].argvIndex = 1;
122531: pInfo->estimatedCost /= 2;
122532: }
122533: if( iLe>=0 ){
122534: pInfo->idxNum += FTS4AUX_LE_CONSTRAINT;
122535: pInfo->aConstraintUsage[iLe].argvIndex = 1 + (iGe>=0);
122536: pInfo->estimatedCost /= 2;
122537: }
122538: }
122539:
122540: return SQLITE_OK;
122541: }
122542:
122543: /*
122544: ** xOpen - Open a cursor.
122545: */
122546: static int fts3auxOpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){
122547: Fts3auxCursor *pCsr; /* Pointer to cursor object to return */
122548:
122549: UNUSED_PARAMETER(pVTab);
122550:
122551: pCsr = (Fts3auxCursor *)sqlite3_malloc(sizeof(Fts3auxCursor));
122552: if( !pCsr ) return SQLITE_NOMEM;
122553: memset(pCsr, 0, sizeof(Fts3auxCursor));
122554:
122555: *ppCsr = (sqlite3_vtab_cursor *)pCsr;
122556: return SQLITE_OK;
122557: }
122558:
122559: /*
122560: ** xClose - Close a cursor.
122561: */
122562: static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){
122563: Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab;
122564: Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor;
122565:
122566: sqlite3Fts3SegmentsClose(pFts3);
122567: sqlite3Fts3SegReaderFinish(&pCsr->csr);
122568: sqlite3_free((void *)pCsr->filter.zTerm);
122569: sqlite3_free(pCsr->zStop);
122570: sqlite3_free(pCsr->aStat);
122571: sqlite3_free(pCsr);
122572: return SQLITE_OK;
122573: }
122574:
122575: static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){
122576: if( nSize>pCsr->nStat ){
122577: struct Fts3auxColstats *aNew;
122578: aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat,
122579: sizeof(struct Fts3auxColstats) * nSize
122580: );
122581: if( aNew==0 ) return SQLITE_NOMEM;
122582: memset(&aNew[pCsr->nStat], 0,
122583: sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat)
122584: );
122585: pCsr->aStat = aNew;
122586: pCsr->nStat = nSize;
122587: }
122588: return SQLITE_OK;
122589: }
122590:
122591: /*
122592: ** xNext - Advance the cursor to the next row, if any.
122593: */
122594: static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
122595: Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor;
122596: Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab;
122597: int rc;
122598:
122599: /* Increment our pretend rowid value. */
122600: pCsr->iRowid++;
122601:
122602: for(pCsr->iCol++; pCsr->iCol<pCsr->nStat; pCsr->iCol++){
122603: if( pCsr->aStat[pCsr->iCol].nDoc>0 ) return SQLITE_OK;
122604: }
122605:
122606: rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr);
122607: if( rc==SQLITE_ROW ){
122608: int i = 0;
122609: int nDoclist = pCsr->csr.nDoclist;
122610: char *aDoclist = pCsr->csr.aDoclist;
122611: int iCol;
122612:
122613: int eState = 0;
122614:
122615: if( pCsr->zStop ){
122616: int n = (pCsr->nStop<pCsr->csr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm;
122617: int mc = memcmp(pCsr->zStop, pCsr->csr.zTerm, n);
122618: if( mc<0 || (mc==0 && pCsr->csr.nTerm>pCsr->nStop) ){
122619: pCsr->isEof = 1;
122620: return SQLITE_OK;
122621: }
122622: }
122623:
122624: if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM;
122625: memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat);
122626: iCol = 0;
122627:
122628: while( i<nDoclist ){
122629: sqlite3_int64 v = 0;
122630:
122631: i += sqlite3Fts3GetVarint(&aDoclist[i], &v);
122632: switch( eState ){
122633: /* State 0. In this state the integer just read was a docid. */
122634: case 0:
122635: pCsr->aStat[0].nDoc++;
122636: eState = 1;
122637: iCol = 0;
122638: break;
122639:
122640: /* State 1. In this state we are expecting either a 1, indicating
122641: ** that the following integer will be a column number, or the
122642: ** start of a position list for column 0.
122643: **
122644: ** The only difference between state 1 and state 2 is that if the
122645: ** integer encountered in state 1 is not 0 or 1, then we need to
122646: ** increment the column 0 "nDoc" count for this term.
122647: */
122648: case 1:
122649: assert( iCol==0 );
122650: if( v>1 ){
122651: pCsr->aStat[1].nDoc++;
122652: }
122653: eState = 2;
122654: /* fall through */
122655:
122656: case 2:
122657: if( v==0 ){ /* 0x00. Next integer will be a docid. */
122658: eState = 0;
122659: }else if( v==1 ){ /* 0x01. Next integer will be a column number. */
122660: eState = 3;
122661: }else{ /* 2 or greater. A position. */
122662: pCsr->aStat[iCol+1].nOcc++;
122663: pCsr->aStat[0].nOcc++;
122664: }
122665: break;
122666:
122667: /* State 3. The integer just read is a column number. */
122668: default: assert( eState==3 );
122669: iCol = (int)v;
122670: if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM;
122671: pCsr->aStat[iCol+1].nDoc++;
122672: eState = 2;
122673: break;
122674: }
122675: }
122676:
122677: pCsr->iCol = 0;
122678: rc = SQLITE_OK;
122679: }else{
122680: pCsr->isEof = 1;
122681: }
122682: return rc;
122683: }
122684:
122685: /*
122686: ** xFilter - Initialize a cursor to point at the start of its data.
122687: */
122688: static int fts3auxFilterMethod(
122689: sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */
122690: int idxNum, /* Strategy index */
122691: const char *idxStr, /* Unused */
122692: int nVal, /* Number of elements in apVal */
122693: sqlite3_value **apVal /* Arguments for the indexing scheme */
122694: ){
122695: Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor;
122696: Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab;
122697: int rc;
122698: int isScan;
122699:
122700: UNUSED_PARAMETER(nVal);
122701: UNUSED_PARAMETER(idxStr);
122702:
122703: assert( idxStr==0 );
122704: assert( idxNum==FTS4AUX_EQ_CONSTRAINT || idxNum==0
122705: || idxNum==FTS4AUX_LE_CONSTRAINT || idxNum==FTS4AUX_GE_CONSTRAINT
122706: || idxNum==(FTS4AUX_LE_CONSTRAINT|FTS4AUX_GE_CONSTRAINT)
122707: );
122708: isScan = (idxNum!=FTS4AUX_EQ_CONSTRAINT);
122709:
122710: /* In case this cursor is being reused, close and zero it. */
122711: testcase(pCsr->filter.zTerm);
122712: sqlite3Fts3SegReaderFinish(&pCsr->csr);
122713: sqlite3_free((void *)pCsr->filter.zTerm);
122714: sqlite3_free(pCsr->aStat);
122715: memset(&pCsr->csr, 0, ((u8*)&pCsr[1]) - (u8*)&pCsr->csr);
122716:
122717: pCsr->filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY;
122718: if( isScan ) pCsr->filter.flags |= FTS3_SEGMENT_SCAN;
122719:
122720: if( idxNum&(FTS4AUX_EQ_CONSTRAINT|FTS4AUX_GE_CONSTRAINT) ){
122721: const unsigned char *zStr = sqlite3_value_text(apVal[0]);
122722: if( zStr ){
122723: pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr);
122724: pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]);
122725: if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM;
122726: }
122727: }
122728: if( idxNum&FTS4AUX_LE_CONSTRAINT ){
122729: int iIdx = (idxNum&FTS4AUX_GE_CONSTRAINT) ? 1 : 0;
122730: pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iIdx]));
122731: pCsr->nStop = sqlite3_value_bytes(apVal[iIdx]);
122732: if( pCsr->zStop==0 ) return SQLITE_NOMEM;
122733: }
122734:
1.2.2.1 ! misho 122735: rc = sqlite3Fts3SegReaderCursor(pFts3, 0, 0, FTS3_SEGCURSOR_ALL,
1.2 misho 122736: pCsr->filter.zTerm, pCsr->filter.nTerm, 0, isScan, &pCsr->csr
122737: );
122738: if( rc==SQLITE_OK ){
122739: rc = sqlite3Fts3SegReaderStart(pFts3, &pCsr->csr, &pCsr->filter);
122740: }
122741:
122742: if( rc==SQLITE_OK ) rc = fts3auxNextMethod(pCursor);
122743: return rc;
122744: }
122745:
122746: /*
122747: ** xEof - Return true if the cursor is at EOF, or false otherwise.
122748: */
122749: static int fts3auxEofMethod(sqlite3_vtab_cursor *pCursor){
122750: Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor;
122751: return pCsr->isEof;
122752: }
122753:
122754: /*
122755: ** xColumn - Return a column value.
122756: */
122757: static int fts3auxColumnMethod(
122758: sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */
122759: sqlite3_context *pContext, /* Context for sqlite3_result_xxx() calls */
122760: int iCol /* Index of column to read value from */
122761: ){
122762: Fts3auxCursor *p = (Fts3auxCursor *)pCursor;
122763:
122764: assert( p->isEof==0 );
122765: if( iCol==0 ){ /* Column "term" */
122766: sqlite3_result_text(pContext, p->csr.zTerm, p->csr.nTerm, SQLITE_TRANSIENT);
122767: }else if( iCol==1 ){ /* Column "col" */
122768: if( p->iCol ){
122769: sqlite3_result_int(pContext, p->iCol-1);
122770: }else{
122771: sqlite3_result_text(pContext, "*", -1, SQLITE_STATIC);
122772: }
122773: }else if( iCol==2 ){ /* Column "documents" */
122774: sqlite3_result_int64(pContext, p->aStat[p->iCol].nDoc);
122775: }else{ /* Column "occurrences" */
122776: sqlite3_result_int64(pContext, p->aStat[p->iCol].nOcc);
122777: }
122778:
122779: return SQLITE_OK;
122780: }
122781:
122782: /*
122783: ** xRowid - Return the current rowid for the cursor.
122784: */
122785: static int fts3auxRowidMethod(
122786: sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */
122787: sqlite_int64 *pRowid /* OUT: Rowid value */
122788: ){
122789: Fts3auxCursor *pCsr = (Fts3auxCursor *)pCursor;
122790: *pRowid = pCsr->iRowid;
122791: return SQLITE_OK;
122792: }
122793:
122794: /*
122795: ** Register the fts3aux module with database connection db. Return SQLITE_OK
122796: ** if successful or an error code if sqlite3_create_module() fails.
122797: */
122798: SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){
122799: static const sqlite3_module fts3aux_module = {
122800: 0, /* iVersion */
122801: fts3auxConnectMethod, /* xCreate */
122802: fts3auxConnectMethod, /* xConnect */
122803: fts3auxBestIndexMethod, /* xBestIndex */
122804: fts3auxDisconnectMethod, /* xDisconnect */
122805: fts3auxDisconnectMethod, /* xDestroy */
122806: fts3auxOpenMethod, /* xOpen */
122807: fts3auxCloseMethod, /* xClose */
122808: fts3auxFilterMethod, /* xFilter */
122809: fts3auxNextMethod, /* xNext */
122810: fts3auxEofMethod, /* xEof */
122811: fts3auxColumnMethod, /* xColumn */
122812: fts3auxRowidMethod, /* xRowid */
122813: 0, /* xUpdate */
122814: 0, /* xBegin */
122815: 0, /* xSync */
122816: 0, /* xCommit */
122817: 0, /* xRollback */
122818: 0, /* xFindFunction */
122819: 0, /* xRename */
122820: 0, /* xSavepoint */
122821: 0, /* xRelease */
122822: 0 /* xRollbackTo */
122823: };
122824: int rc; /* Return code */
122825:
122826: rc = sqlite3_create_module(db, "fts4aux", &fts3aux_module, 0);
122827: return rc;
122828: }
122829:
122830: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
122831:
122832: /************** End of fts3_aux.c ********************************************/
122833: /************** Begin file fts3_expr.c ***************************************/
122834: /*
122835: ** 2008 Nov 28
122836: **
122837: ** The author disclaims copyright to this source code. In place of
122838: ** a legal notice, here is a blessing:
122839: **
122840: ** May you do good and not evil.
122841: ** May you find forgiveness for yourself and forgive others.
122842: ** May you share freely, never taking more than you give.
122843: **
122844: ******************************************************************************
122845: **
122846: ** This module contains code that implements a parser for fts3 query strings
122847: ** (the right-hand argument to the MATCH operator). Because the supported
122848: ** syntax is relatively simple, the whole tokenizer/parser system is
122849: ** hand-coded.
122850: */
122851: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
122852:
122853: /*
122854: ** By default, this module parses the legacy syntax that has been
122855: ** traditionally used by fts3. Or, if SQLITE_ENABLE_FTS3_PARENTHESIS
122856: ** is defined, then it uses the new syntax. The differences between
122857: ** the new and the old syntaxes are:
122858: **
122859: ** a) The new syntax supports parenthesis. The old does not.
122860: **
122861: ** b) The new syntax supports the AND and NOT operators. The old does not.
122862: **
122863: ** c) The old syntax supports the "-" token qualifier. This is not
122864: ** supported by the new syntax (it is replaced by the NOT operator).
122865: **
122866: ** d) When using the old syntax, the OR operator has a greater precedence
122867: ** than an implicit AND. When using the new, both implicity and explicit
122868: ** AND operators have a higher precedence than OR.
122869: **
122870: ** If compiled with SQLITE_TEST defined, then this module exports the
122871: ** symbol "int sqlite3_fts3_enable_parentheses". Setting this variable
122872: ** to zero causes the module to use the old syntax. If it is set to
122873: ** non-zero the new syntax is activated. This is so both syntaxes can
122874: ** be tested using a single build of testfixture.
122875: **
122876: ** The following describes the syntax supported by the fts3 MATCH
122877: ** operator in a similar format to that used by the lemon parser
122878: ** generator. This module does not use actually lemon, it uses a
122879: ** custom parser.
122880: **
122881: ** query ::= andexpr (OR andexpr)*.
122882: **
122883: ** andexpr ::= notexpr (AND? notexpr)*.
122884: **
122885: ** notexpr ::= nearexpr (NOT nearexpr|-TOKEN)*.
122886: ** notexpr ::= LP query RP.
122887: **
122888: ** nearexpr ::= phrase (NEAR distance_opt nearexpr)*.
122889: **
122890: ** distance_opt ::= .
122891: ** distance_opt ::= / INTEGER.
122892: **
122893: ** phrase ::= TOKEN.
122894: ** phrase ::= COLUMN:TOKEN.
122895: ** phrase ::= "TOKEN TOKEN TOKEN...".
122896: */
122897:
122898: #ifdef SQLITE_TEST
122899: SQLITE_API int sqlite3_fts3_enable_parentheses = 0;
122900: #else
122901: # ifdef SQLITE_ENABLE_FTS3_PARENTHESIS
122902: # define sqlite3_fts3_enable_parentheses 1
122903: # else
122904: # define sqlite3_fts3_enable_parentheses 0
122905: # endif
122906: #endif
122907:
122908: /*
122909: ** Default span for NEAR operators.
122910: */
122911: #define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10
122912:
122913: /* #include <string.h> */
122914: /* #include <assert.h> */
122915:
122916: /*
122917: ** isNot:
122918: ** This variable is used by function getNextNode(). When getNextNode() is
122919: ** called, it sets ParseContext.isNot to true if the 'next node' is a
122920: ** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the
122921: ** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to
122922: ** zero.
122923: */
122924: typedef struct ParseContext ParseContext;
122925: struct ParseContext {
122926: sqlite3_tokenizer *pTokenizer; /* Tokenizer module */
1.2.2.1 ! misho 122927: int iLangid; /* Language id used with tokenizer */
1.2 misho 122928: const char **azCol; /* Array of column names for fts3 table */
122929: int bFts4; /* True to allow FTS4-only syntax */
122930: int nCol; /* Number of entries in azCol[] */
122931: int iDefaultCol; /* Default column to query */
122932: int isNot; /* True if getNextNode() sees a unary - */
122933: sqlite3_context *pCtx; /* Write error message here */
122934: int nNest; /* Number of nested brackets */
122935: };
122936:
122937: /*
122938: ** This function is equivalent to the standard isspace() function.
122939: **
122940: ** The standard isspace() can be awkward to use safely, because although it
122941: ** is defined to accept an argument of type int, its behaviour when passed
122942: ** an integer that falls outside of the range of the unsigned char type
122943: ** is undefined (and sometimes, "undefined" means segfault). This wrapper
122944: ** is defined to accept an argument of type char, and always returns 0 for
122945: ** any values that fall outside of the range of the unsigned char type (i.e.
122946: ** negative values).
122947: */
122948: static int fts3isspace(char c){
122949: return c==' ' || c=='\t' || c=='\n' || c=='\r' || c=='\v' || c=='\f';
122950: }
122951:
122952: /*
122953: ** Allocate nByte bytes of memory using sqlite3_malloc(). If successful,
122954: ** zero the memory before returning a pointer to it. If unsuccessful,
122955: ** return NULL.
122956: */
122957: static void *fts3MallocZero(int nByte){
122958: void *pRet = sqlite3_malloc(nByte);
122959: if( pRet ) memset(pRet, 0, nByte);
122960: return pRet;
122961: }
122962:
1.2.2.1 ! misho 122963: SQLITE_PRIVATE int sqlite3Fts3OpenTokenizer(
! 122964: sqlite3_tokenizer *pTokenizer,
! 122965: int iLangid,
! 122966: const char *z,
! 122967: int n,
! 122968: sqlite3_tokenizer_cursor **ppCsr
! 122969: ){
! 122970: sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
! 122971: sqlite3_tokenizer_cursor *pCsr = 0;
! 122972: int rc;
! 122973:
! 122974: rc = pModule->xOpen(pTokenizer, z, n, &pCsr);
! 122975: assert( rc==SQLITE_OK || pCsr==0 );
! 122976: if( rc==SQLITE_OK ){
! 122977: pCsr->pTokenizer = pTokenizer;
! 122978: if( pModule->iVersion>=1 ){
! 122979: rc = pModule->xLanguageid(pCsr, iLangid);
! 122980: if( rc!=SQLITE_OK ){
! 122981: pModule->xClose(pCsr);
! 122982: pCsr = 0;
! 122983: }
! 122984: }
! 122985: }
! 122986: *ppCsr = pCsr;
! 122987: return rc;
! 122988: }
! 122989:
1.2 misho 122990:
122991: /*
122992: ** Extract the next token from buffer z (length n) using the tokenizer
122993: ** and other information (column names etc.) in pParse. Create an Fts3Expr
122994: ** structure of type FTSQUERY_PHRASE containing a phrase consisting of this
122995: ** single token and set *ppExpr to point to it. If the end of the buffer is
122996: ** reached before a token is found, set *ppExpr to zero. It is the
122997: ** responsibility of the caller to eventually deallocate the allocated
122998: ** Fts3Expr structure (if any) by passing it to sqlite3_free().
122999: **
123000: ** Return SQLITE_OK if successful, or SQLITE_NOMEM if a memory allocation
123001: ** fails.
123002: */
123003: static int getNextToken(
123004: ParseContext *pParse, /* fts3 query parse context */
123005: int iCol, /* Value for Fts3Phrase.iColumn */
123006: const char *z, int n, /* Input string */
123007: Fts3Expr **ppExpr, /* OUT: expression */
123008: int *pnConsumed /* OUT: Number of bytes consumed */
123009: ){
123010: sqlite3_tokenizer *pTokenizer = pParse->pTokenizer;
123011: sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
123012: int rc;
123013: sqlite3_tokenizer_cursor *pCursor;
123014: Fts3Expr *pRet = 0;
123015: int nConsumed = 0;
123016:
1.2.2.1 ! misho 123017: rc = sqlite3Fts3OpenTokenizer(pTokenizer, pParse->iLangid, z, n, &pCursor);
1.2 misho 123018: if( rc==SQLITE_OK ){
123019: const char *zToken;
1.2.2.1 ! misho 123020: int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0;
1.2 misho 123021: int nByte; /* total space to allocate */
123022:
123023: rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition);
123024: if( rc==SQLITE_OK ){
123025: nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase) + nToken;
123026: pRet = (Fts3Expr *)fts3MallocZero(nByte);
123027: if( !pRet ){
123028: rc = SQLITE_NOMEM;
123029: }else{
123030: pRet->eType = FTSQUERY_PHRASE;
123031: pRet->pPhrase = (Fts3Phrase *)&pRet[1];
123032: pRet->pPhrase->nToken = 1;
123033: pRet->pPhrase->iColumn = iCol;
123034: pRet->pPhrase->aToken[0].n = nToken;
123035: pRet->pPhrase->aToken[0].z = (char *)&pRet->pPhrase[1];
123036: memcpy(pRet->pPhrase->aToken[0].z, zToken, nToken);
123037:
123038: if( iEnd<n && z[iEnd]=='*' ){
123039: pRet->pPhrase->aToken[0].isPrefix = 1;
123040: iEnd++;
123041: }
123042:
123043: while( 1 ){
123044: if( !sqlite3_fts3_enable_parentheses
123045: && iStart>0 && z[iStart-1]=='-'
123046: ){
123047: pParse->isNot = 1;
123048: iStart--;
123049: }else if( pParse->bFts4 && iStart>0 && z[iStart-1]=='^' ){
123050: pRet->pPhrase->aToken[0].bFirst = 1;
123051: iStart--;
123052: }else{
123053: break;
123054: }
123055: }
123056:
123057: }
123058: nConsumed = iEnd;
123059: }
123060:
123061: pModule->xClose(pCursor);
123062: }
123063:
123064: *pnConsumed = nConsumed;
123065: *ppExpr = pRet;
123066: return rc;
123067: }
123068:
123069:
123070: /*
123071: ** Enlarge a memory allocation. If an out-of-memory allocation occurs,
123072: ** then free the old allocation.
123073: */
123074: static void *fts3ReallocOrFree(void *pOrig, int nNew){
123075: void *pRet = sqlite3_realloc(pOrig, nNew);
123076: if( !pRet ){
123077: sqlite3_free(pOrig);
123078: }
123079: return pRet;
123080: }
123081:
123082: /*
123083: ** Buffer zInput, length nInput, contains the contents of a quoted string
123084: ** that appeared as part of an fts3 query expression. Neither quote character
123085: ** is included in the buffer. This function attempts to tokenize the entire
123086: ** input buffer and create an Fts3Expr structure of type FTSQUERY_PHRASE
123087: ** containing the results.
123088: **
123089: ** If successful, SQLITE_OK is returned and *ppExpr set to point at the
123090: ** allocated Fts3Expr structure. Otherwise, either SQLITE_NOMEM (out of memory
123091: ** error) or SQLITE_ERROR (tokenization error) is returned and *ppExpr set
123092: ** to 0.
123093: */
123094: static int getNextString(
123095: ParseContext *pParse, /* fts3 query parse context */
123096: const char *zInput, int nInput, /* Input string */
123097: Fts3Expr **ppExpr /* OUT: expression */
123098: ){
123099: sqlite3_tokenizer *pTokenizer = pParse->pTokenizer;
123100: sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
123101: int rc;
123102: Fts3Expr *p = 0;
123103: sqlite3_tokenizer_cursor *pCursor = 0;
123104: char *zTemp = 0;
123105: int nTemp = 0;
123106:
123107: const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
123108: int nToken = 0;
123109:
123110: /* The final Fts3Expr data structure, including the Fts3Phrase,
123111: ** Fts3PhraseToken structures token buffers are all stored as a single
123112: ** allocation so that the expression can be freed with a single call to
123113: ** sqlite3_free(). Setting this up requires a two pass approach.
123114: **
123115: ** The first pass, in the block below, uses a tokenizer cursor to iterate
123116: ** through the tokens in the expression. This pass uses fts3ReallocOrFree()
123117: ** to assemble data in two dynamic buffers:
123118: **
123119: ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase
123120: ** structure, followed by the array of Fts3PhraseToken
123121: ** structures. This pass only populates the Fts3PhraseToken array.
123122: **
123123: ** Buffer zTemp: Contains copies of all tokens.
123124: **
123125: ** The second pass, in the block that begins "if( rc==SQLITE_DONE )" below,
123126: ** appends buffer zTemp to buffer p, and fills in the Fts3Expr and Fts3Phrase
123127: ** structures.
123128: */
1.2.2.1 ! misho 123129: rc = sqlite3Fts3OpenTokenizer(
! 123130: pTokenizer, pParse->iLangid, zInput, nInput, &pCursor);
1.2 misho 123131: if( rc==SQLITE_OK ){
123132: int ii;
123133: for(ii=0; rc==SQLITE_OK; ii++){
123134: const char *zByte;
1.2.2.1 ! misho 123135: int nByte = 0, iBegin = 0, iEnd = 0, iPos = 0;
1.2 misho 123136: rc = pModule->xNext(pCursor, &zByte, &nByte, &iBegin, &iEnd, &iPos);
123137: if( rc==SQLITE_OK ){
123138: Fts3PhraseToken *pToken;
123139:
123140: p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken));
123141: if( !p ) goto no_mem;
123142:
123143: zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte);
123144: if( !zTemp ) goto no_mem;
123145:
123146: assert( nToken==ii );
123147: pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii];
123148: memset(pToken, 0, sizeof(Fts3PhraseToken));
123149:
123150: memcpy(&zTemp[nTemp], zByte, nByte);
123151: nTemp += nByte;
123152:
123153: pToken->n = nByte;
123154: pToken->isPrefix = (iEnd<nInput && zInput[iEnd]=='*');
123155: pToken->bFirst = (iBegin>0 && zInput[iBegin-1]=='^');
123156: nToken = ii+1;
123157: }
123158: }
123159:
123160: pModule->xClose(pCursor);
123161: pCursor = 0;
123162: }
123163:
123164: if( rc==SQLITE_DONE ){
123165: int jj;
123166: char *zBuf = 0;
123167:
123168: p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp);
123169: if( !p ) goto no_mem;
123170: memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p);
123171: p->eType = FTSQUERY_PHRASE;
123172: p->pPhrase = (Fts3Phrase *)&p[1];
123173: p->pPhrase->iColumn = pParse->iDefaultCol;
123174: p->pPhrase->nToken = nToken;
123175:
123176: zBuf = (char *)&p->pPhrase->aToken[nToken];
123177: if( zTemp ){
123178: memcpy(zBuf, zTemp, nTemp);
123179: sqlite3_free(zTemp);
123180: }else{
123181: assert( nTemp==0 );
123182: }
123183:
123184: for(jj=0; jj<p->pPhrase->nToken; jj++){
123185: p->pPhrase->aToken[jj].z = zBuf;
123186: zBuf += p->pPhrase->aToken[jj].n;
123187: }
123188: rc = SQLITE_OK;
123189: }
123190:
123191: *ppExpr = p;
123192: return rc;
123193: no_mem:
123194:
123195: if( pCursor ){
123196: pModule->xClose(pCursor);
123197: }
123198: sqlite3_free(zTemp);
123199: sqlite3_free(p);
123200: *ppExpr = 0;
123201: return SQLITE_NOMEM;
123202: }
123203:
123204: /*
123205: ** Function getNextNode(), which is called by fts3ExprParse(), may itself
123206: ** call fts3ExprParse(). So this forward declaration is required.
123207: */
123208: static int fts3ExprParse(ParseContext *, const char *, int, Fts3Expr **, int *);
123209:
123210: /*
123211: ** The output variable *ppExpr is populated with an allocated Fts3Expr
123212: ** structure, or set to 0 if the end of the input buffer is reached.
123213: **
123214: ** Returns an SQLite error code. SQLITE_OK if everything works, SQLITE_NOMEM
123215: ** if a malloc failure occurs, or SQLITE_ERROR if a parse error is encountered.
123216: ** If SQLITE_ERROR is returned, pContext is populated with an error message.
123217: */
123218: static int getNextNode(
123219: ParseContext *pParse, /* fts3 query parse context */
123220: const char *z, int n, /* Input string */
123221: Fts3Expr **ppExpr, /* OUT: expression */
123222: int *pnConsumed /* OUT: Number of bytes consumed */
123223: ){
123224: static const struct Fts3Keyword {
123225: char *z; /* Keyword text */
123226: unsigned char n; /* Length of the keyword */
123227: unsigned char parenOnly; /* Only valid in paren mode */
123228: unsigned char eType; /* Keyword code */
123229: } aKeyword[] = {
123230: { "OR" , 2, 0, FTSQUERY_OR },
123231: { "AND", 3, 1, FTSQUERY_AND },
123232: { "NOT", 3, 1, FTSQUERY_NOT },
123233: { "NEAR", 4, 0, FTSQUERY_NEAR }
123234: };
123235: int ii;
123236: int iCol;
123237: int iColLen;
123238: int rc;
123239: Fts3Expr *pRet = 0;
123240:
123241: const char *zInput = z;
123242: int nInput = n;
123243:
123244: pParse->isNot = 0;
123245:
123246: /* Skip over any whitespace before checking for a keyword, an open or
123247: ** close bracket, or a quoted string.
123248: */
123249: while( nInput>0 && fts3isspace(*zInput) ){
123250: nInput--;
123251: zInput++;
123252: }
123253: if( nInput==0 ){
123254: return SQLITE_DONE;
123255: }
123256:
123257: /* See if we are dealing with a keyword. */
123258: for(ii=0; ii<(int)(sizeof(aKeyword)/sizeof(struct Fts3Keyword)); ii++){
123259: const struct Fts3Keyword *pKey = &aKeyword[ii];
123260:
123261: if( (pKey->parenOnly & ~sqlite3_fts3_enable_parentheses)!=0 ){
123262: continue;
123263: }
123264:
123265: if( nInput>=pKey->n && 0==memcmp(zInput, pKey->z, pKey->n) ){
123266: int nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM;
123267: int nKey = pKey->n;
123268: char cNext;
123269:
123270: /* If this is a "NEAR" keyword, check for an explicit nearness. */
123271: if( pKey->eType==FTSQUERY_NEAR ){
123272: assert( nKey==4 );
123273: if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){
123274: nNear = 0;
123275: for(nKey=5; zInput[nKey]>='0' && zInput[nKey]<='9'; nKey++){
123276: nNear = nNear * 10 + (zInput[nKey] - '0');
123277: }
123278: }
123279: }
123280:
123281: /* At this point this is probably a keyword. But for that to be true,
123282: ** the next byte must contain either whitespace, an open or close
123283: ** parenthesis, a quote character, or EOF.
123284: */
123285: cNext = zInput[nKey];
123286: if( fts3isspace(cNext)
123287: || cNext=='"' || cNext=='(' || cNext==')' || cNext==0
123288: ){
123289: pRet = (Fts3Expr *)fts3MallocZero(sizeof(Fts3Expr));
123290: if( !pRet ){
123291: return SQLITE_NOMEM;
123292: }
123293: pRet->eType = pKey->eType;
123294: pRet->nNear = nNear;
123295: *ppExpr = pRet;
123296: *pnConsumed = (int)((zInput - z) + nKey);
123297: return SQLITE_OK;
123298: }
123299:
123300: /* Turns out that wasn't a keyword after all. This happens if the
123301: ** user has supplied a token such as "ORacle". Continue.
123302: */
123303: }
123304: }
123305:
123306: /* Check for an open bracket. */
123307: if( sqlite3_fts3_enable_parentheses ){
123308: if( *zInput=='(' ){
123309: int nConsumed;
123310: pParse->nNest++;
123311: rc = fts3ExprParse(pParse, &zInput[1], nInput-1, ppExpr, &nConsumed);
123312: if( rc==SQLITE_OK && !*ppExpr ){
123313: rc = SQLITE_DONE;
123314: }
123315: *pnConsumed = (int)((zInput - z) + 1 + nConsumed);
123316: return rc;
123317: }
123318:
123319: /* Check for a close bracket. */
123320: if( *zInput==')' ){
123321: pParse->nNest--;
123322: *pnConsumed = (int)((zInput - z) + 1);
123323: return SQLITE_DONE;
123324: }
123325: }
123326:
123327: /* See if we are dealing with a quoted phrase. If this is the case, then
123328: ** search for the closing quote and pass the whole string to getNextString()
123329: ** for processing. This is easy to do, as fts3 has no syntax for escaping
123330: ** a quote character embedded in a string.
123331: */
123332: if( *zInput=='"' ){
123333: for(ii=1; ii<nInput && zInput[ii]!='"'; ii++);
123334: *pnConsumed = (int)((zInput - z) + ii + 1);
123335: if( ii==nInput ){
123336: return SQLITE_ERROR;
123337: }
123338: return getNextString(pParse, &zInput[1], ii-1, ppExpr);
123339: }
123340:
123341:
123342: /* If control flows to this point, this must be a regular token, or
123343: ** the end of the input. Read a regular token using the sqlite3_tokenizer
123344: ** interface. Before doing so, figure out if there is an explicit
123345: ** column specifier for the token.
123346: **
123347: ** TODO: Strangely, it is not possible to associate a column specifier
123348: ** with a quoted phrase, only with a single token. Not sure if this was
123349: ** an implementation artifact or an intentional decision when fts3 was
123350: ** first implemented. Whichever it was, this module duplicates the
123351: ** limitation.
123352: */
123353: iCol = pParse->iDefaultCol;
123354: iColLen = 0;
123355: for(ii=0; ii<pParse->nCol; ii++){
123356: const char *zStr = pParse->azCol[ii];
123357: int nStr = (int)strlen(zStr);
123358: if( nInput>nStr && zInput[nStr]==':'
123359: && sqlite3_strnicmp(zStr, zInput, nStr)==0
123360: ){
123361: iCol = ii;
123362: iColLen = (int)((zInput - z) + nStr + 1);
123363: break;
123364: }
123365: }
123366: rc = getNextToken(pParse, iCol, &z[iColLen], n-iColLen, ppExpr, pnConsumed);
123367: *pnConsumed += iColLen;
123368: return rc;
123369: }
123370:
123371: /*
123372: ** The argument is an Fts3Expr structure for a binary operator (any type
123373: ** except an FTSQUERY_PHRASE). Return an integer value representing the
123374: ** precedence of the operator. Lower values have a higher precedence (i.e.
123375: ** group more tightly). For example, in the C language, the == operator
123376: ** groups more tightly than ||, and would therefore have a higher precedence.
123377: **
123378: ** When using the new fts3 query syntax (when SQLITE_ENABLE_FTS3_PARENTHESIS
123379: ** is defined), the order of the operators in precedence from highest to
123380: ** lowest is:
123381: **
123382: ** NEAR
123383: ** NOT
123384: ** AND (including implicit ANDs)
123385: ** OR
123386: **
123387: ** Note that when using the old query syntax, the OR operator has a higher
123388: ** precedence than the AND operator.
123389: */
123390: static int opPrecedence(Fts3Expr *p){
123391: assert( p->eType!=FTSQUERY_PHRASE );
123392: if( sqlite3_fts3_enable_parentheses ){
123393: return p->eType;
123394: }else if( p->eType==FTSQUERY_NEAR ){
123395: return 1;
123396: }else if( p->eType==FTSQUERY_OR ){
123397: return 2;
123398: }
123399: assert( p->eType==FTSQUERY_AND );
123400: return 3;
123401: }
123402:
123403: /*
123404: ** Argument ppHead contains a pointer to the current head of a query
123405: ** expression tree being parsed. pPrev is the expression node most recently
123406: ** inserted into the tree. This function adds pNew, which is always a binary
123407: ** operator node, into the expression tree based on the relative precedence
123408: ** of pNew and the existing nodes of the tree. This may result in the head
123409: ** of the tree changing, in which case *ppHead is set to the new root node.
123410: */
123411: static void insertBinaryOperator(
123412: Fts3Expr **ppHead, /* Pointer to the root node of a tree */
123413: Fts3Expr *pPrev, /* Node most recently inserted into the tree */
123414: Fts3Expr *pNew /* New binary node to insert into expression tree */
123415: ){
123416: Fts3Expr *pSplit = pPrev;
123417: while( pSplit->pParent && opPrecedence(pSplit->pParent)<=opPrecedence(pNew) ){
123418: pSplit = pSplit->pParent;
123419: }
123420:
123421: if( pSplit->pParent ){
123422: assert( pSplit->pParent->pRight==pSplit );
123423: pSplit->pParent->pRight = pNew;
123424: pNew->pParent = pSplit->pParent;
123425: }else{
123426: *ppHead = pNew;
123427: }
123428: pNew->pLeft = pSplit;
123429: pSplit->pParent = pNew;
123430: }
123431:
123432: /*
123433: ** Parse the fts3 query expression found in buffer z, length n. This function
123434: ** returns either when the end of the buffer is reached or an unmatched
123435: ** closing bracket - ')' - is encountered.
123436: **
123437: ** If successful, SQLITE_OK is returned, *ppExpr is set to point to the
123438: ** parsed form of the expression and *pnConsumed is set to the number of
123439: ** bytes read from buffer z. Otherwise, *ppExpr is set to 0 and SQLITE_NOMEM
123440: ** (out of memory error) or SQLITE_ERROR (parse error) is returned.
123441: */
123442: static int fts3ExprParse(
123443: ParseContext *pParse, /* fts3 query parse context */
123444: const char *z, int n, /* Text of MATCH query */
123445: Fts3Expr **ppExpr, /* OUT: Parsed query structure */
123446: int *pnConsumed /* OUT: Number of bytes consumed */
123447: ){
123448: Fts3Expr *pRet = 0;
123449: Fts3Expr *pPrev = 0;
123450: Fts3Expr *pNotBranch = 0; /* Only used in legacy parse mode */
123451: int nIn = n;
123452: const char *zIn = z;
123453: int rc = SQLITE_OK;
123454: int isRequirePhrase = 1;
123455:
123456: while( rc==SQLITE_OK ){
123457: Fts3Expr *p = 0;
123458: int nByte = 0;
123459: rc = getNextNode(pParse, zIn, nIn, &p, &nByte);
123460: if( rc==SQLITE_OK ){
123461: int isPhrase;
123462:
123463: if( !sqlite3_fts3_enable_parentheses
123464: && p->eType==FTSQUERY_PHRASE && pParse->isNot
123465: ){
123466: /* Create an implicit NOT operator. */
123467: Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr));
123468: if( !pNot ){
123469: sqlite3Fts3ExprFree(p);
123470: rc = SQLITE_NOMEM;
123471: goto exprparse_out;
123472: }
123473: pNot->eType = FTSQUERY_NOT;
123474: pNot->pRight = p;
123475: if( pNotBranch ){
123476: pNot->pLeft = pNotBranch;
123477: }
123478: pNotBranch = pNot;
123479: p = pPrev;
123480: }else{
123481: int eType = p->eType;
123482: isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft);
123483:
123484: /* The isRequirePhrase variable is set to true if a phrase or
123485: ** an expression contained in parenthesis is required. If a
123486: ** binary operator (AND, OR, NOT or NEAR) is encounted when
123487: ** isRequirePhrase is set, this is a syntax error.
123488: */
123489: if( !isPhrase && isRequirePhrase ){
123490: sqlite3Fts3ExprFree(p);
123491: rc = SQLITE_ERROR;
123492: goto exprparse_out;
123493: }
123494:
123495: if( isPhrase && !isRequirePhrase ){
123496: /* Insert an implicit AND operator. */
123497: Fts3Expr *pAnd;
123498: assert( pRet && pPrev );
123499: pAnd = fts3MallocZero(sizeof(Fts3Expr));
123500: if( !pAnd ){
123501: sqlite3Fts3ExprFree(p);
123502: rc = SQLITE_NOMEM;
123503: goto exprparse_out;
123504: }
123505: pAnd->eType = FTSQUERY_AND;
123506: insertBinaryOperator(&pRet, pPrev, pAnd);
123507: pPrev = pAnd;
123508: }
123509:
123510: /* This test catches attempts to make either operand of a NEAR
123511: ** operator something other than a phrase. For example, either of
123512: ** the following:
123513: **
123514: ** (bracketed expression) NEAR phrase
123515: ** phrase NEAR (bracketed expression)
123516: **
123517: ** Return an error in either case.
123518: */
123519: if( pPrev && (
123520: (eType==FTSQUERY_NEAR && !isPhrase && pPrev->eType!=FTSQUERY_PHRASE)
123521: || (eType!=FTSQUERY_PHRASE && isPhrase && pPrev->eType==FTSQUERY_NEAR)
123522: )){
123523: sqlite3Fts3ExprFree(p);
123524: rc = SQLITE_ERROR;
123525: goto exprparse_out;
123526: }
123527:
123528: if( isPhrase ){
123529: if( pRet ){
123530: assert( pPrev && pPrev->pLeft && pPrev->pRight==0 );
123531: pPrev->pRight = p;
123532: p->pParent = pPrev;
123533: }else{
123534: pRet = p;
123535: }
123536: }else{
123537: insertBinaryOperator(&pRet, pPrev, p);
123538: }
123539: isRequirePhrase = !isPhrase;
123540: }
123541: assert( nByte>0 );
123542: }
123543: assert( rc!=SQLITE_OK || (nByte>0 && nByte<=nIn) );
123544: nIn -= nByte;
123545: zIn += nByte;
123546: pPrev = p;
123547: }
123548:
123549: if( rc==SQLITE_DONE && pRet && isRequirePhrase ){
123550: rc = SQLITE_ERROR;
123551: }
123552:
123553: if( rc==SQLITE_DONE ){
123554: rc = SQLITE_OK;
123555: if( !sqlite3_fts3_enable_parentheses && pNotBranch ){
123556: if( !pRet ){
123557: rc = SQLITE_ERROR;
123558: }else{
123559: Fts3Expr *pIter = pNotBranch;
123560: while( pIter->pLeft ){
123561: pIter = pIter->pLeft;
123562: }
123563: pIter->pLeft = pRet;
123564: pRet = pNotBranch;
123565: }
123566: }
123567: }
123568: *pnConsumed = n - nIn;
123569:
123570: exprparse_out:
123571: if( rc!=SQLITE_OK ){
123572: sqlite3Fts3ExprFree(pRet);
123573: sqlite3Fts3ExprFree(pNotBranch);
123574: pRet = 0;
123575: }
123576: *ppExpr = pRet;
123577: return rc;
123578: }
123579:
123580: /*
123581: ** Parameters z and n contain a pointer to and length of a buffer containing
123582: ** an fts3 query expression, respectively. This function attempts to parse the
123583: ** query expression and create a tree of Fts3Expr structures representing the
123584: ** parsed expression. If successful, *ppExpr is set to point to the head
123585: ** of the parsed expression tree and SQLITE_OK is returned. If an error
123586: ** occurs, either SQLITE_NOMEM (out-of-memory error) or SQLITE_ERROR (parse
123587: ** error) is returned and *ppExpr is set to 0.
123588: **
123589: ** If parameter n is a negative number, then z is assumed to point to a
123590: ** nul-terminated string and the length is determined using strlen().
123591: **
123592: ** The first parameter, pTokenizer, is passed the fts3 tokenizer module to
123593: ** use to normalize query tokens while parsing the expression. The azCol[]
123594: ** array, which is assumed to contain nCol entries, should contain the names
123595: ** of each column in the target fts3 table, in order from left to right.
123596: ** Column names must be nul-terminated strings.
123597: **
123598: ** The iDefaultCol parameter should be passed the index of the table column
123599: ** that appears on the left-hand-side of the MATCH operator (the default
123600: ** column to match against for tokens for which a column name is not explicitly
123601: ** specified as part of the query string), or -1 if tokens may by default
123602: ** match any table column.
123603: */
123604: SQLITE_PRIVATE int sqlite3Fts3ExprParse(
123605: sqlite3_tokenizer *pTokenizer, /* Tokenizer module */
1.2.2.1 ! misho 123606: int iLangid, /* Language id for tokenizer */
1.2 misho 123607: char **azCol, /* Array of column names for fts3 table */
123608: int bFts4, /* True to allow FTS4-only syntax */
123609: int nCol, /* Number of entries in azCol[] */
123610: int iDefaultCol, /* Default column to query */
123611: const char *z, int n, /* Text of MATCH query */
123612: Fts3Expr **ppExpr /* OUT: Parsed query structure */
123613: ){
123614: int nParsed;
123615: int rc;
123616: ParseContext sParse;
1.2.2.1 ! misho 123617:
! 123618: memset(&sParse, 0, sizeof(ParseContext));
1.2 misho 123619: sParse.pTokenizer = pTokenizer;
1.2.2.1 ! misho 123620: sParse.iLangid = iLangid;
1.2 misho 123621: sParse.azCol = (const char **)azCol;
123622: sParse.nCol = nCol;
123623: sParse.iDefaultCol = iDefaultCol;
123624: sParse.bFts4 = bFts4;
123625: if( z==0 ){
123626: *ppExpr = 0;
123627: return SQLITE_OK;
123628: }
123629: if( n<0 ){
123630: n = (int)strlen(z);
123631: }
123632: rc = fts3ExprParse(&sParse, z, n, ppExpr, &nParsed);
123633:
123634: /* Check for mismatched parenthesis */
123635: if( rc==SQLITE_OK && sParse.nNest ){
123636: rc = SQLITE_ERROR;
123637: sqlite3Fts3ExprFree(*ppExpr);
123638: *ppExpr = 0;
123639: }
123640:
123641: return rc;
123642: }
123643:
123644: /*
123645: ** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse().
123646: */
123647: SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *p){
123648: if( p ){
123649: assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 );
123650: sqlite3Fts3ExprFree(p->pLeft);
123651: sqlite3Fts3ExprFree(p->pRight);
123652: sqlite3Fts3EvalPhraseCleanup(p->pPhrase);
123653: sqlite3_free(p->aMI);
123654: sqlite3_free(p);
123655: }
123656: }
123657:
123658: /****************************************************************************
123659: *****************************************************************************
123660: ** Everything after this point is just test code.
123661: */
123662:
123663: #ifdef SQLITE_TEST
123664:
123665: /* #include <stdio.h> */
123666:
123667: /*
123668: ** Function to query the hash-table of tokenizers (see README.tokenizers).
123669: */
123670: static int queryTestTokenizer(
123671: sqlite3 *db,
123672: const char *zName,
123673: const sqlite3_tokenizer_module **pp
123674: ){
123675: int rc;
123676: sqlite3_stmt *pStmt;
123677: const char zSql[] = "SELECT fts3_tokenizer(?)";
123678:
123679: *pp = 0;
123680: rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
123681: if( rc!=SQLITE_OK ){
123682: return rc;
123683: }
123684:
123685: sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
123686: if( SQLITE_ROW==sqlite3_step(pStmt) ){
123687: if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
123688: memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
123689: }
123690: }
123691:
123692: return sqlite3_finalize(pStmt);
123693: }
123694:
123695: /*
123696: ** Return a pointer to a buffer containing a text representation of the
123697: ** expression passed as the first argument. The buffer is obtained from
123698: ** sqlite3_malloc(). It is the responsibility of the caller to use
123699: ** sqlite3_free() to release the memory. If an OOM condition is encountered,
123700: ** NULL is returned.
123701: **
123702: ** If the second argument is not NULL, then its contents are prepended to
123703: ** the returned expression text and then freed using sqlite3_free().
123704: */
123705: static char *exprToString(Fts3Expr *pExpr, char *zBuf){
123706: switch( pExpr->eType ){
123707: case FTSQUERY_PHRASE: {
123708: Fts3Phrase *pPhrase = pExpr->pPhrase;
123709: int i;
123710: zBuf = sqlite3_mprintf(
123711: "%zPHRASE %d 0", zBuf, pPhrase->iColumn);
123712: for(i=0; zBuf && i<pPhrase->nToken; i++){
123713: zBuf = sqlite3_mprintf("%z %.*s%s", zBuf,
123714: pPhrase->aToken[i].n, pPhrase->aToken[i].z,
123715: (pPhrase->aToken[i].isPrefix?"+":"")
123716: );
123717: }
123718: return zBuf;
123719: }
123720:
123721: case FTSQUERY_NEAR:
123722: zBuf = sqlite3_mprintf("%zNEAR/%d ", zBuf, pExpr->nNear);
123723: break;
123724: case FTSQUERY_NOT:
123725: zBuf = sqlite3_mprintf("%zNOT ", zBuf);
123726: break;
123727: case FTSQUERY_AND:
123728: zBuf = sqlite3_mprintf("%zAND ", zBuf);
123729: break;
123730: case FTSQUERY_OR:
123731: zBuf = sqlite3_mprintf("%zOR ", zBuf);
123732: break;
123733: }
123734:
123735: if( zBuf ) zBuf = sqlite3_mprintf("%z{", zBuf);
123736: if( zBuf ) zBuf = exprToString(pExpr->pLeft, zBuf);
123737: if( zBuf ) zBuf = sqlite3_mprintf("%z} {", zBuf);
123738:
123739: if( zBuf ) zBuf = exprToString(pExpr->pRight, zBuf);
123740: if( zBuf ) zBuf = sqlite3_mprintf("%z}", zBuf);
123741:
123742: return zBuf;
123743: }
123744:
123745: /*
123746: ** This is the implementation of a scalar SQL function used to test the
123747: ** expression parser. It should be called as follows:
123748: **
123749: ** fts3_exprtest(<tokenizer>, <expr>, <column 1>, ...);
123750: **
123751: ** The first argument, <tokenizer>, is the name of the fts3 tokenizer used
123752: ** to parse the query expression (see README.tokenizers). The second argument
123753: ** is the query expression to parse. Each subsequent argument is the name
123754: ** of a column of the fts3 table that the query expression may refer to.
123755: ** For example:
123756: **
123757: ** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2');
123758: */
123759: static void fts3ExprTest(
123760: sqlite3_context *context,
123761: int argc,
123762: sqlite3_value **argv
123763: ){
123764: sqlite3_tokenizer_module const *pModule = 0;
123765: sqlite3_tokenizer *pTokenizer = 0;
123766: int rc;
123767: char **azCol = 0;
123768: const char *zExpr;
123769: int nExpr;
123770: int nCol;
123771: int ii;
123772: Fts3Expr *pExpr;
123773: char *zBuf = 0;
123774: sqlite3 *db = sqlite3_context_db_handle(context);
123775:
123776: if( argc<3 ){
123777: sqlite3_result_error(context,
123778: "Usage: fts3_exprtest(tokenizer, expr, col1, ...", -1
123779: );
123780: return;
123781: }
123782:
123783: rc = queryTestTokenizer(db,
123784: (const char *)sqlite3_value_text(argv[0]), &pModule);
123785: if( rc==SQLITE_NOMEM ){
123786: sqlite3_result_error_nomem(context);
123787: goto exprtest_out;
123788: }else if( !pModule ){
123789: sqlite3_result_error(context, "No such tokenizer module", -1);
123790: goto exprtest_out;
123791: }
123792:
123793: rc = pModule->xCreate(0, 0, &pTokenizer);
123794: assert( rc==SQLITE_NOMEM || rc==SQLITE_OK );
123795: if( rc==SQLITE_NOMEM ){
123796: sqlite3_result_error_nomem(context);
123797: goto exprtest_out;
123798: }
123799: pTokenizer->pModule = pModule;
123800:
123801: zExpr = (const char *)sqlite3_value_text(argv[1]);
123802: nExpr = sqlite3_value_bytes(argv[1]);
123803: nCol = argc-2;
123804: azCol = (char **)sqlite3_malloc(nCol*sizeof(char *));
123805: if( !azCol ){
123806: sqlite3_result_error_nomem(context);
123807: goto exprtest_out;
123808: }
123809: for(ii=0; ii<nCol; ii++){
123810: azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]);
123811: }
123812:
123813: rc = sqlite3Fts3ExprParse(
1.2.2.1 ! misho 123814: pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr
1.2 misho 123815: );
123816: if( rc!=SQLITE_OK && rc!=SQLITE_NOMEM ){
123817: sqlite3_result_error(context, "Error parsing expression", -1);
123818: }else if( rc==SQLITE_NOMEM || !(zBuf = exprToString(pExpr, 0)) ){
123819: sqlite3_result_error_nomem(context);
123820: }else{
123821: sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
123822: sqlite3_free(zBuf);
123823: }
123824:
123825: sqlite3Fts3ExprFree(pExpr);
123826:
123827: exprtest_out:
123828: if( pModule && pTokenizer ){
123829: rc = pModule->xDestroy(pTokenizer);
123830: }
123831: sqlite3_free(azCol);
123832: }
123833:
123834: /*
123835: ** Register the query expression parser test function fts3_exprtest()
123836: ** with database connection db.
123837: */
123838: SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){
123839: return sqlite3_create_function(
123840: db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0
123841: );
123842: }
123843:
123844: #endif
123845: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
123846:
123847: /************** End of fts3_expr.c *******************************************/
123848: /************** Begin file fts3_hash.c ***************************************/
123849: /*
123850: ** 2001 September 22
123851: **
123852: ** The author disclaims copyright to this source code. In place of
123853: ** a legal notice, here is a blessing:
123854: **
123855: ** May you do good and not evil.
123856: ** May you find forgiveness for yourself and forgive others.
123857: ** May you share freely, never taking more than you give.
123858: **
123859: *************************************************************************
123860: ** This is the implementation of generic hash-tables used in SQLite.
123861: ** We've modified it slightly to serve as a standalone hash table
123862: ** implementation for the full-text indexing module.
123863: */
123864:
123865: /*
123866: ** The code in this file is only compiled if:
123867: **
123868: ** * The FTS3 module is being built as an extension
123869: ** (in which case SQLITE_CORE is not defined), or
123870: **
123871: ** * The FTS3 module is being built into the core of
123872: ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
123873: */
123874: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
123875:
123876: /* #include <assert.h> */
123877: /* #include <stdlib.h> */
123878: /* #include <string.h> */
123879:
123880:
123881: /*
123882: ** Malloc and Free functions
123883: */
123884: static void *fts3HashMalloc(int n){
123885: void *p = sqlite3_malloc(n);
123886: if( p ){
123887: memset(p, 0, n);
123888: }
123889: return p;
123890: }
123891: static void fts3HashFree(void *p){
123892: sqlite3_free(p);
123893: }
123894:
123895: /* Turn bulk memory into a hash table object by initializing the
123896: ** fields of the Hash structure.
123897: **
123898: ** "pNew" is a pointer to the hash table that is to be initialized.
123899: ** keyClass is one of the constants
123900: ** FTS3_HASH_BINARY or FTS3_HASH_STRING. The value of keyClass
123901: ** determines what kind of key the hash table will use. "copyKey" is
123902: ** true if the hash table should make its own private copy of keys and
123903: ** false if it should just use the supplied pointer.
123904: */
123905: SQLITE_PRIVATE void sqlite3Fts3HashInit(Fts3Hash *pNew, char keyClass, char copyKey){
123906: assert( pNew!=0 );
123907: assert( keyClass>=FTS3_HASH_STRING && keyClass<=FTS3_HASH_BINARY );
123908: pNew->keyClass = keyClass;
123909: pNew->copyKey = copyKey;
123910: pNew->first = 0;
123911: pNew->count = 0;
123912: pNew->htsize = 0;
123913: pNew->ht = 0;
123914: }
123915:
123916: /* Remove all entries from a hash table. Reclaim all memory.
123917: ** Call this routine to delete a hash table or to reset a hash table
123918: ** to the empty state.
123919: */
123920: SQLITE_PRIVATE void sqlite3Fts3HashClear(Fts3Hash *pH){
123921: Fts3HashElem *elem; /* For looping over all elements of the table */
123922:
123923: assert( pH!=0 );
123924: elem = pH->first;
123925: pH->first = 0;
123926: fts3HashFree(pH->ht);
123927: pH->ht = 0;
123928: pH->htsize = 0;
123929: while( elem ){
123930: Fts3HashElem *next_elem = elem->next;
123931: if( pH->copyKey && elem->pKey ){
123932: fts3HashFree(elem->pKey);
123933: }
123934: fts3HashFree(elem);
123935: elem = next_elem;
123936: }
123937: pH->count = 0;
123938: }
123939:
123940: /*
123941: ** Hash and comparison functions when the mode is FTS3_HASH_STRING
123942: */
123943: static int fts3StrHash(const void *pKey, int nKey){
123944: const char *z = (const char *)pKey;
123945: int h = 0;
123946: if( nKey<=0 ) nKey = (int) strlen(z);
123947: while( nKey > 0 ){
123948: h = (h<<3) ^ h ^ *z++;
123949: nKey--;
123950: }
123951: return h & 0x7fffffff;
123952: }
123953: static int fts3StrCompare(const void *pKey1, int n1, const void *pKey2, int n2){
123954: if( n1!=n2 ) return 1;
123955: return strncmp((const char*)pKey1,(const char*)pKey2,n1);
123956: }
123957:
123958: /*
123959: ** Hash and comparison functions when the mode is FTS3_HASH_BINARY
123960: */
123961: static int fts3BinHash(const void *pKey, int nKey){
123962: int h = 0;
123963: const char *z = (const char *)pKey;
123964: while( nKey-- > 0 ){
123965: h = (h<<3) ^ h ^ *(z++);
123966: }
123967: return h & 0x7fffffff;
123968: }
123969: static int fts3BinCompare(const void *pKey1, int n1, const void *pKey2, int n2){
123970: if( n1!=n2 ) return 1;
123971: return memcmp(pKey1,pKey2,n1);
123972: }
123973:
123974: /*
123975: ** Return a pointer to the appropriate hash function given the key class.
123976: **
123977: ** The C syntax in this function definition may be unfamilar to some
123978: ** programmers, so we provide the following additional explanation:
123979: **
123980: ** The name of the function is "ftsHashFunction". The function takes a
123981: ** single parameter "keyClass". The return value of ftsHashFunction()
123982: ** is a pointer to another function. Specifically, the return value
123983: ** of ftsHashFunction() is a pointer to a function that takes two parameters
123984: ** with types "const void*" and "int" and returns an "int".
123985: */
123986: static int (*ftsHashFunction(int keyClass))(const void*,int){
123987: if( keyClass==FTS3_HASH_STRING ){
123988: return &fts3StrHash;
123989: }else{
123990: assert( keyClass==FTS3_HASH_BINARY );
123991: return &fts3BinHash;
123992: }
123993: }
123994:
123995: /*
123996: ** Return a pointer to the appropriate hash function given the key class.
123997: **
123998: ** For help in interpreted the obscure C code in the function definition,
123999: ** see the header comment on the previous function.
124000: */
124001: static int (*ftsCompareFunction(int keyClass))(const void*,int,const void*,int){
124002: if( keyClass==FTS3_HASH_STRING ){
124003: return &fts3StrCompare;
124004: }else{
124005: assert( keyClass==FTS3_HASH_BINARY );
124006: return &fts3BinCompare;
124007: }
124008: }
124009:
124010: /* Link an element into the hash table
124011: */
124012: static void fts3HashInsertElement(
124013: Fts3Hash *pH, /* The complete hash table */
124014: struct _fts3ht *pEntry, /* The entry into which pNew is inserted */
124015: Fts3HashElem *pNew /* The element to be inserted */
124016: ){
124017: Fts3HashElem *pHead; /* First element already in pEntry */
124018: pHead = pEntry->chain;
124019: if( pHead ){
124020: pNew->next = pHead;
124021: pNew->prev = pHead->prev;
124022: if( pHead->prev ){ pHead->prev->next = pNew; }
124023: else { pH->first = pNew; }
124024: pHead->prev = pNew;
124025: }else{
124026: pNew->next = pH->first;
124027: if( pH->first ){ pH->first->prev = pNew; }
124028: pNew->prev = 0;
124029: pH->first = pNew;
124030: }
124031: pEntry->count++;
124032: pEntry->chain = pNew;
124033: }
124034:
124035:
124036: /* Resize the hash table so that it cantains "new_size" buckets.
124037: ** "new_size" must be a power of 2. The hash table might fail
124038: ** to resize if sqliteMalloc() fails.
124039: **
124040: ** Return non-zero if a memory allocation error occurs.
124041: */
124042: static int fts3Rehash(Fts3Hash *pH, int new_size){
124043: struct _fts3ht *new_ht; /* The new hash table */
124044: Fts3HashElem *elem, *next_elem; /* For looping over existing elements */
124045: int (*xHash)(const void*,int); /* The hash function */
124046:
124047: assert( (new_size & (new_size-1))==0 );
124048: new_ht = (struct _fts3ht *)fts3HashMalloc( new_size*sizeof(struct _fts3ht) );
124049: if( new_ht==0 ) return 1;
124050: fts3HashFree(pH->ht);
124051: pH->ht = new_ht;
124052: pH->htsize = new_size;
124053: xHash = ftsHashFunction(pH->keyClass);
124054: for(elem=pH->first, pH->first=0; elem; elem = next_elem){
124055: int h = (*xHash)(elem->pKey, elem->nKey) & (new_size-1);
124056: next_elem = elem->next;
124057: fts3HashInsertElement(pH, &new_ht[h], elem);
124058: }
124059: return 0;
124060: }
124061:
124062: /* This function (for internal use only) locates an element in an
124063: ** hash table that matches the given key. The hash for this key has
124064: ** already been computed and is passed as the 4th parameter.
124065: */
124066: static Fts3HashElem *fts3FindElementByHash(
124067: const Fts3Hash *pH, /* The pH to be searched */
124068: const void *pKey, /* The key we are searching for */
124069: int nKey,
124070: int h /* The hash for this key. */
124071: ){
124072: Fts3HashElem *elem; /* Used to loop thru the element list */
124073: int count; /* Number of elements left to test */
124074: int (*xCompare)(const void*,int,const void*,int); /* comparison function */
124075:
124076: if( pH->ht ){
124077: struct _fts3ht *pEntry = &pH->ht[h];
124078: elem = pEntry->chain;
124079: count = pEntry->count;
124080: xCompare = ftsCompareFunction(pH->keyClass);
124081: while( count-- && elem ){
124082: if( (*xCompare)(elem->pKey,elem->nKey,pKey,nKey)==0 ){
124083: return elem;
124084: }
124085: elem = elem->next;
124086: }
124087: }
124088: return 0;
124089: }
124090:
124091: /* Remove a single entry from the hash table given a pointer to that
124092: ** element and a hash on the element's key.
124093: */
124094: static void fts3RemoveElementByHash(
124095: Fts3Hash *pH, /* The pH containing "elem" */
124096: Fts3HashElem* elem, /* The element to be removed from the pH */
124097: int h /* Hash value for the element */
124098: ){
124099: struct _fts3ht *pEntry;
124100: if( elem->prev ){
124101: elem->prev->next = elem->next;
124102: }else{
124103: pH->first = elem->next;
124104: }
124105: if( elem->next ){
124106: elem->next->prev = elem->prev;
124107: }
124108: pEntry = &pH->ht[h];
124109: if( pEntry->chain==elem ){
124110: pEntry->chain = elem->next;
124111: }
124112: pEntry->count--;
124113: if( pEntry->count<=0 ){
124114: pEntry->chain = 0;
124115: }
124116: if( pH->copyKey && elem->pKey ){
124117: fts3HashFree(elem->pKey);
124118: }
124119: fts3HashFree( elem );
124120: pH->count--;
124121: if( pH->count<=0 ){
124122: assert( pH->first==0 );
124123: assert( pH->count==0 );
124124: fts3HashClear(pH);
124125: }
124126: }
124127:
124128: SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(
124129: const Fts3Hash *pH,
124130: const void *pKey,
124131: int nKey
124132: ){
124133: int h; /* A hash on key */
124134: int (*xHash)(const void*,int); /* The hash function */
124135:
124136: if( pH==0 || pH->ht==0 ) return 0;
124137: xHash = ftsHashFunction(pH->keyClass);
124138: assert( xHash!=0 );
124139: h = (*xHash)(pKey,nKey);
124140: assert( (pH->htsize & (pH->htsize-1))==0 );
124141: return fts3FindElementByHash(pH,pKey,nKey, h & (pH->htsize-1));
124142: }
124143:
124144: /*
124145: ** Attempt to locate an element of the hash table pH with a key
124146: ** that matches pKey,nKey. Return the data for this element if it is
124147: ** found, or NULL if there is no match.
124148: */
124149: SQLITE_PRIVATE void *sqlite3Fts3HashFind(const Fts3Hash *pH, const void *pKey, int nKey){
124150: Fts3HashElem *pElem; /* The element that matches key (if any) */
124151:
124152: pElem = sqlite3Fts3HashFindElem(pH, pKey, nKey);
124153: return pElem ? pElem->data : 0;
124154: }
124155:
124156: /* Insert an element into the hash table pH. The key is pKey,nKey
124157: ** and the data is "data".
124158: **
124159: ** If no element exists with a matching key, then a new
124160: ** element is created. A copy of the key is made if the copyKey
124161: ** flag is set. NULL is returned.
124162: **
124163: ** If another element already exists with the same key, then the
124164: ** new data replaces the old data and the old data is returned.
124165: ** The key is not copied in this instance. If a malloc fails, then
124166: ** the new data is returned and the hash table is unchanged.
124167: **
124168: ** If the "data" parameter to this function is NULL, then the
124169: ** element corresponding to "key" is removed from the hash table.
124170: */
124171: SQLITE_PRIVATE void *sqlite3Fts3HashInsert(
124172: Fts3Hash *pH, /* The hash table to insert into */
124173: const void *pKey, /* The key */
124174: int nKey, /* Number of bytes in the key */
124175: void *data /* The data */
124176: ){
124177: int hraw; /* Raw hash value of the key */
124178: int h; /* the hash of the key modulo hash table size */
124179: Fts3HashElem *elem; /* Used to loop thru the element list */
124180: Fts3HashElem *new_elem; /* New element added to the pH */
124181: int (*xHash)(const void*,int); /* The hash function */
124182:
124183: assert( pH!=0 );
124184: xHash = ftsHashFunction(pH->keyClass);
124185: assert( xHash!=0 );
124186: hraw = (*xHash)(pKey, nKey);
124187: assert( (pH->htsize & (pH->htsize-1))==0 );
124188: h = hraw & (pH->htsize-1);
124189: elem = fts3FindElementByHash(pH,pKey,nKey,h);
124190: if( elem ){
124191: void *old_data = elem->data;
124192: if( data==0 ){
124193: fts3RemoveElementByHash(pH,elem,h);
124194: }else{
124195: elem->data = data;
124196: }
124197: return old_data;
124198: }
124199: if( data==0 ) return 0;
124200: if( (pH->htsize==0 && fts3Rehash(pH,8))
124201: || (pH->count>=pH->htsize && fts3Rehash(pH, pH->htsize*2))
124202: ){
124203: pH->count = 0;
124204: return data;
124205: }
124206: assert( pH->htsize>0 );
124207: new_elem = (Fts3HashElem*)fts3HashMalloc( sizeof(Fts3HashElem) );
124208: if( new_elem==0 ) return data;
124209: if( pH->copyKey && pKey!=0 ){
124210: new_elem->pKey = fts3HashMalloc( nKey );
124211: if( new_elem->pKey==0 ){
124212: fts3HashFree(new_elem);
124213: return data;
124214: }
124215: memcpy((void*)new_elem->pKey, pKey, nKey);
124216: }else{
124217: new_elem->pKey = (void*)pKey;
124218: }
124219: new_elem->nKey = nKey;
124220: pH->count++;
124221: assert( pH->htsize>0 );
124222: assert( (pH->htsize & (pH->htsize-1))==0 );
124223: h = hraw & (pH->htsize-1);
124224: fts3HashInsertElement(pH, &pH->ht[h], new_elem);
124225: new_elem->data = data;
124226: return 0;
124227: }
124228:
124229: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
124230:
124231: /************** End of fts3_hash.c *******************************************/
124232: /************** Begin file fts3_porter.c *************************************/
124233: /*
124234: ** 2006 September 30
124235: **
124236: ** The author disclaims copyright to this source code. In place of
124237: ** a legal notice, here is a blessing:
124238: **
124239: ** May you do good and not evil.
124240: ** May you find forgiveness for yourself and forgive others.
124241: ** May you share freely, never taking more than you give.
124242: **
124243: *************************************************************************
124244: ** Implementation of the full-text-search tokenizer that implements
124245: ** a Porter stemmer.
124246: */
124247:
124248: /*
124249: ** The code in this file is only compiled if:
124250: **
124251: ** * The FTS3 module is being built as an extension
124252: ** (in which case SQLITE_CORE is not defined), or
124253: **
124254: ** * The FTS3 module is being built into the core of
124255: ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
124256: */
124257: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
124258:
124259: /* #include <assert.h> */
124260: /* #include <stdlib.h> */
124261: /* #include <stdio.h> */
124262: /* #include <string.h> */
124263:
124264:
124265: /*
124266: ** Class derived from sqlite3_tokenizer
124267: */
124268: typedef struct porter_tokenizer {
124269: sqlite3_tokenizer base; /* Base class */
124270: } porter_tokenizer;
124271:
124272: /*
124273: ** Class derived from sqlite3_tokenizer_cursor
124274: */
124275: typedef struct porter_tokenizer_cursor {
124276: sqlite3_tokenizer_cursor base;
124277: const char *zInput; /* input we are tokenizing */
124278: int nInput; /* size of the input */
124279: int iOffset; /* current position in zInput */
124280: int iToken; /* index of next token to be returned */
124281: char *zToken; /* storage for current token */
124282: int nAllocated; /* space allocated to zToken buffer */
124283: } porter_tokenizer_cursor;
124284:
124285:
124286: /*
124287: ** Create a new tokenizer instance.
124288: */
124289: static int porterCreate(
124290: int argc, const char * const *argv,
124291: sqlite3_tokenizer **ppTokenizer
124292: ){
124293: porter_tokenizer *t;
124294:
124295: UNUSED_PARAMETER(argc);
124296: UNUSED_PARAMETER(argv);
124297:
124298: t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t));
124299: if( t==NULL ) return SQLITE_NOMEM;
124300: memset(t, 0, sizeof(*t));
124301: *ppTokenizer = &t->base;
124302: return SQLITE_OK;
124303: }
124304:
124305: /*
124306: ** Destroy a tokenizer
124307: */
124308: static int porterDestroy(sqlite3_tokenizer *pTokenizer){
124309: sqlite3_free(pTokenizer);
124310: return SQLITE_OK;
124311: }
124312:
124313: /*
124314: ** Prepare to begin tokenizing a particular string. The input
124315: ** string to be tokenized is zInput[0..nInput-1]. A cursor
124316: ** used to incrementally tokenize this string is returned in
124317: ** *ppCursor.
124318: */
124319: static int porterOpen(
124320: sqlite3_tokenizer *pTokenizer, /* The tokenizer */
124321: const char *zInput, int nInput, /* String to be tokenized */
124322: sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */
124323: ){
124324: porter_tokenizer_cursor *c;
124325:
124326: UNUSED_PARAMETER(pTokenizer);
124327:
124328: c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c));
124329: if( c==NULL ) return SQLITE_NOMEM;
124330:
124331: c->zInput = zInput;
124332: if( zInput==0 ){
124333: c->nInput = 0;
124334: }else if( nInput<0 ){
124335: c->nInput = (int)strlen(zInput);
124336: }else{
124337: c->nInput = nInput;
124338: }
124339: c->iOffset = 0; /* start tokenizing at the beginning */
124340: c->iToken = 0;
124341: c->zToken = NULL; /* no space allocated, yet. */
124342: c->nAllocated = 0;
124343:
124344: *ppCursor = &c->base;
124345: return SQLITE_OK;
124346: }
124347:
124348: /*
124349: ** Close a tokenization cursor previously opened by a call to
124350: ** porterOpen() above.
124351: */
124352: static int porterClose(sqlite3_tokenizer_cursor *pCursor){
124353: porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor;
124354: sqlite3_free(c->zToken);
124355: sqlite3_free(c);
124356: return SQLITE_OK;
124357: }
124358: /*
124359: ** Vowel or consonant
124360: */
124361: static const char cType[] = {
124362: 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
124363: 1, 1, 1, 2, 1
124364: };
124365:
124366: /*
124367: ** isConsonant() and isVowel() determine if their first character in
124368: ** the string they point to is a consonant or a vowel, according
124369: ** to Porter ruls.
124370: **
124371: ** A consonate is any letter other than 'a', 'e', 'i', 'o', or 'u'.
124372: ** 'Y' is a consonant unless it follows another consonant,
124373: ** in which case it is a vowel.
124374: **
124375: ** In these routine, the letters are in reverse order. So the 'y' rule
124376: ** is that 'y' is a consonant unless it is followed by another
124377: ** consonent.
124378: */
124379: static int isVowel(const char*);
124380: static int isConsonant(const char *z){
124381: int j;
124382: char x = *z;
124383: if( x==0 ) return 0;
124384: assert( x>='a' && x<='z' );
124385: j = cType[x-'a'];
124386: if( j<2 ) return j;
124387: return z[1]==0 || isVowel(z + 1);
124388: }
124389: static int isVowel(const char *z){
124390: int j;
124391: char x = *z;
124392: if( x==0 ) return 0;
124393: assert( x>='a' && x<='z' );
124394: j = cType[x-'a'];
124395: if( j<2 ) return 1-j;
124396: return isConsonant(z + 1);
124397: }
124398:
124399: /*
124400: ** Let any sequence of one or more vowels be represented by V and let
124401: ** C be sequence of one or more consonants. Then every word can be
124402: ** represented as:
124403: **
124404: ** [C] (VC){m} [V]
124405: **
124406: ** In prose: A word is an optional consonant followed by zero or
124407: ** vowel-consonant pairs followed by an optional vowel. "m" is the
124408: ** number of vowel consonant pairs. This routine computes the value
124409: ** of m for the first i bytes of a word.
124410: **
124411: ** Return true if the m-value for z is 1 or more. In other words,
124412: ** return true if z contains at least one vowel that is followed
124413: ** by a consonant.
124414: **
124415: ** In this routine z[] is in reverse order. So we are really looking
124416: ** for an instance of of a consonant followed by a vowel.
124417: */
124418: static int m_gt_0(const char *z){
124419: while( isVowel(z) ){ z++; }
124420: if( *z==0 ) return 0;
124421: while( isConsonant(z) ){ z++; }
124422: return *z!=0;
124423: }
124424:
124425: /* Like mgt0 above except we are looking for a value of m which is
124426: ** exactly 1
124427: */
124428: static int m_eq_1(const char *z){
124429: while( isVowel(z) ){ z++; }
124430: if( *z==0 ) return 0;
124431: while( isConsonant(z) ){ z++; }
124432: if( *z==0 ) return 0;
124433: while( isVowel(z) ){ z++; }
124434: if( *z==0 ) return 1;
124435: while( isConsonant(z) ){ z++; }
124436: return *z==0;
124437: }
124438:
124439: /* Like mgt0 above except we are looking for a value of m>1 instead
124440: ** or m>0
124441: */
124442: static int m_gt_1(const char *z){
124443: while( isVowel(z) ){ z++; }
124444: if( *z==0 ) return 0;
124445: while( isConsonant(z) ){ z++; }
124446: if( *z==0 ) return 0;
124447: while( isVowel(z) ){ z++; }
124448: if( *z==0 ) return 0;
124449: while( isConsonant(z) ){ z++; }
124450: return *z!=0;
124451: }
124452:
124453: /*
124454: ** Return TRUE if there is a vowel anywhere within z[0..n-1]
124455: */
124456: static int hasVowel(const char *z){
124457: while( isConsonant(z) ){ z++; }
124458: return *z!=0;
124459: }
124460:
124461: /*
124462: ** Return TRUE if the word ends in a double consonant.
124463: **
124464: ** The text is reversed here. So we are really looking at
124465: ** the first two characters of z[].
124466: */
124467: static int doubleConsonant(const char *z){
124468: return isConsonant(z) && z[0]==z[1];
124469: }
124470:
124471: /*
124472: ** Return TRUE if the word ends with three letters which
124473: ** are consonant-vowel-consonent and where the final consonant
124474: ** is not 'w', 'x', or 'y'.
124475: **
124476: ** The word is reversed here. So we are really checking the
124477: ** first three letters and the first one cannot be in [wxy].
124478: */
124479: static int star_oh(const char *z){
124480: return
124481: isConsonant(z) &&
124482: z[0]!='w' && z[0]!='x' && z[0]!='y' &&
124483: isVowel(z+1) &&
124484: isConsonant(z+2);
124485: }
124486:
124487: /*
124488: ** If the word ends with zFrom and xCond() is true for the stem
124489: ** of the word that preceeds the zFrom ending, then change the
124490: ** ending to zTo.
124491: **
124492: ** The input word *pz and zFrom are both in reverse order. zTo
124493: ** is in normal order.
124494: **
124495: ** Return TRUE if zFrom matches. Return FALSE if zFrom does not
124496: ** match. Not that TRUE is returned even if xCond() fails and
124497: ** no substitution occurs.
124498: */
124499: static int stem(
124500: char **pz, /* The word being stemmed (Reversed) */
124501: const char *zFrom, /* If the ending matches this... (Reversed) */
124502: const char *zTo, /* ... change the ending to this (not reversed) */
124503: int (*xCond)(const char*) /* Condition that must be true */
124504: ){
124505: char *z = *pz;
124506: while( *zFrom && *zFrom==*z ){ z++; zFrom++; }
124507: if( *zFrom!=0 ) return 0;
124508: if( xCond && !xCond(z) ) return 1;
124509: while( *zTo ){
124510: *(--z) = *(zTo++);
124511: }
124512: *pz = z;
124513: return 1;
124514: }
124515:
124516: /*
124517: ** This is the fallback stemmer used when the porter stemmer is
124518: ** inappropriate. The input word is copied into the output with
124519: ** US-ASCII case folding. If the input word is too long (more
124520: ** than 20 bytes if it contains no digits or more than 6 bytes if
124521: ** it contains digits) then word is truncated to 20 or 6 bytes
124522: ** by taking 10 or 3 bytes from the beginning and end.
124523: */
124524: static void copy_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
124525: int i, mx, j;
124526: int hasDigit = 0;
124527: for(i=0; i<nIn; i++){
124528: char c = zIn[i];
124529: if( c>='A' && c<='Z' ){
124530: zOut[i] = c - 'A' + 'a';
124531: }else{
124532: if( c>='0' && c<='9' ) hasDigit = 1;
124533: zOut[i] = c;
124534: }
124535: }
124536: mx = hasDigit ? 3 : 10;
124537: if( nIn>mx*2 ){
124538: for(j=mx, i=nIn-mx; i<nIn; i++, j++){
124539: zOut[j] = zOut[i];
124540: }
124541: i = j;
124542: }
124543: zOut[i] = 0;
124544: *pnOut = i;
124545: }
124546:
124547:
124548: /*
124549: ** Stem the input word zIn[0..nIn-1]. Store the output in zOut.
124550: ** zOut is at least big enough to hold nIn bytes. Write the actual
124551: ** size of the output word (exclusive of the '\0' terminator) into *pnOut.
124552: **
124553: ** Any upper-case characters in the US-ASCII character set ([A-Z])
124554: ** are converted to lower case. Upper-case UTF characters are
124555: ** unchanged.
124556: **
124557: ** Words that are longer than about 20 bytes are stemmed by retaining
124558: ** a few bytes from the beginning and the end of the word. If the
124559: ** word contains digits, 3 bytes are taken from the beginning and
124560: ** 3 bytes from the end. For long words without digits, 10 bytes
124561: ** are taken from each end. US-ASCII case folding still applies.
124562: **
124563: ** If the input word contains not digits but does characters not
124564: ** in [a-zA-Z] then no stemming is attempted and this routine just
124565: ** copies the input into the input into the output with US-ASCII
124566: ** case folding.
124567: **
124568: ** Stemming never increases the length of the word. So there is
124569: ** no chance of overflowing the zOut buffer.
124570: */
124571: static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){
124572: int i, j;
124573: char zReverse[28];
124574: char *z, *z2;
124575: if( nIn<3 || nIn>=(int)sizeof(zReverse)-7 ){
124576: /* The word is too big or too small for the porter stemmer.
124577: ** Fallback to the copy stemmer */
124578: copy_stemmer(zIn, nIn, zOut, pnOut);
124579: return;
124580: }
124581: for(i=0, j=sizeof(zReverse)-6; i<nIn; i++, j--){
124582: char c = zIn[i];
124583: if( c>='A' && c<='Z' ){
124584: zReverse[j] = c + 'a' - 'A';
124585: }else if( c>='a' && c<='z' ){
124586: zReverse[j] = c;
124587: }else{
124588: /* The use of a character not in [a-zA-Z] means that we fallback
124589: ** to the copy stemmer */
124590: copy_stemmer(zIn, nIn, zOut, pnOut);
124591: return;
124592: }
124593: }
124594: memset(&zReverse[sizeof(zReverse)-5], 0, 5);
124595: z = &zReverse[j+1];
124596:
124597:
124598: /* Step 1a */
124599: if( z[0]=='s' ){
124600: if(
124601: !stem(&z, "sess", "ss", 0) &&
124602: !stem(&z, "sei", "i", 0) &&
124603: !stem(&z, "ss", "ss", 0)
124604: ){
124605: z++;
124606: }
124607: }
124608:
124609: /* Step 1b */
124610: z2 = z;
124611: if( stem(&z, "dee", "ee", m_gt_0) ){
124612: /* Do nothing. The work was all in the test */
124613: }else if(
124614: (stem(&z, "gni", "", hasVowel) || stem(&z, "de", "", hasVowel))
124615: && z!=z2
124616: ){
124617: if( stem(&z, "ta", "ate", 0) ||
124618: stem(&z, "lb", "ble", 0) ||
124619: stem(&z, "zi", "ize", 0) ){
124620: /* Do nothing. The work was all in the test */
124621: }else if( doubleConsonant(z) && (*z!='l' && *z!='s' && *z!='z') ){
124622: z++;
124623: }else if( m_eq_1(z) && star_oh(z) ){
124624: *(--z) = 'e';
124625: }
124626: }
124627:
124628: /* Step 1c */
124629: if( z[0]=='y' && hasVowel(z+1) ){
124630: z[0] = 'i';
124631: }
124632:
124633: /* Step 2 */
124634: switch( z[1] ){
124635: case 'a':
124636: stem(&z, "lanoita", "ate", m_gt_0) ||
124637: stem(&z, "lanoit", "tion", m_gt_0);
124638: break;
124639: case 'c':
124640: stem(&z, "icne", "ence", m_gt_0) ||
124641: stem(&z, "icna", "ance", m_gt_0);
124642: break;
124643: case 'e':
124644: stem(&z, "rezi", "ize", m_gt_0);
124645: break;
124646: case 'g':
124647: stem(&z, "igol", "log", m_gt_0);
124648: break;
124649: case 'l':
124650: stem(&z, "ilb", "ble", m_gt_0) ||
124651: stem(&z, "illa", "al", m_gt_0) ||
124652: stem(&z, "iltne", "ent", m_gt_0) ||
124653: stem(&z, "ile", "e", m_gt_0) ||
124654: stem(&z, "ilsuo", "ous", m_gt_0);
124655: break;
124656: case 'o':
124657: stem(&z, "noitazi", "ize", m_gt_0) ||
124658: stem(&z, "noita", "ate", m_gt_0) ||
124659: stem(&z, "rota", "ate", m_gt_0);
124660: break;
124661: case 's':
124662: stem(&z, "msila", "al", m_gt_0) ||
124663: stem(&z, "ssenevi", "ive", m_gt_0) ||
124664: stem(&z, "ssenluf", "ful", m_gt_0) ||
124665: stem(&z, "ssensuo", "ous", m_gt_0);
124666: break;
124667: case 't':
124668: stem(&z, "itila", "al", m_gt_0) ||
124669: stem(&z, "itivi", "ive", m_gt_0) ||
124670: stem(&z, "itilib", "ble", m_gt_0);
124671: break;
124672: }
124673:
124674: /* Step 3 */
124675: switch( z[0] ){
124676: case 'e':
124677: stem(&z, "etaci", "ic", m_gt_0) ||
124678: stem(&z, "evita", "", m_gt_0) ||
124679: stem(&z, "ezila", "al", m_gt_0);
124680: break;
124681: case 'i':
124682: stem(&z, "itici", "ic", m_gt_0);
124683: break;
124684: case 'l':
124685: stem(&z, "laci", "ic", m_gt_0) ||
124686: stem(&z, "luf", "", m_gt_0);
124687: break;
124688: case 's':
124689: stem(&z, "ssen", "", m_gt_0);
124690: break;
124691: }
124692:
124693: /* Step 4 */
124694: switch( z[1] ){
124695: case 'a':
124696: if( z[0]=='l' && m_gt_1(z+2) ){
124697: z += 2;
124698: }
124699: break;
124700: case 'c':
124701: if( z[0]=='e' && z[2]=='n' && (z[3]=='a' || z[3]=='e') && m_gt_1(z+4) ){
124702: z += 4;
124703: }
124704: break;
124705: case 'e':
124706: if( z[0]=='r' && m_gt_1(z+2) ){
124707: z += 2;
124708: }
124709: break;
124710: case 'i':
124711: if( z[0]=='c' && m_gt_1(z+2) ){
124712: z += 2;
124713: }
124714: break;
124715: case 'l':
124716: if( z[0]=='e' && z[2]=='b' && (z[3]=='a' || z[3]=='i') && m_gt_1(z+4) ){
124717: z += 4;
124718: }
124719: break;
124720: case 'n':
124721: if( z[0]=='t' ){
124722: if( z[2]=='a' ){
124723: if( m_gt_1(z+3) ){
124724: z += 3;
124725: }
124726: }else if( z[2]=='e' ){
124727: stem(&z, "tneme", "", m_gt_1) ||
124728: stem(&z, "tnem", "", m_gt_1) ||
124729: stem(&z, "tne", "", m_gt_1);
124730: }
124731: }
124732: break;
124733: case 'o':
124734: if( z[0]=='u' ){
124735: if( m_gt_1(z+2) ){
124736: z += 2;
124737: }
124738: }else if( z[3]=='s' || z[3]=='t' ){
124739: stem(&z, "noi", "", m_gt_1);
124740: }
124741: break;
124742: case 's':
124743: if( z[0]=='m' && z[2]=='i' && m_gt_1(z+3) ){
124744: z += 3;
124745: }
124746: break;
124747: case 't':
124748: stem(&z, "eta", "", m_gt_1) ||
124749: stem(&z, "iti", "", m_gt_1);
124750: break;
124751: case 'u':
124752: if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){
124753: z += 3;
124754: }
124755: break;
124756: case 'v':
124757: case 'z':
124758: if( z[0]=='e' && z[2]=='i' && m_gt_1(z+3) ){
124759: z += 3;
124760: }
124761: break;
124762: }
124763:
124764: /* Step 5a */
124765: if( z[0]=='e' ){
124766: if( m_gt_1(z+1) ){
124767: z++;
124768: }else if( m_eq_1(z+1) && !star_oh(z+1) ){
124769: z++;
124770: }
124771: }
124772:
124773: /* Step 5b */
124774: if( m_gt_1(z) && z[0]=='l' && z[1]=='l' ){
124775: z++;
124776: }
124777:
124778: /* z[] is now the stemmed word in reverse order. Flip it back
124779: ** around into forward order and return.
124780: */
124781: *pnOut = i = (int)strlen(z);
124782: zOut[i] = 0;
124783: while( *z ){
124784: zOut[--i] = *(z++);
124785: }
124786: }
124787:
124788: /*
124789: ** Characters that can be part of a token. We assume any character
124790: ** whose value is greater than 0x80 (any UTF character) can be
124791: ** part of a token. In other words, delimiters all must have
124792: ** values of 0x7f or lower.
124793: */
124794: static const char porterIdChar[] = {
124795: /* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF */
124796: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */
124797: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */
124798: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */
124799: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */
124800: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
124801: };
124802: #define isDelim(C) (((ch=C)&0x80)==0 && (ch<0x30 || !porterIdChar[ch-0x30]))
124803:
124804: /*
124805: ** Extract the next token from a tokenization cursor. The cursor must
124806: ** have been opened by a prior call to porterOpen().
124807: */
124808: static int porterNext(
124809: sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by porterOpen */
124810: const char **pzToken, /* OUT: *pzToken is the token text */
124811: int *pnBytes, /* OUT: Number of bytes in token */
124812: int *piStartOffset, /* OUT: Starting offset of token */
124813: int *piEndOffset, /* OUT: Ending offset of token */
124814: int *piPosition /* OUT: Position integer of token */
124815: ){
124816: porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor;
124817: const char *z = c->zInput;
124818:
124819: while( c->iOffset<c->nInput ){
124820: int iStartOffset, ch;
124821:
124822: /* Scan past delimiter characters */
124823: while( c->iOffset<c->nInput && isDelim(z[c->iOffset]) ){
124824: c->iOffset++;
124825: }
124826:
124827: /* Count non-delimiter characters. */
124828: iStartOffset = c->iOffset;
124829: while( c->iOffset<c->nInput && !isDelim(z[c->iOffset]) ){
124830: c->iOffset++;
124831: }
124832:
124833: if( c->iOffset>iStartOffset ){
124834: int n = c->iOffset-iStartOffset;
124835: if( n>c->nAllocated ){
124836: char *pNew;
124837: c->nAllocated = n+20;
124838: pNew = sqlite3_realloc(c->zToken, c->nAllocated);
124839: if( !pNew ) return SQLITE_NOMEM;
124840: c->zToken = pNew;
124841: }
124842: porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes);
124843: *pzToken = c->zToken;
124844: *piStartOffset = iStartOffset;
124845: *piEndOffset = c->iOffset;
124846: *piPosition = c->iToken++;
124847: return SQLITE_OK;
124848: }
124849: }
124850: return SQLITE_DONE;
124851: }
124852:
124853: /*
124854: ** The set of routines that implement the porter-stemmer tokenizer
124855: */
124856: static const sqlite3_tokenizer_module porterTokenizerModule = {
124857: 0,
124858: porterCreate,
124859: porterDestroy,
124860: porterOpen,
124861: porterClose,
124862: porterNext,
1.2.2.1 ! misho 124863: 0
1.2 misho 124864: };
124865:
124866: /*
124867: ** Allocate a new porter tokenizer. Return a pointer to the new
124868: ** tokenizer in *ppModule
124869: */
124870: SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule(
124871: sqlite3_tokenizer_module const**ppModule
124872: ){
124873: *ppModule = &porterTokenizerModule;
124874: }
124875:
124876: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
124877:
124878: /************** End of fts3_porter.c *****************************************/
124879: /************** Begin file fts3_tokenizer.c **********************************/
124880: /*
124881: ** 2007 June 22
124882: **
124883: ** The author disclaims copyright to this source code. In place of
124884: ** a legal notice, here is a blessing:
124885: **
124886: ** May you do good and not evil.
124887: ** May you find forgiveness for yourself and forgive others.
124888: ** May you share freely, never taking more than you give.
124889: **
124890: ******************************************************************************
124891: **
124892: ** This is part of an SQLite module implementing full-text search.
124893: ** This particular file implements the generic tokenizer interface.
124894: */
124895:
124896: /*
124897: ** The code in this file is only compiled if:
124898: **
124899: ** * The FTS3 module is being built as an extension
124900: ** (in which case SQLITE_CORE is not defined), or
124901: **
124902: ** * The FTS3 module is being built into the core of
124903: ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
124904: */
124905: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
124906:
124907: /* #include <assert.h> */
124908: /* #include <string.h> */
124909:
124910: /*
124911: ** Implementation of the SQL scalar function for accessing the underlying
124912: ** hash table. This function may be called as follows:
124913: **
124914: ** SELECT <function-name>(<key-name>);
124915: ** SELECT <function-name>(<key-name>, <pointer>);
124916: **
124917: ** where <function-name> is the name passed as the second argument
124918: ** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer').
124919: **
124920: ** If the <pointer> argument is specified, it must be a blob value
124921: ** containing a pointer to be stored as the hash data corresponding
124922: ** to the string <key-name>. If <pointer> is not specified, then
124923: ** the string <key-name> must already exist in the has table. Otherwise,
124924: ** an error is returned.
124925: **
124926: ** Whether or not the <pointer> argument is specified, the value returned
124927: ** is a blob containing the pointer stored as the hash data corresponding
124928: ** to string <key-name> (after the hash-table is updated, if applicable).
124929: */
124930: static void scalarFunc(
124931: sqlite3_context *context,
124932: int argc,
124933: sqlite3_value **argv
124934: ){
124935: Fts3Hash *pHash;
124936: void *pPtr = 0;
124937: const unsigned char *zName;
124938: int nName;
124939:
124940: assert( argc==1 || argc==2 );
124941:
124942: pHash = (Fts3Hash *)sqlite3_user_data(context);
124943:
124944: zName = sqlite3_value_text(argv[0]);
124945: nName = sqlite3_value_bytes(argv[0])+1;
124946:
124947: if( argc==2 ){
124948: void *pOld;
124949: int n = sqlite3_value_bytes(argv[1]);
124950: if( n!=sizeof(pPtr) ){
124951: sqlite3_result_error(context, "argument type mismatch", -1);
124952: return;
124953: }
124954: pPtr = *(void **)sqlite3_value_blob(argv[1]);
124955: pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr);
124956: if( pOld==pPtr ){
124957: sqlite3_result_error(context, "out of memory", -1);
124958: return;
124959: }
124960: }else{
124961: pPtr = sqlite3Fts3HashFind(pHash, zName, nName);
124962: if( !pPtr ){
124963: char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName);
124964: sqlite3_result_error(context, zErr, -1);
124965: sqlite3_free(zErr);
124966: return;
124967: }
124968: }
124969:
124970: sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT);
124971: }
124972:
124973: SQLITE_PRIVATE int sqlite3Fts3IsIdChar(char c){
124974: static const char isFtsIdChar[] = {
124975: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x */
124976: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1x */
124977: 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 2x */
124978: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 3x */
124979: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 4x */
124980: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 5x */
124981: 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 6x */
124982: 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 7x */
124983: };
124984: return (c&0x80 || isFtsIdChar[(int)(c)]);
124985: }
124986:
124987: SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *zStr, int *pn){
124988: const char *z1;
124989: const char *z2 = 0;
124990:
124991: /* Find the start of the next token. */
124992: z1 = zStr;
124993: while( z2==0 ){
124994: char c = *z1;
124995: switch( c ){
124996: case '\0': return 0; /* No more tokens here */
124997: case '\'':
124998: case '"':
124999: case '`': {
125000: z2 = z1;
125001: while( *++z2 && (*z2!=c || *++z2==c) );
125002: break;
125003: }
125004: case '[':
125005: z2 = &z1[1];
125006: while( *z2 && z2[0]!=']' ) z2++;
125007: if( *z2 ) z2++;
125008: break;
125009:
125010: default:
125011: if( sqlite3Fts3IsIdChar(*z1) ){
125012: z2 = &z1[1];
125013: while( sqlite3Fts3IsIdChar(*z2) ) z2++;
125014: }else{
125015: z1++;
125016: }
125017: }
125018: }
125019:
125020: *pn = (int)(z2-z1);
125021: return z1;
125022: }
125023:
125024: SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(
125025: Fts3Hash *pHash, /* Tokenizer hash table */
125026: const char *zArg, /* Tokenizer name */
125027: sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */
125028: char **pzErr /* OUT: Set to malloced error message */
125029: ){
125030: int rc;
125031: char *z = (char *)zArg;
125032: int n = 0;
125033: char *zCopy;
125034: char *zEnd; /* Pointer to nul-term of zCopy */
125035: sqlite3_tokenizer_module *m;
125036:
125037: zCopy = sqlite3_mprintf("%s", zArg);
125038: if( !zCopy ) return SQLITE_NOMEM;
125039: zEnd = &zCopy[strlen(zCopy)];
125040:
125041: z = (char *)sqlite3Fts3NextToken(zCopy, &n);
125042: z[n] = '\0';
125043: sqlite3Fts3Dequote(z);
125044:
125045: m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1);
125046: if( !m ){
125047: *pzErr = sqlite3_mprintf("unknown tokenizer: %s", z);
125048: rc = SQLITE_ERROR;
125049: }else{
125050: char const **aArg = 0;
125051: int iArg = 0;
125052: z = &z[n+1];
125053: while( z<zEnd && (NULL!=(z = (char *)sqlite3Fts3NextToken(z, &n))) ){
125054: int nNew = sizeof(char *)*(iArg+1);
125055: char const **aNew = (const char **)sqlite3_realloc((void *)aArg, nNew);
125056: if( !aNew ){
125057: sqlite3_free(zCopy);
125058: sqlite3_free((void *)aArg);
125059: return SQLITE_NOMEM;
125060: }
125061: aArg = aNew;
125062: aArg[iArg++] = z;
125063: z[n] = '\0';
125064: sqlite3Fts3Dequote(z);
125065: z = &z[n+1];
125066: }
125067: rc = m->xCreate(iArg, aArg, ppTok);
125068: assert( rc!=SQLITE_OK || *ppTok );
125069: if( rc!=SQLITE_OK ){
125070: *pzErr = sqlite3_mprintf("unknown tokenizer");
125071: }else{
125072: (*ppTok)->pModule = m;
125073: }
125074: sqlite3_free((void *)aArg);
125075: }
125076:
125077: sqlite3_free(zCopy);
125078: return rc;
125079: }
125080:
125081:
125082: #ifdef SQLITE_TEST
125083:
125084: /* #include <tcl.h> */
125085: /* #include <string.h> */
125086:
125087: /*
125088: ** Implementation of a special SQL scalar function for testing tokenizers
125089: ** designed to be used in concert with the Tcl testing framework. This
1.2.2.1 ! misho 125090: ** function must be called with two or more arguments:
1.2 misho 125091: **
1.2.2.1 ! misho 125092: ** SELECT <function-name>(<key-name>, ..., <input-string>);
1.2 misho 125093: **
125094: ** where <function-name> is the name passed as the second argument
125095: ** to the sqlite3Fts3InitHashTable() function (e.g. 'fts3_tokenizer')
125096: ** concatenated with the string '_test' (e.g. 'fts3_tokenizer_test').
125097: **
125098: ** The return value is a string that may be interpreted as a Tcl
125099: ** list. For each token in the <input-string>, three elements are
125100: ** added to the returned list. The first is the token position, the
125101: ** second is the token text (folded, stemmed, etc.) and the third is the
125102: ** substring of <input-string> associated with the token. For example,
125103: ** using the built-in "simple" tokenizer:
125104: **
125105: ** SELECT fts_tokenizer_test('simple', 'I don't see how');
125106: **
125107: ** will return the string:
125108: **
125109: ** "{0 i I 1 dont don't 2 see see 3 how how}"
125110: **
125111: */
125112: static void testFunc(
125113: sqlite3_context *context,
125114: int argc,
125115: sqlite3_value **argv
125116: ){
125117: Fts3Hash *pHash;
125118: sqlite3_tokenizer_module *p;
125119: sqlite3_tokenizer *pTokenizer = 0;
125120: sqlite3_tokenizer_cursor *pCsr = 0;
125121:
125122: const char *zErr = 0;
125123:
125124: const char *zName;
125125: int nName;
125126: const char *zInput;
125127: int nInput;
125128:
1.2.2.1 ! misho 125129: const char *azArg[64];
1.2 misho 125130:
125131: const char *zToken;
1.2.2.1 ! misho 125132: int nToken = 0;
! 125133: int iStart = 0;
! 125134: int iEnd = 0;
! 125135: int iPos = 0;
! 125136: int i;
1.2 misho 125137:
125138: Tcl_Obj *pRet;
125139:
1.2.2.1 ! misho 125140: if( argc<2 ){
! 125141: sqlite3_result_error(context, "insufficient arguments", -1);
! 125142: return;
! 125143: }
1.2 misho 125144:
125145: nName = sqlite3_value_bytes(argv[0]);
125146: zName = (const char *)sqlite3_value_text(argv[0]);
125147: nInput = sqlite3_value_bytes(argv[argc-1]);
125148: zInput = (const char *)sqlite3_value_text(argv[argc-1]);
125149:
125150: pHash = (Fts3Hash *)sqlite3_user_data(context);
125151: p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1);
125152:
125153: if( !p ){
125154: char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName);
125155: sqlite3_result_error(context, zErr, -1);
125156: sqlite3_free(zErr);
125157: return;
125158: }
125159:
125160: pRet = Tcl_NewObj();
125161: Tcl_IncrRefCount(pRet);
125162:
1.2.2.1 ! misho 125163: for(i=1; i<argc-1; i++){
! 125164: azArg[i-1] = (const char *)sqlite3_value_text(argv[i]);
! 125165: }
! 125166:
! 125167: if( SQLITE_OK!=p->xCreate(argc-2, azArg, &pTokenizer) ){
1.2 misho 125168: zErr = "error in xCreate()";
125169: goto finish;
125170: }
125171: pTokenizer->pModule = p;
1.2.2.1 ! misho 125172: if( sqlite3Fts3OpenTokenizer(pTokenizer, 0, zInput, nInput, &pCsr) ){
1.2 misho 125173: zErr = "error in xOpen()";
125174: goto finish;
125175: }
125176:
125177: while( SQLITE_OK==p->xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos) ){
125178: Tcl_ListObjAppendElement(0, pRet, Tcl_NewIntObj(iPos));
125179: Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken));
125180: zToken = &zInput[iStart];
125181: nToken = iEnd-iStart;
125182: Tcl_ListObjAppendElement(0, pRet, Tcl_NewStringObj(zToken, nToken));
125183: }
125184:
125185: if( SQLITE_OK!=p->xClose(pCsr) ){
125186: zErr = "error in xClose()";
125187: goto finish;
125188: }
125189: if( SQLITE_OK!=p->xDestroy(pTokenizer) ){
125190: zErr = "error in xDestroy()";
125191: goto finish;
125192: }
125193:
125194: finish:
125195: if( zErr ){
125196: sqlite3_result_error(context, zErr, -1);
125197: }else{
125198: sqlite3_result_text(context, Tcl_GetString(pRet), -1, SQLITE_TRANSIENT);
125199: }
125200: Tcl_DecrRefCount(pRet);
125201: }
125202:
125203: static
125204: int registerTokenizer(
125205: sqlite3 *db,
125206: char *zName,
125207: const sqlite3_tokenizer_module *p
125208: ){
125209: int rc;
125210: sqlite3_stmt *pStmt;
125211: const char zSql[] = "SELECT fts3_tokenizer(?, ?)";
125212:
125213: rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
125214: if( rc!=SQLITE_OK ){
125215: return rc;
125216: }
125217:
125218: sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
125219: sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC);
125220: sqlite3_step(pStmt);
125221:
125222: return sqlite3_finalize(pStmt);
125223: }
125224:
125225: static
125226: int queryTokenizer(
125227: sqlite3 *db,
125228: char *zName,
125229: const sqlite3_tokenizer_module **pp
125230: ){
125231: int rc;
125232: sqlite3_stmt *pStmt;
125233: const char zSql[] = "SELECT fts3_tokenizer(?)";
125234:
125235: *pp = 0;
125236: rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
125237: if( rc!=SQLITE_OK ){
125238: return rc;
125239: }
125240:
125241: sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);
125242: if( SQLITE_ROW==sqlite3_step(pStmt) ){
125243: if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){
125244: memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
125245: }
125246: }
125247:
125248: return sqlite3_finalize(pStmt);
125249: }
125250:
125251: SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule);
125252:
125253: /*
125254: ** Implementation of the scalar function fts3_tokenizer_internal_test().
125255: ** This function is used for testing only, it is not included in the
125256: ** build unless SQLITE_TEST is defined.
125257: **
125258: ** The purpose of this is to test that the fts3_tokenizer() function
125259: ** can be used as designed by the C-code in the queryTokenizer and
125260: ** registerTokenizer() functions above. These two functions are repeated
125261: ** in the README.tokenizer file as an example, so it is important to
125262: ** test them.
125263: **
125264: ** To run the tests, evaluate the fts3_tokenizer_internal_test() scalar
125265: ** function with no arguments. An assert() will fail if a problem is
125266: ** detected. i.e.:
125267: **
125268: ** SELECT fts3_tokenizer_internal_test();
125269: **
125270: */
125271: static void intTestFunc(
125272: sqlite3_context *context,
125273: int argc,
125274: sqlite3_value **argv
125275: ){
125276: int rc;
125277: const sqlite3_tokenizer_module *p1;
125278: const sqlite3_tokenizer_module *p2;
125279: sqlite3 *db = (sqlite3 *)sqlite3_user_data(context);
125280:
125281: UNUSED_PARAMETER(argc);
125282: UNUSED_PARAMETER(argv);
125283:
125284: /* Test the query function */
125285: sqlite3Fts3SimpleTokenizerModule(&p1);
125286: rc = queryTokenizer(db, "simple", &p2);
125287: assert( rc==SQLITE_OK );
125288: assert( p1==p2 );
125289: rc = queryTokenizer(db, "nosuchtokenizer", &p2);
125290: assert( rc==SQLITE_ERROR );
125291: assert( p2==0 );
125292: assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") );
125293:
125294: /* Test the storage function */
125295: rc = registerTokenizer(db, "nosuchtokenizer", p1);
125296: assert( rc==SQLITE_OK );
125297: rc = queryTokenizer(db, "nosuchtokenizer", &p2);
125298: assert( rc==SQLITE_OK );
125299: assert( p2==p1 );
125300:
125301: sqlite3_result_text(context, "ok", -1, SQLITE_STATIC);
125302: }
125303:
125304: #endif
125305:
125306: /*
125307: ** Set up SQL objects in database db used to access the contents of
125308: ** the hash table pointed to by argument pHash. The hash table must
125309: ** been initialised to use string keys, and to take a private copy
125310: ** of the key when a value is inserted. i.e. by a call similar to:
125311: **
125312: ** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1);
125313: **
125314: ** This function adds a scalar function (see header comment above
125315: ** scalarFunc() in this file for details) and, if ENABLE_TABLE is
125316: ** defined at compilation time, a temporary virtual table (see header
125317: ** comment above struct HashTableVtab) to the database schema. Both
125318: ** provide read/write access to the contents of *pHash.
125319: **
125320: ** The third argument to this function, zName, is used as the name
125321: ** of both the scalar and, if created, the virtual table.
125322: */
125323: SQLITE_PRIVATE int sqlite3Fts3InitHashTable(
125324: sqlite3 *db,
125325: Fts3Hash *pHash,
125326: const char *zName
125327: ){
125328: int rc = SQLITE_OK;
125329: void *p = (void *)pHash;
125330: const int any = SQLITE_ANY;
125331:
125332: #ifdef SQLITE_TEST
125333: char *zTest = 0;
125334: char *zTest2 = 0;
125335: void *pdb = (void *)db;
125336: zTest = sqlite3_mprintf("%s_test", zName);
125337: zTest2 = sqlite3_mprintf("%s_internal_test", zName);
125338: if( !zTest || !zTest2 ){
125339: rc = SQLITE_NOMEM;
125340: }
125341: #endif
125342:
125343: if( SQLITE_OK==rc ){
125344: rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0);
125345: }
125346: if( SQLITE_OK==rc ){
125347: rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0);
125348: }
125349: #ifdef SQLITE_TEST
125350: if( SQLITE_OK==rc ){
1.2.2.1 ! misho 125351: rc = sqlite3_create_function(db, zTest, -1, any, p, testFunc, 0, 0);
1.2 misho 125352: }
125353: if( SQLITE_OK==rc ){
125354: rc = sqlite3_create_function(db, zTest2, 0, any, pdb, intTestFunc, 0, 0);
125355: }
125356: #endif
125357:
125358: #ifdef SQLITE_TEST
125359: sqlite3_free(zTest);
125360: sqlite3_free(zTest2);
125361: #endif
125362:
125363: return rc;
125364: }
125365:
125366: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
125367:
125368: /************** End of fts3_tokenizer.c **************************************/
125369: /************** Begin file fts3_tokenizer1.c *********************************/
125370: /*
125371: ** 2006 Oct 10
125372: **
125373: ** The author disclaims copyright to this source code. In place of
125374: ** a legal notice, here is a blessing:
125375: **
125376: ** May you do good and not evil.
125377: ** May you find forgiveness for yourself and forgive others.
125378: ** May you share freely, never taking more than you give.
125379: **
125380: ******************************************************************************
125381: **
125382: ** Implementation of the "simple" full-text-search tokenizer.
125383: */
125384:
125385: /*
125386: ** The code in this file is only compiled if:
125387: **
125388: ** * The FTS3 module is being built as an extension
125389: ** (in which case SQLITE_CORE is not defined), or
125390: **
125391: ** * The FTS3 module is being built into the core of
125392: ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
125393: */
125394: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
125395:
125396: /* #include <assert.h> */
125397: /* #include <stdlib.h> */
125398: /* #include <stdio.h> */
125399: /* #include <string.h> */
125400:
125401:
125402: typedef struct simple_tokenizer {
125403: sqlite3_tokenizer base;
125404: char delim[128]; /* flag ASCII delimiters */
125405: } simple_tokenizer;
125406:
125407: typedef struct simple_tokenizer_cursor {
125408: sqlite3_tokenizer_cursor base;
125409: const char *pInput; /* input we are tokenizing */
125410: int nBytes; /* size of the input */
125411: int iOffset; /* current position in pInput */
125412: int iToken; /* index of next token to be returned */
125413: char *pToken; /* storage for current token */
125414: int nTokenAllocated; /* space allocated to zToken buffer */
125415: } simple_tokenizer_cursor;
125416:
125417:
125418: static int simpleDelim(simple_tokenizer *t, unsigned char c){
125419: return c<0x80 && t->delim[c];
125420: }
125421: static int fts3_isalnum(int x){
125422: return (x>='0' && x<='9') || (x>='A' && x<='Z') || (x>='a' && x<='z');
125423: }
125424:
125425: /*
125426: ** Create a new tokenizer instance.
125427: */
125428: static int simpleCreate(
125429: int argc, const char * const *argv,
125430: sqlite3_tokenizer **ppTokenizer
125431: ){
125432: simple_tokenizer *t;
125433:
125434: t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t));
125435: if( t==NULL ) return SQLITE_NOMEM;
125436: memset(t, 0, sizeof(*t));
125437:
125438: /* TODO(shess) Delimiters need to remain the same from run to run,
125439: ** else we need to reindex. One solution would be a meta-table to
125440: ** track such information in the database, then we'd only want this
125441: ** information on the initial create.
125442: */
125443: if( argc>1 ){
125444: int i, n = (int)strlen(argv[1]);
125445: for(i=0; i<n; i++){
125446: unsigned char ch = argv[1][i];
125447: /* We explicitly don't support UTF-8 delimiters for now. */
125448: if( ch>=0x80 ){
125449: sqlite3_free(t);
125450: return SQLITE_ERROR;
125451: }
125452: t->delim[ch] = 1;
125453: }
125454: } else {
125455: /* Mark non-alphanumeric ASCII characters as delimiters */
125456: int i;
125457: for(i=1; i<0x80; i++){
125458: t->delim[i] = !fts3_isalnum(i) ? -1 : 0;
125459: }
125460: }
125461:
125462: *ppTokenizer = &t->base;
125463: return SQLITE_OK;
125464: }
125465:
125466: /*
125467: ** Destroy a tokenizer
125468: */
125469: static int simpleDestroy(sqlite3_tokenizer *pTokenizer){
125470: sqlite3_free(pTokenizer);
125471: return SQLITE_OK;
125472: }
125473:
125474: /*
125475: ** Prepare to begin tokenizing a particular string. The input
125476: ** string to be tokenized is pInput[0..nBytes-1]. A cursor
125477: ** used to incrementally tokenize this string is returned in
125478: ** *ppCursor.
125479: */
125480: static int simpleOpen(
125481: sqlite3_tokenizer *pTokenizer, /* The tokenizer */
125482: const char *pInput, int nBytes, /* String to be tokenized */
125483: sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */
125484: ){
125485: simple_tokenizer_cursor *c;
125486:
125487: UNUSED_PARAMETER(pTokenizer);
125488:
125489: c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c));
125490: if( c==NULL ) return SQLITE_NOMEM;
125491:
125492: c->pInput = pInput;
125493: if( pInput==0 ){
125494: c->nBytes = 0;
125495: }else if( nBytes<0 ){
125496: c->nBytes = (int)strlen(pInput);
125497: }else{
125498: c->nBytes = nBytes;
125499: }
125500: c->iOffset = 0; /* start tokenizing at the beginning */
125501: c->iToken = 0;
125502: c->pToken = NULL; /* no space allocated, yet. */
125503: c->nTokenAllocated = 0;
125504:
125505: *ppCursor = &c->base;
125506: return SQLITE_OK;
125507: }
125508:
125509: /*
125510: ** Close a tokenization cursor previously opened by a call to
125511: ** simpleOpen() above.
125512: */
125513: static int simpleClose(sqlite3_tokenizer_cursor *pCursor){
125514: simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor;
125515: sqlite3_free(c->pToken);
125516: sqlite3_free(c);
125517: return SQLITE_OK;
125518: }
125519:
125520: /*
125521: ** Extract the next token from a tokenization cursor. The cursor must
125522: ** have been opened by a prior call to simpleOpen().
125523: */
125524: static int simpleNext(
125525: sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */
125526: const char **ppToken, /* OUT: *ppToken is the token text */
125527: int *pnBytes, /* OUT: Number of bytes in token */
125528: int *piStartOffset, /* OUT: Starting offset of token */
125529: int *piEndOffset, /* OUT: Ending offset of token */
125530: int *piPosition /* OUT: Position integer of token */
125531: ){
125532: simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor;
125533: simple_tokenizer *t = (simple_tokenizer *) pCursor->pTokenizer;
125534: unsigned char *p = (unsigned char *)c->pInput;
125535:
125536: while( c->iOffset<c->nBytes ){
125537: int iStartOffset;
125538:
125539: /* Scan past delimiter characters */
125540: while( c->iOffset<c->nBytes && simpleDelim(t, p[c->iOffset]) ){
125541: c->iOffset++;
125542: }
125543:
125544: /* Count non-delimiter characters. */
125545: iStartOffset = c->iOffset;
125546: while( c->iOffset<c->nBytes && !simpleDelim(t, p[c->iOffset]) ){
125547: c->iOffset++;
125548: }
125549:
125550: if( c->iOffset>iStartOffset ){
125551: int i, n = c->iOffset-iStartOffset;
125552: if( n>c->nTokenAllocated ){
125553: char *pNew;
125554: c->nTokenAllocated = n+20;
125555: pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated);
125556: if( !pNew ) return SQLITE_NOMEM;
125557: c->pToken = pNew;
125558: }
125559: for(i=0; i<n; i++){
125560: /* TODO(shess) This needs expansion to handle UTF-8
125561: ** case-insensitivity.
125562: */
125563: unsigned char ch = p[iStartOffset+i];
125564: c->pToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch);
125565: }
125566: *ppToken = c->pToken;
125567: *pnBytes = n;
125568: *piStartOffset = iStartOffset;
125569: *piEndOffset = c->iOffset;
125570: *piPosition = c->iToken++;
125571:
125572: return SQLITE_OK;
125573: }
125574: }
125575: return SQLITE_DONE;
125576: }
125577:
125578: /*
125579: ** The set of routines that implement the simple tokenizer
125580: */
125581: static const sqlite3_tokenizer_module simpleTokenizerModule = {
125582: 0,
125583: simpleCreate,
125584: simpleDestroy,
125585: simpleOpen,
125586: simpleClose,
125587: simpleNext,
1.2.2.1 ! misho 125588: 0,
1.2 misho 125589: };
125590:
125591: /*
125592: ** Allocate a new simple tokenizer. Return a pointer to the new
125593: ** tokenizer in *ppModule
125594: */
125595: SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule(
125596: sqlite3_tokenizer_module const**ppModule
125597: ){
125598: *ppModule = &simpleTokenizerModule;
125599: }
125600:
125601: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
125602:
125603: /************** End of fts3_tokenizer1.c *************************************/
125604: /************** Begin file fts3_write.c **************************************/
125605: /*
125606: ** 2009 Oct 23
125607: **
125608: ** The author disclaims copyright to this source code. In place of
125609: ** a legal notice, here is a blessing:
125610: **
125611: ** May you do good and not evil.
125612: ** May you find forgiveness for yourself and forgive others.
125613: ** May you share freely, never taking more than you give.
125614: **
125615: ******************************************************************************
125616: **
125617: ** This file is part of the SQLite FTS3 extension module. Specifically,
125618: ** this file contains code to insert, update and delete rows from FTS3
125619: ** tables. It also contains code to merge FTS3 b-tree segments. Some
125620: ** of the sub-routines used to merge segments are also used by the query
125621: ** code in fts3.c.
125622: */
125623:
125624: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
125625:
125626: /* #include <string.h> */
125627: /* #include <assert.h> */
125628: /* #include <stdlib.h> */
125629:
1.2.2.1 ! misho 125630:
! 125631: #define FTS_MAX_APPENDABLE_HEIGHT 16
! 125632:
1.2 misho 125633: /*
125634: ** When full-text index nodes are loaded from disk, the buffer that they
125635: ** are loaded into has the following number of bytes of padding at the end
125636: ** of it. i.e. if a full-text index node is 900 bytes in size, then a buffer
125637: ** of 920 bytes is allocated for it.
125638: **
125639: ** This means that if we have a pointer into a buffer containing node data,
125640: ** it is always safe to read up to two varints from it without risking an
125641: ** overread, even if the node data is corrupted.
125642: */
125643: #define FTS3_NODE_PADDING (FTS3_VARINT_MAX*2)
125644:
125645: /*
125646: ** Under certain circumstances, b-tree nodes (doclists) can be loaded into
125647: ** memory incrementally instead of all at once. This can be a big performance
125648: ** win (reduced IO and CPU) if SQLite stops calling the virtual table xNext()
125649: ** method before retrieving all query results (as may happen, for example,
125650: ** if a query has a LIMIT clause).
125651: **
125652: ** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD
125653: ** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes.
125654: ** The code is written so that the hard lower-limit for each of these values
125655: ** is 1. Clearly such small values would be inefficient, but can be useful
125656: ** for testing purposes.
125657: **
125658: ** If this module is built with SQLITE_TEST defined, these constants may
125659: ** be overridden at runtime for testing purposes. File fts3_test.c contains
125660: ** a Tcl interface to read and write the values.
125661: */
125662: #ifdef SQLITE_TEST
125663: int test_fts3_node_chunksize = (4*1024);
125664: int test_fts3_node_chunk_threshold = (4*1024)*4;
125665: # define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize
125666: # define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold
125667: #else
125668: # define FTS3_NODE_CHUNKSIZE (4*1024)
125669: # define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4)
125670: #endif
125671:
1.2.2.1 ! misho 125672: /*
! 125673: ** The two values that may be meaningfully bound to the :1 parameter in
! 125674: ** statements SQL_REPLACE_STAT and SQL_SELECT_STAT.
! 125675: */
! 125676: #define FTS_STAT_DOCTOTAL 0
! 125677: #define FTS_STAT_INCRMERGEHINT 1
! 125678: #define FTS_STAT_AUTOINCRMERGE 2
! 125679:
! 125680: /*
! 125681: ** If FTS_LOG_MERGES is defined, call sqlite3_log() to report each automatic
! 125682: ** and incremental merge operation that takes place. This is used for
! 125683: ** debugging FTS only, it should not usually be turned on in production
! 125684: ** systems.
! 125685: */
! 125686: #ifdef FTS3_LOG_MERGES
! 125687: static void fts3LogMerge(int nMerge, sqlite3_int64 iAbsLevel){
! 125688: sqlite3_log(SQLITE_OK, "%d-way merge from level %d", nMerge, (int)iAbsLevel);
! 125689: }
! 125690: #else
! 125691: #define fts3LogMerge(x, y)
! 125692: #endif
! 125693:
! 125694:
1.2 misho 125695: typedef struct PendingList PendingList;
125696: typedef struct SegmentNode SegmentNode;
125697: typedef struct SegmentWriter SegmentWriter;
125698:
125699: /*
125700: ** An instance of the following data structure is used to build doclists
125701: ** incrementally. See function fts3PendingListAppend() for details.
125702: */
125703: struct PendingList {
125704: int nData;
125705: char *aData;
125706: int nSpace;
125707: sqlite3_int64 iLastDocid;
125708: sqlite3_int64 iLastCol;
125709: sqlite3_int64 iLastPos;
125710: };
125711:
125712:
125713: /*
125714: ** Each cursor has a (possibly empty) linked list of the following objects.
125715: */
125716: struct Fts3DeferredToken {
125717: Fts3PhraseToken *pToken; /* Pointer to corresponding expr token */
125718: int iCol; /* Column token must occur in */
125719: Fts3DeferredToken *pNext; /* Next in list of deferred tokens */
125720: PendingList *pList; /* Doclist is assembled here */
125721: };
125722:
125723: /*
125724: ** An instance of this structure is used to iterate through the terms on
125725: ** a contiguous set of segment b-tree leaf nodes. Although the details of
125726: ** this structure are only manipulated by code in this file, opaque handles
125727: ** of type Fts3SegReader* are also used by code in fts3.c to iterate through
125728: ** terms when querying the full-text index. See functions:
125729: **
125730: ** sqlite3Fts3SegReaderNew()
125731: ** sqlite3Fts3SegReaderFree()
125732: ** sqlite3Fts3SegReaderIterate()
125733: **
125734: ** Methods used to manipulate Fts3SegReader structures:
125735: **
125736: ** fts3SegReaderNext()
125737: ** fts3SegReaderFirstDocid()
125738: ** fts3SegReaderNextDocid()
125739: */
125740: struct Fts3SegReader {
125741: int iIdx; /* Index within level, or 0x7FFFFFFF for PT */
1.2.2.1 ! misho 125742: u8 bLookup; /* True for a lookup only */
! 125743: u8 rootOnly; /* True for a root-only reader */
1.2 misho 125744:
125745: sqlite3_int64 iStartBlock; /* Rowid of first leaf block to traverse */
125746: sqlite3_int64 iLeafEndBlock; /* Rowid of final leaf block to traverse */
125747: sqlite3_int64 iEndBlock; /* Rowid of final block in segment (or 0) */
125748: sqlite3_int64 iCurrentBlock; /* Current leaf block (or 0) */
125749:
125750: char *aNode; /* Pointer to node data (or NULL) */
125751: int nNode; /* Size of buffer at aNode (or 0) */
125752: int nPopulate; /* If >0, bytes of buffer aNode[] loaded */
125753: sqlite3_blob *pBlob; /* If not NULL, blob handle to read node */
125754:
125755: Fts3HashElem **ppNextElem;
125756:
125757: /* Variables set by fts3SegReaderNext(). These may be read directly
125758: ** by the caller. They are valid from the time SegmentReaderNew() returns
125759: ** until SegmentReaderNext() returns something other than SQLITE_OK
125760: ** (i.e. SQLITE_DONE).
125761: */
125762: int nTerm; /* Number of bytes in current term */
125763: char *zTerm; /* Pointer to current term */
125764: int nTermAlloc; /* Allocated size of zTerm buffer */
125765: char *aDoclist; /* Pointer to doclist of current entry */
125766: int nDoclist; /* Size of doclist in current entry */
125767:
125768: /* The following variables are used by fts3SegReaderNextDocid() to iterate
125769: ** through the current doclist (aDoclist/nDoclist).
125770: */
125771: char *pOffsetList;
125772: int nOffsetList; /* For descending pending seg-readers only */
125773: sqlite3_int64 iDocid;
125774: };
125775:
1.2.2.1 ! misho 125776: #define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0)
! 125777: #define fts3SegReaderIsRootOnly(p) ((p)->rootOnly!=0)
! 125778:
! 125779: /*
! 125780: ** An instance of this structure is used to create a segment b-tree in the
! 125781: ** database. The internal details of this type are only accessed by the
! 125782: ** following functions:
! 125783: **
! 125784: ** fts3SegWriterAdd()
! 125785: ** fts3SegWriterFlush()
! 125786: ** fts3SegWriterFree()
! 125787: */
! 125788: struct SegmentWriter {
! 125789: SegmentNode *pTree; /* Pointer to interior tree structure */
! 125790: sqlite3_int64 iFirst; /* First slot in %_segments written */
! 125791: sqlite3_int64 iFree; /* Next free slot in %_segments */
! 125792: char *zTerm; /* Pointer to previous term buffer */
! 125793: int nTerm; /* Number of bytes in zTerm */
! 125794: int nMalloc; /* Size of malloc'd buffer at zMalloc */
! 125795: char *zMalloc; /* Malloc'd space (possibly) used for zTerm */
! 125796: int nSize; /* Size of allocation at aData */
! 125797: int nData; /* Bytes of data in aData */
! 125798: char *aData; /* Pointer to block from malloc() */
! 125799: };
! 125800:
! 125801: /*
! 125802: ** Type SegmentNode is used by the following three functions to create
! 125803: ** the interior part of the segment b+-tree structures (everything except
! 125804: ** the leaf nodes). These functions and type are only ever used by code
! 125805: ** within the fts3SegWriterXXX() family of functions described above.
! 125806: **
! 125807: ** fts3NodeAddTerm()
! 125808: ** fts3NodeWrite()
! 125809: ** fts3NodeFree()
! 125810: **
! 125811: ** When a b+tree is written to the database (either as a result of a merge
! 125812: ** or the pending-terms table being flushed), leaves are written into the
! 125813: ** database file as soon as they are completely populated. The interior of
! 125814: ** the tree is assembled in memory and written out only once all leaves have
! 125815: ** been populated and stored. This is Ok, as the b+-tree fanout is usually
! 125816: ** very large, meaning that the interior of the tree consumes relatively
! 125817: ** little memory.
! 125818: */
! 125819: struct SegmentNode {
! 125820: SegmentNode *pParent; /* Parent node (or NULL for root node) */
! 125821: SegmentNode *pRight; /* Pointer to right-sibling */
! 125822: SegmentNode *pLeftmost; /* Pointer to left-most node of this depth */
! 125823: int nEntry; /* Number of terms written to node so far */
! 125824: char *zTerm; /* Pointer to previous term buffer */
! 125825: int nTerm; /* Number of bytes in zTerm */
! 125826: int nMalloc; /* Size of malloc'd buffer at zMalloc */
! 125827: char *zMalloc; /* Malloc'd space (possibly) used for zTerm */
! 125828: int nData; /* Bytes of valid data so far */
! 125829: char *aData; /* Node data */
! 125830: };
! 125831:
! 125832: /*
! 125833: ** Valid values for the second argument to fts3SqlStmt().
! 125834: */
! 125835: #define SQL_DELETE_CONTENT 0
! 125836: #define SQL_IS_EMPTY 1
! 125837: #define SQL_DELETE_ALL_CONTENT 2
! 125838: #define SQL_DELETE_ALL_SEGMENTS 3
! 125839: #define SQL_DELETE_ALL_SEGDIR 4
! 125840: #define SQL_DELETE_ALL_DOCSIZE 5
! 125841: #define SQL_DELETE_ALL_STAT 6
! 125842: #define SQL_SELECT_CONTENT_BY_ROWID 7
! 125843: #define SQL_NEXT_SEGMENT_INDEX 8
! 125844: #define SQL_INSERT_SEGMENTS 9
! 125845: #define SQL_NEXT_SEGMENTS_ID 10
! 125846: #define SQL_INSERT_SEGDIR 11
! 125847: #define SQL_SELECT_LEVEL 12
! 125848: #define SQL_SELECT_LEVEL_RANGE 13
! 125849: #define SQL_SELECT_LEVEL_COUNT 14
! 125850: #define SQL_SELECT_SEGDIR_MAX_LEVEL 15
! 125851: #define SQL_DELETE_SEGDIR_LEVEL 16
! 125852: #define SQL_DELETE_SEGMENTS_RANGE 17
! 125853: #define SQL_CONTENT_INSERT 18
! 125854: #define SQL_DELETE_DOCSIZE 19
! 125855: #define SQL_REPLACE_DOCSIZE 20
! 125856: #define SQL_SELECT_DOCSIZE 21
! 125857: #define SQL_SELECT_STAT 22
! 125858: #define SQL_REPLACE_STAT 23
! 125859:
! 125860: #define SQL_SELECT_ALL_PREFIX_LEVEL 24
! 125861: #define SQL_DELETE_ALL_TERMS_SEGDIR 25
! 125862: #define SQL_DELETE_SEGDIR_RANGE 26
! 125863: #define SQL_SELECT_ALL_LANGID 27
! 125864: #define SQL_FIND_MERGE_LEVEL 28
! 125865: #define SQL_MAX_LEAF_NODE_ESTIMATE 29
! 125866: #define SQL_DELETE_SEGDIR_ENTRY 30
! 125867: #define SQL_SHIFT_SEGDIR_ENTRY 31
! 125868: #define SQL_SELECT_SEGDIR 32
! 125869: #define SQL_CHOMP_SEGDIR 33
! 125870: #define SQL_SEGMENT_IS_APPENDABLE 34
! 125871: #define SQL_SELECT_INDEXES 35
! 125872: #define SQL_SELECT_MXLEVEL 36
! 125873:
! 125874: /*
! 125875: ** This function is used to obtain an SQLite prepared statement handle
! 125876: ** for the statement identified by the second argument. If successful,
! 125877: ** *pp is set to the requested statement handle and SQLITE_OK returned.
! 125878: ** Otherwise, an SQLite error code is returned and *pp is set to 0.
! 125879: **
! 125880: ** If argument apVal is not NULL, then it must point to an array with
! 125881: ** at least as many entries as the requested statement has bound
! 125882: ** parameters. The values are bound to the statements parameters before
! 125883: ** returning.
! 125884: */
! 125885: static int fts3SqlStmt(
! 125886: Fts3Table *p, /* Virtual table handle */
! 125887: int eStmt, /* One of the SQL_XXX constants above */
! 125888: sqlite3_stmt **pp, /* OUT: Statement handle */
! 125889: sqlite3_value **apVal /* Values to bind to statement */
! 125890: ){
! 125891: const char *azSql[] = {
! 125892: /* 0 */ "DELETE FROM %Q.'%q_content' WHERE rowid = ?",
! 125893: /* 1 */ "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)",
! 125894: /* 2 */ "DELETE FROM %Q.'%q_content'",
! 125895: /* 3 */ "DELETE FROM %Q.'%q_segments'",
! 125896: /* 4 */ "DELETE FROM %Q.'%q_segdir'",
! 125897: /* 5 */ "DELETE FROM %Q.'%q_docsize'",
! 125898: /* 6 */ "DELETE FROM %Q.'%q_stat'",
! 125899: /* 7 */ "SELECT %s WHERE rowid=?",
! 125900: /* 8 */ "SELECT (SELECT max(idx) FROM %Q.'%q_segdir' WHERE level = ?) + 1",
! 125901: /* 9 */ "REPLACE INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)",
! 125902: /* 10 */ "SELECT coalesce((SELECT max(blockid) FROM %Q.'%q_segments') + 1, 1)",
! 125903: /* 11 */ "REPLACE INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)",
! 125904:
! 125905: /* Return segments in order from oldest to newest.*/
! 125906: /* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root "
! 125907: "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC",
! 125908: /* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root "
! 125909: "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?"
! 125910: "ORDER BY level DESC, idx ASC",
! 125911:
! 125912: /* 14 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?",
! 125913: /* 15 */ "SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?",
! 125914:
! 125915: /* 16 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?",
! 125916: /* 17 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?",
! 125917: /* 18 */ "INSERT INTO %Q.'%q_content' VALUES(%s)",
! 125918: /* 19 */ "DELETE FROM %Q.'%q_docsize' WHERE docid = ?",
! 125919: /* 20 */ "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)",
! 125920: /* 21 */ "SELECT size FROM %Q.'%q_docsize' WHERE docid=?",
! 125921: /* 22 */ "SELECT value FROM %Q.'%q_stat' WHERE id=?",
! 125922: /* 23 */ "REPLACE INTO %Q.'%q_stat' VALUES(?,?)",
! 125923: /* 24 */ "",
! 125924: /* 25 */ "",
! 125925:
! 125926: /* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?",
! 125927: /* 27 */ "SELECT DISTINCT level / (1024 * ?) FROM %Q.'%q_segdir'",
! 125928:
! 125929: /* This statement is used to determine which level to read the input from
! 125930: ** when performing an incremental merge. It returns the absolute level number
! 125931: ** of the oldest level in the db that contains at least ? segments. Or,
! 125932: ** if no level in the FTS index contains more than ? segments, the statement
! 125933: ** returns zero rows. */
! 125934: /* 28 */ "SELECT level FROM %Q.'%q_segdir' GROUP BY level HAVING count(*)>=?"
! 125935: " ORDER BY (level %% 1024) ASC LIMIT 1",
! 125936:
! 125937: /* Estimate the upper limit on the number of leaf nodes in a new segment
! 125938: ** created by merging the oldest :2 segments from absolute level :1. See
! 125939: ** function sqlite3Fts3Incrmerge() for details. */
! 125940: /* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) "
! 125941: " FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?",
! 125942:
! 125943: /* SQL_DELETE_SEGDIR_ENTRY
! 125944: ** Delete the %_segdir entry on absolute level :1 with index :2. */
! 125945: /* 30 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?",
! 125946:
! 125947: /* SQL_SHIFT_SEGDIR_ENTRY
! 125948: ** Modify the idx value for the segment with idx=:3 on absolute level :2
! 125949: ** to :1. */
! 125950: /* 31 */ "UPDATE %Q.'%q_segdir' SET idx = ? WHERE level=? AND idx=?",
! 125951:
! 125952: /* SQL_SELECT_SEGDIR
! 125953: ** Read a single entry from the %_segdir table. The entry from absolute
! 125954: ** level :1 with index value :2. */
! 125955: /* 32 */ "SELECT idx, start_block, leaves_end_block, end_block, root "
! 125956: "FROM %Q.'%q_segdir' WHERE level = ? AND idx = ?",
! 125957:
! 125958: /* SQL_CHOMP_SEGDIR
! 125959: ** Update the start_block (:1) and root (:2) fields of the %_segdir
! 125960: ** entry located on absolute level :3 with index :4. */
! 125961: /* 33 */ "UPDATE %Q.'%q_segdir' SET start_block = ?, root = ?"
! 125962: "WHERE level = ? AND idx = ?",
! 125963:
! 125964: /* SQL_SEGMENT_IS_APPENDABLE
! 125965: ** Return a single row if the segment with end_block=? is appendable. Or
! 125966: ** no rows otherwise. */
! 125967: /* 34 */ "SELECT 1 FROM %Q.'%q_segments' WHERE blockid=? AND block IS NULL",
! 125968:
! 125969: /* SQL_SELECT_INDEXES
! 125970: ** Return the list of valid segment indexes for absolute level ? */
! 125971: /* 35 */ "SELECT idx FROM %Q.'%q_segdir' WHERE level=? ORDER BY 1 ASC",
! 125972:
! 125973: /* SQL_SELECT_MXLEVEL
! 125974: ** Return the largest relative level in the FTS index or indexes. */
! 125975: /* 36 */ "SELECT max( level %% 1024 ) FROM %Q.'%q_segdir'"
! 125976: };
! 125977: int rc = SQLITE_OK;
! 125978: sqlite3_stmt *pStmt;
! 125979:
! 125980: assert( SizeofArray(azSql)==SizeofArray(p->aStmt) );
! 125981: assert( eStmt<SizeofArray(azSql) && eStmt>=0 );
! 125982:
! 125983: pStmt = p->aStmt[eStmt];
! 125984: if( !pStmt ){
! 125985: char *zSql;
! 125986: if( eStmt==SQL_CONTENT_INSERT ){
! 125987: zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist);
! 125988: }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){
! 125989: zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist);
! 125990: }else{
! 125991: zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName);
! 125992: }
! 125993: if( !zSql ){
! 125994: rc = SQLITE_NOMEM;
! 125995: }else{
! 125996: rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, NULL);
! 125997: sqlite3_free(zSql);
! 125998: assert( rc==SQLITE_OK || pStmt==0 );
! 125999: p->aStmt[eStmt] = pStmt;
! 126000: }
! 126001: }
! 126002: if( apVal ){
! 126003: int i;
! 126004: int nParam = sqlite3_bind_parameter_count(pStmt);
! 126005: for(i=0; rc==SQLITE_OK && i<nParam; i++){
! 126006: rc = sqlite3_bind_value(pStmt, i+1, apVal[i]);
! 126007: }
! 126008: }
! 126009: *pp = pStmt;
! 126010: return rc;
! 126011: }
! 126012:
! 126013:
! 126014: static int fts3SelectDocsize(
! 126015: Fts3Table *pTab, /* FTS3 table handle */
! 126016: sqlite3_int64 iDocid, /* Docid to bind for SQL_SELECT_DOCSIZE */
! 126017: sqlite3_stmt **ppStmt /* OUT: Statement handle */
! 126018: ){
! 126019: sqlite3_stmt *pStmt = 0; /* Statement requested from fts3SqlStmt() */
! 126020: int rc; /* Return code */
! 126021:
! 126022: rc = fts3SqlStmt(pTab, SQL_SELECT_DOCSIZE, &pStmt, 0);
! 126023: if( rc==SQLITE_OK ){
! 126024: sqlite3_bind_int64(pStmt, 1, iDocid);
! 126025: rc = sqlite3_step(pStmt);
! 126026: if( rc!=SQLITE_ROW || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB ){
! 126027: rc = sqlite3_reset(pStmt);
! 126028: if( rc==SQLITE_OK ) rc = FTS_CORRUPT_VTAB;
! 126029: pStmt = 0;
! 126030: }else{
! 126031: rc = SQLITE_OK;
! 126032: }
! 126033: }
! 126034:
! 126035: *ppStmt = pStmt;
! 126036: return rc;
! 126037: }
! 126038:
! 126039: SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(
! 126040: Fts3Table *pTab, /* Fts3 table handle */
! 126041: sqlite3_stmt **ppStmt /* OUT: Statement handle */
! 126042: ){
! 126043: sqlite3_stmt *pStmt = 0;
! 126044: int rc;
! 126045: rc = fts3SqlStmt(pTab, SQL_SELECT_STAT, &pStmt, 0);
! 126046: if( rc==SQLITE_OK ){
! 126047: sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL);
! 126048: if( sqlite3_step(pStmt)!=SQLITE_ROW
! 126049: || sqlite3_column_type(pStmt, 0)!=SQLITE_BLOB
! 126050: ){
! 126051: rc = sqlite3_reset(pStmt);
! 126052: if( rc==SQLITE_OK ) rc = FTS_CORRUPT_VTAB;
! 126053: pStmt = 0;
! 126054: }
! 126055: }
! 126056: *ppStmt = pStmt;
! 126057: return rc;
! 126058: }
! 126059:
! 126060: SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(
! 126061: Fts3Table *pTab, /* Fts3 table handle */
! 126062: sqlite3_int64 iDocid, /* Docid to read size data for */
! 126063: sqlite3_stmt **ppStmt /* OUT: Statement handle */
! 126064: ){
! 126065: return fts3SelectDocsize(pTab, iDocid, ppStmt);
! 126066: }
! 126067:
! 126068: /*
! 126069: ** Similar to fts3SqlStmt(). Except, after binding the parameters in
! 126070: ** array apVal[] to the SQL statement identified by eStmt, the statement
! 126071: ** is executed.
! 126072: **
! 126073: ** Returns SQLITE_OK if the statement is successfully executed, or an
! 126074: ** SQLite error code otherwise.
! 126075: */
! 126076: static void fts3SqlExec(
! 126077: int *pRC, /* Result code */
! 126078: Fts3Table *p, /* The FTS3 table */
! 126079: int eStmt, /* Index of statement to evaluate */
! 126080: sqlite3_value **apVal /* Parameters to bind */
! 126081: ){
! 126082: sqlite3_stmt *pStmt;
! 126083: int rc;
! 126084: if( *pRC ) return;
! 126085: rc = fts3SqlStmt(p, eStmt, &pStmt, apVal);
! 126086: if( rc==SQLITE_OK ){
! 126087: sqlite3_step(pStmt);
! 126088: rc = sqlite3_reset(pStmt);
! 126089: }
! 126090: *pRC = rc;
! 126091: }
! 126092:
! 126093:
! 126094: /*
! 126095: ** This function ensures that the caller has obtained a shared-cache
! 126096: ** table-lock on the %_content table. This is required before reading
! 126097: ** data from the fts3 table. If this lock is not acquired first, then
! 126098: ** the caller may end up holding read-locks on the %_segments and %_segdir
! 126099: ** tables, but no read-lock on the %_content table. If this happens
! 126100: ** a second connection will be able to write to the fts3 table, but
! 126101: ** attempting to commit those writes might return SQLITE_LOCKED or
! 126102: ** SQLITE_LOCKED_SHAREDCACHE (because the commit attempts to obtain
! 126103: ** write-locks on the %_segments and %_segdir ** tables).
! 126104: **
! 126105: ** We try to avoid this because if FTS3 returns any error when committing
! 126106: ** a transaction, the whole transaction will be rolled back. And this is
! 126107: ** not what users expect when they get SQLITE_LOCKED_SHAREDCACHE. It can
! 126108: ** still happen if the user reads data directly from the %_segments or
! 126109: ** %_segdir tables instead of going through FTS3 though.
! 126110: **
! 126111: ** This reasoning does not apply to a content=xxx table.
! 126112: */
! 126113: SQLITE_PRIVATE int sqlite3Fts3ReadLock(Fts3Table *p){
! 126114: int rc; /* Return code */
! 126115: sqlite3_stmt *pStmt; /* Statement used to obtain lock */
! 126116:
! 126117: if( p->zContentTbl==0 ){
! 126118: rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pStmt, 0);
! 126119: if( rc==SQLITE_OK ){
! 126120: sqlite3_bind_null(pStmt, 1);
! 126121: sqlite3_step(pStmt);
! 126122: rc = sqlite3_reset(pStmt);
! 126123: }
! 126124: }else{
! 126125: rc = SQLITE_OK;
! 126126: }
! 126127:
! 126128: return rc;
! 126129: }
! 126130:
! 126131: /*
! 126132: ** FTS maintains a separate indexes for each language-id (a 32-bit integer).
! 126133: ** Within each language id, a separate index is maintained to store the
! 126134: ** document terms, and each configured prefix size (configured the FTS
! 126135: ** "prefix=" option). And each index consists of multiple levels ("relative
! 126136: ** levels").
! 126137: **
! 126138: ** All three of these values (the language id, the specific index and the
! 126139: ** level within the index) are encoded in 64-bit integer values stored
! 126140: ** in the %_segdir table on disk. This function is used to convert three
! 126141: ** separate component values into the single 64-bit integer value that
! 126142: ** can be used to query the %_segdir table.
! 126143: **
! 126144: ** Specifically, each language-id/index combination is allocated 1024
! 126145: ** 64-bit integer level values ("absolute levels"). The main terms index
! 126146: ** for language-id 0 is allocate values 0-1023. The first prefix index
! 126147: ** (if any) for language-id 0 is allocated values 1024-2047. And so on.
! 126148: ** Language 1 indexes are allocated immediately following language 0.
! 126149: **
! 126150: ** So, for a system with nPrefix prefix indexes configured, the block of
! 126151: ** absolute levels that corresponds to language-id iLangid and index
! 126152: ** iIndex starts at absolute level ((iLangid * (nPrefix+1) + iIndex) * 1024).
! 126153: */
! 126154: static sqlite3_int64 getAbsoluteLevel(
! 126155: Fts3Table *p, /* FTS3 table handle */
! 126156: int iLangid, /* Language id */
! 126157: int iIndex, /* Index in p->aIndex[] */
! 126158: int iLevel /* Level of segments */
! 126159: ){
! 126160: sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */
! 126161: assert( iLangid>=0 );
! 126162: assert( p->nIndex>0 );
! 126163: assert( iIndex>=0 && iIndex<p->nIndex );
! 126164:
! 126165: iBase = ((sqlite3_int64)iLangid * p->nIndex + iIndex) * FTS3_SEGDIR_MAXLEVEL;
! 126166: return iBase + iLevel;
! 126167: }
! 126168:
! 126169: /*
! 126170: ** Set *ppStmt to a statement handle that may be used to iterate through
! 126171: ** all rows in the %_segdir table, from oldest to newest. If successful,
! 126172: ** return SQLITE_OK. If an error occurs while preparing the statement,
! 126173: ** return an SQLite error code.
! 126174: **
! 126175: ** There is only ever one instance of this SQL statement compiled for
! 126176: ** each FTS3 table.
! 126177: **
! 126178: ** The statement returns the following columns from the %_segdir table:
! 126179: **
! 126180: ** 0: idx
! 126181: ** 1: start_block
! 126182: ** 2: leaves_end_block
! 126183: ** 3: end_block
! 126184: ** 4: root
! 126185: */
! 126186: SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(
! 126187: Fts3Table *p, /* FTS3 table */
! 126188: int iLangid, /* Language being queried */
! 126189: int iIndex, /* Index for p->aIndex[] */
! 126190: int iLevel, /* Level to select (relative level) */
! 126191: sqlite3_stmt **ppStmt /* OUT: Compiled statement */
! 126192: ){
! 126193: int rc;
! 126194: sqlite3_stmt *pStmt = 0;
! 126195:
! 126196: assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 );
! 126197: assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
! 126198: assert( iIndex>=0 && iIndex<p->nIndex );
! 126199:
! 126200: if( iLevel<0 ){
! 126201: /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */
! 126202: rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0);
! 126203: if( rc==SQLITE_OK ){
! 126204: sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0));
! 126205: sqlite3_bind_int64(pStmt, 2,
! 126206: getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1)
! 126207: );
! 126208: }
! 126209: }else{
! 126210: /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */
! 126211: rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0);
! 126212: if( rc==SQLITE_OK ){
! 126213: sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex,iLevel));
! 126214: }
! 126215: }
! 126216: *ppStmt = pStmt;
! 126217: return rc;
! 126218: }
! 126219:
1.2 misho 126220:
126221: /*
1.2.2.1 ! misho 126222: ** Append a single varint to a PendingList buffer. SQLITE_OK is returned
! 126223: ** if successful, or an SQLite error code otherwise.
1.2 misho 126224: **
1.2.2.1 ! misho 126225: ** This function also serves to allocate the PendingList structure itself.
! 126226: ** For example, to create a new PendingList structure containing two
! 126227: ** varints:
! 126228: **
! 126229: ** PendingList *p = 0;
! 126230: ** fts3PendingListAppendVarint(&p, 1);
! 126231: ** fts3PendingListAppendVarint(&p, 2);
1.2 misho 126232: */
1.2.2.1 ! misho 126233: static int fts3PendingListAppendVarint(
! 126234: PendingList **pp, /* IN/OUT: Pointer to PendingList struct */
! 126235: sqlite3_int64 i /* Value to append to data */
! 126236: ){
! 126237: PendingList *p = *pp;
! 126238:
! 126239: /* Allocate or grow the PendingList as required. */
! 126240: if( !p ){
! 126241: p = sqlite3_malloc(sizeof(*p) + 100);
! 126242: if( !p ){
! 126243: return SQLITE_NOMEM;
! 126244: }
! 126245: p->nSpace = 100;
! 126246: p->aData = (char *)&p[1];
! 126247: p->nData = 0;
! 126248: }
! 126249: else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){
! 126250: int nNew = p->nSpace * 2;
! 126251: p = sqlite3_realloc(p, sizeof(*p) + nNew);
! 126252: if( !p ){
! 126253: sqlite3_free(*pp);
! 126254: *pp = 0;
! 126255: return SQLITE_NOMEM;
! 126256: }
! 126257: p->nSpace = nNew;
! 126258: p->aData = (char *)&p[1];
! 126259: }
! 126260:
! 126261: /* Append the new serialized varint to the end of the list. */
! 126262: p->nData += sqlite3Fts3PutVarint(&p->aData[p->nData], i);
! 126263: p->aData[p->nData] = '\0';
! 126264: *pp = p;
! 126265: return SQLITE_OK;
! 126266: }
1.2 misho 126267:
126268: /*
1.2.2.1 ! misho 126269: ** Add a docid/column/position entry to a PendingList structure. Non-zero
! 126270: ** is returned if the structure is sqlite3_realloced as part of adding
! 126271: ** the entry. Otherwise, zero.
1.2 misho 126272: **
1.2.2.1 ! misho 126273: ** If an OOM error occurs, *pRc is set to SQLITE_NOMEM before returning.
! 126274: ** Zero is always returned in this case. Otherwise, if no OOM error occurs,
! 126275: ** it is set to SQLITE_OK.
1.2 misho 126276: */
1.2.2.1 ! misho 126277: static int fts3PendingListAppend(
! 126278: PendingList **pp, /* IN/OUT: PendingList structure */
! 126279: sqlite3_int64 iDocid, /* Docid for entry to add */
! 126280: sqlite3_int64 iCol, /* Column for entry to add */
! 126281: sqlite3_int64 iPos, /* Position of term for entry to add */
! 126282: int *pRc /* OUT: Return code */
! 126283: ){
! 126284: PendingList *p = *pp;
! 126285: int rc = SQLITE_OK;
! 126286:
! 126287: assert( !p || p->iLastDocid<=iDocid );
! 126288:
! 126289: if( !p || p->iLastDocid!=iDocid ){
! 126290: sqlite3_int64 iDelta = iDocid - (p ? p->iLastDocid : 0);
! 126291: if( p ){
! 126292: assert( p->nData<p->nSpace );
! 126293: assert( p->aData[p->nData]==0 );
! 126294: p->nData++;
! 126295: }
! 126296: if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iDelta)) ){
! 126297: goto pendinglistappend_out;
! 126298: }
! 126299: p->iLastCol = -1;
! 126300: p->iLastPos = 0;
! 126301: p->iLastDocid = iDocid;
! 126302: }
! 126303: if( iCol>0 && p->iLastCol!=iCol ){
! 126304: if( SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, 1))
! 126305: || SQLITE_OK!=(rc = fts3PendingListAppendVarint(&p, iCol))
! 126306: ){
! 126307: goto pendinglistappend_out;
! 126308: }
! 126309: p->iLastCol = iCol;
! 126310: p->iLastPos = 0;
! 126311: }
! 126312: if( iCol>=0 ){
! 126313: assert( iPos>p->iLastPos || (iPos==0 && p->iLastPos==0) );
! 126314: rc = fts3PendingListAppendVarint(&p, 2+iPos-p->iLastPos);
! 126315: if( rc==SQLITE_OK ){
! 126316: p->iLastPos = iPos;
! 126317: }
! 126318: }
! 126319:
! 126320: pendinglistappend_out:
! 126321: *pRc = rc;
! 126322: if( p!=*pp ){
! 126323: *pp = p;
! 126324: return 1;
! 126325: }
! 126326: return 0;
! 126327: }
1.2 misho 126328:
126329: /*
1.2.2.1 ! misho 126330: ** Free a PendingList object allocated by fts3PendingListAppend().
1.2 misho 126331: */
1.2.2.1 ! misho 126332: static void fts3PendingListDelete(PendingList *pList){
! 126333: sqlite3_free(pList);
! 126334: }
1.2 misho 126335:
1.2.2.1 ! misho 126336: /*
! 126337: ** Add an entry to one of the pending-terms hash tables.
! 126338: */
! 126339: static int fts3PendingTermsAddOne(
! 126340: Fts3Table *p,
! 126341: int iCol,
! 126342: int iPos,
! 126343: Fts3Hash *pHash, /* Pending terms hash table to add entry to */
! 126344: const char *zToken,
! 126345: int nToken
! 126346: ){
! 126347: PendingList *pList;
! 126348: int rc = SQLITE_OK;
1.2 misho 126349:
1.2.2.1 ! misho 126350: pList = (PendingList *)fts3HashFind(pHash, zToken, nToken);
! 126351: if( pList ){
! 126352: p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem));
! 126353: }
! 126354: if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){
! 126355: if( pList==fts3HashInsert(pHash, zToken, nToken, pList) ){
! 126356: /* Malloc failed while inserting the new entry. This can only
! 126357: ** happen if there was no previous entry for this token.
! 126358: */
! 126359: assert( 0==fts3HashFind(pHash, zToken, nToken) );
! 126360: sqlite3_free(pList);
! 126361: rc = SQLITE_NOMEM;
! 126362: }
! 126363: }
! 126364: if( rc==SQLITE_OK ){
! 126365: p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem));
! 126366: }
! 126367: return rc;
! 126368: }
1.2 misho 126369:
126370: /*
1.2.2.1 ! misho 126371: ** Tokenize the nul-terminated string zText and add all tokens to the
! 126372: ** pending-terms hash-table. The docid used is that currently stored in
! 126373: ** p->iPrevDocid, and the column is specified by argument iCol.
1.2 misho 126374: **
1.2.2.1 ! misho 126375: ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code.
1.2 misho 126376: */
1.2.2.1 ! misho 126377: static int fts3PendingTermsAdd(
! 126378: Fts3Table *p, /* Table into which text will be inserted */
! 126379: int iLangid, /* Language id to use */
! 126380: const char *zText, /* Text of document to be inserted */
! 126381: int iCol, /* Column into which text is being inserted */
! 126382: u32 *pnWord /* IN/OUT: Incr. by number tokens inserted */
1.2 misho 126383: ){
1.2.2.1 ! misho 126384: int rc;
! 126385: int iStart = 0;
! 126386: int iEnd = 0;
! 126387: int iPos = 0;
! 126388: int nWord = 0;
1.2 misho 126389:
1.2.2.1 ! misho 126390: char const *zToken;
! 126391: int nToken = 0;
1.2 misho 126392:
1.2.2.1 ! misho 126393: sqlite3_tokenizer *pTokenizer = p->pTokenizer;
! 126394: sqlite3_tokenizer_module const *pModule = pTokenizer->pModule;
! 126395: sqlite3_tokenizer_cursor *pCsr;
! 126396: int (*xNext)(sqlite3_tokenizer_cursor *pCursor,
! 126397: const char**,int*,int*,int*,int*);
1.2 misho 126398:
1.2.2.1 ! misho 126399: assert( pTokenizer && pModule );
1.2 misho 126400:
1.2.2.1 ! misho 126401: /* If the user has inserted a NULL value, this function may be called with
! 126402: ** zText==0. In this case, add zero token entries to the hash table and
! 126403: ** return early. */
! 126404: if( zText==0 ){
! 126405: *pnWord = 0;
! 126406: return SQLITE_OK;
! 126407: }
1.2 misho 126408:
1.2.2.1 ! misho 126409: rc = sqlite3Fts3OpenTokenizer(pTokenizer, iLangid, zText, -1, &pCsr);
! 126410: if( rc!=SQLITE_OK ){
! 126411: return rc;
! 126412: }
1.2 misho 126413:
1.2.2.1 ! misho 126414: xNext = pModule->xNext;
! 126415: while( SQLITE_OK==rc
! 126416: && SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos))
! 126417: ){
! 126418: int i;
! 126419: if( iPos>=nWord ) nWord = iPos+1;
! 126420:
! 126421: /* Positions cannot be negative; we use -1 as a terminator internally.
! 126422: ** Tokens must have a non-zero length.
! 126423: */
! 126424: if( iPos<0 || !zToken || nToken<=0 ){
! 126425: rc = SQLITE_ERROR;
! 126426: break;
1.2 misho 126427: }
1.2.2.1 ! misho 126428:
! 126429: /* Add the term to the terms index */
! 126430: rc = fts3PendingTermsAddOne(
! 126431: p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken
! 126432: );
! 126433:
! 126434: /* Add the term to each of the prefix indexes that it is not too
! 126435: ** short for. */
! 126436: for(i=1; rc==SQLITE_OK && i<p->nIndex; i++){
! 126437: struct Fts3Index *pIndex = &p->aIndex[i];
! 126438: if( nToken<pIndex->nPrefix ) continue;
! 126439: rc = fts3PendingTermsAddOne(
! 126440: p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix
! 126441: );
1.2 misho 126442: }
126443: }
1.2.2.1 ! misho 126444:
! 126445: pModule->xClose(pCsr);
! 126446: *pnWord += nWord;
! 126447: return (rc==SQLITE_DONE ? SQLITE_OK : rc);
! 126448: }
! 126449:
! 126450: /*
! 126451: ** Calling this function indicates that subsequent calls to
! 126452: ** fts3PendingTermsAdd() are to add term/position-list pairs for the
! 126453: ** contents of the document with docid iDocid.
! 126454: */
! 126455: static int fts3PendingTermsDocid(
! 126456: Fts3Table *p, /* Full-text table handle */
! 126457: int iLangid, /* Language id of row being written */
! 126458: sqlite_int64 iDocid /* Docid of row being written */
! 126459: ){
! 126460: assert( iLangid>=0 );
! 126461:
! 126462: /* TODO(shess) Explore whether partially flushing the buffer on
! 126463: ** forced-flush would provide better performance. I suspect that if
! 126464: ** we ordered the doclists by size and flushed the largest until the
! 126465: ** buffer was half empty, that would let the less frequent terms
! 126466: ** generate longer doclists.
! 126467: */
! 126468: if( iDocid<=p->iPrevDocid
! 126469: || p->iPrevLangid!=iLangid
! 126470: || p->nPendingData>p->nMaxPendingData
! 126471: ){
! 126472: int rc = sqlite3Fts3PendingTermsFlush(p);
! 126473: if( rc!=SQLITE_OK ) return rc;
! 126474: }
! 126475: p->iPrevDocid = iDocid;
! 126476: p->iPrevLangid = iLangid;
! 126477: return SQLITE_OK;
! 126478: }
! 126479:
! 126480: /*
! 126481: ** Discard the contents of the pending-terms hash tables.
! 126482: */
! 126483: SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){
! 126484: int i;
! 126485: for(i=0; i<p->nIndex; i++){
! 126486: Fts3HashElem *pElem;
! 126487: Fts3Hash *pHash = &p->aIndex[i].hPending;
! 126488: for(pElem=fts3HashFirst(pHash); pElem; pElem=fts3HashNext(pElem)){
! 126489: PendingList *pList = (PendingList *)fts3HashData(pElem);
! 126490: fts3PendingListDelete(pList);
1.2 misho 126491: }
1.2.2.1 ! misho 126492: fts3HashClear(pHash);
1.2 misho 126493: }
1.2.2.1 ! misho 126494: p->nPendingData = 0;
1.2 misho 126495: }
126496:
1.2.2.1 ! misho 126497: /*
! 126498: ** This function is called by the xUpdate() method as part of an INSERT
! 126499: ** operation. It adds entries for each term in the new record to the
! 126500: ** pendingTerms hash table.
! 126501: **
! 126502: ** Argument apVal is the same as the similarly named argument passed to
! 126503: ** fts3InsertData(). Parameter iDocid is the docid of the new row.
! 126504: */
! 126505: static int fts3InsertTerms(
! 126506: Fts3Table *p,
! 126507: int iLangid,
! 126508: sqlite3_value **apVal,
! 126509: u32 *aSz
1.2 misho 126510: ){
1.2.2.1 ! misho 126511: int i; /* Iterator variable */
! 126512: for(i=2; i<p->nColumn+2; i++){
! 126513: const char *zText = (const char *)sqlite3_value_text(apVal[i]);
! 126514: int rc = fts3PendingTermsAdd(p, iLangid, zText, i-2, &aSz[i-2]);
! 126515: if( rc!=SQLITE_OK ){
! 126516: return rc;
! 126517: }
! 126518: aSz[p->nColumn] += sqlite3_value_bytes(apVal[i]);
! 126519: }
! 126520: return SQLITE_OK;
! 126521: }
1.2 misho 126522:
1.2.2.1 ! misho 126523: /*
! 126524: ** This function is called by the xUpdate() method for an INSERT operation.
! 126525: ** The apVal parameter is passed a copy of the apVal argument passed by
! 126526: ** SQLite to the xUpdate() method. i.e:
! 126527: **
! 126528: ** apVal[0] Not used for INSERT.
! 126529: ** apVal[1] rowid
! 126530: ** apVal[2] Left-most user-defined column
! 126531: ** ...
! 126532: ** apVal[p->nColumn+1] Right-most user-defined column
! 126533: ** apVal[p->nColumn+2] Hidden column with same name as table
! 126534: ** apVal[p->nColumn+3] Hidden "docid" column (alias for rowid)
! 126535: ** apVal[p->nColumn+4] Hidden languageid column
! 126536: */
! 126537: static int fts3InsertData(
! 126538: Fts3Table *p, /* Full-text table */
! 126539: sqlite3_value **apVal, /* Array of values to insert */
! 126540: sqlite3_int64 *piDocid /* OUT: Docid for row just inserted */
! 126541: ){
! 126542: int rc; /* Return code */
! 126543: sqlite3_stmt *pContentInsert; /* INSERT INTO %_content VALUES(...) */
1.2 misho 126544:
1.2.2.1 ! misho 126545: if( p->zContentTbl ){
! 126546: sqlite3_value *pRowid = apVal[p->nColumn+3];
! 126547: if( sqlite3_value_type(pRowid)==SQLITE_NULL ){
! 126548: pRowid = apVal[1];
1.2 misho 126549: }
1.2.2.1 ! misho 126550: if( sqlite3_value_type(pRowid)!=SQLITE_INTEGER ){
! 126551: return SQLITE_CONSTRAINT;
1.2 misho 126552: }
1.2.2.1 ! misho 126553: *piDocid = sqlite3_value_int64(pRowid);
! 126554: return SQLITE_OK;
1.2 misho 126555: }
126556:
1.2.2.1 ! misho 126557: /* Locate the statement handle used to insert data into the %_content
! 126558: ** table. The SQL for this statement is:
! 126559: **
! 126560: ** INSERT INTO %_content VALUES(?, ?, ?, ...)
! 126561: **
! 126562: ** The statement features N '?' variables, where N is the number of user
! 126563: ** defined columns in the FTS3 table, plus one for the docid field.
! 126564: */
! 126565: rc = fts3SqlStmt(p, SQL_CONTENT_INSERT, &pContentInsert, &apVal[1]);
! 126566: if( rc==SQLITE_OK && p->zLanguageid ){
! 126567: rc = sqlite3_bind_int(
! 126568: pContentInsert, p->nColumn+2,
! 126569: sqlite3_value_int(apVal[p->nColumn+4])
! 126570: );
! 126571: }
! 126572: if( rc!=SQLITE_OK ) return rc;
! 126573:
! 126574: /* There is a quirk here. The users INSERT statement may have specified
! 126575: ** a value for the "rowid" field, for the "docid" field, or for both.
! 126576: ** Which is a problem, since "rowid" and "docid" are aliases for the
! 126577: ** same value. For example:
! 126578: **
! 126579: ** INSERT INTO fts3tbl(rowid, docid) VALUES(1, 2);
! 126580: **
! 126581: ** In FTS3, this is an error. It is an error to specify non-NULL values
! 126582: ** for both docid and some other rowid alias.
! 126583: */
! 126584: if( SQLITE_NULL!=sqlite3_value_type(apVal[3+p->nColumn]) ){
! 126585: if( SQLITE_NULL==sqlite3_value_type(apVal[0])
! 126586: && SQLITE_NULL!=sqlite3_value_type(apVal[1])
! 126587: ){
! 126588: /* A rowid/docid conflict. */
! 126589: return SQLITE_ERROR;
! 126590: }
! 126591: rc = sqlite3_bind_value(pContentInsert, 1, apVal[3+p->nColumn]);
! 126592: if( rc!=SQLITE_OK ) return rc;
! 126593: }
! 126594:
! 126595: /* Execute the statement to insert the record. Set *piDocid to the
! 126596: ** new docid value.
! 126597: */
! 126598: sqlite3_step(pContentInsert);
! 126599: rc = sqlite3_reset(pContentInsert);
! 126600:
! 126601: *piDocid = sqlite3_last_insert_rowid(p->db);
1.2 misho 126602: return rc;
126603: }
126604:
126605:
1.2.2.1 ! misho 126606:
! 126607: /*
! 126608: ** Remove all data from the FTS3 table. Clear the hash table containing
! 126609: ** pending terms.
! 126610: */
! 126611: static int fts3DeleteAll(Fts3Table *p, int bContent){
! 126612: int rc = SQLITE_OK; /* Return code */
! 126613:
! 126614: /* Discard the contents of the pending-terms hash table. */
! 126615: sqlite3Fts3PendingTermsClear(p);
! 126616:
! 126617: /* Delete everything from the shadow tables. Except, leave %_content as
! 126618: ** is if bContent is false. */
! 126619: assert( p->zContentTbl==0 || bContent==0 );
! 126620: if( bContent ) fts3SqlExec(&rc, p, SQL_DELETE_ALL_CONTENT, 0);
! 126621: fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGMENTS, 0);
! 126622: fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGDIR, 0);
! 126623: if( p->bHasDocsize ){
! 126624: fts3SqlExec(&rc, p, SQL_DELETE_ALL_DOCSIZE, 0);
! 126625: }
! 126626: if( p->bHasStat ){
! 126627: fts3SqlExec(&rc, p, SQL_DELETE_ALL_STAT, 0);
! 126628: }
! 126629: return rc;
1.2 misho 126630: }
126631:
126632: /*
126633: **
126634: */
1.2.2.1 ! misho 126635: static int langidFromSelect(Fts3Table *p, sqlite3_stmt *pSelect){
! 126636: int iLangid = 0;
! 126637: if( p->zLanguageid ) iLangid = sqlite3_column_int(pSelect, p->nColumn+1);
! 126638: return iLangid;
! 126639: }
! 126640:
! 126641: /*
! 126642: ** The first element in the apVal[] array is assumed to contain the docid
! 126643: ** (an integer) of a row about to be deleted. Remove all terms from the
! 126644: ** full-text index.
! 126645: */
! 126646: static void fts3DeleteTerms(
! 126647: int *pRC, /* Result code */
! 126648: Fts3Table *p, /* The FTS table to delete from */
! 126649: sqlite3_value *pRowid, /* The docid to be deleted */
! 126650: u32 *aSz, /* Sizes of deleted document written here */
! 126651: int *pbFound /* OUT: Set to true if row really does exist */
1.2 misho 126652: ){
126653: int rc;
1.2.2.1 ! misho 126654: sqlite3_stmt *pSelect;
! 126655:
! 126656: assert( *pbFound==0 );
1.2 misho 126657: if( *pRC ) return;
1.2.2.1 ! misho 126658: rc = fts3SqlStmt(p, SQL_SELECT_CONTENT_BY_ROWID, &pSelect, &pRowid);
1.2 misho 126659: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 126660: if( SQLITE_ROW==sqlite3_step(pSelect) ){
! 126661: int i;
! 126662: int iLangid = langidFromSelect(p, pSelect);
! 126663: rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pSelect, 0));
! 126664: for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){
! 126665: const char *zText = (const char *)sqlite3_column_text(pSelect, i);
! 126666: rc = fts3PendingTermsAdd(p, iLangid, zText, -1, &aSz[i-1]);
! 126667: aSz[p->nColumn] += sqlite3_column_bytes(pSelect, i);
! 126668: }
! 126669: if( rc!=SQLITE_OK ){
! 126670: sqlite3_reset(pSelect);
! 126671: *pRC = rc;
! 126672: return;
! 126673: }
! 126674: *pbFound = 1;
! 126675: }
! 126676: rc = sqlite3_reset(pSelect);
! 126677: }else{
! 126678: sqlite3_reset(pSelect);
1.2 misho 126679: }
126680: *pRC = rc;
126681: }
126682:
126683: /*
1.2.2.1 ! misho 126684: ** Forward declaration to account for the circular dependency between
! 126685: ** functions fts3SegmentMerge() and fts3AllocateSegdirIdx().
! 126686: */
! 126687: static int fts3SegmentMerge(Fts3Table *, int, int, int);
! 126688:
! 126689: /*
! 126690: ** This function allocates a new level iLevel index in the segdir table.
! 126691: ** Usually, indexes are allocated within a level sequentially starting
! 126692: ** with 0, so the allocated index is one greater than the value returned
! 126693: ** by:
1.2 misho 126694: **
1.2.2.1 ! misho 126695: ** SELECT max(idx) FROM %_segdir WHERE level = :iLevel
1.2 misho 126696: **
1.2.2.1 ! misho 126697: ** However, if there are already FTS3_MERGE_COUNT indexes at the requested
! 126698: ** level, they are merged into a single level (iLevel+1) segment and the
! 126699: ** allocated index is 0.
! 126700: **
! 126701: ** If successful, *piIdx is set to the allocated index slot and SQLITE_OK
! 126702: ** returned. Otherwise, an SQLite error code is returned.
1.2 misho 126703: */
1.2.2.1 ! misho 126704: static int fts3AllocateSegdirIdx(
! 126705: Fts3Table *p,
! 126706: int iLangid, /* Language id */
! 126707: int iIndex, /* Index for p->aIndex */
! 126708: int iLevel,
! 126709: int *piIdx
! 126710: ){
! 126711: int rc; /* Return Code */
! 126712: sqlite3_stmt *pNextIdx; /* Query for next idx at level iLevel */
! 126713: int iNext = 0; /* Result of query pNextIdx */
1.2 misho 126714:
1.2.2.1 ! misho 126715: assert( iLangid>=0 );
! 126716: assert( p->nIndex>=1 );
! 126717:
! 126718: /* Set variable iNext to the next available segdir index at level iLevel. */
! 126719: rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pNextIdx, 0);
! 126720: if( rc==SQLITE_OK ){
! 126721: sqlite3_bind_int64(
! 126722: pNextIdx, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel)
! 126723: );
! 126724: if( SQLITE_ROW==sqlite3_step(pNextIdx) ){
! 126725: iNext = sqlite3_column_int(pNextIdx, 0);
! 126726: }
! 126727: rc = sqlite3_reset(pNextIdx);
! 126728: }
! 126729:
! 126730: if( rc==SQLITE_OK ){
! 126731: /* If iNext is FTS3_MERGE_COUNT, indicating that level iLevel is already
! 126732: ** full, merge all segments in level iLevel into a single iLevel+1
! 126733: ** segment and allocate (newly freed) index 0 at level iLevel. Otherwise,
! 126734: ** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext.
! 126735: */
! 126736: if( iNext>=FTS3_MERGE_COUNT ){
! 126737: fts3LogMerge(16, getAbsoluteLevel(p, iLangid, iIndex, iLevel));
! 126738: rc = fts3SegmentMerge(p, iLangid, iIndex, iLevel);
! 126739: *piIdx = 0;
! 126740: }else{
! 126741: *piIdx = iNext;
1.2 misho 126742: }
126743: }
126744:
126745: return rc;
126746: }
126747:
126748: /*
1.2.2.1 ! misho 126749: ** The %_segments table is declared as follows:
1.2 misho 126750: **
1.2.2.1 ! misho 126751: ** CREATE TABLE %_segments(blockid INTEGER PRIMARY KEY, block BLOB)
1.2 misho 126752: **
1.2.2.1 ! misho 126753: ** This function reads data from a single row of the %_segments table. The
! 126754: ** specific row is identified by the iBlockid parameter. If paBlob is not
! 126755: ** NULL, then a buffer is allocated using sqlite3_malloc() and populated
! 126756: ** with the contents of the blob stored in the "block" column of the
! 126757: ** identified table row is. Whether or not paBlob is NULL, *pnBlob is set
! 126758: ** to the size of the blob in bytes before returning.
1.2 misho 126759: **
1.2.2.1 ! misho 126760: ** If an error occurs, or the table does not contain the specified row,
! 126761: ** an SQLite error code is returned. Otherwise, SQLITE_OK is returned. If
! 126762: ** paBlob is non-NULL, then it is the responsibility of the caller to
! 126763: ** eventually free the returned buffer.
! 126764: **
! 126765: ** This function may leave an open sqlite3_blob* handle in the
! 126766: ** Fts3Table.pSegments variable. This handle is reused by subsequent calls
! 126767: ** to this function. The handle may be closed by calling the
! 126768: ** sqlite3Fts3SegmentsClose() function. Reusing a blob handle is a handy
! 126769: ** performance improvement, but the blob handle should always be closed
! 126770: ** before control is returned to the user (to prevent a lock being held
! 126771: ** on the database file for longer than necessary). Thus, any virtual table
! 126772: ** method (xFilter etc.) that may directly or indirectly call this function
! 126773: ** must call sqlite3Fts3SegmentsClose() before returning.
1.2 misho 126774: */
1.2.2.1 ! misho 126775: SQLITE_PRIVATE int sqlite3Fts3ReadBlock(
! 126776: Fts3Table *p, /* FTS3 table handle */
! 126777: sqlite3_int64 iBlockid, /* Access the row with blockid=$iBlockid */
! 126778: char **paBlob, /* OUT: Blob data in malloc'd buffer */
! 126779: int *pnBlob, /* OUT: Size of blob data */
! 126780: int *pnLoad /* OUT: Bytes actually loaded */
1.2 misho 126781: ){
1.2.2.1 ! misho 126782: int rc; /* Return code */
1.2 misho 126783:
1.2.2.1 ! misho 126784: /* pnBlob must be non-NULL. paBlob may be NULL or non-NULL. */
! 126785: assert( pnBlob );
1.2 misho 126786:
1.2.2.1 ! misho 126787: if( p->pSegments ){
! 126788: rc = sqlite3_blob_reopen(p->pSegments, iBlockid);
1.2 misho 126789: }else{
1.2.2.1 ! misho 126790: if( 0==p->zSegmentsTbl ){
! 126791: p->zSegmentsTbl = sqlite3_mprintf("%s_segments", p->zName);
! 126792: if( 0==p->zSegmentsTbl ) return SQLITE_NOMEM;
! 126793: }
! 126794: rc = sqlite3_blob_open(
! 126795: p->db, p->zDb, p->zSegmentsTbl, "block", iBlockid, 0, &p->pSegments
! 126796: );
! 126797: }
! 126798:
! 126799: if( rc==SQLITE_OK ){
! 126800: int nByte = sqlite3_blob_bytes(p->pSegments);
! 126801: *pnBlob = nByte;
! 126802: if( paBlob ){
! 126803: char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING);
! 126804: if( !aByte ){
! 126805: rc = SQLITE_NOMEM;
! 126806: }else{
! 126807: if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){
! 126808: nByte = FTS3_NODE_CHUNKSIZE;
! 126809: *pnLoad = nByte;
! 126810: }
! 126811: rc = sqlite3_blob_read(p->pSegments, aByte, nByte, 0);
! 126812: memset(&aByte[nByte], 0, FTS3_NODE_PADDING);
! 126813: if( rc!=SQLITE_OK ){
! 126814: sqlite3_free(aByte);
! 126815: aByte = 0;
! 126816: }
! 126817: }
! 126818: *paBlob = aByte;
! 126819: }
! 126820: }
! 126821:
! 126822: return rc;
! 126823: }
! 126824:
! 126825: /*
! 126826: ** Close the blob handle at p->pSegments, if it is open. See comments above
! 126827: ** the sqlite3Fts3ReadBlock() function for details.
! 126828: */
! 126829: SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){
! 126830: sqlite3_blob_close(p->pSegments);
! 126831: p->pSegments = 0;
! 126832: }
! 126833:
! 126834: static int fts3SegReaderIncrRead(Fts3SegReader *pReader){
! 126835: int nRead; /* Number of bytes to read */
! 126836: int rc; /* Return code */
! 126837:
! 126838: nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE);
! 126839: rc = sqlite3_blob_read(
! 126840: pReader->pBlob,
! 126841: &pReader->aNode[pReader->nPopulate],
! 126842: nRead,
! 126843: pReader->nPopulate
! 126844: );
! 126845:
! 126846: if( rc==SQLITE_OK ){
! 126847: pReader->nPopulate += nRead;
! 126848: memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING);
! 126849: if( pReader->nPopulate==pReader->nNode ){
! 126850: sqlite3_blob_close(pReader->pBlob);
! 126851: pReader->pBlob = 0;
! 126852: pReader->nPopulate = 0;
1.2 misho 126853: }
126854: }
126855: return rc;
126856: }
126857:
1.2.2.1 ! misho 126858: static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){
! 126859: int rc = SQLITE_OK;
! 126860: assert( !pReader->pBlob
! 126861: || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode])
! 126862: );
! 126863: while( pReader->pBlob && rc==SQLITE_OK
! 126864: && (pFrom - pReader->aNode + nByte)>pReader->nPopulate
! 126865: ){
! 126866: rc = fts3SegReaderIncrRead(pReader);
! 126867: }
! 126868: return rc;
! 126869: }
1.2 misho 126870:
126871: /*
1.2.2.1 ! misho 126872: ** Set an Fts3SegReader cursor to point at EOF.
1.2 misho 126873: */
1.2.2.1 ! misho 126874: static void fts3SegReaderSetEof(Fts3SegReader *pSeg){
! 126875: if( !fts3SegReaderIsRootOnly(pSeg) ){
! 126876: sqlite3_free(pSeg->aNode);
! 126877: sqlite3_blob_close(pSeg->pBlob);
! 126878: pSeg->pBlob = 0;
! 126879: }
! 126880: pSeg->aNode = 0;
! 126881: }
! 126882:
! 126883: /*
! 126884: ** Move the iterator passed as the first argument to the next term in the
! 126885: ** segment. If successful, SQLITE_OK is returned. If there is no next term,
! 126886: ** SQLITE_DONE. Otherwise, an SQLite error code.
! 126887: */
! 126888: static int fts3SegReaderNext(
! 126889: Fts3Table *p,
! 126890: Fts3SegReader *pReader,
! 126891: int bIncr
1.2 misho 126892: ){
1.2.2.1 ! misho 126893: int rc; /* Return code of various sub-routines */
! 126894: char *pNext; /* Cursor variable */
! 126895: int nPrefix; /* Number of bytes in term prefix */
! 126896: int nSuffix; /* Number of bytes in term suffix */
1.2 misho 126897:
1.2.2.1 ! misho 126898: if( !pReader->aDoclist ){
! 126899: pNext = pReader->aNode;
! 126900: }else{
! 126901: pNext = &pReader->aDoclist[pReader->nDoclist];
! 126902: }
! 126903:
! 126904: if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){
! 126905:
! 126906: if( fts3SegReaderIsPending(pReader) ){
! 126907: Fts3HashElem *pElem = *(pReader->ppNextElem);
! 126908: if( pElem==0 ){
! 126909: pReader->aNode = 0;
! 126910: }else{
! 126911: PendingList *pList = (PendingList *)fts3HashData(pElem);
! 126912: pReader->zTerm = (char *)fts3HashKey(pElem);
! 126913: pReader->nTerm = fts3HashKeysize(pElem);
! 126914: pReader->nNode = pReader->nDoclist = pList->nData + 1;
! 126915: pReader->aNode = pReader->aDoclist = pList->aData;
! 126916: pReader->ppNextElem++;
! 126917: assert( pReader->aNode );
! 126918: }
! 126919: return SQLITE_OK;
1.2 misho 126920: }
1.2.2.1 ! misho 126921:
! 126922: fts3SegReaderSetEof(pReader);
! 126923:
! 126924: /* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf
! 126925: ** blocks have already been traversed. */
! 126926: assert( pReader->iCurrentBlock<=pReader->iLeafEndBlock );
! 126927: if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){
! 126928: return SQLITE_OK;
! 126929: }
! 126930:
! 126931: rc = sqlite3Fts3ReadBlock(
! 126932: p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode,
! 126933: (bIncr ? &pReader->nPopulate : 0)
! 126934: );
! 126935: if( rc!=SQLITE_OK ) return rc;
! 126936: assert( pReader->pBlob==0 );
! 126937: if( bIncr && pReader->nPopulate<pReader->nNode ){
! 126938: pReader->pBlob = p->pSegments;
! 126939: p->pSegments = 0;
! 126940: }
! 126941: pNext = pReader->aNode;
1.2 misho 126942: }
1.2.2.1 ! misho 126943:
! 126944: assert( !fts3SegReaderIsPending(pReader) );
! 126945:
! 126946: rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2);
! 126947: if( rc!=SQLITE_OK ) return rc;
! 126948:
! 126949: /* Because of the FTS3_NODE_PADDING bytes of padding, the following is
! 126950: ** safe (no risk of overread) even if the node data is corrupted. */
! 126951: pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix);
! 126952: pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix);
! 126953: if( nPrefix<0 || nSuffix<=0
! 126954: || &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
! 126955: ){
! 126956: return FTS_CORRUPT_VTAB;
! 126957: }
! 126958:
! 126959: if( nPrefix+nSuffix>pReader->nTermAlloc ){
! 126960: int nNew = (nPrefix+nSuffix)*2;
! 126961: char *zNew = sqlite3_realloc(pReader->zTerm, nNew);
! 126962: if( !zNew ){
1.2 misho 126963: return SQLITE_NOMEM;
126964: }
1.2.2.1 ! misho 126965: pReader->zTerm = zNew;
! 126966: pReader->nTermAlloc = nNew;
1.2 misho 126967: }
126968:
1.2.2.1 ! misho 126969: rc = fts3SegReaderRequire(pReader, pNext, nSuffix+FTS3_VARINT_MAX);
! 126970: if( rc!=SQLITE_OK ) return rc;
! 126971:
! 126972: memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix);
! 126973: pReader->nTerm = nPrefix+nSuffix;
! 126974: pNext += nSuffix;
! 126975: pNext += sqlite3Fts3GetVarint32(pNext, &pReader->nDoclist);
! 126976: pReader->aDoclist = pNext;
! 126977: pReader->pOffsetList = 0;
! 126978:
! 126979: /* Check that the doclist does not appear to extend past the end of the
! 126980: ** b-tree node. And that the final byte of the doclist is 0x00. If either
! 126981: ** of these statements is untrue, then the data structure is corrupt.
! 126982: */
! 126983: if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
! 126984: || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
! 126985: ){
! 126986: return FTS_CORRUPT_VTAB;
! 126987: }
1.2 misho 126988: return SQLITE_OK;
126989: }
126990:
126991: /*
1.2.2.1 ! misho 126992: ** Set the SegReader to point to the first docid in the doclist associated
! 126993: ** with the current term.
1.2 misho 126994: */
1.2.2.1 ! misho 126995: static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){
! 126996: int rc = SQLITE_OK;
! 126997: assert( pReader->aDoclist );
! 126998: assert( !pReader->pOffsetList );
! 126999: if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){
! 127000: u8 bEof = 0;
! 127001: pReader->iDocid = 0;
! 127002: pReader->nOffsetList = 0;
! 127003: sqlite3Fts3DoclistPrev(0,
! 127004: pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList,
! 127005: &pReader->iDocid, &pReader->nOffsetList, &bEof
! 127006: );
! 127007: }else{
! 127008: rc = fts3SegReaderRequire(pReader, pReader->aDoclist, FTS3_VARINT_MAX);
! 127009: if( rc==SQLITE_OK ){
! 127010: int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid);
! 127011: pReader->pOffsetList = &pReader->aDoclist[n];
! 127012: }
! 127013: }
! 127014: return rc;
! 127015: }
! 127016:
! 127017: /*
! 127018: ** Advance the SegReader to point to the next docid in the doclist
! 127019: ** associated with the current term.
! 127020: **
! 127021: ** If arguments ppOffsetList and pnOffsetList are not NULL, then
! 127022: ** *ppOffsetList is set to point to the first column-offset list
! 127023: ** in the doclist entry (i.e. immediately past the docid varint).
! 127024: ** *pnOffsetList is set to the length of the set of column-offset
! 127025: ** lists, not including the nul-terminator byte. For example:
! 127026: */
! 127027: static int fts3SegReaderNextDocid(
! 127028: Fts3Table *pTab,
! 127029: Fts3SegReader *pReader, /* Reader to advance to next docid */
! 127030: char **ppOffsetList, /* OUT: Pointer to current position-list */
! 127031: int *pnOffsetList /* OUT: Length of *ppOffsetList in bytes */
1.2 misho 127032: ){
127033: int rc = SQLITE_OK;
1.2.2.1 ! misho 127034: char *p = pReader->pOffsetList;
! 127035: char c = 0;
1.2 misho 127036:
1.2.2.1 ! misho 127037: assert( p );
1.2 misho 127038:
1.2.2.1 ! misho 127039: if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){
! 127040: /* A pending-terms seg-reader for an FTS4 table that uses order=desc.
! 127041: ** Pending-terms doclists are always built up in ascending order, so
! 127042: ** we have to iterate through them backwards here. */
! 127043: u8 bEof = 0;
! 127044: if( ppOffsetList ){
! 127045: *ppOffsetList = pReader->pOffsetList;
! 127046: *pnOffsetList = pReader->nOffsetList - 1;
1.2 misho 127047: }
1.2.2.1 ! misho 127048: sqlite3Fts3DoclistPrev(0,
! 127049: pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid,
! 127050: &pReader->nOffsetList, &bEof
! 127051: );
! 127052: if( bEof ){
! 127053: pReader->pOffsetList = 0;
! 127054: }else{
! 127055: pReader->pOffsetList = p;
1.2 misho 127056: }
1.2.2.1 ! misho 127057: }else{
! 127058: char *pEnd = &pReader->aDoclist[pReader->nDoclist];
! 127059:
! 127060: /* Pointer p currently points at the first byte of an offset list. The
! 127061: ** following block advances it to point one byte past the end of
! 127062: ** the same offset list. */
! 127063: while( 1 ){
! 127064:
! 127065: /* The following line of code (and the "p++" below the while() loop) is
! 127066: ** normally all that is required to move pointer p to the desired
! 127067: ** position. The exception is if this node is being loaded from disk
! 127068: ** incrementally and pointer "p" now points to the first byte passed
! 127069: ** the populated part of pReader->aNode[].
! 127070: */
! 127071: while( *p | c ) c = *p++ & 0x80;
! 127072: assert( *p==0 );
! 127073:
! 127074: if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break;
! 127075: rc = fts3SegReaderIncrRead(pReader);
! 127076: if( rc!=SQLITE_OK ) return rc;
1.2 misho 127077: }
1.2.2.1 ! misho 127078: p++;
! 127079:
! 127080: /* If required, populate the output variables with a pointer to and the
! 127081: ** size of the previous offset-list.
! 127082: */
! 127083: if( ppOffsetList ){
! 127084: *ppOffsetList = pReader->pOffsetList;
! 127085: *pnOffsetList = (int)(p - pReader->pOffsetList - 1);
! 127086: }
! 127087:
! 127088: while( p<pEnd && *p==0 ) p++;
! 127089:
! 127090: /* If there are no more entries in the doclist, set pOffsetList to
! 127091: ** NULL. Otherwise, set Fts3SegReader.iDocid to the next docid and
! 127092: ** Fts3SegReader.pOffsetList to point to the next offset list before
! 127093: ** returning.
! 127094: */
! 127095: if( p>=pEnd ){
! 127096: pReader->pOffsetList = 0;
! 127097: }else{
! 127098: rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX);
! 127099: if( rc==SQLITE_OK ){
! 127100: sqlite3_int64 iDelta;
! 127101: pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta);
! 127102: if( pTab->bDescIdx ){
! 127103: pReader->iDocid -= iDelta;
! 127104: }else{
! 127105: pReader->iDocid += iDelta;
! 127106: }
! 127107: }
1.2 misho 127108: }
127109: }
127110:
1.2.2.1 ! misho 127111: return SQLITE_OK;
1.2 misho 127112: }
127113:
127114:
1.2.2.1 ! misho 127115: SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(
! 127116: Fts3Cursor *pCsr,
! 127117: Fts3MultiSegReader *pMsr,
! 127118: int *pnOvfl
1.2 misho 127119: ){
1.2.2.1 ! misho 127120: Fts3Table *p = (Fts3Table*)pCsr->base.pVtab;
! 127121: int nOvfl = 0;
! 127122: int ii;
1.2 misho 127123: int rc = SQLITE_OK;
1.2.2.1 ! misho 127124: int pgsz = p->nPgsz;
1.2 misho 127125:
1.2.2.1 ! misho 127126: assert( p->bFts4 );
! 127127: assert( pgsz>0 );
! 127128:
! 127129: for(ii=0; rc==SQLITE_OK && ii<pMsr->nSegment; ii++){
! 127130: Fts3SegReader *pReader = pMsr->apSegment[ii];
! 127131: if( !fts3SegReaderIsPending(pReader)
! 127132: && !fts3SegReaderIsRootOnly(pReader)
! 127133: ){
! 127134: sqlite3_int64 jj;
! 127135: for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){
! 127136: int nBlob;
! 127137: rc = sqlite3Fts3ReadBlock(p, jj, 0, &nBlob, 0);
! 127138: if( rc!=SQLITE_OK ) break;
! 127139: if( (nBlob+35)>pgsz ){
! 127140: nOvfl += (nBlob + 34)/pgsz;
! 127141: }
! 127142: }
1.2 misho 127143: }
127144: }
1.2.2.1 ! misho 127145: *pnOvfl = nOvfl;
1.2 misho 127146: return rc;
127147: }
127148:
127149: /*
1.2.2.1 ! misho 127150: ** Free all allocations associated with the iterator passed as the
! 127151: ** second argument.
1.2 misho 127152: */
1.2.2.1 ! misho 127153: SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){
! 127154: if( pReader && !fts3SegReaderIsPending(pReader) ){
! 127155: sqlite3_free(pReader->zTerm);
! 127156: if( !fts3SegReaderIsRootOnly(pReader) ){
! 127157: sqlite3_free(pReader->aNode);
! 127158: sqlite3_blob_close(pReader->pBlob);
! 127159: }
1.2 misho 127160: }
1.2.2.1 ! misho 127161: sqlite3_free(pReader);
! 127162: }
1.2 misho 127163:
1.2.2.1 ! misho 127164: /*
! 127165: ** Allocate a new SegReader object.
! 127166: */
! 127167: SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(
! 127168: int iAge, /* Segment "age". */
! 127169: int bLookup, /* True for a lookup only */
! 127170: sqlite3_int64 iStartLeaf, /* First leaf to traverse */
! 127171: sqlite3_int64 iEndLeaf, /* Final leaf to traverse */
! 127172: sqlite3_int64 iEndBlock, /* Final block of segment */
! 127173: const char *zRoot, /* Buffer containing root node */
! 127174: int nRoot, /* Size of buffer containing root node */
! 127175: Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */
! 127176: ){
! 127177: Fts3SegReader *pReader; /* Newly allocated SegReader object */
! 127178: int nExtra = 0; /* Bytes to allocate segment root node */
1.2 misho 127179:
1.2.2.1 ! misho 127180: assert( iStartLeaf<=iEndLeaf );
! 127181: if( iStartLeaf==0 ){
! 127182: nExtra = nRoot + FTS3_NODE_PADDING;
1.2 misho 127183: }
127184:
1.2.2.1 ! misho 127185: pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra);
! 127186: if( !pReader ){
! 127187: return SQLITE_NOMEM;
! 127188: }
! 127189: memset(pReader, 0, sizeof(Fts3SegReader));
! 127190: pReader->iIdx = iAge;
! 127191: pReader->bLookup = bLookup!=0;
! 127192: pReader->iStartBlock = iStartLeaf;
! 127193: pReader->iLeafEndBlock = iEndLeaf;
! 127194: pReader->iEndBlock = iEndBlock;
1.2 misho 127195:
1.2.2.1 ! misho 127196: if( nExtra ){
! 127197: /* The entire segment is stored in the root node. */
! 127198: pReader->aNode = (char *)&pReader[1];
! 127199: pReader->rootOnly = 1;
! 127200: pReader->nNode = nRoot;
! 127201: memcpy(pReader->aNode, zRoot, nRoot);
! 127202: memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING);
! 127203: }else{
! 127204: pReader->iCurrentBlock = iStartLeaf-1;
1.2 misho 127205: }
1.2.2.1 ! misho 127206: *ppReader = pReader;
1.2 misho 127207: return SQLITE_OK;
127208: }
127209:
127210: /*
1.2.2.1 ! misho 127211: ** This is a comparison function used as a qsort() callback when sorting
! 127212: ** an array of pending terms by term. This occurs as part of flushing
! 127213: ** the contents of the pending-terms hash table to the database.
1.2 misho 127214: */
1.2.2.1 ! misho 127215: static int fts3CompareElemByTerm(const void *lhs, const void *rhs){
! 127216: char *z1 = fts3HashKey(*(Fts3HashElem **)lhs);
! 127217: char *z2 = fts3HashKey(*(Fts3HashElem **)rhs);
! 127218: int n1 = fts3HashKeysize(*(Fts3HashElem **)lhs);
! 127219: int n2 = fts3HashKeysize(*(Fts3HashElem **)rhs);
1.2 misho 127220:
1.2.2.1 ! misho 127221: int n = (n1<n2 ? n1 : n2);
! 127222: int c = memcmp(z1, z2, n);
! 127223: if( c==0 ){
! 127224: c = n1 - n2;
1.2 misho 127225: }
1.2.2.1 ! misho 127226: return c;
1.2 misho 127227: }
127228:
127229: /*
1.2.2.1 ! misho 127230: ** This function is used to allocate an Fts3SegReader that iterates through
! 127231: ** a subset of the terms stored in the Fts3Table.pendingTerms array.
1.2 misho 127232: **
1.2.2.1 ! misho 127233: ** If the isPrefixIter parameter is zero, then the returned SegReader iterates
! 127234: ** through each term in the pending-terms table. Or, if isPrefixIter is
! 127235: ** non-zero, it iterates through each term and its prefixes. For example, if
! 127236: ** the pending terms hash table contains the terms "sqlite", "mysql" and
! 127237: ** "firebird", then the iterator visits the following 'terms' (in the order
! 127238: ** shown):
! 127239: **
! 127240: ** f fi fir fire fireb firebi firebir firebird
! 127241: ** m my mys mysq mysql
! 127242: ** s sq sql sqli sqlit sqlite
! 127243: **
! 127244: ** Whereas if isPrefixIter is zero, the terms visited are:
! 127245: **
! 127246: ** firebird mysql sqlite
1.2 misho 127247: */
1.2.2.1 ! misho 127248: SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(
! 127249: Fts3Table *p, /* Virtual table handle */
! 127250: int iIndex, /* Index for p->aIndex */
! 127251: const char *zTerm, /* Term to search for */
! 127252: int nTerm, /* Size of buffer zTerm */
! 127253: int bPrefix, /* True for a prefix iterator */
! 127254: Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */
1.2 misho 127255: ){
1.2.2.1 ! misho 127256: Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */
! 127257: Fts3HashElem *pE; /* Iterator variable */
! 127258: Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */
! 127259: int nElem = 0; /* Size of array at aElem */
! 127260: int rc = SQLITE_OK; /* Return Code */
! 127261: Fts3Hash *pHash;
1.2 misho 127262:
1.2.2.1 ! misho 127263: pHash = &p->aIndex[iIndex].hPending;
! 127264: if( bPrefix ){
! 127265: int nAlloc = 0; /* Size of allocated array at aElem */
! 127266:
! 127267: for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){
! 127268: char *zKey = (char *)fts3HashKey(pE);
! 127269: int nKey = fts3HashKeysize(pE);
! 127270: if( nTerm==0 || (nKey>=nTerm && 0==memcmp(zKey, zTerm, nTerm)) ){
! 127271: if( nElem==nAlloc ){
! 127272: Fts3HashElem **aElem2;
! 127273: nAlloc += 16;
! 127274: aElem2 = (Fts3HashElem **)sqlite3_realloc(
! 127275: aElem, nAlloc*sizeof(Fts3HashElem *)
! 127276: );
! 127277: if( !aElem2 ){
! 127278: rc = SQLITE_NOMEM;
! 127279: nElem = 0;
! 127280: break;
! 127281: }
! 127282: aElem = aElem2;
! 127283: }
! 127284:
! 127285: aElem[nElem++] = pE;
! 127286: }
1.2 misho 127287: }
1.2.2.1 ! misho 127288:
! 127289: /* If more than one term matches the prefix, sort the Fts3HashElem
! 127290: ** objects in term order using qsort(). This uses the same comparison
! 127291: ** callback as is used when flushing terms to disk.
! 127292: */
! 127293: if( nElem>1 ){
! 127294: qsort(aElem, nElem, sizeof(Fts3HashElem *), fts3CompareElemByTerm);
1.2 misho 127295: }
127296:
1.2.2.1 ! misho 127297: }else{
! 127298: /* The query is a simple term lookup that matches at most one term in
! 127299: ** the index. All that is required is a straight hash-lookup.
! 127300: **
! 127301: ** Because the stack address of pE may be accessed via the aElem pointer
! 127302: ** below, the "Fts3HashElem *pE" must be declared so that it is valid
! 127303: ** within this entire function, not just this "else{...}" block.
! 127304: */
! 127305: pE = fts3HashFindElem(pHash, zTerm, nTerm);
! 127306: if( pE ){
! 127307: aElem = &pE;
! 127308: nElem = 1;
! 127309: }
1.2 misho 127310: }
127311:
1.2.2.1 ! misho 127312: if( nElem>0 ){
! 127313: int nByte = sizeof(Fts3SegReader) + (nElem+1)*sizeof(Fts3HashElem *);
! 127314: pReader = (Fts3SegReader *)sqlite3_malloc(nByte);
! 127315: if( !pReader ){
! 127316: rc = SQLITE_NOMEM;
! 127317: }else{
! 127318: memset(pReader, 0, nByte);
! 127319: pReader->iIdx = 0x7FFFFFFF;
! 127320: pReader->ppNextElem = (Fts3HashElem **)&pReader[1];
! 127321: memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *));
1.2 misho 127322: }
127323: }
127324:
1.2.2.1 ! misho 127325: if( bPrefix ){
! 127326: sqlite3_free(aElem);
1.2 misho 127327: }
1.2.2.1 ! misho 127328: *ppReader = pReader;
1.2 misho 127329: return rc;
127330: }
127331:
127332: /*
1.2.2.1 ! misho 127333: ** Compare the entries pointed to by two Fts3SegReader structures.
! 127334: ** Comparison is as follows:
! 127335: **
! 127336: ** 1) EOF is greater than not EOF.
! 127337: **
! 127338: ** 2) The current terms (if any) are compared using memcmp(). If one
! 127339: ** term is a prefix of another, the longer term is considered the
! 127340: ** larger.
! 127341: **
! 127342: ** 3) By segment age. An older segment is considered larger.
1.2 misho 127343: */
1.2.2.1 ! misho 127344: static int fts3SegReaderCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){
1.2 misho 127345: int rc;
1.2.2.1 ! misho 127346: if( pLhs->aNode && pRhs->aNode ){
! 127347: int rc2 = pLhs->nTerm - pRhs->nTerm;
! 127348: if( rc2<0 ){
! 127349: rc = memcmp(pLhs->zTerm, pRhs->zTerm, pLhs->nTerm);
! 127350: }else{
! 127351: rc = memcmp(pLhs->zTerm, pRhs->zTerm, pRhs->nTerm);
! 127352: }
! 127353: if( rc==0 ){
! 127354: rc = rc2;
1.2 misho 127355: }
127356: }else{
1.2.2.1 ! misho 127357: rc = (pLhs->aNode==0) - (pRhs->aNode==0);
1.2 misho 127358: }
1.2.2.1 ! misho 127359: if( rc==0 ){
! 127360: rc = pRhs->iIdx - pLhs->iIdx;
! 127361: }
! 127362: assert( rc!=0 );
! 127363: return rc;
1.2 misho 127364: }
127365:
127366: /*
1.2.2.1 ! misho 127367: ** A different comparison function for SegReader structures. In this
! 127368: ** version, it is assumed that each SegReader points to an entry in
! 127369: ** a doclist for identical terms. Comparison is made as follows:
1.2 misho 127370: **
1.2.2.1 ! misho 127371: ** 1) EOF (end of doclist in this case) is greater than not EOF.
! 127372: **
! 127373: ** 2) By current docid.
! 127374: **
! 127375: ** 3) By segment age. An older segment is considered larger.
! 127376: */
! 127377: static int fts3SegReaderDoclistCmp(Fts3SegReader *pLhs, Fts3SegReader *pRhs){
! 127378: int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0);
! 127379: if( rc==0 ){
! 127380: if( pLhs->iDocid==pRhs->iDocid ){
! 127381: rc = pRhs->iIdx - pLhs->iIdx;
! 127382: }else{
! 127383: rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1;
1.2 misho 127384: }
127385: }
1.2.2.1 ! misho 127386: assert( pLhs->aNode && pRhs->aNode );
! 127387: return rc;
! 127388: }
! 127389: static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){
! 127390: int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0);
! 127391: if( rc==0 ){
! 127392: if( pLhs->iDocid==pRhs->iDocid ){
! 127393: rc = pRhs->iIdx - pLhs->iIdx;
1.2 misho 127394: }else{
1.2.2.1 ! misho 127395: rc = (pLhs->iDocid < pRhs->iDocid) ? 1 : -1;
1.2 misho 127396: }
127397: }
1.2.2.1 ! misho 127398: assert( pLhs->aNode && pRhs->aNode );
1.2 misho 127399: return rc;
127400: }
127401:
127402: /*
1.2.2.1 ! misho 127403: ** Compare the term that the Fts3SegReader object passed as the first argument
! 127404: ** points to with the term specified by arguments zTerm and nTerm.
1.2 misho 127405: **
1.2.2.1 ! misho 127406: ** If the pSeg iterator is already at EOF, return 0. Otherwise, return
! 127407: ** -ve if the pSeg term is less than zTerm/nTerm, 0 if the two terms are
! 127408: ** equal, or +ve if the pSeg term is greater than zTerm/nTerm.
1.2 misho 127409: */
1.2.2.1 ! misho 127410: static int fts3SegReaderTermCmp(
! 127411: Fts3SegReader *pSeg, /* Segment reader object */
! 127412: const char *zTerm, /* Term to compare to */
! 127413: int nTerm /* Size of term zTerm in bytes */
1.2 misho 127414: ){
1.2.2.1 ! misho 127415: int res = 0;
! 127416: if( pSeg->aNode ){
! 127417: if( pSeg->nTerm>nTerm ){
! 127418: res = memcmp(pSeg->zTerm, zTerm, nTerm);
! 127419: }else{
! 127420: res = memcmp(pSeg->zTerm, zTerm, pSeg->nTerm);
! 127421: }
! 127422: if( res==0 ){
! 127423: res = pSeg->nTerm-nTerm;
! 127424: }
! 127425: }
! 127426: return res;
! 127427: }
1.2 misho 127428:
1.2.2.1 ! misho 127429: /*
! 127430: ** Argument apSegment is an array of nSegment elements. It is known that
! 127431: ** the final (nSegment-nSuspect) members are already in sorted order
! 127432: ** (according to the comparison function provided). This function shuffles
! 127433: ** the array around until all entries are in sorted order.
! 127434: */
! 127435: static void fts3SegReaderSort(
! 127436: Fts3SegReader **apSegment, /* Array to sort entries of */
! 127437: int nSegment, /* Size of apSegment array */
! 127438: int nSuspect, /* Unsorted entry count */
! 127439: int (*xCmp)(Fts3SegReader *, Fts3SegReader *) /* Comparison function */
! 127440: ){
! 127441: int i; /* Iterator variable */
1.2 misho 127442:
1.2.2.1 ! misho 127443: assert( nSuspect<=nSegment );
! 127444:
! 127445: if( nSuspect==nSegment ) nSuspect--;
! 127446: for(i=nSuspect-1; i>=0; i--){
! 127447: int j;
! 127448: for(j=i; j<(nSegment-1); j++){
! 127449: Fts3SegReader *pTmp;
! 127450: if( xCmp(apSegment[j], apSegment[j+1])<0 ) break;
! 127451: pTmp = apSegment[j+1];
! 127452: apSegment[j+1] = apSegment[j];
! 127453: apSegment[j] = pTmp;
1.2 misho 127454: }
127455: }
127456:
1.2.2.1 ! misho 127457: #ifndef NDEBUG
! 127458: /* Check that the list really is sorted now. */
! 127459: for(i=0; i<(nSuspect-1); i++){
! 127460: assert( xCmp(apSegment[i], apSegment[i+1])<0 );
1.2 misho 127461: }
1.2.2.1 ! misho 127462: #endif
! 127463: }
1.2 misho 127464:
1.2.2.1 ! misho 127465: /*
! 127466: ** Insert a record into the %_segments table.
! 127467: */
! 127468: static int fts3WriteSegment(
! 127469: Fts3Table *p, /* Virtual table handle */
! 127470: sqlite3_int64 iBlock, /* Block id for new block */
! 127471: char *z, /* Pointer to buffer containing block data */
! 127472: int n /* Size of buffer z in bytes */
! 127473: ){
! 127474: sqlite3_stmt *pStmt;
! 127475: int rc = fts3SqlStmt(p, SQL_INSERT_SEGMENTS, &pStmt, 0);
! 127476: if( rc==SQLITE_OK ){
! 127477: sqlite3_bind_int64(pStmt, 1, iBlock);
! 127478: sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC);
! 127479: sqlite3_step(pStmt);
! 127480: rc = sqlite3_reset(pStmt);
! 127481: }
1.2 misho 127482: return rc;
127483: }
127484:
127485: /*
1.2.2.1 ! misho 127486: ** Find the largest relative level number in the table. If successful, set
! 127487: ** *pnMax to this value and return SQLITE_OK. Otherwise, if an error occurs,
! 127488: ** set *pnMax to zero and return an SQLite error code.
1.2 misho 127489: */
1.2.2.1 ! misho 127490: SQLITE_PRIVATE int sqlite3Fts3MaxLevel(Fts3Table *p, int *pnMax){
! 127491: int rc;
! 127492: int mxLevel = 0;
! 127493: sqlite3_stmt *pStmt = 0;
1.2 misho 127494:
1.2.2.1 ! misho 127495: rc = fts3SqlStmt(p, SQL_SELECT_MXLEVEL, &pStmt, 0);
1.2 misho 127496: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 127497: if( SQLITE_ROW==sqlite3_step(pStmt) ){
! 127498: mxLevel = sqlite3_column_int(pStmt, 0);
1.2 misho 127499: }
1.2.2.1 ! misho 127500: rc = sqlite3_reset(pStmt);
1.2 misho 127501: }
1.2.2.1 ! misho 127502: *pnMax = mxLevel;
1.2 misho 127503: return rc;
127504: }
127505:
1.2.2.1 ! misho 127506: /*
! 127507: ** Insert a record into the %_segdir table.
! 127508: */
! 127509: static int fts3WriteSegdir(
! 127510: Fts3Table *p, /* Virtual table handle */
! 127511: sqlite3_int64 iLevel, /* Value for "level" field (absolute level) */
! 127512: int iIdx, /* Value for "idx" field */
! 127513: sqlite3_int64 iStartBlock, /* Value for "start_block" field */
! 127514: sqlite3_int64 iLeafEndBlock, /* Value for "leaves_end_block" field */
! 127515: sqlite3_int64 iEndBlock, /* Value for "end_block" field */
! 127516: char *zRoot, /* Blob value for "root" field */
! 127517: int nRoot /* Number of bytes in buffer zRoot */
! 127518: ){
! 127519: sqlite3_stmt *pStmt;
! 127520: int rc = fts3SqlStmt(p, SQL_INSERT_SEGDIR, &pStmt, 0);
! 127521: if( rc==SQLITE_OK ){
! 127522: sqlite3_bind_int64(pStmt, 1, iLevel);
! 127523: sqlite3_bind_int(pStmt, 2, iIdx);
! 127524: sqlite3_bind_int64(pStmt, 3, iStartBlock);
! 127525: sqlite3_bind_int64(pStmt, 4, iLeafEndBlock);
! 127526: sqlite3_bind_int64(pStmt, 5, iEndBlock);
! 127527: sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC);
! 127528: sqlite3_step(pStmt);
! 127529: rc = sqlite3_reset(pStmt);
1.2 misho 127530: }
127531: return rc;
127532: }
127533:
127534: /*
1.2.2.1 ! misho 127535: ** Return the size of the common prefix (if any) shared by zPrev and
! 127536: ** zNext, in bytes. For example,
! 127537: **
! 127538: ** fts3PrefixCompress("abc", 3, "abcdef", 6) // returns 3
! 127539: ** fts3PrefixCompress("abX", 3, "abcdef", 6) // returns 2
! 127540: ** fts3PrefixCompress("abX", 3, "Xbcdef", 6) // returns 0
1.2 misho 127541: */
1.2.2.1 ! misho 127542: static int fts3PrefixCompress(
! 127543: const char *zPrev, /* Buffer containing previous term */
! 127544: int nPrev, /* Size of buffer zPrev in bytes */
! 127545: const char *zNext, /* Buffer containing next term */
! 127546: int nNext /* Size of buffer zNext in bytes */
1.2 misho 127547: ){
1.2.2.1 ! misho 127548: int n;
! 127549: UNUSED_PARAMETER(nNext);
! 127550: for(n=0; n<nPrev && zPrev[n]==zNext[n]; n++);
! 127551: return n;
! 127552: }
1.2 misho 127553:
1.2.2.1 ! misho 127554: /*
! 127555: ** Add term zTerm to the SegmentNode. It is guaranteed that zTerm is larger
! 127556: ** (according to memcmp) than the previous term.
! 127557: */
! 127558: static int fts3NodeAddTerm(
! 127559: Fts3Table *p, /* Virtual table handle */
! 127560: SegmentNode **ppTree, /* IN/OUT: SegmentNode handle */
! 127561: int isCopyTerm, /* True if zTerm/nTerm is transient */
! 127562: const char *zTerm, /* Pointer to buffer containing term */
! 127563: int nTerm /* Size of term in bytes */
! 127564: ){
! 127565: SegmentNode *pTree = *ppTree;
! 127566: int rc;
! 127567: SegmentNode *pNew;
1.2 misho 127568:
1.2.2.1 ! misho 127569: /* First try to append the term to the current node. Return early if
! 127570: ** this is possible.
! 127571: */
! 127572: if( pTree ){
! 127573: int nData = pTree->nData; /* Current size of node in bytes */
! 127574: int nReq = nData; /* Required space after adding zTerm */
! 127575: int nPrefix; /* Number of bytes of prefix compression */
! 127576: int nSuffix; /* Suffix length */
1.2 misho 127577:
1.2.2.1 ! misho 127578: nPrefix = fts3PrefixCompress(pTree->zTerm, pTree->nTerm, zTerm, nTerm);
! 127579: nSuffix = nTerm-nPrefix;
! 127580:
! 127581: nReq += sqlite3Fts3VarintLen(nPrefix)+sqlite3Fts3VarintLen(nSuffix)+nSuffix;
! 127582: if( nReq<=p->nNodeSize || !pTree->zTerm ){
! 127583:
! 127584: if( nReq>p->nNodeSize ){
! 127585: /* An unusual case: this is the first term to be added to the node
! 127586: ** and the static node buffer (p->nNodeSize bytes) is not large
! 127587: ** enough. Use a separately malloced buffer instead This wastes
! 127588: ** p->nNodeSize bytes, but since this scenario only comes about when
! 127589: ** the database contain two terms that share a prefix of almost 2KB,
! 127590: ** this is not expected to be a serious problem.
! 127591: */
! 127592: assert( pTree->aData==(char *)&pTree[1] );
! 127593: pTree->aData = (char *)sqlite3_malloc(nReq);
! 127594: if( !pTree->aData ){
! 127595: return SQLITE_NOMEM;
! 127596: }
1.2 misho 127597: }
127598:
1.2.2.1 ! misho 127599: if( pTree->zTerm ){
! 127600: /* There is no prefix-length field for first term in a node */
! 127601: nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nPrefix);
! 127602: }
1.2 misho 127603:
1.2.2.1 ! misho 127604: nData += sqlite3Fts3PutVarint(&pTree->aData[nData], nSuffix);
! 127605: memcpy(&pTree->aData[nData], &zTerm[nPrefix], nSuffix);
! 127606: pTree->nData = nData + nSuffix;
! 127607: pTree->nEntry++;
1.2 misho 127608:
1.2.2.1 ! misho 127609: if( isCopyTerm ){
! 127610: if( pTree->nMalloc<nTerm ){
! 127611: char *zNew = sqlite3_realloc(pTree->zMalloc, nTerm*2);
! 127612: if( !zNew ){
! 127613: return SQLITE_NOMEM;
! 127614: }
! 127615: pTree->nMalloc = nTerm*2;
! 127616: pTree->zMalloc = zNew;
! 127617: }
! 127618: pTree->zTerm = pTree->zMalloc;
! 127619: memcpy(pTree->zTerm, zTerm, nTerm);
! 127620: pTree->nTerm = nTerm;
! 127621: }else{
! 127622: pTree->zTerm = (char *)zTerm;
! 127623: pTree->nTerm = nTerm;
! 127624: }
! 127625: return SQLITE_OK;
1.2 misho 127626: }
127627: }
127628:
1.2.2.1 ! misho 127629: /* If control flows to here, it was not possible to append zTerm to the
! 127630: ** current node. Create a new node (a right-sibling of the current node).
! 127631: ** If this is the first node in the tree, the term is added to it.
! 127632: **
! 127633: ** Otherwise, the term is not added to the new node, it is left empty for
! 127634: ** now. Instead, the term is inserted into the parent of pTree. If pTree
! 127635: ** has no parent, one is created here.
! 127636: */
! 127637: pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize);
! 127638: if( !pNew ){
! 127639: return SQLITE_NOMEM;
1.2 misho 127640: }
1.2.2.1 ! misho 127641: memset(pNew, 0, sizeof(SegmentNode));
! 127642: pNew->nData = 1 + FTS3_VARINT_MAX;
! 127643: pNew->aData = (char *)&pNew[1];
1.2 misho 127644:
1.2.2.1 ! misho 127645: if( pTree ){
! 127646: SegmentNode *pParent = pTree->pParent;
! 127647: rc = fts3NodeAddTerm(p, &pParent, isCopyTerm, zTerm, nTerm);
! 127648: if( pTree->pParent==0 ){
! 127649: pTree->pParent = pParent;
1.2 misho 127650: }
1.2.2.1 ! misho 127651: pTree->pRight = pNew;
! 127652: pNew->pLeftmost = pTree->pLeftmost;
! 127653: pNew->pParent = pParent;
! 127654: pNew->zMalloc = pTree->zMalloc;
! 127655: pNew->nMalloc = pTree->nMalloc;
! 127656: pTree->zMalloc = 0;
! 127657: }else{
! 127658: pNew->pLeftmost = pNew;
! 127659: rc = fts3NodeAddTerm(p, &pNew, isCopyTerm, zTerm, nTerm);
1.2 misho 127660: }
127661:
1.2.2.1 ! misho 127662: *ppTree = pNew;
! 127663: return rc;
! 127664: }
1.2 misho 127665:
1.2.2.1 ! misho 127666: /*
! 127667: ** Helper function for fts3NodeWrite().
! 127668: */
! 127669: static int fts3TreeFinishNode(
! 127670: SegmentNode *pTree,
! 127671: int iHeight,
! 127672: sqlite3_int64 iLeftChild
! 127673: ){
! 127674: int nStart;
! 127675: assert( iHeight>=1 && iHeight<128 );
! 127676: nStart = FTS3_VARINT_MAX - sqlite3Fts3VarintLen(iLeftChild);
! 127677: pTree->aData[nStart] = (char)iHeight;
! 127678: sqlite3Fts3PutVarint(&pTree->aData[nStart+1], iLeftChild);
! 127679: return nStart;
1.2 misho 127680: }
127681:
127682: /*
1.2.2.1 ! misho 127683: ** Write the buffer for the segment node pTree and all of its peers to the
! 127684: ** database. Then call this function recursively to write the parent of
! 127685: ** pTree and its peers to the database.
! 127686: **
! 127687: ** Except, if pTree is a root node, do not write it to the database. Instead,
! 127688: ** set output variables *paRoot and *pnRoot to contain the root node.
! 127689: **
! 127690: ** If successful, SQLITE_OK is returned and output variable *piLast is
! 127691: ** set to the largest blockid written to the database (or zero if no
! 127692: ** blocks were written to the db). Otherwise, an SQLite error code is
! 127693: ** returned.
1.2 misho 127694: */
1.2.2.1 ! misho 127695: static int fts3NodeWrite(
! 127696: Fts3Table *p, /* Virtual table handle */
! 127697: SegmentNode *pTree, /* SegmentNode handle */
! 127698: int iHeight, /* Height of this node in tree */
! 127699: sqlite3_int64 iLeaf, /* Block id of first leaf node */
! 127700: sqlite3_int64 iFree, /* Block id of next free slot in %_segments */
! 127701: sqlite3_int64 *piLast, /* OUT: Block id of last entry written */
! 127702: char **paRoot, /* OUT: Data for root node */
! 127703: int *pnRoot /* OUT: Size of root node in bytes */
! 127704: ){
1.2 misho 127705: int rc = SQLITE_OK;
1.2.2.1 ! misho 127706:
! 127707: if( !pTree->pParent ){
! 127708: /* Root node of the tree. */
! 127709: int nStart = fts3TreeFinishNode(pTree, iHeight, iLeaf);
! 127710: *piLast = iFree-1;
! 127711: *pnRoot = pTree->nData - nStart;
! 127712: *paRoot = &pTree->aData[nStart];
1.2 misho 127713: }else{
1.2.2.1 ! misho 127714: SegmentNode *pIter;
! 127715: sqlite3_int64 iNextFree = iFree;
! 127716: sqlite3_int64 iNextLeaf = iLeaf;
! 127717: for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){
! 127718: int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf);
! 127719: int nWrite = pIter->nData - nStart;
! 127720:
! 127721: rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite);
! 127722: iNextFree++;
! 127723: iNextLeaf += (pIter->nEntry+1);
! 127724: }
1.2 misho 127725: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 127726: assert( iNextLeaf==iFree );
! 127727: rc = fts3NodeWrite(
! 127728: p, pTree->pParent, iHeight+1, iFree, iNextFree, piLast, paRoot, pnRoot
! 127729: );
! 127730: }
! 127731: }
! 127732:
! 127733: return rc;
! 127734: }
! 127735:
! 127736: /*
! 127737: ** Free all memory allocations associated with the tree pTree.
! 127738: */
! 127739: static void fts3NodeFree(SegmentNode *pTree){
! 127740: if( pTree ){
! 127741: SegmentNode *p = pTree->pLeftmost;
! 127742: fts3NodeFree(p->pParent);
! 127743: while( p ){
! 127744: SegmentNode *pRight = p->pRight;
! 127745: if( p->aData!=(char *)&p[1] ){
! 127746: sqlite3_free(p->aData);
! 127747: }
! 127748: assert( pRight==0 || p->zMalloc==0 );
! 127749: sqlite3_free(p->zMalloc);
! 127750: sqlite3_free(p);
! 127751: p = pRight;
1.2 misho 127752: }
127753: }
127754: }
127755:
127756: /*
1.2.2.1 ! misho 127757: ** Add a term to the segment being constructed by the SegmentWriter object
! 127758: ** *ppWriter. When adding the first term to a segment, *ppWriter should
! 127759: ** be passed NULL. This function will allocate a new SegmentWriter object
! 127760: ** and return it via the input/output variable *ppWriter in this case.
! 127761: **
! 127762: ** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code.
1.2 misho 127763: */
1.2.2.1 ! misho 127764: static int fts3SegWriterAdd(
! 127765: Fts3Table *p, /* Virtual table handle */
! 127766: SegmentWriter **ppWriter, /* IN/OUT: SegmentWriter handle */
! 127767: int isCopyTerm, /* True if buffer zTerm must be copied */
! 127768: const char *zTerm, /* Pointer to buffer containing term */
! 127769: int nTerm, /* Size of term in bytes */
! 127770: const char *aDoclist, /* Pointer to buffer containing doclist */
! 127771: int nDoclist /* Size of doclist in bytes */
1.2 misho 127772: ){
1.2.2.1 ! misho 127773: int nPrefix; /* Size of term prefix in bytes */
! 127774: int nSuffix; /* Size of term suffix in bytes */
! 127775: int nReq; /* Number of bytes required on leaf page */
! 127776: int nData;
! 127777: SegmentWriter *pWriter = *ppWriter;
1.2 misho 127778:
1.2.2.1 ! misho 127779: if( !pWriter ){
! 127780: int rc;
! 127781: sqlite3_stmt *pStmt;
1.2 misho 127782:
1.2.2.1 ! misho 127783: /* Allocate the SegmentWriter structure */
! 127784: pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter));
! 127785: if( !pWriter ) return SQLITE_NOMEM;
! 127786: memset(pWriter, 0, sizeof(SegmentWriter));
! 127787: *ppWriter = pWriter;
1.2 misho 127788:
1.2.2.1 ! misho 127789: /* Allocate a buffer in which to accumulate data */
! 127790: pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize);
! 127791: if( !pWriter->aData ) return SQLITE_NOMEM;
! 127792: pWriter->nSize = p->nNodeSize;
! 127793:
! 127794: /* Find the next free blockid in the %_segments table */
! 127795: rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pStmt, 0);
! 127796: if( rc!=SQLITE_OK ) return rc;
! 127797: if( SQLITE_ROW==sqlite3_step(pStmt) ){
! 127798: pWriter->iFree = sqlite3_column_int64(pStmt, 0);
! 127799: pWriter->iFirst = pWriter->iFree;
1.2 misho 127800: }
1.2.2.1 ! misho 127801: rc = sqlite3_reset(pStmt);
! 127802: if( rc!=SQLITE_OK ) return rc;
! 127803: }
! 127804: nData = pWriter->nData;
1.2 misho 127805:
1.2.2.1 ! misho 127806: nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm);
! 127807: nSuffix = nTerm-nPrefix;
! 127808:
! 127809: /* Figure out how many bytes are required by this new entry */
! 127810: nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */
! 127811: sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */
! 127812: nSuffix + /* Term suffix */
! 127813: sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */
! 127814: nDoclist; /* Doclist data */
! 127815:
! 127816: if( nData>0 && nData+nReq>p->nNodeSize ){
! 127817: int rc;
! 127818:
! 127819: /* The current leaf node is full. Write it out to the database. */
! 127820: rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, nData);
! 127821: if( rc!=SQLITE_OK ) return rc;
! 127822: p->nLeafAdd++;
! 127823:
! 127824: /* Add the current term to the interior node tree. The term added to
! 127825: ** the interior tree must:
! 127826: **
! 127827: ** a) be greater than the largest term on the leaf node just written
! 127828: ** to the database (still available in pWriter->zTerm), and
! 127829: **
! 127830: ** b) be less than or equal to the term about to be added to the new
! 127831: ** leaf node (zTerm/nTerm).
! 127832: **
! 127833: ** In other words, it must be the prefix of zTerm 1 byte longer than
! 127834: ** the common prefix (if any) of zTerm and pWriter->zTerm.
1.2 misho 127835: */
1.2.2.1 ! misho 127836: assert( nPrefix<nTerm );
! 127837: rc = fts3NodeAddTerm(p, &pWriter->pTree, isCopyTerm, zTerm, nPrefix+1);
! 127838: if( rc!=SQLITE_OK ) return rc;
! 127839:
! 127840: nData = 0;
! 127841: pWriter->nTerm = 0;
! 127842:
! 127843: nPrefix = 0;
! 127844: nSuffix = nTerm;
! 127845: nReq = 1 + /* varint containing prefix size */
! 127846: sqlite3Fts3VarintLen(nTerm) + /* varint containing suffix size */
! 127847: nTerm + /* Term suffix */
! 127848: sqlite3Fts3VarintLen(nDoclist) + /* Size of doclist */
! 127849: nDoclist; /* Doclist data */
! 127850: }
! 127851:
! 127852: /* If the buffer currently allocated is too small for this entry, realloc
! 127853: ** the buffer to make it large enough.
! 127854: */
! 127855: if( nReq>pWriter->nSize ){
! 127856: char *aNew = sqlite3_realloc(pWriter->aData, nReq);
! 127857: if( !aNew ) return SQLITE_NOMEM;
! 127858: pWriter->aData = aNew;
! 127859: pWriter->nSize = nReq;
! 127860: }
! 127861: assert( nData+nReq<=pWriter->nSize );
! 127862:
! 127863: /* Append the prefix-compressed term and doclist to the buffer. */
! 127864: nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nPrefix);
! 127865: nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nSuffix);
! 127866: memcpy(&pWriter->aData[nData], &zTerm[nPrefix], nSuffix);
! 127867: nData += nSuffix;
! 127868: nData += sqlite3Fts3PutVarint(&pWriter->aData[nData], nDoclist);
! 127869: memcpy(&pWriter->aData[nData], aDoclist, nDoclist);
! 127870: pWriter->nData = nData + nDoclist;
! 127871:
! 127872: /* Save the current term so that it can be used to prefix-compress the next.
! 127873: ** If the isCopyTerm parameter is true, then the buffer pointed to by
! 127874: ** zTerm is transient, so take a copy of the term data. Otherwise, just
! 127875: ** store a copy of the pointer.
! 127876: */
! 127877: if( isCopyTerm ){
! 127878: if( nTerm>pWriter->nMalloc ){
! 127879: char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2);
! 127880: if( !zNew ){
! 127881: return SQLITE_NOMEM;
1.2 misho 127882: }
1.2.2.1 ! misho 127883: pWriter->nMalloc = nTerm*2;
! 127884: pWriter->zMalloc = zNew;
! 127885: pWriter->zTerm = zNew;
1.2 misho 127886: }
1.2.2.1 ! misho 127887: assert( pWriter->zTerm==pWriter->zMalloc );
! 127888: memcpy(pWriter->zTerm, zTerm, nTerm);
! 127889: }else{
! 127890: pWriter->zTerm = (char *)zTerm;
1.2 misho 127891: }
1.2.2.1 ! misho 127892: pWriter->nTerm = nTerm;
1.2 misho 127893:
127894: return SQLITE_OK;
127895: }
127896:
1.2.2.1 ! misho 127897: /*
! 127898: ** Flush all data associated with the SegmentWriter object pWriter to the
! 127899: ** database. This function must be called after all terms have been added
! 127900: ** to the segment using fts3SegWriterAdd(). If successful, SQLITE_OK is
! 127901: ** returned. Otherwise, an SQLite error code.
! 127902: */
! 127903: static int fts3SegWriterFlush(
! 127904: Fts3Table *p, /* Virtual table handle */
! 127905: SegmentWriter *pWriter, /* SegmentWriter to flush to the db */
! 127906: sqlite3_int64 iLevel, /* Value for 'level' column of %_segdir */
! 127907: int iIdx /* Value for 'idx' column of %_segdir */
1.2 misho 127908: ){
1.2.2.1 ! misho 127909: int rc; /* Return code */
! 127910: if( pWriter->pTree ){
! 127911: sqlite3_int64 iLast = 0; /* Largest block id written to database */
! 127912: sqlite3_int64 iLastLeaf; /* Largest leaf block id written to db */
! 127913: char *zRoot = NULL; /* Pointer to buffer containing root node */
! 127914: int nRoot = 0; /* Size of buffer zRoot */
1.2 misho 127915:
1.2.2.1 ! misho 127916: iLastLeaf = pWriter->iFree;
! 127917: rc = fts3WriteSegment(p, pWriter->iFree++, pWriter->aData, pWriter->nData);
! 127918: if( rc==SQLITE_OK ){
! 127919: rc = fts3NodeWrite(p, pWriter->pTree, 1,
! 127920: pWriter->iFirst, pWriter->iFree, &iLast, &zRoot, &nRoot);
1.2 misho 127921: }
1.2.2.1 ! misho 127922: if( rc==SQLITE_OK ){
! 127923: rc = fts3WriteSegdir(
! 127924: p, iLevel, iIdx, pWriter->iFirst, iLastLeaf, iLast, zRoot, nRoot);
! 127925: }
! 127926: }else{
! 127927: /* The entire tree fits on the root node. Write it to the segdir table. */
! 127928: rc = fts3WriteSegdir(
! 127929: p, iLevel, iIdx, 0, 0, 0, pWriter->aData, pWriter->nData);
1.2 misho 127930: }
1.2.2.1 ! misho 127931: p->nLeafAdd++;
1.2 misho 127932: return rc;
127933: }
127934:
127935: /*
1.2.2.1 ! misho 127936: ** Release all memory held by the SegmentWriter object passed as the
! 127937: ** first argument.
1.2 misho 127938: */
1.2.2.1 ! misho 127939: static void fts3SegWriterFree(SegmentWriter *pWriter){
! 127940: if( pWriter ){
! 127941: sqlite3_free(pWriter->aData);
! 127942: sqlite3_free(pWriter->zMalloc);
! 127943: fts3NodeFree(pWriter->pTree);
! 127944: sqlite3_free(pWriter);
1.2 misho 127945: }
127946: }
127947:
127948: /*
1.2.2.1 ! misho 127949: ** The first value in the apVal[] array is assumed to contain an integer.
! 127950: ** This function tests if there exist any documents with docid values that
! 127951: ** are different from that integer. i.e. if deleting the document with docid
! 127952: ** pRowid would mean the FTS3 table were empty.
! 127953: **
! 127954: ** If successful, *pisEmpty is set to true if the table is empty except for
! 127955: ** document pRowid, or false otherwise, and SQLITE_OK is returned. If an
! 127956: ** error occurs, an SQLite error code is returned.
1.2 misho 127957: */
1.2.2.1 ! misho 127958: static int fts3IsEmpty(Fts3Table *p, sqlite3_value *pRowid, int *pisEmpty){
! 127959: sqlite3_stmt *pStmt;
! 127960: int rc;
! 127961: if( p->zContentTbl ){
! 127962: /* If using the content=xxx option, assume the table is never empty */
! 127963: *pisEmpty = 0;
! 127964: rc = SQLITE_OK;
! 127965: }else{
! 127966: rc = fts3SqlStmt(p, SQL_IS_EMPTY, &pStmt, &pRowid);
! 127967: if( rc==SQLITE_OK ){
! 127968: if( SQLITE_ROW==sqlite3_step(pStmt) ){
! 127969: *pisEmpty = sqlite3_column_int(pStmt, 0);
! 127970: }
! 127971: rc = sqlite3_reset(pStmt);
! 127972: }
1.2 misho 127973: }
1.2.2.1 ! misho 127974: return rc;
! 127975: }
1.2 misho 127976:
1.2.2.1 ! misho 127977: /*
! 127978: ** Set *pnMax to the largest segment level in the database for the index
! 127979: ** iIndex.
! 127980: **
! 127981: ** Segment levels are stored in the 'level' column of the %_segdir table.
! 127982: **
! 127983: ** Return SQLITE_OK if successful, or an SQLite error code if not.
! 127984: */
! 127985: static int fts3SegmentMaxLevel(
! 127986: Fts3Table *p,
! 127987: int iLangid,
! 127988: int iIndex,
! 127989: sqlite3_int64 *pnMax
! 127990: ){
! 127991: sqlite3_stmt *pStmt;
! 127992: int rc;
! 127993: assert( iIndex>=0 && iIndex<p->nIndex );
1.2 misho 127994:
1.2.2.1 ! misho 127995: /* Set pStmt to the compiled version of:
! 127996: **
! 127997: ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?
! 127998: **
! 127999: ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR).
! 128000: */
! 128001: rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0);
! 128002: if( rc!=SQLITE_OK ) return rc;
! 128003: sqlite3_bind_int64(pStmt, 1, getAbsoluteLevel(p, iLangid, iIndex, 0));
! 128004: sqlite3_bind_int64(pStmt, 2,
! 128005: getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1)
! 128006: );
! 128007: if( SQLITE_ROW==sqlite3_step(pStmt) ){
! 128008: *pnMax = sqlite3_column_int64(pStmt, 0);
1.2 misho 128009: }
1.2.2.1 ! misho 128010: return sqlite3_reset(pStmt);
1.2 misho 128011: }
128012:
128013: /*
1.2.2.1 ! misho 128014: ** Delete all entries in the %_segments table associated with the segment
! 128015: ** opened with seg-reader pSeg. This function does not affect the contents
! 128016: ** of the %_segdir table.
1.2 misho 128017: */
1.2.2.1 ! misho 128018: static int fts3DeleteSegment(
! 128019: Fts3Table *p, /* FTS table handle */
! 128020: Fts3SegReader *pSeg /* Segment to delete */
! 128021: ){
! 128022: int rc = SQLITE_OK; /* Return code */
! 128023: if( pSeg->iStartBlock ){
! 128024: sqlite3_stmt *pDelete; /* SQL statement to delete rows */
! 128025: rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDelete, 0);
! 128026: if( rc==SQLITE_OK ){
! 128027: sqlite3_bind_int64(pDelete, 1, pSeg->iStartBlock);
! 128028: sqlite3_bind_int64(pDelete, 2, pSeg->iEndBlock);
! 128029: sqlite3_step(pDelete);
! 128030: rc = sqlite3_reset(pDelete);
! 128031: }
1.2 misho 128032: }
1.2.2.1 ! misho 128033: return rc;
1.2 misho 128034: }
128035:
128036: /*
1.2.2.1 ! misho 128037: ** This function is used after merging multiple segments into a single large
! 128038: ** segment to delete the old, now redundant, segment b-trees. Specifically,
! 128039: ** it:
! 128040: **
! 128041: ** 1) Deletes all %_segments entries for the segments associated with
! 128042: ** each of the SegReader objects in the array passed as the third
! 128043: ** argument, and
1.2 misho 128044: **
1.2.2.1 ! misho 128045: ** 2) deletes all %_segdir entries with level iLevel, or all %_segdir
! 128046: ** entries regardless of level if (iLevel<0).
1.2 misho 128047: **
1.2.2.1 ! misho 128048: ** SQLITE_OK is returned if successful, otherwise an SQLite error code.
1.2 misho 128049: */
1.2.2.1 ! misho 128050: static int fts3DeleteSegdir(
1.2 misho 128051: Fts3Table *p, /* Virtual table handle */
1.2.2.1 ! misho 128052: int iLangid, /* Language id */
1.2 misho 128053: int iIndex, /* Index for p->aIndex */
1.2.2.1 ! misho 128054: int iLevel, /* Level of %_segdir entries to delete */
! 128055: Fts3SegReader **apSegment, /* Array of SegReader objects */
! 128056: int nReader /* Size of array apSegment */
1.2 misho 128057: ){
128058: int rc = SQLITE_OK; /* Return Code */
1.2.2.1 ! misho 128059: int i; /* Iterator variable */
! 128060: sqlite3_stmt *pDelete = 0; /* SQL statement to delete rows */
1.2 misho 128061:
1.2.2.1 ! misho 128062: for(i=0; rc==SQLITE_OK && i<nReader; i++){
! 128063: rc = fts3DeleteSegment(p, apSegment[i]);
! 128064: }
! 128065: if( rc!=SQLITE_OK ){
! 128066: return rc;
! 128067: }
1.2 misho 128068:
1.2.2.1 ! misho 128069: assert( iLevel>=0 || iLevel==FTS3_SEGCURSOR_ALL );
! 128070: if( iLevel==FTS3_SEGCURSOR_ALL ){
! 128071: rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0);
! 128072: if( rc==SQLITE_OK ){
! 128073: sqlite3_bind_int64(pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, 0));
! 128074: sqlite3_bind_int64(pDelete, 2,
! 128075: getAbsoluteLevel(p, iLangid, iIndex, FTS3_SEGDIR_MAXLEVEL-1)
! 128076: );
1.2 misho 128077: }
128078: }else{
1.2.2.1 ! misho 128079: rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pDelete, 0);
! 128080: if( rc==SQLITE_OK ){
! 128081: sqlite3_bind_int64(
! 128082: pDelete, 1, getAbsoluteLevel(p, iLangid, iIndex, iLevel)
! 128083: );
1.2 misho 128084: }
128085: }
128086:
1.2.2.1 ! misho 128087: if( rc==SQLITE_OK ){
! 128088: sqlite3_step(pDelete);
! 128089: rc = sqlite3_reset(pDelete);
1.2 misho 128090: }
1.2.2.1 ! misho 128091:
1.2 misho 128092: return rc;
128093: }
128094:
128095: /*
1.2.2.1 ! misho 128096: ** When this function is called, buffer *ppList (size *pnList bytes) contains
! 128097: ** a position list that may (or may not) feature multiple columns. This
! 128098: ** function adjusts the pointer *ppList and the length *pnList so that they
! 128099: ** identify the subset of the position list that corresponds to column iCol.
1.2 misho 128100: **
1.2.2.1 ! misho 128101: ** If there are no entries in the input position list for column iCol, then
! 128102: ** *pnList is set to zero before returning.
1.2 misho 128103: */
1.2.2.1 ! misho 128104: static void fts3ColumnFilter(
! 128105: int iCol, /* Column to filter on */
! 128106: char **ppList, /* IN/OUT: Pointer to position list */
! 128107: int *pnList /* IN/OUT: Size of buffer *ppList in bytes */
! 128108: ){
! 128109: char *pList = *ppList;
! 128110: int nList = *pnList;
! 128111: char *pEnd = &pList[nList];
! 128112: int iCurrent = 0;
! 128113: char *p = pList;
! 128114:
! 128115: assert( iCol>=0 );
! 128116: while( 1 ){
! 128117: char c = 0;
! 128118: while( p<pEnd && (c | *p)&0xFE ) c = *p++ & 0x80;
! 128119:
! 128120: if( iCol==iCurrent ){
! 128121: nList = (int)(p - pList);
! 128122: break;
1.2 misho 128123: }
1.2.2.1 ! misho 128124:
! 128125: nList -= (int)(p - pList);
! 128126: pList = p;
! 128127: if( nList==0 ){
! 128128: break;
1.2 misho 128129: }
1.2.2.1 ! misho 128130: p = &pList[1];
! 128131: p += sqlite3Fts3GetVarint32(p, &iCurrent);
1.2 misho 128132: }
1.2.2.1 ! misho 128133:
! 128134: *ppList = pList;
! 128135: *pnList = nList;
1.2 misho 128136: }
128137:
128138: /*
1.2.2.1 ! misho 128139: ** Cache data in the Fts3MultiSegReader.aBuffer[] buffer (overwriting any
! 128140: ** existing data). Grow the buffer if required.
1.2 misho 128141: **
1.2.2.1 ! misho 128142: ** If successful, return SQLITE_OK. Otherwise, if an OOM error is encountered
! 128143: ** trying to resize the buffer, return SQLITE_NOMEM.
1.2 misho 128144: */
1.2.2.1 ! misho 128145: static int fts3MsrBufferData(
! 128146: Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */
! 128147: char *pList,
! 128148: int nList
! 128149: ){
! 128150: if( nList>pMsr->nBuffer ){
! 128151: char *pNew;
! 128152: pMsr->nBuffer = nList*2;
! 128153: pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer);
! 128154: if( !pNew ) return SQLITE_NOMEM;
! 128155: pMsr->aBuffer = pNew;
1.2 misho 128156: }
1.2.2.1 ! misho 128157:
! 128158: memcpy(pMsr->aBuffer, pList, nList);
! 128159: return SQLITE_OK;
1.2 misho 128160: }
1.2.2.1 ! misho 128161:
! 128162: SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext(
! 128163: Fts3Table *p, /* Virtual table handle */
! 128164: Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */
! 128165: sqlite3_int64 *piDocid, /* OUT: Docid value */
! 128166: char **paPoslist, /* OUT: Pointer to position list */
! 128167: int *pnPoslist /* OUT: Size of position list in bytes */
! 128168: ){
! 128169: int nMerge = pMsr->nAdvance;
! 128170: Fts3SegReader **apSegment = pMsr->apSegment;
! 128171: int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
! 128172: p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
! 128173: );
! 128174:
! 128175: if( nMerge==0 ){
! 128176: *paPoslist = 0;
! 128177: return SQLITE_OK;
! 128178: }
! 128179:
! 128180: while( 1 ){
! 128181: Fts3SegReader *pSeg;
! 128182: pSeg = pMsr->apSegment[0];
! 128183:
! 128184: if( pSeg->pOffsetList==0 ){
! 128185: *paPoslist = 0;
! 128186: break;
1.2 misho 128187: }else{
1.2.2.1 ! misho 128188: int rc;
! 128189: char *pList;
! 128190: int nList;
! 128191: int j;
! 128192: sqlite3_int64 iDocid = apSegment[0]->iDocid;
! 128193:
! 128194: rc = fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList);
! 128195: j = 1;
! 128196: while( rc==SQLITE_OK
! 128197: && j<nMerge
! 128198: && apSegment[j]->pOffsetList
! 128199: && apSegment[j]->iDocid==iDocid
! 128200: ){
! 128201: rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0);
! 128202: j++;
! 128203: }
! 128204: if( rc!=SQLITE_OK ) return rc;
! 128205: fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp);
! 128206:
! 128207: if( pMsr->iColFilter>=0 ){
! 128208: fts3ColumnFilter(pMsr->iColFilter, &pList, &nList);
! 128209: }
! 128210:
! 128211: if( nList>0 ){
! 128212: if( fts3SegReaderIsPending(apSegment[0]) ){
! 128213: rc = fts3MsrBufferData(pMsr, pList, nList+1);
! 128214: if( rc!=SQLITE_OK ) return rc;
! 128215: *paPoslist = pMsr->aBuffer;
! 128216: assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 );
! 128217: }else{
! 128218: *paPoslist = pList;
! 128219: }
! 128220: *piDocid = iDocid;
! 128221: *pnPoslist = nList;
! 128222: break;
! 128223: }
1.2 misho 128224: }
128225: }
1.2.2.1 ! misho 128226:
! 128227: return SQLITE_OK;
1.2 misho 128228: }
128229:
1.2.2.1 ! misho 128230: static int fts3SegReaderStart(
! 128231: Fts3Table *p, /* Virtual table handle */
! 128232: Fts3MultiSegReader *pCsr, /* Cursor object */
! 128233: const char *zTerm, /* Term searched for (or NULL) */
! 128234: int nTerm /* Length of zTerm in bytes */
1.2 misho 128235: ){
1.2.2.1 ! misho 128236: int i;
! 128237: int nSeg = pCsr->nSegment;
! 128238:
! 128239: /* If the Fts3SegFilter defines a specific term (or term prefix) to search
! 128240: ** for, then advance each segment iterator until it points to a term of
! 128241: ** equal or greater value than the specified term. This prevents many
! 128242: ** unnecessary merge/sort operations for the case where single segment
! 128243: ** b-tree leaf nodes contain more than one term.
! 128244: */
! 128245: for(i=0; pCsr->bRestart==0 && i<pCsr->nSegment; i++){
! 128246: int res = 0;
! 128247: Fts3SegReader *pSeg = pCsr->apSegment[i];
! 128248: do {
! 128249: int rc = fts3SegReaderNext(p, pSeg, 0);
! 128250: if( rc!=SQLITE_OK ) return rc;
! 128251: }while( zTerm && (res = fts3SegReaderTermCmp(pSeg, zTerm, nTerm))<0 );
! 128252:
! 128253: if( pSeg->bLookup && res!=0 ){
! 128254: fts3SegReaderSetEof(pSeg);
1.2 misho 128255: }
128256: }
1.2.2.1 ! misho 128257: fts3SegReaderSort(pCsr->apSegment, nSeg, nSeg, fts3SegReaderCmp);
! 128258:
! 128259: return SQLITE_OK;
1.2 misho 128260: }
128261:
1.2.2.1 ! misho 128262: SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(
! 128263: Fts3Table *p, /* Virtual table handle */
! 128264: Fts3MultiSegReader *pCsr, /* Cursor object */
! 128265: Fts3SegFilter *pFilter /* Restrictions on range of iteration */
1.2 misho 128266: ){
1.2.2.1 ! misho 128267: pCsr->pFilter = pFilter;
! 128268: return fts3SegReaderStart(p, pCsr, pFilter->zTerm, pFilter->nTerm);
! 128269: }
1.2 misho 128270:
1.2.2.1 ! misho 128271: SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart(
! 128272: Fts3Table *p, /* Virtual table handle */
! 128273: Fts3MultiSegReader *pCsr, /* Cursor object */
! 128274: int iCol, /* Column to match on. */
! 128275: const char *zTerm, /* Term to iterate through a doclist for */
! 128276: int nTerm /* Number of bytes in zTerm */
! 128277: ){
! 128278: int i;
! 128279: int rc;
! 128280: int nSegment = pCsr->nSegment;
! 128281: int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
! 128282: p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
! 128283: );
1.2 misho 128284:
1.2.2.1 ! misho 128285: assert( pCsr->pFilter==0 );
! 128286: assert( zTerm && nTerm>0 );
! 128287:
! 128288: /* Advance each segment iterator until it points to the term zTerm/nTerm. */
! 128289: rc = fts3SegReaderStart(p, pCsr, zTerm, nTerm);
! 128290: if( rc!=SQLITE_OK ) return rc;
! 128291:
! 128292: /* Determine how many of the segments actually point to zTerm/nTerm. */
! 128293: for(i=0; i<nSegment; i++){
! 128294: Fts3SegReader *pSeg = pCsr->apSegment[i];
! 128295: if( !pSeg->aNode || fts3SegReaderTermCmp(pSeg, zTerm, nTerm) ){
! 128296: break;
1.2 misho 128297: }
128298: }
1.2.2.1 ! misho 128299: pCsr->nAdvance = i;
1.2 misho 128300:
1.2.2.1 ! misho 128301: /* Advance each of the segments to point to the first docid. */
! 128302: for(i=0; i<pCsr->nAdvance; i++){
! 128303: rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]);
! 128304: if( rc!=SQLITE_OK ) return rc;
1.2 misho 128305: }
1.2.2.1 ! misho 128306: fts3SegReaderSort(pCsr->apSegment, i, i, xCmp);
! 128307:
! 128308: assert( iCol<0 || iCol<p->nColumn );
! 128309: pCsr->iColFilter = iCol;
! 128310:
! 128311: return SQLITE_OK;
1.2 misho 128312: }
128313:
1.2.2.1 ! misho 128314: /*
! 128315: ** This function is called on a MultiSegReader that has been started using
! 128316: ** sqlite3Fts3MsrIncrStart(). One or more calls to MsrIncrNext() may also
! 128317: ** have been made. Calling this function puts the MultiSegReader in such
! 128318: ** a state that if the next two calls are:
! 128319: **
! 128320: ** sqlite3Fts3SegReaderStart()
! 128321: ** sqlite3Fts3SegReaderStep()
! 128322: **
! 128323: ** then the entire doclist for the term is available in
! 128324: ** MultiSegReader.aDoclist/nDoclist.
1.2 misho 128325: */
1.2.2.1 ! misho 128326: SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){
! 128327: int i; /* Used to iterate through segment-readers */
! 128328:
! 128329: assert( pCsr->zTerm==0 );
! 128330: assert( pCsr->nTerm==0 );
! 128331: assert( pCsr->aDoclist==0 );
! 128332: assert( pCsr->nDoclist==0 );
! 128333:
! 128334: pCsr->nAdvance = 0;
! 128335: pCsr->bRestart = 1;
! 128336: for(i=0; i<pCsr->nSegment; i++){
! 128337: pCsr->apSegment[i]->pOffsetList = 0;
! 128338: pCsr->apSegment[i]->nOffsetList = 0;
! 128339: pCsr->apSegment[i]->iDocid = 0;
1.2 misho 128340: }
1.2.2.1 ! misho 128341:
! 128342: return SQLITE_OK;
1.2 misho 128343: }
128344:
1.2.2.1 ! misho 128345:
! 128346: SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(
1.2 misho 128347: Fts3Table *p, /* Virtual table handle */
1.2.2.1 ! misho 128348: Fts3MultiSegReader *pCsr /* Cursor object */
1.2 misho 128349: ){
1.2.2.1 ! misho 128350: int rc = SQLITE_OK;
! 128351:
! 128352: int isIgnoreEmpty = (pCsr->pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY);
! 128353: int isRequirePos = (pCsr->pFilter->flags & FTS3_SEGMENT_REQUIRE_POS);
! 128354: int isColFilter = (pCsr->pFilter->flags & FTS3_SEGMENT_COLUMN_FILTER);
! 128355: int isPrefix = (pCsr->pFilter->flags & FTS3_SEGMENT_PREFIX);
! 128356: int isScan = (pCsr->pFilter->flags & FTS3_SEGMENT_SCAN);
! 128357: int isFirst = (pCsr->pFilter->flags & FTS3_SEGMENT_FIRST);
! 128358:
! 128359: Fts3SegReader **apSegment = pCsr->apSegment;
! 128360: int nSegment = pCsr->nSegment;
! 128361: Fts3SegFilter *pFilter = pCsr->pFilter;
! 128362: int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
! 128363: p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
! 128364: );
! 128365:
! 128366: if( pCsr->nSegment==0 ) return SQLITE_OK;
! 128367:
! 128368: do {
! 128369: int nMerge;
! 128370: int i;
! 128371:
! 128372: /* Advance the first pCsr->nAdvance entries in the apSegment[] array
! 128373: ** forward. Then sort the list in order of current term again.
! 128374: */
! 128375: for(i=0; i<pCsr->nAdvance; i++){
! 128376: Fts3SegReader *pSeg = apSegment[i];
! 128377: if( pSeg->bLookup ){
! 128378: fts3SegReaderSetEof(pSeg);
! 128379: }else{
! 128380: rc = fts3SegReaderNext(p, pSeg, 0);
! 128381: }
! 128382: if( rc!=SQLITE_OK ) return rc;
! 128383: }
! 128384: fts3SegReaderSort(apSegment, nSegment, pCsr->nAdvance, fts3SegReaderCmp);
! 128385: pCsr->nAdvance = 0;
! 128386:
! 128387: /* If all the seg-readers are at EOF, we're finished. return SQLITE_OK. */
! 128388: assert( rc==SQLITE_OK );
! 128389: if( apSegment[0]->aNode==0 ) break;
! 128390:
! 128391: pCsr->nTerm = apSegment[0]->nTerm;
! 128392: pCsr->zTerm = apSegment[0]->zTerm;
! 128393:
! 128394: /* If this is a prefix-search, and if the term that apSegment[0] points
! 128395: ** to does not share a suffix with pFilter->zTerm/nTerm, then all
! 128396: ** required callbacks have been made. In this case exit early.
! 128397: **
! 128398: ** Similarly, if this is a search for an exact match, and the first term
! 128399: ** of segment apSegment[0] is not a match, exit early.
! 128400: */
! 128401: if( pFilter->zTerm && !isScan ){
! 128402: if( pCsr->nTerm<pFilter->nTerm
! 128403: || (!isPrefix && pCsr->nTerm>pFilter->nTerm)
! 128404: || memcmp(pCsr->zTerm, pFilter->zTerm, pFilter->nTerm)
! 128405: ){
! 128406: break;
! 128407: }
! 128408: }
! 128409:
! 128410: nMerge = 1;
! 128411: while( nMerge<nSegment
! 128412: && apSegment[nMerge]->aNode
! 128413: && apSegment[nMerge]->nTerm==pCsr->nTerm
! 128414: && 0==memcmp(pCsr->zTerm, apSegment[nMerge]->zTerm, pCsr->nTerm)
! 128415: ){
! 128416: nMerge++;
! 128417: }
! 128418:
! 128419: assert( isIgnoreEmpty || (isRequirePos && !isColFilter) );
! 128420: if( nMerge==1
! 128421: && !isIgnoreEmpty
! 128422: && !isFirst
! 128423: && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0)
! 128424: ){
! 128425: pCsr->nDoclist = apSegment[0]->nDoclist;
! 128426: if( fts3SegReaderIsPending(apSegment[0]) ){
! 128427: rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist);
! 128428: pCsr->aDoclist = pCsr->aBuffer;
! 128429: }else{
! 128430: pCsr->aDoclist = apSegment[0]->aDoclist;
! 128431: }
! 128432: if( rc==SQLITE_OK ) rc = SQLITE_ROW;
! 128433: }else{
! 128434: int nDoclist = 0; /* Size of doclist */
! 128435: sqlite3_int64 iPrev = 0; /* Previous docid stored in doclist */
! 128436:
! 128437: /* The current term of the first nMerge entries in the array
! 128438: ** of Fts3SegReader objects is the same. The doclists must be merged
! 128439: ** and a single term returned with the merged doclist.
! 128440: */
! 128441: for(i=0; i<nMerge; i++){
! 128442: fts3SegReaderFirstDocid(p, apSegment[i]);
! 128443: }
! 128444: fts3SegReaderSort(apSegment, nMerge, nMerge, xCmp);
! 128445: while( apSegment[0]->pOffsetList ){
! 128446: int j; /* Number of segments that share a docid */
! 128447: char *pList;
! 128448: int nList;
! 128449: int nByte;
! 128450: sqlite3_int64 iDocid = apSegment[0]->iDocid;
! 128451: fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList);
! 128452: j = 1;
! 128453: while( j<nMerge
! 128454: && apSegment[j]->pOffsetList
! 128455: && apSegment[j]->iDocid==iDocid
! 128456: ){
! 128457: fts3SegReaderNextDocid(p, apSegment[j], 0, 0);
! 128458: j++;
! 128459: }
! 128460:
! 128461: if( isColFilter ){
! 128462: fts3ColumnFilter(pFilter->iCol, &pList, &nList);
! 128463: }
! 128464:
! 128465: if( !isIgnoreEmpty || nList>0 ){
! 128466:
! 128467: /* Calculate the 'docid' delta value to write into the merged
! 128468: ** doclist. */
! 128469: sqlite3_int64 iDelta;
! 128470: if( p->bDescIdx && nDoclist>0 ){
! 128471: iDelta = iPrev - iDocid;
! 128472: }else{
! 128473: iDelta = iDocid - iPrev;
! 128474: }
! 128475: assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) );
! 128476: assert( nDoclist>0 || iDelta==iDocid );
! 128477:
! 128478: nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0);
! 128479: if( nDoclist+nByte>pCsr->nBuffer ){
! 128480: char *aNew;
! 128481: pCsr->nBuffer = (nDoclist+nByte)*2;
! 128482: aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
! 128483: if( !aNew ){
! 128484: return SQLITE_NOMEM;
! 128485: }
! 128486: pCsr->aBuffer = aNew;
! 128487: }
! 128488:
! 128489: if( isFirst ){
! 128490: char *a = &pCsr->aBuffer[nDoclist];
! 128491: int nWrite;
! 128492:
! 128493: nWrite = sqlite3Fts3FirstFilter(iDelta, pList, nList, a);
! 128494: if( nWrite ){
! 128495: iPrev = iDocid;
! 128496: nDoclist += nWrite;
! 128497: }
! 128498: }else{
! 128499: nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta);
! 128500: iPrev = iDocid;
! 128501: if( isRequirePos ){
! 128502: memcpy(&pCsr->aBuffer[nDoclist], pList, nList);
! 128503: nDoclist += nList;
! 128504: pCsr->aBuffer[nDoclist++] = '\0';
! 128505: }
! 128506: }
! 128507: }
! 128508:
! 128509: fts3SegReaderSort(apSegment, nMerge, j, xCmp);
! 128510: }
! 128511: if( nDoclist>0 ){
! 128512: pCsr->aDoclist = pCsr->aBuffer;
! 128513: pCsr->nDoclist = nDoclist;
! 128514: rc = SQLITE_ROW;
! 128515: }
! 128516: }
! 128517: pCsr->nAdvance = nMerge;
! 128518: }while( rc==SQLITE_OK );
! 128519:
1.2 misho 128520: return rc;
128521: }
128522:
1.2.2.1 ! misho 128523:
! 128524: SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(
! 128525: Fts3MultiSegReader *pCsr /* Cursor object */
1.2 misho 128526: ){
1.2.2.1 ! misho 128527: if( pCsr ){
! 128528: int i;
! 128529: for(i=0; i<pCsr->nSegment; i++){
! 128530: sqlite3Fts3SegReaderFree(pCsr->apSegment[i]);
! 128531: }
! 128532: sqlite3_free(pCsr->apSegment);
! 128533: sqlite3_free(pCsr->aBuffer);
! 128534:
! 128535: pCsr->nSegment = 0;
! 128536: pCsr->apSegment = 0;
! 128537: pCsr->aBuffer = 0;
! 128538: }
1.2 misho 128539: }
128540:
128541: /*
1.2.2.1 ! misho 128542: ** Merge all level iLevel segments in the database into a single
! 128543: ** iLevel+1 segment. Or, if iLevel<0, merge all segments into a
! 128544: ** single segment with a level equal to the numerically largest level
! 128545: ** currently present in the database.
! 128546: **
! 128547: ** If this function is called with iLevel<0, but there is only one
! 128548: ** segment in the database, SQLITE_DONE is returned immediately.
! 128549: ** Otherwise, if successful, SQLITE_OK is returned. If an error occurs,
! 128550: ** an SQLite error code is returned.
1.2 misho 128551: */
1.2.2.1 ! misho 128552: static int fts3SegmentMerge(
! 128553: Fts3Table *p,
! 128554: int iLangid, /* Language id to merge */
! 128555: int iIndex, /* Index in p->aIndex[] to merge */
! 128556: int iLevel /* Level to merge */
1.2 misho 128557: ){
1.2.2.1 ! misho 128558: int rc; /* Return code */
! 128559: int iIdx = 0; /* Index of new segment */
! 128560: sqlite3_int64 iNewLevel = 0; /* Level/index to create new segment at */
! 128561: SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */
! 128562: Fts3SegFilter filter; /* Segment term filter condition */
! 128563: Fts3MultiSegReader csr; /* Cursor to iterate through level(s) */
! 128564: int bIgnoreEmpty = 0; /* True to ignore empty segments */
1.2 misho 128565:
1.2.2.1 ! misho 128566: assert( iLevel==FTS3_SEGCURSOR_ALL
! 128567: || iLevel==FTS3_SEGCURSOR_PENDING
! 128568: || iLevel>=0
! 128569: );
! 128570: assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
! 128571: assert( iIndex>=0 && iIndex<p->nIndex );
1.2 misho 128572:
1.2.2.1 ! misho 128573: rc = sqlite3Fts3SegReaderCursor(p, iLangid, iIndex, iLevel, 0, 0, 1, 0, &csr);
! 128574: if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished;
1.2 misho 128575:
1.2.2.1 ! misho 128576: if( iLevel==FTS3_SEGCURSOR_ALL ){
! 128577: /* This call is to merge all segments in the database to a single
! 128578: ** segment. The level of the new segment is equal to the numerically
! 128579: ** greatest segment level currently present in the database for this
! 128580: ** index. The idx of the new segment is always 0. */
! 128581: if( csr.nSegment==1 ){
! 128582: rc = SQLITE_DONE;
! 128583: goto finished;
! 128584: }
! 128585: rc = fts3SegmentMaxLevel(p, iLangid, iIndex, &iNewLevel);
! 128586: bIgnoreEmpty = 1;
1.2 misho 128587:
1.2.2.1 ! misho 128588: }else if( iLevel==FTS3_SEGCURSOR_PENDING ){
! 128589: iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, 0);
! 128590: rc = fts3AllocateSegdirIdx(p, iLangid, iIndex, 0, &iIdx);
! 128591: }else{
! 128592: /* This call is to merge all segments at level iLevel. find the next
! 128593: ** available segment index at level iLevel+1. The call to
! 128594: ** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to
! 128595: ** a single iLevel+2 segment if necessary. */
! 128596: rc = fts3AllocateSegdirIdx(p, iLangid, iIndex, iLevel+1, &iIdx);
! 128597: iNewLevel = getAbsoluteLevel(p, iLangid, iIndex, iLevel+1);
! 128598: }
! 128599: if( rc!=SQLITE_OK ) goto finished;
! 128600: assert( csr.nSegment>0 );
! 128601: assert( iNewLevel>=getAbsoluteLevel(p, iLangid, iIndex, 0) );
! 128602: assert( iNewLevel<getAbsoluteLevel(p, iLangid, iIndex,FTS3_SEGDIR_MAXLEVEL) );
1.2 misho 128603:
1.2.2.1 ! misho 128604: memset(&filter, 0, sizeof(Fts3SegFilter));
! 128605: filter.flags = FTS3_SEGMENT_REQUIRE_POS;
! 128606: filter.flags |= (bIgnoreEmpty ? FTS3_SEGMENT_IGNORE_EMPTY : 0);
1.2 misho 128607:
1.2.2.1 ! misho 128608: rc = sqlite3Fts3SegReaderStart(p, &csr, &filter);
! 128609: while( SQLITE_OK==rc ){
! 128610: rc = sqlite3Fts3SegReaderStep(p, &csr);
! 128611: if( rc!=SQLITE_ROW ) break;
! 128612: rc = fts3SegWriterAdd(p, &pWriter, 1,
! 128613: csr.zTerm, csr.nTerm, csr.aDoclist, csr.nDoclist);
! 128614: }
! 128615: if( rc!=SQLITE_OK ) goto finished;
! 128616: assert( pWriter );
1.2 misho 128617:
1.2.2.1 ! misho 128618: if( iLevel!=FTS3_SEGCURSOR_PENDING ){
! 128619: rc = fts3DeleteSegdir(
! 128620: p, iLangid, iIndex, iLevel, csr.apSegment, csr.nSegment
! 128621: );
! 128622: if( rc!=SQLITE_OK ) goto finished;
1.2 misho 128623: }
1.2.2.1 ! misho 128624: rc = fts3SegWriterFlush(p, pWriter, iNewLevel, iIdx);
1.2 misho 128625:
1.2.2.1 ! misho 128626: finished:
! 128627: fts3SegWriterFree(pWriter);
! 128628: sqlite3Fts3SegReaderFinish(&csr);
! 128629: return rc;
! 128630: }
! 128631:
! 128632:
! 128633: /*
! 128634: ** Flush the contents of pendingTerms to level 0 segments.
! 128635: */
! 128636: SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){
! 128637: int rc = SQLITE_OK;
! 128638: int i;
! 128639:
! 128640: for(i=0; rc==SQLITE_OK && i<p->nIndex; i++){
! 128641: rc = fts3SegmentMerge(p, p->iPrevLangid, i, FTS3_SEGCURSOR_PENDING);
! 128642: if( rc==SQLITE_DONE ) rc = SQLITE_OK;
1.2 misho 128643: }
1.2.2.1 ! misho 128644: sqlite3Fts3PendingTermsClear(p);
1.2 misho 128645:
1.2.2.1 ! misho 128646: /* Determine the auto-incr-merge setting if unknown. If enabled,
! 128647: ** estimate the number of leaf blocks of content to be written
! 128648: */
! 128649: if( rc==SQLITE_OK && p->bHasStat
! 128650: && p->bAutoincrmerge==0xff && p->nLeafAdd>0
! 128651: ){
! 128652: sqlite3_stmt *pStmt = 0;
! 128653: rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0);
! 128654: if( rc==SQLITE_OK ){
! 128655: sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE);
! 128656: rc = sqlite3_step(pStmt);
! 128657: p->bAutoincrmerge = (rc==SQLITE_ROW && sqlite3_column_int(pStmt, 0));
! 128658: rc = sqlite3_reset(pStmt);
1.2 misho 128659: }
128660: }
128661: return rc;
128662: }
128663:
128664: /*
1.2.2.1 ! misho 128665: ** Encode N integers as varints into a blob.
1.2 misho 128666: */
1.2.2.1 ! misho 128667: static void fts3EncodeIntArray(
! 128668: int N, /* The number of integers to encode */
! 128669: u32 *a, /* The integer values */
! 128670: char *zBuf, /* Write the BLOB here */
! 128671: int *pNBuf /* Write number of bytes if zBuf[] used here */
1.2 misho 128672: ){
1.2.2.1 ! misho 128673: int i, j;
! 128674: for(i=j=0; i<N; i++){
! 128675: j += sqlite3Fts3PutVarint(&zBuf[j], (sqlite3_int64)a[i]);
! 128676: }
! 128677: *pNBuf = j;
1.2 misho 128678: }
128679:
128680: /*
1.2.2.1 ! misho 128681: ** Decode a blob of varints into N integers
1.2 misho 128682: */
1.2.2.1 ! misho 128683: static void fts3DecodeIntArray(
! 128684: int N, /* The number of integers to decode */
! 128685: u32 *a, /* Write the integer values */
! 128686: const char *zBuf, /* The BLOB containing the varints */
! 128687: int nBuf /* size of the BLOB */
1.2 misho 128688: ){
1.2.2.1 ! misho 128689: int i, j;
! 128690: UNUSED_PARAMETER(nBuf);
! 128691: for(i=j=0; i<N; i++){
! 128692: sqlite3_int64 x;
! 128693: j += sqlite3Fts3GetVarint(&zBuf[j], &x);
! 128694: assert(j<=nBuf);
! 128695: a[i] = (u32)(x & 0xffffffff);
1.2 misho 128696: }
128697: }
128698:
128699: /*
1.2.2.1 ! misho 128700: ** Insert the sizes (in tokens) for each column of the document
! 128701: ** with docid equal to p->iPrevDocid. The sizes are encoded as
! 128702: ** a blob of varints.
1.2 misho 128703: */
1.2.2.1 ! misho 128704: static void fts3InsertDocsize(
! 128705: int *pRC, /* Result code */
! 128706: Fts3Table *p, /* Table into which to insert */
! 128707: u32 *aSz /* Sizes of each column, in tokens */
! 128708: ){
! 128709: char *pBlob; /* The BLOB encoding of the document size */
! 128710: int nBlob; /* Number of bytes in the BLOB */
! 128711: sqlite3_stmt *pStmt; /* Statement used to insert the encoding */
! 128712: int rc; /* Result code from subfunctions */
! 128713:
! 128714: if( *pRC ) return;
! 128715: pBlob = sqlite3_malloc( 10*p->nColumn );
! 128716: if( pBlob==0 ){
! 128717: *pRC = SQLITE_NOMEM;
! 128718: return;
! 128719: }
! 128720: fts3EncodeIntArray(p->nColumn, aSz, pBlob, &nBlob);
! 128721: rc = fts3SqlStmt(p, SQL_REPLACE_DOCSIZE, &pStmt, 0);
! 128722: if( rc ){
! 128723: sqlite3_free(pBlob);
! 128724: *pRC = rc;
! 128725: return;
1.2 misho 128726: }
1.2.2.1 ! misho 128727: sqlite3_bind_int64(pStmt, 1, p->iPrevDocid);
! 128728: sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, sqlite3_free);
! 128729: sqlite3_step(pStmt);
! 128730: *pRC = sqlite3_reset(pStmt);
1.2 misho 128731: }
128732:
128733: /*
1.2.2.1 ! misho 128734: ** Record 0 of the %_stat table contains a blob consisting of N varints,
! 128735: ** where N is the number of user defined columns in the fts3 table plus
! 128736: ** two. If nCol is the number of user defined columns, then values of the
! 128737: ** varints are set as follows:
! 128738: **
! 128739: ** Varint 0: Total number of rows in the table.
! 128740: **
! 128741: ** Varint 1..nCol: For each column, the total number of tokens stored in
! 128742: ** the column for all rows of the table.
! 128743: **
! 128744: ** Varint 1+nCol: The total size, in bytes, of all text values in all
! 128745: ** columns of all rows of the table.
1.2 misho 128746: **
128747: */
1.2.2.1 ! misho 128748: static void fts3UpdateDocTotals(
! 128749: int *pRC, /* The result code */
! 128750: Fts3Table *p, /* Table being updated */
! 128751: u32 *aSzIns, /* Size increases */
! 128752: u32 *aSzDel, /* Size decreases */
! 128753: int nChng /* Change in the number of documents */
1.2 misho 128754: ){
1.2.2.1 ! misho 128755: char *pBlob; /* Storage for BLOB written into %_stat */
! 128756: int nBlob; /* Size of BLOB written into %_stat */
! 128757: u32 *a; /* Array of integers that becomes the BLOB */
! 128758: sqlite3_stmt *pStmt; /* Statement for reading and writing */
! 128759: int i; /* Loop counter */
! 128760: int rc; /* Result code from subfunctions */
1.2 misho 128761:
1.2.2.1 ! misho 128762: const int nStat = p->nColumn+2;
1.2 misho 128763:
1.2.2.1 ! misho 128764: if( *pRC ) return;
! 128765: a = sqlite3_malloc( (sizeof(u32)+10)*nStat );
! 128766: if( a==0 ){
! 128767: *pRC = SQLITE_NOMEM;
! 128768: return;
1.2 misho 128769: }
1.2.2.1 ! misho 128770: pBlob = (char*)&a[nStat];
! 128771: rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0);
! 128772: if( rc ){
! 128773: sqlite3_free(a);
! 128774: *pRC = rc;
! 128775: return;
1.2 misho 128776: }
1.2.2.1 ! misho 128777: sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL);
! 128778: if( sqlite3_step(pStmt)==SQLITE_ROW ){
! 128779: fts3DecodeIntArray(nStat, a,
! 128780: sqlite3_column_blob(pStmt, 0),
! 128781: sqlite3_column_bytes(pStmt, 0));
! 128782: }else{
! 128783: memset(a, 0, sizeof(u32)*(nStat) );
1.2 misho 128784: }
1.2.2.1 ! misho 128785: rc = sqlite3_reset(pStmt);
! 128786: if( rc!=SQLITE_OK ){
! 128787: sqlite3_free(a);
! 128788: *pRC = rc;
! 128789: return;
! 128790: }
! 128791: if( nChng<0 && a[0]<(u32)(-nChng) ){
! 128792: a[0] = 0;
! 128793: }else{
! 128794: a[0] += nChng;
! 128795: }
! 128796: for(i=0; i<p->nColumn+1; i++){
! 128797: u32 x = a[i+1];
! 128798: if( x+aSzIns[i] < aSzDel[i] ){
! 128799: x = 0;
! 128800: }else{
! 128801: x = x + aSzIns[i] - aSzDel[i];
! 128802: }
! 128803: a[i+1] = x;
! 128804: }
! 128805: fts3EncodeIntArray(nStat, a, pBlob, &nBlob);
! 128806: rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0);
! 128807: if( rc ){
! 128808: sqlite3_free(a);
! 128809: *pRC = rc;
! 128810: return;
! 128811: }
! 128812: sqlite3_bind_int(pStmt, 1, FTS_STAT_DOCTOTAL);
! 128813: sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC);
! 128814: sqlite3_step(pStmt);
! 128815: *pRC = sqlite3_reset(pStmt);
! 128816: sqlite3_free(a);
! 128817: }
1.2 misho 128818:
1.2.2.1 ! misho 128819: /*
! 128820: ** Merge the entire database so that there is one segment for each
! 128821: ** iIndex/iLangid combination.
! 128822: */
! 128823: static int fts3DoOptimize(Fts3Table *p, int bReturnDone){
! 128824: int bSeenDone = 0;
! 128825: int rc;
! 128826: sqlite3_stmt *pAllLangid = 0;
1.2 misho 128827:
1.2.2.1 ! misho 128828: rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0);
! 128829: if( rc==SQLITE_OK ){
! 128830: int rc2;
! 128831: sqlite3_bind_int(pAllLangid, 1, p->nIndex);
! 128832: while( sqlite3_step(pAllLangid)==SQLITE_ROW ){
! 128833: int i;
! 128834: int iLangid = sqlite3_column_int(pAllLangid, 0);
! 128835: for(i=0; rc==SQLITE_OK && i<p->nIndex; i++){
! 128836: rc = fts3SegmentMerge(p, iLangid, i, FTS3_SEGCURSOR_ALL);
! 128837: if( rc==SQLITE_DONE ){
! 128838: bSeenDone = 1;
! 128839: rc = SQLITE_OK;
! 128840: }
1.2 misho 128841: }
128842: }
1.2.2.1 ! misho 128843: rc2 = sqlite3_reset(pAllLangid);
! 128844: if( rc==SQLITE_OK ) rc = rc2;
1.2 misho 128845: }
128846:
1.2.2.1 ! misho 128847: sqlite3Fts3SegmentsClose(p);
! 128848: sqlite3Fts3PendingTermsClear(p);
! 128849:
! 128850: return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc;
1.2 misho 128851: }
128852:
128853: /*
1.2.2.1 ! misho 128854: ** This function is called when the user executes the following statement:
! 128855: **
! 128856: ** INSERT INTO <tbl>(<tbl>) VALUES('rebuild');
! 128857: **
! 128858: ** The entire FTS index is discarded and rebuilt. If the table is one
! 128859: ** created using the content=xxx option, then the new index is based on
! 128860: ** the current contents of the xxx table. Otherwise, it is rebuilt based
! 128861: ** on the contents of the %_content table.
1.2 misho 128862: */
1.2.2.1 ! misho 128863: static int fts3DoRebuild(Fts3Table *p){
! 128864: int rc; /* Return Code */
1.2 misho 128865:
1.2.2.1 ! misho 128866: rc = fts3DeleteAll(p, 0);
! 128867: if( rc==SQLITE_OK ){
! 128868: u32 *aSz = 0;
! 128869: u32 *aSzIns = 0;
! 128870: u32 *aSzDel = 0;
! 128871: sqlite3_stmt *pStmt = 0;
! 128872: int nEntry = 0;
! 128873:
! 128874: /* Compose and prepare an SQL statement to loop through the content table */
! 128875: char *zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist);
! 128876: if( !zSql ){
! 128877: rc = SQLITE_NOMEM;
! 128878: }else{
! 128879: rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
! 128880: sqlite3_free(zSql);
1.2 misho 128881: }
1.2.2.1 ! misho 128882:
1.2 misho 128883: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 128884: int nByte = sizeof(u32) * (p->nColumn+1)*3;
! 128885: aSz = (u32 *)sqlite3_malloc(nByte);
! 128886: if( aSz==0 ){
! 128887: rc = SQLITE_NOMEM;
! 128888: }else{
! 128889: memset(aSz, 0, nByte);
! 128890: aSzIns = &aSz[p->nColumn+1];
! 128891: aSzDel = &aSzIns[p->nColumn+1];
! 128892: }
! 128893: }
! 128894:
! 128895: while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
! 128896: int iCol;
! 128897: int iLangid = langidFromSelect(p, pStmt);
! 128898: rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pStmt, 0));
! 128899: memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1));
! 128900: for(iCol=0; rc==SQLITE_OK && iCol<p->nColumn; iCol++){
! 128901: const char *z = (const char *) sqlite3_column_text(pStmt, iCol+1);
! 128902: rc = fts3PendingTermsAdd(p, iLangid, z, iCol, &aSz[iCol]);
! 128903: aSz[p->nColumn] += sqlite3_column_bytes(pStmt, iCol+1);
! 128904: }
! 128905: if( p->bHasDocsize ){
! 128906: fts3InsertDocsize(&rc, p, aSz);
! 128907: }
! 128908: if( rc!=SQLITE_OK ){
! 128909: sqlite3_finalize(pStmt);
! 128910: pStmt = 0;
! 128911: }else{
! 128912: nEntry++;
! 128913: for(iCol=0; iCol<=p->nColumn; iCol++){
! 128914: aSzIns[iCol] += aSz[iCol];
! 128915: }
! 128916: }
! 128917: }
! 128918: if( p->bFts4 ){
! 128919: fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nEntry);
! 128920: }
! 128921: sqlite3_free(aSz);
! 128922:
! 128923: if( pStmt ){
! 128924: int rc2 = sqlite3_finalize(pStmt);
! 128925: if( rc==SQLITE_OK ){
! 128926: rc = rc2;
! 128927: }
1.2 misho 128928: }
128929: }
1.2.2.1 ! misho 128930:
1.2 misho 128931: return rc;
128932: }
128933:
128934:
128935: /*
1.2.2.1 ! misho 128936: ** This function opens a cursor used to read the input data for an
! 128937: ** incremental merge operation. Specifically, it opens a cursor to scan
! 128938: ** the oldest nSeg segments (idx=0 through idx=(nSeg-1)) in absolute
! 128939: ** level iAbsLevel.
1.2 misho 128940: */
1.2.2.1 ! misho 128941: static int fts3IncrmergeCsr(
! 128942: Fts3Table *p, /* FTS3 table handle */
! 128943: sqlite3_int64 iAbsLevel, /* Absolute level to open */
! 128944: int nSeg, /* Number of segments to merge */
! 128945: Fts3MultiSegReader *pCsr /* Cursor object to populate */
! 128946: ){
! 128947: int rc; /* Return Code */
! 128948: sqlite3_stmt *pStmt = 0; /* Statement used to read %_segdir entry */
! 128949: int nByte; /* Bytes allocated at pCsr->apSegment[] */
! 128950:
! 128951: /* Allocate space for the Fts3MultiSegReader.aCsr[] array */
! 128952: memset(pCsr, 0, sizeof(*pCsr));
! 128953: nByte = sizeof(Fts3SegReader *) * nSeg;
! 128954: pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc(nByte);
! 128955:
! 128956: if( pCsr->apSegment==0 ){
! 128957: rc = SQLITE_NOMEM;
1.2 misho 128958: }else{
1.2.2.1 ! misho 128959: memset(pCsr->apSegment, 0, nByte);
! 128960: rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0);
! 128961: }
! 128962: if( rc==SQLITE_OK ){
! 128963: int i;
! 128964: int rc2;
! 128965: sqlite3_bind_int64(pStmt, 1, iAbsLevel);
! 128966: assert( pCsr->nSegment==0 );
! 128967: for(i=0; rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW && i<nSeg; i++){
! 128968: rc = sqlite3Fts3SegReaderNew(i, 0,
! 128969: sqlite3_column_int64(pStmt, 1), /* segdir.start_block */
! 128970: sqlite3_column_int64(pStmt, 2), /* segdir.leaves_end_block */
! 128971: sqlite3_column_int64(pStmt, 3), /* segdir.end_block */
! 128972: sqlite3_column_blob(pStmt, 4), /* segdir.root */
! 128973: sqlite3_column_bytes(pStmt, 4), /* segdir.root */
! 128974: &pCsr->apSegment[i]
! 128975: );
! 128976: pCsr->nSegment++;
1.2 misho 128977: }
1.2.2.1 ! misho 128978: rc2 = sqlite3_reset(pStmt);
! 128979: if( rc==SQLITE_OK ) rc = rc2;
1.2 misho 128980: }
1.2.2.1 ! misho 128981:
1.2 misho 128982: return rc;
128983: }
128984:
1.2.2.1 ! misho 128985: typedef struct IncrmergeWriter IncrmergeWriter;
! 128986: typedef struct NodeWriter NodeWriter;
! 128987: typedef struct Blob Blob;
! 128988: typedef struct NodeReader NodeReader;
! 128989:
1.2 misho 128990: /*
1.2.2.1 ! misho 128991: ** An instance of the following structure is used as a dynamic buffer
! 128992: ** to build up nodes or other blobs of data in.
1.2 misho 128993: **
1.2.2.1 ! misho 128994: ** The function blobGrowBuffer() is used to extend the allocation.
1.2 misho 128995: */
1.2.2.1 ! misho 128996: struct Blob {
! 128997: char *a; /* Pointer to allocation */
! 128998: int n; /* Number of valid bytes of data in a[] */
! 128999: int nAlloc; /* Allocated size of a[] (nAlloc>=n) */
! 129000: };
1.2 misho 129001:
1.2.2.1 ! misho 129002: /*
! 129003: ** This structure is used to build up buffers containing segment b-tree
! 129004: ** nodes (blocks).
! 129005: */
! 129006: struct NodeWriter {
! 129007: sqlite3_int64 iBlock; /* Current block id */
! 129008: Blob key; /* Last key written to the current block */
! 129009: Blob block; /* Current block image */
! 129010: };
1.2 misho 129011:
129012: /*
1.2.2.1 ! misho 129013: ** An object of this type contains the state required to create or append
! 129014: ** to an appendable b-tree segment.
! 129015: */
! 129016: struct IncrmergeWriter {
! 129017: int nLeafEst; /* Space allocated for leaf blocks */
! 129018: int nWork; /* Number of leaf pages flushed */
! 129019: sqlite3_int64 iAbsLevel; /* Absolute level of input segments */
! 129020: int iIdx; /* Index of *output* segment in iAbsLevel+1 */
! 129021: sqlite3_int64 iStart; /* Block number of first allocated block */
! 129022: sqlite3_int64 iEnd; /* Block number of last allocated block */
! 129023: NodeWriter aNodeWriter[FTS_MAX_APPENDABLE_HEIGHT];
! 129024: };
! 129025:
! 129026: /*
! 129027: ** An object of the following type is used to read data from a single
! 129028: ** FTS segment node. See the following functions:
1.2 misho 129029: **
1.2.2.1 ! misho 129030: ** nodeReaderInit()
! 129031: ** nodeReaderNext()
! 129032: ** nodeReaderRelease()
1.2 misho 129033: */
1.2.2.1 ! misho 129034: struct NodeReader {
! 129035: const char *aNode;
! 129036: int nNode;
! 129037: int iOff; /* Current offset within aNode[] */
1.2 misho 129038:
1.2.2.1 ! misho 129039: /* Output variables. Containing the current node entry. */
! 129040: sqlite3_int64 iChild; /* Pointer to child node */
! 129041: Blob term; /* Current term */
! 129042: const char *aDoclist; /* Pointer to doclist */
! 129043: int nDoclist; /* Size of doclist in bytes */
! 129044: };
! 129045:
! 129046: /*
! 129047: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
! 129048: ** Otherwise, if the allocation at pBlob->a is not already at least nMin
! 129049: ** bytes in size, extend (realloc) it to be so.
! 129050: **
! 129051: ** If an OOM error occurs, set *pRc to SQLITE_NOMEM and leave pBlob->a
! 129052: ** unmodified. Otherwise, if the allocation succeeds, update pBlob->nAlloc
! 129053: ** to reflect the new size of the pBlob->a[] buffer.
! 129054: */
! 129055: static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){
! 129056: if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){
! 129057: int nAlloc = nMin;
! 129058: char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc);
! 129059: if( a ){
! 129060: pBlob->nAlloc = nAlloc;
! 129061: pBlob->a = a;
! 129062: }else{
! 129063: *pRc = SQLITE_NOMEM;
1.2 misho 129064: }
129065: }
1.2.2.1 ! misho 129066: }
1.2 misho 129067:
1.2.2.1 ! misho 129068: /*
! 129069: ** Attempt to advance the node-reader object passed as the first argument to
! 129070: ** the next entry on the node.
! 129071: **
! 129072: ** Return an error code if an error occurs (SQLITE_NOMEM is possible).
! 129073: ** Otherwise return SQLITE_OK. If there is no next entry on the node
! 129074: ** (e.g. because the current entry is the last) set NodeReader->aNode to
! 129075: ** NULL to indicate EOF. Otherwise, populate the NodeReader structure output
! 129076: ** variables for the new entry.
! 129077: */
! 129078: static int nodeReaderNext(NodeReader *p){
! 129079: int bFirst = (p->term.n==0); /* True for first term on the node */
! 129080: int nPrefix = 0; /* Bytes to copy from previous term */
! 129081: int nSuffix = 0; /* Bytes to append to the prefix */
! 129082: int rc = SQLITE_OK; /* Return code */
! 129083:
! 129084: assert( p->aNode );
! 129085: if( p->iChild && bFirst==0 ) p->iChild++;
! 129086: if( p->iOff>=p->nNode ){
! 129087: /* EOF */
! 129088: p->aNode = 0;
1.2 misho 129089: }else{
1.2.2.1 ! misho 129090: if( bFirst==0 ){
! 129091: p->iOff += sqlite3Fts3GetVarint32(&p->aNode[p->iOff], &nPrefix);
! 129092: }
! 129093: p->iOff += sqlite3Fts3GetVarint32(&p->aNode[p->iOff], &nSuffix);
! 129094:
! 129095: blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc);
1.2 misho 129096: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 129097: memcpy(&p->term.a[nPrefix], &p->aNode[p->iOff], nSuffix);
! 129098: p->term.n = nPrefix+nSuffix;
! 129099: p->iOff += nSuffix;
! 129100: if( p->iChild==0 ){
! 129101: p->iOff += sqlite3Fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist);
! 129102: p->aDoclist = &p->aNode[p->iOff];
! 129103: p->iOff += p->nDoclist;
! 129104: }
1.2 misho 129105: }
129106: }
129107:
1.2.2.1 ! misho 129108: assert( p->iOff<=p->nNode );
1.2 misho 129109:
129110: return rc;
129111: }
129112:
129113: /*
1.2.2.1 ! misho 129114: ** Release all dynamic resources held by node-reader object *p.
1.2 misho 129115: */
1.2.2.1 ! misho 129116: static void nodeReaderRelease(NodeReader *p){
! 129117: sqlite3_free(p->term.a);
1.2 misho 129118: }
129119:
129120: /*
1.2.2.1 ! misho 129121: ** Initialize a node-reader object to read the node in buffer aNode/nNode.
1.2 misho 129122: **
1.2.2.1 ! misho 129123: ** If successful, SQLITE_OK is returned and the NodeReader object set to
! 129124: ** point to the first entry on the node (if any). Otherwise, an SQLite
! 129125: ** error code is returned.
1.2 misho 129126: */
1.2.2.1 ! misho 129127: static int nodeReaderInit(NodeReader *p, const char *aNode, int nNode){
! 129128: memset(p, 0, sizeof(NodeReader));
! 129129: p->aNode = aNode;
! 129130: p->nNode = nNode;
! 129131:
! 129132: /* Figure out if this is a leaf or an internal node. */
! 129133: if( p->aNode[0] ){
! 129134: /* An internal node. */
! 129135: p->iOff = 1 + sqlite3Fts3GetVarint(&p->aNode[1], &p->iChild);
! 129136: }else{
! 129137: p->iOff = 1;
1.2 misho 129138: }
129139:
1.2.2.1 ! misho 129140: return nodeReaderNext(p);
1.2 misho 129141: }
129142:
1.2.2.1 ! misho 129143: /*
! 129144: ** This function is called while writing an FTS segment each time a leaf o
! 129145: ** node is finished and written to disk. The key (zTerm/nTerm) is guaranteed
! 129146: ** to be greater than the largest key on the node just written, but smaller
! 129147: ** than or equal to the first key that will be written to the next leaf
! 129148: ** node.
! 129149: **
! 129150: ** The block id of the leaf node just written to disk may be found in
! 129151: ** (pWriter->aNodeWriter[0].iBlock) when this function is called.
! 129152: */
! 129153: static int fts3IncrmergePush(
! 129154: Fts3Table *p, /* Fts3 table handle */
! 129155: IncrmergeWriter *pWriter, /* Writer object */
! 129156: const char *zTerm, /* Term to write to internal node */
! 129157: int nTerm /* Bytes at zTerm */
1.2 misho 129158: ){
1.2.2.1 ! misho 129159: sqlite3_int64 iPtr = pWriter->aNodeWriter[0].iBlock;
! 129160: int iLayer;
1.2 misho 129161:
1.2.2.1 ! misho 129162: assert( nTerm>0 );
! 129163: for(iLayer=1; ALWAYS(iLayer<FTS_MAX_APPENDABLE_HEIGHT); iLayer++){
! 129164: sqlite3_int64 iNextPtr = 0;
! 129165: NodeWriter *pNode = &pWriter->aNodeWriter[iLayer];
! 129166: int rc = SQLITE_OK;
! 129167: int nPrefix;
! 129168: int nSuffix;
! 129169: int nSpace;
! 129170:
! 129171: /* Figure out how much space the key will consume if it is written to
! 129172: ** the current node of layer iLayer. Due to the prefix compression,
! 129173: ** the space required changes depending on which node the key is to
! 129174: ** be added to. */
! 129175: nPrefix = fts3PrefixCompress(pNode->key.a, pNode->key.n, zTerm, nTerm);
! 129176: nSuffix = nTerm - nPrefix;
! 129177: nSpace = sqlite3Fts3VarintLen(nPrefix);
! 129178: nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix;
! 129179:
! 129180: if( pNode->key.n==0 || (pNode->block.n + nSpace)<=p->nNodeSize ){
! 129181: /* If the current node of layer iLayer contains zero keys, or if adding
! 129182: ** the key to it will not cause it to grow to larger than nNodeSize
! 129183: ** bytes in size, write the key here. */
! 129184:
! 129185: Blob *pBlk = &pNode->block;
! 129186: if( pBlk->n==0 ){
! 129187: blobGrowBuffer(pBlk, p->nNodeSize, &rc);
! 129188: if( rc==SQLITE_OK ){
! 129189: pBlk->a[0] = (char)iLayer;
! 129190: pBlk->n = 1 + sqlite3Fts3PutVarint(&pBlk->a[1], iPtr);
! 129191: }
! 129192: }
! 129193: blobGrowBuffer(pBlk, pBlk->n + nSpace, &rc);
! 129194: blobGrowBuffer(&pNode->key, nTerm, &rc);
1.2 misho 129195:
1.2.2.1 ! misho 129196: if( rc==SQLITE_OK ){
! 129197: if( pNode->key.n ){
! 129198: pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix);
! 129199: }
! 129200: pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix);
! 129201: memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix);
! 129202: pBlk->n += nSuffix;
1.2 misho 129203:
1.2.2.1 ! misho 129204: memcpy(pNode->key.a, zTerm, nTerm);
! 129205: pNode->key.n = nTerm;
1.2 misho 129206: }
1.2.2.1 ! misho 129207: }else{
! 129208: /* Otherwise, flush the current node of layer iLayer to disk.
! 129209: ** Then allocate a new, empty sibling node. The key will be written
! 129210: ** into the parent of this node. */
! 129211: rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n);
1.2 misho 129212:
1.2.2.1 ! misho 129213: assert( pNode->block.nAlloc>=p->nNodeSize );
! 129214: pNode->block.a[0] = (char)iLayer;
! 129215: pNode->block.n = 1 + sqlite3Fts3PutVarint(&pNode->block.a[1], iPtr+1);
1.2 misho 129216:
1.2.2.1 ! misho 129217: iNextPtr = pNode->iBlock;
! 129218: pNode->iBlock++;
! 129219: pNode->key.n = 0;
1.2 misho 129220: }
1.2.2.1 ! misho 129221:
! 129222: if( rc!=SQLITE_OK || iNextPtr==0 ) return rc;
! 129223: iPtr = iNextPtr;
1.2 misho 129224: }
129225:
1.2.2.1 ! misho 129226: assert( 0 );
! 129227: return 0;
1.2 misho 129228: }
129229:
1.2.2.1 ! misho 129230: /*
! 129231: ** Append a term and (optionally) doclist to the FTS segment node currently
! 129232: ** stored in blob *pNode. The node need not contain any terms, but the
! 129233: ** header must be written before this function is called.
! 129234: **
! 129235: ** A node header is a single 0x00 byte for a leaf node, or a height varint
! 129236: ** followed by the left-hand-child varint for an internal node.
! 129237: **
! 129238: ** The term to be appended is passed via arguments zTerm/nTerm. For a
! 129239: ** leaf node, the doclist is passed as aDoclist/nDoclist. For an internal
! 129240: ** node, both aDoclist and nDoclist must be passed 0.
! 129241: **
! 129242: ** If the size of the value in blob pPrev is zero, then this is the first
! 129243: ** term written to the node. Otherwise, pPrev contains a copy of the
! 129244: ** previous term. Before this function returns, it is updated to contain a
! 129245: ** copy of zTerm/nTerm.
! 129246: **
! 129247: ** It is assumed that the buffer associated with pNode is already large
! 129248: ** enough to accommodate the new entry. The buffer associated with pPrev
! 129249: ** is extended by this function if requrired.
! 129250: **
! 129251: ** If an error (i.e. OOM condition) occurs, an SQLite error code is
! 129252: ** returned. Otherwise, SQLITE_OK.
! 129253: */
! 129254: static int fts3AppendToNode(
! 129255: Blob *pNode, /* Current node image to append to */
! 129256: Blob *pPrev, /* Buffer containing previous term written */
! 129257: const char *zTerm, /* New term to write */
! 129258: int nTerm, /* Size of zTerm in bytes */
! 129259: const char *aDoclist, /* Doclist (or NULL) to write */
! 129260: int nDoclist /* Size of aDoclist in bytes */
1.2 misho 129261: ){
1.2.2.1 ! misho 129262: int rc = SQLITE_OK; /* Return code */
! 129263: int bFirst = (pPrev->n==0); /* True if this is the first term written */
! 129264: int nPrefix; /* Size of term prefix in bytes */
! 129265: int nSuffix; /* Size of term suffix in bytes */
1.2 misho 129266:
1.2.2.1 ! misho 129267: /* Node must have already been started. There must be a doclist for a
! 129268: ** leaf node, and there must not be a doclist for an internal node. */
! 129269: assert( pNode->n>0 );
! 129270: assert( (pNode->a[0]=='\0')==(aDoclist!=0) );
! 129271:
! 129272: blobGrowBuffer(pPrev, nTerm, &rc);
! 129273: if( rc!=SQLITE_OK ) return rc;
! 129274:
! 129275: nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm);
! 129276: nSuffix = nTerm - nPrefix;
! 129277: memcpy(pPrev->a, zTerm, nTerm);
! 129278: pPrev->n = nTerm;
! 129279:
! 129280: if( bFirst==0 ){
! 129281: pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nPrefix);
1.2 misho 129282: }
1.2.2.1 ! misho 129283: pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nSuffix);
! 129284: memcpy(&pNode->a[pNode->n], &zTerm[nPrefix], nSuffix);
! 129285: pNode->n += nSuffix;
1.2 misho 129286:
1.2.2.1 ! misho 129287: if( aDoclist ){
! 129288: pNode->n += sqlite3Fts3PutVarint(&pNode->a[pNode->n], nDoclist);
! 129289: memcpy(&pNode->a[pNode->n], aDoclist, nDoclist);
! 129290: pNode->n += nDoclist;
! 129291: }
1.2 misho 129292:
1.2.2.1 ! misho 129293: assert( pNode->n<=pNode->nAlloc );
! 129294:
! 129295: return SQLITE_OK;
1.2 misho 129296: }
129297:
1.2.2.1 ! misho 129298: /*
! 129299: ** Append the current term and doclist pointed to by cursor pCsr to the
! 129300: ** appendable b-tree segment opened for writing by pWriter.
! 129301: **
! 129302: ** Return SQLITE_OK if successful, or an SQLite error code otherwise.
! 129303: */
! 129304: static int fts3IncrmergeAppend(
! 129305: Fts3Table *p, /* Fts3 table handle */
! 129306: IncrmergeWriter *pWriter, /* Writer object */
! 129307: Fts3MultiSegReader *pCsr /* Cursor containing term and doclist */
1.2 misho 129308: ){
1.2.2.1 ! misho 129309: const char *zTerm = pCsr->zTerm;
! 129310: int nTerm = pCsr->nTerm;
! 129311: const char *aDoclist = pCsr->aDoclist;
! 129312: int nDoclist = pCsr->nDoclist;
! 129313: int rc = SQLITE_OK; /* Return code */
! 129314: int nSpace; /* Total space in bytes required on leaf */
! 129315: int nPrefix; /* Size of prefix shared with previous term */
! 129316: int nSuffix; /* Size of suffix (nTerm - nPrefix) */
! 129317: NodeWriter *pLeaf; /* Object used to write leaf nodes */
! 129318:
! 129319: pLeaf = &pWriter->aNodeWriter[0];
! 129320: nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm);
! 129321: nSuffix = nTerm - nPrefix;
! 129322:
! 129323: nSpace = sqlite3Fts3VarintLen(nPrefix);
! 129324: nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix;
! 129325: nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist;
! 129326:
! 129327: /* If the current block is not empty, and if adding this term/doclist
! 129328: ** to the current block would make it larger than Fts3Table.nNodeSize
! 129329: ** bytes, write this block out to the database. */
! 129330: if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){
! 129331: rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n);
! 129332: pWriter->nWork++;
1.2 misho 129333:
1.2.2.1 ! misho 129334: /* Add the current term to the parent node. The term added to the
! 129335: ** parent must:
! 129336: **
! 129337: ** a) be greater than the largest term on the leaf node just written
! 129338: ** to the database (still available in pLeaf->key), and
! 129339: **
! 129340: ** b) be less than or equal to the term about to be added to the new
! 129341: ** leaf node (zTerm/nTerm).
! 129342: **
! 129343: ** In other words, it must be the prefix of zTerm 1 byte longer than
! 129344: ** the common prefix (if any) of zTerm and pWriter->zTerm.
! 129345: */
! 129346: if( rc==SQLITE_OK ){
! 129347: rc = fts3IncrmergePush(p, pWriter, zTerm, nPrefix+1);
! 129348: }
1.2 misho 129349:
1.2.2.1 ! misho 129350: /* Advance to the next output block */
! 129351: pLeaf->iBlock++;
! 129352: pLeaf->key.n = 0;
! 129353: pLeaf->block.n = 0;
1.2 misho 129354:
1.2.2.1 ! misho 129355: nSuffix = nTerm;
! 129356: nSpace = 1;
! 129357: nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix;
! 129358: nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist;
1.2 misho 129359: }
129360:
1.2.2.1 ! misho 129361: blobGrowBuffer(&pLeaf->block, pLeaf->block.n + nSpace, &rc);
1.2 misho 129362:
1.2.2.1 ! misho 129363: if( rc==SQLITE_OK ){
! 129364: if( pLeaf->block.n==0 ){
! 129365: pLeaf->block.n = 1;
! 129366: pLeaf->block.a[0] = '\0';
! 129367: }
! 129368: rc = fts3AppendToNode(
! 129369: &pLeaf->block, &pLeaf->key, zTerm, nTerm, aDoclist, nDoclist
! 129370: );
! 129371: }
1.2 misho 129372:
1.2.2.1 ! misho 129373: return rc;
1.2 misho 129374: }
129375:
129376: /*
1.2.2.1 ! misho 129377: ** This function is called to release all dynamic resources held by the
! 129378: ** merge-writer object pWriter, and if no error has occurred, to flush
! 129379: ** all outstanding node buffers held by pWriter to disk.
! 129380: **
! 129381: ** If *pRc is not SQLITE_OK when this function is called, then no attempt
! 129382: ** is made to write any data to disk. Instead, this function serves only
! 129383: ** to release outstanding resources.
1.2 misho 129384: **
1.2.2.1 ! misho 129385: ** Otherwise, if *pRc is initially SQLITE_OK and an error occurs while
! 129386: ** flushing buffers to disk, *pRc is set to an SQLite error code before
! 129387: ** returning.
1.2 misho 129388: */
1.2.2.1 ! misho 129389: static void fts3IncrmergeRelease(
! 129390: Fts3Table *p, /* FTS3 table handle */
! 129391: IncrmergeWriter *pWriter, /* Merge-writer object */
! 129392: int *pRc /* IN/OUT: Error code */
! 129393: ){
! 129394: int i; /* Used to iterate through non-root layers */
! 129395: int iRoot; /* Index of root in pWriter->aNodeWriter */
! 129396: NodeWriter *pRoot; /* NodeWriter for root node */
! 129397: int rc = *pRc; /* Error code */
! 129398:
! 129399: /* Set iRoot to the index in pWriter->aNodeWriter[] of the output segment
! 129400: ** root node. If the segment fits entirely on a single leaf node, iRoot
! 129401: ** will be set to 0. If the root node is the parent of the leaves, iRoot
! 129402: ** will be 1. And so on. */
! 129403: for(iRoot=FTS_MAX_APPENDABLE_HEIGHT-1; iRoot>=0; iRoot--){
! 129404: NodeWriter *pNode = &pWriter->aNodeWriter[iRoot];
! 129405: if( pNode->block.n>0 ) break;
! 129406: assert( *pRc || pNode->block.nAlloc==0 );
! 129407: assert( *pRc || pNode->key.nAlloc==0 );
! 129408: sqlite3_free(pNode->block.a);
! 129409: sqlite3_free(pNode->key.a);
! 129410: }
! 129411:
! 129412: /* Empty output segment. This is a no-op. */
! 129413: if( iRoot<0 ) return;
! 129414:
! 129415: /* The entire output segment fits on a single node. Normally, this means
! 129416: ** the node would be stored as a blob in the "root" column of the %_segdir
! 129417: ** table. However, this is not permitted in this case. The problem is that
! 129418: ** space has already been reserved in the %_segments table, and so the
! 129419: ** start_block and end_block fields of the %_segdir table must be populated.
! 129420: ** And, by design or by accident, released versions of FTS cannot handle
! 129421: ** segments that fit entirely on the root node with start_block!=0.
! 129422: **
! 129423: ** Instead, create a synthetic root node that contains nothing but a
! 129424: ** pointer to the single content node. So that the segment consists of a
! 129425: ** single leaf and a single interior (root) node.
! 129426: **
! 129427: ** Todo: Better might be to defer allocating space in the %_segments
! 129428: ** table until we are sure it is needed.
! 129429: */
! 129430: if( iRoot==0 ){
! 129431: Blob *pBlock = &pWriter->aNodeWriter[1].block;
! 129432: blobGrowBuffer(pBlock, 1 + FTS3_VARINT_MAX, &rc);
! 129433: if( rc==SQLITE_OK ){
! 129434: pBlock->a[0] = 0x01;
! 129435: pBlock->n = 1 + sqlite3Fts3PutVarint(
! 129436: &pBlock->a[1], pWriter->aNodeWriter[0].iBlock
! 129437: );
! 129438: }
! 129439: iRoot = 1;
! 129440: }
! 129441: pRoot = &pWriter->aNodeWriter[iRoot];
1.2 misho 129442:
1.2.2.1 ! misho 129443: /* Flush all currently outstanding nodes to disk. */
! 129444: for(i=0; i<iRoot; i++){
! 129445: NodeWriter *pNode = &pWriter->aNodeWriter[i];
! 129446: if( pNode->block.n>0 && rc==SQLITE_OK ){
! 129447: rc = fts3WriteSegment(p, pNode->iBlock, pNode->block.a, pNode->block.n);
! 129448: }
! 129449: sqlite3_free(pNode->block.a);
! 129450: sqlite3_free(pNode->key.a);
! 129451: }
1.2 misho 129452:
1.2.2.1 ! misho 129453: /* Write the %_segdir record. */
! 129454: if( rc==SQLITE_OK ){
! 129455: rc = fts3WriteSegdir(p,
! 129456: pWriter->iAbsLevel+1, /* level */
! 129457: pWriter->iIdx, /* idx */
! 129458: pWriter->iStart, /* start_block */
! 129459: pWriter->aNodeWriter[0].iBlock, /* leaves_end_block */
! 129460: pWriter->iEnd, /* end_block */
! 129461: pRoot->block.a, pRoot->block.n /* root */
! 129462: );
1.2 misho 129463: }
1.2.2.1 ! misho 129464: sqlite3_free(pRoot->block.a);
! 129465: sqlite3_free(pRoot->key.a);
1.2 misho 129466:
1.2.2.1 ! misho 129467: *pRc = rc;
1.2 misho 129468: }
129469:
1.2.2.1 ! misho 129470: /*
! 129471: ** Compare the term in buffer zLhs (size in bytes nLhs) with that in
! 129472: ** zRhs (size in bytes nRhs) using memcmp. If one term is a prefix of
! 129473: ** the other, it is considered to be smaller than the other.
! 129474: **
! 129475: ** Return -ve if zLhs is smaller than zRhs, 0 if it is equal, or +ve
! 129476: ** if it is greater.
! 129477: */
! 129478: static int fts3TermCmp(
! 129479: const char *zLhs, int nLhs, /* LHS of comparison */
! 129480: const char *zRhs, int nRhs /* RHS of comparison */
1.2 misho 129481: ){
1.2.2.1 ! misho 129482: int nCmp = MIN(nLhs, nRhs);
! 129483: int res;
1.2 misho 129484:
1.2.2.1 ! misho 129485: res = memcmp(zLhs, zRhs, nCmp);
! 129486: if( res==0 ) res = nLhs - nRhs;
1.2 misho 129487:
1.2.2.1 ! misho 129488: return res;
! 129489: }
1.2 misho 129490:
129491:
1.2.2.1 ! misho 129492: /*
! 129493: ** Query to see if the entry in the %_segments table with blockid iEnd is
! 129494: ** NULL. If no error occurs and the entry is NULL, set *pbRes 1 before
! 129495: ** returning. Otherwise, set *pbRes to 0.
! 129496: **
! 129497: ** Or, if an error occurs while querying the database, return an SQLite
! 129498: ** error code. The final value of *pbRes is undefined in this case.
! 129499: **
! 129500: ** This is used to test if a segment is an "appendable" segment. If it
! 129501: ** is, then a NULL entry has been inserted into the %_segments table
! 129502: ** with blockid %_segdir.end_block.
! 129503: */
! 129504: static int fts3IsAppendable(Fts3Table *p, sqlite3_int64 iEnd, int *pbRes){
! 129505: int bRes = 0; /* Result to set *pbRes to */
! 129506: sqlite3_stmt *pCheck = 0; /* Statement to query database with */
! 129507: int rc; /* Return code */
1.2 misho 129508:
1.2.2.1 ! misho 129509: rc = fts3SqlStmt(p, SQL_SEGMENT_IS_APPENDABLE, &pCheck, 0);
! 129510: if( rc==SQLITE_OK ){
! 129511: sqlite3_bind_int64(pCheck, 1, iEnd);
! 129512: if( SQLITE_ROW==sqlite3_step(pCheck) ) bRes = 1;
! 129513: rc = sqlite3_reset(pCheck);
! 129514: }
! 129515:
! 129516: *pbRes = bRes;
! 129517: return rc;
! 129518: }
1.2 misho 129519:
1.2.2.1 ! misho 129520: /*
! 129521: ** This function is called when initializing an incremental-merge operation.
! 129522: ** It checks if the existing segment with index value iIdx at absolute level
! 129523: ** (iAbsLevel+1) can be appended to by the incremental merge. If it can, the
! 129524: ** merge-writer object *pWriter is initialized to write to it.
! 129525: **
! 129526: ** An existing segment can be appended to by an incremental merge if:
! 129527: **
! 129528: ** * It was initially created as an appendable segment (with all required
! 129529: ** space pre-allocated), and
! 129530: **
! 129531: ** * The first key read from the input (arguments zKey and nKey) is
! 129532: ** greater than the largest key currently stored in the potential
! 129533: ** output segment.
! 129534: */
! 129535: static int fts3IncrmergeLoad(
! 129536: Fts3Table *p, /* Fts3 table handle */
! 129537: sqlite3_int64 iAbsLevel, /* Absolute level of input segments */
! 129538: int iIdx, /* Index of candidate output segment */
! 129539: const char *zKey, /* First key to write */
! 129540: int nKey, /* Number of bytes in nKey */
! 129541: IncrmergeWriter *pWriter /* Populate this object */
! 129542: ){
! 129543: int rc; /* Return code */
! 129544: sqlite3_stmt *pSelect = 0; /* SELECT to read %_segdir entry */
1.2 misho 129545:
1.2.2.1 ! misho 129546: rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pSelect, 0);
! 129547: if( rc==SQLITE_OK ){
! 129548: sqlite3_int64 iStart = 0; /* Value of %_segdir.start_block */
! 129549: sqlite3_int64 iLeafEnd = 0; /* Value of %_segdir.leaves_end_block */
! 129550: sqlite3_int64 iEnd = 0; /* Value of %_segdir.end_block */
! 129551: const char *aRoot = 0; /* Pointer to %_segdir.root buffer */
! 129552: int nRoot = 0; /* Size of aRoot[] in bytes */
! 129553: int rc2; /* Return code from sqlite3_reset() */
! 129554: int bAppendable = 0; /* Set to true if segment is appendable */
! 129555:
! 129556: /* Read the %_segdir entry for index iIdx absolute level (iAbsLevel+1) */
! 129557: sqlite3_bind_int64(pSelect, 1, iAbsLevel+1);
! 129558: sqlite3_bind_int(pSelect, 2, iIdx);
! 129559: if( sqlite3_step(pSelect)==SQLITE_ROW ){
! 129560: iStart = sqlite3_column_int64(pSelect, 1);
! 129561: iLeafEnd = sqlite3_column_int64(pSelect, 2);
! 129562: iEnd = sqlite3_column_int64(pSelect, 3);
! 129563: nRoot = sqlite3_column_bytes(pSelect, 4);
! 129564: aRoot = sqlite3_column_blob(pSelect, 4);
! 129565: }else{
! 129566: return sqlite3_reset(pSelect);
! 129567: }
! 129568:
! 129569: /* Check for the zero-length marker in the %_segments table */
! 129570: rc = fts3IsAppendable(p, iEnd, &bAppendable);
! 129571:
! 129572: /* Check that zKey/nKey is larger than the largest key the candidate */
! 129573: if( rc==SQLITE_OK && bAppendable ){
! 129574: char *aLeaf = 0;
! 129575: int nLeaf = 0;
1.2 misho 129576:
1.2.2.1 ! misho 129577: rc = sqlite3Fts3ReadBlock(p, iLeafEnd, &aLeaf, &nLeaf, 0);
! 129578: if( rc==SQLITE_OK ){
! 129579: NodeReader reader;
! 129580: for(rc = nodeReaderInit(&reader, aLeaf, nLeaf);
! 129581: rc==SQLITE_OK && reader.aNode;
! 129582: rc = nodeReaderNext(&reader)
1.2 misho 129583: ){
1.2.2.1 ! misho 129584: assert( reader.aNode );
1.2 misho 129585: }
1.2.2.1 ! misho 129586: if( fts3TermCmp(zKey, nKey, reader.term.a, reader.term.n)<=0 ){
! 129587: bAppendable = 0;
1.2 misho 129588: }
1.2.2.1 ! misho 129589: nodeReaderRelease(&reader);
! 129590: }
! 129591: sqlite3_free(aLeaf);
! 129592: }
1.2 misho 129593:
1.2.2.1 ! misho 129594: if( rc==SQLITE_OK && bAppendable ){
! 129595: /* It is possible to append to this segment. Set up the IncrmergeWriter
! 129596: ** object to do so. */
! 129597: int i;
! 129598: int nHeight = (int)aRoot[0];
! 129599: NodeWriter *pNode;
1.2 misho 129600:
1.2.2.1 ! misho 129601: pWriter->nLeafEst = (int)((iEnd - iStart) + 1)/FTS_MAX_APPENDABLE_HEIGHT;
! 129602: pWriter->iStart = iStart;
! 129603: pWriter->iEnd = iEnd;
! 129604: pWriter->iAbsLevel = iAbsLevel;
! 129605: pWriter->iIdx = iIdx;
! 129606:
! 129607: for(i=nHeight+1; i<FTS_MAX_APPENDABLE_HEIGHT; i++){
! 129608: pWriter->aNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst;
! 129609: }
! 129610:
! 129611: pNode = &pWriter->aNodeWriter[nHeight];
! 129612: pNode->iBlock = pWriter->iStart + pWriter->nLeafEst*nHeight;
! 129613: blobGrowBuffer(&pNode->block, MAX(nRoot, p->nNodeSize), &rc);
! 129614: if( rc==SQLITE_OK ){
! 129615: memcpy(pNode->block.a, aRoot, nRoot);
! 129616: pNode->block.n = nRoot;
! 129617: }
1.2 misho 129618:
1.2.2.1 ! misho 129619: for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){
! 129620: NodeReader reader;
! 129621: pNode = &pWriter->aNodeWriter[i];
1.2 misho 129622:
1.2.2.1 ! misho 129623: rc = nodeReaderInit(&reader, pNode->block.a, pNode->block.n);
! 129624: while( reader.aNode && rc==SQLITE_OK ) rc = nodeReaderNext(&reader);
! 129625: blobGrowBuffer(&pNode->key, reader.term.n, &rc);
! 129626: if( rc==SQLITE_OK ){
! 129627: memcpy(pNode->key.a, reader.term.a, reader.term.n);
! 129628: pNode->key.n = reader.term.n;
! 129629: if( i>0 ){
! 129630: char *aBlock = 0;
! 129631: int nBlock = 0;
! 129632: pNode = &pWriter->aNodeWriter[i-1];
! 129633: pNode->iBlock = reader.iChild;
! 129634: rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock, 0);
! 129635: blobGrowBuffer(&pNode->block, MAX(nBlock, p->nNodeSize), &rc);
! 129636: if( rc==SQLITE_OK ){
! 129637: memcpy(pNode->block.a, aBlock, nBlock);
! 129638: pNode->block.n = nBlock;
1.2 misho 129639: }
1.2.2.1 ! misho 129640: sqlite3_free(aBlock);
1.2 misho 129641: }
129642: }
1.2.2.1 ! misho 129643: nodeReaderRelease(&reader);
1.2 misho 129644: }
129645: }
1.2.2.1 ! misho 129646:
! 129647: rc2 = sqlite3_reset(pSelect);
! 129648: if( rc==SQLITE_OK ) rc = rc2;
! 129649: }
1.2 misho 129650:
129651: return rc;
129652: }
129653:
1.2.2.1 ! misho 129654: /*
! 129655: ** Determine the largest segment index value that exists within absolute
! 129656: ** level iAbsLevel+1. If no error occurs, set *piIdx to this value plus
! 129657: ** one before returning SQLITE_OK. Or, if there are no segments at all
! 129658: ** within level iAbsLevel, set *piIdx to zero.
! 129659: **
! 129660: ** If an error occurs, return an SQLite error code. The final value of
! 129661: ** *piIdx is undefined in this case.
! 129662: */
! 129663: static int fts3IncrmergeOutputIdx(
! 129664: Fts3Table *p, /* FTS Table handle */
! 129665: sqlite3_int64 iAbsLevel, /* Absolute index of input segments */
! 129666: int *piIdx /* OUT: Next free index at iAbsLevel+1 */
! 129667: ){
! 129668: int rc;
! 129669: sqlite3_stmt *pOutputIdx = 0; /* SQL used to find output index */
1.2 misho 129670:
1.2.2.1 ! misho 129671: rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pOutputIdx, 0);
! 129672: if( rc==SQLITE_OK ){
! 129673: sqlite3_bind_int64(pOutputIdx, 1, iAbsLevel+1);
! 129674: sqlite3_step(pOutputIdx);
! 129675: *piIdx = sqlite3_column_int(pOutputIdx, 0);
! 129676: rc = sqlite3_reset(pOutputIdx);
! 129677: }
! 129678:
! 129679: return rc;
! 129680: }
! 129681:
! 129682: /*
! 129683: ** Allocate an appendable output segment on absolute level iAbsLevel+1
! 129684: ** with idx value iIdx.
! 129685: **
! 129686: ** In the %_segdir table, a segment is defined by the values in three
! 129687: ** columns:
! 129688: **
! 129689: ** start_block
! 129690: ** leaves_end_block
! 129691: ** end_block
! 129692: **
! 129693: ** When an appendable segment is allocated, it is estimated that the
! 129694: ** maximum number of leaf blocks that may be required is the sum of the
! 129695: ** number of leaf blocks consumed by the input segments, plus the number
! 129696: ** of input segments, multiplied by two. This value is stored in stack
! 129697: ** variable nLeafEst.
! 129698: **
! 129699: ** A total of 16*nLeafEst blocks are allocated when an appendable segment
! 129700: ** is created ((1 + end_block - start_block)==16*nLeafEst). The contiguous
! 129701: ** array of leaf nodes starts at the first block allocated. The array
! 129702: ** of interior nodes that are parents of the leaf nodes start at block
! 129703: ** (start_block + (1 + end_block - start_block) / 16). And so on.
! 129704: **
! 129705: ** In the actual code below, the value "16" is replaced with the
! 129706: ** pre-processor macro FTS_MAX_APPENDABLE_HEIGHT.
! 129707: */
! 129708: static int fts3IncrmergeWriter(
! 129709: Fts3Table *p, /* Fts3 table handle */
! 129710: sqlite3_int64 iAbsLevel, /* Absolute level of input segments */
! 129711: int iIdx, /* Index of new output segment */
! 129712: Fts3MultiSegReader *pCsr, /* Cursor that data will be read from */
! 129713: IncrmergeWriter *pWriter /* Populate this object */
1.2 misho 129714: ){
1.2.2.1 ! misho 129715: int rc; /* Return Code */
! 129716: int i; /* Iterator variable */
! 129717: int nLeafEst = 0; /* Blocks allocated for leaf nodes */
! 129718: sqlite3_stmt *pLeafEst = 0; /* SQL used to determine nLeafEst */
! 129719: sqlite3_stmt *pFirstBlock = 0; /* SQL used to determine first block */
! 129720:
! 129721: /* Calculate nLeafEst. */
! 129722: rc = fts3SqlStmt(p, SQL_MAX_LEAF_NODE_ESTIMATE, &pLeafEst, 0);
! 129723: if( rc==SQLITE_OK ){
! 129724: sqlite3_bind_int64(pLeafEst, 1, iAbsLevel);
! 129725: sqlite3_bind_int64(pLeafEst, 2, pCsr->nSegment);
! 129726: if( SQLITE_ROW==sqlite3_step(pLeafEst) ){
! 129727: nLeafEst = sqlite3_column_int(pLeafEst, 0);
1.2 misho 129728: }
1.2.2.1 ! misho 129729: rc = sqlite3_reset(pLeafEst);
! 129730: }
! 129731: if( rc!=SQLITE_OK ) return rc;
1.2 misho 129732:
1.2.2.1 ! misho 129733: /* Calculate the first block to use in the output segment */
! 129734: rc = fts3SqlStmt(p, SQL_NEXT_SEGMENTS_ID, &pFirstBlock, 0);
! 129735: if( rc==SQLITE_OK ){
! 129736: if( SQLITE_ROW==sqlite3_step(pFirstBlock) ){
! 129737: pWriter->iStart = sqlite3_column_int64(pFirstBlock, 0);
! 129738: pWriter->iEnd = pWriter->iStart - 1;
! 129739: pWriter->iEnd += nLeafEst * FTS_MAX_APPENDABLE_HEIGHT;
! 129740: }
! 129741: rc = sqlite3_reset(pFirstBlock);
! 129742: }
! 129743: if( rc!=SQLITE_OK ) return rc;
! 129744:
! 129745: /* Insert the marker in the %_segments table to make sure nobody tries
! 129746: ** to steal the space just allocated. This is also used to identify
! 129747: ** appendable segments. */
! 129748: rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0);
! 129749: if( rc!=SQLITE_OK ) return rc;
! 129750:
! 129751: pWriter->iAbsLevel = iAbsLevel;
! 129752: pWriter->nLeafEst = nLeafEst;
! 129753: pWriter->iIdx = iIdx;
! 129754:
! 129755: /* Set up the array of NodeWriter objects */
! 129756: for(i=0; i<FTS_MAX_APPENDABLE_HEIGHT; i++){
! 129757: pWriter->aNodeWriter[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst;
1.2 misho 129758: }
1.2.2.1 ! misho 129759: return SQLITE_OK;
1.2 misho 129760: }
129761:
129762: /*
1.2.2.1 ! misho 129763: ** Remove an entry from the %_segdir table. This involves running the
! 129764: ** following two statements:
1.2 misho 129765: **
1.2.2.1 ! misho 129766: ** DELETE FROM %_segdir WHERE level = :iAbsLevel AND idx = :iIdx
! 129767: ** UPDATE %_segdir SET idx = idx - 1 WHERE level = :iAbsLevel AND idx > :iIdx
! 129768: **
! 129769: ** The DELETE statement removes the specific %_segdir level. The UPDATE
! 129770: ** statement ensures that the remaining segments have contiguously allocated
! 129771: ** idx values.
1.2 misho 129772: */
1.2.2.1 ! misho 129773: static int fts3RemoveSegdirEntry(
! 129774: Fts3Table *p, /* FTS3 table handle */
! 129775: sqlite3_int64 iAbsLevel, /* Absolute level to delete from */
! 129776: int iIdx /* Index of %_segdir entry to delete */
! 129777: ){
1.2 misho 129778: int rc; /* Return code */
1.2.2.1 ! misho 129779: sqlite3_stmt *pDelete = 0; /* DELETE statement */
1.2 misho 129780:
1.2.2.1 ! misho 129781: rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_ENTRY, &pDelete, 0);
! 129782: if( rc==SQLITE_OK ){
! 129783: sqlite3_bind_int64(pDelete, 1, iAbsLevel);
! 129784: sqlite3_bind_int(pDelete, 2, iIdx);
! 129785: sqlite3_step(pDelete);
! 129786: rc = sqlite3_reset(pDelete);
! 129787: }
1.2 misho 129788:
1.2.2.1 ! misho 129789: return rc;
! 129790: }
1.2 misho 129791:
1.2.2.1 ! misho 129792: /*
! 129793: ** One or more segments have just been removed from absolute level iAbsLevel.
! 129794: ** Update the 'idx' values of the remaining segments in the level so that
! 129795: ** the idx values are a contiguous sequence starting from 0.
! 129796: */
! 129797: static int fts3RepackSegdirLevel(
! 129798: Fts3Table *p, /* FTS3 table handle */
! 129799: sqlite3_int64 iAbsLevel /* Absolute level to repack */
! 129800: ){
! 129801: int rc; /* Return code */
! 129802: int *aIdx = 0; /* Array of remaining idx values */
! 129803: int nIdx = 0; /* Valid entries in aIdx[] */
! 129804: int nAlloc = 0; /* Allocated size of aIdx[] */
! 129805: int i; /* Iterator variable */
! 129806: sqlite3_stmt *pSelect = 0; /* Select statement to read idx values */
! 129807: sqlite3_stmt *pUpdate = 0; /* Update statement to modify idx values */
1.2 misho 129808:
1.2.2.1 ! misho 129809: rc = fts3SqlStmt(p, SQL_SELECT_INDEXES, &pSelect, 0);
! 129810: if( rc==SQLITE_OK ){
! 129811: int rc2;
! 129812: sqlite3_bind_int64(pSelect, 1, iAbsLevel);
! 129813: while( SQLITE_ROW==sqlite3_step(pSelect) ){
! 129814: if( nIdx>=nAlloc ){
! 129815: int *aNew;
! 129816: nAlloc += 16;
! 129817: aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int));
! 129818: if( !aNew ){
! 129819: rc = SQLITE_NOMEM;
! 129820: break;
! 129821: }
! 129822: aIdx = aNew;
! 129823: }
! 129824: aIdx[nIdx++] = sqlite3_column_int(pSelect, 0);
! 129825: }
! 129826: rc2 = sqlite3_reset(pSelect);
! 129827: if( rc==SQLITE_OK ) rc = rc2;
1.2 misho 129828: }
129829:
1.2.2.1 ! misho 129830: if( rc==SQLITE_OK ){
! 129831: rc = fts3SqlStmt(p, SQL_SHIFT_SEGDIR_ENTRY, &pUpdate, 0);
! 129832: }
! 129833: if( rc==SQLITE_OK ){
! 129834: sqlite3_bind_int64(pUpdate, 2, iAbsLevel);
1.2 misho 129835: }
129836:
1.2.2.1 ! misho 129837: assert( p->bIgnoreSavepoint==0 );
! 129838: p->bIgnoreSavepoint = 1;
! 129839: for(i=0; rc==SQLITE_OK && i<nIdx; i++){
! 129840: if( aIdx[i]!=i ){
! 129841: sqlite3_bind_int(pUpdate, 3, aIdx[i]);
! 129842: sqlite3_bind_int(pUpdate, 1, i);
! 129843: sqlite3_step(pUpdate);
! 129844: rc = sqlite3_reset(pUpdate);
! 129845: }
1.2 misho 129846: }
1.2.2.1 ! misho 129847: p->bIgnoreSavepoint = 0;
1.2 misho 129848:
1.2.2.1 ! misho 129849: sqlite3_free(aIdx);
1.2 misho 129850: return rc;
129851: }
129852:
1.2.2.1 ! misho 129853: static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){
! 129854: pNode->a[0] = (char)iHeight;
! 129855: if( iChild ){
! 129856: assert( pNode->nAlloc>=1+sqlite3Fts3VarintLen(iChild) );
! 129857: pNode->n = 1 + sqlite3Fts3PutVarint(&pNode->a[1], iChild);
! 129858: }else{
! 129859: assert( pNode->nAlloc>=1 );
! 129860: pNode->n = 1;
! 129861: }
! 129862: }
1.2 misho 129863:
1.2.2.1 ! misho 129864: /*
! 129865: ** The first two arguments are a pointer to and the size of a segment b-tree
! 129866: ** node. The node may be a leaf or an internal node.
! 129867: **
! 129868: ** This function creates a new node image in blob object *pNew by copying
! 129869: ** all terms that are greater than or equal to zTerm/nTerm (for leaf nodes)
! 129870: ** or greater than zTerm/nTerm (for internal nodes) from aNode/nNode.
1.2 misho 129871: */
1.2.2.1 ! misho 129872: static int fts3TruncateNode(
! 129873: const char *aNode, /* Current node image */
! 129874: int nNode, /* Size of aNode in bytes */
! 129875: Blob *pNew, /* OUT: Write new node image here */
! 129876: const char *zTerm, /* Omit all terms smaller than this */
! 129877: int nTerm, /* Size of zTerm in bytes */
! 129878: sqlite3_int64 *piBlock /* OUT: Block number in next layer down */
! 129879: ){
! 129880: NodeReader reader; /* Reader object */
! 129881: Blob prev = {0, 0, 0}; /* Previous term written to new node */
! 129882: int rc = SQLITE_OK; /* Return code */
! 129883: int bLeaf = aNode[0]=='\0'; /* True for a leaf node */
! 129884:
! 129885: /* Allocate required output space */
! 129886: blobGrowBuffer(pNew, nNode, &rc);
! 129887: if( rc!=SQLITE_OK ) return rc;
! 129888: pNew->n = 0;
! 129889:
! 129890: /* Populate new node buffer */
! 129891: for(rc = nodeReaderInit(&reader, aNode, nNode);
! 129892: rc==SQLITE_OK && reader.aNode;
! 129893: rc = nodeReaderNext(&reader)
! 129894: ){
! 129895: if( pNew->n==0 ){
! 129896: int res = fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm);
! 129897: if( res<0 || (bLeaf==0 && res==0) ) continue;
! 129898: fts3StartNode(pNew, (int)aNode[0], reader.iChild);
! 129899: *piBlock = reader.iChild;
! 129900: }
! 129901: rc = fts3AppendToNode(
! 129902: pNew, &prev, reader.term.a, reader.term.n,
! 129903: reader.aDoclist, reader.nDoclist
! 129904: );
! 129905: if( rc!=SQLITE_OK ) break;
1.2 misho 129906: }
1.2.2.1 ! misho 129907: if( pNew->n==0 ){
! 129908: fts3StartNode(pNew, (int)aNode[0], reader.iChild);
! 129909: *piBlock = reader.iChild;
! 129910: }
! 129911: assert( pNew->n<=pNew->nAlloc );
! 129912:
! 129913: nodeReaderRelease(&reader);
! 129914: sqlite3_free(prev.a);
1.2 misho 129915: return rc;
129916: }
129917:
129918: /*
1.2.2.1 ! misho 129919: ** Remove all terms smaller than zTerm/nTerm from segment iIdx in absolute
! 129920: ** level iAbsLevel. This may involve deleting entries from the %_segments
! 129921: ** table, and modifying existing entries in both the %_segments and %_segdir
! 129922: ** tables.
! 129923: **
! 129924: ** SQLITE_OK is returned if the segment is updated successfully. Or an
! 129925: ** SQLite error code otherwise.
1.2 misho 129926: */
1.2.2.1 ! misho 129927: static int fts3TruncateSegment(
! 129928: Fts3Table *p, /* FTS3 table handle */
! 129929: sqlite3_int64 iAbsLevel, /* Absolute level of segment to modify */
! 129930: int iIdx, /* Index within level of segment to modify */
! 129931: const char *zTerm, /* Remove terms smaller than this */
! 129932: int nTerm /* Number of bytes in buffer zTerm */
1.2 misho 129933: ){
1.2.2.1 ! misho 129934: int rc = SQLITE_OK; /* Return code */
! 129935: Blob root = {0,0,0}; /* New root page image */
! 129936: Blob block = {0,0,0}; /* Buffer used for any other block */
! 129937: sqlite3_int64 iBlock = 0; /* Block id */
! 129938: sqlite3_int64 iNewStart = 0; /* New value for iStartBlock */
! 129939: sqlite3_int64 iOldStart = 0; /* Old value for iStartBlock */
! 129940: sqlite3_stmt *pFetch = 0; /* Statement used to fetch segdir */
! 129941:
! 129942: rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR, &pFetch, 0);
! 129943: if( rc==SQLITE_OK ){
! 129944: int rc2; /* sqlite3_reset() return code */
! 129945: sqlite3_bind_int64(pFetch, 1, iAbsLevel);
! 129946: sqlite3_bind_int(pFetch, 2, iIdx);
! 129947: if( SQLITE_ROW==sqlite3_step(pFetch) ){
! 129948: const char *aRoot = sqlite3_column_blob(pFetch, 4);
! 129949: int nRoot = sqlite3_column_bytes(pFetch, 4);
! 129950: iOldStart = sqlite3_column_int64(pFetch, 1);
! 129951: rc = fts3TruncateNode(aRoot, nRoot, &root, zTerm, nTerm, &iBlock);
! 129952: }
! 129953: rc2 = sqlite3_reset(pFetch);
! 129954: if( rc==SQLITE_OK ) rc = rc2;
1.2 misho 129955: }
1.2.2.1 ! misho 129956:
! 129957: while( rc==SQLITE_OK && iBlock ){
! 129958: char *aBlock = 0;
! 129959: int nBlock = 0;
! 129960: iNewStart = iBlock;
! 129961:
! 129962: rc = sqlite3Fts3ReadBlock(p, iBlock, &aBlock, &nBlock, 0);
! 129963: if( rc==SQLITE_OK ){
! 129964: rc = fts3TruncateNode(aBlock, nBlock, &block, zTerm, nTerm, &iBlock);
! 129965: }
! 129966: if( rc==SQLITE_OK ){
! 129967: rc = fts3WriteSegment(p, iNewStart, block.a, block.n);
! 129968: }
! 129969: sqlite3_free(aBlock);
! 129970: }
! 129971:
! 129972: /* Variable iNewStart now contains the first valid leaf node. */
! 129973: if( rc==SQLITE_OK && iNewStart ){
! 129974: sqlite3_stmt *pDel = 0;
! 129975: rc = fts3SqlStmt(p, SQL_DELETE_SEGMENTS_RANGE, &pDel, 0);
! 129976: if( rc==SQLITE_OK ){
! 129977: sqlite3_bind_int64(pDel, 1, iOldStart);
! 129978: sqlite3_bind_int64(pDel, 2, iNewStart-1);
! 129979: sqlite3_step(pDel);
! 129980: rc = sqlite3_reset(pDel);
! 129981: }
! 129982: }
! 129983:
! 129984: if( rc==SQLITE_OK ){
! 129985: sqlite3_stmt *pChomp = 0;
! 129986: rc = fts3SqlStmt(p, SQL_CHOMP_SEGDIR, &pChomp, 0);
! 129987: if( rc==SQLITE_OK ){
! 129988: sqlite3_bind_int64(pChomp, 1, iNewStart);
! 129989: sqlite3_bind_blob(pChomp, 2, root.a, root.n, SQLITE_STATIC);
! 129990: sqlite3_bind_int64(pChomp, 3, iAbsLevel);
! 129991: sqlite3_bind_int(pChomp, 4, iIdx);
! 129992: sqlite3_step(pChomp);
! 129993: rc = sqlite3_reset(pChomp);
! 129994: }
! 129995: }
! 129996:
! 129997: sqlite3_free(root.a);
! 129998: sqlite3_free(block.a);
! 129999: return rc;
1.2 misho 130000: }
130001:
130002: /*
1.2.2.1 ! misho 130003: ** This function is called after an incrmental-merge operation has run to
! 130004: ** merge (or partially merge) two or more segments from absolute level
! 130005: ** iAbsLevel.
! 130006: **
! 130007: ** Each input segment is either removed from the db completely (if all of
! 130008: ** its data was copied to the output segment by the incrmerge operation)
! 130009: ** or modified in place so that it no longer contains those entries that
! 130010: ** have been duplicated in the output segment.
1.2 misho 130011: */
1.2.2.1 ! misho 130012: static int fts3IncrmergeChomp(
! 130013: Fts3Table *p, /* FTS table handle */
! 130014: sqlite3_int64 iAbsLevel, /* Absolute level containing segments */
! 130015: Fts3MultiSegReader *pCsr, /* Chomp all segments opened by this cursor */
! 130016: int *pnRem /* Number of segments not deleted */
1.2 misho 130017: ){
1.2.2.1 ! misho 130018: int i;
! 130019: int nRem = 0;
! 130020: int rc = SQLITE_OK;
! 130021:
! 130022: for(i=pCsr->nSegment-1; i>=0 && rc==SQLITE_OK; i--){
! 130023: Fts3SegReader *pSeg = 0;
! 130024: int j;
! 130025:
! 130026: /* Find the Fts3SegReader object with Fts3SegReader.iIdx==i. It is hiding
! 130027: ** somewhere in the pCsr->apSegment[] array. */
! 130028: for(j=0; ALWAYS(j<pCsr->nSegment); j++){
! 130029: pSeg = pCsr->apSegment[j];
! 130030: if( pSeg->iIdx==i ) break;
! 130031: }
! 130032: assert( j<pCsr->nSegment && pSeg->iIdx==i );
! 130033:
! 130034: if( pSeg->aNode==0 ){
! 130035: /* Seg-reader is at EOF. Remove the entire input segment. */
! 130036: rc = fts3DeleteSegment(p, pSeg);
! 130037: if( rc==SQLITE_OK ){
! 130038: rc = fts3RemoveSegdirEntry(p, iAbsLevel, pSeg->iIdx);
! 130039: }
! 130040: *pnRem = 0;
! 130041: }else{
! 130042: /* The incremental merge did not copy all the data from this
! 130043: ** segment to the upper level. The segment is modified in place
! 130044: ** so that it contains no keys smaller than zTerm/nTerm. */
! 130045: const char *zTerm = pSeg->zTerm;
! 130046: int nTerm = pSeg->nTerm;
! 130047: rc = fts3TruncateSegment(p, iAbsLevel, pSeg->iIdx, zTerm, nTerm);
! 130048: nRem++;
! 130049: }
1.2 misho 130050: }
1.2.2.1 ! misho 130051:
! 130052: if( rc==SQLITE_OK && nRem!=pCsr->nSegment ){
! 130053: rc = fts3RepackSegdirLevel(p, iAbsLevel);
! 130054: }
! 130055:
! 130056: *pnRem = nRem;
! 130057: return rc;
1.2 misho 130058: }
130059:
130060: /*
1.2.2.1 ! misho 130061: ** Store an incr-merge hint in the database.
1.2 misho 130062: */
1.2.2.1 ! misho 130063: static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){
! 130064: sqlite3_stmt *pReplace = 0;
! 130065: int rc; /* Return code */
1.2 misho 130066:
1.2.2.1 ! misho 130067: rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pReplace, 0);
! 130068: if( rc==SQLITE_OK ){
! 130069: sqlite3_bind_int(pReplace, 1, FTS_STAT_INCRMERGEHINT);
! 130070: sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC);
! 130071: sqlite3_step(pReplace);
! 130072: rc = sqlite3_reset(pReplace);
1.2 misho 130073: }
1.2.2.1 ! misho 130074:
! 130075: return rc;
1.2 misho 130076: }
130077:
130078: /*
1.2.2.1 ! misho 130079: ** Load an incr-merge hint from the database. The incr-merge hint, if one
! 130080: ** exists, is stored in the rowid==1 row of the %_stat table.
1.2 misho 130081: **
1.2.2.1 ! misho 130082: ** If successful, populate blob *pHint with the value read from the %_stat
! 130083: ** table and return SQLITE_OK. Otherwise, if an error occurs, return an
! 130084: ** SQLite error code.
! 130085: */
! 130086: static int fts3IncrmergeHintLoad(Fts3Table *p, Blob *pHint){
! 130087: sqlite3_stmt *pSelect = 0;
! 130088: int rc;
! 130089:
! 130090: pHint->n = 0;
! 130091: rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pSelect, 0);
! 130092: if( rc==SQLITE_OK ){
! 130093: int rc2;
! 130094: sqlite3_bind_int(pSelect, 1, FTS_STAT_INCRMERGEHINT);
! 130095: if( SQLITE_ROW==sqlite3_step(pSelect) ){
! 130096: const char *aHint = sqlite3_column_blob(pSelect, 0);
! 130097: int nHint = sqlite3_column_bytes(pSelect, 0);
! 130098: if( aHint ){
! 130099: blobGrowBuffer(pHint, nHint, &rc);
! 130100: if( rc==SQLITE_OK ){
! 130101: memcpy(pHint->a, aHint, nHint);
! 130102: pHint->n = nHint;
! 130103: }
! 130104: }
! 130105: }
! 130106: rc2 = sqlite3_reset(pSelect);
! 130107: if( rc==SQLITE_OK ) rc = rc2;
! 130108: }
! 130109:
! 130110: return rc;
! 130111: }
! 130112:
! 130113: /*
! 130114: ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
! 130115: ** Otherwise, append an entry to the hint stored in blob *pHint. Each entry
! 130116: ** consists of two varints, the absolute level number of the input segments
! 130117: ** and the number of input segments.
! 130118: **
! 130119: ** If successful, leave *pRc set to SQLITE_OK and return. If an error occurs,
! 130120: ** set *pRc to an SQLite error code before returning.
! 130121: */
! 130122: static void fts3IncrmergeHintPush(
! 130123: Blob *pHint, /* Hint blob to append to */
! 130124: i64 iAbsLevel, /* First varint to store in hint */
! 130125: int nInput, /* Second varint to store in hint */
! 130126: int *pRc /* IN/OUT: Error code */
! 130127: ){
! 130128: blobGrowBuffer(pHint, pHint->n + 2*FTS3_VARINT_MAX, pRc);
! 130129: if( *pRc==SQLITE_OK ){
! 130130: pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], iAbsLevel);
! 130131: pHint->n += sqlite3Fts3PutVarint(&pHint->a[pHint->n], (i64)nInput);
! 130132: }
! 130133: }
! 130134:
! 130135: /*
! 130136: ** Read the last entry (most recently pushed) from the hint blob *pHint
! 130137: ** and then remove the entry. Write the two values read to *piAbsLevel and
! 130138: ** *pnInput before returning.
1.2 misho 130139: **
1.2.2.1 ! misho 130140: ** If no error occurs, return SQLITE_OK. If the hint blob in *pHint does
! 130141: ** not contain at least two valid varints, return SQLITE_CORRUPT_VTAB.
! 130142: */
! 130143: static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){
! 130144: const int nHint = pHint->n;
! 130145: int i;
! 130146:
! 130147: i = pHint->n-2;
! 130148: while( i>0 && (pHint->a[i-1] & 0x80) ) i--;
! 130149: while( i>0 && (pHint->a[i-1] & 0x80) ) i--;
! 130150:
! 130151: pHint->n = i;
! 130152: i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel);
! 130153: i += sqlite3Fts3GetVarint32(&pHint->a[i], pnInput);
! 130154: if( i!=nHint ) return SQLITE_CORRUPT_VTAB;
! 130155:
! 130156: return SQLITE_OK;
! 130157: }
! 130158:
! 130159:
! 130160: /*
! 130161: ** Attempt an incremental merge that writes nMerge leaf blocks.
1.2 misho 130162: **
1.2.2.1 ! misho 130163: ** Incremental merges happen nMin segments at a time. The two
! 130164: ** segments to be merged are the nMin oldest segments (the ones with
! 130165: ** the smallest indexes) in the highest level that contains at least
! 130166: ** nMin segments. Multiple merges might occur in an attempt to write the
! 130167: ** quota of nMerge leaf blocks.
1.2 misho 130168: */
1.2.2.1 ! misho 130169: SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
! 130170: int rc; /* Return code */
! 130171: int nRem = nMerge; /* Number of leaf pages yet to be written */
! 130172: Fts3MultiSegReader *pCsr; /* Cursor used to read input data */
! 130173: Fts3SegFilter *pFilter; /* Filter used with cursor pCsr */
! 130174: IncrmergeWriter *pWriter; /* Writer object */
! 130175: int nSeg = 0; /* Number of input segments */
! 130176: sqlite3_int64 iAbsLevel = 0; /* Absolute level number to work on */
! 130177: Blob hint = {0, 0, 0}; /* Hint read from %_stat table */
! 130178: int bDirtyHint = 0; /* True if blob 'hint' has been modified */
! 130179:
! 130180: /* Allocate space for the cursor, filter and writer objects */
! 130181: const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter);
! 130182: pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc);
! 130183: if( !pWriter ) return SQLITE_NOMEM;
! 130184: pFilter = (Fts3SegFilter *)&pWriter[1];
! 130185: pCsr = (Fts3MultiSegReader *)&pFilter[1];
! 130186:
! 130187: rc = fts3IncrmergeHintLoad(p, &hint);
! 130188: while( rc==SQLITE_OK && nRem>0 ){
! 130189: const i64 nMod = FTS3_SEGDIR_MAXLEVEL * p->nIndex;
! 130190: sqlite3_stmt *pFindLevel = 0; /* SQL used to determine iAbsLevel */
! 130191: int bUseHint = 0; /* True if attempting to append */
! 130192:
! 130193: /* Search the %_segdir table for the absolute level with the smallest
! 130194: ** relative level number that contains at least nMin segments, if any.
! 130195: ** If one is found, set iAbsLevel to the absolute level number and
! 130196: ** nSeg to nMin. If no level with at least nMin segments can be found,
! 130197: ** set nSeg to -1.
! 130198: */
! 130199: rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0);
! 130200: sqlite3_bind_int(pFindLevel, 1, nMin);
! 130201: if( sqlite3_step(pFindLevel)==SQLITE_ROW ){
! 130202: iAbsLevel = sqlite3_column_int64(pFindLevel, 0);
! 130203: nSeg = nMin;
! 130204: }else{
! 130205: nSeg = -1;
! 130206: }
! 130207: rc = sqlite3_reset(pFindLevel);
! 130208:
! 130209: /* If the hint read from the %_stat table is not empty, check if the
! 130210: ** last entry in it specifies a relative level smaller than or equal
! 130211: ** to the level identified by the block above (if any). If so, this
! 130212: ** iteration of the loop will work on merging at the hinted level.
! 130213: */
! 130214: if( rc==SQLITE_OK && hint.n ){
! 130215: int nHint = hint.n;
! 130216: sqlite3_int64 iHintAbsLevel = 0; /* Hint level */
! 130217: int nHintSeg = 0; /* Hint number of segments */
! 130218:
! 130219: rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg);
! 130220: if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){
! 130221: iAbsLevel = iHintAbsLevel;
! 130222: nSeg = nHintSeg;
! 130223: bUseHint = 1;
! 130224: bDirtyHint = 1;
! 130225: }else{
! 130226: /* This undoes the effect of the HintPop() above - so that no entry
! 130227: ** is removed from the hint blob. */
! 130228: hint.n = nHint;
! 130229: }
! 130230: }
! 130231:
! 130232: /* If nSeg is less that zero, then there is no level with at least
! 130233: ** nMin segments and no hint in the %_stat table. No work to do.
! 130234: ** Exit early in this case. */
! 130235: if( nSeg<0 ) break;
! 130236:
! 130237: /* Open a cursor to iterate through the contents of the oldest nSeg
! 130238: ** indexes of absolute level iAbsLevel. If this cursor is opened using
! 130239: ** the 'hint' parameters, it is possible that there are less than nSeg
! 130240: ** segments available in level iAbsLevel. In this case, no work is
! 130241: ** done on iAbsLevel - fall through to the next iteration of the loop
! 130242: ** to start work on some other level. */
! 130243: memset(pWriter, 0, nAlloc);
! 130244: pFilter->flags = FTS3_SEGMENT_REQUIRE_POS;
! 130245: if( rc==SQLITE_OK ){
! 130246: rc = fts3IncrmergeCsr(p, iAbsLevel, nSeg, pCsr);
! 130247: }
! 130248: if( SQLITE_OK==rc && pCsr->nSegment==nSeg
! 130249: && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter))
! 130250: && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pCsr))
! 130251: ){
! 130252: int iIdx = 0; /* Largest idx in level (iAbsLevel+1) */
! 130253: rc = fts3IncrmergeOutputIdx(p, iAbsLevel, &iIdx);
! 130254: if( rc==SQLITE_OK ){
! 130255: if( bUseHint && iIdx>0 ){
! 130256: const char *zKey = pCsr->zTerm;
! 130257: int nKey = pCsr->nTerm;
! 130258: rc = fts3IncrmergeLoad(p, iAbsLevel, iIdx-1, zKey, nKey, pWriter);
! 130259: }else{
! 130260: rc = fts3IncrmergeWriter(p, iAbsLevel, iIdx, pCsr, pWriter);
! 130261: }
! 130262: }
1.2 misho 130263:
1.2.2.1 ! misho 130264: if( rc==SQLITE_OK && pWriter->nLeafEst ){
! 130265: fts3LogMerge(nSeg, iAbsLevel);
! 130266: do {
! 130267: rc = fts3IncrmergeAppend(p, pWriter, pCsr);
! 130268: if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr);
! 130269: if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK;
! 130270: }while( rc==SQLITE_ROW );
1.2 misho 130271:
1.2.2.1 ! misho 130272: /* Update or delete the input segments */
! 130273: if( rc==SQLITE_OK ){
! 130274: nRem -= (1 + pWriter->nWork);
! 130275: rc = fts3IncrmergeChomp(p, iAbsLevel, pCsr, &nSeg);
! 130276: if( nSeg!=0 ){
! 130277: bDirtyHint = 1;
! 130278: fts3IncrmergeHintPush(&hint, iAbsLevel, nSeg, &rc);
! 130279: }
! 130280: }
! 130281: }
! 130282:
! 130283: fts3IncrmergeRelease(p, pWriter, &rc);
! 130284: }
! 130285:
! 130286: sqlite3Fts3SegReaderFinish(pCsr);
1.2 misho 130287: }
1.2.2.1 ! misho 130288:
! 130289: /* Write the hint values into the %_stat table for the next incr-merger */
! 130290: if( bDirtyHint && rc==SQLITE_OK ){
! 130291: rc = fts3IncrmergeHintStore(p, &hint);
1.2 misho 130292: }
1.2.2.1 ! misho 130293:
! 130294: sqlite3_free(pWriter);
! 130295: sqlite3_free(hint.a);
! 130296: return rc;
! 130297: }
! 130298:
! 130299: /*
! 130300: ** Convert the text beginning at *pz into an integer and return
! 130301: ** its value. Advance *pz to point to the first character past
! 130302: ** the integer.
! 130303: */
! 130304: static int fts3Getint(const char **pz){
! 130305: const char *z = *pz;
! 130306: int i = 0;
! 130307: while( (*z)>='0' && (*z)<='9' ) i = 10*i + *(z++) - '0';
! 130308: *pz = z;
! 130309: return i;
! 130310: }
! 130311:
! 130312: /*
! 130313: ** Process statements of the form:
! 130314: **
! 130315: ** INSERT INTO table(table) VALUES('merge=A,B');
! 130316: **
! 130317: ** A and B are integers that decode to be the number of leaf pages
! 130318: ** written for the merge, and the minimum number of segments on a level
! 130319: ** before it will be selected for a merge, respectively.
! 130320: */
! 130321: static int fts3DoIncrmerge(
! 130322: Fts3Table *p, /* FTS3 table handle */
! 130323: const char *zParam /* Nul-terminated string containing "A,B" */
! 130324: ){
! 130325: int rc;
! 130326: int nMin = (FTS3_MERGE_COUNT / 2);
! 130327: int nMerge = 0;
! 130328: const char *z = zParam;
! 130329:
! 130330: /* Read the first integer value */
! 130331: nMerge = fts3Getint(&z);
! 130332:
! 130333: /* If the first integer value is followed by a ',', read the second
! 130334: ** integer value. */
! 130335: if( z[0]==',' && z[1]!='\0' ){
! 130336: z++;
! 130337: nMin = fts3Getint(&z);
! 130338: }
! 130339:
! 130340: if( z[0]!='\0' || nMin<2 ){
! 130341: rc = SQLITE_ERROR;
! 130342: }else{
! 130343: rc = SQLITE_OK;
! 130344: if( !p->bHasStat ){
! 130345: assert( p->bFts4==0 );
! 130346: sqlite3Fts3CreateStatTable(&rc, p);
1.2 misho 130347: }
1.2.2.1 ! misho 130348: if( rc==SQLITE_OK ){
! 130349: rc = sqlite3Fts3Incrmerge(p, nMerge, nMin);
! 130350: }
! 130351: sqlite3Fts3SegmentsClose(p);
1.2 misho 130352: }
1.2.2.1 ! misho 130353: return rc;
! 130354: }
! 130355:
! 130356: /*
! 130357: ** Process statements of the form:
! 130358: **
! 130359: ** INSERT INTO table(table) VALUES('automerge=X');
! 130360: **
! 130361: ** where X is an integer. X==0 means to turn automerge off. X!=0 means
! 130362: ** turn it on. The setting is persistent.
! 130363: */
! 130364: static int fts3DoAutoincrmerge(
! 130365: Fts3Table *p, /* FTS3 table handle */
! 130366: const char *zParam /* Nul-terminated string containing boolean */
! 130367: ){
! 130368: int rc = SQLITE_OK;
! 130369: sqlite3_stmt *pStmt = 0;
! 130370: p->bAutoincrmerge = fts3Getint(&zParam)!=0;
! 130371: if( !p->bHasStat ){
! 130372: assert( p->bFts4==0 );
! 130373: sqlite3Fts3CreateStatTable(&rc, p);
! 130374: if( rc ) return rc;
1.2 misho 130375: }
1.2.2.1 ! misho 130376: rc = fts3SqlStmt(p, SQL_REPLACE_STAT, &pStmt, 0);
! 130377: if( rc ) return rc;;
! 130378: sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE);
! 130379: sqlite3_bind_int(pStmt, 2, p->bAutoincrmerge);
1.2 misho 130380: sqlite3_step(pStmt);
1.2.2.1 ! misho 130381: rc = sqlite3_reset(pStmt);
! 130382: return rc;
1.2 misho 130383: }
130384:
1.2.2.1 ! misho 130385: /*
! 130386: ** Return a 64-bit checksum for the FTS index entry specified by the
! 130387: ** arguments to this function.
! 130388: */
! 130389: static u64 fts3ChecksumEntry(
! 130390: const char *zTerm, /* Pointer to buffer containing term */
! 130391: int nTerm, /* Size of zTerm in bytes */
! 130392: int iLangid, /* Language id for current row */
! 130393: int iIndex, /* Index (0..Fts3Table.nIndex-1) */
! 130394: i64 iDocid, /* Docid for current row. */
! 130395: int iCol, /* Column number */
! 130396: int iPos /* Position */
! 130397: ){
1.2 misho 130398: int i;
1.2.2.1 ! misho 130399: u64 ret = (u64)iDocid;
! 130400:
! 130401: ret += (ret<<3) + iLangid;
! 130402: ret += (ret<<3) + iIndex;
! 130403: ret += (ret<<3) + iCol;
! 130404: ret += (ret<<3) + iPos;
! 130405: for(i=0; i<nTerm; i++) ret += (ret<<3) + zTerm[i];
! 130406:
! 130407: return ret;
! 130408: }
! 130409:
! 130410: /*
! 130411: ** Return a checksum of all entries in the FTS index that correspond to
! 130412: ** language id iLangid. The checksum is calculated by XORing the checksums
! 130413: ** of each individual entry (see fts3ChecksumEntry()) together.
! 130414: **
! 130415: ** If successful, the checksum value is returned and *pRc set to SQLITE_OK.
! 130416: ** Otherwise, if an error occurs, *pRc is set to an SQLite error code. The
! 130417: ** return value is undefined in this case.
! 130418: */
! 130419: static u64 fts3ChecksumIndex(
! 130420: Fts3Table *p, /* FTS3 table handle */
! 130421: int iLangid, /* Language id to return cksum for */
! 130422: int iIndex, /* Index to cksum (0..p->nIndex-1) */
! 130423: int *pRc /* OUT: Return code */
! 130424: ){
! 130425: Fts3SegFilter filter;
! 130426: Fts3MultiSegReader csr;
! 130427: int rc;
! 130428: u64 cksum = 0;
! 130429:
! 130430: assert( *pRc==SQLITE_OK );
! 130431:
! 130432: memset(&filter, 0, sizeof(filter));
! 130433: memset(&csr, 0, sizeof(csr));
! 130434: filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY;
! 130435: filter.flags |= FTS3_SEGMENT_SCAN;
! 130436:
! 130437: rc = sqlite3Fts3SegReaderCursor(
! 130438: p, iLangid, iIndex, FTS3_SEGCURSOR_ALL, 0, 0, 0, 1,&csr
! 130439: );
! 130440: if( rc==SQLITE_OK ){
! 130441: rc = sqlite3Fts3SegReaderStart(p, &csr, &filter);
! 130442: }
! 130443:
! 130444: if( rc==SQLITE_OK ){
! 130445: while( SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, &csr)) ){
! 130446: char *pCsr = csr.aDoclist;
! 130447: char *pEnd = &pCsr[csr.nDoclist];
! 130448:
! 130449: i64 iDocid = 0;
! 130450: i64 iCol = 0;
! 130451: i64 iPos = 0;
! 130452:
! 130453: pCsr += sqlite3Fts3GetVarint(pCsr, &iDocid);
! 130454: while( pCsr<pEnd ){
! 130455: i64 iVal = 0;
! 130456: pCsr += sqlite3Fts3GetVarint(pCsr, &iVal);
! 130457: if( pCsr<pEnd ){
! 130458: if( iVal==0 || iVal==1 ){
! 130459: iCol = 0;
! 130460: iPos = 0;
! 130461: if( iVal ){
! 130462: pCsr += sqlite3Fts3GetVarint(pCsr, &iCol);
! 130463: }else{
! 130464: pCsr += sqlite3Fts3GetVarint(pCsr, &iVal);
! 130465: iDocid += iVal;
! 130466: }
! 130467: }else{
! 130468: iPos += (iVal - 2);
! 130469: cksum = cksum ^ fts3ChecksumEntry(
! 130470: csr.zTerm, csr.nTerm, iLangid, iIndex, iDocid,
! 130471: (int)iCol, (int)iPos
! 130472: );
! 130473: }
! 130474: }
! 130475: }
1.2 misho 130476: }
130477: }
1.2.2.1 ! misho 130478: sqlite3Fts3SegReaderFinish(&csr);
1.2 misho 130479:
1.2.2.1 ! misho 130480: *pRc = rc;
! 130481: return cksum;
1.2 misho 130482: }
130483:
130484: /*
1.2.2.1 ! misho 130485: ** Check if the contents of the FTS index match the current contents of the
! 130486: ** content table. If no error occurs and the contents do match, set *pbOk
! 130487: ** to true and return SQLITE_OK. Or if the contents do not match, set *pbOk
! 130488: ** to false before returning.
1.2 misho 130489: **
1.2.2.1 ! misho 130490: ** If an error occurs (e.g. an OOM or IO error), return an SQLite error
! 130491: ** code. The final value of *pbOk is undefined in this case.
1.2 misho 130492: */
1.2.2.1 ! misho 130493: static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){
! 130494: int rc = SQLITE_OK; /* Return code */
! 130495: u64 cksum1 = 0; /* Checksum based on FTS index contents */
! 130496: u64 cksum2 = 0; /* Checksum based on %_content contents */
! 130497: sqlite3_stmt *pAllLangid = 0; /* Statement to return all language-ids */
1.2 misho 130498:
1.2.2.1 ! misho 130499: /* This block calculates the checksum according to the FTS index. */
! 130500: rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0);
1.2 misho 130501: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 130502: int rc2;
! 130503: sqlite3_bind_int(pAllLangid, 1, p->nIndex);
! 130504: while( rc==SQLITE_OK && sqlite3_step(pAllLangid)==SQLITE_ROW ){
! 130505: int iLangid = sqlite3_column_int(pAllLangid, 0);
! 130506: int i;
! 130507: for(i=0; i<p->nIndex; i++){
! 130508: cksum1 = cksum1 ^ fts3ChecksumIndex(p, iLangid, i, &rc);
! 130509: }
! 130510: }
! 130511: rc2 = sqlite3_reset(pAllLangid);
! 130512: if( rc==SQLITE_OK ) rc = rc2;
! 130513: }
1.2 misho 130514:
1.2.2.1 ! misho 130515: /* This block calculates the checksum according to the %_content table */
! 130516: rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0);
! 130517: if( rc==SQLITE_OK ){
! 130518: sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule;
! 130519: sqlite3_stmt *pStmt = 0;
! 130520: char *zSql;
! 130521:
! 130522: zSql = sqlite3_mprintf("SELECT %s" , p->zReadExprlist);
1.2 misho 130523: if( !zSql ){
130524: rc = SQLITE_NOMEM;
130525: }else{
130526: rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0);
130527: sqlite3_free(zSql);
130528: }
130529:
130530: while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){
1.2.2.1 ! misho 130531: i64 iDocid = sqlite3_column_int64(pStmt, 0);
! 130532: int iLang = langidFromSelect(p, pStmt);
1.2 misho 130533: int iCol;
1.2.2.1 ! misho 130534:
1.2 misho 130535: for(iCol=0; rc==SQLITE_OK && iCol<p->nColumn; iCol++){
1.2.2.1 ! misho 130536: const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1);
! 130537: int nText = sqlite3_column_bytes(pStmt, iCol+1);
! 130538: sqlite3_tokenizer_cursor *pT = 0;
! 130539:
! 130540: rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, nText, &pT);
! 130541: while( rc==SQLITE_OK ){
! 130542: char const *zToken; /* Buffer containing token */
! 130543: int nToken = 0; /* Number of bytes in token */
! 130544: int iDum1 = 0, iDum2 = 0; /* Dummy variables */
! 130545: int iPos = 0; /* Position of token in zText */
! 130546:
! 130547: rc = pModule->xNext(pT, &zToken, &nToken, &iDum1, &iDum2, &iPos);
! 130548: if( rc==SQLITE_OK ){
! 130549: int i;
! 130550: cksum2 = cksum2 ^ fts3ChecksumEntry(
! 130551: zToken, nToken, iLang, 0, iDocid, iCol, iPos
! 130552: );
! 130553: for(i=1; i<p->nIndex; i++){
! 130554: if( p->aIndex[i].nPrefix<=nToken ){
! 130555: cksum2 = cksum2 ^ fts3ChecksumEntry(
! 130556: zToken, p->aIndex[i].nPrefix, iLang, i, iDocid, iCol, iPos
! 130557: );
! 130558: }
! 130559: }
! 130560: }
1.2 misho 130561: }
1.2.2.1 ! misho 130562: if( pT ) pModule->xClose(pT);
! 130563: if( rc==SQLITE_DONE ) rc = SQLITE_OK;
1.2 misho 130564: }
130565: }
130566:
1.2.2.1 ! misho 130567: sqlite3_finalize(pStmt);
1.2 misho 130568: }
130569:
1.2.2.1 ! misho 130570: *pbOk = (cksum1==cksum2);
! 130571: return rc;
! 130572: }
! 130573:
! 130574: /*
! 130575: ** Run the integrity-check. If no error occurs and the current contents of
! 130576: ** the FTS index are correct, return SQLITE_OK. Or, if the contents of the
! 130577: ** FTS index are incorrect, return SQLITE_CORRUPT_VTAB.
! 130578: **
! 130579: ** Or, if an error (e.g. an OOM or IO error) occurs, return an SQLite
! 130580: ** error code.
! 130581: **
! 130582: ** The integrity-check works as follows. For each token and indexed token
! 130583: ** prefix in the document set, a 64-bit checksum is calculated (by code
! 130584: ** in fts3ChecksumEntry()) based on the following:
! 130585: **
! 130586: ** + The index number (0 for the main index, 1 for the first prefix
! 130587: ** index etc.),
! 130588: ** + The token (or token prefix) text itself,
! 130589: ** + The language-id of the row it appears in,
! 130590: ** + The docid of the row it appears in,
! 130591: ** + The column it appears in, and
! 130592: ** + The tokens position within that column.
! 130593: **
! 130594: ** The checksums for all entries in the index are XORed together to create
! 130595: ** a single checksum for the entire index.
! 130596: **
! 130597: ** The integrity-check code calculates the same checksum in two ways:
! 130598: **
! 130599: ** 1. By scanning the contents of the FTS index, and
! 130600: ** 2. By scanning and tokenizing the content table.
! 130601: **
! 130602: ** If the two checksums are identical, the integrity-check is deemed to have
! 130603: ** passed.
! 130604: */
! 130605: static int fts3DoIntegrityCheck(
! 130606: Fts3Table *p /* FTS3 table handle */
! 130607: ){
! 130608: int rc;
! 130609: int bOk = 0;
! 130610: rc = fts3IntegrityCheck(p, &bOk);
! 130611: if( rc==SQLITE_OK && bOk==0 ) rc = SQLITE_CORRUPT_VTAB;
1.2 misho 130612: return rc;
130613: }
130614:
130615: /*
130616: ** Handle a 'special' INSERT of the form:
130617: **
130618: ** "INSERT INTO tbl(tbl) VALUES(<expr>)"
130619: **
130620: ** Argument pVal contains the result of <expr>. Currently the only
130621: ** meaningful value to insert is the text 'optimize'.
130622: */
130623: static int fts3SpecialInsert(Fts3Table *p, sqlite3_value *pVal){
130624: int rc; /* Return Code */
130625: const char *zVal = (const char *)sqlite3_value_text(pVal);
130626: int nVal = sqlite3_value_bytes(pVal);
130627:
130628: if( !zVal ){
130629: return SQLITE_NOMEM;
130630: }else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){
130631: rc = fts3DoOptimize(p, 0);
130632: }else if( nVal==7 && 0==sqlite3_strnicmp(zVal, "rebuild", 7) ){
130633: rc = fts3DoRebuild(p);
1.2.2.1 ! misho 130634: }else if( nVal==15 && 0==sqlite3_strnicmp(zVal, "integrity-check", 15) ){
! 130635: rc = fts3DoIntegrityCheck(p);
! 130636: }else if( nVal>6 && 0==sqlite3_strnicmp(zVal, "merge=", 6) ){
! 130637: rc = fts3DoIncrmerge(p, &zVal[6]);
! 130638: }else if( nVal>10 && 0==sqlite3_strnicmp(zVal, "automerge=", 10) ){
! 130639: rc = fts3DoAutoincrmerge(p, &zVal[10]);
1.2 misho 130640: #ifdef SQLITE_TEST
130641: }else if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){
130642: p->nNodeSize = atoi(&zVal[9]);
130643: rc = SQLITE_OK;
130644: }else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){
130645: p->nMaxPendingData = atoi(&zVal[11]);
130646: rc = SQLITE_OK;
130647: #endif
130648: }else{
130649: rc = SQLITE_ERROR;
130650: }
130651:
130652: return rc;
130653: }
130654:
1.2.2.1 ! misho 130655: #ifndef SQLITE_DISABLE_FTS4_DEFERRED
1.2 misho 130656: /*
130657: ** Delete all cached deferred doclists. Deferred doclists are cached
130658: ** (allocated) by the sqlite3Fts3CacheDeferredDoclists() function.
130659: */
130660: SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){
130661: Fts3DeferredToken *pDef;
130662: for(pDef=pCsr->pDeferred; pDef; pDef=pDef->pNext){
130663: fts3PendingListDelete(pDef->pList);
130664: pDef->pList = 0;
130665: }
130666: }
130667:
130668: /*
130669: ** Free all entries in the pCsr->pDeffered list. Entries are added to
130670: ** this list using sqlite3Fts3DeferToken().
130671: */
130672: SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){
130673: Fts3DeferredToken *pDef;
130674: Fts3DeferredToken *pNext;
130675: for(pDef=pCsr->pDeferred; pDef; pDef=pNext){
130676: pNext = pDef->pNext;
130677: fts3PendingListDelete(pDef->pList);
130678: sqlite3_free(pDef);
130679: }
130680: pCsr->pDeferred = 0;
130681: }
130682:
130683: /*
130684: ** Generate deferred-doclists for all tokens in the pCsr->pDeferred list
130685: ** based on the row that pCsr currently points to.
130686: **
130687: ** A deferred-doclist is like any other doclist with position information
130688: ** included, except that it only contains entries for a single row of the
130689: ** table, not for all rows.
130690: */
130691: SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *pCsr){
130692: int rc = SQLITE_OK; /* Return code */
130693: if( pCsr->pDeferred ){
130694: int i; /* Used to iterate through table columns */
130695: sqlite3_int64 iDocid; /* Docid of the row pCsr points to */
130696: Fts3DeferredToken *pDef; /* Used to iterate through deferred tokens */
130697:
130698: Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
130699: sqlite3_tokenizer *pT = p->pTokenizer;
130700: sqlite3_tokenizer_module const *pModule = pT->pModule;
130701:
130702: assert( pCsr->isRequireSeek==0 );
130703: iDocid = sqlite3_column_int64(pCsr->pStmt, 0);
130704:
130705: for(i=0; i<p->nColumn && rc==SQLITE_OK; i++){
130706: const char *zText = (const char *)sqlite3_column_text(pCsr->pStmt, i+1);
130707: sqlite3_tokenizer_cursor *pTC = 0;
130708:
1.2.2.1 ! misho 130709: rc = sqlite3Fts3OpenTokenizer(pT, pCsr->iLangid, zText, -1, &pTC);
1.2 misho 130710: while( rc==SQLITE_OK ){
130711: char const *zToken; /* Buffer containing token */
1.2.2.1 ! misho 130712: int nToken = 0; /* Number of bytes in token */
! 130713: int iDum1 = 0, iDum2 = 0; /* Dummy variables */
! 130714: int iPos = 0; /* Position of token in zText */
1.2 misho 130715:
130716: rc = pModule->xNext(pTC, &zToken, &nToken, &iDum1, &iDum2, &iPos);
130717: for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){
130718: Fts3PhraseToken *pPT = pDef->pToken;
130719: if( (pDef->iCol>=p->nColumn || pDef->iCol==i)
130720: && (pPT->bFirst==0 || iPos==0)
130721: && (pPT->n==nToken || (pPT->isPrefix && pPT->n<nToken))
130722: && (0==memcmp(zToken, pPT->z, pPT->n))
130723: ){
130724: fts3PendingListAppend(&pDef->pList, iDocid, i, iPos, &rc);
130725: }
130726: }
130727: }
130728: if( pTC ) pModule->xClose(pTC);
130729: if( rc==SQLITE_DONE ) rc = SQLITE_OK;
130730: }
130731:
130732: for(pDef=pCsr->pDeferred; pDef && rc==SQLITE_OK; pDef=pDef->pNext){
130733: if( pDef->pList ){
130734: rc = fts3PendingListAppendVarint(&pDef->pList, 0);
130735: }
130736: }
130737: }
130738:
130739: return rc;
130740: }
130741:
130742: SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(
130743: Fts3DeferredToken *p,
130744: char **ppData,
130745: int *pnData
130746: ){
130747: char *pRet;
130748: int nSkip;
130749: sqlite3_int64 dummy;
130750:
130751: *ppData = 0;
130752: *pnData = 0;
130753:
130754: if( p->pList==0 ){
130755: return SQLITE_OK;
130756: }
130757:
130758: pRet = (char *)sqlite3_malloc(p->pList->nData);
130759: if( !pRet ) return SQLITE_NOMEM;
130760:
130761: nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy);
130762: *pnData = p->pList->nData - nSkip;
130763: *ppData = pRet;
130764:
130765: memcpy(pRet, &p->pList->aData[nSkip], *pnData);
130766: return SQLITE_OK;
130767: }
130768:
130769: /*
130770: ** Add an entry for token pToken to the pCsr->pDeferred list.
130771: */
130772: SQLITE_PRIVATE int sqlite3Fts3DeferToken(
130773: Fts3Cursor *pCsr, /* Fts3 table cursor */
130774: Fts3PhraseToken *pToken, /* Token to defer */
130775: int iCol /* Column that token must appear in (or -1) */
130776: ){
130777: Fts3DeferredToken *pDeferred;
130778: pDeferred = sqlite3_malloc(sizeof(*pDeferred));
130779: if( !pDeferred ){
130780: return SQLITE_NOMEM;
130781: }
130782: memset(pDeferred, 0, sizeof(*pDeferred));
130783: pDeferred->pToken = pToken;
130784: pDeferred->pNext = pCsr->pDeferred;
130785: pDeferred->iCol = iCol;
130786: pCsr->pDeferred = pDeferred;
130787:
130788: assert( pToken->pDeferred==0 );
130789: pToken->pDeferred = pDeferred;
130790:
130791: return SQLITE_OK;
130792: }
1.2.2.1 ! misho 130793: #endif
1.2 misho 130794:
130795: /*
130796: ** SQLite value pRowid contains the rowid of a row that may or may not be
130797: ** present in the FTS3 table. If it is, delete it and adjust the contents
130798: ** of subsiduary data structures accordingly.
130799: */
130800: static int fts3DeleteByRowid(
130801: Fts3Table *p,
130802: sqlite3_value *pRowid,
1.2.2.1 ! misho 130803: int *pnChng, /* IN/OUT: Decrement if row is deleted */
1.2 misho 130804: u32 *aSzDel
130805: ){
1.2.2.1 ! misho 130806: int rc = SQLITE_OK; /* Return code */
! 130807: int bFound = 0; /* True if *pRowid really is in the table */
! 130808:
! 130809: fts3DeleteTerms(&rc, p, pRowid, aSzDel, &bFound);
! 130810: if( bFound && rc==SQLITE_OK ){
! 130811: int isEmpty = 0; /* Deleting *pRowid leaves the table empty */
! 130812: rc = fts3IsEmpty(p, pRowid, &isEmpty);
! 130813: if( rc==SQLITE_OK ){
! 130814: if( isEmpty ){
! 130815: /* Deleting this row means the whole table is empty. In this case
! 130816: ** delete the contents of all three tables and throw away any
! 130817: ** data in the pendingTerms hash table. */
! 130818: rc = fts3DeleteAll(p, 1);
! 130819: *pnChng = 0;
! 130820: memset(aSzDel, 0, sizeof(u32) * (p->nColumn+1) * 2);
! 130821: }else{
! 130822: *pnChng = *pnChng - 1;
! 130823: if( p->zContentTbl==0 ){
! 130824: fts3SqlExec(&rc, p, SQL_DELETE_CONTENT, &pRowid);
! 130825: }
! 130826: if( p->bHasDocsize ){
! 130827: fts3SqlExec(&rc, p, SQL_DELETE_DOCSIZE, &pRowid);
! 130828: }
1.2 misho 130829: }
130830: }
130831: }
130832:
130833: return rc;
130834: }
130835:
130836: /*
130837: ** This function does the work for the xUpdate method of FTS3 virtual
1.2.2.1 ! misho 130838: ** tables. The schema of the virtual table being:
! 130839: **
! 130840: ** CREATE TABLE <table name>(
! 130841: ** <user columns>,
! 130842: ** <table name> HIDDEN,
! 130843: ** docid HIDDEN,
! 130844: ** <langid> HIDDEN
! 130845: ** );
! 130846: **
! 130847: **
1.2 misho 130848: */
130849: SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
130850: sqlite3_vtab *pVtab, /* FTS3 vtab object */
130851: int nArg, /* Size of argument array */
130852: sqlite3_value **apVal, /* Array of arguments */
130853: sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */
130854: ){
130855: Fts3Table *p = (Fts3Table *)pVtab;
130856: int rc = SQLITE_OK; /* Return Code */
130857: int isRemove = 0; /* True for an UPDATE or DELETE */
130858: u32 *aSzIns = 0; /* Sizes of inserted documents */
1.2.2.1 ! misho 130859: u32 *aSzDel = 0; /* Sizes of deleted documents */
1.2 misho 130860: int nChng = 0; /* Net change in number of documents */
130861: int bInsertDone = 0;
130862:
130863: assert( p->pSegments==0 );
1.2.2.1 ! misho 130864: assert(
! 130865: nArg==1 /* DELETE operations */
! 130866: || nArg==(2 + p->nColumn + 3) /* INSERT or UPDATE operations */
! 130867: );
1.2 misho 130868:
130869: /* Check for a "special" INSERT operation. One of the form:
130870: **
130871: ** INSERT INTO xyz(xyz) VALUES('command');
130872: */
130873: if( nArg>1
130874: && sqlite3_value_type(apVal[0])==SQLITE_NULL
130875: && sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL
130876: ){
130877: rc = fts3SpecialInsert(p, apVal[p->nColumn+2]);
130878: goto update_out;
130879: }
130880:
1.2.2.1 ! misho 130881: if( nArg>1 && sqlite3_value_int(apVal[2 + p->nColumn + 2])<0 ){
! 130882: rc = SQLITE_CONSTRAINT;
! 130883: goto update_out;
! 130884: }
! 130885:
1.2 misho 130886: /* Allocate space to hold the change in document sizes */
1.2.2.1 ! misho 130887: aSzDel = sqlite3_malloc( sizeof(aSzDel[0])*(p->nColumn+1)*2 );
! 130888: if( aSzDel==0 ){
1.2 misho 130889: rc = SQLITE_NOMEM;
130890: goto update_out;
130891: }
1.2.2.1 ! misho 130892: aSzIns = &aSzDel[p->nColumn+1];
! 130893: memset(aSzDel, 0, sizeof(aSzDel[0])*(p->nColumn+1)*2);
1.2 misho 130894:
130895: /* If this is an INSERT operation, or an UPDATE that modifies the rowid
130896: ** value, then this operation requires constraint handling.
130897: **
130898: ** If the on-conflict mode is REPLACE, this means that the existing row
130899: ** should be deleted from the database before inserting the new row. Or,
130900: ** if the on-conflict mode is other than REPLACE, then this method must
130901: ** detect the conflict and return SQLITE_CONSTRAINT before beginning to
130902: ** modify the database file.
130903: */
130904: if( nArg>1 && p->zContentTbl==0 ){
130905: /* Find the value object that holds the new rowid value. */
130906: sqlite3_value *pNewRowid = apVal[3+p->nColumn];
130907: if( sqlite3_value_type(pNewRowid)==SQLITE_NULL ){
130908: pNewRowid = apVal[1];
130909: }
130910:
130911: if( sqlite3_value_type(pNewRowid)!=SQLITE_NULL && (
130912: sqlite3_value_type(apVal[0])==SQLITE_NULL
130913: || sqlite3_value_int64(apVal[0])!=sqlite3_value_int64(pNewRowid)
130914: )){
130915: /* The new rowid is not NULL (in this case the rowid will be
130916: ** automatically assigned and there is no chance of a conflict), and
130917: ** the statement is either an INSERT or an UPDATE that modifies the
130918: ** rowid column. So if the conflict mode is REPLACE, then delete any
130919: ** existing row with rowid=pNewRowid.
130920: **
130921: ** Or, if the conflict mode is not REPLACE, insert the new record into
130922: ** the %_content table. If we hit the duplicate rowid constraint (or any
130923: ** other error) while doing so, return immediately.
130924: **
130925: ** This branch may also run if pNewRowid contains a value that cannot
130926: ** be losslessly converted to an integer. In this case, the eventual
130927: ** call to fts3InsertData() (either just below or further on in this
130928: ** function) will return SQLITE_MISMATCH. If fts3DeleteByRowid is
130929: ** invoked, it will delete zero rows (since no row will have
130930: ** docid=$pNewRowid if $pNewRowid is not an integer value).
130931: */
130932: if( sqlite3_vtab_on_conflict(p->db)==SQLITE_REPLACE ){
130933: rc = fts3DeleteByRowid(p, pNewRowid, &nChng, aSzDel);
130934: }else{
130935: rc = fts3InsertData(p, apVal, pRowid);
130936: bInsertDone = 1;
130937: }
130938: }
130939: }
130940: if( rc!=SQLITE_OK ){
130941: goto update_out;
130942: }
130943:
130944: /* If this is a DELETE or UPDATE operation, remove the old record. */
130945: if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
130946: assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
130947: rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
130948: isRemove = 1;
130949: }
130950:
130951: /* If this is an INSERT or UPDATE operation, insert the new record. */
130952: if( nArg>1 && rc==SQLITE_OK ){
1.2.2.1 ! misho 130953: int iLangid = sqlite3_value_int(apVal[2 + p->nColumn + 2]);
1.2 misho 130954: if( bInsertDone==0 ){
130955: rc = fts3InsertData(p, apVal, pRowid);
130956: if( rc==SQLITE_CONSTRAINT && p->zContentTbl==0 ){
130957: rc = FTS_CORRUPT_VTAB;
130958: }
130959: }
130960: if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
1.2.2.1 ! misho 130961: rc = fts3PendingTermsDocid(p, iLangid, *pRowid);
1.2 misho 130962: }
130963: if( rc==SQLITE_OK ){
130964: assert( p->iPrevDocid==*pRowid );
1.2.2.1 ! misho 130965: rc = fts3InsertTerms(p, iLangid, apVal, aSzIns);
1.2 misho 130966: }
130967: if( p->bHasDocsize ){
130968: fts3InsertDocsize(&rc, p, aSzIns);
130969: }
130970: nChng++;
130971: }
130972:
1.2.2.1 ! misho 130973: if( p->bFts4 ){
1.2 misho 130974: fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng);
130975: }
130976:
130977: update_out:
1.2.2.1 ! misho 130978: sqlite3_free(aSzDel);
1.2 misho 130979: sqlite3Fts3SegmentsClose(p);
130980: return rc;
130981: }
130982:
130983: /*
130984: ** Flush any data in the pending-terms hash table to disk. If successful,
130985: ** merge all segments in the database (including the new segment, if
130986: ** there was any data to flush) into a single segment.
130987: */
130988: SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){
130989: int rc;
130990: rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0);
130991: if( rc==SQLITE_OK ){
130992: rc = fts3DoOptimize(p, 1);
130993: if( rc==SQLITE_OK || rc==SQLITE_DONE ){
130994: int rc2 = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0);
130995: if( rc2!=SQLITE_OK ) rc = rc2;
130996: }else{
130997: sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0);
130998: sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0);
130999: }
131000: }
131001: sqlite3Fts3SegmentsClose(p);
131002: return rc;
131003: }
131004:
131005: #endif
131006:
131007: /************** End of fts3_write.c ******************************************/
131008: /************** Begin file fts3_snippet.c ************************************/
131009: /*
131010: ** 2009 Oct 23
131011: **
131012: ** The author disclaims copyright to this source code. In place of
131013: ** a legal notice, here is a blessing:
131014: **
131015: ** May you do good and not evil.
131016: ** May you find forgiveness for yourself and forgive others.
131017: ** May you share freely, never taking more than you give.
131018: **
131019: ******************************************************************************
131020: */
131021:
131022: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
131023:
131024: /* #include <string.h> */
131025: /* #include <assert.h> */
131026:
131027: /*
131028: ** Characters that may appear in the second argument to matchinfo().
131029: */
131030: #define FTS3_MATCHINFO_NPHRASE 'p' /* 1 value */
131031: #define FTS3_MATCHINFO_NCOL 'c' /* 1 value */
131032: #define FTS3_MATCHINFO_NDOC 'n' /* 1 value */
131033: #define FTS3_MATCHINFO_AVGLENGTH 'a' /* nCol values */
131034: #define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */
131035: #define FTS3_MATCHINFO_LCS 's' /* nCol values */
131036: #define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */
131037:
131038: /*
131039: ** The default value for the second argument to matchinfo().
131040: */
131041: #define FTS3_MATCHINFO_DEFAULT "pcx"
131042:
131043:
131044: /*
131045: ** Used as an fts3ExprIterate() context when loading phrase doclists to
131046: ** Fts3Expr.aDoclist[]/nDoclist.
131047: */
131048: typedef struct LoadDoclistCtx LoadDoclistCtx;
131049: struct LoadDoclistCtx {
131050: Fts3Cursor *pCsr; /* FTS3 Cursor */
131051: int nPhrase; /* Number of phrases seen so far */
131052: int nToken; /* Number of tokens seen so far */
131053: };
131054:
131055: /*
131056: ** The following types are used as part of the implementation of the
131057: ** fts3BestSnippet() routine.
131058: */
131059: typedef struct SnippetIter SnippetIter;
131060: typedef struct SnippetPhrase SnippetPhrase;
131061: typedef struct SnippetFragment SnippetFragment;
131062:
131063: struct SnippetIter {
131064: Fts3Cursor *pCsr; /* Cursor snippet is being generated from */
131065: int iCol; /* Extract snippet from this column */
131066: int nSnippet; /* Requested snippet length (in tokens) */
131067: int nPhrase; /* Number of phrases in query */
131068: SnippetPhrase *aPhrase; /* Array of size nPhrase */
131069: int iCurrent; /* First token of current snippet */
131070: };
131071:
131072: struct SnippetPhrase {
131073: int nToken; /* Number of tokens in phrase */
131074: char *pList; /* Pointer to start of phrase position list */
131075: int iHead; /* Next value in position list */
131076: char *pHead; /* Position list data following iHead */
131077: int iTail; /* Next value in trailing position list */
131078: char *pTail; /* Position list data following iTail */
131079: };
131080:
131081: struct SnippetFragment {
131082: int iCol; /* Column snippet is extracted from */
131083: int iPos; /* Index of first token in snippet */
131084: u64 covered; /* Mask of query phrases covered */
131085: u64 hlmask; /* Mask of snippet terms to highlight */
131086: };
131087:
131088: /*
131089: ** This type is used as an fts3ExprIterate() context object while
131090: ** accumulating the data returned by the matchinfo() function.
131091: */
131092: typedef struct MatchInfo MatchInfo;
131093: struct MatchInfo {
131094: Fts3Cursor *pCursor; /* FTS3 Cursor */
131095: int nCol; /* Number of columns in table */
131096: int nPhrase; /* Number of matchable phrases in query */
131097: sqlite3_int64 nDoc; /* Number of docs in database */
131098: u32 *aMatchinfo; /* Pre-allocated buffer */
131099: };
131100:
131101:
131102:
131103: /*
131104: ** The snippet() and offsets() functions both return text values. An instance
131105: ** of the following structure is used to accumulate those values while the
131106: ** functions are running. See fts3StringAppend() for details.
131107: */
131108: typedef struct StrBuffer StrBuffer;
131109: struct StrBuffer {
131110: char *z; /* Pointer to buffer containing string */
131111: int n; /* Length of z in bytes (excl. nul-term) */
131112: int nAlloc; /* Allocated size of buffer z in bytes */
131113: };
131114:
131115:
131116: /*
131117: ** This function is used to help iterate through a position-list. A position
131118: ** list is a list of unique integers, sorted from smallest to largest. Each
131119: ** element of the list is represented by an FTS3 varint that takes the value
131120: ** of the difference between the current element and the previous one plus
131121: ** two. For example, to store the position-list:
131122: **
131123: ** 4 9 113
131124: **
131125: ** the three varints:
131126: **
131127: ** 6 7 106
131128: **
131129: ** are encoded.
131130: **
131131: ** When this function is called, *pp points to the start of an element of
131132: ** the list. *piPos contains the value of the previous entry in the list.
131133: ** After it returns, *piPos contains the value of the next element of the
131134: ** list and *pp is advanced to the following varint.
131135: */
131136: static void fts3GetDeltaPosition(char **pp, int *piPos){
131137: int iVal;
131138: *pp += sqlite3Fts3GetVarint32(*pp, &iVal);
131139: *piPos += (iVal-2);
131140: }
131141:
131142: /*
131143: ** Helper function for fts3ExprIterate() (see below).
131144: */
131145: static int fts3ExprIterate2(
131146: Fts3Expr *pExpr, /* Expression to iterate phrases of */
131147: int *piPhrase, /* Pointer to phrase counter */
131148: int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */
131149: void *pCtx /* Second argument to pass to callback */
131150: ){
131151: int rc; /* Return code */
131152: int eType = pExpr->eType; /* Type of expression node pExpr */
131153:
131154: if( eType!=FTSQUERY_PHRASE ){
131155: assert( pExpr->pLeft && pExpr->pRight );
131156: rc = fts3ExprIterate2(pExpr->pLeft, piPhrase, x, pCtx);
131157: if( rc==SQLITE_OK && eType!=FTSQUERY_NOT ){
131158: rc = fts3ExprIterate2(pExpr->pRight, piPhrase, x, pCtx);
131159: }
131160: }else{
131161: rc = x(pExpr, *piPhrase, pCtx);
131162: (*piPhrase)++;
131163: }
131164: return rc;
131165: }
131166:
131167: /*
131168: ** Iterate through all phrase nodes in an FTS3 query, except those that
131169: ** are part of a sub-tree that is the right-hand-side of a NOT operator.
131170: ** For each phrase node found, the supplied callback function is invoked.
131171: **
131172: ** If the callback function returns anything other than SQLITE_OK,
131173: ** the iteration is abandoned and the error code returned immediately.
131174: ** Otherwise, SQLITE_OK is returned after a callback has been made for
131175: ** all eligible phrase nodes.
131176: */
131177: static int fts3ExprIterate(
131178: Fts3Expr *pExpr, /* Expression to iterate phrases of */
131179: int (*x)(Fts3Expr*,int,void*), /* Callback function to invoke for phrases */
131180: void *pCtx /* Second argument to pass to callback */
131181: ){
131182: int iPhrase = 0; /* Variable used as the phrase counter */
131183: return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx);
131184: }
131185:
131186: /*
131187: ** This is an fts3ExprIterate() callback used while loading the doclists
131188: ** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also
131189: ** fts3ExprLoadDoclists().
131190: */
131191: static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
131192: int rc = SQLITE_OK;
131193: Fts3Phrase *pPhrase = pExpr->pPhrase;
131194: LoadDoclistCtx *p = (LoadDoclistCtx *)ctx;
131195:
131196: UNUSED_PARAMETER(iPhrase);
131197:
131198: p->nPhrase++;
131199: p->nToken += pPhrase->nToken;
131200:
131201: return rc;
131202: }
131203:
131204: /*
131205: ** Load the doclists for each phrase in the query associated with FTS3 cursor
131206: ** pCsr.
131207: **
131208: ** If pnPhrase is not NULL, then *pnPhrase is set to the number of matchable
131209: ** phrases in the expression (all phrases except those directly or
131210: ** indirectly descended from the right-hand-side of a NOT operator). If
131211: ** pnToken is not NULL, then it is set to the number of tokens in all
131212: ** matchable phrases of the expression.
131213: */
131214: static int fts3ExprLoadDoclists(
131215: Fts3Cursor *pCsr, /* Fts3 cursor for current query */
131216: int *pnPhrase, /* OUT: Number of phrases in query */
131217: int *pnToken /* OUT: Number of tokens in query */
131218: ){
131219: int rc; /* Return Code */
131220: LoadDoclistCtx sCtx = {0,0,0}; /* Context for fts3ExprIterate() */
131221: sCtx.pCsr = pCsr;
131222: rc = fts3ExprIterate(pCsr->pExpr, fts3ExprLoadDoclistsCb, (void *)&sCtx);
131223: if( pnPhrase ) *pnPhrase = sCtx.nPhrase;
131224: if( pnToken ) *pnToken = sCtx.nToken;
131225: return rc;
131226: }
131227:
131228: static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
131229: (*(int *)ctx)++;
131230: UNUSED_PARAMETER(pExpr);
131231: UNUSED_PARAMETER(iPhrase);
131232: return SQLITE_OK;
131233: }
131234: static int fts3ExprPhraseCount(Fts3Expr *pExpr){
131235: int nPhrase = 0;
131236: (void)fts3ExprIterate(pExpr, fts3ExprPhraseCountCb, (void *)&nPhrase);
131237: return nPhrase;
131238: }
131239:
131240: /*
131241: ** Advance the position list iterator specified by the first two
131242: ** arguments so that it points to the first element with a value greater
131243: ** than or equal to parameter iNext.
131244: */
131245: static void fts3SnippetAdvance(char **ppIter, int *piIter, int iNext){
131246: char *pIter = *ppIter;
131247: if( pIter ){
131248: int iIter = *piIter;
131249:
131250: while( iIter<iNext ){
131251: if( 0==(*pIter & 0xFE) ){
131252: iIter = -1;
131253: pIter = 0;
131254: break;
131255: }
131256: fts3GetDeltaPosition(&pIter, &iIter);
131257: }
131258:
131259: *piIter = iIter;
131260: *ppIter = pIter;
131261: }
131262: }
131263:
131264: /*
131265: ** Advance the snippet iterator to the next candidate snippet.
131266: */
131267: static int fts3SnippetNextCandidate(SnippetIter *pIter){
131268: int i; /* Loop counter */
131269:
131270: if( pIter->iCurrent<0 ){
131271: /* The SnippetIter object has just been initialized. The first snippet
131272: ** candidate always starts at offset 0 (even if this candidate has a
131273: ** score of 0.0).
131274: */
131275: pIter->iCurrent = 0;
131276:
131277: /* Advance the 'head' iterator of each phrase to the first offset that
131278: ** is greater than or equal to (iNext+nSnippet).
131279: */
131280: for(i=0; i<pIter->nPhrase; i++){
131281: SnippetPhrase *pPhrase = &pIter->aPhrase[i];
131282: fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet);
131283: }
131284: }else{
131285: int iStart;
131286: int iEnd = 0x7FFFFFFF;
131287:
131288: for(i=0; i<pIter->nPhrase; i++){
131289: SnippetPhrase *pPhrase = &pIter->aPhrase[i];
131290: if( pPhrase->pHead && pPhrase->iHead<iEnd ){
131291: iEnd = pPhrase->iHead;
131292: }
131293: }
131294: if( iEnd==0x7FFFFFFF ){
131295: return 1;
131296: }
131297:
131298: pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1;
131299: for(i=0; i<pIter->nPhrase; i++){
131300: SnippetPhrase *pPhrase = &pIter->aPhrase[i];
131301: fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, iEnd+1);
131302: fts3SnippetAdvance(&pPhrase->pTail, &pPhrase->iTail, iStart);
131303: }
131304: }
131305:
131306: return 0;
131307: }
131308:
131309: /*
131310: ** Retrieve information about the current candidate snippet of snippet
131311: ** iterator pIter.
131312: */
131313: static void fts3SnippetDetails(
131314: SnippetIter *pIter, /* Snippet iterator */
131315: u64 mCovered, /* Bitmask of phrases already covered */
131316: int *piToken, /* OUT: First token of proposed snippet */
131317: int *piScore, /* OUT: "Score" for this snippet */
131318: u64 *pmCover, /* OUT: Bitmask of phrases covered */
131319: u64 *pmHighlight /* OUT: Bitmask of terms to highlight */
131320: ){
131321: int iStart = pIter->iCurrent; /* First token of snippet */
131322: int iScore = 0; /* Score of this snippet */
131323: int i; /* Loop counter */
131324: u64 mCover = 0; /* Mask of phrases covered by this snippet */
131325: u64 mHighlight = 0; /* Mask of tokens to highlight in snippet */
131326:
131327: for(i=0; i<pIter->nPhrase; i++){
131328: SnippetPhrase *pPhrase = &pIter->aPhrase[i];
131329: if( pPhrase->pTail ){
131330: char *pCsr = pPhrase->pTail;
131331: int iCsr = pPhrase->iTail;
131332:
131333: while( iCsr<(iStart+pIter->nSnippet) ){
131334: int j;
131335: u64 mPhrase = (u64)1 << i;
131336: u64 mPos = (u64)1 << (iCsr - iStart);
131337: assert( iCsr>=iStart );
131338: if( (mCover|mCovered)&mPhrase ){
131339: iScore++;
131340: }else{
131341: iScore += 1000;
131342: }
131343: mCover |= mPhrase;
131344:
131345: for(j=0; j<pPhrase->nToken; j++){
131346: mHighlight |= (mPos>>j);
131347: }
131348:
131349: if( 0==(*pCsr & 0x0FE) ) break;
131350: fts3GetDeltaPosition(&pCsr, &iCsr);
131351: }
131352: }
131353: }
131354:
131355: /* Set the output variables before returning. */
131356: *piToken = iStart;
131357: *piScore = iScore;
131358: *pmCover = mCover;
131359: *pmHighlight = mHighlight;
131360: }
131361:
131362: /*
131363: ** This function is an fts3ExprIterate() callback used by fts3BestSnippet().
131364: ** Each invocation populates an element of the SnippetIter.aPhrase[] array.
131365: */
131366: static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){
131367: SnippetIter *p = (SnippetIter *)ctx;
131368: SnippetPhrase *pPhrase = &p->aPhrase[iPhrase];
131369: char *pCsr;
1.2.2.1 ! misho 131370: int rc;
1.2 misho 131371:
131372: pPhrase->nToken = pExpr->pPhrase->nToken;
1.2.2.1 ! misho 131373: rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pCsr);
! 131374: assert( rc==SQLITE_OK || pCsr==0 );
1.2 misho 131375: if( pCsr ){
131376: int iFirst = 0;
131377: pPhrase->pList = pCsr;
131378: fts3GetDeltaPosition(&pCsr, &iFirst);
131379: assert( iFirst>=0 );
131380: pPhrase->pHead = pCsr;
131381: pPhrase->pTail = pCsr;
131382: pPhrase->iHead = iFirst;
131383: pPhrase->iTail = iFirst;
131384: }else{
1.2.2.1 ! misho 131385: assert( rc!=SQLITE_OK || (
! 131386: pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0
! 131387: ));
1.2 misho 131388: }
131389:
1.2.2.1 ! misho 131390: return rc;
1.2 misho 131391: }
131392:
131393: /*
131394: ** Select the fragment of text consisting of nFragment contiguous tokens
131395: ** from column iCol that represent the "best" snippet. The best snippet
131396: ** is the snippet with the highest score, where scores are calculated
131397: ** by adding:
131398: **
131399: ** (a) +1 point for each occurence of a matchable phrase in the snippet.
131400: **
131401: ** (b) +1000 points for the first occurence of each matchable phrase in
131402: ** the snippet for which the corresponding mCovered bit is not set.
131403: **
131404: ** The selected snippet parameters are stored in structure *pFragment before
131405: ** returning. The score of the selected snippet is stored in *piScore
131406: ** before returning.
131407: */
131408: static int fts3BestSnippet(
131409: int nSnippet, /* Desired snippet length */
131410: Fts3Cursor *pCsr, /* Cursor to create snippet for */
131411: int iCol, /* Index of column to create snippet from */
131412: u64 mCovered, /* Mask of phrases already covered */
131413: u64 *pmSeen, /* IN/OUT: Mask of phrases seen */
131414: SnippetFragment *pFragment, /* OUT: Best snippet found */
131415: int *piScore /* OUT: Score of snippet pFragment */
131416: ){
131417: int rc; /* Return Code */
131418: int nList; /* Number of phrases in expression */
131419: SnippetIter sIter; /* Iterates through snippet candidates */
131420: int nByte; /* Number of bytes of space to allocate */
131421: int iBestScore = -1; /* Best snippet score found so far */
131422: int i; /* Loop counter */
131423:
131424: memset(&sIter, 0, sizeof(sIter));
131425:
131426: /* Iterate through the phrases in the expression to count them. The same
131427: ** callback makes sure the doclists are loaded for each phrase.
131428: */
131429: rc = fts3ExprLoadDoclists(pCsr, &nList, 0);
131430: if( rc!=SQLITE_OK ){
131431: return rc;
131432: }
131433:
131434: /* Now that it is known how many phrases there are, allocate and zero
131435: ** the required space using malloc().
131436: */
131437: nByte = sizeof(SnippetPhrase) * nList;
131438: sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte);
131439: if( !sIter.aPhrase ){
131440: return SQLITE_NOMEM;
131441: }
131442: memset(sIter.aPhrase, 0, nByte);
131443:
131444: /* Initialize the contents of the SnippetIter object. Then iterate through
131445: ** the set of phrases in the expression to populate the aPhrase[] array.
131446: */
131447: sIter.pCsr = pCsr;
131448: sIter.iCol = iCol;
131449: sIter.nSnippet = nSnippet;
131450: sIter.nPhrase = nList;
131451: sIter.iCurrent = -1;
131452: (void)fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter);
131453:
131454: /* Set the *pmSeen output variable. */
131455: for(i=0; i<nList; i++){
131456: if( sIter.aPhrase[i].pHead ){
131457: *pmSeen |= (u64)1 << i;
131458: }
131459: }
131460:
131461: /* Loop through all candidate snippets. Store the best snippet in
131462: ** *pFragment. Store its associated 'score' in iBestScore.
131463: */
131464: pFragment->iCol = iCol;
131465: while( !fts3SnippetNextCandidate(&sIter) ){
131466: int iPos;
131467: int iScore;
131468: u64 mCover;
131469: u64 mHighlight;
131470: fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover, &mHighlight);
131471: assert( iScore>=0 );
131472: if( iScore>iBestScore ){
131473: pFragment->iPos = iPos;
131474: pFragment->hlmask = mHighlight;
131475: pFragment->covered = mCover;
131476: iBestScore = iScore;
131477: }
131478: }
131479:
131480: sqlite3_free(sIter.aPhrase);
131481: *piScore = iBestScore;
131482: return SQLITE_OK;
131483: }
131484:
131485:
131486: /*
131487: ** Append a string to the string-buffer passed as the first argument.
131488: **
131489: ** If nAppend is negative, then the length of the string zAppend is
131490: ** determined using strlen().
131491: */
131492: static int fts3StringAppend(
131493: StrBuffer *pStr, /* Buffer to append to */
131494: const char *zAppend, /* Pointer to data to append to buffer */
131495: int nAppend /* Size of zAppend in bytes (or -1) */
131496: ){
131497: if( nAppend<0 ){
131498: nAppend = (int)strlen(zAppend);
131499: }
131500:
131501: /* If there is insufficient space allocated at StrBuffer.z, use realloc()
131502: ** to grow the buffer until so that it is big enough to accomadate the
131503: ** appended data.
131504: */
131505: if( pStr->n+nAppend+1>=pStr->nAlloc ){
131506: int nAlloc = pStr->nAlloc+nAppend+100;
131507: char *zNew = sqlite3_realloc(pStr->z, nAlloc);
131508: if( !zNew ){
131509: return SQLITE_NOMEM;
131510: }
131511: pStr->z = zNew;
131512: pStr->nAlloc = nAlloc;
131513: }
131514:
131515: /* Append the data to the string buffer. */
131516: memcpy(&pStr->z[pStr->n], zAppend, nAppend);
131517: pStr->n += nAppend;
131518: pStr->z[pStr->n] = '\0';
131519:
131520: return SQLITE_OK;
131521: }
131522:
131523: /*
131524: ** The fts3BestSnippet() function often selects snippets that end with a
131525: ** query term. That is, the final term of the snippet is always a term
131526: ** that requires highlighting. For example, if 'X' is a highlighted term
131527: ** and '.' is a non-highlighted term, BestSnippet() may select:
131528: **
131529: ** ........X.....X
131530: **
131531: ** This function "shifts" the beginning of the snippet forward in the
131532: ** document so that there are approximately the same number of
131533: ** non-highlighted terms to the right of the final highlighted term as there
131534: ** are to the left of the first highlighted term. For example, to this:
131535: **
131536: ** ....X.....X....
131537: **
131538: ** This is done as part of extracting the snippet text, not when selecting
131539: ** the snippet. Snippet selection is done based on doclists only, so there
131540: ** is no way for fts3BestSnippet() to know whether or not the document
131541: ** actually contains terms that follow the final highlighted term.
131542: */
131543: static int fts3SnippetShift(
131544: Fts3Table *pTab, /* FTS3 table snippet comes from */
1.2.2.1 ! misho 131545: int iLangid, /* Language id to use in tokenizing */
1.2 misho 131546: int nSnippet, /* Number of tokens desired for snippet */
131547: const char *zDoc, /* Document text to extract snippet from */
131548: int nDoc, /* Size of buffer zDoc in bytes */
131549: int *piPos, /* IN/OUT: First token of snippet */
131550: u64 *pHlmask /* IN/OUT: Mask of tokens to highlight */
131551: ){
131552: u64 hlmask = *pHlmask; /* Local copy of initial highlight-mask */
131553:
131554: if( hlmask ){
131555: int nLeft; /* Tokens to the left of first highlight */
131556: int nRight; /* Tokens to the right of last highlight */
131557: int nDesired; /* Ideal number of tokens to shift forward */
131558:
131559: for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++);
131560: for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++);
131561: nDesired = (nLeft-nRight)/2;
131562:
131563: /* Ideally, the start of the snippet should be pushed forward in the
131564: ** document nDesired tokens. This block checks if there are actually
131565: ** nDesired tokens to the right of the snippet. If so, *piPos and
131566: ** *pHlMask are updated to shift the snippet nDesired tokens to the
131567: ** right. Otherwise, the snippet is shifted by the number of tokens
131568: ** available.
131569: */
131570: if( nDesired>0 ){
131571: int nShift; /* Number of tokens to shift snippet by */
131572: int iCurrent = 0; /* Token counter */
131573: int rc; /* Return Code */
131574: sqlite3_tokenizer_module *pMod;
131575: sqlite3_tokenizer_cursor *pC;
131576: pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule;
131577:
131578: /* Open a cursor on zDoc/nDoc. Check if there are (nSnippet+nDesired)
131579: ** or more tokens in zDoc/nDoc.
131580: */
1.2.2.1 ! misho 131581: rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, iLangid, zDoc, nDoc, &pC);
1.2 misho 131582: if( rc!=SQLITE_OK ){
131583: return rc;
131584: }
131585: while( rc==SQLITE_OK && iCurrent<(nSnippet+nDesired) ){
1.2.2.1 ! misho 131586: const char *ZDUMMY; int DUMMY1 = 0, DUMMY2 = 0, DUMMY3 = 0;
1.2 misho 131587: rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &DUMMY2, &DUMMY3, &iCurrent);
131588: }
131589: pMod->xClose(pC);
131590: if( rc!=SQLITE_OK && rc!=SQLITE_DONE ){ return rc; }
131591:
131592: nShift = (rc==SQLITE_DONE)+iCurrent-nSnippet;
131593: assert( nShift<=nDesired );
131594: if( nShift>0 ){
131595: *piPos += nShift;
131596: *pHlmask = hlmask >> nShift;
131597: }
131598: }
131599: }
131600: return SQLITE_OK;
131601: }
131602:
131603: /*
131604: ** Extract the snippet text for fragment pFragment from cursor pCsr and
131605: ** append it to string buffer pOut.
131606: */
131607: static int fts3SnippetText(
131608: Fts3Cursor *pCsr, /* FTS3 Cursor */
131609: SnippetFragment *pFragment, /* Snippet to extract */
131610: int iFragment, /* Fragment number */
131611: int isLast, /* True for final fragment in snippet */
131612: int nSnippet, /* Number of tokens in extracted snippet */
131613: const char *zOpen, /* String inserted before highlighted term */
131614: const char *zClose, /* String inserted after highlighted term */
131615: const char *zEllipsis, /* String inserted between snippets */
131616: StrBuffer *pOut /* Write output here */
131617: ){
131618: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
131619: int rc; /* Return code */
131620: const char *zDoc; /* Document text to extract snippet from */
131621: int nDoc; /* Size of zDoc in bytes */
131622: int iCurrent = 0; /* Current token number of document */
131623: int iEnd = 0; /* Byte offset of end of current token */
131624: int isShiftDone = 0; /* True after snippet is shifted */
131625: int iPos = pFragment->iPos; /* First token of snippet */
131626: u64 hlmask = pFragment->hlmask; /* Highlight-mask for snippet */
131627: int iCol = pFragment->iCol+1; /* Query column to extract text from */
131628: sqlite3_tokenizer_module *pMod; /* Tokenizer module methods object */
131629: sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor open on zDoc/nDoc */
131630:
131631: zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol);
131632: if( zDoc==0 ){
131633: if( sqlite3_column_type(pCsr->pStmt, iCol)!=SQLITE_NULL ){
131634: return SQLITE_NOMEM;
131635: }
131636: return SQLITE_OK;
131637: }
131638: nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol);
131639:
131640: /* Open a token cursor on the document. */
131641: pMod = (sqlite3_tokenizer_module *)pTab->pTokenizer->pModule;
1.2.2.1 ! misho 131642: rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid, zDoc,nDoc,&pC);
1.2 misho 131643: if( rc!=SQLITE_OK ){
131644: return rc;
131645: }
131646:
131647: while( rc==SQLITE_OK ){
1.2.2.1 ! misho 131648: const char *ZDUMMY; /* Dummy argument used with tokenizer */
! 131649: int DUMMY1 = -1; /* Dummy argument used with tokenizer */
! 131650: int iBegin = 0; /* Offset in zDoc of start of token */
! 131651: int iFin = 0; /* Offset in zDoc of end of token */
! 131652: int isHighlight = 0; /* True for highlighted terms */
! 131653:
! 131654: /* Variable DUMMY1 is initialized to a negative value above. Elsewhere
! 131655: ** in the FTS code the variable that the third argument to xNext points to
! 131656: ** is initialized to zero before the first (*but not necessarily
! 131657: ** subsequent*) call to xNext(). This is done for a particular application
! 131658: ** that needs to know whether or not the tokenizer is being used for
! 131659: ** snippet generation or for some other purpose.
! 131660: **
! 131661: ** Extreme care is required when writing code to depend on this
! 131662: ** initialization. It is not a documented part of the tokenizer interface.
! 131663: ** If a tokenizer is used directly by any code outside of FTS, this
! 131664: ** convention might not be respected. */
1.2 misho 131665: rc = pMod->xNext(pC, &ZDUMMY, &DUMMY1, &iBegin, &iFin, &iCurrent);
131666: if( rc!=SQLITE_OK ){
131667: if( rc==SQLITE_DONE ){
131668: /* Special case - the last token of the snippet is also the last token
131669: ** of the column. Append any punctuation that occurred between the end
131670: ** of the previous token and the end of the document to the output.
131671: ** Then break out of the loop. */
131672: rc = fts3StringAppend(pOut, &zDoc[iEnd], -1);
131673: }
131674: break;
131675: }
131676: if( iCurrent<iPos ){ continue; }
131677:
131678: if( !isShiftDone ){
131679: int n = nDoc - iBegin;
1.2.2.1 ! misho 131680: rc = fts3SnippetShift(
! 131681: pTab, pCsr->iLangid, nSnippet, &zDoc[iBegin], n, &iPos, &hlmask
! 131682: );
1.2 misho 131683: isShiftDone = 1;
131684:
131685: /* Now that the shift has been done, check if the initial "..." are
131686: ** required. They are required if (a) this is not the first fragment,
131687: ** or (b) this fragment does not begin at position 0 of its column.
131688: */
131689: if( rc==SQLITE_OK && (iPos>0 || iFragment>0) ){
131690: rc = fts3StringAppend(pOut, zEllipsis, -1);
131691: }
131692: if( rc!=SQLITE_OK || iCurrent<iPos ) continue;
131693: }
131694:
131695: if( iCurrent>=(iPos+nSnippet) ){
131696: if( isLast ){
131697: rc = fts3StringAppend(pOut, zEllipsis, -1);
131698: }
131699: break;
131700: }
131701:
131702: /* Set isHighlight to true if this term should be highlighted. */
131703: isHighlight = (hlmask & ((u64)1 << (iCurrent-iPos)))!=0;
131704:
131705: if( iCurrent>iPos ) rc = fts3StringAppend(pOut, &zDoc[iEnd], iBegin-iEnd);
131706: if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zOpen, -1);
131707: if( rc==SQLITE_OK ) rc = fts3StringAppend(pOut, &zDoc[iBegin], iFin-iBegin);
131708: if( rc==SQLITE_OK && isHighlight ) rc = fts3StringAppend(pOut, zClose, -1);
131709:
131710: iEnd = iFin;
131711: }
131712:
131713: pMod->xClose(pC);
131714: return rc;
131715: }
131716:
131717:
131718: /*
131719: ** This function is used to count the entries in a column-list (a
131720: ** delta-encoded list of term offsets within a single column of a single
131721: ** row). When this function is called, *ppCollist should point to the
131722: ** beginning of the first varint in the column-list (the varint that
131723: ** contains the position of the first matching term in the column data).
131724: ** Before returning, *ppCollist is set to point to the first byte after
131725: ** the last varint in the column-list (either the 0x00 signifying the end
131726: ** of the position-list, or the 0x01 that precedes the column number of
131727: ** the next column in the position-list).
131728: **
131729: ** The number of elements in the column-list is returned.
131730: */
131731: static int fts3ColumnlistCount(char **ppCollist){
131732: char *pEnd = *ppCollist;
131733: char c = 0;
131734: int nEntry = 0;
131735:
131736: /* A column-list is terminated by either a 0x01 or 0x00. */
131737: while( 0xFE & (*pEnd | c) ){
131738: c = *pEnd++ & 0x80;
131739: if( !c ) nEntry++;
131740: }
131741:
131742: *ppCollist = pEnd;
131743: return nEntry;
131744: }
131745:
131746: /*
131747: ** fts3ExprIterate() callback used to collect the "global" matchinfo stats
131748: ** for a single query.
131749: **
131750: ** fts3ExprIterate() callback to load the 'global' elements of a
131751: ** FTS3_MATCHINFO_HITS matchinfo array. The global stats are those elements
131752: ** of the matchinfo array that are constant for all rows returned by the
131753: ** current query.
131754: **
131755: ** Argument pCtx is actually a pointer to a struct of type MatchInfo. This
131756: ** function populates Matchinfo.aMatchinfo[] as follows:
131757: **
131758: ** for(iCol=0; iCol<nCol; iCol++){
131759: ** aMatchinfo[3*iPhrase*nCol + 3*iCol + 1] = X;
131760: ** aMatchinfo[3*iPhrase*nCol + 3*iCol + 2] = Y;
131761: ** }
131762: **
131763: ** where X is the number of matches for phrase iPhrase is column iCol of all
131764: ** rows of the table. Y is the number of rows for which column iCol contains
131765: ** at least one instance of phrase iPhrase.
131766: **
131767: ** If the phrase pExpr consists entirely of deferred tokens, then all X and
131768: ** Y values are set to nDoc, where nDoc is the number of documents in the
131769: ** file system. This is done because the full-text index doclist is required
131770: ** to calculate these values properly, and the full-text index doclist is
131771: ** not available for deferred tokens.
131772: */
131773: static int fts3ExprGlobalHitsCb(
131774: Fts3Expr *pExpr, /* Phrase expression node */
131775: int iPhrase, /* Phrase number (numbered from zero) */
131776: void *pCtx /* Pointer to MatchInfo structure */
131777: ){
131778: MatchInfo *p = (MatchInfo *)pCtx;
131779: return sqlite3Fts3EvalPhraseStats(
131780: p->pCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol]
131781: );
131782: }
131783:
131784: /*
131785: ** fts3ExprIterate() callback used to collect the "local" part of the
131786: ** FTS3_MATCHINFO_HITS array. The local stats are those elements of the
131787: ** array that are different for each row returned by the query.
131788: */
131789: static int fts3ExprLocalHitsCb(
131790: Fts3Expr *pExpr, /* Phrase expression node */
131791: int iPhrase, /* Phrase number */
131792: void *pCtx /* Pointer to MatchInfo structure */
131793: ){
1.2.2.1 ! misho 131794: int rc = SQLITE_OK;
1.2 misho 131795: MatchInfo *p = (MatchInfo *)pCtx;
131796: int iStart = iPhrase * p->nCol * 3;
131797: int i;
131798:
1.2.2.1 ! misho 131799: for(i=0; i<p->nCol && rc==SQLITE_OK; i++){
1.2 misho 131800: char *pCsr;
1.2.2.1 ! misho 131801: rc = sqlite3Fts3EvalPhrasePoslist(p->pCursor, pExpr, i, &pCsr);
1.2 misho 131802: if( pCsr ){
131803: p->aMatchinfo[iStart+i*3] = fts3ColumnlistCount(&pCsr);
131804: }else{
131805: p->aMatchinfo[iStart+i*3] = 0;
131806: }
131807: }
131808:
1.2.2.1 ! misho 131809: return rc;
1.2 misho 131810: }
131811:
131812: static int fts3MatchinfoCheck(
131813: Fts3Table *pTab,
131814: char cArg,
131815: char **pzErr
131816: ){
131817: if( (cArg==FTS3_MATCHINFO_NPHRASE)
131818: || (cArg==FTS3_MATCHINFO_NCOL)
1.2.2.1 ! misho 131819: || (cArg==FTS3_MATCHINFO_NDOC && pTab->bFts4)
! 131820: || (cArg==FTS3_MATCHINFO_AVGLENGTH && pTab->bFts4)
1.2 misho 131821: || (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize)
131822: || (cArg==FTS3_MATCHINFO_LCS)
131823: || (cArg==FTS3_MATCHINFO_HITS)
131824: ){
131825: return SQLITE_OK;
131826: }
131827: *pzErr = sqlite3_mprintf("unrecognized matchinfo request: %c", cArg);
131828: return SQLITE_ERROR;
131829: }
131830:
131831: static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){
131832: int nVal; /* Number of integers output by cArg */
131833:
131834: switch( cArg ){
131835: case FTS3_MATCHINFO_NDOC:
131836: case FTS3_MATCHINFO_NPHRASE:
131837: case FTS3_MATCHINFO_NCOL:
131838: nVal = 1;
131839: break;
131840:
131841: case FTS3_MATCHINFO_AVGLENGTH:
131842: case FTS3_MATCHINFO_LENGTH:
131843: case FTS3_MATCHINFO_LCS:
131844: nVal = pInfo->nCol;
131845: break;
131846:
131847: default:
131848: assert( cArg==FTS3_MATCHINFO_HITS );
131849: nVal = pInfo->nCol * pInfo->nPhrase * 3;
131850: break;
131851: }
131852:
131853: return nVal;
131854: }
131855:
131856: static int fts3MatchinfoSelectDoctotal(
131857: Fts3Table *pTab,
131858: sqlite3_stmt **ppStmt,
131859: sqlite3_int64 *pnDoc,
131860: const char **paLen
131861: ){
131862: sqlite3_stmt *pStmt;
131863: const char *a;
131864: sqlite3_int64 nDoc;
131865:
131866: if( !*ppStmt ){
131867: int rc = sqlite3Fts3SelectDoctotal(pTab, ppStmt);
131868: if( rc!=SQLITE_OK ) return rc;
131869: }
131870: pStmt = *ppStmt;
131871: assert( sqlite3_data_count(pStmt)==1 );
131872:
131873: a = sqlite3_column_blob(pStmt, 0);
131874: a += sqlite3Fts3GetVarint(a, &nDoc);
131875: if( nDoc==0 ) return FTS_CORRUPT_VTAB;
131876: *pnDoc = (u32)nDoc;
131877:
131878: if( paLen ) *paLen = a;
131879: return SQLITE_OK;
131880: }
131881:
131882: /*
131883: ** An instance of the following structure is used to store state while
131884: ** iterating through a multi-column position-list corresponding to the
131885: ** hits for a single phrase on a single row in order to calculate the
131886: ** values for a matchinfo() FTS3_MATCHINFO_LCS request.
131887: */
131888: typedef struct LcsIterator LcsIterator;
131889: struct LcsIterator {
131890: Fts3Expr *pExpr; /* Pointer to phrase expression */
131891: int iPosOffset; /* Tokens count up to end of this phrase */
131892: char *pRead; /* Cursor used to iterate through aDoclist */
131893: int iPos; /* Current position */
131894: };
131895:
131896: /*
131897: ** If LcsIterator.iCol is set to the following value, the iterator has
131898: ** finished iterating through all offsets for all columns.
131899: */
131900: #define LCS_ITERATOR_FINISHED 0x7FFFFFFF;
131901:
131902: static int fts3MatchinfoLcsCb(
131903: Fts3Expr *pExpr, /* Phrase expression node */
131904: int iPhrase, /* Phrase number (numbered from zero) */
131905: void *pCtx /* Pointer to MatchInfo structure */
131906: ){
131907: LcsIterator *aIter = (LcsIterator *)pCtx;
131908: aIter[iPhrase].pExpr = pExpr;
131909: return SQLITE_OK;
131910: }
131911:
131912: /*
131913: ** Advance the iterator passed as an argument to the next position. Return
131914: ** 1 if the iterator is at EOF or if it now points to the start of the
131915: ** position list for the next column.
131916: */
131917: static int fts3LcsIteratorAdvance(LcsIterator *pIter){
131918: char *pRead = pIter->pRead;
131919: sqlite3_int64 iRead;
131920: int rc = 0;
131921:
131922: pRead += sqlite3Fts3GetVarint(pRead, &iRead);
131923: if( iRead==0 || iRead==1 ){
131924: pRead = 0;
131925: rc = 1;
131926: }else{
131927: pIter->iPos += (int)(iRead-2);
131928: }
131929:
131930: pIter->pRead = pRead;
131931: return rc;
131932: }
131933:
131934: /*
131935: ** This function implements the FTS3_MATCHINFO_LCS matchinfo() flag.
131936: **
131937: ** If the call is successful, the longest-common-substring lengths for each
131938: ** column are written into the first nCol elements of the pInfo->aMatchinfo[]
131939: ** array before returning. SQLITE_OK is returned in this case.
131940: **
131941: ** Otherwise, if an error occurs, an SQLite error code is returned and the
131942: ** data written to the first nCol elements of pInfo->aMatchinfo[] is
131943: ** undefined.
131944: */
131945: static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){
131946: LcsIterator *aIter;
131947: int i;
131948: int iCol;
131949: int nToken = 0;
131950:
131951: /* Allocate and populate the array of LcsIterator objects. The array
131952: ** contains one element for each matchable phrase in the query.
131953: **/
131954: aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase);
131955: if( !aIter ) return SQLITE_NOMEM;
131956: memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase);
131957: (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter);
131958:
131959: for(i=0; i<pInfo->nPhrase; i++){
131960: LcsIterator *pIter = &aIter[i];
131961: nToken -= pIter->pExpr->pPhrase->nToken;
131962: pIter->iPosOffset = nToken;
131963: }
131964:
131965: for(iCol=0; iCol<pInfo->nCol; iCol++){
131966: int nLcs = 0; /* LCS value for this column */
131967: int nLive = 0; /* Number of iterators in aIter not at EOF */
131968:
131969: for(i=0; i<pInfo->nPhrase; i++){
1.2.2.1 ! misho 131970: int rc;
1.2 misho 131971: LcsIterator *pIt = &aIter[i];
1.2.2.1 ! misho 131972: rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead);
! 131973: if( rc!=SQLITE_OK ) return rc;
1.2 misho 131974: if( pIt->pRead ){
131975: pIt->iPos = pIt->iPosOffset;
131976: fts3LcsIteratorAdvance(&aIter[i]);
131977: nLive++;
131978: }
131979: }
131980:
131981: while( nLive>0 ){
131982: LcsIterator *pAdv = 0; /* The iterator to advance by one position */
131983: int nThisLcs = 0; /* LCS for the current iterator positions */
131984:
131985: for(i=0; i<pInfo->nPhrase; i++){
131986: LcsIterator *pIter = &aIter[i];
131987: if( pIter->pRead==0 ){
131988: /* This iterator is already at EOF for this column. */
131989: nThisLcs = 0;
131990: }else{
131991: if( pAdv==0 || pIter->iPos<pAdv->iPos ){
131992: pAdv = pIter;
131993: }
131994: if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){
131995: nThisLcs++;
131996: }else{
131997: nThisLcs = 1;
131998: }
131999: if( nThisLcs>nLcs ) nLcs = nThisLcs;
132000: }
132001: }
132002: if( fts3LcsIteratorAdvance(pAdv) ) nLive--;
132003: }
132004:
132005: pInfo->aMatchinfo[iCol] = nLcs;
132006: }
132007:
132008: sqlite3_free(aIter);
132009: return SQLITE_OK;
132010: }
132011:
132012: /*
132013: ** Populate the buffer pInfo->aMatchinfo[] with an array of integers to
132014: ** be returned by the matchinfo() function. Argument zArg contains the
132015: ** format string passed as the second argument to matchinfo (or the
132016: ** default value "pcx" if no second argument was specified). The format
132017: ** string has already been validated and the pInfo->aMatchinfo[] array
132018: ** is guaranteed to be large enough for the output.
132019: **
132020: ** If bGlobal is true, then populate all fields of the matchinfo() output.
132021: ** If it is false, then assume that those fields that do not change between
132022: ** rows (i.e. FTS3_MATCHINFO_NPHRASE, NCOL, NDOC, AVGLENGTH and part of HITS)
132023: ** have already been populated.
132024: **
132025: ** Return SQLITE_OK if successful, or an SQLite error code if an error
132026: ** occurs. If a value other than SQLITE_OK is returned, the state the
132027: ** pInfo->aMatchinfo[] buffer is left in is undefined.
132028: */
132029: static int fts3MatchinfoValues(
132030: Fts3Cursor *pCsr, /* FTS3 cursor object */
132031: int bGlobal, /* True to grab the global stats */
132032: MatchInfo *pInfo, /* Matchinfo context object */
132033: const char *zArg /* Matchinfo format string */
132034: ){
132035: int rc = SQLITE_OK;
132036: int i;
132037: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
132038: sqlite3_stmt *pSelect = 0;
132039:
132040: for(i=0; rc==SQLITE_OK && zArg[i]; i++){
132041:
132042: switch( zArg[i] ){
132043: case FTS3_MATCHINFO_NPHRASE:
132044: if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase;
132045: break;
132046:
132047: case FTS3_MATCHINFO_NCOL:
132048: if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol;
132049: break;
132050:
132051: case FTS3_MATCHINFO_NDOC:
132052: if( bGlobal ){
132053: sqlite3_int64 nDoc = 0;
132054: rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0);
132055: pInfo->aMatchinfo[0] = (u32)nDoc;
132056: }
132057: break;
132058:
132059: case FTS3_MATCHINFO_AVGLENGTH:
132060: if( bGlobal ){
132061: sqlite3_int64 nDoc; /* Number of rows in table */
132062: const char *a; /* Aggregate column length array */
132063:
132064: rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, &a);
132065: if( rc==SQLITE_OK ){
132066: int iCol;
132067: for(iCol=0; iCol<pInfo->nCol; iCol++){
132068: u32 iVal;
132069: sqlite3_int64 nToken;
132070: a += sqlite3Fts3GetVarint(a, &nToken);
132071: iVal = (u32)(((u32)(nToken&0xffffffff)+nDoc/2)/nDoc);
132072: pInfo->aMatchinfo[iCol] = iVal;
132073: }
132074: }
132075: }
132076: break;
132077:
132078: case FTS3_MATCHINFO_LENGTH: {
132079: sqlite3_stmt *pSelectDocsize = 0;
132080: rc = sqlite3Fts3SelectDocsize(pTab, pCsr->iPrevId, &pSelectDocsize);
132081: if( rc==SQLITE_OK ){
132082: int iCol;
132083: const char *a = sqlite3_column_blob(pSelectDocsize, 0);
132084: for(iCol=0; iCol<pInfo->nCol; iCol++){
132085: sqlite3_int64 nToken;
132086: a += sqlite3Fts3GetVarint(a, &nToken);
132087: pInfo->aMatchinfo[iCol] = (u32)nToken;
132088: }
132089: }
132090: sqlite3_reset(pSelectDocsize);
132091: break;
132092: }
132093:
132094: case FTS3_MATCHINFO_LCS:
132095: rc = fts3ExprLoadDoclists(pCsr, 0, 0);
132096: if( rc==SQLITE_OK ){
132097: rc = fts3MatchinfoLcs(pCsr, pInfo);
132098: }
132099: break;
132100:
132101: default: {
132102: Fts3Expr *pExpr;
132103: assert( zArg[i]==FTS3_MATCHINFO_HITS );
132104: pExpr = pCsr->pExpr;
132105: rc = fts3ExprLoadDoclists(pCsr, 0, 0);
132106: if( rc!=SQLITE_OK ) break;
132107: if( bGlobal ){
132108: if( pCsr->pDeferred ){
132109: rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &pInfo->nDoc, 0);
132110: if( rc!=SQLITE_OK ) break;
132111: }
132112: rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo);
132113: if( rc!=SQLITE_OK ) break;
132114: }
132115: (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo);
132116: break;
132117: }
132118: }
132119:
132120: pInfo->aMatchinfo += fts3MatchinfoSize(pInfo, zArg[i]);
132121: }
132122:
132123: sqlite3_reset(pSelect);
132124: return rc;
132125: }
132126:
132127:
132128: /*
132129: ** Populate pCsr->aMatchinfo[] with data for the current row. The
132130: ** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32).
132131: */
132132: static int fts3GetMatchinfo(
132133: Fts3Cursor *pCsr, /* FTS3 Cursor object */
132134: const char *zArg /* Second argument to matchinfo() function */
132135: ){
132136: MatchInfo sInfo;
132137: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
132138: int rc = SQLITE_OK;
132139: int bGlobal = 0; /* Collect 'global' stats as well as local */
132140:
132141: memset(&sInfo, 0, sizeof(MatchInfo));
132142: sInfo.pCursor = pCsr;
132143: sInfo.nCol = pTab->nColumn;
132144:
132145: /* If there is cached matchinfo() data, but the format string for the
132146: ** cache does not match the format string for this request, discard
132147: ** the cached data. */
132148: if( pCsr->zMatchinfo && strcmp(pCsr->zMatchinfo, zArg) ){
132149: assert( pCsr->aMatchinfo );
132150: sqlite3_free(pCsr->aMatchinfo);
132151: pCsr->zMatchinfo = 0;
132152: pCsr->aMatchinfo = 0;
132153: }
132154:
132155: /* If Fts3Cursor.aMatchinfo[] is NULL, then this is the first time the
132156: ** matchinfo function has been called for this query. In this case
132157: ** allocate the array used to accumulate the matchinfo data and
132158: ** initialize those elements that are constant for every row.
132159: */
132160: if( pCsr->aMatchinfo==0 ){
132161: int nMatchinfo = 0; /* Number of u32 elements in match-info */
132162: int nArg; /* Bytes in zArg */
132163: int i; /* Used to iterate through zArg */
132164:
132165: /* Determine the number of phrases in the query */
132166: pCsr->nPhrase = fts3ExprPhraseCount(pCsr->pExpr);
132167: sInfo.nPhrase = pCsr->nPhrase;
132168:
132169: /* Determine the number of integers in the buffer returned by this call. */
132170: for(i=0; zArg[i]; i++){
132171: nMatchinfo += fts3MatchinfoSize(&sInfo, zArg[i]);
132172: }
132173:
132174: /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */
132175: nArg = (int)strlen(zArg);
132176: pCsr->aMatchinfo = (u32 *)sqlite3_malloc(sizeof(u32)*nMatchinfo + nArg + 1);
132177: if( !pCsr->aMatchinfo ) return SQLITE_NOMEM;
132178:
132179: pCsr->zMatchinfo = (char *)&pCsr->aMatchinfo[nMatchinfo];
132180: pCsr->nMatchinfo = nMatchinfo;
132181: memcpy(pCsr->zMatchinfo, zArg, nArg+1);
132182: memset(pCsr->aMatchinfo, 0, sizeof(u32)*nMatchinfo);
132183: pCsr->isMatchinfoNeeded = 1;
132184: bGlobal = 1;
132185: }
132186:
132187: sInfo.aMatchinfo = pCsr->aMatchinfo;
132188: sInfo.nPhrase = pCsr->nPhrase;
132189: if( pCsr->isMatchinfoNeeded ){
132190: rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg);
132191: pCsr->isMatchinfoNeeded = 0;
132192: }
132193:
132194: return rc;
132195: }
132196:
132197: /*
132198: ** Implementation of snippet() function.
132199: */
132200: SQLITE_PRIVATE void sqlite3Fts3Snippet(
132201: sqlite3_context *pCtx, /* SQLite function call context */
132202: Fts3Cursor *pCsr, /* Cursor object */
132203: const char *zStart, /* Snippet start text - "<b>" */
132204: const char *zEnd, /* Snippet end text - "</b>" */
132205: const char *zEllipsis, /* Snippet ellipsis text - "<b>...</b>" */
132206: int iCol, /* Extract snippet from this column */
132207: int nToken /* Approximate number of tokens in snippet */
132208: ){
132209: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
132210: int rc = SQLITE_OK;
132211: int i;
132212: StrBuffer res = {0, 0, 0};
132213:
132214: /* The returned text includes up to four fragments of text extracted from
132215: ** the data in the current row. The first iteration of the for(...) loop
132216: ** below attempts to locate a single fragment of text nToken tokens in
132217: ** size that contains at least one instance of all phrases in the query
132218: ** expression that appear in the current row. If such a fragment of text
132219: ** cannot be found, the second iteration of the loop attempts to locate
132220: ** a pair of fragments, and so on.
132221: */
132222: int nSnippet = 0; /* Number of fragments in this snippet */
132223: SnippetFragment aSnippet[4]; /* Maximum of 4 fragments per snippet */
132224: int nFToken = -1; /* Number of tokens in each fragment */
132225:
132226: if( !pCsr->pExpr ){
132227: sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
132228: return;
132229: }
132230:
132231: for(nSnippet=1; 1; nSnippet++){
132232:
132233: int iSnip; /* Loop counter 0..nSnippet-1 */
132234: u64 mCovered = 0; /* Bitmask of phrases covered by snippet */
132235: u64 mSeen = 0; /* Bitmask of phrases seen by BestSnippet() */
132236:
132237: if( nToken>=0 ){
132238: nFToken = (nToken+nSnippet-1) / nSnippet;
132239: }else{
132240: nFToken = -1 * nToken;
132241: }
132242:
132243: for(iSnip=0; iSnip<nSnippet; iSnip++){
132244: int iBestScore = -1; /* Best score of columns checked so far */
132245: int iRead; /* Used to iterate through columns */
132246: SnippetFragment *pFragment = &aSnippet[iSnip];
132247:
132248: memset(pFragment, 0, sizeof(*pFragment));
132249:
132250: /* Loop through all columns of the table being considered for snippets.
132251: ** If the iCol argument to this function was negative, this means all
132252: ** columns of the FTS3 table. Otherwise, only column iCol is considered.
132253: */
132254: for(iRead=0; iRead<pTab->nColumn; iRead++){
132255: SnippetFragment sF = {0, 0, 0, 0};
132256: int iS;
132257: if( iCol>=0 && iRead!=iCol ) continue;
132258:
132259: /* Find the best snippet of nFToken tokens in column iRead. */
132260: rc = fts3BestSnippet(nFToken, pCsr, iRead, mCovered, &mSeen, &sF, &iS);
132261: if( rc!=SQLITE_OK ){
132262: goto snippet_out;
132263: }
132264: if( iS>iBestScore ){
132265: *pFragment = sF;
132266: iBestScore = iS;
132267: }
132268: }
132269:
132270: mCovered |= pFragment->covered;
132271: }
132272:
132273: /* If all query phrases seen by fts3BestSnippet() are present in at least
132274: ** one of the nSnippet snippet fragments, break out of the loop.
132275: */
132276: assert( (mCovered&mSeen)==mCovered );
132277: if( mSeen==mCovered || nSnippet==SizeofArray(aSnippet) ) break;
132278: }
132279:
132280: assert( nFToken>0 );
132281:
132282: for(i=0; i<nSnippet && rc==SQLITE_OK; i++){
132283: rc = fts3SnippetText(pCsr, &aSnippet[i],
132284: i, (i==nSnippet-1), nFToken, zStart, zEnd, zEllipsis, &res
132285: );
132286: }
132287:
132288: snippet_out:
132289: sqlite3Fts3SegmentsClose(pTab);
132290: if( rc!=SQLITE_OK ){
132291: sqlite3_result_error_code(pCtx, rc);
132292: sqlite3_free(res.z);
132293: }else{
132294: sqlite3_result_text(pCtx, res.z, -1, sqlite3_free);
132295: }
132296: }
132297:
132298:
132299: typedef struct TermOffset TermOffset;
132300: typedef struct TermOffsetCtx TermOffsetCtx;
132301:
132302: struct TermOffset {
132303: char *pList; /* Position-list */
132304: int iPos; /* Position just read from pList */
132305: int iOff; /* Offset of this term from read positions */
132306: };
132307:
132308: struct TermOffsetCtx {
132309: Fts3Cursor *pCsr;
132310: int iCol; /* Column of table to populate aTerm for */
132311: int iTerm;
132312: sqlite3_int64 iDocid;
132313: TermOffset *aTerm;
132314: };
132315:
132316: /*
132317: ** This function is an fts3ExprIterate() callback used by sqlite3Fts3Offsets().
132318: */
132319: static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){
132320: TermOffsetCtx *p = (TermOffsetCtx *)ctx;
132321: int nTerm; /* Number of tokens in phrase */
132322: int iTerm; /* For looping through nTerm phrase terms */
132323: char *pList; /* Pointer to position list for phrase */
132324: int iPos = 0; /* First position in position-list */
1.2.2.1 ! misho 132325: int rc;
1.2 misho 132326:
132327: UNUSED_PARAMETER(iPhrase);
1.2.2.1 ! misho 132328: rc = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol, &pList);
1.2 misho 132329: nTerm = pExpr->pPhrase->nToken;
132330: if( pList ){
132331: fts3GetDeltaPosition(&pList, &iPos);
132332: assert( iPos>=0 );
132333: }
132334:
132335: for(iTerm=0; iTerm<nTerm; iTerm++){
132336: TermOffset *pT = &p->aTerm[p->iTerm++];
132337: pT->iOff = nTerm-iTerm-1;
132338: pT->pList = pList;
132339: pT->iPos = iPos;
132340: }
132341:
1.2.2.1 ! misho 132342: return rc;
1.2 misho 132343: }
132344:
132345: /*
132346: ** Implementation of offsets() function.
132347: */
132348: SQLITE_PRIVATE void sqlite3Fts3Offsets(
132349: sqlite3_context *pCtx, /* SQLite function call context */
132350: Fts3Cursor *pCsr /* Cursor object */
132351: ){
132352: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
132353: sqlite3_tokenizer_module const *pMod = pTab->pTokenizer->pModule;
132354: int rc; /* Return Code */
132355: int nToken; /* Number of tokens in query */
132356: int iCol; /* Column currently being processed */
132357: StrBuffer res = {0, 0, 0}; /* Result string */
132358: TermOffsetCtx sCtx; /* Context for fts3ExprTermOffsetInit() */
132359:
132360: if( !pCsr->pExpr ){
132361: sqlite3_result_text(pCtx, "", 0, SQLITE_STATIC);
132362: return;
132363: }
132364:
132365: memset(&sCtx, 0, sizeof(sCtx));
132366: assert( pCsr->isRequireSeek==0 );
132367:
132368: /* Count the number of terms in the query */
132369: rc = fts3ExprLoadDoclists(pCsr, 0, &nToken);
132370: if( rc!=SQLITE_OK ) goto offsets_out;
132371:
132372: /* Allocate the array of TermOffset iterators. */
132373: sCtx.aTerm = (TermOffset *)sqlite3_malloc(sizeof(TermOffset)*nToken);
132374: if( 0==sCtx.aTerm ){
132375: rc = SQLITE_NOMEM;
132376: goto offsets_out;
132377: }
132378: sCtx.iDocid = pCsr->iPrevId;
132379: sCtx.pCsr = pCsr;
132380:
132381: /* Loop through the table columns, appending offset information to
132382: ** string-buffer res for each column.
132383: */
132384: for(iCol=0; iCol<pTab->nColumn; iCol++){
132385: sqlite3_tokenizer_cursor *pC; /* Tokenizer cursor */
1.2.2.1 ! misho 132386: const char *ZDUMMY; /* Dummy argument used with xNext() */
! 132387: int NDUMMY = 0; /* Dummy argument used with xNext() */
! 132388: int iStart = 0;
! 132389: int iEnd = 0;
! 132390: int iCurrent = 0;
1.2 misho 132391: const char *zDoc;
132392: int nDoc;
132393:
132394: /* Initialize the contents of sCtx.aTerm[] for column iCol. There is
132395: ** no way that this operation can fail, so the return code from
132396: ** fts3ExprIterate() can be discarded.
132397: */
132398: sCtx.iCol = iCol;
132399: sCtx.iTerm = 0;
132400: (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void *)&sCtx);
132401:
132402: /* Retreive the text stored in column iCol. If an SQL NULL is stored
132403: ** in column iCol, jump immediately to the next iteration of the loop.
132404: ** If an OOM occurs while retrieving the data (this can happen if SQLite
132405: ** needs to transform the data from utf-16 to utf-8), return SQLITE_NOMEM
132406: ** to the caller.
132407: */
132408: zDoc = (const char *)sqlite3_column_text(pCsr->pStmt, iCol+1);
132409: nDoc = sqlite3_column_bytes(pCsr->pStmt, iCol+1);
132410: if( zDoc==0 ){
132411: if( sqlite3_column_type(pCsr->pStmt, iCol+1)==SQLITE_NULL ){
132412: continue;
132413: }
132414: rc = SQLITE_NOMEM;
132415: goto offsets_out;
132416: }
132417:
132418: /* Initialize a tokenizer iterator to iterate through column iCol. */
1.2.2.1 ! misho 132419: rc = sqlite3Fts3OpenTokenizer(pTab->pTokenizer, pCsr->iLangid,
! 132420: zDoc, nDoc, &pC
! 132421: );
1.2 misho 132422: if( rc!=SQLITE_OK ) goto offsets_out;
132423:
132424: rc = pMod->xNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent);
132425: while( rc==SQLITE_OK ){
132426: int i; /* Used to loop through terms */
132427: int iMinPos = 0x7FFFFFFF; /* Position of next token */
132428: TermOffset *pTerm = 0; /* TermOffset associated with next token */
132429:
132430: for(i=0; i<nToken; i++){
132431: TermOffset *pT = &sCtx.aTerm[i];
132432: if( pT->pList && (pT->iPos-pT->iOff)<iMinPos ){
132433: iMinPos = pT->iPos-pT->iOff;
132434: pTerm = pT;
132435: }
132436: }
132437:
132438: if( !pTerm ){
132439: /* All offsets for this column have been gathered. */
132440: rc = SQLITE_DONE;
132441: }else{
132442: assert( iCurrent<=iMinPos );
132443: if( 0==(0xFE&*pTerm->pList) ){
132444: pTerm->pList = 0;
132445: }else{
132446: fts3GetDeltaPosition(&pTerm->pList, &pTerm->iPos);
132447: }
132448: while( rc==SQLITE_OK && iCurrent<iMinPos ){
132449: rc = pMod->xNext(pC, &ZDUMMY, &NDUMMY, &iStart, &iEnd, &iCurrent);
132450: }
132451: if( rc==SQLITE_OK ){
132452: char aBuffer[64];
132453: sqlite3_snprintf(sizeof(aBuffer), aBuffer,
132454: "%d %d %d %d ", iCol, pTerm-sCtx.aTerm, iStart, iEnd-iStart
132455: );
132456: rc = fts3StringAppend(&res, aBuffer, -1);
132457: }else if( rc==SQLITE_DONE && pTab->zContentTbl==0 ){
132458: rc = FTS_CORRUPT_VTAB;
132459: }
132460: }
132461: }
132462: if( rc==SQLITE_DONE ){
132463: rc = SQLITE_OK;
132464: }
132465:
132466: pMod->xClose(pC);
132467: if( rc!=SQLITE_OK ) goto offsets_out;
132468: }
132469:
132470: offsets_out:
132471: sqlite3_free(sCtx.aTerm);
132472: assert( rc!=SQLITE_DONE );
132473: sqlite3Fts3SegmentsClose(pTab);
132474: if( rc!=SQLITE_OK ){
132475: sqlite3_result_error_code(pCtx, rc);
132476: sqlite3_free(res.z);
132477: }else{
132478: sqlite3_result_text(pCtx, res.z, res.n-1, sqlite3_free);
132479: }
132480: return;
132481: }
132482:
132483: /*
132484: ** Implementation of matchinfo() function.
132485: */
132486: SQLITE_PRIVATE void sqlite3Fts3Matchinfo(
132487: sqlite3_context *pContext, /* Function call context */
132488: Fts3Cursor *pCsr, /* FTS3 table cursor */
132489: const char *zArg /* Second arg to matchinfo() function */
132490: ){
132491: Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
132492: int rc;
132493: int i;
132494: const char *zFormat;
132495:
132496: if( zArg ){
132497: for(i=0; zArg[i]; i++){
132498: char *zErr = 0;
132499: if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){
132500: sqlite3_result_error(pContext, zErr, -1);
132501: sqlite3_free(zErr);
132502: return;
132503: }
132504: }
132505: zFormat = zArg;
132506: }else{
132507: zFormat = FTS3_MATCHINFO_DEFAULT;
132508: }
132509:
132510: if( !pCsr->pExpr ){
132511: sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC);
132512: return;
132513: }
132514:
132515: /* Retrieve matchinfo() data. */
132516: rc = fts3GetMatchinfo(pCsr, zFormat);
132517: sqlite3Fts3SegmentsClose(pTab);
132518:
132519: if( rc!=SQLITE_OK ){
132520: sqlite3_result_error_code(pContext, rc);
132521: }else{
132522: int n = pCsr->nMatchinfo * sizeof(u32);
132523: sqlite3_result_blob(pContext, pCsr->aMatchinfo, n, SQLITE_TRANSIENT);
132524: }
132525: }
132526:
132527: #endif
132528:
132529: /************** End of fts3_snippet.c ****************************************/
1.2.2.1 ! misho 132530: /************** Begin file fts3_unicode.c ************************************/
! 132531: /*
! 132532: ** 2012 May 24
! 132533: **
! 132534: ** The author disclaims copyright to this source code. In place of
! 132535: ** a legal notice, here is a blessing:
! 132536: **
! 132537: ** May you do good and not evil.
! 132538: ** May you find forgiveness for yourself and forgive others.
! 132539: ** May you share freely, never taking more than you give.
! 132540: **
! 132541: ******************************************************************************
! 132542: **
! 132543: ** Implementation of the "unicode" full-text-search tokenizer.
! 132544: */
! 132545:
! 132546: #ifdef SQLITE_ENABLE_FTS4_UNICODE61
! 132547:
! 132548: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
! 132549:
! 132550: /* #include <assert.h> */
! 132551: /* #include <stdlib.h> */
! 132552: /* #include <stdio.h> */
! 132553: /* #include <string.h> */
! 132554:
! 132555:
! 132556: /*
! 132557: ** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied
! 132558: ** from the sqlite3 source file utf.c. If this file is compiled as part
! 132559: ** of the amalgamation, they are not required.
! 132560: */
! 132561: #ifndef SQLITE_AMALGAMATION
! 132562:
! 132563: static const unsigned char sqlite3Utf8Trans1[] = {
! 132564: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
! 132565: 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
! 132566: 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
! 132567: 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
! 132568: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
! 132569: 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
! 132570: 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
! 132571: 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00,
! 132572: };
! 132573:
! 132574: #define READ_UTF8(zIn, zTerm, c) \
! 132575: c = *(zIn++); \
! 132576: if( c>=0xc0 ){ \
! 132577: c = sqlite3Utf8Trans1[c-0xc0]; \
! 132578: while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \
! 132579: c = (c<<6) + (0x3f & *(zIn++)); \
! 132580: } \
! 132581: if( c<0x80 \
! 132582: || (c&0xFFFFF800)==0xD800 \
! 132583: || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \
! 132584: }
! 132585:
! 132586: #define WRITE_UTF8(zOut, c) { \
! 132587: if( c<0x00080 ){ \
! 132588: *zOut++ = (u8)(c&0xFF); \
! 132589: } \
! 132590: else if( c<0x00800 ){ \
! 132591: *zOut++ = 0xC0 + (u8)((c>>6)&0x1F); \
! 132592: *zOut++ = 0x80 + (u8)(c & 0x3F); \
! 132593: } \
! 132594: else if( c<0x10000 ){ \
! 132595: *zOut++ = 0xE0 + (u8)((c>>12)&0x0F); \
! 132596: *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
! 132597: *zOut++ = 0x80 + (u8)(c & 0x3F); \
! 132598: }else{ \
! 132599: *zOut++ = 0xF0 + (u8)((c>>18) & 0x07); \
! 132600: *zOut++ = 0x80 + (u8)((c>>12) & 0x3F); \
! 132601: *zOut++ = 0x80 + (u8)((c>>6) & 0x3F); \
! 132602: *zOut++ = 0x80 + (u8)(c & 0x3F); \
! 132603: } \
! 132604: }
! 132605:
! 132606: #endif /* ifndef SQLITE_AMALGAMATION */
! 132607:
! 132608: typedef struct unicode_tokenizer unicode_tokenizer;
! 132609: typedef struct unicode_cursor unicode_cursor;
! 132610:
! 132611: struct unicode_tokenizer {
! 132612: sqlite3_tokenizer base;
! 132613: int bRemoveDiacritic;
! 132614: int nException;
! 132615: int *aiException;
! 132616: };
! 132617:
! 132618: struct unicode_cursor {
! 132619: sqlite3_tokenizer_cursor base;
! 132620: const unsigned char *aInput; /* Input text being tokenized */
! 132621: int nInput; /* Size of aInput[] in bytes */
! 132622: int iOff; /* Current offset within aInput[] */
! 132623: int iToken; /* Index of next token to be returned */
! 132624: char *zToken; /* storage for current token */
! 132625: int nAlloc; /* space allocated at zToken */
! 132626: };
! 132627:
! 132628:
! 132629: /*
! 132630: ** Destroy a tokenizer allocated by unicodeCreate().
! 132631: */
! 132632: static int unicodeDestroy(sqlite3_tokenizer *pTokenizer){
! 132633: if( pTokenizer ){
! 132634: unicode_tokenizer *p = (unicode_tokenizer *)pTokenizer;
! 132635: sqlite3_free(p->aiException);
! 132636: sqlite3_free(p);
! 132637: }
! 132638: return SQLITE_OK;
! 132639: }
! 132640:
! 132641: /*
! 132642: ** As part of a tokenchars= or separators= option, the CREATE VIRTUAL TABLE
! 132643: ** statement has specified that the tokenizer for this table shall consider
! 132644: ** all characters in string zIn/nIn to be separators (if bAlnum==0) or
! 132645: ** token characters (if bAlnum==1).
! 132646: **
! 132647: ** For each codepoint in the zIn/nIn string, this function checks if the
! 132648: ** sqlite3FtsUnicodeIsalnum() function already returns the desired result.
! 132649: ** If so, no action is taken. Otherwise, the codepoint is added to the
! 132650: ** unicode_tokenizer.aiException[] array. For the purposes of tokenization,
! 132651: ** the return value of sqlite3FtsUnicodeIsalnum() is inverted for all
! 132652: ** codepoints in the aiException[] array.
! 132653: **
! 132654: ** If a standalone diacritic mark (one that sqlite3FtsUnicodeIsdiacritic()
! 132655: ** identifies as a diacritic) occurs in the zIn/nIn string it is ignored.
! 132656: ** It is not possible to change the behaviour of the tokenizer with respect
! 132657: ** to these codepoints.
! 132658: */
! 132659: static int unicodeAddExceptions(
! 132660: unicode_tokenizer *p, /* Tokenizer to add exceptions to */
! 132661: int bAlnum, /* Replace Isalnum() return value with this */
! 132662: const char *zIn, /* Array of characters to make exceptions */
! 132663: int nIn /* Length of z in bytes */
! 132664: ){
! 132665: const unsigned char *z = (const unsigned char *)zIn;
! 132666: const unsigned char *zTerm = &z[nIn];
! 132667: int iCode;
! 132668: int nEntry = 0;
! 132669:
! 132670: assert( bAlnum==0 || bAlnum==1 );
! 132671:
! 132672: while( z<zTerm ){
! 132673: READ_UTF8(z, zTerm, iCode);
! 132674: assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 );
! 132675: if( sqlite3FtsUnicodeIsalnum(iCode)!=bAlnum
! 132676: && sqlite3FtsUnicodeIsdiacritic(iCode)==0
! 132677: ){
! 132678: nEntry++;
! 132679: }
! 132680: }
! 132681:
! 132682: if( nEntry ){
! 132683: int *aNew; /* New aiException[] array */
! 132684: int nNew; /* Number of valid entries in array aNew[] */
! 132685:
! 132686: aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int));
! 132687: if( aNew==0 ) return SQLITE_NOMEM;
! 132688: nNew = p->nException;
! 132689:
! 132690: z = (const unsigned char *)zIn;
! 132691: while( z<zTerm ){
! 132692: READ_UTF8(z, zTerm, iCode);
! 132693: if( sqlite3FtsUnicodeIsalnum(iCode)!=bAlnum
! 132694: && sqlite3FtsUnicodeIsdiacritic(iCode)==0
! 132695: ){
! 132696: int i, j;
! 132697: for(i=0; i<nNew && aNew[i]<iCode; i++);
! 132698: for(j=nNew; j>i; j--) aNew[j] = aNew[j-1];
! 132699: aNew[i] = iCode;
! 132700: nNew++;
! 132701: }
! 132702: }
! 132703: p->aiException = aNew;
! 132704: p->nException = nNew;
! 132705: }
! 132706:
! 132707: return SQLITE_OK;
! 132708: }
! 132709:
! 132710: /*
! 132711: ** Return true if the p->aiException[] array contains the value iCode.
! 132712: */
! 132713: static int unicodeIsException(unicode_tokenizer *p, int iCode){
! 132714: if( p->nException>0 ){
! 132715: int *a = p->aiException;
! 132716: int iLo = 0;
! 132717: int iHi = p->nException-1;
! 132718:
! 132719: while( iHi>=iLo ){
! 132720: int iTest = (iHi + iLo) / 2;
! 132721: if( iCode==a[iTest] ){
! 132722: return 1;
! 132723: }else if( iCode>a[iTest] ){
! 132724: iLo = iTest+1;
! 132725: }else{
! 132726: iHi = iTest-1;
! 132727: }
! 132728: }
! 132729: }
! 132730:
! 132731: return 0;
! 132732: }
! 132733:
! 132734: /*
! 132735: ** Return true if, for the purposes of tokenization, codepoint iCode is
! 132736: ** considered a token character (not a separator).
! 132737: */
! 132738: static int unicodeIsAlnum(unicode_tokenizer *p, int iCode){
! 132739: assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 );
! 132740: return sqlite3FtsUnicodeIsalnum(iCode) ^ unicodeIsException(p, iCode);
! 132741: }
! 132742:
! 132743: /*
! 132744: ** Create a new tokenizer instance.
! 132745: */
! 132746: static int unicodeCreate(
! 132747: int nArg, /* Size of array argv[] */
! 132748: const char * const *azArg, /* Tokenizer creation arguments */
! 132749: sqlite3_tokenizer **pp /* OUT: New tokenizer handle */
! 132750: ){
! 132751: unicode_tokenizer *pNew; /* New tokenizer object */
! 132752: int i;
! 132753: int rc = SQLITE_OK;
! 132754:
! 132755: pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer));
! 132756: if( pNew==NULL ) return SQLITE_NOMEM;
! 132757: memset(pNew, 0, sizeof(unicode_tokenizer));
! 132758: pNew->bRemoveDiacritic = 1;
! 132759:
! 132760: for(i=0; rc==SQLITE_OK && i<nArg; i++){
! 132761: const char *z = azArg[i];
! 132762: int n = strlen(z);
! 132763:
! 132764: if( n==19 && memcmp("remove_diacritics=1", z, 19)==0 ){
! 132765: pNew->bRemoveDiacritic = 1;
! 132766: }
! 132767: else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){
! 132768: pNew->bRemoveDiacritic = 0;
! 132769: }
! 132770: else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){
! 132771: rc = unicodeAddExceptions(pNew, 1, &z[11], n-11);
! 132772: }
! 132773: else if( n>=11 && memcmp("separators=", z, 11)==0 ){
! 132774: rc = unicodeAddExceptions(pNew, 0, &z[11], n-11);
! 132775: }
! 132776: else{
! 132777: /* Unrecognized argument */
! 132778: rc = SQLITE_ERROR;
! 132779: }
! 132780: }
! 132781:
! 132782: if( rc!=SQLITE_OK ){
! 132783: unicodeDestroy((sqlite3_tokenizer *)pNew);
! 132784: pNew = 0;
! 132785: }
! 132786: *pp = (sqlite3_tokenizer *)pNew;
! 132787: return rc;
! 132788: }
! 132789:
! 132790: /*
! 132791: ** Prepare to begin tokenizing a particular string. The input
! 132792: ** string to be tokenized is pInput[0..nBytes-1]. A cursor
! 132793: ** used to incrementally tokenize this string is returned in
! 132794: ** *ppCursor.
! 132795: */
! 132796: static int unicodeOpen(
! 132797: sqlite3_tokenizer *p, /* The tokenizer */
! 132798: const char *aInput, /* Input string */
! 132799: int nInput, /* Size of string aInput in bytes */
! 132800: sqlite3_tokenizer_cursor **pp /* OUT: New cursor object */
! 132801: ){
! 132802: unicode_cursor *pCsr;
! 132803:
! 132804: pCsr = (unicode_cursor *)sqlite3_malloc(sizeof(unicode_cursor));
! 132805: if( pCsr==0 ){
! 132806: return SQLITE_NOMEM;
! 132807: }
! 132808: memset(pCsr, 0, sizeof(unicode_cursor));
! 132809:
! 132810: pCsr->aInput = (const unsigned char *)aInput;
! 132811: if( aInput==0 ){
! 132812: pCsr->nInput = 0;
! 132813: }else if( nInput<0 ){
! 132814: pCsr->nInput = (int)strlen(aInput);
! 132815: }else{
! 132816: pCsr->nInput = nInput;
! 132817: }
! 132818:
! 132819: *pp = &pCsr->base;
! 132820: UNUSED_PARAMETER(p);
! 132821: return SQLITE_OK;
! 132822: }
! 132823:
! 132824: /*
! 132825: ** Close a tokenization cursor previously opened by a call to
! 132826: ** simpleOpen() above.
! 132827: */
! 132828: static int unicodeClose(sqlite3_tokenizer_cursor *pCursor){
! 132829: unicode_cursor *pCsr = (unicode_cursor *) pCursor;
! 132830: sqlite3_free(pCsr->zToken);
! 132831: sqlite3_free(pCsr);
! 132832: return SQLITE_OK;
! 132833: }
! 132834:
! 132835: /*
! 132836: ** Extract the next token from a tokenization cursor. The cursor must
! 132837: ** have been opened by a prior call to simpleOpen().
! 132838: */
! 132839: static int unicodeNext(
! 132840: sqlite3_tokenizer_cursor *pC, /* Cursor returned by simpleOpen */
! 132841: const char **paToken, /* OUT: Token text */
! 132842: int *pnToken, /* OUT: Number of bytes at *paToken */
! 132843: int *piStart, /* OUT: Starting offset of token */
! 132844: int *piEnd, /* OUT: Ending offset of token */
! 132845: int *piPos /* OUT: Position integer of token */
! 132846: ){
! 132847: unicode_cursor *pCsr = (unicode_cursor *)pC;
! 132848: unicode_tokenizer *p = ((unicode_tokenizer *)pCsr->base.pTokenizer);
! 132849: int iCode;
! 132850: char *zOut;
! 132851: const unsigned char *z = &pCsr->aInput[pCsr->iOff];
! 132852: const unsigned char *zStart = z;
! 132853: const unsigned char *zEnd;
! 132854: const unsigned char *zTerm = &pCsr->aInput[pCsr->nInput];
! 132855:
! 132856: /* Scan past any delimiter characters before the start of the next token.
! 132857: ** Return SQLITE_DONE early if this takes us all the way to the end of
! 132858: ** the input. */
! 132859: while( z<zTerm ){
! 132860: READ_UTF8(z, zTerm, iCode);
! 132861: if( unicodeIsAlnum(p, iCode) ) break;
! 132862: zStart = z;
! 132863: }
! 132864: if( zStart>=zTerm ) return SQLITE_DONE;
! 132865:
! 132866: zOut = pCsr->zToken;
! 132867: do {
! 132868: int iOut;
! 132869:
! 132870: /* Grow the output buffer if required. */
! 132871: if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){
! 132872: char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64);
! 132873: if( !zNew ) return SQLITE_NOMEM;
! 132874: zOut = &zNew[zOut - pCsr->zToken];
! 132875: pCsr->zToken = zNew;
! 132876: pCsr->nAlloc += 64;
! 132877: }
! 132878:
! 132879: /* Write the folded case of the last character read to the output */
! 132880: zEnd = z;
! 132881: iOut = sqlite3FtsUnicodeFold(iCode, p->bRemoveDiacritic);
! 132882: if( iOut ){
! 132883: WRITE_UTF8(zOut, iOut);
! 132884: }
! 132885:
! 132886: /* If the cursor is not at EOF, read the next character */
! 132887: if( z>=zTerm ) break;
! 132888: READ_UTF8(z, zTerm, iCode);
! 132889: }while( unicodeIsAlnum(p, iCode)
! 132890: || sqlite3FtsUnicodeIsdiacritic(iCode)
! 132891: );
! 132892:
! 132893: /* Set the output variables and return. */
! 132894: pCsr->iOff = (z - pCsr->aInput);
! 132895: *paToken = pCsr->zToken;
! 132896: *pnToken = zOut - pCsr->zToken;
! 132897: *piStart = (zStart - pCsr->aInput);
! 132898: *piEnd = (zEnd - pCsr->aInput);
! 132899: *piPos = pCsr->iToken++;
! 132900: return SQLITE_OK;
! 132901: }
! 132902:
! 132903: /*
! 132904: ** Set *ppModule to a pointer to the sqlite3_tokenizer_module
! 132905: ** structure for the unicode tokenizer.
! 132906: */
! 132907: SQLITE_PRIVATE void sqlite3Fts3UnicodeTokenizer(sqlite3_tokenizer_module const **ppModule){
! 132908: static const sqlite3_tokenizer_module module = {
! 132909: 0,
! 132910: unicodeCreate,
! 132911: unicodeDestroy,
! 132912: unicodeOpen,
! 132913: unicodeClose,
! 132914: unicodeNext,
! 132915: 0,
! 132916: };
! 132917: *ppModule = &module;
! 132918: }
! 132919:
! 132920: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
! 132921: #endif /* ifndef SQLITE_ENABLE_FTS4_UNICODE61 */
! 132922:
! 132923: /************** End of fts3_unicode.c ****************************************/
! 132924: /************** Begin file fts3_unicode2.c ***********************************/
! 132925: /*
! 132926: ** 2012 May 25
! 132927: **
! 132928: ** The author disclaims copyright to this source code. In place of
! 132929: ** a legal notice, here is a blessing:
! 132930: **
! 132931: ** May you do good and not evil.
! 132932: ** May you find forgiveness for yourself and forgive others.
! 132933: ** May you share freely, never taking more than you give.
! 132934: **
! 132935: ******************************************************************************
! 132936: */
! 132937:
! 132938: /*
! 132939: ** DO NOT EDIT THIS MACHINE GENERATED FILE.
! 132940: */
! 132941:
! 132942: #if defined(SQLITE_ENABLE_FTS4_UNICODE61)
! 132943: #if defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4)
! 132944:
! 132945: /* #include <assert.h> */
! 132946:
! 132947: /*
! 132948: ** Return true if the argument corresponds to a unicode codepoint
! 132949: ** classified as either a letter or a number. Otherwise false.
! 132950: **
! 132951: ** The results are undefined if the value passed to this function
! 132952: ** is less than zero.
! 132953: */
! 132954: SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){
! 132955: /* Each unsigned integer in the following array corresponds to a contiguous
! 132956: ** range of unicode codepoints that are not either letters or numbers (i.e.
! 132957: ** codepoints for which this function should return 0).
! 132958: **
! 132959: ** The most significant 22 bits in each 32-bit value contain the first
! 132960: ** codepoint in the range. The least significant 10 bits are used to store
! 132961: ** the size of the range (always at least 1). In other words, the value
! 132962: ** ((C<<22) + N) represents a range of N codepoints starting with codepoint
! 132963: ** C. It is not possible to represent a range larger than 1023 codepoints
! 132964: ** using this format.
! 132965: */
! 132966: const static unsigned int aEntry[] = {
! 132967: 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07,
! 132968: 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01,
! 132969: 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401,
! 132970: 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01,
! 132971: 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01,
! 132972: 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802,
! 132973: 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F,
! 132974: 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401,
! 132975: 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804,
! 132976: 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403,
! 132977: 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812,
! 132978: 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001,
! 132979: 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802,
! 132980: 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805,
! 132981: 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401,
! 132982: 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03,
! 132983: 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807,
! 132984: 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001,
! 132985: 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01,
! 132986: 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804,
! 132987: 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001,
! 132988: 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802,
! 132989: 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01,
! 132990: 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06,
! 132991: 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007,
! 132992: 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006,
! 132993: 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417,
! 132994: 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14,
! 132995: 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07,
! 132996: 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01,
! 132997: 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001,
! 132998: 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802,
! 132999: 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F,
! 133000: 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002,
! 133001: 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802,
! 133002: 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006,
! 133003: 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D,
! 133004: 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802,
! 133005: 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027,
! 133006: 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403,
! 133007: 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805,
! 133008: 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04,
! 133009: 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401,
! 133010: 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005,
! 133011: 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B,
! 133012: 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A,
! 133013: 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001,
! 133014: 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59,
! 133015: 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807,
! 133016: 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01,
! 133017: 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E,
! 133018: 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100,
! 133019: 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10,
! 133020: 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402,
! 133021: 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804,
! 133022: 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012,
! 133023: 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004,
! 133024: 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002,
! 133025: 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803,
! 133026: 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07,
! 133027: 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02,
! 133028: 0x037FFC02, 0x03E3FC01, 0x03EC7801, 0x03ECA401, 0x03EEC810,
! 133029: 0x03F4F802, 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023,
! 133030: 0x03F95013, 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807,
! 133031: 0x03FCEC06, 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405,
! 133032: 0x04040003, 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E,
! 133033: 0x040E7C01, 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01,
! 133034: 0x04280403, 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01,
! 133035: 0x04294009, 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016,
! 133036: 0x04420003, 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004,
! 133037: 0x04460003, 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004,
! 133038: 0x05BD442E, 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5,
! 133039: 0x07480046, 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01,
! 133040: 0x075C5401, 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401,
! 133041: 0x075EA401, 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064,
! 133042: 0x07C2800F, 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F,
! 133043: 0x07C4C03C, 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009,
! 133044: 0x07C94002, 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014,
! 133045: 0x07CE8025, 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001,
! 133046: 0x07D108B6, 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018,
! 133047: 0x07D7EC46, 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401,
! 133048: 0x38008060, 0x380400F0, 0x3C000001, 0x3FFFF401, 0x40000001,
! 133049: 0x43FFF401,
! 133050: };
! 133051: static const unsigned int aAscii[4] = {
! 133052: 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001,
! 133053: };
! 133054:
! 133055: if( c<128 ){
! 133056: return ( (aAscii[c >> 5] & (1 << (c & 0x001F)))==0 );
! 133057: }else if( c<(1<<22) ){
! 133058: unsigned int key = (((unsigned int)c)<<10) | 0x000003FF;
! 133059: int iRes;
! 133060: int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1;
! 133061: int iLo = 0;
! 133062: while( iHi>=iLo ){
! 133063: int iTest = (iHi + iLo) / 2;
! 133064: if( key >= aEntry[iTest] ){
! 133065: iRes = iTest;
! 133066: iLo = iTest+1;
! 133067: }else{
! 133068: iHi = iTest-1;
! 133069: }
! 133070: }
! 133071: assert( aEntry[0]<key );
! 133072: assert( key>=aEntry[iRes] );
! 133073: return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF)));
! 133074: }
! 133075: return 1;
! 133076: }
! 133077:
! 133078:
! 133079: /*
! 133080: ** If the argument is a codepoint corresponding to a lowercase letter
! 133081: ** in the ASCII range with a diacritic added, return the codepoint
! 133082: ** of the ASCII letter only. For example, if passed 235 - "LATIN
! 133083: ** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER
! 133084: ** E"). The resuls of passing a codepoint that corresponds to an
! 133085: ** uppercase letter are undefined.
! 133086: */
! 133087: static int remove_diacritic(int c){
! 133088: unsigned short aDia[] = {
! 133089: 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995,
! 133090: 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286,
! 133091: 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732,
! 133092: 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336,
! 133093: 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928,
! 133094: 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234,
! 133095: 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504,
! 133096: 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529,
! 133097: 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726,
! 133098: 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122,
! 133099: 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536,
! 133100: 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730,
! 133101: 62924, 63050, 63082, 63274, 63390,
! 133102: };
! 133103: char aChar[] = {
! 133104: '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c',
! 133105: 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r',
! 133106: 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o',
! 133107: 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r',
! 133108: 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0',
! 133109: '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h',
! 133110: 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't',
! 133111: 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a',
! 133112: 'e', 'i', 'o', 'u', 'y',
! 133113: };
! 133114:
! 133115: unsigned int key = (((unsigned int)c)<<3) | 0x00000007;
! 133116: int iRes = 0;
! 133117: int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1;
! 133118: int iLo = 0;
! 133119: while( iHi>=iLo ){
! 133120: int iTest = (iHi + iLo) / 2;
! 133121: if( key >= aDia[iTest] ){
! 133122: iRes = iTest;
! 133123: iLo = iTest+1;
! 133124: }else{
! 133125: iHi = iTest-1;
! 133126: }
! 133127: }
! 133128: assert( key>=aDia[iRes] );
! 133129: return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]);
! 133130: };
! 133131:
! 133132:
! 133133: /*
! 133134: ** Return true if the argument interpreted as a unicode codepoint
! 133135: ** is a diacritical modifier character.
! 133136: */
! 133137: SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int c){
! 133138: unsigned int mask0 = 0x08029FDF;
! 133139: unsigned int mask1 = 0x000361F8;
! 133140: if( c<768 || c>817 ) return 0;
! 133141: return (c < 768+32) ?
! 133142: (mask0 & (1 << (c-768))) :
! 133143: (mask1 & (1 << (c-768-32)));
! 133144: }
! 133145:
! 133146:
! 133147: /*
! 133148: ** Interpret the argument as a unicode codepoint. If the codepoint
! 133149: ** is an upper case character that has a lower case equivalent,
! 133150: ** return the codepoint corresponding to the lower case version.
! 133151: ** Otherwise, return a copy of the argument.
! 133152: **
! 133153: ** The results are undefined if the value passed to this function
! 133154: ** is less than zero.
! 133155: */
! 133156: SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){
! 133157: /* Each entry in the following array defines a rule for folding a range
! 133158: ** of codepoints to lower case. The rule applies to a range of nRange
! 133159: ** codepoints starting at codepoint iCode.
! 133160: **
! 133161: ** If the least significant bit in flags is clear, then the rule applies
! 133162: ** to all nRange codepoints (i.e. all nRange codepoints are upper case and
! 133163: ** need to be folded). Or, if it is set, then the rule only applies to
! 133164: ** every second codepoint in the range, starting with codepoint C.
! 133165: **
! 133166: ** The 7 most significant bits in flags are an index into the aiOff[]
! 133167: ** array. If a specific codepoint C does require folding, then its lower
! 133168: ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF).
! 133169: **
! 133170: ** The contents of this array are generated by parsing the CaseFolding.txt
! 133171: ** file distributed as part of the "Unicode Character Database". See
! 133172: ** http://www.unicode.org for details.
! 133173: */
! 133174: static const struct TableEntry {
! 133175: unsigned short iCode;
! 133176: unsigned char flags;
! 133177: unsigned char nRange;
! 133178: } aEntry[] = {
! 133179: {65, 14, 26}, {181, 64, 1}, {192, 14, 23},
! 133180: {216, 14, 7}, {256, 1, 48}, {306, 1, 6},
! 133181: {313, 1, 16}, {330, 1, 46}, {376, 116, 1},
! 133182: {377, 1, 6}, {383, 104, 1}, {385, 50, 1},
! 133183: {386, 1, 4}, {390, 44, 1}, {391, 0, 1},
! 133184: {393, 42, 2}, {395, 0, 1}, {398, 32, 1},
! 133185: {399, 38, 1}, {400, 40, 1}, {401, 0, 1},
! 133186: {403, 42, 1}, {404, 46, 1}, {406, 52, 1},
! 133187: {407, 48, 1}, {408, 0, 1}, {412, 52, 1},
! 133188: {413, 54, 1}, {415, 56, 1}, {416, 1, 6},
! 133189: {422, 60, 1}, {423, 0, 1}, {425, 60, 1},
! 133190: {428, 0, 1}, {430, 60, 1}, {431, 0, 1},
! 133191: {433, 58, 2}, {435, 1, 4}, {439, 62, 1},
! 133192: {440, 0, 1}, {444, 0, 1}, {452, 2, 1},
! 133193: {453, 0, 1}, {455, 2, 1}, {456, 0, 1},
! 133194: {458, 2, 1}, {459, 1, 18}, {478, 1, 18},
! 133195: {497, 2, 1}, {498, 1, 4}, {502, 122, 1},
! 133196: {503, 134, 1}, {504, 1, 40}, {544, 110, 1},
! 133197: {546, 1, 18}, {570, 70, 1}, {571, 0, 1},
! 133198: {573, 108, 1}, {574, 68, 1}, {577, 0, 1},
! 133199: {579, 106, 1}, {580, 28, 1}, {581, 30, 1},
! 133200: {582, 1, 10}, {837, 36, 1}, {880, 1, 4},
! 133201: {886, 0, 1}, {902, 18, 1}, {904, 16, 3},
! 133202: {908, 26, 1}, {910, 24, 2}, {913, 14, 17},
! 133203: {931, 14, 9}, {962, 0, 1}, {975, 4, 1},
! 133204: {976, 140, 1}, {977, 142, 1}, {981, 146, 1},
! 133205: {982, 144, 1}, {984, 1, 24}, {1008, 136, 1},
! 133206: {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1},
! 133207: {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1},
! 133208: {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32},
! 133209: {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1},
! 133210: {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38},
! 133211: {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1},
! 133212: {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1},
! 133213: {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6},
! 133214: {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6},
! 133215: {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8},
! 133216: {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2},
! 133217: {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1},
! 133218: {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2},
! 133219: {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2},
! 133220: {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2},
! 133221: {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1},
! 133222: {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16},
! 133223: {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47},
! 133224: {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1},
! 133225: {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1},
! 133226: {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1},
! 133227: {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2},
! 133228: {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1},
! 133229: {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14},
! 133230: {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1},
! 133231: {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1},
! 133232: {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1},
! 133233: {65313, 14, 26},
! 133234: };
! 133235: static const unsigned short aiOff[] = {
! 133236: 1, 2, 8, 15, 16, 26, 28, 32,
! 133237: 37, 38, 40, 48, 63, 64, 69, 71,
! 133238: 79, 80, 116, 202, 203, 205, 206, 207,
! 133239: 209, 210, 211, 213, 214, 217, 218, 219,
! 133240: 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721,
! 133241: 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274,
! 133242: 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406,
! 133243: 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462,
! 133244: 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511,
! 133245: 65514, 65521, 65527, 65528, 65529,
! 133246: };
! 133247:
! 133248: int ret = c;
! 133249:
! 133250: assert( c>=0 );
! 133251: assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 );
! 133252:
! 133253: if( c<128 ){
! 133254: if( c>='A' && c<='Z' ) ret = c + ('a' - 'A');
! 133255: }else if( c<65536 ){
! 133256: int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1;
! 133257: int iLo = 0;
! 133258: int iRes = -1;
! 133259:
! 133260: while( iHi>=iLo ){
! 133261: int iTest = (iHi + iLo) / 2;
! 133262: int cmp = (c - aEntry[iTest].iCode);
! 133263: if( cmp>=0 ){
! 133264: iRes = iTest;
! 133265: iLo = iTest+1;
! 133266: }else{
! 133267: iHi = iTest-1;
! 133268: }
! 133269: }
! 133270: assert( iRes<0 || c>=aEntry[iRes].iCode );
! 133271:
! 133272: if( iRes>=0 ){
! 133273: const struct TableEntry *p = &aEntry[iRes];
! 133274: if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){
! 133275: ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF;
! 133276: assert( ret>0 );
! 133277: }
! 133278: }
! 133279:
! 133280: if( bRemoveDiacritic ) ret = remove_diacritic(ret);
! 133281: }
! 133282:
! 133283: else if( c>=66560 && c<66600 ){
! 133284: ret = c + 40;
! 133285: }
! 133286:
! 133287: return ret;
! 133288: }
! 133289: #endif /* defined(SQLITE_ENABLE_FTS3) || defined(SQLITE_ENABLE_FTS4) */
! 133290: #endif /* !defined(SQLITE_ENABLE_FTS4_UNICODE61) */
! 133291:
! 133292: /************** End of fts3_unicode2.c ***************************************/
1.2 misho 133293: /************** Begin file rtree.c *******************************************/
133294: /*
133295: ** 2001 September 15
133296: **
133297: ** The author disclaims copyright to this source code. In place of
133298: ** a legal notice, here is a blessing:
133299: **
133300: ** May you do good and not evil.
133301: ** May you find forgiveness for yourself and forgive others.
133302: ** May you share freely, never taking more than you give.
133303: **
133304: *************************************************************************
133305: ** This file contains code for implementations of the r-tree and r*-tree
133306: ** algorithms packaged as an SQLite virtual table module.
133307: */
133308:
133309: /*
133310: ** Database Format of R-Tree Tables
133311: ** --------------------------------
133312: **
133313: ** The data structure for a single virtual r-tree table is stored in three
133314: ** native SQLite tables declared as follows. In each case, the '%' character
133315: ** in the table name is replaced with the user-supplied name of the r-tree
133316: ** table.
133317: **
133318: ** CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB)
133319: ** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER)
133320: ** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER)
133321: **
133322: ** The data for each node of the r-tree structure is stored in the %_node
133323: ** table. For each node that is not the root node of the r-tree, there is
133324: ** an entry in the %_parent table associating the node with its parent.
133325: ** And for each row of data in the table, there is an entry in the %_rowid
133326: ** table that maps from the entries rowid to the id of the node that it
133327: ** is stored on.
133328: **
133329: ** The root node of an r-tree always exists, even if the r-tree table is
133330: ** empty. The nodeno of the root node is always 1. All other nodes in the
133331: ** table must be the same size as the root node. The content of each node
133332: ** is formatted as follows:
133333: **
133334: ** 1. If the node is the root node (node 1), then the first 2 bytes
133335: ** of the node contain the tree depth as a big-endian integer.
133336: ** For non-root nodes, the first 2 bytes are left unused.
133337: **
133338: ** 2. The next 2 bytes contain the number of entries currently
133339: ** stored in the node.
133340: **
133341: ** 3. The remainder of the node contains the node entries. Each entry
133342: ** consists of a single 8-byte integer followed by an even number
133343: ** of 4-byte coordinates. For leaf nodes the integer is the rowid
133344: ** of a record. For internal nodes it is the node number of a
133345: ** child page.
133346: */
133347:
133348: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE)
133349:
133350: /*
133351: ** This file contains an implementation of a couple of different variants
133352: ** of the r-tree algorithm. See the README file for further details. The
133353: ** same data-structure is used for all, but the algorithms for insert and
133354: ** delete operations vary. The variants used are selected at compile time
133355: ** by defining the following symbols:
133356: */
133357:
133358: /* Either, both or none of the following may be set to activate
133359: ** r*tree variant algorithms.
133360: */
133361: #define VARIANT_RSTARTREE_CHOOSESUBTREE 0
133362: #define VARIANT_RSTARTREE_REINSERT 1
133363:
133364: /*
133365: ** Exactly one of the following must be set to 1.
133366: */
133367: #define VARIANT_GUTTMAN_QUADRATIC_SPLIT 0
133368: #define VARIANT_GUTTMAN_LINEAR_SPLIT 0
133369: #define VARIANT_RSTARTREE_SPLIT 1
133370:
133371: #define VARIANT_GUTTMAN_SPLIT \
133372: (VARIANT_GUTTMAN_LINEAR_SPLIT||VARIANT_GUTTMAN_QUADRATIC_SPLIT)
133373:
133374: #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
133375: #define PickNext QuadraticPickNext
133376: #define PickSeeds QuadraticPickSeeds
133377: #define AssignCells splitNodeGuttman
133378: #endif
133379: #if VARIANT_GUTTMAN_LINEAR_SPLIT
133380: #define PickNext LinearPickNext
133381: #define PickSeeds LinearPickSeeds
133382: #define AssignCells splitNodeGuttman
133383: #endif
133384: #if VARIANT_RSTARTREE_SPLIT
133385: #define AssignCells splitNodeStartree
133386: #endif
133387:
133388: #if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
133389: # define NDEBUG 1
133390: #endif
133391:
133392: #ifndef SQLITE_CORE
133393: SQLITE_EXTENSION_INIT1
133394: #else
133395: #endif
133396:
133397: /* #include <string.h> */
133398: /* #include <assert.h> */
133399:
133400: #ifndef SQLITE_AMALGAMATION
133401: #include "sqlite3rtree.h"
133402: typedef sqlite3_int64 i64;
133403: typedef unsigned char u8;
133404: typedef unsigned int u32;
133405: #endif
133406:
133407: /* The following macro is used to suppress compiler warnings.
133408: */
133409: #ifndef UNUSED_PARAMETER
133410: # define UNUSED_PARAMETER(x) (void)(x)
133411: #endif
133412:
133413: typedef struct Rtree Rtree;
133414: typedef struct RtreeCursor RtreeCursor;
133415: typedef struct RtreeNode RtreeNode;
133416: typedef struct RtreeCell RtreeCell;
133417: typedef struct RtreeConstraint RtreeConstraint;
133418: typedef struct RtreeMatchArg RtreeMatchArg;
133419: typedef struct RtreeGeomCallback RtreeGeomCallback;
133420: typedef union RtreeCoord RtreeCoord;
133421:
133422: /* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */
133423: #define RTREE_MAX_DIMENSIONS 5
133424:
133425: /* Size of hash table Rtree.aHash. This hash table is not expected to
133426: ** ever contain very many entries, so a fixed number of buckets is
133427: ** used.
133428: */
133429: #define HASHSIZE 128
133430:
133431: /*
133432: ** An rtree virtual-table object.
133433: */
133434: struct Rtree {
133435: sqlite3_vtab base;
133436: sqlite3 *db; /* Host database connection */
133437: int iNodeSize; /* Size in bytes of each node in the node table */
133438: int nDim; /* Number of dimensions */
133439: int nBytesPerCell; /* Bytes consumed per cell */
133440: int iDepth; /* Current depth of the r-tree structure */
133441: char *zDb; /* Name of database containing r-tree table */
133442: char *zName; /* Name of r-tree table */
133443: RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
133444: int nBusy; /* Current number of users of this structure */
133445:
133446: /* List of nodes removed during a CondenseTree operation. List is
133447: ** linked together via the pointer normally used for hash chains -
133448: ** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree
133449: ** headed by the node (leaf nodes have RtreeNode.iNode==0).
133450: */
133451: RtreeNode *pDeleted;
133452: int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */
133453:
133454: /* Statements to read/write/delete a record from xxx_node */
133455: sqlite3_stmt *pReadNode;
133456: sqlite3_stmt *pWriteNode;
133457: sqlite3_stmt *pDeleteNode;
133458:
133459: /* Statements to read/write/delete a record from xxx_rowid */
133460: sqlite3_stmt *pReadRowid;
133461: sqlite3_stmt *pWriteRowid;
133462: sqlite3_stmt *pDeleteRowid;
133463:
133464: /* Statements to read/write/delete a record from xxx_parent */
133465: sqlite3_stmt *pReadParent;
133466: sqlite3_stmt *pWriteParent;
133467: sqlite3_stmt *pDeleteParent;
133468:
133469: int eCoordType;
133470: };
133471:
133472: /* Possible values for eCoordType: */
133473: #define RTREE_COORD_REAL32 0
133474: #define RTREE_COORD_INT32 1
133475:
133476: /*
1.2.2.1 ! misho 133477: ** If SQLITE_RTREE_INT_ONLY is defined, then this virtual table will
! 133478: ** only deal with integer coordinates. No floating point operations
! 133479: ** will be done.
! 133480: */
! 133481: #ifdef SQLITE_RTREE_INT_ONLY
! 133482: typedef sqlite3_int64 RtreeDValue; /* High accuracy coordinate */
! 133483: typedef int RtreeValue; /* Low accuracy coordinate */
! 133484: #else
! 133485: typedef double RtreeDValue; /* High accuracy coordinate */
! 133486: typedef float RtreeValue; /* Low accuracy coordinate */
! 133487: #endif
! 133488:
! 133489: /*
1.2 misho 133490: ** The minimum number of cells allowed for a node is a third of the
133491: ** maximum. In Gutman's notation:
133492: **
133493: ** m = M/3
133494: **
133495: ** If an R*-tree "Reinsert" operation is required, the same number of
133496: ** cells are removed from the overfull node and reinserted into the tree.
133497: */
133498: #define RTREE_MINCELLS(p) ((((p)->iNodeSize-4)/(p)->nBytesPerCell)/3)
133499: #define RTREE_REINSERT(p) RTREE_MINCELLS(p)
133500: #define RTREE_MAXCELLS 51
133501:
133502: /*
133503: ** The smallest possible node-size is (512-64)==448 bytes. And the largest
133504: ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates).
133505: ** Therefore all non-root nodes must contain at least 3 entries. Since
133506: ** 2^40 is greater than 2^64, an r-tree structure always has a depth of
133507: ** 40 or less.
133508: */
133509: #define RTREE_MAX_DEPTH 40
133510:
133511: /*
133512: ** An rtree cursor object.
133513: */
133514: struct RtreeCursor {
133515: sqlite3_vtab_cursor base;
133516: RtreeNode *pNode; /* Node cursor is currently pointing at */
133517: int iCell; /* Index of current cell in pNode */
133518: int iStrategy; /* Copy of idxNum search parameter */
133519: int nConstraint; /* Number of entries in aConstraint */
133520: RtreeConstraint *aConstraint; /* Search constraints. */
133521: };
133522:
133523: union RtreeCoord {
1.2.2.1 ! misho 133524: RtreeValue f;
1.2 misho 133525: int i;
133526: };
133527:
133528: /*
133529: ** The argument is an RtreeCoord. Return the value stored within the RtreeCoord
1.2.2.1 ! misho 133530: ** formatted as a RtreeDValue (double or int64). This macro assumes that local
! 133531: ** variable pRtree points to the Rtree structure associated with the
! 133532: ** RtreeCoord.
! 133533: */
! 133534: #ifdef SQLITE_RTREE_INT_ONLY
! 133535: # define DCOORD(coord) ((RtreeDValue)coord.i)
! 133536: #else
! 133537: # define DCOORD(coord) ( \
! 133538: (pRtree->eCoordType==RTREE_COORD_REAL32) ? \
! 133539: ((double)coord.f) : \
! 133540: ((double)coord.i) \
! 133541: )
! 133542: #endif
1.2 misho 133543:
133544: /*
133545: ** A search constraint.
133546: */
133547: struct RtreeConstraint {
133548: int iCoord; /* Index of constrained coordinate */
133549: int op; /* Constraining operation */
1.2.2.1 ! misho 133550: RtreeDValue rValue; /* Constraint value. */
! 133551: int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*);
1.2 misho 133552: sqlite3_rtree_geometry *pGeom; /* Constraint callback argument for a MATCH */
133553: };
133554:
133555: /* Possible values for RtreeConstraint.op */
133556: #define RTREE_EQ 0x41
133557: #define RTREE_LE 0x42
133558: #define RTREE_LT 0x43
133559: #define RTREE_GE 0x44
133560: #define RTREE_GT 0x45
133561: #define RTREE_MATCH 0x46
133562:
133563: /*
133564: ** An rtree structure node.
133565: */
133566: struct RtreeNode {
133567: RtreeNode *pParent; /* Parent node */
133568: i64 iNode;
133569: int nRef;
133570: int isDirty;
133571: u8 *zData;
133572: RtreeNode *pNext; /* Next node in this hash chain */
133573: };
133574: #define NCELL(pNode) readInt16(&(pNode)->zData[2])
133575:
133576: /*
133577: ** Structure to store a deserialized rtree record.
133578: */
133579: struct RtreeCell {
133580: i64 iRowid;
133581: RtreeCoord aCoord[RTREE_MAX_DIMENSIONS*2];
133582: };
133583:
133584:
133585: /*
133586: ** Value for the first field of every RtreeMatchArg object. The MATCH
133587: ** operator tests that the first field of a blob operand matches this
133588: ** value to avoid operating on invalid blobs (which could cause a segfault).
133589: */
133590: #define RTREE_GEOMETRY_MAGIC 0x891245AB
133591:
133592: /*
133593: ** An instance of this structure must be supplied as a blob argument to
133594: ** the right-hand-side of an SQL MATCH operator used to constrain an
133595: ** r-tree query.
133596: */
133597: struct RtreeMatchArg {
133598: u32 magic; /* Always RTREE_GEOMETRY_MAGIC */
1.2.2.1 ! misho 133599: int (*xGeom)(sqlite3_rtree_geometry *, int, RtreeDValue*, int *);
1.2 misho 133600: void *pContext;
133601: int nParam;
1.2.2.1 ! misho 133602: RtreeDValue aParam[1];
1.2 misho 133603: };
133604:
133605: /*
133606: ** When a geometry callback is created (see sqlite3_rtree_geometry_callback),
133607: ** a single instance of the following structure is allocated. It is used
133608: ** as the context for the user-function created by by s_r_g_c(). The object
133609: ** is eventually deleted by the destructor mechanism provided by
133610: ** sqlite3_create_function_v2() (which is called by s_r_g_c() to create
133611: ** the geometry callback function).
133612: */
133613: struct RtreeGeomCallback {
1.2.2.1 ! misho 133614: int (*xGeom)(sqlite3_rtree_geometry*, int, RtreeDValue*, int*);
1.2 misho 133615: void *pContext;
133616: };
133617:
133618: #ifndef MAX
133619: # define MAX(x,y) ((x) < (y) ? (y) : (x))
133620: #endif
133621: #ifndef MIN
133622: # define MIN(x,y) ((x) > (y) ? (y) : (x))
133623: #endif
133624:
133625: /*
133626: ** Functions to deserialize a 16 bit integer, 32 bit real number and
133627: ** 64 bit integer. The deserialized value is returned.
133628: */
133629: static int readInt16(u8 *p){
133630: return (p[0]<<8) + p[1];
133631: }
133632: static void readCoord(u8 *p, RtreeCoord *pCoord){
133633: u32 i = (
133634: (((u32)p[0]) << 24) +
133635: (((u32)p[1]) << 16) +
133636: (((u32)p[2]) << 8) +
133637: (((u32)p[3]) << 0)
133638: );
133639: *(u32 *)pCoord = i;
133640: }
133641: static i64 readInt64(u8 *p){
133642: return (
133643: (((i64)p[0]) << 56) +
133644: (((i64)p[1]) << 48) +
133645: (((i64)p[2]) << 40) +
133646: (((i64)p[3]) << 32) +
133647: (((i64)p[4]) << 24) +
133648: (((i64)p[5]) << 16) +
133649: (((i64)p[6]) << 8) +
133650: (((i64)p[7]) << 0)
133651: );
133652: }
133653:
133654: /*
133655: ** Functions to serialize a 16 bit integer, 32 bit real number and
133656: ** 64 bit integer. The value returned is the number of bytes written
133657: ** to the argument buffer (always 2, 4 and 8 respectively).
133658: */
133659: static int writeInt16(u8 *p, int i){
133660: p[0] = (i>> 8)&0xFF;
133661: p[1] = (i>> 0)&0xFF;
133662: return 2;
133663: }
133664: static int writeCoord(u8 *p, RtreeCoord *pCoord){
133665: u32 i;
133666: assert( sizeof(RtreeCoord)==4 );
133667: assert( sizeof(u32)==4 );
133668: i = *(u32 *)pCoord;
133669: p[0] = (i>>24)&0xFF;
133670: p[1] = (i>>16)&0xFF;
133671: p[2] = (i>> 8)&0xFF;
133672: p[3] = (i>> 0)&0xFF;
133673: return 4;
133674: }
133675: static int writeInt64(u8 *p, i64 i){
133676: p[0] = (i>>56)&0xFF;
133677: p[1] = (i>>48)&0xFF;
133678: p[2] = (i>>40)&0xFF;
133679: p[3] = (i>>32)&0xFF;
133680: p[4] = (i>>24)&0xFF;
133681: p[5] = (i>>16)&0xFF;
133682: p[6] = (i>> 8)&0xFF;
133683: p[7] = (i>> 0)&0xFF;
133684: return 8;
133685: }
133686:
133687: /*
133688: ** Increment the reference count of node p.
133689: */
133690: static void nodeReference(RtreeNode *p){
133691: if( p ){
133692: p->nRef++;
133693: }
133694: }
133695:
133696: /*
133697: ** Clear the content of node p (set all bytes to 0x00).
133698: */
133699: static void nodeZero(Rtree *pRtree, RtreeNode *p){
133700: memset(&p->zData[2], 0, pRtree->iNodeSize-2);
133701: p->isDirty = 1;
133702: }
133703:
133704: /*
133705: ** Given a node number iNode, return the corresponding key to use
133706: ** in the Rtree.aHash table.
133707: */
133708: static int nodeHash(i64 iNode){
133709: return (
133710: (iNode>>56) ^ (iNode>>48) ^ (iNode>>40) ^ (iNode>>32) ^
133711: (iNode>>24) ^ (iNode>>16) ^ (iNode>> 8) ^ (iNode>> 0)
133712: ) % HASHSIZE;
133713: }
133714:
133715: /*
133716: ** Search the node hash table for node iNode. If found, return a pointer
133717: ** to it. Otherwise, return 0.
133718: */
133719: static RtreeNode *nodeHashLookup(Rtree *pRtree, i64 iNode){
133720: RtreeNode *p;
133721: for(p=pRtree->aHash[nodeHash(iNode)]; p && p->iNode!=iNode; p=p->pNext);
133722: return p;
133723: }
133724:
133725: /*
133726: ** Add node pNode to the node hash table.
133727: */
133728: static void nodeHashInsert(Rtree *pRtree, RtreeNode *pNode){
133729: int iHash;
133730: assert( pNode->pNext==0 );
133731: iHash = nodeHash(pNode->iNode);
133732: pNode->pNext = pRtree->aHash[iHash];
133733: pRtree->aHash[iHash] = pNode;
133734: }
133735:
133736: /*
133737: ** Remove node pNode from the node hash table.
133738: */
133739: static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){
133740: RtreeNode **pp;
133741: if( pNode->iNode!=0 ){
133742: pp = &pRtree->aHash[nodeHash(pNode->iNode)];
133743: for( ; (*pp)!=pNode; pp = &(*pp)->pNext){ assert(*pp); }
133744: *pp = pNode->pNext;
133745: pNode->pNext = 0;
133746: }
133747: }
133748:
133749: /*
133750: ** Allocate and return new r-tree node. Initially, (RtreeNode.iNode==0),
133751: ** indicating that node has not yet been assigned a node number. It is
133752: ** assigned a node number when nodeWrite() is called to write the
133753: ** node contents out to the database.
133754: */
133755: static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){
133756: RtreeNode *pNode;
133757: pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize);
133758: if( pNode ){
133759: memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize);
133760: pNode->zData = (u8 *)&pNode[1];
133761: pNode->nRef = 1;
133762: pNode->pParent = pParent;
133763: pNode->isDirty = 1;
133764: nodeReference(pParent);
133765: }
133766: return pNode;
133767: }
133768:
133769: /*
133770: ** Obtain a reference to an r-tree node.
133771: */
133772: static int
133773: nodeAcquire(
133774: Rtree *pRtree, /* R-tree structure */
133775: i64 iNode, /* Node number to load */
133776: RtreeNode *pParent, /* Either the parent node or NULL */
133777: RtreeNode **ppNode /* OUT: Acquired node */
133778: ){
133779: int rc;
133780: int rc2 = SQLITE_OK;
133781: RtreeNode *pNode;
133782:
133783: /* Check if the requested node is already in the hash table. If so,
133784: ** increase its reference count and return it.
133785: */
133786: if( (pNode = nodeHashLookup(pRtree, iNode)) ){
133787: assert( !pParent || !pNode->pParent || pNode->pParent==pParent );
133788: if( pParent && !pNode->pParent ){
133789: nodeReference(pParent);
133790: pNode->pParent = pParent;
133791: }
133792: pNode->nRef++;
133793: *ppNode = pNode;
133794: return SQLITE_OK;
133795: }
133796:
133797: sqlite3_bind_int64(pRtree->pReadNode, 1, iNode);
133798: rc = sqlite3_step(pRtree->pReadNode);
133799: if( rc==SQLITE_ROW ){
133800: const u8 *zBlob = sqlite3_column_blob(pRtree->pReadNode, 0);
133801: if( pRtree->iNodeSize==sqlite3_column_bytes(pRtree->pReadNode, 0) ){
133802: pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize);
133803: if( !pNode ){
133804: rc2 = SQLITE_NOMEM;
133805: }else{
133806: pNode->pParent = pParent;
133807: pNode->zData = (u8 *)&pNode[1];
133808: pNode->nRef = 1;
133809: pNode->iNode = iNode;
133810: pNode->isDirty = 0;
133811: pNode->pNext = 0;
133812: memcpy(pNode->zData, zBlob, pRtree->iNodeSize);
133813: nodeReference(pParent);
133814: }
133815: }
133816: }
133817: rc = sqlite3_reset(pRtree->pReadNode);
133818: if( rc==SQLITE_OK ) rc = rc2;
133819:
133820: /* If the root node was just loaded, set pRtree->iDepth to the height
133821: ** of the r-tree structure. A height of zero means all data is stored on
133822: ** the root node. A height of one means the children of the root node
133823: ** are the leaves, and so on. If the depth as specified on the root node
133824: ** is greater than RTREE_MAX_DEPTH, the r-tree structure must be corrupt.
133825: */
133826: if( pNode && iNode==1 ){
133827: pRtree->iDepth = readInt16(pNode->zData);
133828: if( pRtree->iDepth>RTREE_MAX_DEPTH ){
133829: rc = SQLITE_CORRUPT_VTAB;
133830: }
133831: }
133832:
133833: /* If no error has occurred so far, check if the "number of entries"
133834: ** field on the node is too large. If so, set the return code to
133835: ** SQLITE_CORRUPT_VTAB.
133836: */
133837: if( pNode && rc==SQLITE_OK ){
133838: if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){
133839: rc = SQLITE_CORRUPT_VTAB;
133840: }
133841: }
133842:
133843: if( rc==SQLITE_OK ){
133844: if( pNode!=0 ){
133845: nodeHashInsert(pRtree, pNode);
133846: }else{
133847: rc = SQLITE_CORRUPT_VTAB;
133848: }
133849: *ppNode = pNode;
133850: }else{
133851: sqlite3_free(pNode);
133852: *ppNode = 0;
133853: }
133854:
133855: return rc;
133856: }
133857:
133858: /*
133859: ** Overwrite cell iCell of node pNode with the contents of pCell.
133860: */
133861: static void nodeOverwriteCell(
133862: Rtree *pRtree,
133863: RtreeNode *pNode,
133864: RtreeCell *pCell,
133865: int iCell
133866: ){
133867: int ii;
133868: u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
133869: p += writeInt64(p, pCell->iRowid);
133870: for(ii=0; ii<(pRtree->nDim*2); ii++){
133871: p += writeCoord(p, &pCell->aCoord[ii]);
133872: }
133873: pNode->isDirty = 1;
133874: }
133875:
133876: /*
133877: ** Remove cell the cell with index iCell from node pNode.
133878: */
133879: static void nodeDeleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell){
133880: u8 *pDst = &pNode->zData[4 + pRtree->nBytesPerCell*iCell];
133881: u8 *pSrc = &pDst[pRtree->nBytesPerCell];
133882: int nByte = (NCELL(pNode) - iCell - 1) * pRtree->nBytesPerCell;
133883: memmove(pDst, pSrc, nByte);
133884: writeInt16(&pNode->zData[2], NCELL(pNode)-1);
133885: pNode->isDirty = 1;
133886: }
133887:
133888: /*
133889: ** Insert the contents of cell pCell into node pNode. If the insert
133890: ** is successful, return SQLITE_OK.
133891: **
133892: ** If there is not enough free space in pNode, return SQLITE_FULL.
133893: */
133894: static int
133895: nodeInsertCell(
133896: Rtree *pRtree,
133897: RtreeNode *pNode,
133898: RtreeCell *pCell
133899: ){
133900: int nCell; /* Current number of cells in pNode */
133901: int nMaxCell; /* Maximum number of cells for pNode */
133902:
133903: nMaxCell = (pRtree->iNodeSize-4)/pRtree->nBytesPerCell;
133904: nCell = NCELL(pNode);
133905:
133906: assert( nCell<=nMaxCell );
133907: if( nCell<nMaxCell ){
133908: nodeOverwriteCell(pRtree, pNode, pCell, nCell);
133909: writeInt16(&pNode->zData[2], nCell+1);
133910: pNode->isDirty = 1;
133911: }
133912:
133913: return (nCell==nMaxCell);
133914: }
133915:
133916: /*
133917: ** If the node is dirty, write it out to the database.
133918: */
133919: static int
133920: nodeWrite(Rtree *pRtree, RtreeNode *pNode){
133921: int rc = SQLITE_OK;
133922: if( pNode->isDirty ){
133923: sqlite3_stmt *p = pRtree->pWriteNode;
133924: if( pNode->iNode ){
133925: sqlite3_bind_int64(p, 1, pNode->iNode);
133926: }else{
133927: sqlite3_bind_null(p, 1);
133928: }
133929: sqlite3_bind_blob(p, 2, pNode->zData, pRtree->iNodeSize, SQLITE_STATIC);
133930: sqlite3_step(p);
133931: pNode->isDirty = 0;
133932: rc = sqlite3_reset(p);
133933: if( pNode->iNode==0 && rc==SQLITE_OK ){
133934: pNode->iNode = sqlite3_last_insert_rowid(pRtree->db);
133935: nodeHashInsert(pRtree, pNode);
133936: }
133937: }
133938: return rc;
133939: }
133940:
133941: /*
133942: ** Release a reference to a node. If the node is dirty and the reference
133943: ** count drops to zero, the node data is written to the database.
133944: */
133945: static int
133946: nodeRelease(Rtree *pRtree, RtreeNode *pNode){
133947: int rc = SQLITE_OK;
133948: if( pNode ){
133949: assert( pNode->nRef>0 );
133950: pNode->nRef--;
133951: if( pNode->nRef==0 ){
133952: if( pNode->iNode==1 ){
133953: pRtree->iDepth = -1;
133954: }
133955: if( pNode->pParent ){
133956: rc = nodeRelease(pRtree, pNode->pParent);
133957: }
133958: if( rc==SQLITE_OK ){
133959: rc = nodeWrite(pRtree, pNode);
133960: }
133961: nodeHashDelete(pRtree, pNode);
133962: sqlite3_free(pNode);
133963: }
133964: }
133965: return rc;
133966: }
133967:
133968: /*
133969: ** Return the 64-bit integer value associated with cell iCell of
133970: ** node pNode. If pNode is a leaf node, this is a rowid. If it is
133971: ** an internal node, then the 64-bit integer is a child page number.
133972: */
133973: static i64 nodeGetRowid(
133974: Rtree *pRtree,
133975: RtreeNode *pNode,
133976: int iCell
133977: ){
133978: assert( iCell<NCELL(pNode) );
133979: return readInt64(&pNode->zData[4 + pRtree->nBytesPerCell*iCell]);
133980: }
133981:
133982: /*
133983: ** Return coordinate iCoord from cell iCell in node pNode.
133984: */
133985: static void nodeGetCoord(
133986: Rtree *pRtree,
133987: RtreeNode *pNode,
133988: int iCell,
133989: int iCoord,
133990: RtreeCoord *pCoord /* Space to write result to */
133991: ){
133992: readCoord(&pNode->zData[12 + pRtree->nBytesPerCell*iCell + 4*iCoord], pCoord);
133993: }
133994:
133995: /*
133996: ** Deserialize cell iCell of node pNode. Populate the structure pointed
133997: ** to by pCell with the results.
133998: */
133999: static void nodeGetCell(
134000: Rtree *pRtree,
134001: RtreeNode *pNode,
134002: int iCell,
134003: RtreeCell *pCell
134004: ){
134005: int ii;
134006: pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell);
134007: for(ii=0; ii<pRtree->nDim*2; ii++){
134008: nodeGetCoord(pRtree, pNode, iCell, ii, &pCell->aCoord[ii]);
134009: }
134010: }
134011:
134012:
134013: /* Forward declaration for the function that does the work of
134014: ** the virtual table module xCreate() and xConnect() methods.
134015: */
134016: static int rtreeInit(
134017: sqlite3 *, void *, int, const char *const*, sqlite3_vtab **, char **, int
134018: );
134019:
134020: /*
134021: ** Rtree virtual table module xCreate method.
134022: */
134023: static int rtreeCreate(
134024: sqlite3 *db,
134025: void *pAux,
134026: int argc, const char *const*argv,
134027: sqlite3_vtab **ppVtab,
134028: char **pzErr
134029: ){
134030: return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 1);
134031: }
134032:
134033: /*
134034: ** Rtree virtual table module xConnect method.
134035: */
134036: static int rtreeConnect(
134037: sqlite3 *db,
134038: void *pAux,
134039: int argc, const char *const*argv,
134040: sqlite3_vtab **ppVtab,
134041: char **pzErr
134042: ){
134043: return rtreeInit(db, pAux, argc, argv, ppVtab, pzErr, 0);
134044: }
134045:
134046: /*
134047: ** Increment the r-tree reference count.
134048: */
134049: static void rtreeReference(Rtree *pRtree){
134050: pRtree->nBusy++;
134051: }
134052:
134053: /*
134054: ** Decrement the r-tree reference count. When the reference count reaches
134055: ** zero the structure is deleted.
134056: */
134057: static void rtreeRelease(Rtree *pRtree){
134058: pRtree->nBusy--;
134059: if( pRtree->nBusy==0 ){
134060: sqlite3_finalize(pRtree->pReadNode);
134061: sqlite3_finalize(pRtree->pWriteNode);
134062: sqlite3_finalize(pRtree->pDeleteNode);
134063: sqlite3_finalize(pRtree->pReadRowid);
134064: sqlite3_finalize(pRtree->pWriteRowid);
134065: sqlite3_finalize(pRtree->pDeleteRowid);
134066: sqlite3_finalize(pRtree->pReadParent);
134067: sqlite3_finalize(pRtree->pWriteParent);
134068: sqlite3_finalize(pRtree->pDeleteParent);
134069: sqlite3_free(pRtree);
134070: }
134071: }
134072:
134073: /*
134074: ** Rtree virtual table module xDisconnect method.
134075: */
134076: static int rtreeDisconnect(sqlite3_vtab *pVtab){
134077: rtreeRelease((Rtree *)pVtab);
134078: return SQLITE_OK;
134079: }
134080:
134081: /*
134082: ** Rtree virtual table module xDestroy method.
134083: */
134084: static int rtreeDestroy(sqlite3_vtab *pVtab){
134085: Rtree *pRtree = (Rtree *)pVtab;
134086: int rc;
134087: char *zCreate = sqlite3_mprintf(
134088: "DROP TABLE '%q'.'%q_node';"
134089: "DROP TABLE '%q'.'%q_rowid';"
134090: "DROP TABLE '%q'.'%q_parent';",
134091: pRtree->zDb, pRtree->zName,
134092: pRtree->zDb, pRtree->zName,
134093: pRtree->zDb, pRtree->zName
134094: );
134095: if( !zCreate ){
134096: rc = SQLITE_NOMEM;
134097: }else{
134098: rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0);
134099: sqlite3_free(zCreate);
134100: }
134101: if( rc==SQLITE_OK ){
134102: rtreeRelease(pRtree);
134103: }
134104:
134105: return rc;
134106: }
134107:
134108: /*
134109: ** Rtree virtual table module xOpen method.
134110: */
134111: static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
134112: int rc = SQLITE_NOMEM;
134113: RtreeCursor *pCsr;
134114:
134115: pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor));
134116: if( pCsr ){
134117: memset(pCsr, 0, sizeof(RtreeCursor));
134118: pCsr->base.pVtab = pVTab;
134119: rc = SQLITE_OK;
134120: }
134121: *ppCursor = (sqlite3_vtab_cursor *)pCsr;
134122:
134123: return rc;
134124: }
134125:
134126:
134127: /*
134128: ** Free the RtreeCursor.aConstraint[] array and its contents.
134129: */
134130: static void freeCursorConstraints(RtreeCursor *pCsr){
134131: if( pCsr->aConstraint ){
134132: int i; /* Used to iterate through constraint array */
134133: for(i=0; i<pCsr->nConstraint; i++){
134134: sqlite3_rtree_geometry *pGeom = pCsr->aConstraint[i].pGeom;
134135: if( pGeom ){
134136: if( pGeom->xDelUser ) pGeom->xDelUser(pGeom->pUser);
134137: sqlite3_free(pGeom);
134138: }
134139: }
134140: sqlite3_free(pCsr->aConstraint);
134141: pCsr->aConstraint = 0;
134142: }
134143: }
134144:
134145: /*
134146: ** Rtree virtual table module xClose method.
134147: */
134148: static int rtreeClose(sqlite3_vtab_cursor *cur){
134149: Rtree *pRtree = (Rtree *)(cur->pVtab);
134150: int rc;
134151: RtreeCursor *pCsr = (RtreeCursor *)cur;
134152: freeCursorConstraints(pCsr);
134153: rc = nodeRelease(pRtree, pCsr->pNode);
134154: sqlite3_free(pCsr);
134155: return rc;
134156: }
134157:
134158: /*
134159: ** Rtree virtual table module xEof method.
134160: **
134161: ** Return non-zero if the cursor does not currently point to a valid
134162: ** record (i.e if the scan has finished), or zero otherwise.
134163: */
134164: static int rtreeEof(sqlite3_vtab_cursor *cur){
134165: RtreeCursor *pCsr = (RtreeCursor *)cur;
134166: return (pCsr->pNode==0);
134167: }
134168:
134169: /*
134170: ** The r-tree constraint passed as the second argument to this function is
134171: ** guaranteed to be a MATCH constraint.
134172: */
134173: static int testRtreeGeom(
134174: Rtree *pRtree, /* R-Tree object */
134175: RtreeConstraint *pConstraint, /* MATCH constraint to test */
134176: RtreeCell *pCell, /* Cell to test */
134177: int *pbRes /* OUT: Test result */
134178: ){
134179: int i;
1.2.2.1 ! misho 134180: RtreeDValue aCoord[RTREE_MAX_DIMENSIONS*2];
1.2 misho 134181: int nCoord = pRtree->nDim*2;
134182:
134183: assert( pConstraint->op==RTREE_MATCH );
134184: assert( pConstraint->pGeom );
134185:
134186: for(i=0; i<nCoord; i++){
134187: aCoord[i] = DCOORD(pCell->aCoord[i]);
134188: }
134189: return pConstraint->xGeom(pConstraint->pGeom, nCoord, aCoord, pbRes);
134190: }
134191:
134192: /*
134193: ** Cursor pCursor currently points to a cell in a non-leaf page.
134194: ** Set *pbEof to true if the sub-tree headed by the cell is filtered
134195: ** (excluded) by the constraints in the pCursor->aConstraint[]
134196: ** array, or false otherwise.
134197: **
134198: ** Return SQLITE_OK if successful or an SQLite error code if an error
134199: ** occurs within a geometry callback.
134200: */
134201: static int testRtreeCell(Rtree *pRtree, RtreeCursor *pCursor, int *pbEof){
134202: RtreeCell cell;
134203: int ii;
134204: int bRes = 0;
134205: int rc = SQLITE_OK;
134206:
134207: nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
134208: for(ii=0; bRes==0 && ii<pCursor->nConstraint; ii++){
134209: RtreeConstraint *p = &pCursor->aConstraint[ii];
1.2.2.1 ! misho 134210: RtreeDValue cell_min = DCOORD(cell.aCoord[(p->iCoord>>1)*2]);
! 134211: RtreeDValue cell_max = DCOORD(cell.aCoord[(p->iCoord>>1)*2+1]);
1.2 misho 134212:
134213: assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
134214: || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_MATCH
134215: );
134216:
134217: switch( p->op ){
134218: case RTREE_LE: case RTREE_LT:
134219: bRes = p->rValue<cell_min;
134220: break;
134221:
134222: case RTREE_GE: case RTREE_GT:
134223: bRes = p->rValue>cell_max;
134224: break;
134225:
134226: case RTREE_EQ:
134227: bRes = (p->rValue>cell_max || p->rValue<cell_min);
134228: break;
134229:
134230: default: {
134231: assert( p->op==RTREE_MATCH );
134232: rc = testRtreeGeom(pRtree, p, &cell, &bRes);
134233: bRes = !bRes;
134234: break;
134235: }
134236: }
134237: }
134238:
134239: *pbEof = bRes;
134240: return rc;
134241: }
134242:
134243: /*
134244: ** Test if the cell that cursor pCursor currently points to
134245: ** would be filtered (excluded) by the constraints in the
134246: ** pCursor->aConstraint[] array. If so, set *pbEof to true before
134247: ** returning. If the cell is not filtered (excluded) by the constraints,
134248: ** set pbEof to zero.
134249: **
134250: ** Return SQLITE_OK if successful or an SQLite error code if an error
134251: ** occurs within a geometry callback.
134252: **
134253: ** This function assumes that the cell is part of a leaf node.
134254: */
134255: static int testRtreeEntry(Rtree *pRtree, RtreeCursor *pCursor, int *pbEof){
134256: RtreeCell cell;
134257: int ii;
134258: *pbEof = 0;
134259:
134260: nodeGetCell(pRtree, pCursor->pNode, pCursor->iCell, &cell);
134261: for(ii=0; ii<pCursor->nConstraint; ii++){
134262: RtreeConstraint *p = &pCursor->aConstraint[ii];
1.2.2.1 ! misho 134263: RtreeDValue coord = DCOORD(cell.aCoord[p->iCoord]);
1.2 misho 134264: int res;
134265: assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE
134266: || p->op==RTREE_GT || p->op==RTREE_EQ || p->op==RTREE_MATCH
134267: );
134268: switch( p->op ){
134269: case RTREE_LE: res = (coord<=p->rValue); break;
134270: case RTREE_LT: res = (coord<p->rValue); break;
134271: case RTREE_GE: res = (coord>=p->rValue); break;
134272: case RTREE_GT: res = (coord>p->rValue); break;
134273: case RTREE_EQ: res = (coord==p->rValue); break;
134274: default: {
134275: int rc;
134276: assert( p->op==RTREE_MATCH );
134277: rc = testRtreeGeom(pRtree, p, &cell, &res);
134278: if( rc!=SQLITE_OK ){
134279: return rc;
134280: }
134281: break;
134282: }
134283: }
134284:
134285: if( !res ){
134286: *pbEof = 1;
134287: return SQLITE_OK;
134288: }
134289: }
134290:
134291: return SQLITE_OK;
134292: }
134293:
134294: /*
134295: ** Cursor pCursor currently points at a node that heads a sub-tree of
134296: ** height iHeight (if iHeight==0, then the node is a leaf). Descend
134297: ** to point to the left-most cell of the sub-tree that matches the
134298: ** configured constraints.
134299: */
134300: static int descendToCell(
134301: Rtree *pRtree,
134302: RtreeCursor *pCursor,
134303: int iHeight,
134304: int *pEof /* OUT: Set to true if cannot descend */
134305: ){
134306: int isEof;
134307: int rc;
134308: int ii;
134309: RtreeNode *pChild;
134310: sqlite3_int64 iRowid;
134311:
134312: RtreeNode *pSavedNode = pCursor->pNode;
134313: int iSavedCell = pCursor->iCell;
134314:
134315: assert( iHeight>=0 );
134316:
134317: if( iHeight==0 ){
134318: rc = testRtreeEntry(pRtree, pCursor, &isEof);
134319: }else{
134320: rc = testRtreeCell(pRtree, pCursor, &isEof);
134321: }
134322: if( rc!=SQLITE_OK || isEof || iHeight==0 ){
134323: goto descend_to_cell_out;
134324: }
134325:
134326: iRowid = nodeGetRowid(pRtree, pCursor->pNode, pCursor->iCell);
134327: rc = nodeAcquire(pRtree, iRowid, pCursor->pNode, &pChild);
134328: if( rc!=SQLITE_OK ){
134329: goto descend_to_cell_out;
134330: }
134331:
134332: nodeRelease(pRtree, pCursor->pNode);
134333: pCursor->pNode = pChild;
134334: isEof = 1;
134335: for(ii=0; isEof && ii<NCELL(pChild); ii++){
134336: pCursor->iCell = ii;
134337: rc = descendToCell(pRtree, pCursor, iHeight-1, &isEof);
134338: if( rc!=SQLITE_OK ){
134339: goto descend_to_cell_out;
134340: }
134341: }
134342:
134343: if( isEof ){
134344: assert( pCursor->pNode==pChild );
134345: nodeReference(pSavedNode);
134346: nodeRelease(pRtree, pChild);
134347: pCursor->pNode = pSavedNode;
134348: pCursor->iCell = iSavedCell;
134349: }
134350:
134351: descend_to_cell_out:
134352: *pEof = isEof;
134353: return rc;
134354: }
134355:
134356: /*
134357: ** One of the cells in node pNode is guaranteed to have a 64-bit
134358: ** integer value equal to iRowid. Return the index of this cell.
134359: */
134360: static int nodeRowidIndex(
134361: Rtree *pRtree,
134362: RtreeNode *pNode,
134363: i64 iRowid,
134364: int *piIndex
134365: ){
134366: int ii;
134367: int nCell = NCELL(pNode);
134368: for(ii=0; ii<nCell; ii++){
134369: if( nodeGetRowid(pRtree, pNode, ii)==iRowid ){
134370: *piIndex = ii;
134371: return SQLITE_OK;
134372: }
134373: }
134374: return SQLITE_CORRUPT_VTAB;
134375: }
134376:
134377: /*
134378: ** Return the index of the cell containing a pointer to node pNode
134379: ** in its parent. If pNode is the root node, return -1.
134380: */
134381: static int nodeParentIndex(Rtree *pRtree, RtreeNode *pNode, int *piIndex){
134382: RtreeNode *pParent = pNode->pParent;
134383: if( pParent ){
134384: return nodeRowidIndex(pRtree, pParent, pNode->iNode, piIndex);
134385: }
134386: *piIndex = -1;
134387: return SQLITE_OK;
134388: }
134389:
134390: /*
134391: ** Rtree virtual table module xNext method.
134392: */
134393: static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){
134394: Rtree *pRtree = (Rtree *)(pVtabCursor->pVtab);
134395: RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
134396: int rc = SQLITE_OK;
134397:
134398: /* RtreeCursor.pNode must not be NULL. If is is NULL, then this cursor is
134399: ** already at EOF. It is against the rules to call the xNext() method of
134400: ** a cursor that has already reached EOF.
134401: */
134402: assert( pCsr->pNode );
134403:
134404: if( pCsr->iStrategy==1 ){
134405: /* This "scan" is a direct lookup by rowid. There is no next entry. */
134406: nodeRelease(pRtree, pCsr->pNode);
134407: pCsr->pNode = 0;
134408: }else{
134409: /* Move to the next entry that matches the configured constraints. */
134410: int iHeight = 0;
134411: while( pCsr->pNode ){
134412: RtreeNode *pNode = pCsr->pNode;
134413: int nCell = NCELL(pNode);
134414: for(pCsr->iCell++; pCsr->iCell<nCell; pCsr->iCell++){
134415: int isEof;
134416: rc = descendToCell(pRtree, pCsr, iHeight, &isEof);
134417: if( rc!=SQLITE_OK || !isEof ){
134418: return rc;
134419: }
134420: }
134421: pCsr->pNode = pNode->pParent;
134422: rc = nodeParentIndex(pRtree, pNode, &pCsr->iCell);
134423: if( rc!=SQLITE_OK ){
134424: return rc;
134425: }
134426: nodeReference(pCsr->pNode);
134427: nodeRelease(pRtree, pNode);
134428: iHeight++;
134429: }
134430: }
134431:
134432: return rc;
134433: }
134434:
134435: /*
134436: ** Rtree virtual table module xRowid method.
134437: */
134438: static int rtreeRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *pRowid){
134439: Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
134440: RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
134441:
134442: assert(pCsr->pNode);
134443: *pRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
134444:
134445: return SQLITE_OK;
134446: }
134447:
134448: /*
134449: ** Rtree virtual table module xColumn method.
134450: */
134451: static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){
134452: Rtree *pRtree = (Rtree *)cur->pVtab;
134453: RtreeCursor *pCsr = (RtreeCursor *)cur;
134454:
134455: if( i==0 ){
134456: i64 iRowid = nodeGetRowid(pRtree, pCsr->pNode, pCsr->iCell);
134457: sqlite3_result_int64(ctx, iRowid);
134458: }else{
134459: RtreeCoord c;
134460: nodeGetCoord(pRtree, pCsr->pNode, pCsr->iCell, i-1, &c);
1.2.2.1 ! misho 134461: #ifndef SQLITE_RTREE_INT_ONLY
1.2 misho 134462: if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
134463: sqlite3_result_double(ctx, c.f);
1.2.2.1 ! misho 134464: }else
! 134465: #endif
! 134466: {
1.2 misho 134467: assert( pRtree->eCoordType==RTREE_COORD_INT32 );
134468: sqlite3_result_int(ctx, c.i);
134469: }
134470: }
134471:
134472: return SQLITE_OK;
134473: }
134474:
134475: /*
134476: ** Use nodeAcquire() to obtain the leaf node containing the record with
134477: ** rowid iRowid. If successful, set *ppLeaf to point to the node and
134478: ** return SQLITE_OK. If there is no such record in the table, set
134479: ** *ppLeaf to 0 and return SQLITE_OK. If an error occurs, set *ppLeaf
134480: ** to zero and return an SQLite error code.
134481: */
134482: static int findLeafNode(Rtree *pRtree, i64 iRowid, RtreeNode **ppLeaf){
134483: int rc;
134484: *ppLeaf = 0;
134485: sqlite3_bind_int64(pRtree->pReadRowid, 1, iRowid);
134486: if( sqlite3_step(pRtree->pReadRowid)==SQLITE_ROW ){
134487: i64 iNode = sqlite3_column_int64(pRtree->pReadRowid, 0);
134488: rc = nodeAcquire(pRtree, iNode, 0, ppLeaf);
134489: sqlite3_reset(pRtree->pReadRowid);
134490: }else{
134491: rc = sqlite3_reset(pRtree->pReadRowid);
134492: }
134493: return rc;
134494: }
134495:
134496: /*
134497: ** This function is called to configure the RtreeConstraint object passed
134498: ** as the second argument for a MATCH constraint. The value passed as the
134499: ** first argument to this function is the right-hand operand to the MATCH
134500: ** operator.
134501: */
134502: static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){
134503: RtreeMatchArg *p;
134504: sqlite3_rtree_geometry *pGeom;
134505: int nBlob;
134506:
134507: /* Check that value is actually a blob. */
134508: if( sqlite3_value_type(pValue)!=SQLITE_BLOB ) return SQLITE_ERROR;
134509:
134510: /* Check that the blob is roughly the right size. */
134511: nBlob = sqlite3_value_bytes(pValue);
134512: if( nBlob<(int)sizeof(RtreeMatchArg)
1.2.2.1 ! misho 134513: || ((nBlob-sizeof(RtreeMatchArg))%sizeof(RtreeDValue))!=0
1.2 misho 134514: ){
134515: return SQLITE_ERROR;
134516: }
134517:
134518: pGeom = (sqlite3_rtree_geometry *)sqlite3_malloc(
134519: sizeof(sqlite3_rtree_geometry) + nBlob
134520: );
134521: if( !pGeom ) return SQLITE_NOMEM;
134522: memset(pGeom, 0, sizeof(sqlite3_rtree_geometry));
134523: p = (RtreeMatchArg *)&pGeom[1];
134524:
134525: memcpy(p, sqlite3_value_blob(pValue), nBlob);
134526: if( p->magic!=RTREE_GEOMETRY_MAGIC
1.2.2.1 ! misho 134527: || nBlob!=(int)(sizeof(RtreeMatchArg) + (p->nParam-1)*sizeof(RtreeDValue))
1.2 misho 134528: ){
134529: sqlite3_free(pGeom);
134530: return SQLITE_ERROR;
134531: }
134532:
134533: pGeom->pContext = p->pContext;
134534: pGeom->nParam = p->nParam;
134535: pGeom->aParam = p->aParam;
134536:
134537: pCons->xGeom = p->xGeom;
134538: pCons->pGeom = pGeom;
134539: return SQLITE_OK;
134540: }
134541:
134542: /*
134543: ** Rtree virtual table module xFilter method.
134544: */
134545: static int rtreeFilter(
134546: sqlite3_vtab_cursor *pVtabCursor,
134547: int idxNum, const char *idxStr,
134548: int argc, sqlite3_value **argv
134549: ){
134550: Rtree *pRtree = (Rtree *)pVtabCursor->pVtab;
134551: RtreeCursor *pCsr = (RtreeCursor *)pVtabCursor;
134552:
134553: RtreeNode *pRoot = 0;
134554: int ii;
134555: int rc = SQLITE_OK;
134556:
134557: rtreeReference(pRtree);
134558:
134559: freeCursorConstraints(pCsr);
134560: pCsr->iStrategy = idxNum;
134561:
134562: if( idxNum==1 ){
134563: /* Special case - lookup by rowid. */
134564: RtreeNode *pLeaf; /* Leaf on which the required cell resides */
134565: i64 iRowid = sqlite3_value_int64(argv[0]);
134566: rc = findLeafNode(pRtree, iRowid, &pLeaf);
134567: pCsr->pNode = pLeaf;
134568: if( pLeaf ){
134569: assert( rc==SQLITE_OK );
134570: rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &pCsr->iCell);
134571: }
134572: }else{
134573: /* Normal case - r-tree scan. Set up the RtreeCursor.aConstraint array
134574: ** with the configured constraints.
134575: */
134576: if( argc>0 ){
134577: pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc);
134578: pCsr->nConstraint = argc;
134579: if( !pCsr->aConstraint ){
134580: rc = SQLITE_NOMEM;
134581: }else{
134582: memset(pCsr->aConstraint, 0, sizeof(RtreeConstraint)*argc);
134583: assert( (idxStr==0 && argc==0)
134584: || (idxStr && (int)strlen(idxStr)==argc*2) );
134585: for(ii=0; ii<argc; ii++){
134586: RtreeConstraint *p = &pCsr->aConstraint[ii];
134587: p->op = idxStr[ii*2];
134588: p->iCoord = idxStr[ii*2+1]-'a';
134589: if( p->op==RTREE_MATCH ){
134590: /* A MATCH operator. The right-hand-side must be a blob that
134591: ** can be cast into an RtreeMatchArg object. One created using
134592: ** an sqlite3_rtree_geometry_callback() SQL user function.
134593: */
134594: rc = deserializeGeometry(argv[ii], p);
134595: if( rc!=SQLITE_OK ){
134596: break;
134597: }
134598: }else{
1.2.2.1 ! misho 134599: #ifdef SQLITE_RTREE_INT_ONLY
! 134600: p->rValue = sqlite3_value_int64(argv[ii]);
! 134601: #else
1.2 misho 134602: p->rValue = sqlite3_value_double(argv[ii]);
1.2.2.1 ! misho 134603: #endif
1.2 misho 134604: }
134605: }
134606: }
134607: }
134608:
134609: if( rc==SQLITE_OK ){
134610: pCsr->pNode = 0;
134611: rc = nodeAcquire(pRtree, 1, 0, &pRoot);
134612: }
134613: if( rc==SQLITE_OK ){
134614: int isEof = 1;
134615: int nCell = NCELL(pRoot);
134616: pCsr->pNode = pRoot;
134617: for(pCsr->iCell=0; rc==SQLITE_OK && pCsr->iCell<nCell; pCsr->iCell++){
134618: assert( pCsr->pNode==pRoot );
134619: rc = descendToCell(pRtree, pCsr, pRtree->iDepth, &isEof);
134620: if( !isEof ){
134621: break;
134622: }
134623: }
134624: if( rc==SQLITE_OK && isEof ){
134625: assert( pCsr->pNode==pRoot );
134626: nodeRelease(pRtree, pRoot);
134627: pCsr->pNode = 0;
134628: }
134629: assert( rc!=SQLITE_OK || !pCsr->pNode || pCsr->iCell<NCELL(pCsr->pNode) );
134630: }
134631: }
134632:
134633: rtreeRelease(pRtree);
134634: return rc;
134635: }
134636:
134637: /*
134638: ** Rtree virtual table module xBestIndex method. There are three
134639: ** table scan strategies to choose from (in order from most to
134640: ** least desirable):
134641: **
134642: ** idxNum idxStr Strategy
134643: ** ------------------------------------------------
134644: ** 1 Unused Direct lookup by rowid.
134645: ** 2 See below R-tree query or full-table scan.
134646: ** ------------------------------------------------
134647: **
134648: ** If strategy 1 is used, then idxStr is not meaningful. If strategy
134649: ** 2 is used, idxStr is formatted to contain 2 bytes for each
134650: ** constraint used. The first two bytes of idxStr correspond to
134651: ** the constraint in sqlite3_index_info.aConstraintUsage[] with
134652: ** (argvIndex==1) etc.
134653: **
134654: ** The first of each pair of bytes in idxStr identifies the constraint
134655: ** operator as follows:
134656: **
134657: ** Operator Byte Value
134658: ** ----------------------
134659: ** = 0x41 ('A')
134660: ** <= 0x42 ('B')
134661: ** < 0x43 ('C')
134662: ** >= 0x44 ('D')
134663: ** > 0x45 ('E')
134664: ** MATCH 0x46 ('F')
134665: ** ----------------------
134666: **
134667: ** The second of each pair of bytes identifies the coordinate column
134668: ** to which the constraint applies. The leftmost coordinate column
134669: ** is 'a', the second from the left 'b' etc.
134670: */
134671: static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
134672: int rc = SQLITE_OK;
134673: int ii;
134674:
134675: int iIdx = 0;
134676: char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
134677: memset(zIdxStr, 0, sizeof(zIdxStr));
134678: UNUSED_PARAMETER(tab);
134679:
134680: assert( pIdxInfo->idxStr==0 );
134681: for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){
134682: struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
134683:
134684: if( p->usable && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){
134685: /* We have an equality constraint on the rowid. Use strategy 1. */
134686: int jj;
134687: for(jj=0; jj<ii; jj++){
134688: pIdxInfo->aConstraintUsage[jj].argvIndex = 0;
134689: pIdxInfo->aConstraintUsage[jj].omit = 0;
134690: }
134691: pIdxInfo->idxNum = 1;
134692: pIdxInfo->aConstraintUsage[ii].argvIndex = 1;
134693: pIdxInfo->aConstraintUsage[jj].omit = 1;
134694:
134695: /* This strategy involves a two rowid lookups on an B-Tree structures
134696: ** and then a linear search of an R-Tree node. This should be
134697: ** considered almost as quick as a direct rowid lookup (for which
134698: ** sqlite uses an internal cost of 0.0).
134699: */
134700: pIdxInfo->estimatedCost = 10.0;
134701: return SQLITE_OK;
134702: }
134703:
134704: if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
134705: u8 op;
134706: switch( p->op ){
134707: case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break;
134708: case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break;
134709: case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break;
134710: case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break;
134711: case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break;
134712: default:
134713: assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH );
134714: op = RTREE_MATCH;
134715: break;
134716: }
134717: zIdxStr[iIdx++] = op;
134718: zIdxStr[iIdx++] = p->iColumn - 1 + 'a';
134719: pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2);
134720: pIdxInfo->aConstraintUsage[ii].omit = 1;
134721: }
134722: }
134723:
134724: pIdxInfo->idxNum = 2;
134725: pIdxInfo->needToFreeIdxStr = 1;
134726: if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
134727: return SQLITE_NOMEM;
134728: }
134729: assert( iIdx>=0 );
134730: pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
134731: return rc;
134732: }
134733:
134734: /*
134735: ** Return the N-dimensional volumn of the cell stored in *p.
134736: */
1.2.2.1 ! misho 134737: static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){
! 134738: RtreeDValue area = (RtreeDValue)1;
1.2 misho 134739: int ii;
134740: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
1.2.2.1 ! misho 134741: area = (area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])));
1.2 misho 134742: }
134743: return area;
134744: }
134745:
134746: /*
134747: ** Return the margin length of cell p. The margin length is the sum
134748: ** of the objects size in each dimension.
134749: */
1.2.2.1 ! misho 134750: static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){
! 134751: RtreeDValue margin = (RtreeDValue)0;
1.2 misho 134752: int ii;
134753: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
1.2.2.1 ! misho 134754: margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
1.2 misho 134755: }
134756: return margin;
134757: }
134758:
134759: /*
134760: ** Store the union of cells p1 and p2 in p1.
134761: */
134762: static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
134763: int ii;
134764: if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
134765: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
134766: p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f);
134767: p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f);
134768: }
134769: }else{
134770: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
134771: p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i);
134772: p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i);
134773: }
134774: }
134775: }
134776:
134777: /*
134778: ** Return true if the area covered by p2 is a subset of the area covered
134779: ** by p1. False otherwise.
134780: */
134781: static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){
134782: int ii;
134783: int isInt = (pRtree->eCoordType==RTREE_COORD_INT32);
134784: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
134785: RtreeCoord *a1 = &p1->aCoord[ii];
134786: RtreeCoord *a2 = &p2->aCoord[ii];
134787: if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f))
134788: || ( isInt && (a2[0].i<a1[0].i || a2[1].i>a1[1].i))
134789: ){
134790: return 0;
134791: }
134792: }
134793: return 1;
134794: }
134795:
134796: /*
134797: ** Return the amount cell p would grow by if it were unioned with pCell.
134798: */
1.2.2.1 ! misho 134799: static RtreeDValue cellGrowth(Rtree *pRtree, RtreeCell *p, RtreeCell *pCell){
! 134800: RtreeDValue area;
1.2 misho 134801: RtreeCell cell;
134802: memcpy(&cell, p, sizeof(RtreeCell));
134803: area = cellArea(pRtree, &cell);
134804: cellUnion(pRtree, &cell, pCell);
134805: return (cellArea(pRtree, &cell)-area);
134806: }
134807:
134808: #if VARIANT_RSTARTREE_CHOOSESUBTREE || VARIANT_RSTARTREE_SPLIT
1.2.2.1 ! misho 134809: static RtreeDValue cellOverlap(
1.2 misho 134810: Rtree *pRtree,
134811: RtreeCell *p,
134812: RtreeCell *aCell,
134813: int nCell,
134814: int iExclude
134815: ){
134816: int ii;
1.2.2.1 ! misho 134817: RtreeDValue overlap = 0.0;
1.2 misho 134818: for(ii=0; ii<nCell; ii++){
134819: #if VARIANT_RSTARTREE_CHOOSESUBTREE
134820: if( ii!=iExclude )
134821: #else
134822: assert( iExclude==-1 );
134823: UNUSED_PARAMETER(iExclude);
134824: #endif
134825: {
134826: int jj;
1.2.2.1 ! misho 134827: RtreeDValue o = (RtreeDValue)1;
1.2 misho 134828: for(jj=0; jj<(pRtree->nDim*2); jj+=2){
1.2.2.1 ! misho 134829: RtreeDValue x1, x2;
1.2 misho 134830:
134831: x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj]));
134832: x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1]));
134833:
134834: if( x2<x1 ){
134835: o = 0.0;
134836: break;
134837: }else{
1.2.2.1 ! misho 134838: o = o * (x2-x1);
1.2 misho 134839: }
134840: }
134841: overlap += o;
134842: }
134843: }
134844: return overlap;
134845: }
134846: #endif
134847:
134848: #if VARIANT_RSTARTREE_CHOOSESUBTREE
1.2.2.1 ! misho 134849: static RtreeDValue cellOverlapEnlargement(
1.2 misho 134850: Rtree *pRtree,
134851: RtreeCell *p,
134852: RtreeCell *pInsert,
134853: RtreeCell *aCell,
134854: int nCell,
134855: int iExclude
134856: ){
1.2.2.1 ! misho 134857: RtreeDValue before, after;
1.2 misho 134858: before = cellOverlap(pRtree, p, aCell, nCell, iExclude);
134859: cellUnion(pRtree, p, pInsert);
134860: after = cellOverlap(pRtree, p, aCell, nCell, iExclude);
1.2.2.1 ! misho 134861: return (after-before);
1.2 misho 134862: }
134863: #endif
134864:
134865:
134866: /*
134867: ** This function implements the ChooseLeaf algorithm from Gutman[84].
134868: ** ChooseSubTree in r*tree terminology.
134869: */
134870: static int ChooseLeaf(
134871: Rtree *pRtree, /* Rtree table */
134872: RtreeCell *pCell, /* Cell to insert into rtree */
134873: int iHeight, /* Height of sub-tree rooted at pCell */
134874: RtreeNode **ppLeaf /* OUT: Selected leaf page */
134875: ){
134876: int rc;
134877: int ii;
134878: RtreeNode *pNode;
134879: rc = nodeAcquire(pRtree, 1, 0, &pNode);
134880:
134881: for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
134882: int iCell;
134883: sqlite3_int64 iBest = 0;
134884:
1.2.2.1 ! misho 134885: RtreeDValue fMinGrowth = 0.0;
! 134886: RtreeDValue fMinArea = 0.0;
1.2 misho 134887: #if VARIANT_RSTARTREE_CHOOSESUBTREE
1.2.2.1 ! misho 134888: RtreeDValue fMinOverlap = 0.0;
! 134889: RtreeDValue overlap;
1.2 misho 134890: #endif
134891:
134892: int nCell = NCELL(pNode);
134893: RtreeCell cell;
134894: RtreeNode *pChild;
134895:
134896: RtreeCell *aCell = 0;
134897:
134898: #if VARIANT_RSTARTREE_CHOOSESUBTREE
134899: if( ii==(pRtree->iDepth-1) ){
134900: int jj;
134901: aCell = sqlite3_malloc(sizeof(RtreeCell)*nCell);
134902: if( !aCell ){
134903: rc = SQLITE_NOMEM;
134904: nodeRelease(pRtree, pNode);
134905: pNode = 0;
134906: continue;
134907: }
134908: for(jj=0; jj<nCell; jj++){
134909: nodeGetCell(pRtree, pNode, jj, &aCell[jj]);
134910: }
134911: }
134912: #endif
134913:
134914: /* Select the child node which will be enlarged the least if pCell
134915: ** is inserted into it. Resolve ties by choosing the entry with
134916: ** the smallest area.
134917: */
134918: for(iCell=0; iCell<nCell; iCell++){
134919: int bBest = 0;
1.2.2.1 ! misho 134920: RtreeDValue growth;
! 134921: RtreeDValue area;
1.2 misho 134922: nodeGetCell(pRtree, pNode, iCell, &cell);
134923: growth = cellGrowth(pRtree, &cell, pCell);
134924: area = cellArea(pRtree, &cell);
134925:
134926: #if VARIANT_RSTARTREE_CHOOSESUBTREE
134927: if( ii==(pRtree->iDepth-1) ){
134928: overlap = cellOverlapEnlargement(pRtree,&cell,pCell,aCell,nCell,iCell);
134929: }else{
134930: overlap = 0.0;
134931: }
134932: if( (iCell==0)
134933: || (overlap<fMinOverlap)
134934: || (overlap==fMinOverlap && growth<fMinGrowth)
134935: || (overlap==fMinOverlap && growth==fMinGrowth && area<fMinArea)
134936: ){
134937: bBest = 1;
134938: fMinOverlap = overlap;
134939: }
134940: #else
134941: if( iCell==0||growth<fMinGrowth||(growth==fMinGrowth && area<fMinArea) ){
134942: bBest = 1;
134943: }
134944: #endif
134945: if( bBest ){
134946: fMinGrowth = growth;
134947: fMinArea = area;
134948: iBest = cell.iRowid;
134949: }
134950: }
134951:
134952: sqlite3_free(aCell);
134953: rc = nodeAcquire(pRtree, iBest, pNode, &pChild);
134954: nodeRelease(pRtree, pNode);
134955: pNode = pChild;
134956: }
134957:
134958: *ppLeaf = pNode;
134959: return rc;
134960: }
134961:
134962: /*
134963: ** A cell with the same content as pCell has just been inserted into
134964: ** the node pNode. This function updates the bounding box cells in
134965: ** all ancestor elements.
134966: */
134967: static int AdjustTree(
134968: Rtree *pRtree, /* Rtree table */
134969: RtreeNode *pNode, /* Adjust ancestry of this node. */
134970: RtreeCell *pCell /* This cell was just inserted */
134971: ){
134972: RtreeNode *p = pNode;
134973: while( p->pParent ){
134974: RtreeNode *pParent = p->pParent;
134975: RtreeCell cell;
134976: int iCell;
134977:
134978: if( nodeParentIndex(pRtree, p, &iCell) ){
134979: return SQLITE_CORRUPT_VTAB;
134980: }
134981:
134982: nodeGetCell(pRtree, pParent, iCell, &cell);
134983: if( !cellContains(pRtree, &cell, pCell) ){
134984: cellUnion(pRtree, &cell, pCell);
134985: nodeOverwriteCell(pRtree, pParent, &cell, iCell);
134986: }
134987:
134988: p = pParent;
134989: }
134990: return SQLITE_OK;
134991: }
134992:
134993: /*
134994: ** Write mapping (iRowid->iNode) to the <rtree>_rowid table.
134995: */
134996: static int rowidWrite(Rtree *pRtree, sqlite3_int64 iRowid, sqlite3_int64 iNode){
134997: sqlite3_bind_int64(pRtree->pWriteRowid, 1, iRowid);
134998: sqlite3_bind_int64(pRtree->pWriteRowid, 2, iNode);
134999: sqlite3_step(pRtree->pWriteRowid);
135000: return sqlite3_reset(pRtree->pWriteRowid);
135001: }
135002:
135003: /*
135004: ** Write mapping (iNode->iPar) to the <rtree>_parent table.
135005: */
135006: static int parentWrite(Rtree *pRtree, sqlite3_int64 iNode, sqlite3_int64 iPar){
135007: sqlite3_bind_int64(pRtree->pWriteParent, 1, iNode);
135008: sqlite3_bind_int64(pRtree->pWriteParent, 2, iPar);
135009: sqlite3_step(pRtree->pWriteParent);
135010: return sqlite3_reset(pRtree->pWriteParent);
135011: }
135012:
135013: static int rtreeInsertCell(Rtree *, RtreeNode *, RtreeCell *, int);
135014:
135015: #if VARIANT_GUTTMAN_LINEAR_SPLIT
135016: /*
135017: ** Implementation of the linear variant of the PickNext() function from
135018: ** Guttman[84].
135019: */
135020: static RtreeCell *LinearPickNext(
135021: Rtree *pRtree,
135022: RtreeCell *aCell,
135023: int nCell,
135024: RtreeCell *pLeftBox,
135025: RtreeCell *pRightBox,
135026: int *aiUsed
135027: ){
135028: int ii;
135029: for(ii=0; aiUsed[ii]; ii++);
135030: aiUsed[ii] = 1;
135031: return &aCell[ii];
135032: }
135033:
135034: /*
135035: ** Implementation of the linear variant of the PickSeeds() function from
135036: ** Guttman[84].
135037: */
135038: static void LinearPickSeeds(
135039: Rtree *pRtree,
135040: RtreeCell *aCell,
135041: int nCell,
135042: int *piLeftSeed,
135043: int *piRightSeed
135044: ){
135045: int i;
135046: int iLeftSeed = 0;
135047: int iRightSeed = 1;
1.2.2.1 ! misho 135048: RtreeDValue maxNormalInnerWidth = (RtreeDValue)0;
1.2 misho 135049:
135050: /* Pick two "seed" cells from the array of cells. The algorithm used
135051: ** here is the LinearPickSeeds algorithm from Gutman[1984]. The
135052: ** indices of the two seed cells in the array are stored in local
135053: ** variables iLeftSeek and iRightSeed.
135054: */
135055: for(i=0; i<pRtree->nDim; i++){
1.2.2.1 ! misho 135056: RtreeDValue x1 = DCOORD(aCell[0].aCoord[i*2]);
! 135057: RtreeDValue x2 = DCOORD(aCell[0].aCoord[i*2+1]);
! 135058: RtreeDValue x3 = x1;
! 135059: RtreeDValue x4 = x2;
1.2 misho 135060: int jj;
135061:
135062: int iCellLeft = 0;
135063: int iCellRight = 0;
135064:
135065: for(jj=1; jj<nCell; jj++){
1.2.2.1 ! misho 135066: RtreeDValue left = DCOORD(aCell[jj].aCoord[i*2]);
! 135067: RtreeDValue right = DCOORD(aCell[jj].aCoord[i*2+1]);
1.2 misho 135068:
135069: if( left<x1 ) x1 = left;
135070: if( right>x4 ) x4 = right;
135071: if( left>x3 ){
135072: x3 = left;
135073: iCellRight = jj;
135074: }
135075: if( right<x2 ){
135076: x2 = right;
135077: iCellLeft = jj;
135078: }
135079: }
135080:
135081: if( x4!=x1 ){
1.2.2.1 ! misho 135082: RtreeDValue normalwidth = (x3 - x2) / (x4 - x1);
1.2 misho 135083: if( normalwidth>maxNormalInnerWidth ){
135084: iLeftSeed = iCellLeft;
135085: iRightSeed = iCellRight;
135086: }
135087: }
135088: }
135089:
135090: *piLeftSeed = iLeftSeed;
135091: *piRightSeed = iRightSeed;
135092: }
135093: #endif /* VARIANT_GUTTMAN_LINEAR_SPLIT */
135094:
135095: #if VARIANT_GUTTMAN_QUADRATIC_SPLIT
135096: /*
135097: ** Implementation of the quadratic variant of the PickNext() function from
135098: ** Guttman[84].
135099: */
135100: static RtreeCell *QuadraticPickNext(
135101: Rtree *pRtree,
135102: RtreeCell *aCell,
135103: int nCell,
135104: RtreeCell *pLeftBox,
135105: RtreeCell *pRightBox,
135106: int *aiUsed
135107: ){
135108: #define FABS(a) ((a)<0.0?-1.0*(a):(a))
135109:
135110: int iSelect = -1;
1.2.2.1 ! misho 135111: RtreeDValue fDiff;
1.2 misho 135112: int ii;
135113: for(ii=0; ii<nCell; ii++){
135114: if( aiUsed[ii]==0 ){
1.2.2.1 ! misho 135115: RtreeDValue left = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
! 135116: RtreeDValue right = cellGrowth(pRtree, pLeftBox, &aCell[ii]);
! 135117: RtreeDValue diff = FABS(right-left);
1.2 misho 135118: if( iSelect<0 || diff>fDiff ){
135119: fDiff = diff;
135120: iSelect = ii;
135121: }
135122: }
135123: }
135124: aiUsed[iSelect] = 1;
135125: return &aCell[iSelect];
135126: }
135127:
135128: /*
135129: ** Implementation of the quadratic variant of the PickSeeds() function from
135130: ** Guttman[84].
135131: */
135132: static void QuadraticPickSeeds(
135133: Rtree *pRtree,
135134: RtreeCell *aCell,
135135: int nCell,
135136: int *piLeftSeed,
135137: int *piRightSeed
135138: ){
135139: int ii;
135140: int jj;
135141:
135142: int iLeftSeed = 0;
135143: int iRightSeed = 1;
1.2.2.1 ! misho 135144: RtreeDValue fWaste = 0.0;
1.2 misho 135145:
135146: for(ii=0; ii<nCell; ii++){
135147: for(jj=ii+1; jj<nCell; jj++){
1.2.2.1 ! misho 135148: RtreeDValue right = cellArea(pRtree, &aCell[jj]);
! 135149: RtreeDValue growth = cellGrowth(pRtree, &aCell[ii], &aCell[jj]);
! 135150: RtreeDValue waste = growth - right;
1.2 misho 135151:
135152: if( waste>fWaste ){
135153: iLeftSeed = ii;
135154: iRightSeed = jj;
135155: fWaste = waste;
135156: }
135157: }
135158: }
135159:
135160: *piLeftSeed = iLeftSeed;
135161: *piRightSeed = iRightSeed;
135162: }
135163: #endif /* VARIANT_GUTTMAN_QUADRATIC_SPLIT */
135164:
135165: /*
135166: ** Arguments aIdx, aDistance and aSpare all point to arrays of size
135167: ** nIdx. The aIdx array contains the set of integers from 0 to
135168: ** (nIdx-1) in no particular order. This function sorts the values
135169: ** in aIdx according to the indexed values in aDistance. For
135170: ** example, assuming the inputs:
135171: **
135172: ** aIdx = { 0, 1, 2, 3 }
135173: ** aDistance = { 5.0, 2.0, 7.0, 6.0 }
135174: **
135175: ** this function sets the aIdx array to contain:
135176: **
135177: ** aIdx = { 0, 1, 2, 3 }
135178: **
135179: ** The aSpare array is used as temporary working space by the
135180: ** sorting algorithm.
135181: */
135182: static void SortByDistance(
135183: int *aIdx,
135184: int nIdx,
1.2.2.1 ! misho 135185: RtreeDValue *aDistance,
1.2 misho 135186: int *aSpare
135187: ){
135188: if( nIdx>1 ){
135189: int iLeft = 0;
135190: int iRight = 0;
135191:
135192: int nLeft = nIdx/2;
135193: int nRight = nIdx-nLeft;
135194: int *aLeft = aIdx;
135195: int *aRight = &aIdx[nLeft];
135196:
135197: SortByDistance(aLeft, nLeft, aDistance, aSpare);
135198: SortByDistance(aRight, nRight, aDistance, aSpare);
135199:
135200: memcpy(aSpare, aLeft, sizeof(int)*nLeft);
135201: aLeft = aSpare;
135202:
135203: while( iLeft<nLeft || iRight<nRight ){
135204: if( iLeft==nLeft ){
135205: aIdx[iLeft+iRight] = aRight[iRight];
135206: iRight++;
135207: }else if( iRight==nRight ){
135208: aIdx[iLeft+iRight] = aLeft[iLeft];
135209: iLeft++;
135210: }else{
1.2.2.1 ! misho 135211: RtreeDValue fLeft = aDistance[aLeft[iLeft]];
! 135212: RtreeDValue fRight = aDistance[aRight[iRight]];
1.2 misho 135213: if( fLeft<fRight ){
135214: aIdx[iLeft+iRight] = aLeft[iLeft];
135215: iLeft++;
135216: }else{
135217: aIdx[iLeft+iRight] = aRight[iRight];
135218: iRight++;
135219: }
135220: }
135221: }
135222:
135223: #if 0
135224: /* Check that the sort worked */
135225: {
135226: int jj;
135227: for(jj=1; jj<nIdx; jj++){
1.2.2.1 ! misho 135228: RtreeDValue left = aDistance[aIdx[jj-1]];
! 135229: RtreeDValue right = aDistance[aIdx[jj]];
1.2 misho 135230: assert( left<=right );
135231: }
135232: }
135233: #endif
135234: }
135235: }
135236:
135237: /*
135238: ** Arguments aIdx, aCell and aSpare all point to arrays of size
135239: ** nIdx. The aIdx array contains the set of integers from 0 to
135240: ** (nIdx-1) in no particular order. This function sorts the values
135241: ** in aIdx according to dimension iDim of the cells in aCell. The
135242: ** minimum value of dimension iDim is considered first, the
135243: ** maximum used to break ties.
135244: **
135245: ** The aSpare array is used as temporary working space by the
135246: ** sorting algorithm.
135247: */
135248: static void SortByDimension(
135249: Rtree *pRtree,
135250: int *aIdx,
135251: int nIdx,
135252: int iDim,
135253: RtreeCell *aCell,
135254: int *aSpare
135255: ){
135256: if( nIdx>1 ){
135257:
135258: int iLeft = 0;
135259: int iRight = 0;
135260:
135261: int nLeft = nIdx/2;
135262: int nRight = nIdx-nLeft;
135263: int *aLeft = aIdx;
135264: int *aRight = &aIdx[nLeft];
135265:
135266: SortByDimension(pRtree, aLeft, nLeft, iDim, aCell, aSpare);
135267: SortByDimension(pRtree, aRight, nRight, iDim, aCell, aSpare);
135268:
135269: memcpy(aSpare, aLeft, sizeof(int)*nLeft);
135270: aLeft = aSpare;
135271: while( iLeft<nLeft || iRight<nRight ){
1.2.2.1 ! misho 135272: RtreeDValue xleft1 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2]);
! 135273: RtreeDValue xleft2 = DCOORD(aCell[aLeft[iLeft]].aCoord[iDim*2+1]);
! 135274: RtreeDValue xright1 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2]);
! 135275: RtreeDValue xright2 = DCOORD(aCell[aRight[iRight]].aCoord[iDim*2+1]);
1.2 misho 135276: if( (iLeft!=nLeft) && ((iRight==nRight)
135277: || (xleft1<xright1)
135278: || (xleft1==xright1 && xleft2<xright2)
135279: )){
135280: aIdx[iLeft+iRight] = aLeft[iLeft];
135281: iLeft++;
135282: }else{
135283: aIdx[iLeft+iRight] = aRight[iRight];
135284: iRight++;
135285: }
135286: }
135287:
135288: #if 0
135289: /* Check that the sort worked */
135290: {
135291: int jj;
135292: for(jj=1; jj<nIdx; jj++){
1.2.2.1 ! misho 135293: RtreeDValue xleft1 = aCell[aIdx[jj-1]].aCoord[iDim*2];
! 135294: RtreeDValue xleft2 = aCell[aIdx[jj-1]].aCoord[iDim*2+1];
! 135295: RtreeDValue xright1 = aCell[aIdx[jj]].aCoord[iDim*2];
! 135296: RtreeDValue xright2 = aCell[aIdx[jj]].aCoord[iDim*2+1];
1.2 misho 135297: assert( xleft1<=xright1 && (xleft1<xright1 || xleft2<=xright2) );
135298: }
135299: }
135300: #endif
135301: }
135302: }
135303:
135304: #if VARIANT_RSTARTREE_SPLIT
135305: /*
135306: ** Implementation of the R*-tree variant of SplitNode from Beckman[1990].
135307: */
135308: static int splitNodeStartree(
135309: Rtree *pRtree,
135310: RtreeCell *aCell,
135311: int nCell,
135312: RtreeNode *pLeft,
135313: RtreeNode *pRight,
135314: RtreeCell *pBboxLeft,
135315: RtreeCell *pBboxRight
135316: ){
135317: int **aaSorted;
135318: int *aSpare;
135319: int ii;
135320:
135321: int iBestDim = 0;
135322: int iBestSplit = 0;
1.2.2.1 ! misho 135323: RtreeDValue fBestMargin = 0.0;
1.2 misho 135324:
135325: int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
135326:
135327: aaSorted = (int **)sqlite3_malloc(nByte);
135328: if( !aaSorted ){
135329: return SQLITE_NOMEM;
135330: }
135331:
135332: aSpare = &((int *)&aaSorted[pRtree->nDim])[pRtree->nDim*nCell];
135333: memset(aaSorted, 0, nByte);
135334: for(ii=0; ii<pRtree->nDim; ii++){
135335: int jj;
135336: aaSorted[ii] = &((int *)&aaSorted[pRtree->nDim])[ii*nCell];
135337: for(jj=0; jj<nCell; jj++){
135338: aaSorted[ii][jj] = jj;
135339: }
135340: SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
135341: }
135342:
135343: for(ii=0; ii<pRtree->nDim; ii++){
1.2.2.1 ! misho 135344: RtreeDValue margin = 0.0;
! 135345: RtreeDValue fBestOverlap = 0.0;
! 135346: RtreeDValue fBestArea = 0.0;
1.2 misho 135347: int iBestLeft = 0;
135348: int nLeft;
135349:
135350: for(
135351: nLeft=RTREE_MINCELLS(pRtree);
135352: nLeft<=(nCell-RTREE_MINCELLS(pRtree));
135353: nLeft++
135354: ){
135355: RtreeCell left;
135356: RtreeCell right;
135357: int kk;
1.2.2.1 ! misho 135358: RtreeDValue overlap;
! 135359: RtreeDValue area;
1.2 misho 135360:
135361: memcpy(&left, &aCell[aaSorted[ii][0]], sizeof(RtreeCell));
135362: memcpy(&right, &aCell[aaSorted[ii][nCell-1]], sizeof(RtreeCell));
135363: for(kk=1; kk<(nCell-1); kk++){
135364: if( kk<nLeft ){
135365: cellUnion(pRtree, &left, &aCell[aaSorted[ii][kk]]);
135366: }else{
135367: cellUnion(pRtree, &right, &aCell[aaSorted[ii][kk]]);
135368: }
135369: }
135370: margin += cellMargin(pRtree, &left);
135371: margin += cellMargin(pRtree, &right);
135372: overlap = cellOverlap(pRtree, &left, &right, 1, -1);
135373: area = cellArea(pRtree, &left) + cellArea(pRtree, &right);
135374: if( (nLeft==RTREE_MINCELLS(pRtree))
135375: || (overlap<fBestOverlap)
135376: || (overlap==fBestOverlap && area<fBestArea)
135377: ){
135378: iBestLeft = nLeft;
135379: fBestOverlap = overlap;
135380: fBestArea = area;
135381: }
135382: }
135383:
135384: if( ii==0 || margin<fBestMargin ){
135385: iBestDim = ii;
135386: fBestMargin = margin;
135387: iBestSplit = iBestLeft;
135388: }
135389: }
135390:
135391: memcpy(pBboxLeft, &aCell[aaSorted[iBestDim][0]], sizeof(RtreeCell));
135392: memcpy(pBboxRight, &aCell[aaSorted[iBestDim][iBestSplit]], sizeof(RtreeCell));
135393: for(ii=0; ii<nCell; ii++){
135394: RtreeNode *pTarget = (ii<iBestSplit)?pLeft:pRight;
135395: RtreeCell *pBbox = (ii<iBestSplit)?pBboxLeft:pBboxRight;
135396: RtreeCell *pCell = &aCell[aaSorted[iBestDim][ii]];
135397: nodeInsertCell(pRtree, pTarget, pCell);
135398: cellUnion(pRtree, pBbox, pCell);
135399: }
135400:
135401: sqlite3_free(aaSorted);
135402: return SQLITE_OK;
135403: }
135404: #endif
135405:
135406: #if VARIANT_GUTTMAN_SPLIT
135407: /*
135408: ** Implementation of the regular R-tree SplitNode from Guttman[1984].
135409: */
135410: static int splitNodeGuttman(
135411: Rtree *pRtree,
135412: RtreeCell *aCell,
135413: int nCell,
135414: RtreeNode *pLeft,
135415: RtreeNode *pRight,
135416: RtreeCell *pBboxLeft,
135417: RtreeCell *pBboxRight
135418: ){
135419: int iLeftSeed = 0;
135420: int iRightSeed = 1;
135421: int *aiUsed;
135422: int i;
135423:
135424: aiUsed = sqlite3_malloc(sizeof(int)*nCell);
135425: if( !aiUsed ){
135426: return SQLITE_NOMEM;
135427: }
135428: memset(aiUsed, 0, sizeof(int)*nCell);
135429:
135430: PickSeeds(pRtree, aCell, nCell, &iLeftSeed, &iRightSeed);
135431:
135432: memcpy(pBboxLeft, &aCell[iLeftSeed], sizeof(RtreeCell));
135433: memcpy(pBboxRight, &aCell[iRightSeed], sizeof(RtreeCell));
135434: nodeInsertCell(pRtree, pLeft, &aCell[iLeftSeed]);
135435: nodeInsertCell(pRtree, pRight, &aCell[iRightSeed]);
135436: aiUsed[iLeftSeed] = 1;
135437: aiUsed[iRightSeed] = 1;
135438:
135439: for(i=nCell-2; i>0; i--){
135440: RtreeCell *pNext;
135441: pNext = PickNext(pRtree, aCell, nCell, pBboxLeft, pBboxRight, aiUsed);
1.2.2.1 ! misho 135442: RtreeDValue diff =
1.2 misho 135443: cellGrowth(pRtree, pBboxLeft, pNext) -
135444: cellGrowth(pRtree, pBboxRight, pNext)
135445: ;
135446: if( (RTREE_MINCELLS(pRtree)-NCELL(pRight)==i)
135447: || (diff>0.0 && (RTREE_MINCELLS(pRtree)-NCELL(pLeft)!=i))
135448: ){
135449: nodeInsertCell(pRtree, pRight, pNext);
135450: cellUnion(pRtree, pBboxRight, pNext);
135451: }else{
135452: nodeInsertCell(pRtree, pLeft, pNext);
135453: cellUnion(pRtree, pBboxLeft, pNext);
135454: }
135455: }
135456:
135457: sqlite3_free(aiUsed);
135458: return SQLITE_OK;
135459: }
135460: #endif
135461:
135462: static int updateMapping(
135463: Rtree *pRtree,
135464: i64 iRowid,
135465: RtreeNode *pNode,
135466: int iHeight
135467: ){
135468: int (*xSetMapping)(Rtree *, sqlite3_int64, sqlite3_int64);
135469: xSetMapping = ((iHeight==0)?rowidWrite:parentWrite);
135470: if( iHeight>0 ){
135471: RtreeNode *pChild = nodeHashLookup(pRtree, iRowid);
135472: if( pChild ){
135473: nodeRelease(pRtree, pChild->pParent);
135474: nodeReference(pNode);
135475: pChild->pParent = pNode;
135476: }
135477: }
135478: return xSetMapping(pRtree, iRowid, pNode->iNode);
135479: }
135480:
135481: static int SplitNode(
135482: Rtree *pRtree,
135483: RtreeNode *pNode,
135484: RtreeCell *pCell,
135485: int iHeight
135486: ){
135487: int i;
135488: int newCellIsRight = 0;
135489:
135490: int rc = SQLITE_OK;
135491: int nCell = NCELL(pNode);
135492: RtreeCell *aCell;
135493: int *aiUsed;
135494:
135495: RtreeNode *pLeft = 0;
135496: RtreeNode *pRight = 0;
135497:
135498: RtreeCell leftbbox;
135499: RtreeCell rightbbox;
135500:
135501: /* Allocate an array and populate it with a copy of pCell and
135502: ** all cells from node pLeft. Then zero the original node.
135503: */
135504: aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1));
135505: if( !aCell ){
135506: rc = SQLITE_NOMEM;
135507: goto splitnode_out;
135508: }
135509: aiUsed = (int *)&aCell[nCell+1];
135510: memset(aiUsed, 0, sizeof(int)*(nCell+1));
135511: for(i=0; i<nCell; i++){
135512: nodeGetCell(pRtree, pNode, i, &aCell[i]);
135513: }
135514: nodeZero(pRtree, pNode);
135515: memcpy(&aCell[nCell], pCell, sizeof(RtreeCell));
135516: nCell++;
135517:
135518: if( pNode->iNode==1 ){
135519: pRight = nodeNew(pRtree, pNode);
135520: pLeft = nodeNew(pRtree, pNode);
135521: pRtree->iDepth++;
135522: pNode->isDirty = 1;
135523: writeInt16(pNode->zData, pRtree->iDepth);
135524: }else{
135525: pLeft = pNode;
135526: pRight = nodeNew(pRtree, pLeft->pParent);
135527: nodeReference(pLeft);
135528: }
135529:
135530: if( !pLeft || !pRight ){
135531: rc = SQLITE_NOMEM;
135532: goto splitnode_out;
135533: }
135534:
135535: memset(pLeft->zData, 0, pRtree->iNodeSize);
135536: memset(pRight->zData, 0, pRtree->iNodeSize);
135537:
135538: rc = AssignCells(pRtree, aCell, nCell, pLeft, pRight, &leftbbox, &rightbbox);
135539: if( rc!=SQLITE_OK ){
135540: goto splitnode_out;
135541: }
135542:
135543: /* Ensure both child nodes have node numbers assigned to them by calling
135544: ** nodeWrite(). Node pRight always needs a node number, as it was created
135545: ** by nodeNew() above. But node pLeft sometimes already has a node number.
135546: ** In this case avoid the all to nodeWrite().
135547: */
135548: if( SQLITE_OK!=(rc = nodeWrite(pRtree, pRight))
135549: || (0==pLeft->iNode && SQLITE_OK!=(rc = nodeWrite(pRtree, pLeft)))
135550: ){
135551: goto splitnode_out;
135552: }
135553:
135554: rightbbox.iRowid = pRight->iNode;
135555: leftbbox.iRowid = pLeft->iNode;
135556:
135557: if( pNode->iNode==1 ){
135558: rc = rtreeInsertCell(pRtree, pLeft->pParent, &leftbbox, iHeight+1);
135559: if( rc!=SQLITE_OK ){
135560: goto splitnode_out;
135561: }
135562: }else{
135563: RtreeNode *pParent = pLeft->pParent;
135564: int iCell;
135565: rc = nodeParentIndex(pRtree, pLeft, &iCell);
135566: if( rc==SQLITE_OK ){
135567: nodeOverwriteCell(pRtree, pParent, &leftbbox, iCell);
135568: rc = AdjustTree(pRtree, pParent, &leftbbox);
135569: }
135570: if( rc!=SQLITE_OK ){
135571: goto splitnode_out;
135572: }
135573: }
135574: if( (rc = rtreeInsertCell(pRtree, pRight->pParent, &rightbbox, iHeight+1)) ){
135575: goto splitnode_out;
135576: }
135577:
135578: for(i=0; i<NCELL(pRight); i++){
135579: i64 iRowid = nodeGetRowid(pRtree, pRight, i);
135580: rc = updateMapping(pRtree, iRowid, pRight, iHeight);
135581: if( iRowid==pCell->iRowid ){
135582: newCellIsRight = 1;
135583: }
135584: if( rc!=SQLITE_OK ){
135585: goto splitnode_out;
135586: }
135587: }
135588: if( pNode->iNode==1 ){
135589: for(i=0; i<NCELL(pLeft); i++){
135590: i64 iRowid = nodeGetRowid(pRtree, pLeft, i);
135591: rc = updateMapping(pRtree, iRowid, pLeft, iHeight);
135592: if( rc!=SQLITE_OK ){
135593: goto splitnode_out;
135594: }
135595: }
135596: }else if( newCellIsRight==0 ){
135597: rc = updateMapping(pRtree, pCell->iRowid, pLeft, iHeight);
135598: }
135599:
135600: if( rc==SQLITE_OK ){
135601: rc = nodeRelease(pRtree, pRight);
135602: pRight = 0;
135603: }
135604: if( rc==SQLITE_OK ){
135605: rc = nodeRelease(pRtree, pLeft);
135606: pLeft = 0;
135607: }
135608:
135609: splitnode_out:
135610: nodeRelease(pRtree, pRight);
135611: nodeRelease(pRtree, pLeft);
135612: sqlite3_free(aCell);
135613: return rc;
135614: }
135615:
135616: /*
135617: ** If node pLeaf is not the root of the r-tree and its pParent pointer is
135618: ** still NULL, load all ancestor nodes of pLeaf into memory and populate
135619: ** the pLeaf->pParent chain all the way up to the root node.
135620: **
135621: ** This operation is required when a row is deleted (or updated - an update
135622: ** is implemented as a delete followed by an insert). SQLite provides the
135623: ** rowid of the row to delete, which can be used to find the leaf on which
135624: ** the entry resides (argument pLeaf). Once the leaf is located, this
135625: ** function is called to determine its ancestry.
135626: */
135627: static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){
135628: int rc = SQLITE_OK;
135629: RtreeNode *pChild = pLeaf;
135630: while( rc==SQLITE_OK && pChild->iNode!=1 && pChild->pParent==0 ){
135631: int rc2 = SQLITE_OK; /* sqlite3_reset() return code */
135632: sqlite3_bind_int64(pRtree->pReadParent, 1, pChild->iNode);
135633: rc = sqlite3_step(pRtree->pReadParent);
135634: if( rc==SQLITE_ROW ){
135635: RtreeNode *pTest; /* Used to test for reference loops */
135636: i64 iNode; /* Node number of parent node */
135637:
135638: /* Before setting pChild->pParent, test that we are not creating a
135639: ** loop of references (as we would if, say, pChild==pParent). We don't
135640: ** want to do this as it leads to a memory leak when trying to delete
135641: ** the referenced counted node structures.
135642: */
135643: iNode = sqlite3_column_int64(pRtree->pReadParent, 0);
135644: for(pTest=pLeaf; pTest && pTest->iNode!=iNode; pTest=pTest->pParent);
135645: if( !pTest ){
135646: rc2 = nodeAcquire(pRtree, iNode, 0, &pChild->pParent);
135647: }
135648: }
135649: rc = sqlite3_reset(pRtree->pReadParent);
135650: if( rc==SQLITE_OK ) rc = rc2;
135651: if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB;
135652: pChild = pChild->pParent;
135653: }
135654: return rc;
135655: }
135656:
135657: static int deleteCell(Rtree *, RtreeNode *, int, int);
135658:
135659: static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
135660: int rc;
135661: int rc2;
135662: RtreeNode *pParent = 0;
135663: int iCell;
135664:
135665: assert( pNode->nRef==1 );
135666:
135667: /* Remove the entry in the parent cell. */
135668: rc = nodeParentIndex(pRtree, pNode, &iCell);
135669: if( rc==SQLITE_OK ){
135670: pParent = pNode->pParent;
135671: pNode->pParent = 0;
135672: rc = deleteCell(pRtree, pParent, iCell, iHeight+1);
135673: }
135674: rc2 = nodeRelease(pRtree, pParent);
135675: if( rc==SQLITE_OK ){
135676: rc = rc2;
135677: }
135678: if( rc!=SQLITE_OK ){
135679: return rc;
135680: }
135681:
135682: /* Remove the xxx_node entry. */
135683: sqlite3_bind_int64(pRtree->pDeleteNode, 1, pNode->iNode);
135684: sqlite3_step(pRtree->pDeleteNode);
135685: if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteNode)) ){
135686: return rc;
135687: }
135688:
135689: /* Remove the xxx_parent entry. */
135690: sqlite3_bind_int64(pRtree->pDeleteParent, 1, pNode->iNode);
135691: sqlite3_step(pRtree->pDeleteParent);
135692: if( SQLITE_OK!=(rc = sqlite3_reset(pRtree->pDeleteParent)) ){
135693: return rc;
135694: }
135695:
135696: /* Remove the node from the in-memory hash table and link it into
135697: ** the Rtree.pDeleted list. Its contents will be re-inserted later on.
135698: */
135699: nodeHashDelete(pRtree, pNode);
135700: pNode->iNode = iHeight;
135701: pNode->pNext = pRtree->pDeleted;
135702: pNode->nRef++;
135703: pRtree->pDeleted = pNode;
135704:
135705: return SQLITE_OK;
135706: }
135707:
135708: static int fixBoundingBox(Rtree *pRtree, RtreeNode *pNode){
135709: RtreeNode *pParent = pNode->pParent;
135710: int rc = SQLITE_OK;
135711: if( pParent ){
135712: int ii;
135713: int nCell = NCELL(pNode);
135714: RtreeCell box; /* Bounding box for pNode */
135715: nodeGetCell(pRtree, pNode, 0, &box);
135716: for(ii=1; ii<nCell; ii++){
135717: RtreeCell cell;
135718: nodeGetCell(pRtree, pNode, ii, &cell);
135719: cellUnion(pRtree, &box, &cell);
135720: }
135721: box.iRowid = pNode->iNode;
135722: rc = nodeParentIndex(pRtree, pNode, &ii);
135723: if( rc==SQLITE_OK ){
135724: nodeOverwriteCell(pRtree, pParent, &box, ii);
135725: rc = fixBoundingBox(pRtree, pParent);
135726: }
135727: }
135728: return rc;
135729: }
135730:
135731: /*
135732: ** Delete the cell at index iCell of node pNode. After removing the
135733: ** cell, adjust the r-tree data structure if required.
135734: */
135735: static int deleteCell(Rtree *pRtree, RtreeNode *pNode, int iCell, int iHeight){
135736: RtreeNode *pParent;
135737: int rc;
135738:
135739: if( SQLITE_OK!=(rc = fixLeafParent(pRtree, pNode)) ){
135740: return rc;
135741: }
135742:
135743: /* Remove the cell from the node. This call just moves bytes around
135744: ** the in-memory node image, so it cannot fail.
135745: */
135746: nodeDeleteCell(pRtree, pNode, iCell);
135747:
135748: /* If the node is not the tree root and now has less than the minimum
135749: ** number of cells, remove it from the tree. Otherwise, update the
135750: ** cell in the parent node so that it tightly contains the updated
135751: ** node.
135752: */
135753: pParent = pNode->pParent;
135754: assert( pParent || pNode->iNode==1 );
135755: if( pParent ){
135756: if( NCELL(pNode)<RTREE_MINCELLS(pRtree) ){
135757: rc = removeNode(pRtree, pNode, iHeight);
135758: }else{
135759: rc = fixBoundingBox(pRtree, pNode);
135760: }
135761: }
135762:
135763: return rc;
135764: }
135765:
135766: static int Reinsert(
135767: Rtree *pRtree,
135768: RtreeNode *pNode,
135769: RtreeCell *pCell,
135770: int iHeight
135771: ){
135772: int *aOrder;
135773: int *aSpare;
135774: RtreeCell *aCell;
1.2.2.1 ! misho 135775: RtreeDValue *aDistance;
1.2 misho 135776: int nCell;
1.2.2.1 ! misho 135777: RtreeDValue aCenterCoord[RTREE_MAX_DIMENSIONS];
1.2 misho 135778: int iDim;
135779: int ii;
135780: int rc = SQLITE_OK;
1.2.2.1 ! misho 135781: int n;
1.2 misho 135782:
1.2.2.1 ! misho 135783: memset(aCenterCoord, 0, sizeof(RtreeDValue)*RTREE_MAX_DIMENSIONS);
1.2 misho 135784:
135785: nCell = NCELL(pNode)+1;
1.2.2.1 ! misho 135786: n = (nCell+1)&(~1);
1.2 misho 135787:
135788: /* Allocate the buffers used by this operation. The allocation is
135789: ** relinquished before this function returns.
135790: */
1.2.2.1 ! misho 135791: aCell = (RtreeCell *)sqlite3_malloc(n * (
! 135792: sizeof(RtreeCell) + /* aCell array */
! 135793: sizeof(int) + /* aOrder array */
! 135794: sizeof(int) + /* aSpare array */
! 135795: sizeof(RtreeDValue) /* aDistance array */
1.2 misho 135796: ));
135797: if( !aCell ){
135798: return SQLITE_NOMEM;
135799: }
1.2.2.1 ! misho 135800: aOrder = (int *)&aCell[n];
! 135801: aSpare = (int *)&aOrder[n];
! 135802: aDistance = (RtreeDValue *)&aSpare[n];
1.2 misho 135803:
135804: for(ii=0; ii<nCell; ii++){
135805: if( ii==(nCell-1) ){
135806: memcpy(&aCell[ii], pCell, sizeof(RtreeCell));
135807: }else{
135808: nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
135809: }
135810: aOrder[ii] = ii;
135811: for(iDim=0; iDim<pRtree->nDim; iDim++){
1.2.2.1 ! misho 135812: aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]);
! 135813: aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]);
1.2 misho 135814: }
135815: }
135816: for(iDim=0; iDim<pRtree->nDim; iDim++){
1.2.2.1 ! misho 135817: aCenterCoord[iDim] = (aCenterCoord[iDim]/(nCell*(RtreeDValue)2));
1.2 misho 135818: }
135819:
135820: for(ii=0; ii<nCell; ii++){
135821: aDistance[ii] = 0.0;
135822: for(iDim=0; iDim<pRtree->nDim; iDim++){
1.2.2.1 ! misho 135823: RtreeDValue coord = (DCOORD(aCell[ii].aCoord[iDim*2+1]) -
! 135824: DCOORD(aCell[ii].aCoord[iDim*2]));
1.2 misho 135825: aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
135826: }
135827: }
135828:
135829: SortByDistance(aOrder, nCell, aDistance, aSpare);
135830: nodeZero(pRtree, pNode);
135831:
135832: for(ii=0; rc==SQLITE_OK && ii<(nCell-(RTREE_MINCELLS(pRtree)+1)); ii++){
135833: RtreeCell *p = &aCell[aOrder[ii]];
135834: nodeInsertCell(pRtree, pNode, p);
135835: if( p->iRowid==pCell->iRowid ){
135836: if( iHeight==0 ){
135837: rc = rowidWrite(pRtree, p->iRowid, pNode->iNode);
135838: }else{
135839: rc = parentWrite(pRtree, p->iRowid, pNode->iNode);
135840: }
135841: }
135842: }
135843: if( rc==SQLITE_OK ){
135844: rc = fixBoundingBox(pRtree, pNode);
135845: }
135846: for(; rc==SQLITE_OK && ii<nCell; ii++){
135847: /* Find a node to store this cell in. pNode->iNode currently contains
135848: ** the height of the sub-tree headed by the cell.
135849: */
135850: RtreeNode *pInsert;
135851: RtreeCell *p = &aCell[aOrder[ii]];
135852: rc = ChooseLeaf(pRtree, p, iHeight, &pInsert);
135853: if( rc==SQLITE_OK ){
135854: int rc2;
135855: rc = rtreeInsertCell(pRtree, pInsert, p, iHeight);
135856: rc2 = nodeRelease(pRtree, pInsert);
135857: if( rc==SQLITE_OK ){
135858: rc = rc2;
135859: }
135860: }
135861: }
135862:
135863: sqlite3_free(aCell);
135864: return rc;
135865: }
135866:
135867: /*
135868: ** Insert cell pCell into node pNode. Node pNode is the head of a
135869: ** subtree iHeight high (leaf nodes have iHeight==0).
135870: */
135871: static int rtreeInsertCell(
135872: Rtree *pRtree,
135873: RtreeNode *pNode,
135874: RtreeCell *pCell,
135875: int iHeight
135876: ){
135877: int rc = SQLITE_OK;
135878: if( iHeight>0 ){
135879: RtreeNode *pChild = nodeHashLookup(pRtree, pCell->iRowid);
135880: if( pChild ){
135881: nodeRelease(pRtree, pChild->pParent);
135882: nodeReference(pNode);
135883: pChild->pParent = pNode;
135884: }
135885: }
135886: if( nodeInsertCell(pRtree, pNode, pCell) ){
135887: #if VARIANT_RSTARTREE_REINSERT
135888: if( iHeight<=pRtree->iReinsertHeight || pNode->iNode==1){
135889: rc = SplitNode(pRtree, pNode, pCell, iHeight);
135890: }else{
135891: pRtree->iReinsertHeight = iHeight;
135892: rc = Reinsert(pRtree, pNode, pCell, iHeight);
135893: }
135894: #else
135895: rc = SplitNode(pRtree, pNode, pCell, iHeight);
135896: #endif
135897: }else{
135898: rc = AdjustTree(pRtree, pNode, pCell);
135899: if( rc==SQLITE_OK ){
135900: if( iHeight==0 ){
135901: rc = rowidWrite(pRtree, pCell->iRowid, pNode->iNode);
135902: }else{
135903: rc = parentWrite(pRtree, pCell->iRowid, pNode->iNode);
135904: }
135905: }
135906: }
135907: return rc;
135908: }
135909:
135910: static int reinsertNodeContent(Rtree *pRtree, RtreeNode *pNode){
135911: int ii;
135912: int rc = SQLITE_OK;
135913: int nCell = NCELL(pNode);
135914:
135915: for(ii=0; rc==SQLITE_OK && ii<nCell; ii++){
135916: RtreeNode *pInsert;
135917: RtreeCell cell;
135918: nodeGetCell(pRtree, pNode, ii, &cell);
135919:
135920: /* Find a node to store this cell in. pNode->iNode currently contains
135921: ** the height of the sub-tree headed by the cell.
135922: */
135923: rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert);
135924: if( rc==SQLITE_OK ){
135925: int rc2;
135926: rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode);
135927: rc2 = nodeRelease(pRtree, pInsert);
135928: if( rc==SQLITE_OK ){
135929: rc = rc2;
135930: }
135931: }
135932: }
135933: return rc;
135934: }
135935:
135936: /*
135937: ** Select a currently unused rowid for a new r-tree record.
135938: */
135939: static int newRowid(Rtree *pRtree, i64 *piRowid){
135940: int rc;
135941: sqlite3_bind_null(pRtree->pWriteRowid, 1);
135942: sqlite3_bind_null(pRtree->pWriteRowid, 2);
135943: sqlite3_step(pRtree->pWriteRowid);
135944: rc = sqlite3_reset(pRtree->pWriteRowid);
135945: *piRowid = sqlite3_last_insert_rowid(pRtree->db);
135946: return rc;
135947: }
135948:
135949: /*
135950: ** Remove the entry with rowid=iDelete from the r-tree structure.
135951: */
135952: static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){
135953: int rc; /* Return code */
1.2.2.1 ! misho 135954: RtreeNode *pLeaf = 0; /* Leaf node containing record iDelete */
1.2 misho 135955: int iCell; /* Index of iDelete cell in pLeaf */
135956: RtreeNode *pRoot; /* Root node of rtree structure */
135957:
135958:
135959: /* Obtain a reference to the root node to initialise Rtree.iDepth */
135960: rc = nodeAcquire(pRtree, 1, 0, &pRoot);
135961:
135962: /* Obtain a reference to the leaf node that contains the entry
135963: ** about to be deleted.
135964: */
135965: if( rc==SQLITE_OK ){
135966: rc = findLeafNode(pRtree, iDelete, &pLeaf);
135967: }
135968:
135969: /* Delete the cell in question from the leaf node. */
135970: if( rc==SQLITE_OK ){
135971: int rc2;
135972: rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell);
135973: if( rc==SQLITE_OK ){
135974: rc = deleteCell(pRtree, pLeaf, iCell, 0);
135975: }
135976: rc2 = nodeRelease(pRtree, pLeaf);
135977: if( rc==SQLITE_OK ){
135978: rc = rc2;
135979: }
135980: }
135981:
135982: /* Delete the corresponding entry in the <rtree>_rowid table. */
135983: if( rc==SQLITE_OK ){
135984: sqlite3_bind_int64(pRtree->pDeleteRowid, 1, iDelete);
135985: sqlite3_step(pRtree->pDeleteRowid);
135986: rc = sqlite3_reset(pRtree->pDeleteRowid);
135987: }
135988:
135989: /* Check if the root node now has exactly one child. If so, remove
135990: ** it, schedule the contents of the child for reinsertion and
135991: ** reduce the tree height by one.
135992: **
135993: ** This is equivalent to copying the contents of the child into
135994: ** the root node (the operation that Gutman's paper says to perform
135995: ** in this scenario).
135996: */
135997: if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){
135998: int rc2;
135999: RtreeNode *pChild;
136000: i64 iChild = nodeGetRowid(pRtree, pRoot, 0);
136001: rc = nodeAcquire(pRtree, iChild, pRoot, &pChild);
136002: if( rc==SQLITE_OK ){
136003: rc = removeNode(pRtree, pChild, pRtree->iDepth-1);
136004: }
136005: rc2 = nodeRelease(pRtree, pChild);
136006: if( rc==SQLITE_OK ) rc = rc2;
136007: if( rc==SQLITE_OK ){
136008: pRtree->iDepth--;
136009: writeInt16(pRoot->zData, pRtree->iDepth);
136010: pRoot->isDirty = 1;
136011: }
136012: }
136013:
136014: /* Re-insert the contents of any underfull nodes removed from the tree. */
136015: for(pLeaf=pRtree->pDeleted; pLeaf; pLeaf=pRtree->pDeleted){
136016: if( rc==SQLITE_OK ){
136017: rc = reinsertNodeContent(pRtree, pLeaf);
136018: }
136019: pRtree->pDeleted = pLeaf->pNext;
136020: sqlite3_free(pLeaf);
136021: }
136022:
136023: /* Release the reference to the root node. */
136024: if( rc==SQLITE_OK ){
136025: rc = nodeRelease(pRtree, pRoot);
136026: }else{
136027: nodeRelease(pRtree, pRoot);
136028: }
136029:
136030: return rc;
136031: }
136032:
136033: /*
1.2.2.1 ! misho 136034: ** Rounding constants for float->double conversion.
! 136035: */
! 136036: #define RNDTOWARDS (1.0 - 1.0/8388608.0) /* Round towards zero */
! 136037: #define RNDAWAY (1.0 + 1.0/8388608.0) /* Round away from zero */
! 136038:
! 136039: #if !defined(SQLITE_RTREE_INT_ONLY)
! 136040: /*
! 136041: ** Convert an sqlite3_value into an RtreeValue (presumably a float)
! 136042: ** while taking care to round toward negative or positive, respectively.
! 136043: */
! 136044: static RtreeValue rtreeValueDown(sqlite3_value *v){
! 136045: double d = sqlite3_value_double(v);
! 136046: float f = (float)d;
! 136047: if( f>d ){
! 136048: f = (float)(d*(d<0 ? RNDAWAY : RNDTOWARDS));
! 136049: }
! 136050: return f;
! 136051: }
! 136052: static RtreeValue rtreeValueUp(sqlite3_value *v){
! 136053: double d = sqlite3_value_double(v);
! 136054: float f = (float)d;
! 136055: if( f<d ){
! 136056: f = (float)(d*(d<0 ? RNDTOWARDS : RNDAWAY));
! 136057: }
! 136058: return f;
! 136059: }
! 136060: #endif /* !defined(SQLITE_RTREE_INT_ONLY) */
! 136061:
! 136062:
! 136063: /*
1.2 misho 136064: ** The xUpdate method for rtree module virtual tables.
136065: */
136066: static int rtreeUpdate(
136067: sqlite3_vtab *pVtab,
136068: int nData,
136069: sqlite3_value **azData,
136070: sqlite_int64 *pRowid
136071: ){
136072: Rtree *pRtree = (Rtree *)pVtab;
136073: int rc = SQLITE_OK;
136074: RtreeCell cell; /* New cell to insert if nData>1 */
136075: int bHaveRowid = 0; /* Set to 1 after new rowid is determined */
136076:
136077: rtreeReference(pRtree);
136078: assert(nData>=1);
136079:
136080: /* Constraint handling. A write operation on an r-tree table may return
136081: ** SQLITE_CONSTRAINT for two reasons:
136082: **
136083: ** 1. A duplicate rowid value, or
136084: ** 2. The supplied data violates the "x2>=x1" constraint.
136085: **
136086: ** In the first case, if the conflict-handling mode is REPLACE, then
136087: ** the conflicting row can be removed before proceeding. In the second
136088: ** case, SQLITE_CONSTRAINT must be returned regardless of the
136089: ** conflict-handling mode specified by the user.
136090: */
136091: if( nData>1 ){
136092: int ii;
136093:
136094: /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */
136095: assert( nData==(pRtree->nDim*2 + 3) );
1.2.2.1 ! misho 136096: #ifndef SQLITE_RTREE_INT_ONLY
1.2 misho 136097: if( pRtree->eCoordType==RTREE_COORD_REAL32 ){
136098: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
1.2.2.1 ! misho 136099: cell.aCoord[ii].f = rtreeValueDown(azData[ii+3]);
! 136100: cell.aCoord[ii+1].f = rtreeValueUp(azData[ii+4]);
1.2 misho 136101: if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){
136102: rc = SQLITE_CONSTRAINT;
136103: goto constraint;
136104: }
136105: }
1.2.2.1 ! misho 136106: }else
! 136107: #endif
! 136108: {
1.2 misho 136109: for(ii=0; ii<(pRtree->nDim*2); ii+=2){
136110: cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]);
136111: cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]);
136112: if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){
136113: rc = SQLITE_CONSTRAINT;
136114: goto constraint;
136115: }
136116: }
136117: }
136118:
136119: /* If a rowid value was supplied, check if it is already present in
136120: ** the table. If so, the constraint has failed. */
136121: if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){
136122: cell.iRowid = sqlite3_value_int64(azData[2]);
136123: if( sqlite3_value_type(azData[0])==SQLITE_NULL
136124: || sqlite3_value_int64(azData[0])!=cell.iRowid
136125: ){
136126: int steprc;
136127: sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid);
136128: steprc = sqlite3_step(pRtree->pReadRowid);
136129: rc = sqlite3_reset(pRtree->pReadRowid);
136130: if( SQLITE_ROW==steprc ){
136131: if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){
136132: rc = rtreeDeleteRowid(pRtree, cell.iRowid);
136133: }else{
136134: rc = SQLITE_CONSTRAINT;
136135: goto constraint;
136136: }
136137: }
136138: }
136139: bHaveRowid = 1;
136140: }
136141: }
136142:
136143: /* If azData[0] is not an SQL NULL value, it is the rowid of a
136144: ** record to delete from the r-tree table. The following block does
136145: ** just that.
136146: */
136147: if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){
136148: rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0]));
136149: }
136150:
136151: /* If the azData[] array contains more than one element, elements
136152: ** (azData[2]..azData[argc-1]) contain a new record to insert into
136153: ** the r-tree structure.
136154: */
136155: if( rc==SQLITE_OK && nData>1 ){
136156: /* Insert the new record into the r-tree */
1.2.2.1 ! misho 136157: RtreeNode *pLeaf = 0;
1.2 misho 136158:
136159: /* Figure out the rowid of the new row. */
136160: if( bHaveRowid==0 ){
136161: rc = newRowid(pRtree, &cell.iRowid);
136162: }
136163: *pRowid = cell.iRowid;
136164:
136165: if( rc==SQLITE_OK ){
136166: rc = ChooseLeaf(pRtree, &cell, 0, &pLeaf);
136167: }
136168: if( rc==SQLITE_OK ){
136169: int rc2;
136170: pRtree->iReinsertHeight = -1;
136171: rc = rtreeInsertCell(pRtree, pLeaf, &cell, 0);
136172: rc2 = nodeRelease(pRtree, pLeaf);
136173: if( rc==SQLITE_OK ){
136174: rc = rc2;
136175: }
136176: }
136177: }
136178:
136179: constraint:
136180: rtreeRelease(pRtree);
136181: return rc;
136182: }
136183:
136184: /*
136185: ** The xRename method for rtree module virtual tables.
136186: */
136187: static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){
136188: Rtree *pRtree = (Rtree *)pVtab;
136189: int rc = SQLITE_NOMEM;
136190: char *zSql = sqlite3_mprintf(
136191: "ALTER TABLE %Q.'%q_node' RENAME TO \"%w_node\";"
136192: "ALTER TABLE %Q.'%q_parent' RENAME TO \"%w_parent\";"
136193: "ALTER TABLE %Q.'%q_rowid' RENAME TO \"%w_rowid\";"
136194: , pRtree->zDb, pRtree->zName, zNewName
136195: , pRtree->zDb, pRtree->zName, zNewName
136196: , pRtree->zDb, pRtree->zName, zNewName
136197: );
136198: if( zSql ){
136199: rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
136200: sqlite3_free(zSql);
136201: }
136202: return rc;
136203: }
136204:
136205: static sqlite3_module rtreeModule = {
136206: 0, /* iVersion */
136207: rtreeCreate, /* xCreate - create a table */
136208: rtreeConnect, /* xConnect - connect to an existing table */
136209: rtreeBestIndex, /* xBestIndex - Determine search strategy */
136210: rtreeDisconnect, /* xDisconnect - Disconnect from a table */
136211: rtreeDestroy, /* xDestroy - Drop a table */
136212: rtreeOpen, /* xOpen - open a cursor */
136213: rtreeClose, /* xClose - close a cursor */
136214: rtreeFilter, /* xFilter - configure scan constraints */
136215: rtreeNext, /* xNext - advance a cursor */
136216: rtreeEof, /* xEof */
136217: rtreeColumn, /* xColumn - read data */
136218: rtreeRowid, /* xRowid - read data */
136219: rtreeUpdate, /* xUpdate - write data */
136220: 0, /* xBegin - begin transaction */
136221: 0, /* xSync - sync transaction */
136222: 0, /* xCommit - commit transaction */
136223: 0, /* xRollback - rollback transaction */
136224: 0, /* xFindFunction - function overloading */
136225: rtreeRename, /* xRename - rename the table */
136226: 0, /* xSavepoint */
136227: 0, /* xRelease */
136228: 0 /* xRollbackTo */
136229: };
136230:
136231: static int rtreeSqlInit(
136232: Rtree *pRtree,
136233: sqlite3 *db,
136234: const char *zDb,
136235: const char *zPrefix,
136236: int isCreate
136237: ){
136238: int rc = SQLITE_OK;
136239:
136240: #define N_STATEMENT 9
136241: static const char *azSql[N_STATEMENT] = {
136242: /* Read and write the xxx_node table */
136243: "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1",
136244: "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)",
136245: "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1",
136246:
136247: /* Read and write the xxx_rowid table */
136248: "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1",
136249: "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)",
136250: "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1",
136251:
136252: /* Read and write the xxx_parent table */
136253: "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1",
136254: "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)",
136255: "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1"
136256: };
136257: sqlite3_stmt **appStmt[N_STATEMENT];
136258: int i;
136259:
136260: pRtree->db = db;
136261:
136262: if( isCreate ){
136263: char *zCreate = sqlite3_mprintf(
136264: "CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);"
136265: "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);"
136266: "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY, parentnode INTEGER);"
136267: "INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))",
136268: zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize
136269: );
136270: if( !zCreate ){
136271: return SQLITE_NOMEM;
136272: }
136273: rc = sqlite3_exec(db, zCreate, 0, 0, 0);
136274: sqlite3_free(zCreate);
136275: if( rc!=SQLITE_OK ){
136276: return rc;
136277: }
136278: }
136279:
136280: appStmt[0] = &pRtree->pReadNode;
136281: appStmt[1] = &pRtree->pWriteNode;
136282: appStmt[2] = &pRtree->pDeleteNode;
136283: appStmt[3] = &pRtree->pReadRowid;
136284: appStmt[4] = &pRtree->pWriteRowid;
136285: appStmt[5] = &pRtree->pDeleteRowid;
136286: appStmt[6] = &pRtree->pReadParent;
136287: appStmt[7] = &pRtree->pWriteParent;
136288: appStmt[8] = &pRtree->pDeleteParent;
136289:
136290: for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
136291: char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
136292: if( zSql ){
136293: rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0);
136294: }else{
136295: rc = SQLITE_NOMEM;
136296: }
136297: sqlite3_free(zSql);
136298: }
136299:
136300: return rc;
136301: }
136302:
136303: /*
136304: ** The second argument to this function contains the text of an SQL statement
136305: ** that returns a single integer value. The statement is compiled and executed
136306: ** using database connection db. If successful, the integer value returned
136307: ** is written to *piVal and SQLITE_OK returned. Otherwise, an SQLite error
136308: ** code is returned and the value of *piVal after returning is not defined.
136309: */
136310: static int getIntFromStmt(sqlite3 *db, const char *zSql, int *piVal){
136311: int rc = SQLITE_NOMEM;
136312: if( zSql ){
136313: sqlite3_stmt *pStmt = 0;
136314: rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);
136315: if( rc==SQLITE_OK ){
136316: if( SQLITE_ROW==sqlite3_step(pStmt) ){
136317: *piVal = sqlite3_column_int(pStmt, 0);
136318: }
136319: rc = sqlite3_finalize(pStmt);
136320: }
136321: }
136322: return rc;
136323: }
136324:
136325: /*
136326: ** This function is called from within the xConnect() or xCreate() method to
136327: ** determine the node-size used by the rtree table being created or connected
136328: ** to. If successful, pRtree->iNodeSize is populated and SQLITE_OK returned.
136329: ** Otherwise, an SQLite error code is returned.
136330: **
136331: ** If this function is being called as part of an xConnect(), then the rtree
136332: ** table already exists. In this case the node-size is determined by inspecting
136333: ** the root node of the tree.
136334: **
136335: ** Otherwise, for an xCreate(), use 64 bytes less than the database page-size.
136336: ** This ensures that each node is stored on a single database page. If the
136337: ** database page-size is so large that more than RTREE_MAXCELLS entries
136338: ** would fit in a single node, use a smaller node-size.
136339: */
136340: static int getNodeSize(
136341: sqlite3 *db, /* Database handle */
136342: Rtree *pRtree, /* Rtree handle */
136343: int isCreate /* True for xCreate, false for xConnect */
136344: ){
136345: int rc;
136346: char *zSql;
136347: if( isCreate ){
136348: int iPageSize = 0;
136349: zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb);
136350: rc = getIntFromStmt(db, zSql, &iPageSize);
136351: if( rc==SQLITE_OK ){
136352: pRtree->iNodeSize = iPageSize-64;
136353: if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
136354: pRtree->iNodeSize = 4+pRtree->nBytesPerCell*RTREE_MAXCELLS;
136355: }
136356: }
136357: }else{
136358: zSql = sqlite3_mprintf(
136359: "SELECT length(data) FROM '%q'.'%q_node' WHERE nodeno = 1",
136360: pRtree->zDb, pRtree->zName
136361: );
136362: rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize);
136363: }
136364:
136365: sqlite3_free(zSql);
136366: return rc;
136367: }
136368:
136369: /*
136370: ** This function is the implementation of both the xConnect and xCreate
136371: ** methods of the r-tree virtual table.
136372: **
136373: ** argv[0] -> module name
136374: ** argv[1] -> database name
136375: ** argv[2] -> table name
136376: ** argv[...] -> column names...
136377: */
136378: static int rtreeInit(
136379: sqlite3 *db, /* Database connection */
136380: void *pAux, /* One of the RTREE_COORD_* constants */
136381: int argc, const char *const*argv, /* Parameters to CREATE TABLE statement */
136382: sqlite3_vtab **ppVtab, /* OUT: New virtual table */
136383: char **pzErr, /* OUT: Error message, if any */
136384: int isCreate /* True for xCreate, false for xConnect */
136385: ){
136386: int rc = SQLITE_OK;
136387: Rtree *pRtree;
136388: int nDb; /* Length of string argv[1] */
136389: int nName; /* Length of string argv[2] */
136390: int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32);
136391:
136392: const char *aErrMsg[] = {
136393: 0, /* 0 */
136394: "Wrong number of columns for an rtree table", /* 1 */
136395: "Too few columns for an rtree table", /* 2 */
136396: "Too many columns for an rtree table" /* 3 */
136397: };
136398:
136399: int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2;
136400: if( aErrMsg[iErr] ){
136401: *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]);
136402: return SQLITE_ERROR;
136403: }
136404:
136405: sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
136406:
136407: /* Allocate the sqlite3_vtab structure */
1.2.2.1 ! misho 136408: nDb = (int)strlen(argv[1]);
! 136409: nName = (int)strlen(argv[2]);
1.2 misho 136410: pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2);
136411: if( !pRtree ){
136412: return SQLITE_NOMEM;
136413: }
136414: memset(pRtree, 0, sizeof(Rtree)+nDb+nName+2);
136415: pRtree->nBusy = 1;
136416: pRtree->base.pModule = &rtreeModule;
136417: pRtree->zDb = (char *)&pRtree[1];
136418: pRtree->zName = &pRtree->zDb[nDb+1];
136419: pRtree->nDim = (argc-4)/2;
136420: pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2;
136421: pRtree->eCoordType = eCoordType;
136422: memcpy(pRtree->zDb, argv[1], nDb);
136423: memcpy(pRtree->zName, argv[2], nName);
136424:
136425: /* Figure out the node size to use. */
136426: rc = getNodeSize(db, pRtree, isCreate);
136427:
136428: /* Create/Connect to the underlying relational database schema. If
136429: ** that is successful, call sqlite3_declare_vtab() to configure
136430: ** the r-tree table schema.
136431: */
136432: if( rc==SQLITE_OK ){
136433: if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){
136434: *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
136435: }else{
136436: char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]);
136437: char *zTmp;
136438: int ii;
136439: for(ii=4; zSql && ii<argc; ii++){
136440: zTmp = zSql;
136441: zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]);
136442: sqlite3_free(zTmp);
136443: }
136444: if( zSql ){
136445: zTmp = zSql;
136446: zSql = sqlite3_mprintf("%s);", zTmp);
136447: sqlite3_free(zTmp);
136448: }
136449: if( !zSql ){
136450: rc = SQLITE_NOMEM;
136451: }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){
136452: *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db));
136453: }
136454: sqlite3_free(zSql);
136455: }
136456: }
136457:
136458: if( rc==SQLITE_OK ){
136459: *ppVtab = (sqlite3_vtab *)pRtree;
136460: }else{
136461: rtreeRelease(pRtree);
136462: }
136463: return rc;
136464: }
136465:
136466:
136467: /*
136468: ** Implementation of a scalar function that decodes r-tree nodes to
136469: ** human readable strings. This can be used for debugging and analysis.
136470: **
136471: ** The scalar function takes two arguments, a blob of data containing
136472: ** an r-tree node, and the number of dimensions the r-tree indexes.
136473: ** For a two-dimensional r-tree structure called "rt", to deserialize
136474: ** all nodes, a statement like:
136475: **
136476: ** SELECT rtreenode(2, data) FROM rt_node;
136477: **
136478: ** The human readable string takes the form of a Tcl list with one
136479: ** entry for each cell in the r-tree node. Each entry is itself a
136480: ** list, containing the 8-byte rowid/pageno followed by the
136481: ** <num-dimension>*2 coordinates.
136482: */
136483: static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
136484: char *zText = 0;
136485: RtreeNode node;
136486: Rtree tree;
136487: int ii;
136488:
136489: UNUSED_PARAMETER(nArg);
136490: memset(&node, 0, sizeof(RtreeNode));
136491: memset(&tree, 0, sizeof(Rtree));
136492: tree.nDim = sqlite3_value_int(apArg[0]);
136493: tree.nBytesPerCell = 8 + 8 * tree.nDim;
136494: node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
136495:
136496: for(ii=0; ii<NCELL(&node); ii++){
136497: char zCell[512];
136498: int nCell = 0;
136499: RtreeCell cell;
136500: int jj;
136501:
136502: nodeGetCell(&tree, &node, ii, &cell);
136503: sqlite3_snprintf(512-nCell,&zCell[nCell],"%lld", cell.iRowid);
1.2.2.1 ! misho 136504: nCell = (int)strlen(zCell);
1.2 misho 136505: for(jj=0; jj<tree.nDim*2; jj++){
1.2.2.1 ! misho 136506: #ifndef SQLITE_RTREE_INT_ONLY
! 136507: sqlite3_snprintf(512-nCell,&zCell[nCell], " %f",
! 136508: (double)cell.aCoord[jj].f);
! 136509: #else
! 136510: sqlite3_snprintf(512-nCell,&zCell[nCell], " %d",
! 136511: cell.aCoord[jj].i);
! 136512: #endif
! 136513: nCell = (int)strlen(zCell);
1.2 misho 136514: }
136515:
136516: if( zText ){
136517: char *zTextNew = sqlite3_mprintf("%s {%s}", zText, zCell);
136518: sqlite3_free(zText);
136519: zText = zTextNew;
136520: }else{
136521: zText = sqlite3_mprintf("{%s}", zCell);
136522: }
136523: }
136524:
136525: sqlite3_result_text(ctx, zText, -1, sqlite3_free);
136526: }
136527:
136528: static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){
136529: UNUSED_PARAMETER(nArg);
136530: if( sqlite3_value_type(apArg[0])!=SQLITE_BLOB
136531: || sqlite3_value_bytes(apArg[0])<2
136532: ){
136533: sqlite3_result_error(ctx, "Invalid argument to rtreedepth()", -1);
136534: }else{
136535: u8 *zBlob = (u8 *)sqlite3_value_blob(apArg[0]);
136536: sqlite3_result_int(ctx, readInt16(zBlob));
136537: }
136538: }
136539:
136540: /*
136541: ** Register the r-tree module with database handle db. This creates the
136542: ** virtual table module "rtree" and the debugging/analysis scalar
136543: ** function "rtreenode".
136544: */
136545: SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){
136546: const int utf8 = SQLITE_UTF8;
136547: int rc;
136548:
136549: rc = sqlite3_create_function(db, "rtreenode", 2, utf8, 0, rtreenode, 0, 0);
136550: if( rc==SQLITE_OK ){
136551: rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0);
136552: }
136553: if( rc==SQLITE_OK ){
1.2.2.1 ! misho 136554: #ifdef SQLITE_RTREE_INT_ONLY
! 136555: void *c = (void *)RTREE_COORD_INT32;
! 136556: #else
1.2 misho 136557: void *c = (void *)RTREE_COORD_REAL32;
1.2.2.1 ! misho 136558: #endif
1.2 misho 136559: rc = sqlite3_create_module_v2(db, "rtree", &rtreeModule, c, 0);
136560: }
136561: if( rc==SQLITE_OK ){
136562: void *c = (void *)RTREE_COORD_INT32;
136563: rc = sqlite3_create_module_v2(db, "rtree_i32", &rtreeModule, c, 0);
136564: }
136565:
136566: return rc;
136567: }
136568:
136569: /*
136570: ** A version of sqlite3_free() that can be used as a callback. This is used
136571: ** in two places - as the destructor for the blob value returned by the
136572: ** invocation of a geometry function, and as the destructor for the geometry
136573: ** functions themselves.
136574: */
136575: static void doSqlite3Free(void *p){
136576: sqlite3_free(p);
136577: }
136578:
136579: /*
136580: ** Each call to sqlite3_rtree_geometry_callback() creates an ordinary SQLite
136581: ** scalar user function. This C function is the callback used for all such
136582: ** registered SQL functions.
136583: **
136584: ** The scalar user functions return a blob that is interpreted by r-tree
136585: ** table MATCH operators.
136586: */
136587: static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){
136588: RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx);
136589: RtreeMatchArg *pBlob;
136590: int nBlob;
136591:
1.2.2.1 ! misho 136592: nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue);
1.2 misho 136593: pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob);
136594: if( !pBlob ){
136595: sqlite3_result_error_nomem(ctx);
136596: }else{
136597: int i;
136598: pBlob->magic = RTREE_GEOMETRY_MAGIC;
136599: pBlob->xGeom = pGeomCtx->xGeom;
136600: pBlob->pContext = pGeomCtx->pContext;
136601: pBlob->nParam = nArg;
136602: for(i=0; i<nArg; i++){
1.2.2.1 ! misho 136603: #ifdef SQLITE_RTREE_INT_ONLY
! 136604: pBlob->aParam[i] = sqlite3_value_int64(aArg[i]);
! 136605: #else
1.2 misho 136606: pBlob->aParam[i] = sqlite3_value_double(aArg[i]);
1.2.2.1 ! misho 136607: #endif
1.2 misho 136608: }
136609: sqlite3_result_blob(ctx, pBlob, nBlob, doSqlite3Free);
136610: }
136611: }
136612:
136613: /*
136614: ** Register a new geometry function for use with the r-tree MATCH operator.
136615: */
136616: SQLITE_API int sqlite3_rtree_geometry_callback(
136617: sqlite3 *db,
136618: const char *zGeom,
1.2.2.1 ! misho 136619: int (*xGeom)(sqlite3_rtree_geometry *, int, RtreeDValue *, int *),
1.2 misho 136620: void *pContext
136621: ){
136622: RtreeGeomCallback *pGeomCtx; /* Context object for new user-function */
136623:
136624: /* Allocate and populate the context object. */
136625: pGeomCtx = (RtreeGeomCallback *)sqlite3_malloc(sizeof(RtreeGeomCallback));
136626: if( !pGeomCtx ) return SQLITE_NOMEM;
136627: pGeomCtx->xGeom = xGeom;
136628: pGeomCtx->pContext = pContext;
136629:
136630: /* Create the new user-function. Register a destructor function to delete
136631: ** the context object when it is no longer required. */
136632: return sqlite3_create_function_v2(db, zGeom, -1, SQLITE_ANY,
136633: (void *)pGeomCtx, geomCallback, 0, 0, doSqlite3Free
136634: );
136635: }
136636:
136637: #if !SQLITE_CORE
136638: SQLITE_API int sqlite3_extension_init(
136639: sqlite3 *db,
136640: char **pzErrMsg,
136641: const sqlite3_api_routines *pApi
136642: ){
136643: SQLITE_EXTENSION_INIT2(pApi)
136644: return sqlite3RtreeInit(db);
136645: }
136646: #endif
136647:
136648: #endif
136649:
136650: /************** End of rtree.c ***********************************************/
136651: /************** Begin file icu.c *********************************************/
136652: /*
136653: ** 2007 May 6
136654: **
136655: ** The author disclaims copyright to this source code. In place of
136656: ** a legal notice, here is a blessing:
136657: **
136658: ** May you do good and not evil.
136659: ** May you find forgiveness for yourself and forgive others.
136660: ** May you share freely, never taking more than you give.
136661: **
136662: *************************************************************************
1.2.2.1 ! misho 136663: ** $Id: icu.c,v 1.7 2007/12/13 21:54:11 drh Exp $
1.2 misho 136664: **
136665: ** This file implements an integration between the ICU library
136666: ** ("International Components for Unicode", an open-source library
136667: ** for handling unicode data) and SQLite. The integration uses
136668: ** ICU to provide the following to SQLite:
136669: **
136670: ** * An implementation of the SQL regexp() function (and hence REGEXP
136671: ** operator) using the ICU uregex_XX() APIs.
136672: **
136673: ** * Implementations of the SQL scalar upper() and lower() functions
136674: ** for case mapping.
136675: **
136676: ** * Integration of ICU and SQLite collation seqences.
136677: **
136678: ** * An implementation of the LIKE operator that uses ICU to
136679: ** provide case-independent matching.
136680: */
136681:
136682: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU)
136683:
136684: /* Include ICU headers */
136685: #include <unicode/utypes.h>
136686: #include <unicode/uregex.h>
136687: #include <unicode/ustring.h>
136688: #include <unicode/ucol.h>
136689:
136690: /* #include <assert.h> */
136691:
136692: #ifndef SQLITE_CORE
136693: SQLITE_EXTENSION_INIT1
136694: #else
136695: #endif
136696:
136697: /*
136698: ** Maximum length (in bytes) of the pattern in a LIKE or GLOB
136699: ** operator.
136700: */
136701: #ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH
136702: # define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000
136703: #endif
136704:
136705: /*
136706: ** Version of sqlite3_free() that is always a function, never a macro.
136707: */
136708: static void xFree(void *p){
136709: sqlite3_free(p);
136710: }
136711:
136712: /*
136713: ** Compare two UTF-8 strings for equality where the first string is
136714: ** a "LIKE" expression. Return true (1) if they are the same and
136715: ** false (0) if they are different.
136716: */
136717: static int icuLikeCompare(
136718: const uint8_t *zPattern, /* LIKE pattern */
136719: const uint8_t *zString, /* The UTF-8 string to compare against */
136720: const UChar32 uEsc /* The escape character */
136721: ){
136722: static const int MATCH_ONE = (UChar32)'_';
136723: static const int MATCH_ALL = (UChar32)'%';
136724:
136725: int iPattern = 0; /* Current byte index in zPattern */
136726: int iString = 0; /* Current byte index in zString */
136727:
136728: int prevEscape = 0; /* True if the previous character was uEsc */
136729:
136730: while( zPattern[iPattern]!=0 ){
136731:
136732: /* Read (and consume) the next character from the input pattern. */
136733: UChar32 uPattern;
136734: U8_NEXT_UNSAFE(zPattern, iPattern, uPattern);
136735: assert(uPattern!=0);
136736:
136737: /* There are now 4 possibilities:
136738: **
136739: ** 1. uPattern is an unescaped match-all character "%",
136740: ** 2. uPattern is an unescaped match-one character "_",
136741: ** 3. uPattern is an unescaped escape character, or
136742: ** 4. uPattern is to be handled as an ordinary character
136743: */
136744: if( !prevEscape && uPattern==MATCH_ALL ){
136745: /* Case 1. */
136746: uint8_t c;
136747:
136748: /* Skip any MATCH_ALL or MATCH_ONE characters that follow a
136749: ** MATCH_ALL. For each MATCH_ONE, skip one character in the
136750: ** test string.
136751: */
136752: while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){
136753: if( c==MATCH_ONE ){
136754: if( zString[iString]==0 ) return 0;
136755: U8_FWD_1_UNSAFE(zString, iString);
136756: }
136757: iPattern++;
136758: }
136759:
136760: if( zPattern[iPattern]==0 ) return 1;
136761:
136762: while( zString[iString] ){
136763: if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){
136764: return 1;
136765: }
136766: U8_FWD_1_UNSAFE(zString, iString);
136767: }
136768: return 0;
136769:
136770: }else if( !prevEscape && uPattern==MATCH_ONE ){
136771: /* Case 2. */
136772: if( zString[iString]==0 ) return 0;
136773: U8_FWD_1_UNSAFE(zString, iString);
136774:
136775: }else if( !prevEscape && uPattern==uEsc){
136776: /* Case 3. */
136777: prevEscape = 1;
136778:
136779: }else{
136780: /* Case 4. */
136781: UChar32 uString;
136782: U8_NEXT_UNSAFE(zString, iString, uString);
136783: uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT);
136784: uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT);
136785: if( uString!=uPattern ){
136786: return 0;
136787: }
136788: prevEscape = 0;
136789: }
136790: }
136791:
136792: return zString[iString]==0;
136793: }
136794:
136795: /*
136796: ** Implementation of the like() SQL function. This function implements
136797: ** the build-in LIKE operator. The first argument to the function is the
136798: ** pattern and the second argument is the string. So, the SQL statements:
136799: **
136800: ** A LIKE B
136801: **
136802: ** is implemented as like(B, A). If there is an escape character E,
136803: **
136804: ** A LIKE B ESCAPE E
136805: **
136806: ** is mapped to like(B, A, E).
136807: */
136808: static void icuLikeFunc(
136809: sqlite3_context *context,
136810: int argc,
136811: sqlite3_value **argv
136812: ){
136813: const unsigned char *zA = sqlite3_value_text(argv[0]);
136814: const unsigned char *zB = sqlite3_value_text(argv[1]);
136815: UChar32 uEsc = 0;
136816:
136817: /* Limit the length of the LIKE or GLOB pattern to avoid problems
136818: ** of deep recursion and N*N behavior in patternCompare().
136819: */
136820: if( sqlite3_value_bytes(argv[0])>SQLITE_MAX_LIKE_PATTERN_LENGTH ){
136821: sqlite3_result_error(context, "LIKE or GLOB pattern too complex", -1);
136822: return;
136823: }
136824:
136825:
136826: if( argc==3 ){
136827: /* The escape character string must consist of a single UTF-8 character.
136828: ** Otherwise, return an error.
136829: */
136830: int nE= sqlite3_value_bytes(argv[2]);
136831: const unsigned char *zE = sqlite3_value_text(argv[2]);
136832: int i = 0;
136833: if( zE==0 ) return;
136834: U8_NEXT(zE, i, nE, uEsc);
136835: if( i!=nE){
136836: sqlite3_result_error(context,
136837: "ESCAPE expression must be a single character", -1);
136838: return;
136839: }
136840: }
136841:
136842: if( zA && zB ){
136843: sqlite3_result_int(context, icuLikeCompare(zA, zB, uEsc));
136844: }
136845: }
136846:
136847: /*
136848: ** This function is called when an ICU function called from within
136849: ** the implementation of an SQL scalar function returns an error.
136850: **
136851: ** The scalar function context passed as the first argument is
136852: ** loaded with an error message based on the following two args.
136853: */
136854: static void icuFunctionError(
136855: sqlite3_context *pCtx, /* SQLite scalar function context */
136856: const char *zName, /* Name of ICU function that failed */
136857: UErrorCode e /* Error code returned by ICU function */
136858: ){
136859: char zBuf[128];
136860: sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e));
136861: zBuf[127] = '\0';
136862: sqlite3_result_error(pCtx, zBuf, -1);
136863: }
136864:
136865: /*
136866: ** Function to delete compiled regexp objects. Registered as
136867: ** a destructor function with sqlite3_set_auxdata().
136868: */
136869: static void icuRegexpDelete(void *p){
136870: URegularExpression *pExpr = (URegularExpression *)p;
136871: uregex_close(pExpr);
136872: }
136873:
136874: /*
136875: ** Implementation of SQLite REGEXP operator. This scalar function takes
136876: ** two arguments. The first is a regular expression pattern to compile
136877: ** the second is a string to match against that pattern. If either
136878: ** argument is an SQL NULL, then NULL Is returned. Otherwise, the result
136879: ** is 1 if the string matches the pattern, or 0 otherwise.
136880: **
136881: ** SQLite maps the regexp() function to the regexp() operator such
136882: ** that the following two are equivalent:
136883: **
136884: ** zString REGEXP zPattern
136885: ** regexp(zPattern, zString)
136886: **
136887: ** Uses the following ICU regexp APIs:
136888: **
136889: ** uregex_open()
136890: ** uregex_matches()
136891: ** uregex_close()
136892: */
136893: static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){
136894: UErrorCode status = U_ZERO_ERROR;
136895: URegularExpression *pExpr;
136896: UBool res;
136897: const UChar *zString = sqlite3_value_text16(apArg[1]);
136898:
136899: (void)nArg; /* Unused parameter */
136900:
136901: /* If the left hand side of the regexp operator is NULL,
136902: ** then the result is also NULL.
136903: */
136904: if( !zString ){
136905: return;
136906: }
136907:
136908: pExpr = sqlite3_get_auxdata(p, 0);
136909: if( !pExpr ){
136910: const UChar *zPattern = sqlite3_value_text16(apArg[0]);
136911: if( !zPattern ){
136912: return;
136913: }
136914: pExpr = uregex_open(zPattern, -1, 0, 0, &status);
136915:
136916: if( U_SUCCESS(status) ){
136917: sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete);
136918: }else{
136919: assert(!pExpr);
136920: icuFunctionError(p, "uregex_open", status);
136921: return;
136922: }
136923: }
136924:
136925: /* Configure the text that the regular expression operates on. */
136926: uregex_setText(pExpr, zString, -1, &status);
136927: if( !U_SUCCESS(status) ){
136928: icuFunctionError(p, "uregex_setText", status);
136929: return;
136930: }
136931:
136932: /* Attempt the match */
136933: res = uregex_matches(pExpr, 0, &status);
136934: if( !U_SUCCESS(status) ){
136935: icuFunctionError(p, "uregex_matches", status);
136936: return;
136937: }
136938:
136939: /* Set the text that the regular expression operates on to a NULL
136940: ** pointer. This is not really necessary, but it is tidier than
136941: ** leaving the regular expression object configured with an invalid
136942: ** pointer after this function returns.
136943: */
136944: uregex_setText(pExpr, 0, 0, &status);
136945:
136946: /* Return 1 or 0. */
136947: sqlite3_result_int(p, res ? 1 : 0);
136948: }
136949:
136950: /*
136951: ** Implementations of scalar functions for case mapping - upper() and
136952: ** lower(). Function upper() converts its input to upper-case (ABC).
136953: ** Function lower() converts to lower-case (abc).
136954: **
136955: ** ICU provides two types of case mapping, "general" case mapping and
136956: ** "language specific". Refer to ICU documentation for the differences
136957: ** between the two.
136958: **
136959: ** To utilise "general" case mapping, the upper() or lower() scalar
136960: ** functions are invoked with one argument:
136961: **
136962: ** upper('ABC') -> 'abc'
136963: ** lower('abc') -> 'ABC'
136964: **
136965: ** To access ICU "language specific" case mapping, upper() or lower()
136966: ** should be invoked with two arguments. The second argument is the name
136967: ** of the locale to use. Passing an empty string ("") or SQL NULL value
136968: ** as the second argument is the same as invoking the 1 argument version
136969: ** of upper() or lower().
136970: **
136971: ** lower('I', 'en_us') -> 'i'
136972: ** lower('I', 'tr_tr') -> 'ı' (small dotless i)
136973: **
136974: ** http://www.icu-project.org/userguide/posix.html#case_mappings
136975: */
136976: static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){
136977: const UChar *zInput;
136978: UChar *zOutput;
136979: int nInput;
136980: int nOutput;
136981:
136982: UErrorCode status = U_ZERO_ERROR;
136983: const char *zLocale = 0;
136984:
136985: assert(nArg==1 || nArg==2);
136986: if( nArg==2 ){
136987: zLocale = (const char *)sqlite3_value_text(apArg[1]);
136988: }
136989:
136990: zInput = sqlite3_value_text16(apArg[0]);
136991: if( !zInput ){
136992: return;
136993: }
136994: nInput = sqlite3_value_bytes16(apArg[0]);
136995:
136996: nOutput = nInput * 2 + 2;
136997: zOutput = sqlite3_malloc(nOutput);
136998: if( !zOutput ){
136999: return;
137000: }
137001:
137002: if( sqlite3_user_data(p) ){
137003: u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status);
137004: }else{
137005: u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status);
137006: }
137007:
137008: if( !U_SUCCESS(status) ){
137009: icuFunctionError(p, "u_strToLower()/u_strToUpper", status);
137010: return;
137011: }
137012:
137013: sqlite3_result_text16(p, zOutput, -1, xFree);
137014: }
137015:
137016: /*
137017: ** Collation sequence destructor function. The pCtx argument points to
137018: ** a UCollator structure previously allocated using ucol_open().
137019: */
137020: static void icuCollationDel(void *pCtx){
137021: UCollator *p = (UCollator *)pCtx;
137022: ucol_close(p);
137023: }
137024:
137025: /*
137026: ** Collation sequence comparison function. The pCtx argument points to
137027: ** a UCollator structure previously allocated using ucol_open().
137028: */
137029: static int icuCollationColl(
137030: void *pCtx,
137031: int nLeft,
137032: const void *zLeft,
137033: int nRight,
137034: const void *zRight
137035: ){
137036: UCollationResult res;
137037: UCollator *p = (UCollator *)pCtx;
137038: res = ucol_strcoll(p, (UChar *)zLeft, nLeft/2, (UChar *)zRight, nRight/2);
137039: switch( res ){
137040: case UCOL_LESS: return -1;
137041: case UCOL_GREATER: return +1;
137042: case UCOL_EQUAL: return 0;
137043: }
137044: assert(!"Unexpected return value from ucol_strcoll()");
137045: return 0;
137046: }
137047:
137048: /*
137049: ** Implementation of the scalar function icu_load_collation().
137050: **
137051: ** This scalar function is used to add ICU collation based collation
137052: ** types to an SQLite database connection. It is intended to be called
137053: ** as follows:
137054: **
137055: ** SELECT icu_load_collation(<locale>, <collation-name>);
137056: **
137057: ** Where <locale> is a string containing an ICU locale identifier (i.e.
137058: ** "en_AU", "tr_TR" etc.) and <collation-name> is the name of the
137059: ** collation sequence to create.
137060: */
137061: static void icuLoadCollation(
137062: sqlite3_context *p,
137063: int nArg,
137064: sqlite3_value **apArg
137065: ){
137066: sqlite3 *db = (sqlite3 *)sqlite3_user_data(p);
137067: UErrorCode status = U_ZERO_ERROR;
137068: const char *zLocale; /* Locale identifier - (eg. "jp_JP") */
137069: const char *zName; /* SQL Collation sequence name (eg. "japanese") */
137070: UCollator *pUCollator; /* ICU library collation object */
137071: int rc; /* Return code from sqlite3_create_collation_x() */
137072:
137073: assert(nArg==2);
137074: zLocale = (const char *)sqlite3_value_text(apArg[0]);
137075: zName = (const char *)sqlite3_value_text(apArg[1]);
137076:
137077: if( !zLocale || !zName ){
137078: return;
137079: }
137080:
137081: pUCollator = ucol_open(zLocale, &status);
137082: if( !U_SUCCESS(status) ){
137083: icuFunctionError(p, "ucol_open", status);
137084: return;
137085: }
137086: assert(p);
137087:
137088: rc = sqlite3_create_collation_v2(db, zName, SQLITE_UTF16, (void *)pUCollator,
137089: icuCollationColl, icuCollationDel
137090: );
137091: if( rc!=SQLITE_OK ){
137092: ucol_close(pUCollator);
137093: sqlite3_result_error(p, "Error registering collation function", -1);
137094: }
137095: }
137096:
137097: /*
137098: ** Register the ICU extension functions with database db.
137099: */
137100: SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){
137101: struct IcuScalar {
137102: const char *zName; /* Function name */
137103: int nArg; /* Number of arguments */
137104: int enc; /* Optimal text encoding */
137105: void *pContext; /* sqlite3_user_data() context */
137106: void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
137107: } scalars[] = {
137108: {"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc},
137109:
137110: {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16},
137111: {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16},
137112: {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16},
137113: {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16},
137114:
137115: {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16},
137116: {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16},
137117: {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16},
137118: {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16},
137119:
137120: {"like", 2, SQLITE_UTF8, 0, icuLikeFunc},
137121: {"like", 3, SQLITE_UTF8, 0, icuLikeFunc},
137122:
137123: {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation},
137124: };
137125:
137126: int rc = SQLITE_OK;
137127: int i;
137128:
137129: for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){
137130: struct IcuScalar *p = &scalars[i];
137131: rc = sqlite3_create_function(
137132: db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0
137133: );
137134: }
137135:
137136: return rc;
137137: }
137138:
137139: #if !SQLITE_CORE
137140: SQLITE_API int sqlite3_extension_init(
137141: sqlite3 *db,
137142: char **pzErrMsg,
137143: const sqlite3_api_routines *pApi
137144: ){
137145: SQLITE_EXTENSION_INIT2(pApi)
137146: return sqlite3IcuInit(db);
137147: }
137148: #endif
137149:
137150: #endif
137151:
137152: /************** End of icu.c *************************************************/
137153: /************** Begin file fts3_icu.c ****************************************/
137154: /*
137155: ** 2007 June 22
137156: **
137157: ** The author disclaims copyright to this source code. In place of
137158: ** a legal notice, here is a blessing:
137159: **
137160: ** May you do good and not evil.
137161: ** May you find forgiveness for yourself and forgive others.
137162: ** May you share freely, never taking more than you give.
137163: **
137164: *************************************************************************
137165: ** This file implements a tokenizer for fts3 based on the ICU library.
137166: */
137167: #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
137168: #ifdef SQLITE_ENABLE_ICU
137169:
137170: /* #include <assert.h> */
137171: /* #include <string.h> */
137172:
137173: #include <unicode/ubrk.h>
137174: /* #include <unicode/ucol.h> */
137175: /* #include <unicode/ustring.h> */
137176: #include <unicode/utf16.h>
137177:
137178: typedef struct IcuTokenizer IcuTokenizer;
137179: typedef struct IcuCursor IcuCursor;
137180:
137181: struct IcuTokenizer {
137182: sqlite3_tokenizer base;
137183: char *zLocale;
137184: };
137185:
137186: struct IcuCursor {
137187: sqlite3_tokenizer_cursor base;
137188:
137189: UBreakIterator *pIter; /* ICU break-iterator object */
137190: int nChar; /* Number of UChar elements in pInput */
137191: UChar *aChar; /* Copy of input using utf-16 encoding */
137192: int *aOffset; /* Offsets of each character in utf-8 input */
137193:
137194: int nBuffer;
137195: char *zBuffer;
137196:
137197: int iToken;
137198: };
137199:
137200: /*
137201: ** Create a new tokenizer instance.
137202: */
137203: static int icuCreate(
137204: int argc, /* Number of entries in argv[] */
137205: const char * const *argv, /* Tokenizer creation arguments */
137206: sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */
137207: ){
137208: IcuTokenizer *p;
137209: int n = 0;
137210:
137211: if( argc>0 ){
137212: n = strlen(argv[0])+1;
137213: }
137214: p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n);
137215: if( !p ){
137216: return SQLITE_NOMEM;
137217: }
137218: memset(p, 0, sizeof(IcuTokenizer));
137219:
137220: if( n ){
137221: p->zLocale = (char *)&p[1];
137222: memcpy(p->zLocale, argv[0], n);
137223: }
137224:
137225: *ppTokenizer = (sqlite3_tokenizer *)p;
137226:
137227: return SQLITE_OK;
137228: }
137229:
137230: /*
137231: ** Destroy a tokenizer
137232: */
137233: static int icuDestroy(sqlite3_tokenizer *pTokenizer){
137234: IcuTokenizer *p = (IcuTokenizer *)pTokenizer;
137235: sqlite3_free(p);
137236: return SQLITE_OK;
137237: }
137238:
137239: /*
137240: ** Prepare to begin tokenizing a particular string. The input
137241: ** string to be tokenized is pInput[0..nBytes-1]. A cursor
137242: ** used to incrementally tokenize this string is returned in
137243: ** *ppCursor.
137244: */
137245: static int icuOpen(
137246: sqlite3_tokenizer *pTokenizer, /* The tokenizer */
137247: const char *zInput, /* Input string */
137248: int nInput, /* Length of zInput in bytes */
137249: sqlite3_tokenizer_cursor **ppCursor /* OUT: Tokenization cursor */
137250: ){
137251: IcuTokenizer *p = (IcuTokenizer *)pTokenizer;
137252: IcuCursor *pCsr;
137253:
137254: const int32_t opt = U_FOLD_CASE_DEFAULT;
137255: UErrorCode status = U_ZERO_ERROR;
137256: int nChar;
137257:
137258: UChar32 c;
137259: int iInput = 0;
137260: int iOut = 0;
137261:
137262: *ppCursor = 0;
137263:
1.2.2.1 ! misho 137264: if( zInput==0 ){
! 137265: nInput = 0;
! 137266: zInput = "";
! 137267: }else if( nInput<0 ){
1.2 misho 137268: nInput = strlen(zInput);
137269: }
137270: nChar = nInput+1;
137271: pCsr = (IcuCursor *)sqlite3_malloc(
137272: sizeof(IcuCursor) + /* IcuCursor */
1.2.2.1 ! misho 137273: ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */
1.2 misho 137274: (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */
137275: );
137276: if( !pCsr ){
137277: return SQLITE_NOMEM;
137278: }
137279: memset(pCsr, 0, sizeof(IcuCursor));
137280: pCsr->aChar = (UChar *)&pCsr[1];
1.2.2.1 ! misho 137281: pCsr->aOffset = (int *)&pCsr->aChar[(nChar+3)&~3];
1.2 misho 137282:
137283: pCsr->aOffset[iOut] = iInput;
137284: U8_NEXT(zInput, iInput, nInput, c);
137285: while( c>0 ){
137286: int isError = 0;
137287: c = u_foldCase(c, opt);
137288: U16_APPEND(pCsr->aChar, iOut, nChar, c, isError);
137289: if( isError ){
137290: sqlite3_free(pCsr);
137291: return SQLITE_ERROR;
137292: }
137293: pCsr->aOffset[iOut] = iInput;
137294:
137295: if( iInput<nInput ){
137296: U8_NEXT(zInput, iInput, nInput, c);
137297: }else{
137298: c = 0;
137299: }
137300: }
137301:
137302: pCsr->pIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status);
137303: if( !U_SUCCESS(status) ){
137304: sqlite3_free(pCsr);
137305: return SQLITE_ERROR;
137306: }
137307: pCsr->nChar = iOut;
137308:
137309: ubrk_first(pCsr->pIter);
137310: *ppCursor = (sqlite3_tokenizer_cursor *)pCsr;
137311: return SQLITE_OK;
137312: }
137313:
137314: /*
137315: ** Close a tokenization cursor previously opened by a call to icuOpen().
137316: */
137317: static int icuClose(sqlite3_tokenizer_cursor *pCursor){
137318: IcuCursor *pCsr = (IcuCursor *)pCursor;
137319: ubrk_close(pCsr->pIter);
137320: sqlite3_free(pCsr->zBuffer);
137321: sqlite3_free(pCsr);
137322: return SQLITE_OK;
137323: }
137324:
137325: /*
137326: ** Extract the next token from a tokenization cursor.
137327: */
137328: static int icuNext(
137329: sqlite3_tokenizer_cursor *pCursor, /* Cursor returned by simpleOpen */
137330: const char **ppToken, /* OUT: *ppToken is the token text */
137331: int *pnBytes, /* OUT: Number of bytes in token */
137332: int *piStartOffset, /* OUT: Starting offset of token */
137333: int *piEndOffset, /* OUT: Ending offset of token */
137334: int *piPosition /* OUT: Position integer of token */
137335: ){
137336: IcuCursor *pCsr = (IcuCursor *)pCursor;
137337:
137338: int iStart = 0;
137339: int iEnd = 0;
137340: int nByte = 0;
137341:
137342: while( iStart==iEnd ){
137343: UChar32 c;
137344:
137345: iStart = ubrk_current(pCsr->pIter);
137346: iEnd = ubrk_next(pCsr->pIter);
137347: if( iEnd==UBRK_DONE ){
137348: return SQLITE_DONE;
137349: }
137350:
137351: while( iStart<iEnd ){
137352: int iWhite = iStart;
1.2.2.1 ! misho 137353: U16_NEXT(pCsr->aChar, iWhite, pCsr->nChar, c);
1.2 misho 137354: if( u_isspace(c) ){
137355: iStart = iWhite;
137356: }else{
137357: break;
137358: }
137359: }
137360: assert(iStart<=iEnd);
137361: }
137362:
137363: do {
137364: UErrorCode status = U_ZERO_ERROR;
137365: if( nByte ){
137366: char *zNew = sqlite3_realloc(pCsr->zBuffer, nByte);
137367: if( !zNew ){
137368: return SQLITE_NOMEM;
137369: }
137370: pCsr->zBuffer = zNew;
137371: pCsr->nBuffer = nByte;
137372: }
137373:
137374: u_strToUTF8(
137375: pCsr->zBuffer, pCsr->nBuffer, &nByte, /* Output vars */
137376: &pCsr->aChar[iStart], iEnd-iStart, /* Input vars */
137377: &status /* Output success/failure */
137378: );
137379: } while( nByte>pCsr->nBuffer );
137380:
137381: *ppToken = pCsr->zBuffer;
137382: *pnBytes = nByte;
137383: *piStartOffset = pCsr->aOffset[iStart];
137384: *piEndOffset = pCsr->aOffset[iEnd];
137385: *piPosition = pCsr->iToken++;
137386:
137387: return SQLITE_OK;
137388: }
137389:
137390: /*
137391: ** The set of routines that implement the simple tokenizer
137392: */
137393: static const sqlite3_tokenizer_module icuTokenizerModule = {
137394: 0, /* iVersion */
137395: icuCreate, /* xCreate */
137396: icuDestroy, /* xCreate */
137397: icuOpen, /* xOpen */
137398: icuClose, /* xClose */
137399: icuNext, /* xNext */
137400: };
137401:
137402: /*
137403: ** Set *ppModule to point at the implementation of the ICU tokenizer.
137404: */
137405: SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule(
137406: sqlite3_tokenizer_module const**ppModule
137407: ){
137408: *ppModule = &icuTokenizerModule;
137409: }
137410:
137411: #endif /* defined(SQLITE_ENABLE_ICU) */
137412: #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */
137413:
137414: /************** End of fts3_icu.c ********************************************/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>