You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by vj...@apache.org on 2023/09/11 22:05:10 UTC
[phoenix] branch master updated: PHOENIX-6864 - create view throwing NPE when referring back to itself (#1669)
This is an automated email from the ASF dual-hosted git repository.
vjasani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix.git
The following commit(s) were added to refs/heads/master by this push:
new bb8e9daf70 PHOENIX-6864 - create view throwing NPE when referring back to itself (#1669)
bb8e9daf70 is described below
commit bb8e9daf703120d5976278453146d96ccbe95451
Author: Divneet18 <di...@ucsd.edu>
AuthorDate: Mon Sep 11 15:05:03 2023 -0700
PHOENIX-6864 - create view throwing NPE when referring back to itself (#1669)
---
.../it/java/org/apache/phoenix/end2end/ViewIT.java | 66 +++++++++++++++++++++-
.../phoenix/compile/CreateTableCompiler.java | 1 +
.../java/org/apache/phoenix/schema/PTableImpl.java | 10 +++-
3 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
index d45cf2af87..65173c95ef 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewIT.java
@@ -59,6 +59,9 @@ import org.apache.phoenix.query.QueryServices;
import org.apache.phoenix.schema.PTable;
import org.apache.phoenix.schema.PTableImpl;
import org.apache.phoenix.schema.ReadOnlyTableException;
+import org.apache.phoenix.schema.ColumnNotFoundException;
+import org.apache.phoenix.schema.TableNotFoundException;
+import org.apache.phoenix.schema.TableAlreadyExistsException;
import org.apache.phoenix.schema.export.DefaultSchemaRegistryRepository;
import org.apache.phoenix.schema.export.DefaultSchemaWriter;
import org.apache.phoenix.schema.export.SchemaRegistryRepository;
@@ -75,6 +78,7 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
+
import org.apache.phoenix.thirdparty.com.google.common.collect.Maps;
/**
@@ -644,7 +648,6 @@ public class ViewIT extends SplitSystemCatalogIT {
+ "PRIMARY KEY) "
+ "AS SELECT * FROM " + fullTableName + " WHERE K1 = 1";
stmt.execute(ddl);
-
// assert PK metadata
ResultSet rs = conn.getMetaData().getPrimaryKeys(null,
SchemaUtil.getSchemaNameFromFullName(fullViewName),
@@ -896,6 +899,67 @@ public class ViewIT extends SplitSystemCatalogIT {
}
}
+ @Test
+ //creating view with same name on top of a table with a non existent column
+ public void testCreateViewWithUndefinedSameColumnName() throws Exception {
+ String fullViewName = generateUniqueName();
+
+ try (Connection conn = DriverManager.getConnection(getUrl());
+ Statement stmt = conn.createStatement()) {
+ String ddl = "CREATE VIEW " + fullViewName +
+ " AS SELECT * FROM " + fullViewName +
+ " WHERE " + fullViewName + " = 1";
+ stmt.execute(ddl);
+ fail("Should have thrown an exception");
+ } catch (ColumnNotFoundException columnException) {
+ assertEquals("Undefined column",
+ SQLExceptionCode.COLUMN_NOT_FOUND
+ .getErrorCode(), columnException.getErrorCode());
+ assertEquals(fullViewName, columnException.getColumnName());
+ }
+ }
+
+ @Test
+ //creating view with same name on top of a non existent table
+ public void testCreateViewOnTopOfUndefinedTableWithSameName() throws Exception {
+ try (Connection conn = DriverManager.getConnection(getUrl());
+ Statement stmt = conn.createStatement()) {
+
+ String fullViewName = generateUniqueName();
+ String ddl = "CREATE VIEW " + fullViewName +
+ " AS SELECT * FROM " + fullViewName;
+ stmt.execute(ddl);
+ fail("Should have thrown an exception");
+ } catch (TableNotFoundException tableException) {
+ assertEquals("Table Undefined",
+ SQLExceptionCode.TABLE_UNDEFINED.getErrorCode(),
+ tableException.getErrorCode());
+ }
+ }
+
+ @Test
+ //creating view with same name as the parent table
+ public void testCreateViewOnTopOfTableWithSameName() throws Exception {
+ try (Connection conn = DriverManager.getConnection(getUrl());
+ Statement stmt = conn.createStatement()) {
+
+ String fullTableName = generateUniqueName();
+ String ddl = "CREATE TABLE " + fullTableName
+ + " (k1 INTEGER NOT NULL, k2 INTEGER NOT NULL, v1 DECIMAL, "
+ + "CONSTRAINT pk PRIMARY KEY (k1, k2))" + tableDDLOptions;
+ stmt.execute(ddl);
+
+ ddl = "CREATE VIEW " + fullTableName + "(v2 VARCHAR, k3 VARCHAR "
+ + "PRIMARY KEY) "
+ + "AS SELECT * FROM " + fullTableName + " WHERE K1 = 1";
+ stmt.execute(ddl);
+ fail("Should have thrown an exception");
+ } catch (TableAlreadyExistsException tableException) {
+ assertEquals("Table already exists",
+ SQLExceptionCode.TABLE_ALREADY_EXIST
+ .getErrorCode(), tableException.getErrorCode());
+ }
+ }
private void validate(String viewName, Connection tenantConn,
String[] whereClauseArray,
long[] expectedArray) throws SQLException {
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
index 6d5512cd60..1baa2ae756 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
@@ -128,6 +128,7 @@ public class CreateTableCompiler {
// Used to track column references in a view
ExpressionCompiler expressionCompiler = new ColumnTrackingExpressionCompiler(context, isViewColumnReferencedToBe);
parentToBe = tableRef.getTable();
+
// Disallow creating views on top of SYSTEM tables. See PHOENIX-5386
if (parentToBe.getType() == PTableType.SYSTEM) {
throw new SQLExceptionInfo
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
index fb23a381c3..d332a95269 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
@@ -1287,11 +1287,17 @@ public class PTableImpl implements PTable {
@Override
public PColumn getColumnForColumnName(String name) throws ColumnNotFoundException, AmbiguousColumnException {
+ String schemaNameStr = schemaName == null ? null : schemaName.getString();
+ String tableNameStr = tableName == null ? null : tableName.getString();
+
+ //Throw exception if trying to create a column name that does not exist
+ if (columnsByName == null) {
+ throw new ColumnNotFoundException(schemaNameStr, tableNameStr, null, name);
+ }
+
List<PColumn> columns = columnsByName.get(name);
int size = columns.size();
if (size == 0) {
- String schemaNameStr = schemaName==null?null:schemaName.getString();
- String tableNameStr = tableName==null?null:tableName.getString();
throw new ColumnNotFoundException(schemaNameStr, tableNameStr, null, name);
}