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 "";
+    }
 }

Reply via email to