You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2014/09/21 06:49:45 UTC

git commit: PHOENIX-1266 Disallow setting NOT NULL constraint on non PK columns

Repository: phoenix
Updated Branches:
  refs/heads/4.0 6262e4837 -> 987acf6d1


PHOENIX-1266 Disallow setting NOT NULL constraint on non PK columns


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/987acf6d
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/987acf6d
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/987acf6d

Branch: refs/heads/4.0
Commit: 987acf6d1e25fc4ad1ef2b7f95a203a0d496cadd
Parents: 6262e48
Author: James Taylor <jt...@salesforce.com>
Authored: Sat Sep 20 21:50:12 2014 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Sat Sep 20 21:52:46 2014 -0700

----------------------------------------------------------------------
 .../org/apache/phoenix/end2end/CreateTableIT.java   | 14 ++++++++++++++
 .../phoenix/end2end/TenantSpecificTablesDDLIT.java  |  2 +-
 .../org/apache/phoenix/schema/MetaDataClient.java   | 16 +++++++++-------
 .../java/org/apache/phoenix/schema/PColumnImpl.java |  6 +++++-
 .../apache/phoenix/compile/QueryCompilerTest.java   |  2 +-
 .../java/org/apache/phoenix/query/BaseTest.java     | 16 ++++++++--------
 6 files changed, 38 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
index e28273e..1f9afc4 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/CreateTableIT.java
@@ -350,4 +350,18 @@ public class CreateTableIT extends BaseClientManagedTimeIT {
         }
    }
 
+    @Test
+    public void testNotNullConstraintForWithSinglePKCol() throws Exception {
+        
+        String ddl = "create table test.testing(k integer primary key, v bigint not null)";
+                    
+        Properties props = new Properties();
+        Connection conn = DriverManager.getConnection(getUrl(), props);
+        try {
+            conn.createStatement().execute(ddl);    
+            fail(" Non pk column V has a NOT NULL constraint");
+        } catch( SQLException sqle) {
+            assertEquals(SQLExceptionCode.INVALID_NOT_NULL_CONSTRAINT.getErrorCode(),sqle.getErrorCode());
+        }
+   }
 }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java
