FEATURE: 1. enable array type in Nereids 2. support generice on function signature 3. support array and map type in type coercion and type check 4. add element_at and element_slice syntax in Nereids parser REFACTOR: 1. remove AbstractDataType BUG FIX: 1. remove FROM from nonReserved keyword list TODO: 1. support lambda expression 2. use Nereids' way do function type coercion 3. use castIfnotSame when do implict cast on BoundFunction 4. let AnyDataType type coercion do same thing as function type coercion 5. add below array function - array_apply - array_concat - array_filter - array_sortby - array_exists - array_first_index - array_last_index - array_count - array_shuffle shuffle - array_pushfront - array_pushback - array_repeat - array_zip - reverse - concat_ws - split_by_string - explode - bitmap_from_array - bitmap_to_array - multi_search_all_positions - multi_match_any - tokenize
233 lines
12 KiB
Groovy
233 lines
12 KiB
Groovy
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
suite("test_point_query") {
|
|
|
|
// nereids do not support point query now
|
|
sql """set enable_nereids_planner=false"""
|
|
|
|
def user = context.config.jdbcUser
|
|
def password = context.config.jdbcPassword
|
|
def realDb = "regression_test_serving_p0"
|
|
def tableName = realDb + ".tbl_point_query"
|
|
sql "CREATE DATABASE IF NOT EXISTS ${realDb}"
|
|
|
|
// Parse url
|
|
String jdbcUrl = context.config.jdbcUrl
|
|
String urlWithoutSchema = jdbcUrl.substring(jdbcUrl.indexOf("://") + 3)
|
|
def sql_ip = urlWithoutSchema.substring(0, urlWithoutSchema.indexOf(":"))
|
|
def sql_port
|
|
if (urlWithoutSchema.indexOf("/") >= 0) {
|
|
// e.g: jdbc:mysql://locahost:8080/?a=b
|
|
sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1, urlWithoutSchema.indexOf("/"))
|
|
} else {
|
|
// e.g: jdbc:mysql://locahost:8080
|
|
sql_port = urlWithoutSchema.substring(urlWithoutSchema.indexOf(":") + 1)
|
|
}
|
|
// set server side prepared statment url
|
|
def url="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb + "?&useServerPrepStmts=true"
|
|
|
|
def generateString = {len ->
|
|
def str = ""
|
|
for (int i = 0; i < len; i++) {
|
|
str += "a"
|
|
}
|
|
return str
|
|
}
|
|
|
|
sql """DROP TABLE IF EXISTS ${tableName}"""
|
|
test {
|
|
// abnormal case
|
|
sql """
|
|
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
`k1` int NULL COMMENT ""
|
|
) ENGINE=OLAP
|
|
UNIQUE KEY(`k1`)
|
|
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
|
|
PROPERTIES (
|
|
"replication_allocation" = "tag.location.default: 1",
|
|
"store_row_column" = "true",
|
|
"light_schema_change" = "false"
|
|
)
|
|
"""
|
|
exception "errCode = 2, detailMessage = Row store column rely on light schema change, enable light schema change first"
|
|
}
|
|
sql """
|
|
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
`k1` int(11) NULL COMMENT "",
|
|
`k2` decimalv3(27, 9) NULL COMMENT "",
|
|
`k3` varchar(300) NULL COMMENT "",
|
|
`k4` varchar(30) NULL COMMENT "",
|
|
`k5` date NULL COMMENT "",
|
|
`k6` datetime NULL COMMENT "",
|
|
`k7` float NULL COMMENT "",
|
|
`k8` datev2 NULL COMMENT "",
|
|
`k9` boolean NULL COMMENT "",
|
|
`k10` decimalv3(20, 3) NULL COMMENT "",
|
|
`k11` array<decimalv3(27, 9)> NULL COMMENT "",
|
|
`k12` array<text> NULL COMMENT ""
|
|
) ENGINE=OLAP
|
|
UNIQUE KEY(`k1`, `k2`, `k3`)
|
|
DISTRIBUTED BY HASH(`k1`, k2, k3) BUCKETS 1
|
|
PROPERTIES (
|
|
"replication_allocation" = "tag.location.default: 1",
|
|
"store_row_column" = "true",
|
|
"enable_unique_key_merge_on_write" = "true",
|
|
"light_schema_change" = "true",
|
|
"storage_format" = "V2"
|
|
)
|
|
"""
|
|
sql """ INSERT INTO ${tableName} VALUES(1231, 119291.11, "ddd", "laooq", null, "2020-01-01 12:36:38", null, "1022-01-01 11:30:38", null, 1.111112, [119181.1111, 819019.1191, null], null) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1232, 12222.99121135, "xxx", "laooq", "2023-01-02", "2020-01-01 12:36:38", 522.762, "2022-01-01 11:30:38", 1, 212.111, null, null) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1233, 1.392932911, "yyy", "laooq", "2024-01-02", "2020-01-01 12:36:38", 52.862, "3022-01-01 11:30:38", 0, 5973903488739435.668, [119181.1111, null, 819019.1191], ["dijiiixxx"]) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1234, 12919291.129191137, "xxddd", "laooq", "2025-01-02", "2020-01-01 12:36:38", 552.872, "4022-01-01 11:30:38", 1, 5973903488739435.668, [1888109181.192111, 192129019.1191], ["1", "2", "3"]) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1235, 991129292901.11138, "dd", null, "2120-01-02", "2020-01-01 12:36:38", 652.692, "5022-01-01 11:30:38", 0, 90696620686827832.374, [119181.1111], ["${generateString(251)}"]) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1236, 100320.11139, "laa ddd", "laooq", "2220-01-02", "2020-01-01 12:36:38", 2.7692, "6022-01-01 11:30:38", 1, 23698.299, [], ["${generateString(251)}"]) """
|
|
sql """ INSERT INTO ${tableName} VALUES(1237, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 90696620686827832.374, [1.1, 2.2, 3.3, 4.4, 5.5], []) """
|
|
sql """ INSERT INTO ${tableName} VALUES(251, 120939.11130, "${generateString(251)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 251, "7022-01-01 11:30:38", 1, 90696620686827832.374, [11111], []) """
|
|
sql """ INSERT INTO ${tableName} VALUES(252, 120939.11130, "${generateString(252)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 252, "7022-01-01 11:30:38", 0, 90696620686827832.374, [0], null) """
|
|
sql """ INSERT INTO ${tableName} VALUES(298, 120939.11130, "${generateString(298)}", "laooq", "2030-01-02", "2020-01-01 12:36:38", 298, "7022-01-01 11:30:38", 1, 90696620686827832.374, [], []) """
|
|
|
|
def nprep_sql = {sql_str->
|
|
def url_without_prep ="jdbc:mysql://" + sql_ip + ":" + sql_port + "/" + realDb
|
|
connect(user=user, password=password, url=url_without_prep) {
|
|
sql sql_str
|
|
}
|
|
}
|
|
// def url = context.config.jdbcUrl
|
|
def result1 = connect(user=user, password=password, url=url) {
|
|
def stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = ? and k2 = ? and k3 = ?"
|
|
assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement);
|
|
stmt.setInt(1, 1231)
|
|
stmt.setBigDecimal(2, new BigDecimal("119291.11"))
|
|
stmt.setString(3, "ddd")
|
|
qe_point_select stmt
|
|
stmt.setInt(1, 1231)
|
|
stmt.setBigDecimal(2, new BigDecimal("119291.11"))
|
|
stmt.setString(3, "ddd")
|
|
qe_point_select stmt
|
|
stmt.setInt(1, 1237)
|
|
stmt.setBigDecimal(2, new BigDecimal("120939.11130"))
|
|
stmt.setString(3, "a ddd")
|
|
qe_point_select stmt
|
|
|
|
stmt.setInt(1, 1232)
|
|
stmt.setBigDecimal(2, new BigDecimal("12222.99121135"))
|
|
stmt.setString(3, 'xxx')
|
|
qe_point_select stmt
|
|
|
|
stmt.setInt(1, 251)
|
|
stmt.setBigDecimal(2, new BigDecimal("120939.11130"))
|
|
stmt.setString(3, generateString(251))
|
|
qe_point_select stmt
|
|
|
|
stmt.setInt(1, 252)
|
|
stmt.setBigDecimal(2, new BigDecimal("120939.11130"))
|
|
stmt.setString(3, generateString(252))
|
|
qe_point_select stmt
|
|
|
|
stmt.setInt(1, 298)
|
|
stmt.setBigDecimal(2, new BigDecimal("120939.11130"))
|
|
stmt.setString(3, generateString(298))
|
|
qe_point_select stmt
|
|
stmt.close()
|
|
|
|
stmt = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1235 and k2 = ? and k3 = ?"
|
|
assertEquals(stmt.class, com.mysql.cj.jdbc.ServerPreparedStatement);
|
|
stmt.setBigDecimal(1, new BigDecimal("991129292901.11138"))
|
|
stmt.setString(2, "dd")
|
|
qe_point_select stmt
|
|
|
|
def stmt_fn = prepareStatement "select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4) from ${tableName} where k1 = ? and k2 =? and k3 = ?"
|
|
assertEquals(stmt_fn.class, com.mysql.cj.jdbc.ServerPreparedStatement);
|
|
stmt_fn.setInt(1, 1231)
|
|
stmt_fn.setBigDecimal(2, new BigDecimal("119291.11"))
|
|
stmt_fn.setString(3, "ddd")
|
|
qe_point_select stmt_fn
|
|
qe_point_select stmt_fn
|
|
qe_point_select stmt_fn
|
|
|
|
nprep_sql """
|
|
ALTER table ${tableName} ADD COLUMN new_column0 INT default "0";
|
|
"""
|
|
sleep(1);
|
|
nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "laooq", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 1, 1.1111299, [119291.19291], ["111", "222", "333"], 1) """
|
|
stmt.setBigDecimal(1, new BigDecimal("120939.11130"))
|
|
stmt.setString(2, "a ddd")
|
|
qe_point_select stmt
|
|
qe_point_select stmt
|
|
// invalidate cache
|
|
nprep_sql """ INSERT INTO ${tableName} VALUES(1235, 120939.11130, "a ddd", "xxxxxx", "2030-01-02", "2020-01-01 12:36:38", 22.822, "7022-01-01 11:30:38", 0, 1929111.1111,[119291.19291], ["111", "222", "333"], 2) """
|
|
qe_point_select stmt
|
|
qe_point_select stmt
|
|
qe_point_select stmt
|
|
nprep_sql """
|
|
ALTER table ${tableName} ADD COLUMN new_column1 INT default "0";
|
|
"""
|
|
qe_point_select stmt
|
|
qe_point_select stmt
|
|
nprep_sql """
|
|
ALTER table ${tableName} DROP COLUMN new_column1;
|
|
"""
|
|
qe_point_select stmt
|
|
qe_point_select stmt
|
|
|
|
// sql """
|
|
// ALTER table ${tableName} ADD COLUMN new_column1 INT default "0";
|
|
// """
|
|
// qe_point_select stmt
|
|
}
|
|
// disable useServerPrepStmts
|
|
url = context.config.jdbcUrl
|
|
def result2 = connect(user=user, password=password, url=url) {
|
|
qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1231 and k2 = 119291.11 and k3 = 'ddd'"""
|
|
qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ * from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'"""
|
|
qt_sql """select /*+ SET_VAR(enable_nereids_planner=false) */ hex(k3), hex(k4), k7 + 10.1 from ${tableName} where k1 = 1237 and k2 = 120939.11130 and k3 = 'a ddd'"""
|
|
// prepared text
|
|
sql """ prepare stmt1 from select * from ${tableName} where k1 = % and k2 = % and k3 = % """
|
|
qt_sql """execute stmt1 using (1231, 119291.11, 'ddd')"""
|
|
qt_sql """execute stmt1 using (1237, 120939.11130, 'a ddd')"""
|
|
|
|
sql """prepare stmt2 from select * from ${tableName} where k1 = % and k2 = % and k3 = %"""
|
|
qt_sql """execute stmt2 using (1231, 119291.11, 'ddd')"""
|
|
qt_sql """execute stmt2 using (1237, 120939.11130, 'a ddd')"""
|
|
tableName = "test_query"
|
|
sql """DROP TABLE IF EXISTS ${tableName}"""
|
|
sql """CREATE TABLE ${tableName} (
|
|
`customer_key` bigint(20) NULL,
|
|
`customer_btm_value_0` text NULL,
|
|
`customer_btm_value_1` text NULL,
|
|
`customer_btm_value_2` text NULL
|
|
) ENGINE=OLAP
|
|
UNIQUE KEY(`customer_key`)
|
|
COMMENT 'OLAP'
|
|
DISTRIBUTED BY HASH(`customer_key`) BUCKETS 16
|
|
PROPERTIES (
|
|
"replication_allocation" = "tag.location.default: 1",
|
|
"storage_format" = "V2",
|
|
"light_schema_change" = "true",
|
|
"store_row_column" = "true",
|
|
"enable_unique_key_merge_on_write" = "true",
|
|
"disable_auto_compaction" = "false"
|
|
);"""
|
|
sql """insert into ${tableName} values (0, "1", "2", "3")"""
|
|
qt_sql "select /*+ SET_VAR(enable_nereids_planner=false) */ * from test_query where customer_key = 0"
|
|
}
|
|
}
|