diff --git a/be/src/exec/table_connector.cpp b/be/src/exec/table_connector.cpp index 12dc3acdc2..30b01b1d03 100644 --- a/be/src/exec/table_connector.cpp +++ b/be/src/exec/table_connector.cpp @@ -226,8 +226,13 @@ Status TableConnector::convert_column_data(const vectorized::ColumnPtr& column_p case TYPE_VARCHAR: case TYPE_CHAR: case TYPE_STRING: { - // here need check the ' is used, now for pg array string must be " - fmt::format_to(_insert_stmt_buffer, "\"{}\"", fmt::basic_string_view(item, size)); + // TODO(zhangstar333): check array data type of postgresql + // for oracle/pg database string must be ' + if (table_type == TOdbcTableType::ORACLE || table_type == TOdbcTableType::POSTGRESQL) { + fmt::format_to(_insert_stmt_buffer, "'{}'", fmt::basic_string_view(item, size)); + } else { + fmt::format_to(_insert_stmt_buffer, "\"{}\"", fmt::basic_string_view(item, size)); + } break; } case TYPE_ARRAY: { diff --git a/docker/thirdparties/docker-compose/mysql/init/03-create-table.sql b/docker/thirdparties/docker-compose/mysql/init/03-create-table.sql index 02c257cbc8..8fb1aebc4b 100644 --- a/docker/thirdparties/docker-compose/mysql/init/03-create-table.sql +++ b/docker/thirdparties/docker-compose/mysql/init/03-create-table.sql @@ -223,4 +223,9 @@ create table doris_test.ex_tb20 ( decimal_unsigned_long decimal(65, 5) unsigned ) engine=innodb charset=utf8; +create table doris_test.test_insert ( + `id` varchar(128) NULL, + `name` varchar(128) NULL, + `age` int NULL +) engine=innodb charset=utf8; diff --git a/docker/thirdparties/docker-compose/oracle/init/03-create-table.sql b/docker/thirdparties/docker-compose/oracle/init/03-create-table.sql index d5dd8cf1c6..d2d8d6af7e 100644 --- a/docker/thirdparties/docker-compose/oracle/init/03-create-table.sql +++ b/docker/thirdparties/docker-compose/oracle/init/03-create-table.sql @@ -78,3 +78,9 @@ t4 timestamp, t5 interval year(3) to month, t6 interval day(3) to second(6) ); + +create table doris_test.test_insert( +id varchar2(128), +name varchar2(128), +age number(5) +); diff --git a/docker/thirdparties/docker-compose/postgresql/init/02-create-table.sql b/docker/thirdparties/docker-compose/postgresql/init/02-create-table.sql index b721da297a..6ace3b20cb 100644 --- a/docker/thirdparties/docker-compose/postgresql/init/02-create-table.sql +++ b/docker/thirdparties/docker-compose/postgresql/init/02-create-table.sql @@ -150,3 +150,9 @@ CREATE TABLE catalog_pg_test.test12 ( ID INT NOT NULL, uuid_value uuid ); + +CREATE TABLE catalog_pg_test.test_insert ( + id varchar(128), + name varchar(128), + age int +); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java index 44140b24e9..891fe3349b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java @@ -31,6 +31,8 @@ import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.PartitionType; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf; +import org.apache.doris.catalog.external.JdbcExternalDatabase; +import org.apache.doris.catalog.external.JdbcExternalTable; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.DdlException; import org.apache.doris.common.ErrorCode; @@ -39,6 +41,8 @@ import org.apache.doris.common.Pair; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DebugUtil; import org.apache.doris.common.util.Util; +import org.apache.doris.datasource.ExternalCatalog; +import org.apache.doris.datasource.JdbcExternalCatalog; import org.apache.doris.mysql.privilege.PrivPredicate; import org.apache.doris.planner.DataPartition; import org.apache.doris.planner.DataSink; @@ -110,7 +114,7 @@ public class InsertStmt extends DdlStmt { private Table targetTable; - private Database db; + private DatabaseIf db; private long transactionId; // we need a new TupleDesc for olap table. @@ -191,12 +195,15 @@ public class InsertStmt extends DdlStmt { // get dbs of statement queryStmt.getTables(analyzer, false, tableMap, parentViewNameSet); tblName.analyze(analyzer); - // disallow external catalog - Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); + // disallow external catalog except JdbcExternalCatalog + if (analyzer.getEnv().getCurrentCatalog() instanceof ExternalCatalog + && !(analyzer.getEnv().getCurrentCatalog() instanceof JdbcExternalCatalog)) { + Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); + } String dbName = tblName.getDb(); String tableName = tblName.getTbl(); // check exist - DatabaseIf db = analyzer.getEnv().getInternalCatalog().getDbOrAnalysisException(dbName); + DatabaseIf db = analyzer.getEnv().getCatalogMgr().getCatalog(tblName.getCtl()).getDbOrAnalysisException(dbName); TableIf table = db.getTableOrAnalysisException(tblName.getTbl()); // check access @@ -247,7 +254,7 @@ public class InsertStmt extends DdlStmt { return dataSink; } - public Database getDbObj() { + public DatabaseIf getDbObj() { return db; } @@ -261,8 +268,11 @@ public class InsertStmt extends DdlStmt { if (targetTable == null) { tblName.analyze(analyzer); - // disallow external catalog - Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); + // disallow external catalog except JdbcExternalCatalog + if (analyzer.getEnv().getCurrentCatalog() instanceof ExternalCatalog + && !(analyzer.getEnv().getCurrentCatalog() instanceof JdbcExternalCatalog)) { + Util.prohibitExternalCatalog(tblName.getCtl(), this.getClass().getSimpleName()); + } } // Check privilege @@ -292,8 +302,7 @@ public class InsertStmt extends DdlStmt { // create data sink createDataSink(); - db = analyzer.getEnv().getInternalCatalog().getDbOrAnalysisException(tblName.getDb()); - + db = analyzer.getEnv().getCatalogMgr().getCatalog(tblName.getCtl()).getDbOrAnalysisException(tblName.getDb()); // create label and begin transaction long timeoutSecond = ConnectContext.get().getSessionVariable().getQueryTimeoutS(); if (Strings.isNullOrEmpty(label)) { @@ -322,8 +331,16 @@ public class InsertStmt extends DdlStmt { private void analyzeTargetTable(Analyzer analyzer) throws AnalysisException { // Get table if (targetTable == null) { - DatabaseIf db = Env.getCurrentInternalCatalog().getDbOrAnalysisException(tblName.getDb()); - targetTable = (Table) db.getTableOrAnalysisException(tblName.getTbl()); + DatabaseIf db = analyzer.getEnv().getCatalogMgr() + .getCatalog(tblName.getCtl()).getDbOrAnalysisException(tblName.getDb()); + if (db instanceof Database) { + targetTable = (Table) db.getTableOrAnalysisException(tblName.getTbl()); + } else if (db instanceof JdbcExternalDatabase) { + JdbcExternalTable jdbcTable = (JdbcExternalTable) db.getTableOrAnalysisException(tblName.getTbl()); + targetTable = jdbcTable.getJdbcTable(); + } else { + throw new AnalysisException("Not support insert target table."); + } } if (targetTable instanceof OlapTable) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java index 347bb33205..dec2a4298f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java @@ -18,6 +18,7 @@ package org.apache.doris.transaction; import org.apache.doris.catalog.Database; +import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.MaterializedIndex; import org.apache.doris.catalog.OlapTable; @@ -664,7 +665,7 @@ public class DatabaseTransactionMgr { LOG.info("transaction:[{}] successfully committed", transactionState); } - public boolean waitForTransactionFinished(Database db, long transactionId, long timeoutMillis) + public boolean waitForTransactionFinished(DatabaseIf db, long transactionId, long timeoutMillis) throws TransactionCommitFailedException { TransactionState transactionState = null; readLock(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java index f12e219771..3c84056789 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java @@ -18,6 +18,7 @@ package org.apache.doris.transaction; import org.apache.doris.catalog.Database; +import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.Table; import org.apache.doris.common.AnalysisException; @@ -243,13 +244,13 @@ public class GlobalTransactionMgr implements Writable { dbTransactionMgr.commitTransaction(null, transactionId, null, null, true); } - public boolean commitAndPublishTransaction(Database db, List