[fix](array-type) check value valid while insert data into array column (#13365)

We should prevent insert while value overflow.

1. create table:
`CREATE TABLE test_array_load_test_array_int_insert_db.test_array_load_test_array_int_insert_tb ( k1 int NULL, k2 array<int> NULL ) DUPLICATE KEY(k1) DISTRIBUTED BY HASH(k1) BUCKETS 5`

2. try insert data less than INT_MIN.
`insert into test_array_load_test_array_int_insert_tb values (1005, [-2147483649])`

Before this pr, the insert will success, but the value it not correct.
Co-authored-by: cambyzju <zhuxiaoli01@baidu.com>
This commit is contained in:
camby
2022-10-17 00:01:03 +08:00
committed by GitHub
parent a83eaddfcf
commit 162e60eb19
2 changed files with 54 additions and 0 deletions

View File

@ -156,4 +156,11 @@ public class ArrayLiteral extends LiteralExpr {
literal.setType(targetType);
return literal;
}
@Override
public void checkValueValid() throws AnalysisException {
for (Expr e : children) {
e.checkValueValid();
}
}
}

View File

@ -0,0 +1,47 @@
// 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.
suite("test_array_insert_overflow") {
def testTable = "test_array_insert_overflow"
sql "ADMIN SET FRONTEND CONFIG ('enable_array_type' = 'true')"
sql """ set enable_vectorized_engine = true """
sql """
CREATE TABLE IF NOT EXISTS ${testTable} (
`k1` INT(11) NULL COMMENT "",
`k2` ARRAY<INT> NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"storage_format" = "V2"
)
"""
test {
sql "insert into ${testTable} values (1005, [-2147483649])"
// check exception message contains
exception "Number out of range"
}
test {
sql "insert into ${testTable} values (1006, [-9223372036854775809])"
// check exception message contains
exception "Number out of range"
}
}