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

Code formatting

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