提交 024e80c3 authored 作者: noelgrandin's avatar noelgrandin

add ARRAY_CONTAINS function

上级 81625085
...@@ -3360,6 +3360,14 @@ Returns the length of an array. ...@@ -3360,6 +3360,14 @@ Returns the length of an array.
CALL ARRAY_LENGTH(('Hello', 'World')) CALL ARRAY_LENGTH(('Hello', 'World'))
" "
"Functions (System)","ARRAY_CONTAINS","
ARRAY_CONTAINS(arrayExpression, value)
","
Returns a boolean true if the array contains the value.
","
CALL ARRAY_CONTAINS(('Hello', 'World'), 'Hello')
"
"Functions (System)","AUTOCOMMIT"," "Functions (System)","AUTOCOMMIT","
AUTOCOMMIT() AUTOCOMMIT()
"," ","
......
...@@ -96,7 +96,7 @@ public class Function extends Expression implements FunctionCall { ...@@ -96,7 +96,7 @@ public class Function extends Expression implements FunctionCall {
CASE = 206, NEXTVAL = 207, CURRVAL = 208, ARRAY_GET = 209, CSVREAD = 210, CSVWRITE = 211, CASE = 206, NEXTVAL = 207, CURRVAL = 208, ARRAY_GET = 209, CSVREAD = 210, CSVWRITE = 211,
MEMORY_FREE = 212, MEMORY_USED = 213, LOCK_MODE = 214, SCHEMA = 215, SESSION_ID = 216, ARRAY_LENGTH = 217, MEMORY_FREE = 212, MEMORY_USED = 213, LOCK_MODE = 214, SCHEMA = 215, SESSION_ID = 216, ARRAY_LENGTH = 217,
LINK_SCHEMA = 218, GREATEST = 219, LEAST = 220, CANCEL_SESSION = 221, SET = 222, TABLE = 223, TABLE_DISTINCT = 224, LINK_SCHEMA = 218, GREATEST = 219, LEAST = 220, CANCEL_SESSION = 221, SET = 222, TABLE = 223, TABLE_DISTINCT = 224,
FILE_READ = 225, TRANSACTION_ID = 226, TRUNCATE_VALUE = 227, NVL2 = 228, DECODE = 229; FILE_READ = 225, TRANSACTION_ID = 226, TRUNCATE_VALUE = 227, NVL2 = 228, DECODE = 229, ARRAY_CONTAINS = 230;
public static final int ROW_NUMBER = 300; public static final int ROW_NUMBER = 300;
...@@ -320,6 +320,7 @@ public class Function extends Expression implements FunctionCall { ...@@ -320,6 +320,7 @@ public class Function extends Expression implements FunctionCall {
addFunctionNotDeterministic("NEXTVAL", NEXTVAL, VAR_ARGS, Value.LONG); addFunctionNotDeterministic("NEXTVAL", NEXTVAL, VAR_ARGS, Value.LONG);
addFunctionNotDeterministic("CURRVAL", CURRVAL, VAR_ARGS, Value.LONG); addFunctionNotDeterministic("CURRVAL", CURRVAL, VAR_ARGS, Value.LONG);
addFunction("ARRAY_GET", ARRAY_GET, 2, Value.STRING); addFunction("ARRAY_GET", ARRAY_GET, 2, Value.STRING);
addFunction("ARRAY_CONTAINS", ARRAY_CONTAINS, 2, Value.BOOLEAN, false, true, false);
addFunction("CSVREAD", CSVREAD, VAR_ARGS, Value.RESULT_SET, false, false, true); addFunction("CSVREAD", CSVREAD, VAR_ARGS, Value.RESULT_SET, false, false, true);
addFunction("CSVWRITE", CSVWRITE, VAR_ARGS, Value.INT, false, false, false); addFunction("CSVWRITE", CSVWRITE, VAR_ARGS, Value.INT, false, false, false);
addFunctionNotDeterministic("MEMORY_FREE", MEMORY_FREE, 0, Value.INT); addFunctionNotDeterministic("MEMORY_FREE", MEMORY_FREE, 0, Value.INT);
...@@ -873,6 +874,20 @@ public class Function extends Expression implements FunctionCall { ...@@ -873,6 +874,20 @@ public class Function extends Expression implements FunctionCall {
} }
break; break;
} }
case ARRAY_CONTAINS: {
result = ValueBoolean.get(false);
if (v0.getType() == Value.ARRAY) {
Value v1 = argList[1].getValue(session);
Value[] list = ((ValueArray) v0).getList();
for (Value v : list) {
if (v.equals(v1)) {
result = ValueBoolean.get(true);
break;
}
}
}
break;
}
case CANCEL_SESSION: { case CANCEL_SESSION: {
result = ValueBoolean.get(cancelStatement(session, v0.getInt())); result = ValueBoolean.get(cancelStatement(session, v0.getInt()));
break; break;
......
...@@ -1231,6 +1231,10 @@ Returns one element of an array." ...@@ -1231,6 +1231,10 @@ Returns one element of an array."
ARRAY_LENGTH(arrayExpression) ARRAY_LENGTH(arrayExpression)
"," ","
Returns the length of an array." Returns the length of an array."
"Functions (System)","ARRAY_CONTAINS","
ARRAY_CONTAINS(arrayExpression, value)
","
Returns true if the array contains the value."
"Functions (System)","AUTOCOMMIT"," "Functions (System)","AUTOCOMMIT","
AUTOCOMMIT() AUTOCOMMIT()
"," ","
......
...@@ -16,6 +16,24 @@ select decode('3', 2.0, 2.0, 3, 3.0); ...@@ -16,6 +16,24 @@ select decode('3', 2.0, 2.0, 3, 3.0);
> 3.0; > 3.0;
select decode(4.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 9.0); select decode(4.0, 2.0, 2.0, 3.0, 3.0, 4.0, 4.0, 9.0);
> 4.0; > 4.0;
select array_contains((4.0, 2.0, 2.0), 2.0);
> TRUE;
select array_contains((4.0, 2.0, 2.0), 5.0);
> FALSE;
select array_contains(('one', 'two'), 'one');
> TRUE;
select array_contains(('one', 'two'), 'xxx');
> FALSE;
select array_contains(('one', 'two'), null);
> FALSE;
select array_contains((null, 'two'), null);
> TRUE;
select array_contains(null, 'one');
> FALSE;
select array_contains(((1, 2), (3, 4)), (1, 2));
> TRUE;
select array_contains(((1, 2), (3, 4)), (5, 6));
> FALSE;
select * from (select group_concat(distinct 1) from system_range(1, 3)); select * from (select group_concat(distinct 1) from system_range(1, 3));
> 1; > 1;
select sum(mod(x, 2) = 1) from system_range(1, 10); select sum(mod(x, 2) = 1) from system_range(1, 10);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论