db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d..@apache.org
Subject svn commit: r737774 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
Date Mon, 26 Jan 2009 18:27:37 GMT
Author: dag
Date: Mon Jan 26 18:27:37 2009
New Revision: 737774

URL: http://svn.apache.org/viewvc?rev=737774&view=rev
Log:
DERBY-4013 Allow standard SQL syntax: ALTER TABLE ALTER [COLUMN] <col> SET DEFAULT <default>

Patch derby-4014d, which adds the standard SQL syntax SET DEFAULT and DROP DEFAULT, in
addition to the non-standard syntax we already have.

Note that we are not 100% in compliance, since DROP DEFAULT does not
fail as it should when there is no existing default - it is a noop right now.

A new test, AlterColumnTest, is also added.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java
  (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj?rev=737774&r1=737773&r2=737774&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj Mon Jan
26 18:27:37 2009
@@ -1647,6 +1647,37 @@
 				tokenKind == EXECUTE ||
 				tokenKind == ALL);
 	}
+
+
+	/**
+	 * Construct a TableElementNode of type
+	 * C_NodeTypes.MODIFY_COLUMN_DEFAULT_NODE.
+	 *
+	 * @param defaultNode the new default value node
+	 * @param columnName  the name of the column to be altered
+	 * @param autoIncrementInfo autoincrement information collected, if any.
+	 *
+	 * @return the new node constructed
+	 * @exception StandardException standard error policy
+	 */
+	TableElementNode wrapAlterColumnDefaultValue(
+		ValueNode defaultNode,
+		String columnName,
+		long[] autoIncrementInfo) throws StandardException {
+
+		if (autoIncrementInfo
+				[QueryTreeNode.AUTOINCREMENT_IS_AUTOINCREMENT_INDEX] == 0) {
+			autoIncrementInfo = null;
+		}
+
+		return (TableElementNode) nodeFactory.getNode(
+			C_NodeTypes.MODIFY_COLUMN_DEFAULT_NODE,
+			columnName,
+			defaultNode,
+			null,
+			autoIncrementInfo,
+			getContextManager());
+	}
 }
 
 PARSER_END(SQLParser)
@@ -12600,7 +12631,8 @@
  *		SET DATA TYPE data_type
  *		SET INCREMENT BY increment_value
  *		RESTART WITH increment_restart_value
- *		[WITH] DEFAULT default_value
+ *		[SET | WITH] DEFAULT default_value
+ *      DROP DEFAULT
  *      [NOT] NULL
  */
 TableElementNode
@@ -12646,20 +12678,24 @@
 						getContextManager());
 	}
 |
