提交 f95e9520 authored 作者: Owner's avatar Owner

Code formatting

上级 6e4dcce6
/* /*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, and the
* and the EPL 1.0 (http://h2database.com/html/license.html). * EPL 1.0 (http://h2database.com/html/license.html). Initial Developer: H2
* Initial Developer: H2 Group * Group
*/ */
package org.h2.test.db; package org.h2.test.db;
...@@ -9,12 +9,12 @@ import java.sql.Connection; ...@@ -9,12 +9,12 @@ import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Statement; import java.sql.Statement;
import org.h2.jdbc.JdbcSQLException; import org.h2.jdbc.JdbcSQLException;
import org.h2.test.TestBase; import org.h2.test.TestBase;
/** /**
* Test non-recursive queries using WITH, but more than one common table defined. * Test non-recursive queries using WITH, but more than one common table
* defined.
*/ */
public class TestGeneralCommonTableQueries extends TestBase { public class TestGeneralCommonTableQueries extends TestBase {
...@@ -52,18 +52,16 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -52,18 +52,16 @@ public class TestGeneralCommonTableQueries extends TestBase {
ResultSet rs; ResultSet rs;
stat = conn.createStatement(); stat = conn.createStatement();
final String simple_two_column_query = "with " + final String simpleTwoColumnQuery = "with " + "t1(n) as (select 1 as first) "
"t1(n) as (select 1 as first) " + + ",t2(n) as (select 2 as first) " + "select * from t1 union all select * from t2";
",t2(n) as (select 2 as first) " + rs = stat.executeQuery(simpleTwoColumnQuery);
"select * from t1 union all select * from t2";
rs = stat.executeQuery(simple_two_column_query);
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(1, rs.getInt(1)); assertEquals(1, rs.getInt(1));
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(2, rs.getInt(1)); assertEquals(2, rs.getInt(1));
assertFalse(rs.next()); assertFalse(rs.next());
prep = conn.prepareStatement(simple_two_column_query); prep = conn.prepareStatement(simpleTwoColumnQuery);
rs = prep.executeQuery(); rs = prep.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(1, rs.getInt(1)); assertEquals(1, rs.getInt(1));
...@@ -71,11 +69,10 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -71,11 +69,10 @@ public class TestGeneralCommonTableQueries extends TestBase {
assertEquals(2, rs.getInt(1)); assertEquals(2, rs.getInt(1));
assertFalse(rs.next()); assertFalse(rs.next());
prep = conn.prepareStatement("with " + prep = conn.prepareStatement("with " + "t1(n) as (select 2 as first) " + ",t2(n) as (select 3 as first) "
"t1(n) as (select 2 as first) " + + "select * from t1 union all select * from t2 where n<>?");
",t2(n) as (select 3 as first) " + // omit no lines since zero is not in list
"select * from t1 union all select * from t2 where n<>?"); prep.setInt(1, 0);
prep.setInt(1, 0); // omit no lines since zero is not in list
rs = prep.executeQuery(); rs = prep.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(2, rs.getInt(1)); assertEquals(2, rs.getInt(1));
...@@ -83,12 +80,10 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -83,12 +80,10 @@ public class TestGeneralCommonTableQueries extends TestBase {
assertEquals(3, rs.getInt(1)); assertEquals(3, rs.getInt(1));
assertFalse(rs.next()); assertFalse(rs.next());
prep = conn.prepareStatement("with " + prep = conn.prepareStatement("with " + "t1(n) as (select 2 as first) " + ",t2(n) as (select 3 as first) "
"t1(n) as (select 2 as first) " + + ",t3(n) as (select 4 as first) "
",t2(n) as (select 3 as first) " + + "select * from t1 union all select * from t2 union all select * from t3 where n<>?");
",t3(n) as (select 4 as first) " + prep.setInt(1, 4);
"select * from t1 union all select * from t2 union all select * from t3 where n<>?");
prep.setInt(1, 4); // omit 4 line (last)
rs = prep.executeQuery(); rs = prep.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(2, rs.getInt(1)); assertEquals(2, rs.getInt(1));
...@@ -106,20 +101,19 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -106,20 +101,19 @@ public class TestGeneralCommonTableQueries extends TestBase {
PreparedStatement prep; PreparedStatement prep;
ResultSet rs; ResultSet rs;
prep = conn.prepareStatement("with " + prep = conn.prepareStatement("with " + "t1 as (select 2 as first_col) "
"t1 as (select 2 as first_col) " + + ",t2 as (select first_col+1 from t1) " + ",t3 as (select 4 as first_col) "
",t2 as (select first_col+1 from t1) " + + "select * from t1 union all select * from t2 union all select * from t3 where first_col<>?");
",t3 as (select 4 as first_col) " + // omit 4 line (last)
"select * from t1 union all select * from t2 union all select * from t3 where first_col<>?"); prep.setInt(1, 4);
prep.setInt(1, 4); // omit 4 line (last)
rs = prep.executeQuery(); rs = prep.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(2, rs.getInt(1)); assertEquals(2, rs.getInt(1));
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(3, rs.getInt("FIRST_COL")); assertEquals(3, rs.getInt("FIRST_COL"));
assertFalse(rs.next()); assertFalse(rs.next());
assertEquals(rs.getMetaData().getColumnCount(),1); assertEquals(rs.getMetaData().getColumnCount(), 1);
assertEquals("FIRST_COL",rs.getMetaData().getColumnLabel(1)); assertEquals("FIRST_COL", rs.getMetaData().getColumnLabel(1));
conn.close(); conn.close();
deleteDb("commonTableExpressionQueries"); deleteDb("commonTableExpressionQueries");
...@@ -131,14 +125,8 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -131,14 +125,8 @@ public class TestGeneralCommonTableQueries extends TestBase {
PreparedStatement prep; PreparedStatement prep;
ResultSet rs; ResultSet rs;
prep = conn.prepareStatement( prep = conn.prepareStatement(" WITH t1 AS (" + " SELECT 1 AS FIRST_COLUMN" + ")," + " t2 AS ("
" WITH t1 AS (" + + " SELECT FIRST_COLUMN+1 AS FIRST_COLUMN FROM t1 " + ") " + "SELECT sum(FIRST_COLUMN) FROM t2");
" SELECT 1 AS FIRST_COLUMN" +
")," +
" t2 AS (" +
" SELECT FIRST_COLUMN+1 AS FIRST_COLUMN FROM t1 " +
") " +
"SELECT sum(FIRST_COLUMN) FROM t2");
rs = prep.executeQuery(); rs = prep.executeQuery();
assertTrue(rs.next()); assertTrue(rs.next());
...@@ -155,14 +143,9 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -155,14 +143,9 @@ public class TestGeneralCommonTableQueries extends TestBase {
PreparedStatement prep; PreparedStatement prep;
ResultSet rs; ResultSet rs;
prep = conn.prepareStatement("WITH t1 AS (" + prep = conn.prepareStatement("WITH t1 AS (" + " SELECT X, 'T1' FROM SYSTEM_RANGE(?,?)" + ")," + "t2 AS ("
" SELECT X, 'T1' FROM SYSTEM_RANGE(?,?)" + + " SELECT X, 'T2' FROM SYSTEM_RANGE(?,?)" + ") " + "SELECT * FROM t1 UNION ALL SELECT * FROM t2 "
")," + + "UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(?,?)");
"t2 AS (" +
" SELECT X, 'T2' FROM SYSTEM_RANGE(?,?)" +
") " +
"SELECT * FROM t1 UNION ALL SELECT * FROM t2 " +
"UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(?,?)");
prep.setInt(1, 1); prep.setInt(1, 1);
prep.setInt(2, 2); prep.setInt(2, 2);
prep.setInt(3, 3); prep.setInt(3, 3);
...@@ -171,7 +154,7 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -171,7 +154,7 @@ public class TestGeneralCommonTableQueries extends TestBase {
prep.setInt(6, 6); prep.setInt(6, 6);
rs = prep.executeQuery(); rs = prep.executeQuery();
for(int n: new int[]{1,2,3,4,5,6} ){ for (int n : new int[] { 1, 2, 3, 4, 5, 6 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(n, rs.getInt(1)); assertEquals(n, rs.getInt(1));
} }
...@@ -180,7 +163,7 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -180,7 +163,7 @@ public class TestGeneralCommonTableQueries extends TestBase {
// call it twice // call it twice
rs = prep.executeQuery(); rs = prep.executeQuery();
for(int n: new int[]{1,2,3,4,5,6} ){ for (int n : new int[] { 1, 2, 3, 4, 5, 6 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(n, rs.getInt(1)); assertEquals(n, rs.getInt(1));
} }
...@@ -198,13 +181,9 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -198,13 +181,9 @@ public class TestGeneralCommonTableQueries extends TestBase {
conn.setAutoCommit(false); conn.setAutoCommit(false);
prep = conn.prepareStatement("WITH t1 AS (" prep = conn.prepareStatement("WITH t1 AS (" + " SELECT R.X, 'T1' FROM SYSTEM_RANGE(?1,?2) R" + "),"
+" SELECT R.X, 'T1' FROM SYSTEM_RANGE(?1,?2) R" + "t2 AS (" + " SELECT R.X, 'T2' FROM SYSTEM_RANGE(?3,?4) R" + ") "
+")," + "SELECT * FROM t1 UNION ALL SELECT * FROM t2 UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(?5,?6)");
+"t2 AS ("
+" SELECT R.X, 'T2' FROM SYSTEM_RANGE(?3,?4) R"
+") "
+"SELECT * FROM t1 UNION ALL SELECT * FROM t2 UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(?5,?6)");
prep.setInt(1, 1); prep.setInt(1, 1);
prep.setInt(2, 2); prep.setInt(2, 2);
prep.setInt(3, 3); prep.setInt(3, 3);
...@@ -217,21 +196,19 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -217,21 +196,19 @@ public class TestGeneralCommonTableQueries extends TestBase {
assertTrue(rs.next()); assertTrue(rs.next());
assertEquals(n, rs.getInt(1)); assertEquals(n, rs.getInt(1));
} }
assertEquals("X",rs.getMetaData().getColumnLabel(1)); assertEquals("X", rs.getMetaData().getColumnLabel(1));
assertEquals("'T1'",rs.getMetaData().getColumnLabel(2)); assertEquals("'T1'", rs.getMetaData().getColumnLabel(2));
assertFalse(rs.next()); assertFalse(rs.next());
try{ try {
prep = conn.prepareStatement("SELECT * FROM t1 UNION ALL SELECT * FROM t2 "+ prep = conn.prepareStatement("SELECT * FROM t1 UNION ALL SELECT * FROM t2 "
"UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(5,6)"); + "UNION ALL SELECT X, 'Q' FROM SYSTEM_RANGE(5,6)");
rs = prep.executeQuery(); rs = prep.executeQuery();
fail("Temp view T1 was accessible after previous WITH statement finished "+ fail("Temp view T1 was accessible after previous WITH statement finished " + "- but should not have been.");
"- but should not have been."); } catch (JdbcSQLException e) {
}
catch(JdbcSQLException e){
// ensure the T1 table has been removed even without auto commit // ensure the T1 table has been removed even without auto commit
assertContains(e.getMessage(),"Table \"T1\" not found;"); assertContains(e.getMessage(), "Table \"T1\" not found;");
} }
conn.close(); conn.close();
...@@ -249,9 +226,7 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -249,9 +226,7 @@ public class TestGeneralCommonTableQueries extends TestBase {
stat = conn.createStatement(); stat = conn.createStatement();
stat.execute("CREATE TABLE T1 ( ID INT IDENTITY, X INT NULL, Y VARCHAR(100) NULL )"); stat.execute("CREATE TABLE T1 ( ID INT IDENTITY, X INT NULL, Y VARCHAR(100) NULL )");
prep = conn.prepareStatement("WITH v1 AS (" prep = conn.prepareStatement("WITH v1 AS (" + " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(?1,?2) R" + ")"
+ " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(?1,?2) R"
+ ")"
+ "INSERT INTO T1 (X,Y) SELECT v1.X, v1.Y FROM v1"); + "INSERT INTO T1 (X,Y) SELECT v1.X, v1.Y FROM v1");
prep.setInt(1, 1); prep.setInt(1, 1);
prep.setInt(2, 2); prep.setInt(2, 2);
...@@ -261,7 +236,7 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -261,7 +236,7 @@ public class TestGeneralCommonTableQueries extends TestBase {
rs = stat.executeQuery("SELECT ID, X,Y FROM T1"); rs = stat.executeQuery("SELECT ID, X,Y FROM T1");
for (int n : new int[]{1, 2}) { for (int n : new int[] { 1, 2 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getInt(1) != 0); assertTrue(rs.getInt(1) != 0);
assertEquals(n, rs.getInt(2)); assertEquals(n, rs.getInt(2));
...@@ -282,21 +257,19 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -282,21 +257,19 @@ public class TestGeneralCommonTableQueries extends TestBase {
stat = conn.createStatement(); stat = conn.createStatement();
stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R"); stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R");
prep = conn.prepareStatement("WITH v1 AS (" prep = conn.prepareStatement("WITH v1 AS (" + " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(?1,?2) R" + ")"
+" SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(?1,?2) R" + "UPDATE T1 SET Y = 'Y1' WHERE X IN ( SELECT v1.X FROM v1 )");
+")"
+"UPDATE T1 SET Y = 'Y1' WHERE X IN ( SELECT v1.X FROM v1 )");
prep.setInt(1, 1); prep.setInt(1, 1);
prep.setInt(2, 2); prep.setInt(2, 2);
rowCount = prep.executeUpdate(); rowCount = prep.executeUpdate();
assertEquals(2,rowCount); assertEquals(2, rowCount);
rs = stat.executeQuery("SELECT ID, X,Y FROM T1"); rs = stat.executeQuery("SELECT ID, X,Y FROM T1");
for (int n : new int[] { 1, 2 }) { for (int n : new int[] { 1, 2 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getInt(1)!=0); assertTrue(rs.getInt(1) != 0);
assertEquals(n, rs.getInt(2)); assertEquals(n, rs.getInt(2));
assertEquals("Y1", rs.getString(3)); assertEquals("Y1", rs.getString(3));
} }
...@@ -315,13 +288,11 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -315,13 +288,11 @@ public class TestGeneralCommonTableQueries extends TestBase {
stat = conn.createStatement(); stat = conn.createStatement();
stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R"); stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R");
prep = conn.prepareStatement("WITH v1 AS (" prep = conn.prepareStatement("WITH v1 AS (" + " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R" + ")"
+" SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R" + "DELETE FROM T1 WHERE X IN ( SELECT v1.X FROM v1 )");
+")"
+"DELETE FROM T1 WHERE X IN ( SELECT v1.X FROM v1 )");
rowCount = prep.executeUpdate(); rowCount = prep.executeUpdate();
assertEquals(2,rowCount); assertEquals(2, rowCount);
rs = stat.executeQuery("SELECT ID, X,Y FROM T1"); rs = stat.executeQuery("SELECT ID, X,Y FROM T1");
...@@ -342,19 +313,17 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -342,19 +313,17 @@ public class TestGeneralCommonTableQueries extends TestBase {
stat = conn.createStatement(); stat = conn.createStatement();
stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R"); stat.execute("CREATE TABLE IF NOT EXISTS T1 AS SELECT R.X AS ID, R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,2) R");
prep = conn.prepareStatement("WITH v1 AS (" prep = conn.prepareStatement("WITH v1 AS (" + " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,3) R" + ")"
+" SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,3) R" + "MERGE INTO T1 KEY(ID) SELECT v1.X AS ID, v1.X, v1.Y FROM v1");
+")"
+"MERGE INTO T1 KEY(ID) SELECT v1.X AS ID, v1.X, v1.Y FROM v1");
rowCount = prep.executeUpdate(); rowCount = prep.executeUpdate();
assertEquals(3,rowCount); assertEquals(3, rowCount);
rs = stat.executeQuery("SELECT ID, X,Y FROM T1"); rs = stat.executeQuery("SELECT ID, X,Y FROM T1");
for (int n : new int[] { 1, 2, 3 }) { for (int n : new int[] { 1, 2, 3 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getInt(1)!=0); assertTrue(rs.getInt(1) != 0);
assertEquals(n, rs.getInt(2)); assertEquals(n, rs.getInt(2));
assertEquals("X1", rs.getString(3)); assertEquals("X1", rs.getString(3));
} }
...@@ -371,19 +340,17 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -371,19 +340,17 @@ public class TestGeneralCommonTableQueries extends TestBase {
boolean success; boolean success;
stat = conn.createStatement(); stat = conn.createStatement();
prep = conn.prepareStatement("WITH v1 AS (" prep = conn.prepareStatement("WITH v1 AS (" + " SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,3) R" + ")"
+" SELECT R.X, 'X1' AS Y FROM SYSTEM_RANGE(1,3) R" + "CREATE TABLE IF NOT EXISTS T1 AS SELECT v1.X AS ID, v1.X, v1.Y FROM v1");
+")"
+"CREATE TABLE IF NOT EXISTS T1 AS SELECT v1.X AS ID, v1.X, v1.Y FROM v1");
success = prep.execute(); success = prep.execute();
assertEquals(false,success); assertEquals(false, success);
rs = stat.executeQuery("SELECT ID, X,Y FROM T1"); rs = stat.executeQuery("SELECT ID, X,Y FROM T1");
for (int n : new int[] { 1, 2, 3 }) { for (int n : new int[] { 1, 2, 3 }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertTrue(rs.getInt(1)!=0); assertTrue(rs.getInt(1) != 0);
assertEquals(n, rs.getInt(2)); assertEquals(n, rs.getInt(2));
assertEquals("X1", rs.getString(3)); assertEquals("X1", rs.getString(3));
} }
...@@ -397,44 +364,29 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -397,44 +364,29 @@ public class TestGeneralCommonTableQueries extends TestBase {
PreparedStatement prep; PreparedStatement prep;
ResultSet rs; ResultSet rs;
prep = conn.prepareStatement( prep = conn.prepareStatement("WITH T1 AS ( " + " SELECT * "
"WITH T1 AS ( "+ + " FROM TABLE ( " + " K VARCHAR = ('a', 'b'), "
" SELECT * "+ + " V INTEGER = (1, 2) " + " ) "
" FROM TABLE ( "+ + "), " + " "
" K VARCHAR = ('a', 'b'), "+ + " " + "T2 AS ( "
" V INTEGER = (1, 2) "+ + " SELECT * " + " FROM TABLE ( "
" ) "+ + " K VARCHAR = ('a', 'b'), " + " V INTEGER = (3, 4) "
"), "+ + " ) " + "), "
" "+ + " " + " "
" "+ + "JOIN_CTE AS ( " + " SELECT T1.* "
"T2 AS ( "+ + " " + " FROM "
" SELECT * "+ + " T1 " + " JOIN T2 ON ( "
" FROM TABLE ( "+ + " T1.K = T2.K " + " ) "
" K VARCHAR = ('a', 'b'), "+ + ") " + " "
" V INTEGER = (3, 4) "+ + "SELECT * FROM JOIN_CTE");
" ) "+
"), "+
" "+
" "+
"JOIN_CTE AS ( "+
" SELECT T1.* "+
" "+
" FROM "+
" T1 "+
" JOIN T2 ON ( "+
" T1.K = T2.K "+
" ) "+
") "+
" "+
"SELECT * FROM JOIN_CTE");
rs = prep.executeQuery(); rs = prep.executeQuery();
for (String keyLetter : new String[] { "a", "b" }) { for (String keyLetter : new String[] { "a", "b" }) {
assertTrue(rs.next()); assertTrue(rs.next());
assertContains("ab",rs.getString(1)); assertContains("ab", rs.getString(1));
assertEquals(rs.getString(1),keyLetter); assertEquals(rs.getString(1), keyLetter);
assertTrue(rs.getInt(2)!=0); assertTrue(rs.getInt(2) != 0);
} }
conn.close(); conn.close();
deleteDb("commonTableExpressionQueries"); deleteDb("commonTableExpressionQueries");
...@@ -449,9 +401,8 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -449,9 +401,8 @@ public class TestGeneralCommonTableQueries extends TestBase {
conn.setAutoCommit(false); conn.setAutoCommit(false);
prep = conn.prepareStatement("WITH t1 AS (" prep = conn.prepareStatement("WITH t1 AS ("
+" SELECT 1 AS ONE, R.X AS TWO, 'T1' AS THREE, X FROM SYSTEM_RANGE(1,1) R" + " SELECT 1 AS ONE, R.X AS TWO, 'T1' AS THREE, X FROM SYSTEM_RANGE(1,1) R" + ")"
+")" + "SELECT * FROM t1");
+"SELECT * FROM t1");
rs = prep.executeQuery(); rs = prep.executeQuery();
for (int n : new int[] { 1 }) { for (int n : new int[] { 1 }) {
...@@ -459,10 +410,10 @@ public class TestGeneralCommonTableQueries extends TestBase { ...@@ -459,10 +410,10 @@ public class TestGeneralCommonTableQueries extends TestBase {
assertEquals(n, rs.getInt(1)); assertEquals(n, rs.getInt(1));
assertEquals(n, rs.getInt(4)); assertEquals(n, rs.getInt(4));
} }
assertEquals("ONE",rs.getMetaData().getColumnLabel(1)); assertEquals("ONE", rs.getMetaData().getColumnLabel(1));
assertEquals("TWO",rs.getMetaData().getColumnLabel(2)); assertEquals("TWO", rs.getMetaData().getColumnLabel(2));
assertEquals("THREE",rs.getMetaData().getColumnLabel(3)); assertEquals("THREE", rs.getMetaData().getColumnLabel(3));
assertEquals("X",rs.getMetaData().getColumnLabel(4)); assertEquals("X", rs.getMetaData().getColumnLabel(4));
assertFalse(rs.next()); assertFalse(rs.next());
......
/* /*
* Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, and the
* and the EPL 1.0 (http://h2database.com/html/license.html). * EPL 1.0 (http://h2database.com/html/license.html). Initial Developer: H2
* Initial Developer: H2 Group * Group
*/ */
package org.h2.test.db; package org.h2.test.db;
...@@ -19,7 +19,9 @@ import org.h2.test.TestBase; ...@@ -19,7 +19,9 @@ import org.h2.test.TestBase;
public class TestMergeUsing extends TestBase implements Trigger { public class TestMergeUsing extends TestBase implements Trigger {
private static final String GATHER_ORDERED_RESULTS_SQL = "SELECT ID, NAME FROM PARENT ORDER BY ID ASC"; private static final String GATHER_ORDERED_RESULTS_SQL = "SELECT ID, NAME FROM PARENT ORDER BY ID ASC";
private static int triggerTestingUpdateCount = 0; private static int triggerTestingUpdateCount;
private String triggerName;
/** /**
* Run just this test. * Run just this test.
...@@ -30,7 +32,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -30,7 +32,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
TestBase.createCaller().init().test(); TestBase.createCaller().init().test();
} }
private String triggerName;
@Override @Override
public void test() throws Exception { public void test() throws Exception {
...@@ -39,35 +41,27 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -39,35 +41,27 @@ public class TestMergeUsing extends TestBase implements Trigger {
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT(ID INT, NAME VARCHAR, PRIMARY KEY(ID) );", "CREATE TABLE PARENT(ID INT, NAME VARCHAR, PRIMARY KEY(ID) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID AND 1=1 AND S.ID = P.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME WHERE 2 = 2 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID AND 1=1 AND S.ID = P.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME WHERE 2 = 2 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 2);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 2);
// Simple NAME updates, target table missing PK // Simple NAME updates, target table missing PK
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID AND 1=1 AND S.ID = P.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE 1 = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID AND 1=1 AND S.ID = P.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE 1 = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X||X AS NAME FROM SYSTEM_RANGE(1,2)", 2);
"SELECT X AS ID, 'Marcy'||X||X AS NAME FROM SYSTEM_RANGE(1,2)",
2);
// No NAME updates, WHERE clause is always false, insert clause missing // No NAME updates, WHERE clause is always false, insert clause missing
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE 1 = 2", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE 1 = 2",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 0);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 0);
// No NAME updates, no WHERE clause, insert clause missing // No NAME updates, no WHERE clause, insert clause missing
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X||X AS NAME FROM SYSTEM_RANGE(1,2)", 2);
"SELECT X AS ID, 'Marcy'||X||X AS NAME FROM SYSTEM_RANGE(1,2)",
2);
// Two delete updates done, no WHERE clause, insert clause missing // Two delete updates done, no WHERE clause, insert clause missing
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN DELETE", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN DELETE",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) WHERE 1=0", 2);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) WHERE 1=0",
2);
// One insert, one update one delete happens, target table missing PK // One insert, one update one delete happens, target table missing PK
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
...@@ -80,8 +74,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -80,8 +74,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID AND 1=0) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE P.ID = 2 DELETE WHERE P.ID = 1", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID AND 1=0) WHEN MATCHED THEN UPDATE SET P.NAME = S.NAME||S.ID WHERE P.ID = 2 DELETE WHERE P.ID = 1",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 0);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2)", 0);
// One insert, one update one delete happens, target table missing PK // One insert, one update one delete happens, target table missing PK
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );" "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );"
...@@ -114,25 +107,20 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -114,25 +107,20 @@ public class TestMergeUsing extends TestBase implements Trigger {
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );" "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );"
+ "DELETE FROM PARENT;", + "DELETE FROM PARENT;",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID) WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID) WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (S.ID, S.NAME)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3)", 3);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3)", 3);
// no insert, no update, no delete clauses - essentially a no-op // no insert, no update, no delete clauses - essentially a no-op
testMergeUsingException( testMergeUsingException(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );" "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );"
+ "DELETE FROM PARENT;", + "DELETE FROM PARENT;",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID)", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) WHERE X<0", 0,
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) WHERE X<0",
0,
"At least UPDATE, DELETE or INSERT embedded statement must be supplied."); "At least UPDATE, DELETE or INSERT embedded statement must be supplied.");
// Two updates to same row - update and delete together - emptying the // Two updates to same row - update and delete together - emptying the
// parent table // parent table
testMergeUsing( testMergeUsing(
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) )", "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) )",
"MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = P.NAME||S.ID WHERE P.ID = 1 DELETE WHERE P.ID = 1 AND P.NAME = 'Marcy11'", "MERGE INTO PARENT AS P USING (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) ) AS S ON (P.ID = S.ID) WHEN MATCHED THEN UPDATE SET P.NAME = P.NAME||S.ID WHERE P.ID = 1 DELETE WHERE P.ID = 1 AND P.NAME = 'Marcy11'",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) WHERE X<0", 2);
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) WHERE X<0",
2);
// Duplicate source keys but different ROWID update - so no error // Duplicate source keys but different ROWID update - so no error
// SQL standard says duplicate or repeated updates of same row in same // SQL standard says duplicate or repeated updates of same row in same
// statement should cause errors - but because first row is updated, // statement should cause errors - but because first row is updated,
...@@ -144,9 +132,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -144,9 +132,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
"CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );" "CREATE TABLE PARENT AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,1) );"
+ "CREATE TABLE SOURCE AS (SELECT 1 AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );", + "CREATE TABLE SOURCE AS (SELECT 1 AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,2) );",
"MERGE INTO PARENT USING SOURCE ON (PARENT.ID = SOURCE.ID) WHEN MATCHED THEN UPDATE SET PARENT.NAME = SOURCE.NAME||SOURCE.ID WHERE PARENT.ID = 2 DELETE WHERE PARENT.ID = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SOURCE.ID, SOURCE.NAME)", "MERGE INTO PARENT USING SOURCE ON (PARENT.ID = SOURCE.ID) WHEN MATCHED THEN UPDATE SET PARENT.NAME = SOURCE.NAME||SOURCE.ID WHERE PARENT.ID = 2 DELETE WHERE PARENT.ID = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SOURCE.ID, SOURCE.NAME)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT 1 AS ID, 'Marcy'||X||X UNION ALL SELECT 1 AS ID, 'Marcy2'", 2);
"SELECT 1 AS ID, 'Marcy'||X||X UNION ALL SELECT 1 AS ID, 'Marcy2'",
2);
// Multiple update on same row: SQL standard says duplicate or repeated // Multiple update on same row: SQL standard says duplicate or repeated
// updates in same statement should cause errors -but because first row // updates in same statement should cause errors -but because first row
...@@ -192,8 +178,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -192,8 +178,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
"CREATE TABLE PARENT AS (SELECT 1 AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(4,4) );" "CREATE TABLE PARENT AS (SELECT 1 AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(4,4) );"
+ "CREATE TABLE SOURCE AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) );", + "CREATE TABLE SOURCE AS (SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(1,3) );",
"MERGE INTO PARENT USING SOURCE ON (PARENT.ID = SOURCE.ID) WHEN MATCHED THEN UPDATE SET PARENT.NAME = SOURCE.NAME||SOURCE.ID WHERE PARENT.ID = 2 DELETE WHERE PARENT.ID = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SOURCE.ID+100, SOURCE.NAME)", "MERGE INTO PARENT USING SOURCE ON (PARENT.ID = SOURCE.ID) WHEN MATCHED THEN UPDATE SET PARENT.NAME = SOURCE.NAME||SOURCE.ID WHERE PARENT.ID = 2 DELETE WHERE PARENT.ID = 1 WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SOURCE.ID+100, SOURCE.NAME)",
GATHER_ORDERED_RESULTS_SQL, GATHER_ORDERED_RESULTS_SQL, "SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(4,4)", 1,
"SELECT X AS ID, 'Marcy'||X AS NAME FROM SYSTEM_RANGE(4,4)", 1,
"Expected to find key after row inserted, but none found. Insert does not match ON condition."); "Expected to find key after row inserted, but none found. Insert does not match ON condition.");
// One insert, one update one delete happens, target table missing PK, // One insert, one update one delete happens, target table missing PK,
// triggers update all NAME fields // triggers update all NAME fields
...@@ -219,9 +204,8 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -219,9 +204,8 @@ public class TestMergeUsing extends TestBase implements Trigger {
* @param expectedRowUpdateCount - how many updates should be expected from * @param expectedRowUpdateCount - how many updates should be expected from
* the merge using * the merge using
*/ */
private void testMergeUsing(String setupSQL, String statementUnderTest, private void testMergeUsing(String setupSQL, String statementUnderTest, String gatherResultsSQL,
String gatherResultsSQL, String expectedResultsSQL, String expectedResultsSQL, int expectedRowUpdateCount) throws Exception {
int expectedRowUpdateCount) throws Exception {
deleteDb("mergeUsingQueries"); deleteDb("mergeUsingQueries");
Connection conn = getConnection("mergeUsingQueries"); Connection conn = getConnection("mergeUsingQueries");
Statement stat; Statement stat;
...@@ -238,8 +222,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -238,8 +222,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
// compare actual results from SQL result set with expected results // compare actual results from SQL result set with expected results
// - by diffing (aka set MINUS operation) // - by diffing (aka set MINUS operation)
rs = stat.executeQuery("( " + gatherResultsSQL + " ) MINUS ( " rs = stat.executeQuery("( " + gatherResultsSQL + " ) MINUS ( " + expectedResultsSQL + " )");
+ expectedResultsSQL + " )");
int rowCount = 0; int rowCount = 0;
StringBuffer diffBuffer = new StringBuffer(""); StringBuffer diffBuffer = new StringBuffer("");
...@@ -251,10 +234,8 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -251,10 +234,8 @@ public class TestMergeUsing extends TestBase implements Trigger {
diffBuffer.append("|\n"); diffBuffer.append("|\n");
} }
} }
assertEquals("Differences between expected and actual output found:" assertEquals("Differences between expected and actual output found:" + diffBuffer, 0, rowCount);
+ diffBuffer, 0, rowCount); assertEquals("Expected update counts differ", expectedRowUpdateCount, rowCountUpdate);
assertEquals("Expected update counts differ",
expectedRowUpdateCount, rowCountUpdate);
} finally { } finally {
conn.close(); conn.close();
deleteDb("mergeUsingQueries"); deleteDb("mergeUsingQueries");
...@@ -274,13 +255,10 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -274,13 +255,10 @@ public class TestMergeUsing extends TestBase implements Trigger {
* the merge using * the merge using
* @param exceptionMessage - the exception message expected * @param exceptionMessage - the exception message expected
*/ */
private void testMergeUsingException(String setupSQL, private void testMergeUsingException(String setupSQL, String statementUnderTest, String gatherResultsSQL,
String statementUnderTest, String gatherResultsSQL, String expectedResultsSQL, int expectedRowUpdateCount, String exceptionMessage) throws Exception {
String expectedResultsSQL, int expectedRowUpdateCount,
String exceptionMessage) throws Exception {
try { try {
testMergeUsing(setupSQL, statementUnderTest, gatherResultsSQL, testMergeUsing(setupSQL, statementUnderTest, gatherResultsSQL, expectedResultsSQL, expectedRowUpdateCount);
expectedResultsSQL, expectedRowUpdateCount);
} catch (RuntimeException | org.h2.jdbc.JdbcSQLException e) { } catch (RuntimeException | org.h2.jdbc.JdbcSQLException e) {
if (!e.getMessage().contains(exceptionMessage)) { if (!e.getMessage().contains(exceptionMessage)) {
e.printStackTrace(); e.printStackTrace();
...@@ -292,8 +270,7 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -292,8 +270,7 @@ public class TestMergeUsing extends TestBase implements Trigger {
} }
@Override @Override
public void fire(Connection conn, Object[] oldRow, Object[] newRow) public void fire(Connection conn, Object[] oldRow, Object[] newRow) throws SQLException {
throws SQLException {
if (conn == null) { if (conn == null) {
throw new AssertionError("connection is null"); throw new AssertionError("connection is null");
...@@ -318,33 +295,28 @@ public class TestMergeUsing extends TestBase implements Trigger { ...@@ -318,33 +295,28 @@ public class TestMergeUsing extends TestBase implements Trigger {
} }
@Override @Override
public void init(Connection conn, String schemaName, String trigger, public void init(Connection conn, String schemaName, String trigger, String tableName, boolean before, int type) {
String tableName, boolean before, int type) {
this.triggerName = trigger; this.triggerName = trigger;
if (!"PARENT".equals(tableName)) { if (!"PARENT".equals(tableName)) {
throw new AssertionError("supposed to be PARENT"); throw new AssertionError("supposed to be PARENT");
} }
if ((trigger.endsWith("AFTER") && before) if ((trigger.endsWith("AFTER") && before) || (trigger.endsWith("BEFORE") && !before)) {
|| (trigger.endsWith("BEFORE") && !before)) { throw new AssertionError("triggerName: " + trigger + " before:" + before);
throw new AssertionError(
"triggerName: " + trigger + " before:" + before);
} }
if ((trigger.startsWith("UPD") && type != UPDATE) if ((trigger.startsWith("UPD") && type != UPDATE) || (trigger.startsWith("INS") && type != INSERT)
|| (trigger.startsWith("INS") && type != INSERT)
|| (trigger.startsWith("DEL") && type != DELETE)) { || (trigger.startsWith("DEL") && type != DELETE)) {
throw new AssertionError( throw new AssertionError("triggerName: " + trigger + " type:" + type);
"triggerName: " + trigger + " type:" + type);
} }
} }
private String getCreateTriggerSQL() { private String getCreateTriggerSQL() {
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
buf.append("CREATE TRIGGER INS_BEFORE " + "BEFORE INSERT ON PARENT " buf.append("CREATE TRIGGER INS_BEFORE " + "BEFORE INSERT ON PARENT " + "FOR EACH ROW NOWAIT CALL \""
+ "FOR EACH ROW NOWAIT CALL \"" + getClass().getName() + "\";"); + getClass().getName() + "\";");
buf.append("CREATE TRIGGER UPD_BEFORE " + "BEFORE UPDATE ON PARENT " buf.append("CREATE TRIGGER UPD_BEFORE " + "BEFORE UPDATE ON PARENT " + "FOR EACH ROW NOWAIT CALL \""
+ "FOR EACH ROW NOWAIT CALL \"" + getClass().getName() + "\";"); + getClass().getName() + "\";");
buf.append("CREATE TRIGGER DEL_BEFORE " + "BEFORE DELETE ON PARENT " buf.append("CREATE TRIGGER DEL_BEFORE " + "BEFORE DELETE ON PARENT " + "FOR EACH ROW NOWAIT CALL \""
+ "FOR EACH ROW NOWAIT CALL \"" + getClass().getName() + "\";"); + getClass().getName() + "\";");
return buf.toString(); return buf.toString();
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论