]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Be sure to ignore PRAGMA encoding pragmas if the encoding has already been
authordrh <drh@noemail.net>
Sat, 23 Sep 2006 20:36:01 +0000 (20:36 +0000)
committerdrh <drh@noemail.net>
Sat, 23 Sep 2006 20:36:01 +0000 (20:36 +0000)
set for a database.  Ticket #1987.  This patch also includes some cleanup
of the schema parser and initialization logic. (CVS 3436)

FossilOrigin-Name: dc797bf4fa96deabd9ceb6cc062b98d2ac49a574

manifest
manifest.uuid
src/prepare.c
src/sqliteInt.h
src/vdbe.c
test/enc2.test

index 126d0f987d8c1d2a236c6e36338f3d9bc3755029..5fd6acd48f3eda7b4859f468b98cbb631cda8717 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbuild\sproblem\saround\ssqlite3_overload_function.\s\sOnly\saffects\nso/dll\sbuilds.\s(CVS\s3435)
-D 2006-09-22T23:38:21
+C Be\ssure\sto\signore\sPRAGMA\sencoding\spragmas\sif\sthe\sencoding\shas\salready\sbeen\nset\sfor\sa\sdatabase.\s\sTicket\s#1987.\s\sThis\spatch\salso\sincludes\ssome\scleanup\nof\sthe\sschema\sparser\sand\sinitialization\slogic.\s(CVS\s3436)
+D 2006-09-23T20:36:02
 F Makefile.in cabd42d34340f49260bc2a7668c38eba8d4cfd99
 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -80,7 +80,7 @@ F src/pager.c 0f966f7fa225c377da2021fbbfdd50a48d877000
 F src/pager.h 0cff9de5e9019cb695a04d18df8caaaff933a272
 F src/parse.y 8c79a1debbd92a4f5609511e9bf0222de78f5ecb
 F src/pragma.c dcb79b8170231f3aed99d4004b4d0a0fc14c4b4d
-F src/prepare.c bc003436a4897b8f30b940e023a70297e860f805
+F src/prepare.c 3d9a1bb0644e8bccb3b78cb0833d269719237f4e
 F src/printf.c b179b6ed12f793e028dd169e2e2e2b2a37eedc63
 F src/random.c d40f8d356cecbd351ccfab6eaedd7ec1b54f5261
 F src/select.c 0d4724930a1f34c747105ed1802fa4af0d8eb519
@@ -88,7 +88,7 @@ F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96
 F src/shell.c 672326e8d90394218509f1820ab0835e7ed2bc06
 F src/sqlite.h.in bf935004029631fd93d119bcf2f7259b9cb9ad5e
 F src/sqlite3ext.h 2c2156cc32a158e2b7bd9042d42accf94bff2e40
-F src/sqliteInt.h c1d28fb13003c03fe7787d7ecc065d30530afc90
+F src/sqliteInt.h 637ef229c3d8e0f98096ab31c496efdf5361d678
 F src/table.c 6d0da66dde26ee75614ed8f584a1996467088d06
 F src/tclsqlite.c e029f739bed90071789fe81a226d53e97a80a4d8
 F src/test1.c 47f1d62d90fbf131dc5bbcd1b1aa18791fa3bc79
@@ -112,7 +112,7 @@ F src/update.c 951f95ef044cf6d28557c48dc35cb0711a0b9129
 F src/utf.c 4459801e9b00cfd69993bfca58545d3775682d6e
 F src/util.c 91d4cb189476906639ae611927d939691d1365f6
 F src/vacuum.c f958275b353bcc54776601582ea35ed427125a9d
-F src/vdbe.c 39f775380fc3b8e30f0743b098c15e03d51bb7eb
+F src/vdbe.c 84a9c0b0dd037c064ffed651977e20dd9d2bc1d1
 F src/vdbe.h 258b5d1c0aaa72192f09ff0568ce42b383f156fa
 F src/vdbeInt.h e3eaab262b67b84474625cfc38aec1125c32834b
 F src/vdbeapi.c f1858a5edc3a5e32d038514dd9e7e9091400a782
@@ -185,7 +185,7 @@ F test/descidx3.test 3a55b8d73bc3e9ad084e0da7fec781cf0d2a0356
 F test/diskfull.test d828d72adfc9e2d1a194d25996718c1989152cf9
 F test/distinctagg.test 2b89d1c5220d966a30ba4b40430338669301188b
 F test/enc.test 7a03417a1051fe8bc6c7641cf4c8c3f7e0066d52
