You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2012/10/19 20:17:55 UTC

svn commit: r1400208 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/AggregateNode.java testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java

Author: rhillegas
Date: Fri Oct 19 18:17:55 2012
New Revision: 1400208

URL: http://svn.apache.org/viewvc?rev=1400208&view=rev
Log:
DERBY-672: Add tests for precision mismatches when using user-defined aggregates.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/AggregateNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/AggregateNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/AggregateNode.java?rev=1400208&r1=1400207&r2=1400208&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/AggregateNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/AggregateNode.java Fri Oct 19 18:17:55 2012
@@ -725,6 +725,14 @@ public class AggregateNode extends Unary
     {
         if ( isUserDefinedAggregate() )
         {
+            //
+            // In theory, we could incur a StandardException while looking up the schema
+            // descriptor. In practice that would mean a seriously corrupted database and
+            // we would expect the schema resolution problem to have surfaced long before
+            // we got to this code. But, just in case, if we can't find the schema, we will return
+            // a different handle for the user-defined aggregate, in order to give the user
+            // some information.
+            //
             try {
                 return ((UserAggregateDefinition) uad).getAliasDescriptor().getQualifiedName();
             } catch (StandardException se)

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java?rev=1400208&r1=1400207&r2=1400208&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UserDefinedAggregatesTest.java Fri Oct 19 18:17:55 2012
@@ -2116,4 +2116,103 @@ public class UserDefinedAggregatesTest  
               "select intMode_14( b ) from intMode_14_mode_inputs group by intMode_14( b )" );
     }
     
+    /**
+     * <p>
+     * Verify precision mismatches.
+     * </p>
+     */
+    public void test_15_precisionMismatch() throws Exception
+    {
+        Connection conn = getConnection();
+
+        // truncating string types
+        goodStatement
+            (
+             conn,
+             "create derby aggregate varcharMode_15 for varchar( 4 )\n" +
+             "external name 'org.apache.derbyTesting.functionTests.tests.lang.GenericMode$StringMode'\n"
+             );
+        goodStatement
+            (
+             conn,
+             "create table varcharMode_15_mode_inputs_big( a int, b varchar( 5 ) )"
+             );
+        goodStatement
+            (
+             conn,
+             "insert into varcharMode_15_mode_inputs_big( a, b ) values ( 1, 'aaaaa' ), ( 1, 'abaaa' ), ( 1, 'aaaaa' ), ( 2, 'abaaa' ), ( 2, 'abaaa' ), ( 2, 'abcaa' ), ( 3, 'abaaa' ), ( 3, 'abaaa' ), ( 3, 'abcda' )"
+             );
+
+        expectExecutionError
+            ( conn, STRING_TRUNCATION, "select varcharMode_15( b ) from varcharMode_15_mode_inputs_big" );
+
+        // truncating numeric precision
+        goodStatement
+            (
+             conn,
+             "create derby aggregate numericMode_15_bigger for numeric( 5, 3 )\n" +
+             "external name 'org.apache.derbyTesting.functionTests.tests.lang.GenericMode$BigDecimalMode'\n"
+             );
+        goodStatement
+            (
+             conn,
+             "create derby aggregate numericMode_15 for numeric( 5, 1 )\n" +
+             "external name 'org.apache.derbyTesting.functionTests.tests.lang.GenericMode$BigDecimalMode'\n"
+             );
+        goodStatement
+            (
+             conn,
+             "create table numericMode_15_mode_inputs_big( a int, b numeric( 5, 2 ) )"
+             );
+        goodStatement
+            (
+             conn,
+             "insert into numericMode_15_mode_inputs_big( a, b ) values ( 1, 1.11 ), ( 1, 1.12 ), ( 1, 1.13 ), ( 1, 2.12 ), (1, 2.22 ), ( 2, 2.22 ), ( 2, 3.33 ), ( 3, 3.33 ), ( 3, 4.44 ), ( 3, 5.55 )"
+             );
+        assertResults
+            (
+             conn,
+             "select numericMode_15_bigger( b ) from numericMode_15_mode_inputs_big",
+             new String[][]
+             {
+                 { "3.330" },
+             },
+             false
+             );
+        assertResults
+            (
+             conn,
+             "select numericMode_15( b ) from numericMode_15_mode_inputs_big",
+             new String[][]
+             {
+                 { "1.1" },
+             },
+             false
+             );
+        assertResults
+            (
+             conn,
+             "select a, numericMode_15_bigger( b ) from numericMode_15_mode_inputs_big group by a",
+             new String[][]
+             {
+                 { "1", "2.220" },
+                 { "2", "3.330" },
+                 { "3", "5.550" },
+             },
+             false
+             );
+        assertResults
+            (
+             conn,
+             "select a, numericMode_15( b ) from numericMode_15_mode_inputs_big group by a",
+             new String[][]
+             {
+                 { "1", "1.1" },
+                 { "2", "3.3" },
+                 { "3", "5.5" },
+             },
+             false
+             );
+    }
+    
 }