Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Remove the sqlite4_last_insert_rowid() and related infrastructure, since in SQLite4 we no longer have a rowid. Other cleanup of the sqlite4.h file. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
c92e61312fd26ab89807775eef73c77f |
User & Date: | drh 2013-02-23 16:32:17.432 |
Context
2013-02-23
| ||
17:39 | Factor out methods of sqlite4_env into a separate env.c source file. Add in the sqlite4_mm object. Remove deprecated interfaces. check-in: 1e83e737e4 user: drh tags: trunk | |
16:32 | Remove the sqlite4_last_insert_rowid() and related infrastructure, since in SQLite4 we no longer have a rowid. Other cleanup of the sqlite4.h file. check-in: c92e61312f user: drh tags: trunk | |
14:16 | Add the "Programmers Introduction To SQLite4" document outlining the desired API for SQLite4. check-in: a4782fccbe user: drh tags: trunk | |
Changes
Changes to src/func.c.
︙ | ︙ | |||
434 435 436 437 438 439 440 | p = contextMalloc(context, n); if( p ){ sqlite4_randomness(sqlite4_context_env(context), n, p); sqlite4_result_blob(context, (char*)p, n, SQLITE4_DYNAMIC, 0); } } | < < < < < < < < < < < < < < < < < | 434 435 436 437 438 439 440 441 442 443 444 445 446 447 | p = contextMalloc(context, n); if( p ){ sqlite4_randomness(sqlite4_context_env(context), n, p); sqlite4_result_blob(context, (char*)p, n, SQLITE4_DYNAMIC, 0); } } /* ** Implementation of the changes() SQL function. ** ** IMP: R-62073-11209 The changes() SQL function is a wrapper ** around the sqlite4_changes() C/C++ function and hence follows the same ** rules for counting changes. */ |
︙ | ︙ | |||
1536 1537 1538 1539 1540 1541 1542 | FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), #ifndef SQLITE4_OMIT_COMPILEOPTION_DIAGS FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), #endif /* SQLITE4_OMIT_COMPILEOPTION_DIAGS */ FUNCTION(quote, 1, 0, 0, quoteFunc ), | < | 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 | FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), #ifndef SQLITE4_OMIT_COMPILEOPTION_DIAGS FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), #endif /* SQLITE4_OMIT_COMPILEOPTION_DIAGS */ FUNCTION(quote, 1, 0, 0, quoteFunc ), FUNCTION(changes, 0, 0, 0, changes ), FUNCTION(total_changes, 0, 0, 0, total_changes ), FUNCTION(replace, 3, 0, 0, replaceFunc ), #ifdef SQLITE4_SOUNDEX FUNCTION(soundex, 1, 0, 0, soundexFunc ), #endif #if 0 /*ndef SQLITE4_OMIT_LOAD_EXTENSION*/ |
︙ | ︙ |
Changes to src/insert.c.
︙ | ︙ | |||
1315 1316 1317 1318 1319 1320 1321 | if( pIdx!=pPk ){ for(i=0; i<pPk->nColumn; i++){ int idx = pPk->aiColumn[i]; sqlite4VdbeAddOp2(v, OP_SCopy, regContent+idx, regTmp+i+pIdx->nColumn); } } sqlite4VdbeAddOp3(v, OP_MakeIdxKey, iIdx, regTmp, regKey); | < < < | 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 | if( pIdx!=pPk ){ for(i=0; i<pPk->nColumn; i++){ int idx = pPk->aiColumn[i]; sqlite4VdbeAddOp2(v, OP_SCopy, regContent+idx, regTmp+i+pIdx->nColumn); } } sqlite4VdbeAddOp3(v, OP_MakeIdxKey, iIdx, regTmp, regKey); VdbeComment((v, "key for %s", pIdx->zName)); /* If Index.onError==OE_None, then pIdx is not a UNIQUE or PRIMARY KEY ** index. In this case there is no need to test the index for uniqueness ** - all that is required is to populate the regKey register. Jump ** to the next iteration of the loop if this is the case. */ onError = pIdx->onError; |
︙ | ︙ | |||
1800 1801 1802 1803 1804 1805 1806 | addr1 = sqlite4VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite4VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } sqlite4VdbeAddOp2(v, OP_RowData, iSrc, regData); sqlite4VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); | | | 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 | addr1 = sqlite4VdbeAddOp2(v, OP_NewRowid, iDest, regRowid); }else{ addr1 = sqlite4VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } sqlite4VdbeAddOp2(v, OP_RowData, iSrc, regData); sqlite4VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); sqlite4VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_APPEND); sqlite4VdbeChangeP4(v, -1, pDest->zName, 0); sqlite4VdbeAddOp2(v, OP_Next, iSrc, addr1); for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; } assert( pSrcIdx ); |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
27 28 29 30 31 32 33 | #endif /* ** Dummy function used as a unique symbol for SQLITE4_DYNAMIC */ void sqlite4_dynamic(void *pArg,void *p){ (void)pArg; (void)p; } | < < < < < < < | 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #endif /* ** Dummy function used as a unique symbol for SQLITE4_DYNAMIC */ void sqlite4_dynamic(void *pArg,void *p){ (void)pArg; (void)p; } /* IMPLEMENTATION-OF: R-53536-42575 The sqlite4_libversion() function returns ** a pointer to the to the sqlite4_version[] string constant. */ const char *sqlite4_libversion(void){ return SQLITE4_VERSION; } /* IMPLEMENTATION-OF: R-63124-39300 The sqlite4_sourceid() function returns a ** pointer to a string constant whose value is the same as the |
︙ | ︙ | |||
662 663 664 665 666 667 668 | for(i=0; i<nIn; i++){ aOut[i] = sqlite4_tolower(aIn[i]); } } return nIn; } | < < < < < < < | 655 656 657 658 659 660 661 662 663 664 665 666 667 668 | for(i=0; i<nIn; i++){ aOut[i] = sqlite4_tolower(aIn[i]); } } return nIn; } /* ** Return the number of changes in the most recent call to sqlite4_exec(). */ int sqlite4_changes(sqlite4 *db){ return db->nChange; } |
︙ | ︙ |
Changes to src/mem.h.
1 2 3 4 5 6 7 8 9 10 11 | /* ** 2013-01-01 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* | < < < > > > > > > > > > > > > > > > > > > > > > | > > | | | | | | > | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | /* ** 2013-01-01 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** ** This file defines the sqlite4_mm "SQLite4 Memory Manager" object and ** its interfaces. */ /* ** object declarations */ typedef struct sqlite4_mm sqlite4_mm; typedef struct sqlite4_mm_methods sqlite4_mm_methods; /* ** Base class. Each implementation extends this with additional ** fields specific to its own needs. This needs to be public so that ** applications can supply their on customized memory allocators. */ struct sqlite4_mm { const sqlite4_mm_methods *pMethods; }; /* ** Memory statistics reporting */ typedef enum { SQLITE4_MMSTAT_OUT = 1, /* Bytes of memory outstanding */ SQLITE4_MMSTAT_UNITS = 2, /* Separate allocations outstanding */ SQLITE4_MMSTAT_SIZE = 3, /* Size of the allocation */ SQLITE4_MMSTAT_SZFAULT = 4, /* Number of faults due to size */ SQLITE4_MMSTAT_MEMFAULT = 5, /* Number of faults due to out of space */ SQLITE4_MMSTAT_FAULT = 6, /* Total number of faults */ }; /* ** Bit flags for the 3rd parameter of xStat() */ #define SQLITE4_MMSTAT_HIGHWATER 0x01 #define SQLITE4_MMSTAT_RESET 0x02 #define SQLITE4_MMSTAT_HWRESET 0x03 /* ** An instance of the following object defines the methods on ** a BESPOKE memory allocator. */ struct sqlite4_mm_methods { int iVersion; void *(*xMalloc)(sqlite4_mm*, sqlite4_int64); void *(*xRealloc)(sqlite4_mm*, void*, sqlite4_int64); void (*xFree)(sqlite4_mm*, void*); sqlite4_int64 (*xMsize)(sqlite4_mm*, void*); int (*xMember)(sqlite4_mm*, const void*); void (*xBenign)(sqlite4_mm*, int); sqlite4_int64 (*xStat)(sqlite4_mm*, sqlite4_mm_stattype, unsigned flags); void (*xFinal)(sqlite4_mm*); }; /* ** Available memory management types: */ typedef enum { SQLITE4_MM_SYSTEM = 1, /* Use the system malloc() */ SQLITE4_MM_ONESIZE = 2, /* All allocations map to a fixed size */ SQLITE4_MM_OVERFLOW = 3, /* Two allocators. Use A first; failover to B */ SQLITE4_MM_COMPACT = 4, /* Like memsys3 from SQLite3 */ SQLITE4_MM_ROBSON = 5, /* Like memsys5 from SQLite3 */ SQLITE4_MM_LINEAR = 6, /* Allocate from a fixed buffer w/o free */ SQLITE4_MM_BESPOKE = 7, /* Caller-defined implementation */ SQLITE4_MM_DEBUG, /* Debugging memory allocator */ SQLITE4_MM_STATS /* Keep memory statistics */ } sqlite4_mm_type; /* ** Allocate a new memory manager. Return NULL if unable. */ sqlite4_mm *sqlite4_mm_new(sqlite4_mm_type, ...); |
︙ | ︙ | |||
103 104 105 106 107 108 109 | /* ** Enable or disable benign failure mode. Benign failure mode can be ** nested. In benign failure mode, OOM errors do not necessarily propagate ** back out to the application but can be dealt with internally. Memory ** allocations that occur in benign failure mode are considered "optional". */ void sqlite4_mm_benign_failures(sqlite4_mm*, int bEnable); | > > > | 123 124 125 126 127 128 129 130 131 132 | /* ** Enable or disable benign failure mode. Benign failure mode can be ** nested. In benign failure mode, OOM errors do not necessarily propagate ** back out to the application but can be dealt with internally. Memory ** allocations that occur in benign failure mode are considered "optional". */ void sqlite4_mm_benign_failures(sqlite4_mm*, int bEnable); /* ** Rest |
Changes to src/sqlite.h.in.
1 2 3 4 5 6 7 8 9 10 11 | /* ** 2001 September 15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* | > | < < < < < < < < < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* ** 2001 September 15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** ** This header file defines the interface that the SQLite4 library ** presents to client programs. If a C-function, structure, datatype, ** or constant definition does not appear in this file, then it is ** not a published API of SQLite, is subject to change without ** notice, and should not be referenced by programs that use SQLite. ** ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting ** the version number) and changes its name to "sqlite4.h" as ** part of the build process. */ #ifndef _SQLITE4_H_ #define _SQLITE4_H_ |
︙ | ︙ | |||
45 46 47 48 49 50 51 | /* ** Add the ability to override 'extern' */ #ifndef SQLITE4_EXTERN # define SQLITE4_EXTERN extern #endif | < < < < < < < < < < < < < < < < | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | /* ** Add the ability to override 'extern' */ #ifndef SQLITE4_EXTERN # define SQLITE4_EXTERN extern #endif /* ** Ensure these symbols were not defined by some previous header file. */ #ifdef SQLITE4_VERSION # undef SQLITE4_VERSION #endif #ifdef SQLITE4_VERSION_NUMBER |
︙ | ︙ | |||
737 738 739 740 741 742 743 | ** </dl> */ #define SQLITE4_DBCONFIG_LOOKASIDE 1001 /* void* int int */ #define SQLITE4_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ #define SQLITE4_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 712 713 714 715 716 717 718 719 720 721 722 723 724 725 | ** </dl> */ #define SQLITE4_DBCONFIG_LOOKASIDE 1001 /* void* int int */ #define SQLITE4_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ #define SQLITE4_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ /* ** CAPIREF: Count The Number Of Rows Modified ** ** ^This function returns the number of database rows that were changed ** or inserted or deleted by the most recently completed SQL statement ** on the [database connection] specified by the first parameter. ** ^(Only changes that are directly specified by the [INSERT], [UPDATE], |
︙ | ︙ | |||
1311 1312 1313 1314 1315 1316 1317 | ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite ** might provide greater resolution on the profiler callback. The ** sqlite4_profile() function is considered experimental and is ** subject to change in future versions of SQLite. */ void *sqlite4_trace(sqlite4*, void(*xTrace)(void*,const char*), void*); | | | 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 | ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite ** might provide greater resolution on the profiler callback. The ** sqlite4_profile() function is considered experimental and is ** subject to change in future versions of SQLite. */ void *sqlite4_trace(sqlite4*, void(*xTrace)(void*,const char*), void*); void *sqlite4_profile(sqlite4*, void(*xProfile)(void*,const char*,sqlite4_uint64), void*); /* ** CAPIREF: Query Progress Callbacks ** ** ^The sqlite4_progress_handler(D,N,X,P) interface causes the callback ** function X to be invoked periodically during long running calls to |
︙ | ︙ | |||
2140 2141 2142 2143 2144 2145 2146 | ** If [sqlite4_step()] or [sqlite4_reset()] or [sqlite4_finalize()] ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** ** ^The sqlite4_column_type() routine returns the ** [SQLITE4_INTEGER | datatype code] for the initial data type ** of the result column. ^The returned value is one of [SQLITE4_INTEGER], | | > | 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 | ** If [sqlite4_step()] or [sqlite4_reset()] or [sqlite4_finalize()] ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** ** ^The sqlite4_column_type() routine returns the ** [SQLITE4_INTEGER | datatype code] for the initial data type ** of the result column. ^The returned value is one of [SQLITE4_INTEGER], ** [SQLITE4_FLOAT], [SQLITE4_TEXT], [SQLITE4_BLOB], or [SQLITE4_NULL]. ** The value ** returned by sqlite4_column_type() is only meaningful if no type ** conversions have occurred as described below. After a type conversion, ** the value returned by sqlite4_column_type() is undefined. Future ** versions of SQLite may change the behavior of sqlite4_column_type() ** following a type conversion. ** ** ^If the result is a BLOB or UTF-8 string then the sqlite4_column_bytes() |
︙ | ︙ | |||
2469 2470 2471 2472 2473 2474 2475 | #define SQLITE4_UTF8 1 #define SQLITE4_UTF16LE 2 #define SQLITE4_UTF16BE 3 #define SQLITE4_UTF16 4 /* Use native byte order */ #define SQLITE4_ANY 5 /* sqlite4_create_function only */ #define SQLITE4_UTF16_ALIGNED 8 /* sqlite4_create_collation only */ | < < < < < < < < < < < < < < < < < | 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 | #define SQLITE4_UTF8 1 #define SQLITE4_UTF16LE 2 #define SQLITE4_UTF16BE 3 #define SQLITE4_UTF16 4 /* Use native byte order */ #define SQLITE4_ANY 5 /* sqlite4_create_function only */ #define SQLITE4_UTF16_ALIGNED 8 /* sqlite4_create_collation only */ /* ** CAPIREF: Obtaining SQL Function Parameter Values ** ** The C-language implementation of SQL functions and aggregates uses ** this set of interface routines to access the parameter values on ** the function or aggregate. ** |
︙ | ︙ | |||
2719 2720 2721 2722 2723 2724 2725 | ** bytes (not characters) from the 2nd parameter as the error message. ** ^The sqlite4_result_error() and sqlite4_result_error16() ** routines make a private copy of the error message text before ** they return. Hence, the calling function can deallocate or ** modify the text after they return without harm. ** ^The sqlite4_result_error_code() function changes the error code ** returned by SQLite as a result of an error in a function. ^By default, | | > | 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 | ** bytes (not characters) from the 2nd parameter as the error message. ** ^The sqlite4_result_error() and sqlite4_result_error16() ** routines make a private copy of the error message text before ** they return. Hence, the calling function can deallocate or ** modify the text after they return without harm. ** ^The sqlite4_result_error_code() function changes the error code ** returned by SQLite as a result of an error in a function. ^By default, ** the error code is SQLITE4_ERROR. ** ^A subsequent call to sqlite4_result_error() ** or sqlite4_result_error16() resets the error code to SQLITE4_ERROR. ** ** ^The sqlite4_result_toobig() interface causes SQLite to throw an error ** indicating that a string or BLOB is too long to represent. ** ** ^The sqlite4_result_nomem() interface causes SQLite to throw an error ** indicating that a memory allocation failed. |
︙ | ︙ | |||
3851 3852 3853 3854 3855 3856 3857 | ** New verbs may be added in future releases of SQLite. Existing verbs ** might be discontinued. Applications should check the return code from ** [sqlite4_db_status()] to make sure that the call worked. ** The [sqlite4_db_status()] interface will return a non-zero error code ** if a discontinued or unsupported verb is invoked. ** ** <dl> | | > | 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 | ** New verbs may be added in future releases of SQLite. Existing verbs ** might be discontinued. Applications should check the return code from ** [sqlite4_db_status()] to make sure that the call worked. ** The [sqlite4_db_status()] interface will return a non-zero error code ** if a discontinued or unsupported verb is invoked. ** ** <dl> ** [[SQLITE4_DBSTATUS_LOOKASIDE_USED]] ** ^(<dt>SQLITE4_DBSTATUS_LOOKASIDE_USED</dt> ** <dd>This parameter returns the number of lookaside memory slots currently ** checked out.</dd>)^ ** ** [[SQLITE4_DBSTATUS_LOOKASIDE_HIT]] ^(<dt>SQLITE4_DBSTATUS_LOOKASIDE_HIT</dt> ** <dd>This parameter returns the number malloc attempts that were ** satisfied using lookaside memory. Only the high-water value is meaningful; ** the current value is always zero.)^ |
︙ | ︙ | |||
3956 3957 3958 3959 3960 3961 3962 | ** KEYWORDS: {SQLITE4_STMTSTATUS counter} {SQLITE4_STMTSTATUS counters} ** ** These preprocessor macros define integer codes that name counter ** values associated with the [sqlite4_stmt_status()] interface. ** The meanings of the various counters are as follows: ** ** <dl> | | > | 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 | ** KEYWORDS: {SQLITE4_STMTSTATUS counter} {SQLITE4_STMTSTATUS counters} ** ** These preprocessor macros define integer codes that name counter ** values associated with the [sqlite4_stmt_status()] interface. ** The meanings of the various counters are as follows: ** ** <dl> ** [[SQLITE4_STMTSTATUS_FULLSCAN_STEP]] ** <dt>SQLITE4_STMTSTATUS_FULLSCAN_STEP</dt> ** <dd>^This is the number of times that SQLite has stepped forward in ** a table as part of a full table scan. Large numbers for this counter ** may indicate opportunities for performance improvement through ** careful use of indices.</dd> ** ** [[SQLITE4_STMTSTATUS_SORT]] <dt>SQLITE4_STMTSTATUS_SORT</dt> ** <dd>^This is the number of sort operations that have occurred. |
︙ | ︙ | |||
4197 4198 4199 4200 4201 4202 4203 | #define SQLITE4_VTAB_CONSTRAINT_SUPPORT 1 /* ** CAPIREF: Determine The Virtual Table Conflict Policy ** ** This function may only be called from within a call to the [xUpdate] method ** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The | | > | 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 | #define SQLITE4_VTAB_CONSTRAINT_SUPPORT 1 /* ** CAPIREF: Determine The Virtual Table Conflict Policy ** ** This function may only be called from within a call to the [xUpdate] method ** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The ** value returned is one of [SQLITE4_ROLLBACK], [SQLITE4_IGNORE], ** [SQLITE4_FAIL], ** [SQLITE4_ABORT], or [SQLITE4_REPLACE], according to the [ON CONFLICT] mode ** of the SQL statement that triggered the call to the [xUpdate] method of the ** [virtual table]. */ int sqlite4_vtab_on_conflict(sqlite4 *); /* |
︙ | ︙ | |||
4318 4319 4320 4321 4322 4323 4324 | /* ** CAPIREF: Key-value storage object factory ** ** New key/value storage engines can be added to SQLite4 at run-time. ** In order to create a new KV storage engine, the application must ** supply a "factory" function that creates an instance of the | | | 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 | /* ** CAPIREF: Key-value storage object factory ** ** New key/value storage engines can be added to SQLite4 at run-time. ** In order to create a new KV storage engine, the application must ** supply a "factory" function that creates an instance of the ** sqlite4_kvstore object. This typedef defines the signature ** of that factory function. */ typedef int (*sqlite4_kvfactory)( sqlite4_env *pEnv, /* The environment to use */ sqlite4_kvstore **ppKVStore, /* OUT: New KV store returned here */ const char *zFilename, /* Name of database file to open */ unsigned flags /* Bit flags */ |
︙ | ︙ |
Changes to src/sqliteInt.h.
︙ | ︙ | |||
763 764 765 766 767 768 769 | u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ }; /* ** Each database connection is an instance of the following structure. ** | < < < < < < < | | 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 | u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ }; /* ** Each database connection is an instance of the following structure. ** ** The sqlite.nChange does not count changes within triggers and keeps no ** context. It is reset at start of sqlite4_exec. ** The sqlite.lsChange represents the number of changes made by the last ** insert, update, or delete statement. It remains constant throughout the ** length of a statement and is then updated by OP_SetCounts. It keeps a ** context stack so that the count of changes ** within a trigger is not seen outside the trigger. Changes to views do not ** affect the value of lsChange. ** The sqlite.csChange keeps track of the number of current changes (since ** the last statement) and is used to update sqlite_lsChange. ** ** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 ** store the most recent error code and, if applicable, string. The |
︙ | ︙ | |||
802 803 804 805 806 807 808 | u8 dfltLockMode; /* Default locking-mode for attached dbs */ signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ u8 suppressErr; /* Do not issue error messages if true */ u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ int nextPagesize; /* Pagesize after VACUUM if >0 */ int nTable; /* Number of tables in the database */ CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ | < | 795 796 797 798 799 800 801 802 803 804 805 806 807 808 | u8 dfltLockMode; /* Default locking-mode for attached dbs */ signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ u8 suppressErr; /* Do not issue error messages if true */ u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ int nextPagesize; /* Pagesize after VACUUM if >0 */ int nTable; /* Number of tables in the database */ CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ u32 magic; /* Magic number for detect library misuse */ int nChange; /* Value returned by sqlite4_changes() */ int nTotalChange; /* Value returned by sqlite4_total_changes() */ sqlite4_mutex *mutex; /* Connection mutex */ int aLimit[SQLITE4_N_LIMIT]; /* Limits */ Sqlite4InitInfo init; /* Information used during initialization */ int nExtension; /* Number of loaded extensions */ |
︙ | ︙ | |||
2254 2255 2256 2257 2258 2259 2260 | Parse *pParse; /* The Parse structure */ }; /* ** Bitfield flags for P5 value in OP_Insert and OP_Delete */ #define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */ | < | 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 | Parse *pParse; /* The Parse structure */ }; /* ** Bitfield flags for P5 value in OP_Insert and OP_Delete */ #define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */ #define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ #define OPFLAG_APPEND 0x08 /* This is likely to be an append */ #define OPFLAG_SEQCOUNT 0x10 /* Append sequence number to key */ #define OPFLAG_CLEARCACHE 0x20 /* Clear pseudo-table cache in OP_Column */ #define OPFLAG_APPENDBIAS 0x40 /* Bias inserts for appending */ /* |
︙ | ︙ |
Changes to src/tclsqlite.c.
︙ | ︙ | |||
1269 1270 1271 1272 1273 1274 1275 | int choice; int rc = TCL_OK; static const char *DB_strs[] = { "authorizer", "cache", "changes", "close", "collate", "collation_needed", "complete", "copy", "enable_load_extension", "errorcode", "eval", "exists", | | | | 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 | int choice; int rc = TCL_OK; static const char *DB_strs[] = { "authorizer", "cache", "changes", "close", "collate", "collation_needed", "complete", "copy", "enable_load_extension", "errorcode", "eval", "exists", "function", "interrupt", "nullvalue", "onecolumn", "profile", "rekey", "status", "total_changes", "trace", "transaction", "unlock_notify", "version", 0 }; enum DB_enum { DB_AUTHORIZER, DB_CACHE, DB_CHANGES, DB_CLOSE, DB_COLLATE, DB_COLLATION_NEEDED, DB_COMPLETE, DB_COPY, DB_ENABLE_LOAD_EXTENSION, DB_ERRORCODE, DB_EVAL, DB_EXISTS, DB_FUNCTION, DB_INTERRUPT, DB_NULLVALUE, DB_ONECOLUMN, DB_PROFILE, DB_REKEY, DB_STATUS, DB_TOTAL_CHANGES, DB_TRACE, DB_TRANSACTION, DB_UNLOCK_NOTIFY, DB_VERSION }; /* don't leave trailing commas on DB_enum, it confuses the AIX xlc compiler */ |
︙ | ︙ | |||
1899 1900 1901 1902 1903 1904 1905 | pDb->zNull = 0; } } Tcl_SetObjResult(interp, dbTextToObj(pDb->zNull)); break; } | < < < < < < < < < < < < < < < < < < | 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 | pDb->zNull = 0; } } Tcl_SetObjResult(interp, dbTextToObj(pDb->zNull)); break; } /* ** The DB_ONECOLUMN method is implemented together with DB_EXISTS. */ /* $db profile ?CALLBACK? ** |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
522 523 524 525 526 527 528 | Mem *aMem = p->aMem; /* Copy of p->aMem */ Mem *pIn1 = 0; /* 1st input operand */ Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ int iCompare = 0; /* Result of last OP_Compare operation */ int *aPermute = 0; /* Permutation of columns for OP_Compare */ | < | 522 523 524 525 526 527 528 529 530 531 532 533 534 535 | Mem *aMem = p->aMem; /* Copy of p->aMem */ Mem *pIn1 = 0; /* 1st input operand */ Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ int iCompare = 0; /* Result of last OP_Compare operation */ int *aPermute = 0; /* Permutation of columns for OP_Compare */ #ifdef VDBE_PROFILE u64 start; /* CPU clock count at start of opcode */ int origPc; /* Program counter at start of opcode */ #endif /*** INSERT STACK UNION HERE ***/ assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite4_step() verifies this */ |
︙ | ︙ | |||
791 792 793 794 795 796 797 | if( pOp->p1==SQLITE4_OK && p->pFrame ){ /* Halt the sub-program. Return control to the parent frame. */ VdbeFrame *pFrame = p->pFrame; p->pFrame = pFrame->pParent; p->nFrame--; sqlite4VdbeSetChanges(db, p->nChange); pc = sqlite4VdbeFrameRestore(pFrame); | < | 790 791 792 793 794 795 796 797 798 799 800 801 802 803 | if( pOp->p1==SQLITE4_OK && p->pFrame ){ /* Halt the sub-program. Return control to the parent frame. */ VdbeFrame *pFrame = p->pFrame; p->pFrame = pFrame->pParent; p->nFrame--; sqlite4VdbeSetChanges(db, p->nChange); pc = sqlite4VdbeFrameRestore(pFrame); if( pOp->p2==OE_Ignore ){ /* Instruction pc is the OP_Program that invoked the sub-program ** currently being halted. If the p2 instruction of this OP_Halt ** instruction is set to OE_Ignore, then the sub-program is throwing ** an IGNORE exception. In this case jump to the address specified ** as the p2 of the calling OP_Program. */ pc = p->aOp[pc].p2-1; |
︙ | ︙ | |||
1379 1380 1381 1382 1383 1384 1385 | ctx.isError = 0; if( ctx.pFunc->flags & SQLITE4_FUNC_NEEDCOLL ){ assert( pOp>aOp ); assert( pOp[-1].p4type==P4_COLLSEQ ); assert( pOp[-1].opcode==OP_CollSeq ); ctx.pColl = pOp[-1].p4.pColl; } | < < | 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 | ctx.isError = 0; if( ctx.pFunc->flags & SQLITE4_FUNC_NEEDCOLL ){ assert( pOp>aOp ); assert( pOp[-1].p4type==P4_COLLSEQ ); assert( pOp[-1].opcode==OP_CollSeq ); ctx.pColl = pOp[-1].p4.pColl; } (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */ /* If any auxiliary data functions have been called by this user function, ** immediately call the destructor for any non-static values. */ if( ctx.pVdbeFunc ){ sqlite4VdbeDeleteAuxData(ctx.pVdbeFunc, pOp->p1); pOp->p4.pVdbeFunc = ctx.pVdbeFunc; |
︙ | ︙ | |||
2192 2193 2194 2195 2196 2197 2198 | ** This instruction encodes the N values into a database key and writes ** the result to register P3. No affinity transformations are applied to ** the input values before they are encoded. ** ** If the OPFLAG_SEQCOUNT bit of P5 is set, then a sequence number ** (unique within the cursor) is appended to the record. The sole purpose ** of this is to ensure that the key blob is unique within the cursors table. | < < < < | 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 | ** This instruction encodes the N values into a database key and writes ** the result to register P3. No affinity transformations are applied to ** the input values before they are encoded. ** ** If the OPFLAG_SEQCOUNT bit of P5 is set, then a sequence number ** (unique within the cursor) is appended to the record. The sole purpose ** of this is to ensure that the key blob is unique within the cursors table. */ case OP_MakeIdxKey: { VdbeCursor *pC; KeyInfo *pKeyInfo; Mem *pData0; /* First in array of input registers */ u8 *aRec; /* The constructed database key */ int nRec; /* Size of aRec[] in bytes */ |
︙ | ︙ | |||
2228 2229 2230 2231 2232 2233 2234 | do { nSeq++; aSeq[sizeof(aSeq)-nSeq] = (u8)(iSeq & 0x007F); iSeq = iSeq >> 7; }while( iSeq ); aSeq[sizeof(aSeq)-nSeq] |= 0x80; } | < < < | 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 | do { nSeq++; aSeq[sizeof(aSeq)-nSeq] = (u8)(iSeq & 0x007F); iSeq = iSeq >> 7; }while( iSeq ); aSeq[sizeof(aSeq)-nSeq] |= 0x80; } memAboutToChange(p, pOut); nField = pKeyInfo->nField; if( pOp->p4type==P4_INT32 && pOp->p4.i ){ nField = pOp->p4.i; assert( nField<=pKeyInfo->nField ); |
︙ | ︙ | |||
3429 3430 3431 3432 3433 3434 3435 | iKey = pKey->u.i; }else{ /* assert( pOp->opcode==OP_InsertInt ); */ iKey = pOp->p3; } if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; | < | 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 | iKey = pKey->u.i; }else{ /* assert( pOp->opcode==OP_InsertInt ); */ iKey = pOp->p3; } if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; if( pData->flags & MEM_Null ){ pData->z = 0; pData->n = 0; }else{ assert( pData->flags & (MEM_Blob|MEM_Str) ); } n = sqlite4PutVarint64(aKey, pC->iRoot); |
︙ | ︙ | |||
3632 3633 3634 3635 3636 3637 3638 | case OP_NullRow: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); pC->nullRow = 1; | < | 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 | case OP_NullRow: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); pC->nullRow = 1; break; } /* Opcode: Last P1 P2 * * * ** ** The next use of the Rowid or Column or Next instruction for P1 ** will refer to the last entry in the database table or index. |
︙ | ︙ | |||
3773 3774 3775 3776 3777 3778 3779 | #ifdef SQLITE4_TEST sqlite4_search_count++; #endif }else if( rc==SQLITE4_NOTFOUND ){ pC->nullRow = 1; rc = SQLITE4_OK; } | < | 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 | #ifdef SQLITE4_TEST sqlite4_search_count++; #endif }else if( rc==SQLITE4_NOTFOUND ){ pC->nullRow = 1; rc = SQLITE4_OK; } break; } /* Opcode: SorterInsert P1 P2 P3 */ /* Opcode: IdxInsert P1 P2 P3 * P5 |
︙ | ︙ | |||
4188 4189 4190 4191 4192 4193 4194 | assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem ); assert( pProgram->nCsr==pFrame->nChildCsr ); assert( pc==pFrame->pc ); } p->nFrame++; pFrame->pParent = p->pFrame; | < | 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 | assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem ); assert( pProgram->nCsr==pFrame->nChildCsr ); assert( pc==pFrame->pc ); } p->nFrame++; pFrame->pParent = p->pFrame; pFrame->nChange = p->nChange; p->nChange = 0; p->pFrame = pFrame; p->aMem = aMem = &VdbeFrameMem(pFrame)[-1]; p->nMem = pFrame->nChildMem; p->nCursor = (u16)pFrame->nChildCsr; p->apCsr = (VdbeCursor **)&aMem[p->nMem+1]; |
︙ | ︙ | |||
4813 4814 4815 4816 4817 4818 4819 | apArg[i] = pX; pX++; } db->vtabOnConflict = pOp->p5; rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); db->vtabOnConflict = vtabOnConflict; importVtabErrMsg(p, pVtab); | < < < < | 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 | apArg[i] = pX; pX++; } db->vtabOnConflict = pOp->p5; rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid); db->vtabOnConflict = vtabOnConflict; importVtabErrMsg(p, pVtab); if( rc==SQLITE4_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ if( pOp->p5==OE_Ignore ){ rc = SQLITE4_OK; }else{ p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5); } }else{ |
︙ | ︙ | |||
5069 5070 5071 5072 5073 5074 5075 | sqlite4ResetInternalSchema(db, resetSchemaOnFault-1); } /* This is the only way out of this procedure. We have to ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: | < | 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 | sqlite4ResetInternalSchema(db, resetSchemaOnFault-1); } /* This is the only way out of this procedure. We have to ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: return rc; /* Jump to here if a string or blob larger than SQLITE4_MAX_LENGTH ** is encountered. */ too_big: sqlite4SetString(&p->zErrMsg, db, "string or blob too big"); |
︙ | ︙ |
Changes to src/vdbeInt.h.
︙ | ︙ | |||
54 55 56 57 58 59 60 | KVStore *pTmpKV; /* Separate file holding a temporary table */ KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ int iDb; /* Index of cursor database in db->aDb[] (or -1) */ int iRoot; /* Root page of the table */ int pseudoTableReg; /* Register holding pseudotable content. */ int nField; /* Number of fields in the header */ Bool zeroed; /* True if zeroed out and ready for reuse */ | < < | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | KVStore *pTmpKV; /* Separate file holding a temporary table */ KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ int iDb; /* Index of cursor database in db->aDb[] (or -1) */ int iRoot; /* Root page of the table */ int pseudoTableReg; /* Register holding pseudotable content. */ int nField; /* Number of fields in the header */ Bool zeroed; /* True if zeroed out and ready for reuse */ Bool atFirst; /* True if pointing to first entry */ Bool nullRow; /* True if pointing to a row with no data */ Bool isTable; /* True if a table requiring integer keys */ Bool isIndex; /* True if an index containing keys only - no data */ Bool isOrdered; /* True if the underlying table is BTREE_UNORDERED */ sqlite4_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */ const sqlite4_module *pModule; /* Module for cursor pVtabCursor */ i64 seqCount; /* Sequence counter */ i64 movetoTarget; /* Argument to the deferred move-to */ VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */ Fts5Cursor *pFts; /* Fts5 cursor object (or NULL) */ /* Result of last sqlite4-Moveto() done by an OP_NotExists or ** OP_IsUnique opcode on this cursor. */ int seekResult; }; |
︙ | ︙ | |||
109 110 111 112 113 114 115 | u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */ int nOnceFlag; /* Number of entries in aOnceFlag */ VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ u16 nCursor; /* Number of entries in apCsr */ void *token; /* Copy of SubProgram.token */ int nChildMem; /* Number of memory cells for child frame */ int nChildCsr; /* Number of cursors for child frame */ | < | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */ int nOnceFlag; /* Number of entries in aOnceFlag */ VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ u16 nCursor; /* Number of entries in apCsr */ void *token; /* Copy of SubProgram.token */ int nChildMem; /* Number of memory cells for child frame */ int nChildCsr; /* Number of cursors for child frame */ int nChange; /* Statement changes (Vdbe.nChanges) */ VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */ }; #define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) /* |
︙ | ︙ |
Changes to src/vdbeaux.c.
︙ | ︙ | |||
1520 1521 1522 1523 1524 1525 1526 | v->nOnceFlag = pFrame->nOnceFlag; v->aOp = pFrame->aOp; v->nOp = pFrame->nOp; v->aMem = pFrame->aMem; v->nMem = pFrame->nMem; v->apCsr = pFrame->apCsr; v->nCursor = pFrame->nCursor; | < | 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 | v->nOnceFlag = pFrame->nOnceFlag; v->aOp = pFrame->aOp; v->nOp = pFrame->nOp; v->aMem = pFrame->aMem; v->nMem = pFrame->nMem; v->apCsr = pFrame->apCsr; v->nCursor = pFrame->nCursor; v->nChange = pFrame->nChange; return pFrame->pc; } /* ** Close all cursors. ** |
︙ | ︙ |
Deleted test/lastinsert.test.
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Changes to test/test_main.c.
︙ | ︙ | |||
563 564 565 566 567 568 569 | sqlite4_snprintf(zStr, sizeof(zStr), "abcdefghijklmnopqrstuvwxyz"); sqlite4_snprintf(zStr, n, zFormat, a1); Tcl_AppendResult(interp, zStr, 0); return TCL_OK; } | < < < < < < < < < < < < < < < < < < < < < < < < < | 563 564 565 566 567 568 569 570 571 572 573 574 575 576 | sqlite4_snprintf(zStr, sizeof(zStr), "abcdefghijklmnopqrstuvwxyz"); sqlite4_snprintf(zStr, n, zFormat, a1); Tcl_AppendResult(interp, zStr, 0); return TCL_OK; } /* ** Usage: sqlite4_key DB KEY ** ** Set the codec key. */ static int test_key( void *NotUsed, |
︙ | ︙ | |||
4543 4544 4545 4546 4547 4548 4549 | { "sqlite4_mprintf_stronly", (Tcl_CmdProc*)sqlite4_mprintf_stronly}, { "sqlite4_mprintf_double", (Tcl_CmdProc*)sqlite4_mprintf_double }, { "sqlite4_mprintf_scaled", (Tcl_CmdProc*)sqlite4_mprintf_scaled }, { "sqlite4_mprintf_hexdouble", (Tcl_CmdProc*)sqlite4_mprintf_hexdouble}, { "sqlite4_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z }, { "sqlite4_mprintf_n_test", (Tcl_CmdProc*)test_mprintf_n }, { "sqlite4_snprintf_int", (Tcl_CmdProc*)test_snprintf_int }, | < | 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 | { "sqlite4_mprintf_stronly", (Tcl_CmdProc*)sqlite4_mprintf_stronly}, { "sqlite4_mprintf_double", (Tcl_CmdProc*)sqlite4_mprintf_double }, { "sqlite4_mprintf_scaled", (Tcl_CmdProc*)sqlite4_mprintf_scaled }, { "sqlite4_mprintf_hexdouble", (Tcl_CmdProc*)sqlite4_mprintf_hexdouble}, { "sqlite4_mprintf_z_test", (Tcl_CmdProc*)test_mprintf_z }, { "sqlite4_mprintf_n_test", (Tcl_CmdProc*)test_mprintf_n }, { "sqlite4_snprintf_int", (Tcl_CmdProc*)test_snprintf_int }, { "sqlite4_exec_printf", (Tcl_CmdProc*)test_exec_printf }, { "sqlite4_exec_hex", (Tcl_CmdProc*)test_exec_hex }, { "sqlite4_exec", (Tcl_CmdProc*)test_exec }, { "sqlite4_exec_nr", (Tcl_CmdProc*)test_exec_nr }, { "sqlite4_close", (Tcl_CmdProc*)sqlite_test_close }, { "sqlite4_create_function", (Tcl_CmdProc*)test_create_function }, { "sqlite4_create_aggregate", (Tcl_CmdProc*)test_create_aggregate }, |
︙ | ︙ |