1
0
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:
drh
2020-01-09 01:20:03 +00:00
parent 014fff20ad
commit 05b32ee3c0
5 changed files with 190 additions and 11 deletions

View File

@@ -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

View File

@@ -1 +1 @@
da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398
8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d

View 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;

View 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

View 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