You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by sk...@apache.org on 2021/01/08 21:21:51 UTC
[phoenix] branch 4.16 updated: PHOENIX-6148: [SchemaExtractionTool]
DDL parsing exception in Phoenix in view name (Addendum)
This is an automated email from the ASF dual-hosted git repository.
skadam pushed a commit to branch 4.16
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/4.16 by this push:
new e493710 PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (Addendum)
e493710 is described below
commit e493710aaa3be4ae3cbd03561670e1e99cc30964
Author: Swaroopa Kadam <s....@apache.org>
AuthorDate: Fri Jan 8 13:10:53 2021 -0800
PHOENIX-6148: [SchemaExtractionTool] DDL parsing exception in Phoenix in view name (Addendum)
---
.../java/org/apache/phoenix/util/SchemaUtil.java | 38 ++++++++++++++++++++--
.../phoenix/schema/SchemaExtractionToolIT.java | 30 ++++++++++++++---
2 files changed, 61 insertions(+), 7 deletions(-)
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
index c453dd1..6abc2a2 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java
@@ -1232,11 +1232,45 @@ public class SchemaUtil {
return columnParseNode.getName();
}
+ /**
+ * This function is needed so that SchemaExtractionTool returns a valid DDL with correct
+ * table/schema name that can be parsed
+ *
+ * @param pSchemaName
+ * @param pTableName
+ * @return quoted string if schema or table name has non-alphabetic characters in it.
+ */
public static String getPTableFullNameWithQuotes(String pSchemaName, String pTableName) {
String pTableFullName = getQualifiedTableName(pSchemaName, pTableName);
- if(!(Character.isAlphabetic(pTableName.charAt(0)))) {
- pTableFullName = pSchemaName+".\""+pTableName+"\"";
+ boolean tableNameNeedsQuotes = isQuotesNeeded(pTableName);
+ boolean schemaNameNeedsQuotes = isQuotesNeeded(pSchemaName);
+
+ if(schemaNameNeedsQuotes) {
+ pSchemaName= "\""+pSchemaName+"\"";
}
+ if(tableNameNeedsQuotes) {
+ pTableName = "\""+pTableName+"\"";
+ }
+ if(tableNameNeedsQuotes || schemaNameNeedsQuotes) {
+ pTableFullName = pSchemaName + "." + pTableName;
+ }
+
return pTableFullName;
}
+
+ private static boolean isQuotesNeeded(String name) {
+ // first char numeric or non-underscore
+ if(!Character.isAlphabetic(name.charAt(0)) && name.charAt(0)!='_') {
+ return true;
+ }
+ // for all other chars
+ // ex. name like z@@ will need quotes whereas t0001 will not need quotes
+ for (int i=1; i<name.toCharArray().length; i++) {
+ char charAtI = name.charAt(i);
+ if (!(Character.isAlphabetic(charAtI)) && !Character.isDigit(charAtI) && charAtI != '_') {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java b/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
index 8d0704b..4f9b11b 100644
--- a/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
+++ b/phoenix-tools/src/it/java/org/apache/phoenix/schema/SchemaExtractionToolIT.java
@@ -101,18 +101,38 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
+ "v1 VARCHAR, v2 VARCHAR)"
+ properties;
String viewFullName = SchemaUtil.getQualifiedTableName(schemaName, viewName);
- String viewFullName1 = SchemaUtil.getQualifiedTableName(schemaName, viewName+"1");
String createView = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
+ "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
+ "AS SELECT * FROM "+pTableFullName;
- String createView1 = "CREATE VIEW "+viewFullName1 + "(id1 BIGINT, id2 BIGINT NOT NULL, "
+
+ List<String> queries = new ArrayList<String>(){};
+ queries.add(createTableStmt);
+ queries.add(createView);
+ String result = runSchemaExtractionTool(schemaName, viewName, null, queries);
+ Assert.assertEquals(createView.toUpperCase(), result.toUpperCase());
+
+ }
+
+ @Test
+ public void testCreateViewStatement_customName() throws Exception {
+ String tableName = generateUniqueName();
+ String schemaName = generateUniqueName();
+ String viewName = generateUniqueName()+"@@";
+ String properties = "TTL=2592000,IMMUTABLE_ROWS=true,DISABLE_WAL=true";
+
+ String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
+ String createTableStmt = "CREATE TABLE "+pTableFullName + "(k BIGINT NOT NULL PRIMARY KEY, "
+ + "v1 VARCHAR, v2 VARCHAR)"
+ + properties;
+ String viewFullName = SchemaUtil.getPTableFullNameWithQuotes(schemaName, viewName);
+
+ String createView = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
+ "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
+ "AS SELECT * FROM "+pTableFullName;
List<String> queries = new ArrayList<String>(){};
queries.add(createTableStmt);
queries.add(createView);
- queries.add(createView1);
String result = runSchemaExtractionTool(schemaName, viewName, null, queries);
Assert.assertEquals(createView.toUpperCase(), result.toUpperCase());
@@ -153,7 +173,7 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
String pTableFullName = SchemaUtil.getQualifiedTableName(schemaName, tableName);
String createTableStmt = "CREATE TABLE "+pTableFullName + "(k BIGINT NOT NULL PRIMARY KEY, "
+ "v1 VARCHAR, v2 VARCHAR)";
- String viewFullName = SchemaUtil.getQualifiedTableName(schemaName, viewName);
+ String viewFullName = SchemaUtil.getPTableFullNameWithQuotes(schemaName, viewName);
String createViewStmt = "CREATE VIEW "+viewFullName + "(id1 BIGINT, id2 BIGINT NOT NULL, "
+ "id3 VARCHAR NOT NULL CONSTRAINT PKVIEW PRIMARY KEY (id2, id3 DESC)) "
+ "AS SELECT * FROM "+pTableFullName;
@@ -321,7 +341,7 @@ public class SchemaExtractionToolIT extends ParallelStatsEnabledIT {
private String runSchemaExtractionTool(String schemaName, String tableName, String tenantId, List<String> queries) throws Exception {
Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
String output;
- if (tenantId == null){
+ if (tenantId == null) {
try (Connection conn = DriverManager.getConnection(getUrl(), props)) {
executeCreateStatements(conn, queries);
String [] args = {"-tb", tableName, "-s", schemaName};