提交 58fb6fca authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Handle tables with specified schema in Parser.parseMergeUsing()

上级 ca7eaa69
...@@ -1150,11 +1150,8 @@ public class Parser { ...@@ -1150,11 +1150,8 @@ public class Parser {
TableFilter sourceTableFilter = readSimpleTableFilter(0, excludeIdentifiers); TableFilter sourceTableFilter = readSimpleTableFilter(0, excludeIdentifiers);
command.setSourceTableFilter(sourceTableFilter); command.setSourceTableFilter(sourceTableFilter);
StringBuilder buff = new StringBuilder("SELECT * FROM ") StringBuilder buff = new StringBuilder("SELECT * FROM ");
.append(sourceTableFilter.getTable().getName()); appendTableWithSchemaAndAlias(buff, sourceTableFilter.getTable(), sourceTableFilter.getTableAlias());
if (sourceTableFilter.getTableAlias() != null) {
buff.append(" AS ").append(sourceTableFilter.getTableAlias());
}
Prepared preparedQuery = prepare(session, buff.toString(), null/*paramValues*/); Prepared preparedQuery = prepare(session, buff.toString(), null/*paramValues*/);
command.setQuery((Select) preparedQuery); command.setQuery((Select) preparedQuery);
...@@ -1197,11 +1194,9 @@ public class Parser { ...@@ -1197,11 +1194,9 @@ public class Parser {
// build and prepare the targetMatchQuery ready to test each rows // build and prepare the targetMatchQuery ready to test each rows
// existence in the target table (using source row to match) // existence in the target table (using source row to match)
StringBuilder targetMatchQuerySQL = new StringBuilder( StringBuilder targetMatchQuerySQL = new StringBuilder("SELECT _ROWID_ FROM ");
"SELECT _ROWID_ FROM " + command.getTargetTable().getName()); appendTableWithSchemaAndAlias(targetMatchQuerySQL, command.getTargetTable(),
if (command.getTargetTableFilter().getTableAlias() != null) { command.getTargetTableFilter().getTableAlias());
targetMatchQuerySQL.append(" AS ").append(command.getTargetTableFilter().getTableAlias());
}
targetMatchQuerySQL targetMatchQuerySQL
.append(" WHERE ").append(command.getOnCondition().getSQL()); .append(" WHERE ").append(command.getOnCondition().getSQL());
command.setTargetMatchQuery( command.setTargetMatchQuery(
...@@ -1210,6 +1205,14 @@ public class Parser { ...@@ -1210,6 +1205,14 @@ public class Parser {
return command; return command;
} }
private static void appendTableWithSchemaAndAlias(StringBuilder buff, Table table, String alias) {
buff.append(quoteIdentifier(table.getSchema().getName()))
.append('.').append(quoteIdentifier(table.getName()));
if (alias != null) {
buff.append(" AS ").append(quoteIdentifier(alias));
}
}
private Insert parseInsert() { private Insert parseInsert() {
Insert command = new Insert(session); Insert command = new Insert(session);
currentPrepared = command; currentPrepared = command;
......
...@@ -30,4 +30,45 @@ EXPLAIN PLAN ...@@ -30,4 +30,45 @@ EXPLAIN PLAN
INSERT (ID, NAME) VALUES (S.ID, S.NAME); INSERT (ID, NAME) VALUES (S.ID, S.NAME);
> PLAN > PLAN
> --------------------------------------------------------------------------------------------------------------------------------- > ---------------------------------------------------------------------------------------------------------------------------------
> MERGE INTO PUBLIC.PARENT(ID, NAME) KEY(ID) SELECT X AS ID, ('Coco' || X) AS NAME FROM SYSTEM_RANGE(1, 2) /* PUBLIC.RANGE_INDEX */ > MERGE INTO PUBLIC.PARENT(ID, NAME) KEY(ID) SELECT X AS ID, ('Coco' || X) AS NAME FROM SYSTEM_RANGE(1, 2) /* PUBLIC.RANGE_INDEX */
\ No newline at end of file
DROP TABLE PARENT;
> ok
CREATE SCHEMA SOURCESCHEMA;
> ok
CREATE TABLE SOURCESCHEMA.SOURCE(ID INT PRIMARY KEY, VALUE INT);
> ok
INSERT INTO SOURCESCHEMA.SOURCE VALUES (1, 10), (3, 30), (5, 50);
> update count: 3
CREATE SCHEMA DESTSCHEMA;
> ok
CREATE TABLE DESTSCHEMA.DESTINATION(ID INT PRIMARY KEY, VALUE INT);
> ok
INSERT INTO DESTSCHEMA.DESTINATION VALUES (3, 300), (6, 600);
> update count: 2
MERGE INTO DESTSCHEMA.DESTINATION USING SOURCESCHEMA.SOURCE ON (DESTSCHEMA.DESTINATION.ID = SOURCESCHEMA.SOURCE.ID)
WHEN MATCHED THEN UPDATE SET VALUE = SOURCESCHEMA.SOURCE.VALUE
WHEN NOT MATCHED THEN INSERT (ID, VALUE) VALUES (SOURCESCHEMA.SOURCE.ID, SOURCESCHEMA.SOURCE.VALUE);
> update count: 3
SELECT * FROM DESTSCHEMA.DESTINATION;
> ID VALUE
> -- -----
> 1 10
> 3 30
> 5 50
> 6 600
> rows: 4
DROP SCHEMA SOURCESCHEMA CASCADE;
> ok
DROP SCHEMA DESTSCHEMA CASCADE;
> ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论