mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
When UNSAFE_IN_VIEW is disabled, only allow functions in views that are
tagged with SQLITE_INNOCUOUS. FossilOrigin-Name: 9ee79b254e4c51a2a41f7ed49ad389d8d7105e649483adb79772052fa0ade3c0
This commit is contained in:
18
manifest
18
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Merge\sfixes\sfrom\strunk.
|
C When\sUNSAFE_IN_VIEW\sis\sdisabled,\sonly\sallow\sfunctions\sin\sviews\sthat\sare\ntagged\swith\sSQLITE_INNOCUOUS.
|
||||||
D 2020-01-03T15:22:54.803
|
D 2020-01-03T20:57:38.480
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -492,7 +492,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
|
|||||||
F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11
|
F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11
|
||||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||||
F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da
|
F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da
|
||||||
F src/main.c 939e0ff163bd4c96362f7c81be98a8d7a043d1bf1eb250ea7119d39c27d6c5ac
|
F src/main.c 2dfc4695d00025100e9a2cf908afb2a3fce5ee067c52ddad1cf835d3a3d5aae1
|
||||||
F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5
|
F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5
|
||||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||||
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
||||||
@@ -526,14 +526,14 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04
|
|||||||
F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
|
F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
|
||||||
F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
|
F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
|
||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 3868d75d4bbf8e7d3c78b9cd9c8ec5b483d004cf671a35ee2f18e5ed907d4bde
|
F src/resolve.c 70eda312d1044b4375ad78b8515ee2f638a8a61f5e71ec073ae99a73ba846bef
|
||||||
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
|
||||||
F src/select.c 64bf450dc0f2b37be8d2be6ff7d25a70de37ef6fb64527c68f767fe9fe47bc55
|
F src/select.c 64bf450dc0f2b37be8d2be6ff7d25a70de37ef6fb64527c68f767fe9fe47bc55
|
||||||
F src/shell.c.in 69462c95793d69a16df93deabbd6d026f5f6ef6c87d9da54ed1477c03490d17b
|
F src/shell.c.in 69462c95793d69a16df93deabbd6d026f5f6ef6c87d9da54ed1477c03490d17b
|
||||||
F src/sqlite.h.in efaecabd038dc30282f243af087c4960e528d0df25a05f90f988435fec5ef779
|
F src/sqlite.h.in 7f3178430f94f30a105bbaa6ed3ff44c9a16784d3d7783e306c0b9dd735ba599
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
|
F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
|
||||||
F src/sqliteInt.h a45a681d64b1f86e8baac511d81e7ac11825efb929081ae75601391a9e4e2e7d
|
F src/sqliteInt.h 0ba7721a5fb78f1700284a48583d62279f8d890bb63477e7f45fb7297726d087
|
||||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||||
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 091403a6705f5f1352c76eacbfdca75fe0bab12ab9b156842641de07c38d3f66 536e9a9d1bd514056ecbc8172ed58f2656a86f791a15e526ae2e5f2c93687b6a
|
P 002406df22995880d002be2e4cebb4d560283d4e0d7a4b5a34edcb110802b543
|
||||||
R 9513c96f193ce58d39e33f5bdd19fac1
|
R ffbc2f459e8917962197eed185bd6b4a
|
||||||
U drh
|
U drh
|
||||||
Z 07648178e3cddd9499b97db1756ee9dd
|
Z d68f1f3db35645e195a57ca8b6527579
|
||||||
|
@@ -1 +1 @@
|
|||||||
002406df22995880d002be2e4cebb4d560283d4e0d7a4b5a34edcb110802b543
|
9ee79b254e4c51a2a41f7ed49ad389d8d7105e649483adb79772052fa0ade3c0
|
@@ -1760,7 +1760,9 @@ int sqlite3CreateFunc(
|
|||||||
|
|
||||||
assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC );
|
assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC );
|
||||||
assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY );
|
assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY );
|
||||||
extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|SQLITE_SUBTYPE);
|
assert( SQLITE_FUNC_SAFE==SQLITE_INNOCUOUS );
|
||||||
|
extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|
|
||||||
|
SQLITE_SUBTYPE|SQLITE_INNOCUOUS);
|
||||||
enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY);
|
enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY);
|
||||||
|
|
||||||
#ifndef SQLITE_OMIT_UTF16
|
#ifndef SQLITE_OMIT_UTF16
|
||||||
|
@@ -866,16 +866,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
** constant because they are constant for the duration of one query.
|
** constant because they are constant for the duration of one query.
|
||||||
** This allows them to be factored out of inner loops. */
|
** This allows them to be factored out of inner loops. */
|
||||||
ExprSetProperty(pExpr,EP_ConstFunc);
|
ExprSetProperty(pExpr,EP_ConstFunc);
|
||||||
}else{
|
|
||||||
if( ExprHasProperty(pExpr, EP_Indirect)
|
|
||||||
&& !IN_RENAME_OBJECT
|
|
||||||
&& (pParse->db->flags & SQLITE_UnsafeInView)==0
|
|
||||||
){
|
|
||||||
/* If SQLITE_DBCONFIG_UNSAFE_IN_VIEW is off, then functions with
|
|
||||||
** side effects are not allowed inside triggers and views. */
|
|
||||||
sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views",
|
|
||||||
pDef->zName);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){
|
if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){
|
||||||
/* Date/time functions that use 'now', and other functions like
|
/* Date/time functions that use 'now', and other functions like
|
||||||
@@ -896,16 +886,24 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
no_such_func = 1;
|
no_such_func = 1;
|
||||||
pDef = 0;
|
pDef = 0;
|
||||||
}else
|
}else
|
||||||
if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0
|
if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_SAFE))
|
||||||
|
!= SQLITE_FUNC_SAFE
|
||||||
&& ExprHasProperty(pExpr, EP_Indirect)
|
&& ExprHasProperty(pExpr, EP_Indirect)
|
||||||
&& !IN_RENAME_OBJECT
|
&& !IN_RENAME_OBJECT
|
||||||
){
|
){
|
||||||
/* Functions tagged with SQLITE_DIRECTONLY may not be used
|
if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0
|
||||||
** inside of triggers and views */
|
|| (pParse->db->flags & SQLITE_UnsafeInView)==0
|
||||||
|
){
|
||||||
|
/* Functions prohibited in triggers and views if:
|
||||||
|
** (1) tagged with SQLITE_DIRECTONLY
|
||||||
|
** (2) not tagged with SQLITE_INNOCUOUS and
|
||||||
|
** SQLITE_DBCONFIG_UNSAFE_IN_VIEW is off
|
||||||
|
*/
|
||||||
sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views",
|
sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views",
|
||||||
pDef->zName);
|
pDef->zName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( 0==IN_RENAME_OBJECT ){
|
if( 0==IN_RENAME_OBJECT ){
|
||||||
#ifndef SQLITE_OMIT_WINDOWFUNC
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|
@@ -5025,12 +5025,26 @@ int sqlite3_create_window_function(
|
|||||||
** [sqlite3_create_function_v2()].
|
** [sqlite3_create_function_v2()].
|
||||||
**
|
**
|
||||||
** The SQLITE_DETERMINISTIC flag means that the new function always gives
|
** The SQLITE_DETERMINISTIC flag means that the new function always gives
|
||||||
** the same output when the input parameters are the same. The abs() function
|
** the same output when the input parameters are the same.
|
||||||
** is deterministic, for example, but randomblob() is not. Functions must
|
** The [abs|abs() function] is deterministic, for example, but
|
||||||
|
** [randomblob|randomblob()] is not. Functions must
|
||||||
** be deterministic in order to be used in certain contexts such as
|
** be deterministic in order to be used in certain contexts such as
|
||||||
** [CHECK constraints] or [generated columns]. SQLite might also optimize
|
** [CHECK constraints] or [generated columns]. SQLite might also optimize
|
||||||
** deterministic functions by factoring them out of inner loops.
|
** deterministic functions by factoring them out of inner loops.
|
||||||
**
|
**
|
||||||
|
** The SQLITE_INNOCUOUS flag means that the new function is unlikely
|
||||||
|
** to cause problems even if misused. An innocuous function should have
|
||||||
|
** no side effects and consume few resources. The [abs|abs() function]
|
||||||
|
** is an example of an innocuous function.
|
||||||
|
** The [load_extension() SQL function] is not innocuous because of its
|
||||||
|
** side effects. Some heightened security settings
|
||||||
|
** ([SQLITE_DBCONFIG_UNSAFE_FUNC_IN_VIEW])
|
||||||
|
** disable the use of SQLlfunctions inside views and triggers unless
|
||||||
|
** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions
|
||||||
|
** are innocuous. Developers are advised to avoid using the
|
||||||
|
** SQLITE_INNOCUOUS flag for application-defined functions unless the
|
||||||
|
** function is specifically intended for use inside of views and triggers.
|
||||||
|
**
|
||||||
** The SQLITE_DIRECTONLY flag means that the function may only be invoked
|
** The SQLITE_DIRECTONLY flag means that the function may only be invoked
|
||||||
** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. This is
|
** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. This is
|
||||||
** a security feature which is recommended for all
|
** a security feature which is recommended for all
|
||||||
@@ -5050,6 +5064,7 @@ int sqlite3_create_window_function(
|
|||||||
#define SQLITE_DETERMINISTIC 0x000000800
|
#define SQLITE_DETERMINISTIC 0x000000800
|
||||||
#define SQLITE_DIRECTONLY 0x000080000
|
#define SQLITE_DIRECTONLY 0x000080000
|
||||||
#define SQLITE_SUBTYPE 0x000100000
|
#define SQLITE_SUBTYPE 0x000100000
|
||||||
|
#define SQLITE_INNOCUOUS 0x000200000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Deprecated Functions
|
** CAPI3REF: Deprecated Functions
|
||||||
|
@@ -1740,6 +1740,7 @@ struct FuncDestructor {
|
|||||||
** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG
|
** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG
|
||||||
** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API
|
** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API
|
||||||
** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API
|
** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API
|
||||||
|
** SQLITE_FUNC_SAFE == SQLITE_INNOCUOUS
|
||||||
** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API
|
** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API
|
||||||
*/
|
*/
|
||||||
#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */
|
#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */
|
||||||
@@ -1762,7 +1763,11 @@ struct FuncDestructor {
|
|||||||
#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */
|
#define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */
|
||||||
#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */
|
#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */
|
||||||
#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */
|
#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */
|
||||||
#define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */
|
#define SQLITE_FUNC_SAFE 0x00200000 /* Function has no side effects */
|
||||||
|
#define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */
|
||||||
|
|
||||||
|
/* Combination flags */
|
||||||
|
#define SQLITE_FUNC_PURE (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SAFE)
|
||||||
|
|
||||||
/* Identifier numbers for each in-line function */
|
/* Identifier numbers for each in-line function */
|
||||||
#define INLINEFUNC_coalesce 0
|
#define INLINEFUNC_coalesce 0
|
||||||
@@ -1836,7 +1841,7 @@ struct FuncDestructor {
|
|||||||
** parameter.
|
** parameter.
|
||||||
*/
|
*/
|
||||||
#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
||||||
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
{nArg, SQLITE_FUNC_PURE|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
||||||
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
||||||
{nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
{nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
||||||
@@ -1845,26 +1850,27 @@ struct FuncDestructor {
|
|||||||
{nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \
|
{nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \
|
||||||
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define INLINE_FUNC(zName, nArg, iArg, mFlags) \
|
#define INLINE_FUNC(zName, nArg, iArg, mFlags) \
|
||||||
{nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
|
{nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_PURE|(mFlags), \
|
||||||
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define TEST_FUNC(zName, nArg, iArg, mFlags) \
|
#define TEST_FUNC(zName, nArg, iArg, mFlags) \
|
||||||
{nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \
|
{nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \
|
||||||
SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \
|
SQLITE_FUNC_INLINE|(mFlags), \
|
||||||
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \
|
||||||
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \
|
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_FUNC_SAFE|SQLITE_UTF8, \
|
||||||
0, 0, xFunc, 0, 0, 0, #zName, {0} }
|
0, 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \
|
#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \
|
||||||
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \
|
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_PURE, \
|
||||||
(void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} }
|
(void*)&sqlite3Config, 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \
|
#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \
|
||||||
{nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\
|
{nArg,SQLITE_FUNC_PURE|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\
|
||||||
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
|
#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
|
||||||
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_FUNC_SAFE| \
|
||||||
|
SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
||||||
pArg, 0, xFunc, 0, 0, 0, #zName, }
|
pArg, 0, xFunc, 0, 0, 0, #zName, }
|
||||||
#define LIKEFUNC(zName, nArg, arg, flags) \
|
#define LIKEFUNC(zName, nArg, arg, flags) \
|
||||||
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \
|
{nArg, SQLITE_FUNC_PURE|SQLITE_UTF8|flags, \
|
||||||
(void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} }
|
(void *)arg, 0, likeFunc, 0, 0, 0, #zName, {0} }
|
||||||
#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \
|
#define WAGGREGATE(zName, nArg, arg, nc, xStep, xFinal, xValue, xInverse, f) \
|
||||||
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \
|
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|f, \
|
||||||
|
Reference in New Issue
Block a user