-F test/enc2.test 9f15cb7adc745fbb93d083ae1cf5a2deaa04d25f
+F test/enc2.test 45710bacfa9df29720bc84c067dfdf8c8ddfb797
 F test/enc3.test 890508efff6677345e93bf2a8adb0489b30df030
 F test/expr.test c78843f730ccbe973d0c2ad1c99978f936893131
 F test/fkey1.test 153004438d51e6769fb1ce165f6313972d6263ce
@@ -399,7 +399,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
-P 757fa22400b363212b4d5f648bdc9fcbd9a7f152
-R a5ed36e0e4e279ba62dac19559917c53
-U shess
-Z db889ecb0c06c31c19fe6fec85c9eeaa
+P 791d70936b9c4fed57c95f61e3b4dfdd24221ee4
+R 42dffbf0309b331dd39f444b3d5b9fb3
+U drh
+Z 673fdf08a11b4d0ec87fe86a969bb8eb
index 98476a88cdbe1cde2182439feca343be288b7271..4e0272f0ed213b27197e4a00758a9d2512c751d5 100644 (file)
@@ -1 +1 @@
-791d70936b9c4fed57c95f61e3b4dfdd24221ee4
\ No newline at end of file
+dc797bf4fa96deabd9ceb6cc062b98d2ac49a574
\ No newline at end of file
index 7e52c87871124413a3dc439a7694e6f50b0921e5..0dc34d78328836b1972559ef465ce3cde3b49483 100644 (file)
@@ -13,7 +13,7 @@
 ** interface, and routines that contribute to loading the database schema
 ** from disk.
 **
