This is an automated email from the ASF dual-hosted git repository.
zhonghongsheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new d05338027a3 Pipeline SQL builder add reserved metadata, only quote
reserved words (#22475)
d05338027a3 is described below
commit d05338027a3ca7b76530cec321c5508f458a1ff0
Author: Xinze Guo <[email protected]>
AuthorDate: Mon Nov 28 20:10:37 2022 +0800
Pipeline SQL builder add reserved metadata, only quote reserved words
(#22475)
* Pipeline SQL builder add reserved metadata, only quote reserved words
* append MySQL 8 reserved
* Fix codestyle
---
.../sqlbuilder/AbstractPipelineSQLBuilder.java | 20 +++++++++++--
.../core/sqlbuilder/DefaultPipelineSQLBuilder.java | 15 ++++++++++
.../mysql/sqlbuilder/MySQLPipelineSQLBuilder.java | 34 ++++++++++++++++++++++
.../sqlbuilder/MySQLPipelineSQLBuilderTest.java | 15 ++++++++++
.../sqlbuilder/OpenGaussPipelineSQLBuilder.java | 29 ++++++++++++++++++
.../OpenGaussPipelineSQLBuilderTest.java | 20 +++++++++++++
.../sqlbuilder/PostgreSQLPipelineSQLBuilder.java | 27 +++++++++++++++++
.../PostgreSQLPipelineSQLBuilderTest.java | 20 +++++++++++++
.../core/fixture/FixturePipelineSQLBuilder.java | 15 ++++++++++
9 files changed, 192 insertions(+), 3 deletions(-)
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/AbstractPipelineSQLBuilder.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/AbstractPipelineSQLBuilder.java
index e14051863b8..1a86e0bf462 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/AbstractPipelineSQLBuilder.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/AbstractPipelineSQLBuilder.java
@@ -51,11 +51,25 @@ public abstract class AbstractPipelineSQLBuilder implements
PipelineSQLBuilder {
* @return add quote string
*/
public String quote(final String item) {
- // TODO quote by database type and keyword. need to compatible with
case-sensitive table and column name
- // return getLeftIdentifierQuoteString() + item +
getRightIdentifierQuoteString();
- return item;
+ return isKeyword(item) ? getLeftIdentifierQuoteString() + item +
getRightIdentifierQuoteString() : item;
}
+ protected abstract boolean isKeyword(String item);
+
+ /**
+ * Get left identifier quote string.
+ *
+ * @return string
+ */
+ protected abstract String getLeftIdentifierQuoteString();
+
+ /**
+ * Get right identifier quote string.
+ *
+ * @return string
+ */
+ protected abstract String getRightIdentifierQuoteString();
+
@Override
public String buildDivisibleInventoryDumpSQL(final String schemaName,
final String tableName, final String uniqueKey, final int uniqueKeyDataType,
final boolean firstQuery) {
String qualifiedTableName = getQualifiedTableName(schemaName,
tableName);
diff --git
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/DefaultPipelineSQLBuilder.java
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/DefaultPipelineSQLBuilder.java
index da7a0512a5b..78730503675 100644
---
a/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/DefaultPipelineSQLBuilder.java
+++
b/kernel/data-pipeline/core/src/main/java/org/apache/shardingsphere/data/pipeline/core/sqlbuilder/DefaultPipelineSQLBuilder.java
@@ -26,4 +26,19 @@ public final class DefaultPipelineSQLBuilder extends
AbstractPipelineSQLBuilder
public boolean isDefault() {
return true;
}
+
+ @Override
+ protected boolean isKeyword(final String item) {
+ return false;
+ }
+
+ @Override
+ protected String getLeftIdentifierQuoteString() {
+ return "";
+ }
+
+ @Override
+ protected String getRightIdentifierQuoteString() {
+ return "";
+ }
}
diff --git
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilder.java
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilder.java
index 9a1327c86fa..2007f458da1 100644
---
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilder.java
+++
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilder.java
@@ -21,6 +21,8 @@ import
org.apache.shardingsphere.data.pipeline.api.ingest.record.Column;
import org.apache.shardingsphere.data.pipeline.api.ingest.record.DataRecord;
import
org.apache.shardingsphere.data.pipeline.core.sqlbuilder.AbstractPipelineSQLBuilder;
+import java.util.Arrays;
+import java.util.List;
import java.util.Optional;
/**
@@ -28,6 +30,38 @@ import java.util.Optional;
*/
public final class MySQLPipelineSQLBuilder extends AbstractPipelineSQLBuilder {
+ private static final List<String> RESERVED_KEYWORDS = Arrays.asList("ADD",
"ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "BEFORE", "BETWEEN", "BIGINT",
"BINARY", "BLOB", "BOTH", "BY", "CALL",
+ "CASCADE", "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK",
"COLLATE", "COLUMN", "CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT",
"CREATE", "CROSS", "CUBE", "CUME_DIST", "CURRENT_DATE",
+ "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR",
"DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE",
"DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT",
+ "DELAYED", "DELETE", "DENSE_RANK", "DESC", "DESCRIBE",
"DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV", "DOUBLE", "DROP", "DUAL",
"ELSE", "ELSEIF", "ENCLOSED", "ESCAPED", "EACH", "ELSE",
+ "ELSEIF", "EMPTY", "ENCLOSED", "ESCAPED", "EXCEPT", "EXISTS",
"EXIT", "EXPLAIN", "FALSE", "FETCH", "FIRST_VALUE", "FLOAT4", "FLOAT8", "FOR",
"FORCE", "FOREIGN", "FROM", "FULLTEXT",
+ "FUNCTION", "GENERATED", "GET", "GRANT", "GROUP", "GROUPING",
"GROUPS", "HAVING", "HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE",
"HOUR_SECOND", "IF", "IGNORE", "IN", "INDEX",
+ "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT",
"INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERSECT", "INTERVAL",
"INTO", "IO_AFTER_GTIDS", "IO_BEFORE_GTIDS", "IS",
+ "ITERATE", "JOIN", "JSON_TABLE", "KEY", "KEYS", "KILL", "LAG",
"LAST_VALUE", "LATERAL", "LEAD", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT",
"LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP",
+ "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY",
"MASTER_BIND", "MASTER_SSL_VERIFY_SERVER_CERT", "MATCH", "MAXVALUE",
"MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT",
+ "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", "MODIFIES",
"NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NTH_VALUE", "NTILE", "NULL",
"NUMERIC", "OF", "ON", "OPTIMIZE", "OPTIMIZER_COSTS",
+ "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", "OUTFILE",
"OVER", "PARTITION", "PERCENT_RANK", "PRECISION", "PRIMARY", "PROCEDURE",
"PURGE", "RANK", "READ", "REAL", "RECURSIVE",
+ "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT", "REPLACE",
"REQUIRE", "RESIGNAL", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE", "ROW",
"ROWS", "ROW_NUMBER", "SCHEMA", "SCHEMAS",
+ "SELECT", "SENSITIVE", "SEPARATOR", "SET", "SHOW", "SIGNAL",
"SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE",
"SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS",
+ "SQL_SMALL_RESULT", "SSL", "STARTING", "STORED", "STRAIGHT_JOIN",
"SYSTEM", "TABLE", "TERMINATED", "THEN", "TINYBLOB", "TINYINT", "TINYTEXT",
"TO", "TRAILING", "TRIGGER", "TRUE", "UNDO",
+ "UNION", "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE",
"USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY",
"VARCHAR", "VARCHARACTER", "VARYING", "VIRTUAL",
+ "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", "WRITE", "XOR",
"YEAR_MONTH", "ZEROFILL");
+
+ @Override
+ protected boolean isKeyword(final String item) {
+ return RESERVED_KEYWORDS.contains(item.toUpperCase());
+ }
+
+ @Override
+ public String getLeftIdentifierQuoteString() {
+ return "`";
+ }
+
+ @Override
+ public String getRightIdentifierQuoteString() {
+ return "`";
+ }
+
@Override
public String buildInsertSQL(final String schemaName, final DataRecord
dataRecord) {
return super.buildInsertSQL(schemaName, dataRecord) +
buildDuplicateUpdateSQL(dataRecord);
diff --git
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilderTest.java
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilderTest.java
index 19938c17803..026a2302c4c 100644
---
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilderTest.java
+++
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/sqlbuilder/MySQLPipelineSQLBuilderTest.java
@@ -61,4 +61,19 @@ public final class MySQLPipelineSQLBuilderTest {
result.addColumn(new Column("c3", "", true, false));
return result;
}
+
+ @Test
+ public void assertQuoteKeyword() {
+ String tableName = "CASCADE";
+ String actualCountSql = sqlBuilder.buildCountSQL(null, tableName);
+ assertThat(actualCountSql, is(String.format("SELECT COUNT(*) FROM %s",
sqlBuilder.quote(tableName))));
+ actualCountSql = sqlBuilder.buildCountSQL(null,
tableName.toLowerCase());
+ assertThat(actualCountSql, is(String.format("SELECT COUNT(*) FROM %s",
sqlBuilder.quote(tableName.toLowerCase()))));
+ }
+
+ @Test
+ public void assertBuilderCountSQLWithoutKeyword() {
+ String actualCountSQL = sqlBuilder.buildCountSQL(null, "t_order");
+ assertThat(actualCountSQL, is("SELECT COUNT(*) FROM t_order"));
+ }
}
diff --git
a/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilder.java
b/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilder.java
index 56fe4dd2f5b..ab1e1dea91b 100644
---
a/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilder.java
+++
b/kernel/data-pipeline/dialect/opengauss/src/main/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilder.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.data.pipeline.api.ingest.record.Column;
import org.apache.shardingsphere.data.pipeline.api.ingest.record.DataRecord;
import
org.apache.shardingsphere.data.pipeline.core.sqlbuilder.AbstractPipelineSQLBuilder;
+import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -30,6 +31,34 @@ import java.util.stream.Collectors;
*/
public final class OpenGaussPipelineSQLBuilder extends
AbstractPipelineSQLBuilder {
+ private static final List<String> RESERVED_KEYWORDS = Arrays.asList("ALL",
"ANALYSE", "ANALYZE", "AND", "ANY", "ARRAY", "AS", "ASC", "ASYMMETRIC",
"AUTHID", "AUTHORIZATION", "BETWEEN", "BIGINT",
+ "BINARY", "BINARY_DOUBLE", "BINARY_INTEGER", "BIT", "BOOLEAN",
"BOTH", "BUCKETCNT", "BUCKETS", "BYTEAWITHOUTORDER",
"BYTEAWITHOUTORDERWITHEQUAL", "CASE", "CAST", "CHAR", "CHARACTER",
+ "CHECK", "COALESCE", "COLLATE", "COLLATION", "COLUMN", "COMPACT",
"CONCURRENTLY", "CONSTRAINT", "CREATE", "CROSS", "CSN", "CURRENT_CATALOG",
"CURRENT_DATE", "CURRENT_ROLE",
+ "CURRENT_SCHEMA", "CURRENT_TIME", "CURRENT_TIMESTAMP",
"CURRENT_USER", "DATE", "DEC", "DECIMAL", "DECODE", "DEFAULT", "DEFERRABLE",
"DELTAMERGE", "DESC", "DISTINCT", "DO", "ELSE", "END",
+ "EXCEPT", "EXCLUDED", "EXISTS", "EXTRACT", "FALSE", "FENCED",
"FETCH", "FLOAT", "FOR", "FOREIGN", "FREEZE", "FROM", "FULL", "GRANT",
"GREATEST", "GROUP", "GROUPING", "GROUPPARENT",
+ "HAVING", "HDFSDIRECTORY", "ILIKE", "IN", "INITIALLY", "INNER",
"INOUT", "INT", "INTEGER", "INTERSECT", "INTERVAL", "INTO", "IS", "JOIN",
"LEADING", "LEAST", "LEFT", "LESS", "LIKE",
+ "LIMIT", "LOCALTIME", "LOCALTIMESTAMP", "MAXVALUE", "MINUS",
"MODIFY", "NATIONAL", "NATURAL", "NCHAR", "NOCYCLE", "NONE", "NOT", "NOTNULL",
"NULL", "NULLIF", "NUMBER", "NUMERIC",
+ "NVARCHAR", "NVARCHAR2", "NVL", "OFFSET", "ON", "ONLY", "OR",
"ORDER", "OUT", "OUTER", "OVERLAPS", "OVERLAY", "PERFORMANCE", "PLACING",
"POSITION", "PRECISION", "PRIMARY", "PRIORER",
+ "PROCEDURE", "REAL", "RECYCLEBIN", "REFERENCES", "REJECT",
"RETURNING", "RIGHT", "ROW", "ROWNUM", "SELECT", "SESSION_USER", "SETOF",
"SIMILAR", "SMALLDATETIME", "SMALLINT", "SOME",
+ "SUBSTRING", "SYMMETRIC", "SYSDATE", "TABLE", "TABLESAMPLE",
"THEN", "TIME", "TIMECAPSULE", "TIMESTAMP", "TIMESTAMPDIFF", "TINYINT", "TO",
"TRAILING", "TREAT", "TRIM", "TRUE", "UNION",
+ "UNIQUE", "USER", "USING", "VALUES", "VARCHAR", "VARCHAR2",
"VARIADIC", "VERBOSE", "VERIFY", "WHEN", "WHERE", "WINDOW", "WITH",
"XMLATTRIBUTES", "XMLCONCAT", "XMLELEMENT", "XMLEXISTS",
+ "XMLFOREST", "XMLPARSE", "XMLPI", "XMLROOT", "XMLSERIALIZE");
+
+ @Override
+ protected boolean isKeyword(final String item) {
+ return RESERVED_KEYWORDS.contains(item.toUpperCase());
+ }
+
+ @Override
+ protected String getLeftIdentifierQuoteString() {
+ return "\"";
+ }
+
+ @Override
+ protected String getRightIdentifierQuoteString() {
+ return "\"";
+ }
+
@Override
public Optional<String> buildCreateSchemaSQL(final String schemaName) {
return Optional.of(String.format("CREATE SCHEMA %s",
quote(schemaName)));
diff --git
a/kernel/data-pipeline/dialect/opengauss/src/test/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilderTest.java
b/kernel/data-pipeline/dialect/opengauss/src/test/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilderTest.java
index dc94e901c50..950beb326cc 100644
---
a/kernel/data-pipeline/dialect/opengauss/src/test/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilderTest.java
+++
b/kernel/data-pipeline/dialect/opengauss/src/test/java/org/apache/shardingsphere/data/pipeline/opengauss/sqlbuilder/OpenGaussPipelineSQLBuilderTest.java
@@ -22,8 +22,11 @@ import
org.apache.shardingsphere.data.pipeline.api.ingest.record.Column;
import org.apache.shardingsphere.data.pipeline.api.ingest.record.DataRecord;
import org.junit.Test;
+import java.util.Optional;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
public final class OpenGaussPipelineSQLBuilderTest {
@@ -45,4 +48,21 @@ public final class OpenGaussPipelineSQLBuilderTest {
result.addColumn(new Column("c3", "", true, false));
return result;
}
+
+ @Test
+ public void assertQuoteKeyword() {
+ String schemaName = "RECYCLEBIN";
+ Optional<String> actualCreateSchemaSql =
sqlBuilder.buildCreateSchemaSQL(schemaName);
+ assertTrue(actualCreateSchemaSql.isPresent());
+ assertThat(actualCreateSchemaSql.get(), is(String.format("CREATE
SCHEMA %s", sqlBuilder.quote(schemaName))));
+ String actualDropSQL = sqlBuilder.buildDropSQL(schemaName, "ALL");
+ String expectedDropSQL = String.format("DROP TABLE IF EXISTS %s",
String.join(".", sqlBuilder.quote(schemaName), sqlBuilder.quote("ALL")));
+ assertThat(actualDropSQL, is(expectedDropSQL));
+ }
+
+ @Test
+ public void assertBuilderDropSQLWithoutKeyword() {
+ String actualDropSQL = sqlBuilder.buildDropSQL("test_normal",
"t_order");
+ assertThat(actualDropSQL, is("DROP TABLE IF EXISTS
test_normal.t_order"));
+ }
}
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilder.java
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilder.java
index f56d42345fe..16681849cee 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilder.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/main/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilder.java
@@ -22,6 +22,8 @@ import
org.apache.shardingsphere.data.pipeline.api.ingest.record.DataRecord;
import org.apache.shardingsphere.data.pipeline.core.record.RecordUtil;
import
org.apache.shardingsphere.data.pipeline.core.sqlbuilder.AbstractPipelineSQLBuilder;
+import java.util.Arrays;
+import java.util.List;
import java.util.Optional;
/**
@@ -29,6 +31,31 @@ import java.util.Optional;
*/
public final class PostgreSQLPipelineSQLBuilder extends
AbstractPipelineSQLBuilder {
+ private static final List<String> RESERVED_KEYWORDS = Arrays.asList("ALL",
"ANALYSE", "ANALYZE", "AND", "ANY", "ARRAY", "AS", "ASC", "ASYMMETRIC",
"AUTHORIZATION", "BETWEEN", "BIGINT", "BINARY",
+ "BIT", "BOOLEAN", "BOTH", "CASE", "CAST", "CHAR", "CHARACTER",
"CHECK", "COALESCE", "COLLATE", "COLLATION", "COLUMN", "CONCURRENTLY",
"CONSTRAINT", "CREATE", "CROSS", "CURRENT_CATALOG",
+ "CURRENT_DATE", "CURRENT_ROLE", "CURRENT_SCHEMA", "CURRENT_TIME",
"CURRENT_TIMESTAMP", "CURRENT_USER", "DEC", "DECIMAL", "DEFAULT", "DEFERRABLE",
"DESC", "DISTINCT", "DO", "ELSE", "END",
+ "EXCEPT", "EXISTS", "EXTRACT", "FALSE", "FETCH", "FLOAT", "FOR",
"FOREIGN", "FREEZE", "FROM", "FULL", "GRANT", "GREATEST", "GROUP", "GROUPING",
"HAVING", "ILIKE", "IN", "INITIALLY",
+ "INNER", "INOUT", "INT", "INTEGER", "INTERSECT", "INTERVAL",
"INTO", "IS", "ISNULL", "JOIN", "LATERAL", "LEADING", "LEAST", "LEFT", "LIKE",
"LIMIT", "LOCALTIME", "LOCALTIMESTAMP",
+ "NATIONAL", "NATURAL", "NCHAR", "NONE", "NORMALIZE", "NOT",
"NOTNULL", "NULL", "NULLIF", "NUMERIC", "OFFSET", "ON", "ONLY", "OR", "ORDER",
"OUT", "OUTER", "OVERLAPS", "OVERLAY", "PLACING",
+ "POSITION", "PRECISION", "PRIMARY", "REAL", "REFERENCES",
"RETURNING", "RIGHT", "ROW", "SELECT", "SESSION_USER", "SETOF", "SIMILAR",
"SMALLINT", "SOME", "SUBSTRING", "SYMMETRIC", "TABLE",
+ "TABLESAMPLE", "THEN", "TIME", "TIMESTAMP", "TO", "TRAILING",
"TREAT", "TRIM", "TRUE", "UNION", "UNIQUE", "USER", "USING", "VALUES",
"VARCHAR", "VARIADIC", "VERBOSE", "WHEN", "WHERE",
+ "WINDOW", "WITH", "XMLATTRIBUTES", "XMLCONCAT", "XMLELEMENT",
"XMLEXISTS", "XMLFOREST", "XMLNAMESPACES", "XMLPARSE", "XMLPI", "XMLROOT",
"XMLSERIALIZE", "XMLTABLE");
+
+ @Override
+ protected boolean isKeyword(final String item) {
+ return RESERVED_KEYWORDS.contains(item.toUpperCase());
+ }
+
+ @Override
+ protected String getLeftIdentifierQuoteString() {
+ return "\"";
+ }
+
+ @Override
+ protected String getRightIdentifierQuoteString() {
+ return "\"";
+ }
+
@Override
public Optional<String> buildCreateSchemaSQL(final String schemaName) {
return Optional.of(String.format("CREATE SCHEMA IF NOT EXISTS %s",
quote(schemaName)));
diff --git
a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilderTest.java
b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilderTest.java
index 18a0d8d2ad5..af9dec3af53 100644
---
a/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilderTest.java
+++
b/kernel/data-pipeline/dialect/postgresql/src/test/java/org/apache/shardingsphere/data/pipeline/postgresql/sqlbuilder/PostgreSQLPipelineSQLBuilderTest.java
@@ -24,8 +24,11 @@ import
org.apache.shardingsphere.data.pipeline.postgresql.ingest.wal.decode.Post
import org.junit.Test;
import org.postgresql.replication.LogSequenceNumber;
+import java.util.Optional;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
public final class PostgreSQLPipelineSQLBuilderTest {
@@ -46,4 +49,21 @@ public final class PostgreSQLPipelineSQLBuilderTest {
result.addColumn(new Column("status", "ok", true, false));
return result;
}
+
+ @Test
+ public void assertQuoteKeyword() {
+ String schemaName = "all";
+ Optional<String> actualCreateSchemaSql =
sqlBuilder.buildCreateSchemaSQL(schemaName);
+ assertTrue(actualCreateSchemaSql.isPresent());
+ assertThat(actualCreateSchemaSql.get(), is(String.format("CREATE
SCHEMA IF NOT EXISTS %s", sqlBuilder.quote(schemaName))));
+ String actualDropSQL = sqlBuilder.buildDropSQL(schemaName, "ALL");
+ String expectedDropSQL = String.format("DROP TABLE IF EXISTS %s",
String.join(".", sqlBuilder.quote(schemaName), sqlBuilder.quote("ALL")));
+ assertThat(actualDropSQL, is(expectedDropSQL));
+ }
+
+ @Test
+ public void assertBuilderDropSQLWithoutKeyword() {
+ String actualDropSQL = sqlBuilder.buildDropSQL("test_normal",
"t_order");
+ assertThat(actualDropSQL, is("DROP TABLE IF EXISTS
test_normal.t_order"));
+ }
}
diff --git
a/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/fixture/FixturePipelineSQLBuilder.java
b/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/fixture/FixturePipelineSQLBuilder.java
index b3be5e10559..ebb5524dd01 100644
---
a/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/fixture/FixturePipelineSQLBuilder.java
+++
b/test/pipeline/src/test/java/org/apache/shardingsphere/data/pipeline/core/fixture/FixturePipelineSQLBuilder.java
@@ -25,4 +25,19 @@ public final class FixturePipelineSQLBuilder extends
AbstractPipelineSQLBuilder
public String getType() {
return "H2";
}
+
+ @Override
+ protected boolean isKeyword(final String item) {
+ return false;
+ }
+
+ @Override
+ protected String getLeftIdentifierQuoteString() {
+ return "";
+ }
+
+ @Override
+ protected String getRightIdentifierQuoteString() {
+ return "";
+ }
}