Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import org.apache.doris.nereids.properties.PhysicalProperties;
import org.apache.doris.nereids.rules.analysis.ExpressionAnalyzer;
import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext;
import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.Slot;
import org.apache.doris.nereids.trees.expressions.SlotReference;
Expand All @@ -71,6 +72,7 @@
import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter;
import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
import org.apache.doris.nereids.types.DataType;
import org.apache.doris.nereids.types.coercion.CharacterType;
import org.apache.doris.nereids.util.TypeCoercionUtils;
import org.apache.doris.nereids.util.Utils;
import org.apache.doris.qe.ConnectContext;
Expand Down Expand Up @@ -940,19 +942,28 @@ private void generatedColumnCheck(ConnectContext ctx) {
Expression boundSlotExpression = SlotReplacer.INSTANCE.replace(parsedExpression, columnToSlotReference);
Scope scope = new Scope(slots);
ExpressionAnalyzer analyzer = new ExpressionAnalyzer(null, scope, cascadesContext, false, false);
Expression expr;
Expression expression;
try {
expr = analyzer.analyze(boundSlotExpression, new ExpressionRewriteContext(cascadesContext));
expression = analyzer.analyze(boundSlotExpression, new ExpressionRewriteContext(cascadesContext));
} catch (AnalysisException e) {
throw new AnalysisException("In generated column '" + column.getName() + "', "
+ Utils.convertFirstChar(e.getMessage()));
}
checkExpressionInGeneratedColumn(expr, column, nameToColumnDefinition);
TypeCoercionUtils.checkCanCastTo(expr.getDataType(), column.getType());
checkExpressionInGeneratedColumn(expression, column, nameToColumnDefinition);
TypeCoercionUtils.checkCanCastTo(expression.getDataType(), column.getType());
ExpressionToExpr translator = new ExpressionToExpr(i, translateMap);
Expr e = expr.accept(translator, planTranslatorContext);
info.get().setExpr(e);
exprAndnames.add(new GeneratedColumnUtil.ExprAndname(e.clone(), column.getName()));
Expr expr = expression.accept(translator, planTranslatorContext);
info.get().setExpr(expr);
// Casting slot to its own type is because when loading data(stream load and other load),
// the slots reading from files are string type. So we need to cast it to its own type to avoid error.
Expression expressionForLoad = expression.rewriteDownShortCircuit(e -> {
if (e instanceof SlotReference && !(e.getDataType() instanceof CharacterType)) {
return new Cast(e, e.getDataType());
}
return e;
});
Expr exprForLoad = expressionForLoad.accept(translator, planTranslatorContext);
exprAndnames.add(new GeneratedColumnUtil.ExprAndname(exprForLoad.clone(), column.getName()));
}

// for alter drop column
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
5113756983984045899
5113756983984045898
3423432435553321
55545645564565
5113756983984045895
4663423423432
5113756983984045894
5113756983984045897
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,13 @@
1 2 3.0
2 3 5.0

-- !test_load_cast --
1 3423432435553321
2 4663423423432
4 5113756983984045894
5 55545645564565
5 5113756983984045895
7 5113756983984045897
8 5113756983984045898
9 5113756983984045899

Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,40 @@ suite("test_generated_column_stream_mysql_load") {
"""
sql "sync"
qt_specify_value_for_gencol "select * from test_gen_col_common_steam_mysql_load order by 1,2,3"

sql """
drop table if exists objects3;
"""
sql """
CREATE TABLE `objects3` (
`OBJECTIDHASH` tinyint AS ((`OBJECTID` % 10)) NULL,
`OBJECTID` bigint NOT NULL,
) ENGINE=OLAP
UNIQUE KEY(`OBJECTIDHASH`, `OBJECTID`)
DISTRIBUTED BY HASH( `OBJECTIDHASH`) BUCKETS 128
PROPERTIES (
"file_cache_ttl_seconds" = "0",
"is_being_synced" = "false",
"storage_medium" = "hdd",
"storage_format" = "V2",
"inverted_index_storage_format" = "V2",
"compression" = "ZSTD",
"enable_unique_key_merge_on_write" = "true",
"light_schema_change" = "true",
"disable_auto_compaction" = "false",
"enable_single_replica_compaction" = "false",
"group_commit_interval_ms" = "5000",
"group_commit_data_bytes" = "134217728",
"enable_mow_light_delete" = "false"
);
"""
streamLoad {
table 'objects3'
set 'column_separator', ','
file 'objects3.csv'
set 'columns', 'OBJECTID'
time 10000 // limit inflight 10s
}
sql "sync"
qt_test_load_cast "select * from objects3 order by OBJECTIDHASH,OBJECTID"
}
Loading