Unverified 提交 c6c72d96 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov 提交者: GitHub

Merge pull request #1169 from katzyn/array_contains

Fix comparison in ARRAY_CONTAINS
...@@ -4155,7 +4155,7 @@ ISO_YEAR(CREATED) ...@@ -4155,7 +4155,7 @@ ISO_YEAR(CREATED)
ARRAY_GET(arrayExpression, indexExpression) ARRAY_GET(arrayExpression, indexExpression)
"," ","
Returns one element of an array. Returns one element of an array.
This method returns a string. Returns NULL if there is no such element or array is NULL.
"," ","
CALL ARRAY_GET(('Hello', 'World'), 2) CALL ARRAY_GET(('Hello', 'World'), 2)
" "
...@@ -4164,6 +4164,7 @@ CALL ARRAY_GET(('Hello', 'World'), 2) ...@@ -4164,6 +4164,7 @@ CALL ARRAY_GET(('Hello', 'World'), 2)
ARRAY_LENGTH(arrayExpression) ARRAY_LENGTH(arrayExpression)
"," ","
Returns the length of an array. Returns the length of an array.
Returns NULL if the specified array is NULL.
"," ","
CALL ARRAY_LENGTH(('Hello', 'World')) CALL ARRAY_LENGTH(('Hello', 'World'))
" "
...@@ -4171,7 +4172,8 @@ CALL ARRAY_LENGTH(('Hello', 'World')) ...@@ -4171,7 +4172,8 @@ CALL ARRAY_LENGTH(('Hello', 'World'))
"Functions (System)","ARRAY_CONTAINS"," "Functions (System)","ARRAY_CONTAINS","
ARRAY_CONTAINS(arrayExpression, value) ARRAY_CONTAINS(arrayExpression, value)
"," ","
Returns a boolean true if the array contains the value. Returns a boolean TRUE if the array contains the value or FALSE if it does not contain it.
Returns NULL if the specified array is NULL.
"," ","
CALL ARRAY_CONTAINS(('Hello', 'World'), 'Hello') CALL ARRAY_CONTAINS(('Hello', 'World'), 'Hello')
" "
......
...@@ -414,7 +414,7 @@ public class Function extends Expression implements FunctionCall { ...@@ -414,7 +414,7 @@ public class Function extends Expression implements FunctionCall {
addFunctionNotDeterministic("CURRVAL", CURRVAL, addFunctionNotDeterministic("CURRVAL", CURRVAL,
VAR_ARGS, Value.LONG); VAR_ARGS, Value.LONG);
addFunction("ARRAY_GET", ARRAY_GET, addFunction("ARRAY_GET", ARRAY_GET,
2, Value.STRING); 2, Value.NULL);
addFunction("ARRAY_CONTAINS", ARRAY_CONTAINS, addFunction("ARRAY_CONTAINS", ARRAY_CONTAINS,
2, Value.BOOLEAN, false, true, true); 2, Value.BOOLEAN, false, true, true);
addFunction("CSVREAD", CSVREAD, addFunction("CSVREAD", CSVREAD,
...@@ -1054,11 +1054,13 @@ public class Function extends Expression implements FunctionCall { ...@@ -1054,11 +1054,13 @@ public class Function extends Expression implements FunctionCall {
Value v1 = getNullOrValue(session, args, values, 1); Value v1 = getNullOrValue(session, args, values, 1);
Value[] list = ((ValueArray) v0).getList(); Value[] list = ((ValueArray) v0).getList();
for (Value v : list) { for (Value v : list) {
if (v.equals(v1)) { if (database.areEqual(v, v1)) {
result = ValueBoolean.TRUE; result = ValueBoolean.TRUE;
break; break;
} }
} }
} else {
result = ValueNull.INSTANCE;
} }
break; break;
} }
......
...@@ -180,10 +180,10 @@ public class TestMetaData extends TestBase { ...@@ -180,10 +180,10 @@ public class TestMetaData extends TestBase {
stat.execute("insert into a values((1, 2))"); stat.execute("insert into a values((1, 2))");
rs = stat.executeQuery("SELECT x[1] FROM a"); rs = stat.executeQuery("SELECT x[1] FROM a");
ResultSetMetaData rsMeta = rs.getMetaData(); ResultSetMetaData rsMeta = rs.getMetaData();
assertEquals(Types.VARCHAR, rsMeta.getColumnType(1)); assertEquals(Types.NULL, rsMeta.getColumnType(1));
rs.next(); rs.next();
// assertEquals(String.class.getName(), assertEquals(Integer.class.getName(),
// rs.getObject(1).getClass().getName()); rs.getObject(1).getClass().getName());
stat.execute("drop table a"); stat.execute("drop table a");
conn.close(); conn.close();
} }
......
...@@ -22,10 +22,35 @@ select array_contains((null, 'two'), null); ...@@ -22,10 +22,35 @@ select array_contains((null, 'two'), null);
>> TRUE >> TRUE
select array_contains(null, 'one'); select array_contains(null, 'one');
>> FALSE >> null
select array_contains(((1, 2), (3, 4)), (1, 2)); select array_contains(((1, 2), (3, 4)), (1, 2));
>> TRUE >> TRUE
select array_contains(((1, 2), (3, 4)), (5, 6)); select array_contains(((1, 2), (3, 4)), (5, 6));
>> FALSE >> FALSE
CREATE TABLE TEST (ID INT PRIMARY KEY AUTO_INCREMENT, A ARRAY);
> ok
INSERT INTO TEST (A) VALUES ((1L, 2L)), ((3L, 4L));
> update count: 2
SELECT ID, ARRAY_CONTAINS(A, 1L), ARRAY_CONTAINS(A, 2L), ARRAY_CONTAINS(A, 3L), ARRAY_CONTAINS(A, 4L) FROM TEST;
> ID ARRAY_CONTAINS(A, 1) ARRAY_CONTAINS(A, 2) ARRAY_CONTAINS(A, 3) ARRAY_CONTAINS(A, 4)
> -- -------------------- -------------------- -------------------- --------------------
> 1 TRUE TRUE FALSE FALSE
> 2 FALSE FALSE TRUE TRUE
> rows: 2
SELECT * FROM (
SELECT ID, ARRAY_CONTAINS(A, 1L), ARRAY_CONTAINS(A, 2L), ARRAY_CONTAINS(A, 3L), ARRAY_CONTAINS(A, 4L) FROM TEST
);
> ID ARRAY_CONTAINS(A, 1) ARRAY_CONTAINS(A, 2) ARRAY_CONTAINS(A, 3) ARRAY_CONTAINS(A, 4)
> -- -------------------- -------------------- -------------------- --------------------
> 1 TRUE TRUE FALSE FALSE
> 2 FALSE FALSE TRUE TRUE
> rows: 2
DROP TABLE TEST;
> ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论