Skip to content

Commit

Permalink
[opt](ctas) add a variable to control varchar length in ctas (#37069) (
Browse files Browse the repository at this point in the history
…#37284)

pick from master #37069

add a new session variable: use_max_length_of_varchar_in_ctas

In CTAS (Create Table As Select), if CHAR/VARCHAR columns do not
originate from the source table, whether to set the length of such a
column to MAX, which is 65533. The default is true.
  • Loading branch information
morrySnow authored Jul 4, 2024
1 parent 4e4f3d2 commit 8373610
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,12 @@ public void run(ConnectContext ctx, StmtExecutor executor) throws Exception {
}
}
} else {
dataType = TypeCoercionUtils.replaceSpecifiedType(dataType,
VarcharType.class, VarcharType.MAX_VARCHAR_TYPE);
dataType = TypeCoercionUtils.replaceSpecifiedType(dataType,
CharType.class, VarcharType.MAX_VARCHAR_TYPE);
if (ctx.getSessionVariable().useMaxLengthOfVarcharInCtas) {
dataType = TypeCoercionUtils.replaceSpecifiedType(dataType,
VarcharType.class, VarcharType.MAX_VARCHAR_TYPE);
dataType = TypeCoercionUtils.replaceSpecifiedType(dataType,
CharType.class, VarcharType.MAX_VARCHAR_TYPE);
}
}
}
// if the column is an expression, we set it to nullable, otherwise according to the nullable of the slot.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,8 @@ public class SessionVariable implements Serializable, Writable {

public static final String MAX_COLUMN_READER_NUM = "max_column_reader_num";

public static final String USE_MAX_LENGTH_OF_VARCHAR_IN_CTAS = "use_max_length_of_varchar_in_ctas";

public static final List<String> DEBUG_VARIABLES = ImmutableList.of(
SKIP_DELETE_PREDICATE,
SKIP_DELETE_BITMAP,
Expand Down Expand Up @@ -1902,6 +1904,13 @@ public void setIgnoreShapePlanNodes(String ignoreShapePlanNodes) {
checker = "checkExternalAggPartitionBits", fuzzy = true)
public int externalAggPartitionBits = 5; // means that the hash table will be partitioned into 32 blocks.

@VariableMgr.VarAttr(name = USE_MAX_LENGTH_OF_VARCHAR_IN_CTAS, description = {
"在CTAS中,如果 CHAR / VARCHAR 列不来自于源表,是否是将这一列的长度设置为 MAX,即65533。默认为 true。",
"In CTAS (Create Table As Select), if CHAR/VARCHAR columns do not originate from the source table,"
+ " whether to set the length of such a column to MAX, which is 65533. The default is true."
})
public boolean useMaxLengthOfVarcharInCtas = true;

public boolean isEnableJoinSpill() {
return enableJoinSpill;
}
Expand Down
3 changes: 3 additions & 0 deletions regression-test/data/nereids_p0/create_table/test_ctas.out
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ r2 {"title":"Amount","value":2.1}
2.1 2.20000 2.3 2.400000 2.500000 2.600000
2.1 2.20000 2.3 2.400000 2.500000 2.600000

-- !desc --
__substring_0 VARCHAR(30) Yes true \N

12 changes: 8 additions & 4 deletions regression-test/suites/nereids_p0/create_table/test_ctas.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@
// under the License.

suite("nereids_test_ctas") {
sql 'set enable_nereids_planner=true'
sql 'set enable_fallback_to_original_planner=false'
sql 'set enable_nereids_dml=true'

sql """ DROP TABLE IF EXISTS test_ctas """
sql """ DROP TABLE IF EXISTS test_ctas1 """
sql """ DROP TABLE IF EXISTS test_ctas2 """
Expand Down Expand Up @@ -271,5 +267,13 @@ suite("nereids_test_ctas") {
sql 'drop table c'
sql 'drop table test_date_v2'
}

sql """DROP TABLE IF EXISTS test_varchar_length"""
sql """set use_max_length_of_varchar_in_ctas = false"""
sql """CREATE TABLE test_varchar_length properties ("replication_num"="1") AS SELECT CAST("1" AS VARCHAR(30))"""
qt_desc """desc test_varchar_length"""
sql """DROP TABLE IF EXISTS test_varchar_length"""
sql """set use_max_length_of_varchar_in_ctas = true"""

}

0 comments on commit 8373610

Please sign in to comment.