xuzifu666 commented on code in PR #4431:
URL: https://github.com/apache/calcite/pull/4431#discussion_r2176237343
##########
testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java:
##########
@@ -2545,6 +2545,30 @@ void testCastToBoolean(CastType castType,
SqlOperatorFixture f) {
f.checkNull("cast(null as integer array) || array[1]");
}
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-7063">
+ * Result type inferred for CONCAT_FUNCTION is incorrect for BINARY
arguments</a>. */
+ @Test void testConcatFuncMysql() {
+ final SqlOperatorFixture f = fixture().withLibrary(SqlLibrary.MYSQL);
+
+ // test for ByteString
+ f.setFor(SqlLibraryOperators.CONCAT_FUNCTION_MYSQL);
+ f.checkString("concat('a', x'61')", "6161", "BINARY(2) NOT NULL");
+ f.checkString("concat('abc', 'bb', 'cc')", "abcbbcc", "VARCHAR(7) NOT
NULL");
+ f.checkString("concat(x'616263',x'62')", "61626362", "BINARY(4) NOT NULL");
+ f.checkString("concat(x'616263','abc')", "616263616263", "BINARY(6) NOT
NULL");
+ f.checkString("concat(x'61',x'62')", "6162", "BINARY(2) NOT NULL");
+ f.checkString("concat(cast(x'61' as binary), cast(x'62' as binary), "
Review Comment:
It is indeed possible to calculate the bytes length of char through
SqlOperatorBinding and then deduce the precision, but there are some problems
with the current Calcite Test process
SqlTester##checkType will still do a second check, but it will still be
based on the Type.
```
@Override public void checkType(Supplier<String> sql, RelDataType type) {
String actual = **getTypeString**(type);
assertThat(sql.get(), actual, is(expected));
}
```
This will still infer that actual is 4, and will eventually lead to
verification failure:
```
java.lang.AssertionError: Query: select concat(p1, p0) from (values (x'61',
_UTF8'方解石')) as t(p0, p1)
Expected: is "BINARY(10) NOT NULL"
but: was "BINARY(4) NOT NULL"
```
So currently I return the varbinary type directly when return type is
binary. @mihaibudiu
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]