]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem that restricted edgy functions in TEMP tables.
authordrh <drh@noemail.net>
Thu, 9 Jan 2020 01:20:03 +0000 (01:20 +0000)
committerdrh <drh@noemail.net>
Thu, 9 Jan 2020 01:20:03 +0000 (01:20 +0000)
New test cases added.

FossilOrigin-Name: 8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d

manifest
manifest.uuid
src/resolve.c
src/sqliteInt.h
test/trustschema1.test

index c99f7e7da30ba736e1d421140a70c2c16e72da16..2544b8cd3dd219227557d3979cffa55bd3fe9574 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Block\sedgy\sfunctions\sused\sin\sDEFAULT\sconstraints.
-D 2020-01-08T22:22:36.071
+C Fix\sa\sproblem\sthat\srestricted\sedgy\sfunctions\sin\sTEMP\stables.\nNew\stest\scases\sadded.
+D 2020-01-09T01:20:03.116
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -527,14 +527,14 @@ F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd
 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
-F src/resolve.c 06abaef6272a4f0da048a1728b039a4f0beb318bda4bdc0efca89cb6af3b4f88
+F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
 F src/select.c fbae5d6db63959aa1ecb34efe93caf5399444ca3c78d6f1ef4620b0ee5c37707
 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f
 F src/sqlite.h.in 06452043348e35cf6108345a35574a2faa4d1c2829beefb1e73c73d6bfb2fa80
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
-F src/sqliteInt.h 0ca99e207087851fd27c6e1314fc52d273caa424ff2bafa3f1daf6d5eb63b35a
+F src/sqliteInt.h ee242902766f9a96aeaca4315dbe1e204bbb2954cd455ffa085bba84fa47956b
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -1592,7 +1592,7 @@ F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d
 F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
 F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499
-F test/trustschema1.test aec32a37ef8468aa6f8e5645cdd22c6ff70e0cddfff39d70de5683c67a2c0091
+F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494
 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1
 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a
 F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9
@@ -1855,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54
-R 2d6bd4faf1a02c29990cd0df461c78ad
+P da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398
+R 5d23da58c4e26d6a3869b8997dbb1f9d
 U drh
-Z 9253d4aa29f3b6b8cb96462d5b434aa9
+Z 2a63c0c342c8804a0df9ef8a4a5f7519
index 640d9dc50ce56798393122b8f4df1bce8ff24380..e7e1532d0f8b7bf8f889ce54130e52804ee99f90 100644 (file)
@@ -1 +1 @@
-da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398
\ No newline at end of file
+8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d
\ No newline at end of file
index cfdbc569fd506a623dcc604b28efa2034c720610..3e5ac16e2ed1c628c076f8c5a65aaf52f6f239f7 100644 (file)
@@ -876,7 +876,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
         }else{
           assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */
           pExpr->op2 = pNC->ncFlags & NC_SelfRef;
-          if( pExpr->op2 ) ExprSetProperty(pExpr, EP_FromDDL);
+          if( pNC->ncFlags & NC_FromDDL ) ExprSetProperty(pExpr, EP_FromDDL);
         }
         if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0
          && pParse->nested==0
@@ -1884,6 +1884,11 @@ int sqlite3ResolveSelfReference(
     sSrc.a[0].zName = pTab->zName;
     sSrc.a[0].pTab = pTab;
     sSrc.a[0].iCursor = -1;
+    if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){
+      /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP
+      ** schema elements */
+      type |= NC_FromDDL;
+    }
   }
   sNC.pParse = pParse;
   sNC.pSrcList = &sSrc;