index 655fe44..2d6c30b 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TenantSpecificTablesDDLIT.java
@@ -179,7 +179,7 @@ public class TenantSpecificTablesDDLIT extends BaseTenantSpecificTablesIT {
     public void testBaseTableWrongFormatWithTenantTypeId() throws Exception {
         // only two PK columns for multi_tenant, multi_type
         try {
-            createTestTable(getUrl(), "CREATE TABLE BASE_TABLE2 (TENANT_ID VARCHAR NOT NULL PRIMARY KEY, ID VARCHAR NOT NULL, A INTEGER) MULTI_TENANT=true", null, nextTimestamp());
+            createTestTable(getUrl(), "CREATE TABLE BASE_TABLE2 (TENANT_ID VARCHAR NOT NULL PRIMARY KEY, ID VARCHAR, A INTEGER) MULTI_TENANT=true", null, nextTimestamp());
             fail();
         }
         catch (SQLException expected) {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index eafac8b..1f933d8 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -1149,15 +1149,17 @@ public class MetaDataClient {
                             .setColumnName(colDef.getColumnDefName().getColumnName()).build().buildException();
                     }
                     isPK = true;
+                } else {
+                    // do not allow setting NOT-NULL constraint on non-primary columns.
+                    if (  Boolean.FALSE.equals(colDef.isNull()) &&
+                        ( isPK || ( pkConstraint != null && !pkConstraint.contains(colDef.getColumnDefName())))) {
+                            throw new SQLExceptionInfo.Builder(SQLExceptionCode.INVALID_NOT_NULL_CONSTRAINT)
+                                .setSchemaName(schemaName)
+                                .setTableName(tableName)
+                                .setColumnName(colDef.getColumnDefName().getColumnName()).build().buildException();
+                    }
                 }
                 
-               // do not allow setting NOT-NULL constraint on non-primary columns.
-                if (!isPK && pkConstraint != null && !pkConstraint.contains(colDef.getColumnDefName())) {
-                    if(Boolean.FALSE.equals(colDef.isNull())) {
-                        throw new SQLExceptionInfo.Builder(SQLExceptionCode.INVALID_NOT_NULL_CONSTRAINT)
-                            .setColumnName(colDef.getColumnDefName().getColumnName()).build().buildException();
-                    }  
-                }
                 PColumn column = newColumn(position++, colDef, pkConstraint, defaultFamilyName, false);
                 if (SchemaUtil.isPKColumn(column)) {
                     // TODO: remove this constraint?

http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java
index 40cf067..e0143c3 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java
@@ -123,7 +123,11 @@ public class PColumnImpl implements PColumn {
 
     @Override
     public boolean isNullable() {
-        return nullable;
+        // Only PK columns can be NOT NULL. We prevent this in the
+        // CREATE TABLE statement now (PHOENIX-1266), but this extra
+        // check for familyName != null will ensure that for existing
+        // tables we never treat key value columns as NOT NULL.
+        return nullable || familyName != null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
index 07564d4..cdc1805 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/compile/QueryCompilerTest.java
@@ -208,7 +208,7 @@ public class QueryCompilerTest extends BaseConnectionlessQueryTest {
             statement.execute();
             fail();
         } catch (SQLException e) {
-            assertTrue(e.getMessage(), e.getMessage().contains("ERROR 517 (42895): Invalid not null constraint on non primary key column columnName=PK"));
+            assertTrue(e.getMessage(), e.getMessage().contains("ERROR 517 (42895): Invalid not null constraint on non primary key column columnName=FOO.PK"));
         } finally {
             conn.close();
         }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/987acf6d/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
index 37285f6..45dbb39 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java
@@ -406,21 +406,21 @@ public abstract class BaseTest {
                 "   (id varchar not null primary key, d DOUBLE, f FLOAT, ud UNSIGNED_DOUBLE, uf UNSIGNED_FLOAT, i integer, de decimal)");
         builder.put(JOIN_ORDER_TABLE_FULL_NAME, "create table " + JOIN_ORDER_TABLE_FULL_NAME +
                 "   (\"order_id\" char(15) not null primary key, " +
-                "    \"customer_id\" char(10) not null, " +
-                "    \"item_id\" char(10) not null, " +
-                "    price integer not null, " +
-                "    quantity integer not null, " +
-                "    date timestamp not null)");
+                "    \"customer_id\" char(10), " +
+                "    \"item_id\" char(10), " +
+                "    price integer, " +
+                "    quantity integer, " +
+                "    date timestamp)");
         builder.put(JOIN_CUSTOMER_TABLE_FULL_NAME, "create table " + JOIN_CUSTOMER_TABLE_FULL_NAME +
                 "   (\"customer_id\" char(10) not null primary key, " +
-                "    name varchar not null, " +
+                "    name varchar, " +
                 "    phone char(12), " +
                 "    address varchar, " +
                 "    loc_id char(5), " +
                 "    date date)");
         builder.put(JOIN_ITEM_TABLE_FULL_NAME, "create table " + JOIN_ITEM_TABLE_FULL_NAME +
                 "   (\"item_id\" char(10) not null primary key, " +
-                "    name varchar not null, " +
+                "    name varchar, " +
                 "    price integer, " +
                 "    discount1 integer, " +
                 "    discount2 integer, " +
@@ -428,7 +428,7 @@ public abstract class BaseTest {
                 "    description varchar)");
         builder.put(JOIN_SUPPLIER_TABLE_FULL_NAME, "create table " + JOIN_SUPPLIER_TABLE_FULL_NAME +
                 "   (\"supplier_id\" char(10) not null primary key, " +
-                "    name varchar not null, " +
+                "    name varchar, " +
                 "    phone char(12), " +
                 "    address varchar, " +
                 "    loc_id char(5))");