-** $Id: prepare.c,v 1.39 2006/09/15 07:28:50 drh Exp $
+** $Id: prepare.c,v 1.40 2006/09/23 20:36:02 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -41,28 +41,26 @@ static void corruptSchema(InitData *pData, const char *zExtra){
 **     argv[0] = name of thing being created
 **     argv[1] = root page number for table or index. 0 for trigger or view.
 **     argv[2] = SQL text for the CREATE statement.
-**     argv[3] = "1" for temporary files, "0" for main database, "2" or more
-**               for auxiliary database files.
 **
 */
 int sqlite3InitCallback(void *pInit, int argc, char **argv, char **azColName){
   InitData *pData = (InitData*)pInit;
   sqlite3 *db = pData->db;
-  int iDb;
+  int iDb = pData->iDb;
 
   pData->rc = SQLITE_OK;
+  DbClearProperty(db, iDb, DB_Empty);
   if( sqlite3MallocFailed() ){
     corruptSchema(pData, 0);
     return SQLITE_NOMEM;
   }
 
-  assert( argc==4 );
+  assert( argc==3 );
   if( argv==0 ) return 0;   /* Might happen if EMPTY_RESULT_CALLBACKS are on */
-  if( argv[1]==0 || argv[3]==0 ){
+  if( argv[1]==0 ){
     corruptSchema(pData, 0);
     return 1;
   }
-  iDb = atoi(argv[3]);
   assert( iDb>=0 && iDb<db->nDb );
   if( argv[2] && argv[2][0] ){
     /* Call the parser to process a CREATE TABLE, INDEX or VIEW.
@@ -125,8 +123,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
   int size;
   Table *pTab;
   Db *pDb;
-  char const *azArg[5];
-  char zDbNum[30];
+  char const *azArg[4];
   int meta[10];
   InitData initData;
   char const *zMasterSchema;
@@ -177,12 +174,11 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
   azArg[0] = zMasterName;
   azArg[1] = "1";
   azArg[2] = zMasterSchema;
-  sprintf(zDbNum, "%d", iDb);
-  azArg[3] = zDbNum;
-  azArg[4] = 0;
+  azArg[3] = 0;
   initData.db = db;
+  initData.iDb = iDb;
   initData.pzErrMsg = pzErrMsg;
-  rc = sqlite3InitCallback(&initData, 4, (char **)azArg, 0);
+  rc = sqlite3InitCallback(&initData, 3, (char **)azArg, 0);
   if( rc ){
     sqlite3SafetyOn(db);
     return initData.rc;
@@ -295,8 +291,8 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){
   }else{
     char *zSql;
     zSql = sqlite3MPrintf(
-        "SELECT name, rootpage, sql, '%s' FROM '%q'.%s",
-        zDbNum, db->aDb[iDb].zName, zMasterName);
+        "SELECT name, rootpage, sql FROM '%q'.%s",
+        db->aDb[iDb].zName, zMasterName);
     sqlite3SafetyOff(db);
     rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
     if( rc==SQLITE_ABORT ) rc = initData.rc;
index 4f2cc4b87318b540dce01a5dd812b7e64a5cf8eb..eb86caf4966d87b409d584612aff06347eee19d7 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.528 2006/09/16 21:45:14 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.529 2006/09/23 20:36:02 drh Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -1513,6 +1513,7 @@ struct DbFixer {
 */
 typedef struct {
   sqlite3 *db;        /* The database being initialized */
+  int iDb;            /* 0 for main database.  1 for TEMP, 2.. for ATTACHed */
   char **pzErrMsg;    /* Error message stored here */
   int rc;             /* Result code stored here */
 } InitData;
index 132ba5baf0f8d602ff6d891b98c2020a2a82eadf..5b1b9798e9314effdb491fc4a2d622533e41363f 100644 (file)
@@ -43,7 +43,7 @@
 ** in this file for details.  If in doubt, do not deviate from existing
 ** commenting and indentation practices when changing or adding code.
 **
-** $Id: vdbe.c,v 1.576 2006/09/21 11:02:18 drh Exp $
+** $Id: vdbe.c,v 1.577 2006/09/23 20:36:02 drh Exp $
 */
 #include "sqliteInt.h"
 #include "os.h"
@@ -4050,10 +4050,11 @@ case OP_ParseSchema: {        /* no-push */
   if( !DbHasProperty(db, iDb, DB_SchemaLoaded) ) break;
   zMaster = SCHEMA_TABLE(iDb);
   initData.db = db;
+  initData.iDb = pOp->p1;
   initData.pzErrMsg = &p->zErrMsg;
   zSql = sqlite3MPrintf(
-     "SELECT name, rootpage, sql, %d FROM '%q'.%s WHERE %s",
-     pOp->p1, db->aDb[iDb].zName, zMaster, pOp->p3);
+     "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s",
+     db->aDb[iDb].zName, zMaster, pOp->p3);
   if( zSql==0 ) goto no_mem;
   sqlite3SafetyOff(db);
   assert( db->init.busy==0 );
index 760cbdb05153ff4e613c66817fbcf2268a149685..03d4cbd79822e767f68cc531372896a586844ce2 100644 (file)
@@ -13,7 +13,7 @@
 # various suported unicode encodings (UTF-8, UTF-16, UTF-16le and
 # UTF-16be).
 #
-# $Id: enc2.test,v 1.27 2006/01/23 15:59:55 drh Exp $
+# $Id: enc2.test,v 1.28 2006/09/23 20:36:03 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -146,6 +146,22 @@ foreach enc $encodings {
   sqlite3 db test.db
   db eval "PRAGMA encoding = \"$enc\""
   execsql $dbcontents
+  do_test enc2-$i.0.1 {
+    db eval {PRAGMA encoding}
+  } $enc
+  do_test enc2-$i.0.2 {
+    db eval {PRAGMA encoding=UTF8}
+    db eval {PRAGMA encoding}
+  } $enc
+  do_test enc2-$i.0.3 {
+    db eval {PRAGMA encoding=UTF16le}
+    db eval {PRAGMA encoding}
+  } $enc
+  do_test enc2-$i.0.4 {
+    db eval {PRAGMA encoding=UTF16be}
+    db eval {PRAGMA encoding}
+  } $enc
+
   db close
   run_test_script enc2-$i $enc
   db close
@@ -515,4 +531,24 @@ do_test enc2-9.5 {
   }
 } {UTF-16le}
 
+# Ticket #1987.
+# Disallow encoding changes once the encoding has been set.
+#
+do_test enc2-10.1 {
+  db close
+  file delete -force test.db test.db-journal
+  sqlite3 db test.db
+  db eval {
+    PRAGMA encoding=UTF16;
+    CREATE TABLE t1(a);
+    PRAGMA encoding=UTF8;
+    CREATE TABLE t2(b);
+  }
+  db close
+  sqlite3 db test.db
+  db eval {
+    SELECT name FROM sqlite_master
+  }
+} {t1 t2}
+
 finish_test