index e56a4b3d5444d669129e685d9cf281e89c828e5f..14c17a42e6b6e9eb46d722d4fbe925c5dd36f97e 100644 (file)
@@ -2968,6 +2968,7 @@ struct NameContext {
 #define NC_HasWin    0x08000  /* One or more window functions seen */
 #define NC_IsDDL     0x10000  /* Resolving names in a CREATE statement */
 #define NC_InAggFunc 0x20000  /* True if analyzing arguments to an agg func */
+#define NC_FromDDL   0x40000  /* SQL text comes from sqlite_master */
 
 /*
 ** An instance of the following object describes a single ON CONFLICT
index 1d8b5f924eb62aece6da4097136468d214fbc5d5..dba954f1467d04cda3bdbd286102a072ef94b1fd 100644 (file)
@@ -17,7 +17,8 @@ set testdir [file dirname $argv0]
 source $testdir/tester.tcl
 set testprefix trustschema1
 
-
+# edgy functions used in generated columns
+#
 proc f1 {x} {return $x}
 do_test 1.100 {
   db function f1 -innocuous -deterministic f1
@@ -40,8 +41,22 @@ do_catchsql_test 1.130 {
 do_catchsql_test 1.140 {
   SELECT a, b, c FROM t1;
 } {1 {unsafe use of f2()}}
+do_catchsql_test 1.150 {
+  PRAGMA trusted_schema=ON;
+  DROP TABLE t1;
+  CREATE TABLE t1(a, b AS (f3(a+1)));
+} {1 {unsafe use of f3()}}
+do_execsql_test 1.160 {
+  PRAGMA trusted_schema=OFF;
+  CREATE TEMP TABLE temp1(a,b AS (f3(a+1)));
+  INSERT INTO temp1(a) VALUES(100),(900);
+  SELECT * FROM temp1;
+} {100 101 900 901}
 
+# edgy functions used in CHECK constraints
+#
 do_catchsql_test 1.200 {
+  PRAGMA trusted_schema=ON;
   CREATE TABLE t2(a,b,c,CHECK(f3(c)==c));
 } {1 {unsafe use of f3()}}
 do_catchsql_test 1.210 {
@@ -63,7 +78,17 @@ do_catchsql_test 1.230 {
 do_execsql_test 1.231 {
   SELECT * FROM t2;
 } {1 2 3}
+# Ok to put as many edgy functions as you want in a
+# TEMP table.
+do_execsql_test 1.240 {
+  PRAGMA trusted_schema=OFF;
+  CREATE TEMP TABLE temp2(a, b, CHECK(f3(b)==b));
+  INSERT INTO temp2(a,b) VALUES(1,2),('x','y');
+  SELECT * FROM temp2;
+} {1 2 x y}
 
+# edgy functions used in DEFAULT constraints
+#
 do_catchsql_test 1.300 {
   CREATE TABLE t3(a,b DEFAULT(f2(25)));
 } {0 {}}
@@ -74,5 +99,153 @@ do_catchsql_test 1.310 {
 do_catchsql_test 1.311 {
   INSERT INTO t3(a,b) VALUES(1,2);
 } {0 {}}
+do_execsql_test 1.320 {
+  CREATE TEMP TABLE temp3(a, b DEFAULT(f3(31)));
+  INSERT INTO temp3(a) VALUES(22);
+  SELECT * FROM temp3;
+} {22 31}
+
+# edgy functions used in partial indexes.
+#
+do_execsql_test 1.400 {
+  CREATE TABLE t4(a,b,c);
+  INSERT INTO t4 VALUES(1,2,3),('a','b','c'),(4,'d',0);
+  SELECT * FROM t4;
+  CREATE TEMP TABLE temp4(a,b,c);
+  INSERT INTO temp4 SELECT * FROM t4;
+} {1 2 3 a b c 4 d 0}
+do_catchsql_test 1.410 {
+  CREATE INDEX t4a ON t4(a) WHERE f3(c);
+} {1 {unsafe use of f3()}}
+do_catchsql_test 1.420 {
+  PRAGMA trusted_schema=OFF;
+  CREATE INDEX t4a ON t4(a) WHERE f2(c);
+} {1 {unsafe use of f2()}}
+do_execsql_test 1.421 {
+  CREATE INDEX t4a ON t4(a) WHERE f1(c);
+  SELECT a FROM t4 WHERE f1(c) ORDER BY a;
+} {1}
+do_execsql_test 1.430 {
+  PRAGMA trusted_schema=ON;
+  CREATE INDEX t4b ON t4(b) WHERE f2(c);
+  SELECT b FROM t4 WHERE f2(c) ORDER BY b;
+} {2}
+do_execsql_test 1.440 {
+  PRAGMA trusted_schema=OFF;
+  CREATE INDEX temp4a ON temp4(a) WHERE f3(c);
+  SELECT a FROM temp4 WHERE f2(c) ORDER BY a;
+} {1}
+
+# edgy functions used in index expressions
+#
+do_execsql_test 1.500 {
+  CREATE TABLE t5(a,b,c);
+  INSERT INTO t5 VALUES(1,2,3),(4,5,6),(7,0,-3);
+  SELECT * FROM t5;
+  CREATE TEMP TABLE temp5(a,b,c);
+  INSERT INTO temp5 SELECT * FROM t5;
+} {1 2 3 4 5 6 7 0 -3}
+do_catchsql_test 1.510 {
+  CREATE INDEX t5x1 ON t5(a+f3(b));
+} {1 {unsafe use of f3()}}
+do_catchsql_test 1.520 {
+  PRAGMA trusted_schema=OFF;
+  CREATE INDEX t5x1 ON t5(a+f2(b));
+} {1 {unsafe use of f2()}}
+do_execsql_test 1.521 {
+  CREATE INDEX t5x1 ON t5(a+f1(b));
+  SELECT * FROM t5 INDEXED BY t5x1 WHERE a+f1(b)=3;
+} {1 2 3}
+do_execsql_test 1.530 {
+  PRAGMA trusted_schema=ON;
+  CREATE INDEX t5x2 ON t5(b+f2(c));
+  SELECT * FROM t5 INDEXED BY t5x2 WHERE b+f2(c)=11;
+} {4 5 6}
+do_execsql_test 1.540 {
+  PRAGMA trusted_schema=OFF;
+  CREATE INDEX temp5x1 ON temp5(a+f3(b));
+  SELECT * FROM temp5 INDEXED BY temp5x1 WHERE a+f3(b)=7;
+} {7 0 -3}
+
+# edgy functions in VIEWs
+#
+reset_db
+db function f1 -innocuous -deterministic f1
+db function f2 -deterministic f1
+db function f3 -directonly -deterministic f1
+do_execsql_test 2.100 {
+  CREATE TABLE t1(a,b,c);
+  INSERT INTO t1 VALUES(1,2,3),(100,50,75),(-11,22,-33);
+  CREATE VIEW v1a AS SELECT f3(a+b) FROM t1;
+  SELECT f3(a+b) FROM t1;
+} {3 150 11}
+do_catchsql_test 2.110 {
+  PRAGMA trusted_schema=ON;
+  SELECT * FROM v1a;
+} {1 {unsafe use of f3()}}
+do_catchsql_test 2.111 {
+  PRAGMA trusted_schema=OFF;
+  SELECT * FROM v1a;
+} {1 {unsafe use of f3()}}
+do_execsql_test 2.120 {
+  DROP VIEW v1a;
+  CREATE TEMP VIEW v1a AS SELECT f3(a+b) FROM t1;
+  SELECT * FROM v1a;
+} {3 150 11}
+do_execsql_test 2.130 {
+  CREATE VIEW v1b AS SELECT f2(b+c) FROM t1;
+  SELECT f2(b+c) FROM t1;
+} {5 125 -11}
+do_catchsql_test 2.140 {
+  PRAGMA trusted_schema=ON;
+  SELECT * FROM v1b;
+} {0 {5 125 -11}}
+do_catchsql_test 2.141 {
+  PRAGMA trusted_schema=OFF;
+  SELECT * FROM v1b;
+} {1 {unsafe use of f2()}}
+do_execsql_test 2.150 {
+  DROP VIEW v1b;
+  CREATE TEMP VIEW v1b AS SELECT f2(b+c) FROM t1;
+  SELECT * FROM v1b;
+} {5 125 -11}
+
+# edgy functions inside of triggers
+#
+do_execsql_test 3.100 {
+  DELETE FROM t1;
+  CREATE TABLE t2(x);
+  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
+    INSERT INTO t2(x) SELECT f3(new.a);
+  END;
+} {}
+do_catchsql_test 3.110 {
+  INSERT INTO t1 VALUES(7,6,5);
+} {1 {unsafe use of f3()}}
+do_execsql_test 3.111 {
+  SELECT * FROM t1;
+  SELECT * FROM t2;
+} {}
+
+do_execsql_test 3.120 {
+  DROP TRIGGER r1;
+  CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
+    INSERT INTO t2(x) SELECT f2(new.a)+100;
+  END;
+  PRAGMA trusted_schema=ON;
+  INSERT INTO t1 VALUES(7,6,5);
+  SELECT * FROM t1, t2;
+} {7 6 5 107}
+do_catchsql_test 3.130 {
+  DELETE FROM t1;
+  DELETE FROM t2;
+  PRAGMA trusted_schema=OFF;
+  INSERT INTO t1 VALUES(7,6,5);
+} {1 {unsafe use of f2()}}
+do_execsql_test 3.131 {
+  SELECT * FROM t1;
+  SELECT * FROM t2;
+} {}
+
 
 finish_test