aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/build.c17
-rw-r--r--src/os_unix.c9
-rw-r--r--src/shell.c.in50
-rw-r--r--src/sqlite.h.in3
-rw-r--r--src/sqliteInt.h1
-rw-r--r--src/trigger.c11
6 files changed, 50 insertions, 41 deletions
diff --git a/src/build.c b/src/build.c
index 24f5d3f96..3d0679235 100644
--- a/src/build.c
+++ b/src/build.c
@@ -1408,19 +1408,12 @@ void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){
#endif
/*
-** Name of the special TEMP trigger used to implement RETURNING. The
-** name begins with "sqlite_" so that it is guaranteed not to collide
-** with any application-generated triggers.
-*/
-#define RETURNING_TRIGGER_NAME "sqlite_returning"
-
-/*
** Clean up the data structures associated with the RETURNING clause.
*/
static void sqlite3DeleteReturning(sqlite3 *db, Returning *pRet){
Hash *pHash;
pHash = &(db->aDb[1].pSchema->trigHash);
- sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, 0);
+ sqlite3HashInsert(pHash, pRet->zName, 0);
sqlite3ExprListDelete(db, pRet->pReturnEL);
sqlite3DbFree(db, pRet);
}
@@ -1463,7 +1456,9 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
(void(*)(sqlite3*,void*))sqlite3DeleteReturning, pRet);
testcase( pParse->earlyCleanup );
if( db->mallocFailed ) return;
- pRet->retTrig.zName = RETURNING_TRIGGER_NAME;
+ sqlite3_snprintf(sizeof(pRet->zName), pRet->zName,
+ "sqlite_returning_%p", pParse);
+ pRet->retTrig.zName = pRet->zName;
pRet->retTrig.op = TK_RETURNING;
pRet->retTrig.tr_tm = TRIGGER_AFTER;
pRet->retTrig.bReturning = 1;
@@ -1474,9 +1469,9 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
pRet->retTStep.pTrig = &pRet->retTrig;
pRet->retTStep.pExprList = pList;
pHash = &(db->aDb[1].pSchema->trigHash);
- assert( sqlite3HashFind(pHash, RETURNING_TRIGGER_NAME)==0
+ assert( sqlite3HashFind(pHash, pRet->zName)==0
|| pParse->nErr || pParse->ifNotExists );
- if( sqlite3HashInsert(pHash, RETURNING_TRIGGER_NAME, &pRet->retTrig)
+ if( sqlite3HashInsert(pHash, pRet->zName, &pRet->retTrig)
==&pRet->retTrig ){
sqlite3OomFault(db);
}
diff --git a/src/os_unix.c b/src/os_unix.c
index 59f67d142..a33e6f4df 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -3150,9 +3150,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
unixInodeInfo *pInode;
afpLockingContext *context = (afpLockingContext *) pFile->lockingContext;
int skipShared = 0;
-#ifdef SQLITE_TEST
- int h = pFile->h;
-#endif
assert( pFile );
OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock,
@@ -3168,9 +3165,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
assert( pInode->nShared!=0 );
if( pFile->eFileLock>SHARED_LOCK ){
assert( pInode->eFileLock==pFile->eFileLock );
- SimulateIOErrorBenign(1);
- SimulateIOError( h=(-1) )
- SimulateIOErrorBenign(0);
#ifdef SQLITE_DEBUG
/* When reducing a lock such that other processes can start
@@ -3219,9 +3213,6 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) {
unsigned long long sharedLockByte = SHARED_FIRST+pInode->sharedByte;
pInode->nShared--;
if( pInode->nShared==0 ){
- SimulateIOErrorBenign(1);
- SimulateIOError( h=(-1) )
- SimulateIOErrorBenign(0);
if( !skipShared ){
rc = afpSetLock(context->dbPath, pFile, sharedLockByte, 1, 0);
}
diff --git a/src/shell.c.in b/src/shell.c.in
index 53d355127..395cbd035 100644
--- a/src/shell.c.in
+++ b/src/shell.c.in
@@ -659,9 +659,11 @@ static void console_prepare_utf8(void){
static void SQLITE_CDECL console_restore(void){
if( (console_utf8_in||console_utf8_out)
&& conState.hConsole!=INVALID_HANDLE_VALUE ){
- _setmode(_fileno(stdin), conState.infsMode);
- SetConsoleCP(conState.inCodePage);
- SetConsoleOutputCP(conState.outCodePage);
+ if( console_utf8_in ){
+ SetConsoleCP(conState.inCodePage);
+ _setmode(_fileno(stdin), conState.infsMode);
+ }
+ if( console_utf8_out ) SetConsoleOutputCP(conState.outCodePage);
SetConsoleMode(conState.hConsole, conState.consoleMode);
/* Avoid multiple calls. */
conState.hConsole = INVALID_HANDLE_VALUE;
@@ -12245,12 +12247,25 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
(void)cmdline_option_value(argc, argv, ++i);
}else if( cli_strcmp(z,"-init")==0 ){
zInitFile = cmdline_option_value(argc, argv, ++i);
+ }else if( cli_strcmp(z,"-interactive")==0 ){
+ /* Need to check for interactive override here to so that it can
+ ** affect console setup (for Windows only) and testing thereof.
+ */
+ stdin_is_interactive = 1;
}else if( cli_strcmp(z,"-batch")==0 ){
/* Need to check for batch mode here to so we can avoid printing
** informational messages (like from process_sqliterc) before
** we do the actual processing of arguments later in a second pass.
*/
stdin_is_interactive = 0;
+ }else if( cli_strcmp(z,"-utf8")==0 ){
+#if SHELL_WIN_UTF8_OPT
+ mbcs_opted = 0;
+#endif /* SHELL_WIN_UTF8_OPT */
+ }else if( cli_strcmp(z,"-no-utf8")==0 ){
+#if SHELL_WIN_UTF8_OPT
+ mbcs_opted = 1;
+#endif /* SHELL_WIN_UTF8_OPT */
}else if( cli_strcmp(z,"-heap")==0 ){
#if defined(SQLITE_ENABLE_MEMSYS3) || defined(SQLITE_ENABLE_MEMSYS5)
const char *zSize;
@@ -12390,6 +12405,16 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
}
}
+#if SHELL_WIN_UTF8_OPT
+ /* Get indicated Windows console setup done before running invocation commands. */
+ if( stdin_is_interactive || stdout_is_console ){
+ console_prepare_utf8();
+ }
+ if( !stdin_is_interactive ){
+ setBinaryMode(stdin, 0);
+ }
+#endif
+
if( data.pAuxDb->zDbFilename==0 ){
#ifndef SQLITE_OMIT_MEMORYDB
data.pAuxDb->zDbFilename = ":memory:";
@@ -12516,17 +12541,13 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
8*(int)sizeof(char*));
return 0;
}else if( cli_strcmp(z,"-interactive")==0 ){
- stdin_is_interactive = 1;
+ /* already handled */
}else if( cli_strcmp(z,"-batch")==0 ){
- stdin_is_interactive = 0;
+ /* already handled */
}else if( cli_strcmp(z,"-utf8")==0 ){
-#if SHELL_WIN_UTF8_OPT
- mbcs_opted = 0;
-#endif /* SHELL_WIN_UTF8_OPT */
+ /* already handled */
}else if( cli_strcmp(z,"-no-utf8")==0 ){
-#if SHELL_WIN_UTF8_OPT
- mbcs_opted = 1;
-#endif /* SHELL_WIN_UTF8_OPT */
+ /* already handled */
}else if( cli_strcmp(z,"-heap")==0 ){
i++;
}else if( cli_strcmp(z,"-pagecache")==0 ){
@@ -12608,13 +12629,6 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){
}
data.cMode = data.mode;
}
-#if SHELL_WIN_UTF8_OPT
- if( stdin_is_interactive ){
- console_prepare_utf8();
- }else{
- setBinaryMode(stdin, 0);
- }
-#endif
if( !readStdin ){
/* Run all arguments that do not begin with '-' as if they were separate
diff --git a/src/sqlite.h.in b/src/sqlite.h.in
index f3db71dea..d8caf8106 100644
--- a/src/sqlite.h.in
+++ b/src/sqlite.h.in
@@ -7277,7 +7277,8 @@ struct sqlite3_module {
int (*xShadowName)(const char*);
/* The methods above are in versions 1 through 3 of the sqlite_module object.
** Those below are for version 4 and greater. */
- int (*xIntegrity)(sqlite3_vtab *pVTab, const char*, const char*, int, char**);
+ int (*xIntegrity)(sqlite3_vtab *pVTab, const char *zSchema,
+ const char *zTabName, int mFlags, char **pzErr);
};
/*
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index b6cc81fba..dbf01dd13 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -4077,6 +4077,7 @@ struct Returning {
int iRetCur; /* Transient table holding RETURNING results */
int nRetCol; /* Number of in pReturnEL after expansion */
int iRetReg; /* Register array for holding a row of RETURNING */
+ char zName[40]; /* Name of trigger: "sqlite_returning_%p" */
};
/*
diff --git a/src/trigger.c b/src/trigger.c
index 2decea820..97ca249be 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -970,10 +970,17 @@ static void codeReturningTrigger(
SrcList sFrom;
assert( v!=0 );
- assert( pParse->bReturning );
+ if( !pParse->bReturning ){
+ /* This RETURNING trigger must be for a different statement as
+ ** this statement lacks a RETURNING clause. */
+ return;
+ }
assert( db->pParse==pParse );
pReturning = pParse->u1.pReturning;
- assert( pTrigger == &(pReturning->retTrig) );
+ if( pTrigger != &(pReturning->retTrig) ){
+ /* This RETURNING trigger is for a different statement */
+ return;
+ }
memset(&sSelect, 0, sizeof(sSelect));
memset(&sFrom, 0, sizeof(sFrom));
sSelect.pEList = sqlite3ExprListDup(db, pReturning->pReturnEL, 0);