[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:
谢健
2023-03-07 14:41:35 +08:00
committed by GitHub
parent b9bb28f22c
commit 05c5ab5490
4 changed files with 30 additions and 6 deletions

View File

@ -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();

View File

@ -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() {

View File

@ -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"));

View File

@ -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"));
}
}