diff --git a/.gitignore b/.gitignore index b04c6a29bb6aa0..de27c245a7f7e9 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,11 @@ ui/node_modules ui/package-lock.json docs/package-lock.json fe/fe-common/.classpath +fe/.flattened-pom.xml +fe/fe-common/.flattened-pom.xml +fe/fe-core/.flattened-pom.xml +fe/spark-dpp/.flattened-pom.xml + rpc_data/ ## ignore sample target diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js index 726f8f331df99e..d7c65563f3e9ed 100644 --- a/docs/.vuepress/sidebar/en.js +++ b/docs/.vuepress/sidebar/en.js @@ -524,7 +524,6 @@ module.exports = [ "ADMIN SHOW CONFIG", "ADMIN SHOW REPLICA DISTRIBUTION", "ADMIN SHOW REPLICA STATUS", - "ADMIN-SHOW-DATA-SKEW", "ALTER CLUSTER", "ALTER SYSTEM", "CANCEL DECOMMISSION", @@ -616,6 +615,7 @@ module.exports = [ "SHOW CREATE FUNCTION", "SHOW CREATE ROUTINE LOAD", "SHOW DATA", + "SHOW DATA SKEW", "SHOW DATABASES", "SHOW DELETE", "SHOW DYNAMIC PARTITION TABLES", diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js index ebd0ab8348058b..34d8523b84f2ed 100644 --- a/docs/.vuepress/sidebar/zh-CN.js +++ b/docs/.vuepress/sidebar/zh-CN.js @@ -528,7 +528,6 @@ module.exports = [ "ADMIN SHOW CONFIG", "ADMIN SHOW REPLICA DISTRIBUTION", "ADMIN SHOW REPLICA STATUS", - "ADMIN-SHOW-DATA-SKEW", "ALTER CLUSTER", "ALTER SYSTEM", "CANCEL DECOMMISSION", @@ -618,6 +617,7 @@ module.exports = [ "SHOW CREATE FUNCTION", "SHOW CREATE ROUTINE LOAD", "SHOW DATA", + "SHOW DATA SKEW", "SHOW DATABASES", "SHOW DELETE", "SHOW DYNAMIC PARTITION TABLES", diff --git a/docs/en/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md b/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md similarity index 85% rename from docs/en/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md rename to docs/en/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md index 21f975d2676c59..c7511f338eccbf 100644 --- a/docs/en/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md +++ b/docs/en/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md @@ -1,6 +1,6 @@ --- { - "title": "ADMIN SHOW DATA SKEW", + "title": "SHOW DATA SKEW", "language": "en" } --- @@ -24,14 +24,14 @@ specific language governing permissions and limitations under the License. --> -# ADMIN SHOW DATA SKEW +# SHOW DATA SKEW ## description This statement is used to view the data skew of a table or a partition. grammar: - ADMIN SHOW DATA SKEW FROM [db_name.]tbl_name [PARTITION (p1)]; + SHOW DATA SKEW FROM [db_name.]tbl_name [PARTITION (p1)]; Description: @@ -42,9 +42,9 @@ under the License. 1. View the data skew of the table - ADMIN SHOW DATA SKEW FROM db1.test PARTITION(p1); + SHOW DATA SKEW FROM db1.test PARTITION(p1); ## keyword - ADMIN, SHOW, DATA, SKEW + SHOW, DATA, SKEW diff --git a/docs/zh-CN/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md b/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md similarity index 84% rename from docs/zh-CN/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md rename to docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md index 218e2634f9db60..75f93aae3753dd 100644 --- a/docs/zh-CN/sql-reference/sql-statements/Administration/ADMIN-SHOW-DATA-SKEW.md +++ b/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/SHOW DATA SKEW.md @@ -1,6 +1,6 @@ --- { - "title": "ADMIN SHOW DATA SKEW", + "title": "SHOW DATA SKEW", "language": "zh-CN" } --- @@ -24,14 +24,14 @@ specific language governing permissions and limitations under the License. --> -# ADMIN SHOW DATA SKEW +# SHOW DATA SKEW ## description 该语句用于查看表或某个分区的数据倾斜情况。 语法: - ADMIN SHOW DATA SKEW FROM [db_name.]tbl_name PARTITION (partition_name); + SHOW DATA SKEW FROM [db_name.]tbl_name PARTITION (partition_name); 说明: @@ -42,9 +42,9 @@ under the License. 1. 查看表的数据倾斜情况 - ADMIN SHOW DATA SKEW FROM db1.test PARTITION(p1); + SHOW DATA SKEW FROM db1.test PARTITION(p1); ## keyword - ADMIN,SHOW,DATA,SKEW + SHOW,DATA,SKEW diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 11e244805b372f..cf8c11add59657 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -2717,6 +2717,10 @@ show_param ::= {: RESULT = new ShowAlterStmt(type, db, parser.where, orderByClause, limitClause); :} + | KW_SHOW KW_DATA KW_SKEW KW_FROM base_table_ref:table_ref + {: + RESULT = new ShowDataSkewStmt(table_ref); + :} /* Show data statement: used to show data size of specified range */ | KW_DATA order_by_clause:orderByClause {: @@ -5253,10 +5257,6 @@ admin_stmt ::= {: RESULT = new AdminCheckTabletsStmt(tabletIds, properties); :} - | KW_ADMIN KW_SHOW KW_DATA KW_SKEW KW_FROM base_table_ref:table_ref - {: - RESULT = new AdminShowDataSkewStmt(table_ref); - :} | KW_ADMIN KW_CLEAN KW_TRASH KW_ON LPAREN string_list:backends RPAREN {: RESULT = new AdminCleanTrashStmt(backends); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java index e6b6f71177c1ee..3ee94b70ae4256 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDbStmt.java @@ -32,7 +32,6 @@ import java.util.HashMap; import java.util.Map; -// 用于描述CREATE DATABASE的内部结构 public class CreateDbStmt extends DdlStmt { private boolean ifNotExists; private String dbName; diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminShowDataSkewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java similarity index 80% rename from fe/fe-core/src/main/java/org/apache/doris/analysis/AdminShowDataSkewStmt.java rename to fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java index d7355e8646cc4a..01e12f50ce9d02 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AdminShowDataSkewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataSkewStmt.java @@ -30,8 +30,8 @@ import com.google.common.collect.ImmutableList; -// admin show data skew from tbl [partition(p1, p2, ...)] -public class AdminShowDataSkewStmt extends ShowStmt { +// show data skew from tbl [partition(p1, p2, ...)] +public class ShowDataSkewStmt extends ShowStmt { public static final ImmutableList TITLE_NAMES = new ImmutableList.Builder() .add("BucketIdx").add("AvgDataSize") .add("Graph").add("Percent") @@ -39,21 +39,22 @@ public class AdminShowDataSkewStmt extends ShowStmt { private TableRef tblRef; - public AdminShowDataSkewStmt(TableRef tblRef) { + public ShowDataSkewStmt(TableRef tblRef) { this.tblRef = tblRef; } @Override public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); - - // check auth - if (!Catalog.getCurrentCatalog().getAuth().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { - ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "ADMIN"); - } - tblRef.getName().analyze(analyzer); - + if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tblRef.getName().getDb(), + tblRef.getName().getTbl(), + PrivPredicate.SHOW)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SHOW DATA SKEW", + ConnectContext.get().getQualifiedUser(), + ConnectContext.get().getRemoteIP(), + tblRef.getName().getDb() + "." + tblRef.getName().getTbl()); + } PartitionNames partitionNames = tblRef.getPartitionNames(); if (partitionNames == null || partitionNames.getPartitionNames().size() != 1) { throw new AnalysisException("Should specify one and only one partition"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java index 2218f1f8631ff7..7ae277454b6ff5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java @@ -17,7 +17,7 @@ package org.apache.doris.catalog; -import org.apache.doris.analysis.AdminShowDataSkewStmt; +import org.apache.doris.analysis.ShowDataSkewStmt; import org.apache.doris.analysis.AdminShowReplicaDistributionStmt; import org.apache.doris.analysis.AdminShowReplicaStatusStmt; import org.apache.doris.analysis.BinaryPredicate.Operator; @@ -247,7 +247,7 @@ private static String graph(long num, long totalNum) { return sb.toString(); } - public static List> getDataSkew(AdminShowDataSkewStmt stmt) throws DdlException { + public static List> getDataSkew(ShowDataSkewStmt stmt) throws DdlException { return getDataSkew(stmt.getDbName(), stmt.getTblName(), stmt.getPartitionNames()); } @@ -257,7 +257,6 @@ private static List> getDataSkew(String dbName, String tblName, Par List> result = Lists.newArrayList(); Catalog catalog = Catalog.getCurrentCatalog(); - SystemInfoService infoService = Catalog.getCurrentSystemInfo(); if (partitionNames == null || partitionNames.getPartitionNames().size() != 1) { throw new DdlException("Should specify one and only one partitions"); @@ -288,7 +287,7 @@ private static List> getDataSkew(String dbName, String tblName, Par List tabletIds = mIndex.getTabletIdsInOrder(); for (int i = 0; i < tabletIds.size(); i++) { Tablet tablet = mIndex.getTablet(tabletIds.get(i)); - long dataSize = tablet.getDataSize(false); + long dataSize = tablet.getDataSize(true); tabletInfos.set(i, tabletInfos.get(i) + dataSize); totalSize += dataSize; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java index 8154d6d152678b..ba71941590b9f9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Tablet.java @@ -382,13 +382,7 @@ public boolean equals(Object obj) { public long getDataSize(boolean singleReplica) { LongStream s = replicas.stream().filter(r -> r.getState() == ReplicaState.NORMAL) .mapToLong(Replica::getDataSize); - return singleReplica ? Double.valueOf(s.average().getAsDouble()).longValue() : s.sum(); - } - - public long getRowNum(boolean singleReplica) { - LongStream s = replicas.stream().filter(r -> r.getState() == ReplicaState.NORMAL) - .mapToLong(Replica::getRowCount); - return singleReplica ? Double.valueOf(s.average().getAsDouble()).longValue() : s.sum(); + return singleReplica ? Double.valueOf(s.average().orElse(0)).longValue() : s.sum(); } /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java index 99c770509f4d77..b3af3597ea7290 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java @@ -18,7 +18,6 @@ package org.apache.doris.qe; import org.apache.doris.analysis.AdminShowConfigStmt; -import org.apache.doris.analysis.AdminShowDataSkewStmt; import org.apache.doris.analysis.AdminShowReplicaDistributionStmt; import org.apache.doris.analysis.AdminShowReplicaStatusStmt; import org.apache.doris.analysis.DescribeStmt; @@ -37,6 +36,7 @@ import org.apache.doris.analysis.ShowCreateFunctionStmt; import org.apache.doris.analysis.ShowCreateRoutineLoadStmt; import org.apache.doris.analysis.ShowCreateTableStmt; +import org.apache.doris.analysis.ShowDataSkewStmt; import org.apache.doris.analysis.ShowDataStmt; import org.apache.doris.analysis.ShowDbIdStmt; import org.apache.doris.analysis.ShowDbStmt; @@ -317,8 +317,8 @@ public ShowResultSet execute() throws AnalysisException { handleShowQueryProfile(); } else if (stmt instanceof ShowLoadProfileStmt) { handleShowLoadProfile(); - } else if (stmt instanceof AdminShowDataSkewStmt) { - handleAdminShowDataSkew(); + } else if (stmt instanceof ShowDataSkewStmt) { + handleShowDataSkew(); } else if (stmt instanceof ShowSyncJobStmt) { handleShowSyncJobs(); } else if (stmt instanceof ShowSqlBlockRuleStmt) { @@ -2026,8 +2026,8 @@ private void handleShowCreateRoutineLoad() throws AnalysisException { resultSet = new ShowResultSet(showCreateRoutineLoadStmt.getMetaData(), rows); } - private void handleAdminShowDataSkew() throws AnalysisException { - AdminShowDataSkewStmt showStmt = (AdminShowDataSkewStmt) stmt; + private void handleShowDataSkew() throws AnalysisException { + ShowDataSkewStmt showStmt = (ShowDataSkewStmt) stmt; try { List> results = MetadataViewer.getDataSkew(showStmt); resultSet = new ShowResultSet(showStmt.getMetaData(), results); diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java index efe5a5d1e3f206..2ad1a06f9c6c08 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java @@ -92,8 +92,8 @@ public void testShowReplicaDistribution() throws Exception { Assert.assertEquals(1, resultSet.getResultRows().size()); Assert.assertEquals(7, resultSet.getResultRows().get(0).size()); - stmtStr = "admin show data skew from test.tbl1 partition(p1)"; - AdminShowDataSkewStmt skewStmt = (AdminShowDataSkewStmt) UtFrameUtils.parseAndAnalyzeStmt( + stmtStr = "show data skew from test.tbl1 partition(p1)"; + ShowDataSkewStmt skewStmt = (ShowDataSkewStmt) UtFrameUtils.parseAndAnalyzeStmt( stmtStr, connectContext); executor = new ShowExecutor(connectContext, skewStmt); resultSet = executor.execute(); diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDbStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDbStmtTest.java index 68504af0f8581c..47672286cf0fc8 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDbStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDbStmtTest.java @@ -48,7 +48,7 @@ public void setUp() { } @Test - public void testAnalyzeNormal() throws UserException, AnalysisException { + public void testAnalyzeNormal() throws UserException { CreateDbStmt dbStmt = new CreateDbStmt(false, "test", null); dbStmt.analyze(analyzer); Assert.assertEquals("testCluster:test", dbStmt.getFullDbName()); @@ -56,7 +56,7 @@ public void testAnalyzeNormal() throws UserException, AnalysisException { } @Test(expected = AnalysisException.class) - public void testAnalyzeWithException() throws UserException, AnalysisException { + public void testAnalyzeWithException() throws UserException { CreateDbStmt stmt = new CreateDbStmt(false, "", null); stmt.analyze(analyzer); Assert.fail("no exception"); @@ -82,8 +82,8 @@ public void testAnalyzeIcebergWithException() throws UserException { Map properties = new HashMap<>(); properties.put("iceberg.database", "doris"); properties.put("iceberg.hive.metastore.uris", "thrift://127.0.0.1:9087"); - CreateDbStmt stmt = new CreateDbStmt(false, "test", properties); + CreateDbStmt stmt = new CreateDbStmt(false, "", properties); stmt.analyze(analyzer); - Assert.fail("no exception"); + Assert.fail("No exception throws."); } } \ No newline at end of file diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowTableCreationStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowTableCreationStmtTest.java index c4efe22d021652..033c27af52178a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowTableCreationStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowTableCreationStmtTest.java @@ -46,9 +46,10 @@ public void testNormal() throws UserException { ShowTableCreationStmt stmt = new ShowTableCreationStmt("doris", "log"); stmt.analyze(analyzer); Assert.assertEquals("SHOW TABLE CREATION FROM `testCluster:doris` LIKE `log`", stmt.toString()); - Assert.assertEquals(4, stmt.getMetaData().getColumnCount()); - Assert.assertEquals("Table", stmt.getMetaData().getColumn(0).getName()); - Assert.assertEquals("Status", stmt.getMetaData().getColumn(1).getName()); + Assert.assertEquals(5, stmt.getMetaData().getColumnCount()); + Assert.assertEquals("Database", stmt.getMetaData().getColumn(0).getName()); + Assert.assertEquals("Table", stmt.getMetaData().getColumn(1).getName()); + Assert.assertEquals("Status", stmt.getMetaData().getColumn(2).getName()); } @Test diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 6323f6ee5ea992..e7bbaaebe2e63c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -37,6 +37,7 @@ import org.apache.doris.catalog.Replica; import org.apache.doris.catalog.Tablet; import org.apache.doris.catalog.Type; +import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.FeConstants; import org.apache.doris.common.jmockit.Deencapsulation; @@ -1638,33 +1639,33 @@ public void testCheckInvalidDate() throws Exception { //valid date contains micro second sql = "select day from tbl_int_date where day = '2020-10-30 10:00:01.111111'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("PREDICATES: `day` = '2020-10-30 10:00:01.111111'")); + Assert.assertTrue(explainString.contains("PREDICATES: `day` = '2020-10-30 10:00:01'")); //invalid date + sql = "select day from tbl_int_date where day = '2020-10-32'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: '2020-10-32' in expression: `day` = '2020-10-32'")); + //invalid date sql = "select day from tbl_int_date where day = '20201032'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: '20201032' in expression: `day` = '20201032'")); //invalid date sql = "select day from tbl_int_date where day = 20201032"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: 20201032 in expression: `day` = 20201032")); //invalid date sql = "select day from tbl_int_date where day = 'hello'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: 'hello' in expression: `day` = 'hello'")); //invalid date sql = "select day from tbl_int_date where day = 2020-10-30"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); - //invalid date + Assert.assertTrue(explainString.contains("Incorrect datetime value: 1980 in expression: `day` = 1980")); + //invalid date sql = "select day from tbl_int_date where day = 10-30"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); - - + Assert.assertTrue(explainString.contains("Incorrect datetime value: -20 in expression: `day` = -20")); //valid datetime sql = "select day from tbl_int_date where date = '2020-10-30 12:12:30'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); @@ -1692,35 +1693,35 @@ public void testCheckInvalidDate() throws Exception { //valid datetime contains micro second sql = "select day from tbl_int_date where date = '2020-10-30 10:00:01.111111'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2020-10-30 10:00:01.111111'")); + Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2020-10-30 10:00:01'")); //invalid datetime sql = "select day from tbl_int_date where date = '2020-10-32'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: '2020-10-32' in expression: `date` = '2020-10-32'")); //invalid datetime sql = "select day from tbl_int_date where date = 'hello'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: 'hello' in expression: `date` = 'hello'")); //invalid datetime sql = "select day from tbl_int_date where date = 2020-10-30"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: 1980 in expression: `date` = 1980")); //invalid datetime sql = "select day from tbl_int_date where date = 10-30"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("Incorrect datetime value: -20 in expression: `date` = -20")); //invalid datetime sql = "select day from tbl_int_date where date = '2020-10-12 12:23:76'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); - //invalid datetime with timestamp + Assert.assertTrue(explainString.contains("Incorrect datetime value: '2020-10-12 12:23:76' in expression: `date` = '2020-10-12 12:23:76'")); + sql = "select day from tbl_int_date where date = '1604031150'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); - //valid datetime with timestamp in micro second + Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2016-04-03 11:50:00'")); + sql = "select day from tbl_int_date where date = '1604031150000'"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "EXPLAIN " + sql); - Assert.assertTrue(explainString.contains("EMPTYSET")); + Assert.assertTrue(explainString.contains("PREDICATES: `date` = '2016-04-03 11:50:00'")); String queryStr = "explain select count(*) from test.baseall where k11 > to_date(now())"; explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, queryStr);