]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Invoke the authorization callback when compiling SAVEPOINT, ROLLBACK TO and RELEASE...
authordanielk1977 <danielk1977@noemail.net>
Tue, 30 Dec 2008 06:24:58 +0000 (06:24 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Tue, 30 Dec 2008 06:24:58 +0000 (06:24 +0000)
FossilOrigin-Name: e49807b16f7f86d3f2290d6c1f7562f3db6330f9

manifest
manifest.uuid
src/build.c
src/sqlite.h.in
src/tclsqlite.c
test/savepoint.test

index b89a99de6fe587e4ac321cd9941edfb74d5d4a82..cfe51fed805ef38a1b49f089941590e352135b42 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Always\smake\ssure\sWhereClause\sobjects\sare\sinitialized\sto\szero\swhen\sthey\nare\sfirst\sallocated.\s(CVS\s6073)
-D 2008-12-29T23:45:07
+C Invoke\sthe\sauthorization\scallback\swhen\scompiling\sSAVEPOINT,\sROLLBACK\sTO\sand\sRELEASE\scommands.\s(CVS\s6074)
+D 2008-12-30T06:24:58
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 77635d0909c2067cee03889a1e04ce910d8fb809
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -106,7 +106,7 @@ F src/btmutex.c 63c5cc4ad5715690767ffcb741e185d7bc35ec1a
 F src/btree.c 581fdccd7b6539a8e37e843f9b45e0557b3b272f
 F src/btree.h 4f141cf748d2ee7c6d7fc175f64f87a45cd44113
 F src/btreeInt.h 8fea5cd7021cb8848fc2183a3e909469659daa0a
-F src/build.c 92335a6c6a7c119580be605c5dd1439602d6cf5d
+F src/build.c 6eb9d20e99db8da8c7c6e7316096a6ff3d9acab9
 F src/callback.c bee8949d619b1b7b1e4dfac8a19c5116ae1dd12a
 F src/complete.c cb14e06dbe79dee031031f0d9e686ff306afe07c
 F src/date.c e010095d85c895761627bb1d0d61d021aea930a9
@@ -156,13 +156,13 @@ F src/resolve.c 18dc9f0df1d60048e012ce6632251063e0dd356a
 F src/rowset.c 2256fa4a928f750e2f3d6fc733523034beceb1d6
 F src/select.c 6c2a5675c21bef11d8160f3dc97e1adfbf26bbb9
 F src/shell.c 65d19f8996a160f288087e31810f24025439c62a
-F src/sqlite.h.in 065a828e299960316aa34f05b9f0f10f33afe4c8
+F src/sqlite.h.in 6cd2489e40fe97ba58c60044a4ced377e08b6d09
 F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17
 F src/sqliteInt.h 85c72545ac3195bb7d9aefc8377f91123594c59c
 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
 F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
 F src/table.c 23db1e5f27c03160987c122a078b4bb51ef0b2f8
-F src/tclsqlite.c 23afb60549af943e135ded441a631f4745be6040
+F src/tclsqlite.c 9368e617bf2fe08a7b6659695190ce844c77f251
 F src/test1.c b193b8b80617bdb8297b25a87d00ee8d5a125d0d
 F src/test2.c 4e0ea288e1cf237f8ff26c8817f177f45486f4a6
 F src/test3.c 88a246b56b824275300e6c899634fbac1dc94b14
@@ -492,7 +492,7 @@ F test/rollback.test 1f70ab4301d8d105d41438a436cad1fc8897f5e5
 F test/rowid.test 1c8fc43c60d273e6ea44dfb992db587f3164312c
 F test/rtree.test b85fd4f0861a40ca366ac195e363be2528dcfadf
 F test/safety.test b69e2b2dd5d52a3f78e216967086884bbc1a09c6
-F test/savepoint.test d00fe3f82773266410799aad0080426a6a936170
+F test/savepoint.test 101110d042aa75adc03180a72657169a8130bd6f
 F test/savepoint2.test 18f6c75d5c133b93838019df8988b8cdf379d3de
 F test/savepoint3.test b3c9aa5af3f777ccb8b9e15597c75c93eb5bc369
 F test/savepoint4.test fd8850063e3c40565545f5c291e7f79a30591670
@@ -687,7 +687,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P bff460ec2c3e250de034a6b34312b897bb2f3749
-R afbea31e7a0f278c532ea02b4a243218
-U drh
-Z 376ed48aa5f636301a1d1f6a2a793394
+P 7d0ae55d6b2d263382f034eb89bbc368fab6a9bc
+R 0029351649470f099a0d82a5898affa5
+U danielk1977
+Z f7cc52010ee047c3a039ac822acff19b
index 6c809a260ba2b6cd2049344b6d8ed223ce98dfd2..075d28957a5c12cb903da0fccd21df5ba6435390 100644 (file)
@@ -1 +1 @@
-7d0ae55d6b2d263382f034eb89bbc368fab6a9bc
\ No newline at end of file
+e49807b16f7f86d3f2290d6c1f7562f3db6330f9
\ No newline at end of file
index 25aff4fe355d90fe454f043a372f3ebf37f06087..c61fbb340d67a096bb4fb89f07a86b4a1a68e977 100644 (file)
@@ -22,7 +22,7 @@
 **     COMMIT
 **     ROLLBACK
 **
-** $Id: build.c,v 1.510 2008/12/23 11:11:51 danielk1977 Exp $
+** $Id: build.c,v 1.511 2008/12/30 06:24:58 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -3316,15 +3316,18 @@ void sqlite3RollbackTransaction(Parse *pParse){
 ** release or rollback an SQL savepoint. 
 */
 void sqlite3Savepoint(Parse *pParse, int op, Token *pName){
-  Vdbe *v;
-  if( pParse->nErr || pParse->db->mallocFailed ) return;
-
-  /* TODO: Invoke the authorization callback */
-
-  v = sqlite3GetVdbe(pParse);
-  if( v ){
-    const char *zName = (const char *)pName->z;
-    sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, pName->n);
+  char *zName = sqlite3NameFromToken(pParse->db, pName);
+  if( zName ){
+    Vdbe *v = sqlite3GetVdbe(pParse);
+#ifndef SQLITE_OMIT_AUTHORIZATION
+    static const char *az[] = { "BEGIN", "RELEASE", "ROLLBACK" };
+    assert( !SAVEPOINT_BEGIN && SAVEPOINT_RELEASE==1 && SAVEPOINT_ROLLBACK==2 );
+#endif
+    if( !v || sqlite3AuthCheck(pParse, SQLITE_SAVEPOINT, az[op], zName, 0) ){
+      sqlite3DbFree(pParse->db, zName);
+      return;
+    }
+    sqlite3VdbeAddOp4(v, OP_Savepoint, op, 0, 0, zName, P4_DYNAMIC);
   }
 }
 
index 9970d7b1b51c83a902b5a8ad9f3dd1b7338cfdab..e0a9eb132bbcda21bd0b2ca0d6ad1e791c9bab64 100644 (file)
@@ -30,7 +30,7 @@
 ** the version number) and changes its name to "sqlite3.h" as
 ** part of the build process.
 **
-** @(#) $Id: sqlite.h.in,v 1.420 2008/12/16 13:46:30 drh Exp $
+** @(#) $Id: sqlite.h.in,v 1.421 2008/12/30 06:24:58 danielk1977 Exp $
 */
 #ifndef _SQLITE3_H_
 #define _SQLITE3_H_
@@ -2397,7 +2397,7 @@ int sqlite3_set_authorizer(
 #define SQLITE_PRAGMA               19   /* Pragma Name     1st arg or NULL */
 #define SQLITE_READ                 20   /* Table Name      Column Name     */
 #define SQLITE_SELECT               21   /* NULL            NULL            */
-#define SQLITE_TRANSACTION          22   /* NULL            NULL            */
+#define SQLITE_TRANSACTION          22   /* Operation       NULL            */
 #define SQLITE_UPDATE               23   /* Table Name      Column Name     */
 #define SQLITE_ATTACH               24   /* Filename        NULL            */
 #define SQLITE_DETACH               25   /* Database Name   NULL            */
@@ -2407,6 +2407,7 @@ int sqlite3_set_authorizer(
 #define SQLITE_CREATE_VTABLE        29   /* Table Name      Module Name     */
 #define SQLITE_DROP_VTABLE          30   /* Table Name      Module Name     */
 #define SQLITE_FUNCTION             31   /* NULL            Function Name   */
+#define SQLITE_SAVEPOINT            32   /* Operation       Savepoint Name  */
 #define SQLITE_COPY                  0   /* No longer used */
 
 /*
index 5541b0c766ce797252b276d56ada239c4ee5d87b..e3fd44c1a0d73f460c60417fcdb403f29b8a13a2 100644 (file)
@@ -12,7 +12,7 @@
 ** A TCL Interface to SQLite.  Append this file to sqlite3.c and
 ** compile the whole thing to build a TCL-enabled version of SQLite.
 **
-** $Id: tclsqlite.c,v 1.231 2008/12/10 22:18:40 drh Exp $
+** $Id: tclsqlite.c,v 1.232 2008/12/30 06:24:58 danielk1977 Exp $
 */
 #include "tcl.h"
 #include <errno.h>
@@ -809,6 +809,7 @@ static int auth_callback(
     case SQLITE_CREATE_VTABLE     : zCode="SQLITE_CREATE_VTABLE"; break;
     case SQLITE_DROP_VTABLE       : zCode="SQLITE_DROP_VTABLE"; break;
     case SQLITE_FUNCTION          : zCode="SQLITE_FUNCTION"; break;
+    case SQLITE_SAVEPOINT         : zCode="SQLITE_SAVEPOINT"; break;
     default                       : zCode="????"; break;
   }
   Tcl_DStringInit(&str);
index 17aefccdaf3525f3185ed2b915d3f789941d491c..19ff9883c3f8ae711cb1b005d79c13b9f69e6477 100644 (file)
@@ -9,7 +9,7 @@
 #
 #***********************************************************************
 #
-# $Id: savepoint.test,v 1.4 2008/12/27 15:23:13 danielk1977 Exp $
+# $Id: savepoint.test,v 1.5 2008/12/30 06:24:58 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -467,6 +467,65 @@ do_test savepoint-7.4.1 {
   execsql { PRAGMA integrity_check }
 } {ok}
 
+# Test oddly named and quoted savepoints.
+#
+do_test savepoint-8-1 {
+  execsql { SAVEPOINT "save1" }
+  execsql { RELEASE save1 }
+} {}
+do_test savepoint-8-2 {
+  execsql { SAVEPOINT "Including whitespace " }
+  execsql { RELEASE "including Whitespace " }
+} {}
+
+# Test that the authorization callback works.
+#
+ifcapable auth {
+  proc auth {args} {
+    eval lappend ::authdata $args
+    return SQLITE_OK
+  }
+  db auth auth
+
+  do_test savepoint-9.1 {
+    set ::authdata [list]
+    execsql { SAVEPOINT sp1 }
+    set ::authdata
+  } {SQLITE_SAVEPOINT BEGIN sp1 {} {}}
+  do_test savepoint-9.2 {
+    set ::authdata [list]
+    execsql { ROLLBACK TO sp1 }
+    set ::authdata
+  } {SQLITE_SAVEPOINT ROLLBACK sp1 {} {}}
+  do_test savepoint-9.3 {
+    set ::authdata [list]
+    execsql { RELEASE sp1 }
+    set ::authdata
+  } {SQLITE_SAVEPOINT RELEASE sp1 {} {}}
+
+  proc auth {args} {
+    eval lappend ::authdata $args
+    return SQLITE_DENY
+  }
+  db auth auth
+
+  do_test savepoint-9.4 {
+    set ::authdata [list]
+    set res [catchsql { SAVEPOINT sp1 }]
+    concat $::authdata $res
+  } {SQLITE_SAVEPOINT BEGIN sp1 {} {} 1 {not authorized}}
+  do_test savepoint-9.5 {
+    set ::authdata [list]
+    set res [catchsql { ROLLBACK TO sp1 }]
+    concat $::authdata $res
+  } {SQLITE_SAVEPOINT ROLLBACK sp1 {} {} 1 {not authorized}}
+  do_test savepoint-9.6 {
+    set ::authdata [list]
+    set res [catchsql { RELEASE sp1 }]
+    concat $::authdata $res
+  } {SQLITE_SAVEPOINT RELEASE sp1 {} {} 1 {not authorized}}
+
+}
 
 
 finish_test