Allow the iif() function to work with two arguments. The third argument is

then assumed to be NULL.  Also allow if() as an alternative spelling for iif().

FossilOrigin-Name: 1e405c39a8405e2081ce061559d1aacc70055fc74ab86d886b973076a3fb124b
This commit is contained in:
drh
2024-11-26 23:40:54 +00:00
6 changed files with 61 additions and 15 deletions
+11 -11
View File
@@ -1,5 +1,5 @@
C Update\sfts5\sso\sthat\sthe\sxInstToken()\sextension\sAPI\sworks\swith\sprefix\squeries.
D 2024-11-26T20:46:18.270
C Allow\sthe\siif()\sfunction\sto\swork\swith\stwo\sarguments.\s\sThe\sthird\sargument\sis\nthen\sassumed\sto\sbe\sNULL.\s\sAlso\sallow\sif()\sas\san\salternative\sspelling\sfor\siif().
D 2024-11-26T23:40:54.327
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -729,7 +729,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
F src/expr.c a9d9f5fdfbdd3b2c94d7af1b11f181464b8a641736cf32cb92fa3c5e7ecb30df
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
F src/func.c fa138d44348e189817542f6efa6232420b3e0081c835ced65883adc7fd777d65
F src/func.c 49489dcce46d2d491cedb451e974264150c473e5f5bba448498a9aa4c1993537
F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b
F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
@@ -1102,7 +1102,7 @@ F test/e_createtable.test 31b9bcb6ac8876bc7ec342d86d9c231a84c62b442093a6651dfd0f
F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e
F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa
F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7
F test/e_expr.test b950818a48269506d75a41c819003bd77a0893bc4a4f2fdee191bc74109c1a87
F test/e_expr.test 4faef475076f676e2a009270dbd3a7658db30d12dc3d21e4b85cab5f50be18c5
F test/e_fkey.test feeba6238aeff9d809fb6236b351da8df4ae9bda89e088e54526b31a0cbfeec5
F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07
F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e
@@ -1380,7 +1380,7 @@ F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb9
F test/json/json-speed-check.sh 912ee03e700a65c827ee0c7b4752c21ec5ef69cf7679d2f482ca817042bead52 x
F test/json/jsonb-q1.txt 1e180fe6491efab307e318b22879e3a736ac9a96539bbde7911a13ee5b33abc7
F test/json101.test 30db5b055b103ccabc53a29cfe6cda3345d07e171aeb25403dafa04f19e98b19
F test/json102.test 4b3a0f94535f033239b67c13dbee8b47d2b5ee467e0f2fdab5eadf370bbe5fd3
F test/json102.test 9b2e5ada10845ff84853b3feaae2ce51ce7145ae458f74c6a6cecc6ef6ee3ae1
F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe
F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1
F test/json105.test 043838b56e68f3252a0dcf5be1689016f6f3f05056f8dcfcdc9d074f4d932988
@@ -1697,7 +1697,7 @@ F test/subquery.test 903abf41049f8404256f7be24b3151328304a5b25162e17ab0079460237
F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12
F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303
F test/substr.test a673e3763e247e9b5e497a6cacbaf3da2bd8ec8921c0677145c109f2e633f36b
F test/subtype1.test 7a9c55ed84d4ce551203d18046f925e293d75f69da81bff71aaf2696e4a2a748
F test/subtype1.test 96fd2a59bfc845c955b5f339d23b37ef4d50de5f8a04acd1450a68605fa2e3e7
F test/superlock.test 85256830339a6871ce36a2ef591c3f67716a701b5497788fb2068b90159c2442
F test/swarmvtab.test 250231404fcac88f61a6c147bb0e3a118ed879278cd3ccb0ae2d3a729e1e8e26
F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c
@@ -2201,9 +2201,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 00dffd10f0c77fed53bdbf1536f6ef9b6076775f1b9a10794b87e3ace33ca1d9 f1e44f703acb415e2ff7d7f87fa05fc874ef1c432095bb3ccb45c6ad2fd085a9
R 602e6f17d656c7098c104c9738f971e9
T +closed f1e44f703acb415e2ff7d7f87fa05fc874ef1c432095bb3ccb45c6ad2fd085a9
U dan
Z 2fe59ff619562212dac3a249eb517d01
P 41b79bde4a4b6510b41cc9175ff2527fbd3ca9209812361783754f24cf67ef9e f1cb1a815a09d71eb52d5c7f2f4e5c7689535232dee365e46ac41cce7fd86c01
R 824c1bcdb1f9c6fee7135023d460cb90
T +closed f1cb1a815a09d71eb52d5c7f2f4e5c7689535232dee365e46ac41cce7fd86c01
U drh
Z f391a3d677bdf348a89a60afcfdaaa8e
# Remove this line to create a well-formed Fossil manifest.
+1 -1
View File
@@ -1 +1 @@
41b79bde4a4b6510b41cc9175ff2527fbd3ca9209812361783754f24cf67ef9e
1e405c39a8405e2081ce061559d1aacc70055fc74ab86d886b973076a3fb124b
+3
View File
@@ -2814,7 +2814,10 @@ void sqlite3RegisterBuiltinFunctions(void){
#endif /* SQLITE_ENABLE_MATH_FUNCTIONS */
FUNCTION(sign, 1, 0, 0, signFunc ),
INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ),
INLINE_FUNC(iif, 2, INLINEFUNC_iif, 0 ),
INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ),
INLINE_FUNC(if, 2, INLINEFUNC_iif, 0 ),
INLINE_FUNC(if, 3, INLINEFUNC_iif, 0 ),
};
#ifndef SQLITE_OMIT_ALTERTABLE
sqlite3AlterFunctions();
+12 -3
View File
@@ -1232,12 +1232,18 @@ db nullvalue {}
# EVIDENCE-OF: R-13943-13592 A NULL result is considered untrue when
# evaluating WHEN terms.
#
do_execsql_test e_expr-21.4.1 {
do_execsql_test e_expr-21.4.1a {
SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, iif(NULL,8,99);
} {B 99}
do_execsql_test e_expr-21.4.2 {
do_execsql_test e_expr-21.4.1b {
SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, if(NULL,8,99);
} {B 99}
do_execsql_test e_expr-21.4.2a {
SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, iif(0,8,99);
} {C 99}
do_execsql_test e_expr-21.4.2b {
SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, if(0,8,99);
} {C 99}
# EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base
# expression is evaluated just once and the result is compared against
@@ -1969,9 +1975,12 @@ do_execsql_test e_expr-37.5 {
# EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are
# considered to be true.
#
do_execsql_test e_expr-37.6 {
do_execsql_test e_expr-37.6a {
SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, iif(1,'true','false');
} {true true}
do_execsql_test e_expr-37.6b {
SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, if(1,'true');
} {true true}
do_execsql_test e_expr-37.7 {
SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END, iif(1.0,'true','false');
} {true true}
+24
View File
@@ -745,6 +745,30 @@ do_execsql_test json102-1610 {
5 {{"b":9}} json {{"b":9}} text {{"b":9}} json \
6 {} null {} null {} null
]
do_execsql_test json102-1620 {
DELETE FROM t1;
INSERT INTO t1(x) VALUES('[null,123,4.5,"six",[7,8],{"b":9}]');
WITH c(y) AS (VALUES(0),(1),(2),(3),(4),(5),(6))
SELECT
y,
x->y AS '->',
CASE WHEN subtype(if(json_valid(x),x->y)) THEN 'json'
ELSE typeof(x->y) END AS 'type',
x->>y AS '->>',
CASE WHEN subtype(x->>y) THEN 'json' ELSE typeof(x->>y) END AS 'type',
json_extract(x,format('$[%d]',y)) AS 'json_extract',
CASE WHEN subtype(json_extract(x,format('$[%d]',y)))
THEN 'json' ELSE typeof(json_extract(x,format('$[%d]',y))) END AS 'type'
FROM c, t1 ORDER BY y;
} [list \
0 null json {} null {} null \
1 123 json 123 integer 123 integer \
2 4.5 json 4.5 real 4.5 real \
3 {"six"} json six text six text \
4 {[7,8]} json {[7,8]} text {[7,8]} json \
5 {{"b":9}} json {{"b":9}} text {{"b":9}} json \
6 {} null {} null {} null
]
reset_db
do_execsql_test json102-1700 {
+10
View File
@@ -73,5 +73,15 @@ do_execsql_test subtype1-320 {
WHERE json_quote(y)='"1"';
} {1 {"1"}}
# 2024-11-26
# subtype survives if()
#
do_execsql_test subtype1-400 {
WITH t400(id,j) AS (VALUES
(1,'{a:{x:1,y:2},b:{x:3,y:4}}'),
(2,'not json')
)
SELECT id, subtype(if(json_valid(j,6),j->'a')) FROM t400;
} {1 74 2 0}
finish_test