mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
Fix a problem that restricted edgy functions in TEMP tables.
New test cases added. FossilOrigin-Name: 8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d
This commit is contained in:
16
manifest
16
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
|
||||
|
||||
@@ -1 +1 @@
|
||||
da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398
|
||||
8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user