-	LOOKAHEAD( {getToken(1).kind == WITH || getToken(1).kind == _DEFAULT })
-	defaultNode = defaultClause(autoIncrementInfo, columnName)
+	LOOKAHEAD( {getToken(1).kind == WITH || getToken(1).kind == _DEFAULT ||
+                    (getToken(1).kind == SET && getToken(2).kind == _DEFAULT) })
+	[<SET>] defaultNode = defaultClause(autoIncrementInfo, columnName)
 	{
-		if (autoIncrementInfo[QueryTreeNode.AUTOINCREMENT_IS_AUTOINCREMENT_INDEX]
-				 == 0)
-		{
-			autoIncrementInfo = null;
-		}
+		return wrapAlterColumnDefaultValue(defaultNode,
+										   columnName,
+										   autoIncrementInfo);
+	}
+|
+	<DROP> <_DEFAULT>
+    {
 
-		return (TableElementNode) nodeFactory.getNode(
-								C_NodeTypes.MODIFY_COLUMN_DEFAULT_NODE,
-								columnName,
-								defaultNode, null, autoIncrementInfo,
-								getContextManager());
+		defaultNode = (ValueNode) nodeFactory.getNode(
+			C_NodeTypes.UNTYPED_NULL_CONSTANT_NODE, getContextManager());
+
+		return wrapAlterColumnDefaultValue(defaultNode,
+										   columnName,
+										   autoIncrementInfo);
 	}
 |
 	LOOKAHEAD ({getToken(1).kind == NULL })

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java?rev=737774&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java
(added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java
Mon Jan 26 18:27:37 2009
@@ -0,0 +1,119 @@
+/*
+
+Derby - Class org.apache.derbyTesting.functionTests.tests.lang.AlterColumnTest
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*/
+
+package org.apache.derbyTesting.functionTests.tests.lang;
+
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import junit.framework.Test;
+import org.apache.derbyTesting.junit.BaseJDBCTestCase;
+import org.apache.derbyTesting.junit.TestConfiguration;
+import org.apache.derbyTesting.junit.JDBC;
+
+/**
+ * Test cases for altering columns.
+ */
+public class AlterColumnTest extends BaseJDBCTestCase {
+
+    public AlterColumnTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        return TestConfiguration.defaultSuite(AlterColumnTest.class);
+    }
+
+    /**
+     * Test ALTER COLUMN default
+     */
+    public void testAlterDefault() throws SQLException {
+        Statement s = createStatement();
+        s.execute("create table t(i int default 0)");
+        PreparedStatement pd = prepareStatement("delete from t");
+        PreparedStatement pi = prepareStatement("insert into t values default");
+        PreparedStatement ps = prepareStatement("select * from t order by i");
+
+        pi.executeUpdate();
+        JDBC.assertFullResultSet(
+            ps.executeQuery(), new String[][]{ {"0"} });
+
+        /*
+         * Try different syntaxes allowed
+         */
+        s.execute("alter table t alter COLUMN i DEFAULT 1");
+        tryAndExpect(pd, pi, ps, "1");
+
+        s.execute("alter table t alter COLUMN i WITH DEFAULT 2");
+        tryAndExpect(pd, pi, ps, "2");
+
+        // Standard SQL syntax added in DERBY-4013
+        s.execute("alter table t alter COLUMN i SET DEFAULT 3");
+        tryAndExpect(pd, pi, ps, "3");
+
+        s.execute("alter table t alter i DEFAULT 4");
+        tryAndExpect(pd, pi, ps, "4");
+
+        s.execute("alter table t alter i WITH DEFAULT 5");
+        tryAndExpect(pd, pi, ps, "5");
+
+        // Standard SQL syntax added in DERBY-4013
+        s.execute("alter table t alter i SET DEFAULT 6");
+        tryAndExpect(pd, pi, ps, "6");
+
+        s.execute("alter table t alter i SET DEFAULT null");
+        tryAndExpect(pd, pi, ps, null);
+
+        s.execute("alter table t alter i SET DEFAULT 1");
+        tryAndExpect(pd, pi, ps, "1");
+
+        // Standard SQL syntax added in DERBY-4013
+        s.execute("alter table t alter i DROP DEFAULT");
+        tryAndExpect(pd, pi, ps, null);
+
+        s.close();
+        pd.close();
+        pi.close();
+        ps.close();
+    }
+
+    /**
+     * Auxiliary method: Execute the delete statement d to clean table, then
+     * the insert statement i to exercise the default mechanism, then check via
+     * the select statement s, that the value inserted is e.
+     *
+     * @param d delete statement
+     * @param i insert statement
+     * @param s select statement
+     * @param e expected value as a string
+     */
+    private static void tryAndExpect(
+        PreparedStatement d,
+        PreparedStatement i,
+        PreparedStatement s,
+        String e) throws SQLException {
+
+        d.executeUpdate();
+        i.executeUpdate();
+        JDBC.assertSingleValueResultSet(s.executeQuery(), e);
+    }
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/AlterColumnTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java?rev=737774&r1=737773&r2=737774&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
(original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/_Suite.java
Mon Jan 26 18:27:37 2009
@@ -179,6 +179,7 @@
         suite.addTest(PrecedenceTest.suite());
         suite.addTest(GeneratedColumnsTest.suite());
         suite.addTest(GeneratedColumnsPermsTest.suite());
+        suite.addTest(AlterColumnTest.suite());
 
         return suite;
 	}



Mime
View raw message