This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 783445b1889 [fix](create-table)The CREATE TABLE IF NOT EXISTS AS 
SELECT statement should refrain from performing any INSERT operations if the 
table already exists (#35210)
783445b1889 is described below

commit 783445b18899996594412f4cfa5b568a54adf402
Author: Calvin Kirs <[email protected]>
AuthorDate: Thu May 23 22:13:49 2024 +0800

    [fix](create-table)The CREATE TABLE IF NOT EXISTS AS SELECT statement 
should refrain from performing any INSERT operations if the table already 
exists (#35210)
---
 .../doris/analysis/CreateTableAsSelectStmt.java    |  8 ++
 .../main/java/org/apache/doris/catalog/Env.java    |  6 +-
 .../org/apache/doris/datasource/CatalogIf.java     |  6 +-
 .../apache/doris/datasource/ExternalCatalog.java   |  6 +-
 .../apache/doris/datasource/InternalCatalog.java   | 99 ++++++++++++----------
 .../doris/datasource/hive/HiveMetadataOps.java     |  5 +-
 .../datasource/iceberg/IcebergMetadataOps.java     |  5 +-
 .../datasource/operations/ExternalMetadataOps.java |  3 +-
 .../trees/plans/commands/CreateTableCommand.java   |  4 +-
 .../java/org/apache/doris/qe/StmtExecutor.java     |  3 +
 ...est_create_table_if_not_exists_as_select.groovy | 97 +++++++++++++++++++++
 11 files changed, 183 insertions(+), 59 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableAsSelectStmt.java
 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableAsSelectStmt.java
index c98fa9414a5..9315817e690 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableAsSelectStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateTableAsSelectStmt.java
@@ -30,6 +30,7 @@ import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.base.Preconditions;
 import lombok.Getter;
+import lombok.Setter;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -54,6 +55,13 @@ public class CreateTableAsSelectStmt extends DdlStmt {
     @Getter
     private final InsertStmt insertStmt;
 
+    /**
+     * If the table has already exists, set this flag to true.
+     */
+    @Setter
+    @Getter
+    private boolean tableHasExists = false;
+
     protected CreateTableAsSelectStmt(CreateTableStmt createTableStmt,
                                       List<String> columnNames, QueryStmt 
queryStmt) {
         this.createTableStmt = createTableStmt;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index 77aa7a2f2b1..f029d9e5e58 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -3167,11 +3167,13 @@ public class Env {
      * 9. create tablet in BE
      * 10. add this table to FE's meta
      * 11. add this table to ColocateGroup if necessary
+     * @return if CreateTableStmt.isIfNotExists is true, return true if table 
already exists
+     * otherwise return false
      */
-    public void createTable(CreateTableStmt stmt) throws UserException {
+    public boolean createTable(CreateTableStmt stmt) throws UserException {
         CatalogIf<?> catalogIf = 
catalogMgr.getCatalogOrException(stmt.getCatalogName(),
                 catalog -> new DdlException(("Unknown catalog " + catalog)));
-        catalogIf.createTable(stmt);
+        return catalogIf.createTable(stmt);
     }
 
     public void createTableLike(CreateTableLikeStmt stmt) throws DdlException {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
index 072597deb55..ceee1a68157 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java
@@ -187,7 +187,11 @@ public interface CatalogIf<T extends DatabaseIf> {
 
     void dropDb(DropDbStmt stmt) throws DdlException;
 
-    void createTable(CreateTableStmt stmt) throws UserException;
+    /**
+     * @return if org.apache.doris.analysis.CreateTableStmt.ifNotExists is 
true, return true if table exists,
+     * return false otherwise
+     */
+    boolean createTable(CreateTableStmt stmt) throws UserException;
 
     void dropTable(DropTableStmt stmt) throws DdlException;
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
index 12819da632d..bbe385904a3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
@@ -726,14 +726,14 @@ public abstract class ExternalCatalog
     }
 
     @Override
-    public void createTable(CreateTableStmt stmt) throws UserException {
+    public boolean createTable(CreateTableStmt stmt) throws UserException {
         makeSureInitialized();
         if (metadataOps == null) {
             LOG.warn("createTable not implemented");
-            return;
+            return false;
         }
         try {
-            metadataOps.createTable(stmt);
+            return metadataOps.createTable(stmt);
         } catch (Exception e) {
             LOG.warn("Failed to create a table.", e);
             throw e;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index e2d84594547..d1d0b7d4eff 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -1147,7 +1147,7 @@ public class InternalCatalog implements 
CatalogIf<Database> {
      * 10. add this table to FE's meta
      * 11. add this table to ColocateGroup if necessary
      */
-    public void createTable(CreateTableStmt stmt) throws UserException {
+    public boolean createTable(CreateTableStmt stmt) throws UserException {
         String engineName = stmt.getEngineName();
         String dbName = stmt.getDbName();
         String tableName = stmt.getTableName();
@@ -1169,37 +1169,40 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         if (db.getTable(tableName).isPresent()) {
             if (stmt.isSetIfNotExists()) {
                 LOG.info("create table[{}] which already exists", tableName);
-                return;
+                return true;
             } else {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, tableName);
             }
         }
 
         if (engineName.equals("olap")) {
-            createOlapTable(db, stmt);
-            return;
-        } else if (engineName.equals("odbc")) {
-            createOdbcTable(db, stmt);
-            return;
-        } else if (engineName.equals("mysql")) {
-            createMysqlTable(db, stmt);
-            return;
-        } else if (engineName.equals("broker")) {
-            createBrokerTable(db, stmt);
-            return;
-        } else if (engineName.equalsIgnoreCase("elasticsearch") || 
engineName.equalsIgnoreCase("es")) {
-            createEsTable(db, stmt);
-            return;
-        } else if (engineName.equalsIgnoreCase("hive")) {
+            return createOlapTable(db, stmt);
+        }
+        if (engineName.equals("odbc")) {
+            return createOdbcTable(db, stmt);
+        }
+        if (engineName.equals("mysql")) {
+            return createMysqlTable(db, stmt);
+        }
+        if (engineName.equals("broker")) {
+            return createBrokerTable(db, stmt);
+        }
+        if (engineName.equalsIgnoreCase("elasticsearch") || 
engineName.equalsIgnoreCase("es")) {
+            return createEsTable(db, stmt);
+        }
+        if (engineName.equalsIgnoreCase("hive")) {
             // should use hive catalog to create external hive table
             throw new UserException("Cannot create hive table in internal 
catalog, should switch to hive catalog.");
-        } else if (engineName.equalsIgnoreCase("jdbc")) {
-            createJdbcTable(db, stmt);
-            return;
+        }
+        if (engineName.equalsIgnoreCase("jdbc")) {
+            return createJdbcTable(db, stmt);
+
         } else {
             
ErrorReport.reportDdlException(ErrorCode.ERR_UNKNOWN_STORAGE_ENGINE, 
engineName);
         }
+
         Preconditions.checkState(false);
+        return false;
     }
 
     public void createTableLike(CreateTableLikeStmt stmt) throws DdlException {
@@ -1357,7 +1360,8 @@ public class InternalCatalog implements 
CatalogIf<Database> {
             }
             Analyzer dummyRootAnalyzer = new Analyzer(Env.getCurrentEnv(), 
ConnectContext.get());
             createTableStmt.analyze(dummyRootAnalyzer);
-            createTable(createTableStmt);
+            boolean tableHasExists = createTable(createTableStmt);
+            stmt.setTableHasExists(tableHasExists);
         } catch (UserException e) {
             throw new DdlException("Failed to execute CTAS Reason: " + 
e.getMessage());
         }
@@ -2103,12 +2107,12 @@ public class InternalCatalog implements 
CatalogIf<Database> {
     }
 
     // Create olap table and related base index synchronously.
-    private void createOlapTable(Database db, CreateTableStmt stmt) throws 
UserException {
+    private boolean createOlapTable(Database db, CreateTableStmt stmt) throws 
UserException {
         String tableName = stmt.getTableName();
         if (LOG.isDebugEnabled()) {
             LOG.debug("begin create olap table: {}", tableName);
         }
-
+        boolean tableHasExist = false;
         BinlogConfig dbBinlogConfig;
         db.readLock();
         try {
@@ -2908,9 +2912,10 @@ public class InternalCatalog implements 
CatalogIf<Database> {
                 throw t;
             }
         }
+        return tableHasExist;
     }
 
-    private void createMysqlTable(Database db, CreateTableStmt stmt) throws 
DdlException {
+    private boolean createMysqlTable(Database db, CreateTableStmt stmt) throws 
DdlException {
         String tableName = stmt.getTableName();
 
         List<Column> columns = stmt.getColumns();
@@ -2918,26 +2923,22 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         long tableId = Env.getCurrentEnv().getNextId();
         MysqlTable mysqlTable = new MysqlTable(tableId, tableName, columns, 
stmt.getProperties());
         mysqlTable.setComment(stmt.getComment());
-        if (!db.createTableWithLock(mysqlTable, false, 
stmt.isSetIfNotExists()).first) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, 
tableName);
-        }
-        LOG.info("successfully create table[{}-{}]", tableName, tableId);
+        Pair<Boolean, Boolean> result = db.createTableWithLock(mysqlTable, 
false, stmt.isSetIfNotExists());
+        return checkCreateTableResult(tableName, tableId, result);
     }
 
-    private void createOdbcTable(Database db, CreateTableStmt stmt) throws 
DdlException {
+    private boolean createOdbcTable(Database db, CreateTableStmt stmt) throws 
DdlException {
         String tableName = stmt.getTableName();
         List<Column> columns = stmt.getColumns();
 
         long tableId = Env.getCurrentEnv().getNextId();
         OdbcTable odbcTable = new OdbcTable(tableId, tableName, columns, 
stmt.getProperties());
         odbcTable.setComment(stmt.getComment());
-        if (!db.createTableWithLock(odbcTable, false, 
stmt.isSetIfNotExists()).first) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, 
tableName);
-        }
-        LOG.info("successfully create table[{}-{}]", tableName, tableId);
+        Pair<Boolean, Boolean> result = db.createTableWithLock(odbcTable, 
false, stmt.isSetIfNotExists());
+        return checkCreateTableResult(tableName, tableId, result);
     }
 
-    private Table createEsTable(Database db, CreateTableStmt stmt) throws 
DdlException, AnalysisException {
+    private boolean createEsTable(Database db, CreateTableStmt stmt) throws 
DdlException, AnalysisException {
         String tableName = stmt.getTableName();
 
         // validate props to get column from es.
@@ -2970,14 +2971,11 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         esTable.setId(tableId);
         esTable.setComment(stmt.getComment());
         esTable.syncTableMetaData();
-        if (!db.createTableWithLock(esTable, false, 
stmt.isSetIfNotExists()).first) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, 
tableName);
-        }
-        LOG.info("successfully create table{} with id {}", tableName, tableId);
-        return esTable;
+        Pair<Boolean, Boolean> result = db.createTableWithLock(esTable, false, 
stmt.isSetIfNotExists());
+        return checkCreateTableResult(tableName, tableId, result);
     }
 
-    private void createBrokerTable(Database db, CreateTableStmt stmt) throws 
DdlException {
+    private boolean createBrokerTable(Database db, CreateTableStmt stmt) 
throws DdlException {
         String tableName = stmt.getTableName();
 
         List<Column> columns = stmt.getColumns();
@@ -2986,11 +2984,8 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         BrokerTable brokerTable = new BrokerTable(tableId, tableName, columns, 
stmt.getProperties());
         brokerTable.setComment(stmt.getComment());
         brokerTable.setBrokerProperties(stmt.getExtProperties());
-
-        if (!db.createTableWithLock(brokerTable, false, 
stmt.isSetIfNotExists()).first) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, 
tableName);
-        }
-        LOG.info("successfully create table[{}-{}]", tableName, tableId);
+        Pair<Boolean, Boolean> result = db.createTableWithLock(brokerTable, 
false, stmt.isSetIfNotExists());
+        return checkCreateTableResult(tableName, tableId, result);
     }
 
     private void createHiveTable(Database db, CreateTableStmt stmt) throws 
DdlException {
@@ -3017,7 +3012,7 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         LOG.info("successfully create table[{}-{}]", tableName, tableId);
     }
 
-    private void createJdbcTable(Database db, CreateTableStmt stmt) throws 
DdlException {
+    private boolean createJdbcTable(Database db, CreateTableStmt stmt) throws 
DdlException {
         String tableName = stmt.getTableName();
         List<Column> columns = stmt.getColumns();
 
@@ -3026,10 +3021,20 @@ public class InternalCatalog implements 
CatalogIf<Database> {
         JdbcTable jdbcTable = new JdbcTable(tableId, tableName, columns, 
stmt.getProperties());
         jdbcTable.setComment(stmt.getComment());
         // check table if exists
-        if (!db.createTableWithLock(jdbcTable, false, 
stmt.isSetIfNotExists()).first) {
+        Pair<Boolean, Boolean> result = db.createTableWithLock(jdbcTable, 
false, stmt.isSetIfNotExists());
+        return checkCreateTableResult(tableName, tableId, result);
+    }
+
+    private boolean checkCreateTableResult(String tableName, long tableId, 
Pair<Boolean, Boolean> result)
+                throws DdlException {
+        if (Boolean.FALSE.equals(result.first)) {
             ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, 
tableName);
         }
+        if (Boolean.TRUE.equals(result.second)) {
+            return true;
+        }
         LOG.info("successfully create table[{}-{}]", tableName, tableId);
+        return false;
     }
 
     @VisibleForTesting
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
index 1cf6595bbad..72f19329046 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
@@ -147,7 +147,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
     }
 
     @Override
-    public void createTable(CreateTableStmt stmt) throws UserException {
+    public boolean createTable(CreateTableStmt stmt) throws UserException {
         String dbName = stmt.getDbName();
         String tblName = stmt.getTableName();
         ExternalDatabase<?> db = catalog.getDbNullable(dbName);
@@ -157,7 +157,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
         if (tableExist(dbName, tblName)) {
             if (stmt.isSetIfNotExists()) {
                 LOG.info("create table[{}] which already exists", tblName);
-                return;
+                return true;
             } else {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, tblName);
             }
@@ -225,6 +225,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
         } catch (Exception e) {
             throw new UserException(e.getMessage(), e);
         }
+        return false;
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
index bd1dcdd3e66..c59db7b4b79 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
@@ -119,7 +119,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
     }
 
     @Override
-    public void createTable(CreateTableStmt stmt) throws UserException {
+    public boolean createTable(CreateTableStmt stmt) throws UserException {
         String dbName = stmt.getDbName();
         ExternalDatabase<?> db = dorisCatalog.getDbNullable(dbName);
         if (db == null) {
@@ -129,7 +129,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
         if (tableExist(dbName, tableName)) {
             if (stmt.isSetIfNotExists()) {
                 LOG.info("create table[{}] which already exists", tableName);
-                return;
+                return true;
             } else {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_TABLE_EXISTS_ERROR, tableName);
             }
@@ -147,6 +147,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
         PartitionSpec partitionSpec = 
IcebergUtils.solveIcebergPartitionSpec(stmt.getPartitionDesc(), schema);
         catalog.createTable(TableIdentifier.of(dbName, tableName), schema, 
partitionSpec, properties);
         db.setUnInitialized(true);
+        return false;
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java
index cb6ba35c149..b603b7a3ca7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java
@@ -48,9 +48,10 @@ public interface ExternalMetadataOps {
     /**
      *
      * @param stmt
+     * @return if set isExists is true, return true if table exists, otherwise 
return false
      * @throws UserException
      */
-    void createTable(CreateTableStmt stmt) throws UserException;
+    boolean createTable(CreateTableStmt stmt) throws UserException;
 
     /**
      *
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
index 613c29136d4..e70ad87aa57 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
@@ -151,7 +151,9 @@ public class CreateTableCommand extends Command implements 
ForwardWithSync {
                     ctx.queryId(), createTableInfo.getTableName());
         }
         try {
-            Env.getCurrentEnv().createTable(createTableStmt);
+            if (Env.getCurrentEnv().createTable(createTableStmt)) {
+                return;
+            }
         } catch (Exception e) {
             throw new AnalysisException(e.getMessage(), e.getCause());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 4a127e51497..235d3ac2426 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -2970,6 +2970,9 @@ public class StmtExecutor {
             context.getState().setError(ErrorCode.ERR_UNKNOWN_ERROR, 
"Unexpected exception: " + e.getMessage());
             return;
         }
+        if (ctasStmt.isTableHasExists()) {
+            return;
+        }
         // after success create table insert data
         try {
             parsedStmt = ctasStmt.getInsertStmt();
diff --git 
a/regression-test/suites/table_p0/test_create_table_if_not_exists_as_select.groovy
 
b/regression-test/suites/table_p0/test_create_table_if_not_exists_as_select.groovy
new file mode 100644
index 00000000000..0cd5cf335c4
--- /dev/null
+++ 
b/regression-test/suites/table_p0/test_create_table_if_not_exists_as_select.groovy
@@ -0,0 +1,97 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.junit.Assert;
+
+suite("test_create_table_if_not_exists_as_select") {
+    def base_table_name = 
"test_create_table_if_not_exists_as_select_base_table"
+    def table_name = "test_create_table_if_not_exists_as_select_table"
+    sql """drop table if exists `${base_table_name}`"""
+    sql """drop table if exists `${table_name}`"""
+    sql """SET enable_fallback_to_original_planner=false"""
+
+    sql """
+        CREATE TABLE `${base_table_name}` (
+          `user_id` LARGEINT NOT NULL COMMENT '\"用户id\"',
+          `date` DATE NOT NULL COMMENT '\"数据灌入日期时间\"',
+          `num` SMALLINT NOT NULL COMMENT '\"数量\"'
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`user_id`, `date`, `num`)
+        COMMENT 'OLAP'
+        PARTITION BY RANGE(`date`)
+        (PARTITION p201701_1000 VALUES [('0000-01-01'), ('2017-02-01')),
+        PARTITION p201702_2000 VALUES [('2017-02-01'), ('2017-03-01')),
+        PARTITION p201703_3000 VALUES [('2017-03-01'), ('2017-04-01')),
+        PARTITION p201704_all VALUES [('2017-04-01'), ('2017-05-01')))
+        DISTRIBUTED BY HASH(`user_id`) BUCKETS 2
+        PROPERTIES ('replication_num' = '1') ;
+        """
+    try{
+        sql """
+        CREATE TABLE `${base_table_name}` (
+          `user_id` LARGEINT NOT NULL COMMENT '\"用户id\"',
+          `date` DATE NOT NULL COMMENT '\"数据灌入日期时间\"',
+          `num` SMALLINT NOT NULL COMMENT '\"数量\"'
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`user_id`, `date`, `num`)
+        COMMENT 'OLAP'
+        PARTITION BY RANGE(`date`)
+        (PARTITION p201701_1000 VALUES [('0000-01-01'), ('2017-02-01')),
+        PARTITION p201702_2000 VALUES [('2017-02-01'), ('2017-03-01')),
+        PARTITION p201703_3000 VALUES [('2017-03-01'), ('2017-04-01')),
+        PARTITION p201704_all VALUES [('2017-04-01'), ('2017-05-01')))
+        DISTRIBUTED BY HASH(`user_id`) BUCKETS 2
+        PROPERTIES ('replication_num' = '1') ;
+        """
+    }catch (Exception e){
+        println(e.getMessage())
+        Assert.assertTrue(e.getMessage().contains("Table 
'test_create_table_if_not_exists_as_select_base_table' already exists"))
+    }
+    sql """
+        insert into ${base_table_name} values(1,"2017-01-15",1);
+        """
+    
+   sql """
+       create table if not exists ${table_name} 
PROPERTIES("replication_num"="1") as select * from ${base_table_name}
+       """
+    def firstExecuteCount = sql """select count(*) from ${table_name}"""
+    assertEquals(1, firstExecuteCount[0][0]);
+    sql """
+        create table if not exists ${table_name} 
PROPERTIES("replication_num"="1") as select * from ${base_table_name}
+        """
+    def secondExecuteCount = sql """select count(*) from ${table_name}"""
+    assertEquals(1, secondExecuteCount[0][0]);
+    sql """
+         SET enable_nereids_planner=false;
+        """
+    sql """drop table if exists `${table_name}`"""
+    sql """
+       create table if not exists ${table_name} 
PROPERTIES("replication_num"="1") as select * from ${base_table_name}
+       """
+    def originalFirstExecuteCount = sql """select count(*) from 
${table_name}"""
+    assertEquals(1, originalFirstExecuteCount[0][0]);
+    sql """
+        create table if not exists ${table_name} 
PROPERTIES("replication_num"="1") as select * from ${base_table_name}
+        """
+    def originalSecondExecuteCount = sql """select count(*) from 
${table_name}"""
+    assertEquals(1, originalSecondExecuteCount[0][0]);
+    try{
+        sql """ create table ${table_name} PROPERTIES("replication_num"="1") 
as select * from ${base_table_name} """
+    }catch (Exception e){
+        Assert.assertTrue(e.getMessage().contains("Table 
'test_create_table_if_not_exists_as_select_table' already exists"));
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to