[fix](planner) only table name should convert to lowercase when create table (#17373)
we met error: Unknown column '{}DORIS_DELETE_SIGN{}' in 'default_cluster:db.table.
that because when we use alias as the tableName to construct a Table, all parts of the name will be lowercase if lowerCaseTableNames = 1.
To avoid it, we should extract tableName from alias and only lower tableName
This commit is contained in:
@ -31,6 +31,7 @@ import org.apache.doris.common.io.Writable;
|
||||
import org.apache.doris.datasource.InternalCatalog;
|
||||
import org.apache.doris.persist.gson.GsonUtils;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
@ -53,6 +54,21 @@ public class TableName implements Writable {
|
||||
|
||||
}
|
||||
|
||||
public TableName(String alias) {
|
||||
String[] parts = alias.split("\\.");
|
||||
Preconditions.checkArgument(parts.length > 0, "table name can't be empty");
|
||||
tbl = parts[parts.length - 1];
|
||||
if (Env.isStoredTableNamesLowerCase() && !Strings.isNullOrEmpty(tbl)) {
|
||||
tbl = tbl.toLowerCase();
|
||||
}
|
||||
if (parts.length >= 2) {
|
||||
db = parts[parts.length - 2];
|
||||
}
|
||||
if (parts.length >= 3) {
|
||||
ctl = parts[parts.length - 3];
|
||||
}
|
||||
}
|
||||
|
||||
public TableName(String ctl, String db, String tbl) {
|
||||
if (Env.isStoredTableNamesLowerCase() && !Strings.isNullOrEmpty(tbl)) {
|
||||
tbl = tbl.toLowerCase();
|
||||
|
||||
@ -199,7 +199,7 @@ public class TupleDescriptor {
|
||||
}
|
||||
|
||||
public TableName getAliasAsName() {
|
||||
return (aliases != null) ? new TableName(null, null, aliases[0]) : null;
|
||||
return (aliases != null) ? new TableName(aliases[0]) : null;
|
||||
}
|
||||
|
||||
public TTupleDescriptor toThrift() {
|
||||
|
||||
@ -511,20 +511,20 @@ public class SelectStmtTest {
|
||||
String sql1 = "SELECT * FROM db1.table1 LEFT ANTI JOIN db1.table2 ON db1.table1.siteid = db1.table2.siteid;";
|
||||
String explain = dorisAssert.query(sql1).explainQuery();
|
||||
Assert.assertTrue(explain
|
||||
.contains("PREDICATES: `default_cluster:db1.table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
.contains("PREDICATES: `default_cluster:db1`.`table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
Assert.assertTrue(explain
|
||||
.contains("PREDICATES: `default_cluster:db1.table2`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
.contains("PREDICATES: `default_cluster:db1`.`table2`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
Assert.assertFalse(explain.contains("other predicates:"));
|
||||
String sql2 = "SELECT * FROM db1.table1 JOIN db1.table2 ON db1.table1.siteid = db1.table2.siteid;";
|
||||
explain = dorisAssert.query(sql2).explainQuery();
|
||||
Assert.assertTrue(explain
|
||||
.contains("PREDICATES: `default_cluster:db1.table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
.contains("PREDICATES: `default_cluster:db1`.`table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
Assert.assertTrue(explain
|
||||
.contains("PREDICATES: `default_cluster:db1.table2`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
.contains("PREDICATES: `default_cluster:db1`.`table2`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
Assert.assertFalse(explain.contains("other predicates:"));
|
||||
String sql3 = "SELECT * FROM db1.table1";
|
||||
Assert.assertTrue(dorisAssert.query(sql3).explainQuery()
|
||||
.contains("PREDICATES: `default_cluster:db1.table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
.contains("PREDICATES: `default_cluster:db1`.`table1`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
String sql4 = " SELECT * FROM db1.table1 table2";
|
||||
Assert.assertTrue(dorisAssert.query(sql4).explainQuery()
|
||||
.contains("PREDICATES: `table2`.`__DORIS_DELETE_SIGN__` = 0"));
|
||||
|
||||
@ -27,6 +27,7 @@ import org.apache.doris.catalog.PartitionKey;
|
||||
import org.apache.doris.catalog.PrimitiveType;
|
||||
import org.apache.doris.common.AnalysisException;
|
||||
import org.apache.doris.datasource.InternalCatalog;
|
||||
import org.apache.doris.qe.GlobalVariable;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
@ -162,4 +163,11 @@ public class OlapScanNodeTest {
|
||||
Assert.assertEquals(mod, 2);
|
||||
} // CHECKSTYLE IGNORE THIS LINE
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTableNameWithAlias() {
|
||||
GlobalVariable.lowerCaseTableNames = 1;
|
||||
SlotRef slot = new SlotRef(new TableName("DB.TBL"), Column.DELETE_SIGN);
|
||||
Assert.assertTrue(slot.getTableName().toString().equals("DB.tbl"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user