mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for sql parser
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest10 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" + //
|
||||
" CURSOR c1 IS" + //
|
||||
" SELECT last_name, department_name" + //
|
||||
" FROM employees, departments" + //
|
||||
" WHERE employees.department_id = departments.department_id " + //
|
||||
" AND job_id = 'SA_MAN'" + //
|
||||
" FOR UPDATE OF salary;" + //
|
||||
"BEGIN" + //
|
||||
" NULL;" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(2, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments")));
|
||||
|
||||
Assert.assertEquals(5, visitor.getColumns().size());
|
||||
Assert.assertEquals(3, visitor.getConditions().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest11 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DROP TABLE emp;" +
|
||||
"CREATE TABLE emp AS SELECT * FROM employees;" +
|
||||
" " +
|
||||
"DECLARE" +
|
||||
" CURSOR c1 IS" +
|
||||
" SELECT * FROM emp" +
|
||||
" FOR UPDATE OF salary" +
|
||||
" ORDER BY employee_id;" +
|
||||
" emp_rec emp%ROWTYPE;" +
|
||||
"BEGIN" +
|
||||
" OPEN c1;" +
|
||||
" LOOP" +
|
||||
" FETCH c1 INTO emp_rec; -- fails on second iteration\n" +
|
||||
" EXIT WHEN c1%NOTFOUND;" +
|
||||
" DBMS_OUTPUT.PUT_LINE (" +
|
||||
" 'emp_rec.employee_id = ' ||" +
|
||||
" TO_CHAR(emp_rec.employee_id)" +
|
||||
" );" +
|
||||
" " +
|
||||
" UPDATE emp" +
|
||||
" SET salary = salary * 1.05" +
|
||||
" WHERE employee_id = 105;" +
|
||||
" " +
|
||||
" COMMIT; -- releases locks\n" +
|
||||
" END LOOP;" +
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(3, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(2, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp")));
|
||||
|
||||
Assert.assertEquals(4, visitor.getColumns().size());
|
||||
Assert.assertEquals(1, visitor.getConditions().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest12 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" +
|
||||
" emp_id NUMBER(6);" +
|
||||
" emp_lastname VARCHAR2(25);" +
|
||||
" emp_salary NUMBER(8,2);" +
|
||||
" emp_jobid VARCHAR2(10);" +
|
||||
"BEGIN" +
|
||||
" SELECT employee_id, last_name, salary, job_id" +
|
||||
" INTO emp_id, emp_lastname, emp_salary, emp_jobid" +
|
||||
" FROM employees" +
|
||||
" WHERE employee_id = 120;" +
|
||||
"" +
|
||||
" INSERT INTO emp_name (employee_id, last_name)" +
|
||||
" VALUES (emp_id, emp_lastname); " +
|
||||
" INSERT INTO emp_sal (employee_id, salary) " +
|
||||
" VALUES (emp_id, emp_salary);" +
|
||||
"" +
|
||||
" INSERT INTO emp_job (employee_id, job_id)" +
|
||||
" VALUES (emp_id, emp_jobid);" +
|
||||
" " +
|
||||
"EXCEPTION" +
|
||||
" WHEN DUP_VAL_ON_INDEX THEN" +
|
||||
" ROLLBACK;" +
|
||||
" DBMS_OUTPUT.PUT_LINE('Inserts were rolled back');" +
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(4, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_sal")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_job")));
|
||||
|
||||
Assert.assertEquals(11, visitor.getColumns().size());
|
||||
Assert.assertEquals(1, visitor.getConditions().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest13 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" + //
|
||||
" emp_id employees.employee_id%TYPE;" + //
|
||||
" emp_lastname employees.last_name%TYPE;" + //
|
||||
" emp_salary employees.salary%TYPE;" + //
|
||||
"" + //
|
||||
"BEGIN" + //
|
||||
" SELECT employee_id, last_name, salary" + //
|
||||
" INTO emp_id, emp_lastname, emp_salary " + //
|
||||
" FROM employees" + //
|
||||
" WHERE employee_id = 120;" + //
|
||||
" " + //
|
||||
" UPDATE emp_name" + //
|
||||
" SET salary = salary * 1.1" + //
|
||||
" WHERE employee_id = emp_id;" + //
|
||||
"" + //
|
||||
" DELETE FROM emp_name" + //
|
||||
" WHERE employee_id = 130;" + //
|
||||
"" + //
|
||||
" SAVEPOINT do_insert;" + //
|
||||
" " + //
|
||||
" INSERT INTO emp_name (employee_id, last_name, salary)" + //
|
||||
" VALUES (emp_id, emp_lastname, emp_salary);" + //
|
||||
" " + //
|
||||
"EXCEPTION" + //
|
||||
" WHEN DUP_VAL_ON_INDEX THEN" + //
|
||||
" ROLLBACK TO do_insert;" + //
|
||||
" DBMS_OUTPUT.PUT_LINE('Insert was rolled back');" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(2, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
|
||||
|
||||
Assert.assertEquals(7, visitor.getColumns().size());
|
||||
Assert.assertEquals(3, visitor.getConditions().size());
|
||||
Assert.assertEquals(1, visitor.getRelationships().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest14 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" + //
|
||||
" emp_id employees.employee_id%TYPE;" + //
|
||||
" emp_lastname employees.last_name%TYPE;" + //
|
||||
" emp_salary employees.salary%TYPE;" + //
|
||||
"" + //
|
||||
"BEGIN" + //
|
||||
" SELECT employee_id, last_name, salary" + //
|
||||
" INTO emp_id, emp_lastname, emp_salary" + //
|
||||
" FROM employees" + //
|
||||
" WHERE employee_id = 120;" + //
|
||||
" SAVEPOINT my_savepoint;" + //
|
||||
" " + //
|
||||
" UPDATE emp_name" + //
|
||||
" SET salary = salary * 1.1" + //
|
||||
" WHERE employee_id = emp_id;" + //
|
||||
" " + //
|
||||
" DELETE FROM emp_name" + //
|
||||
" WHERE employee_id = 130;" + //
|
||||
" " + //
|
||||
" SAVEPOINT my_savepoint;" + //
|
||||
" " + //
|
||||
" INSERT INTO emp_name (employee_id, last_name, salary)" + //
|
||||
" VALUES (emp_id, emp_lastname, emp_salary);" + //
|
||||
"" + //
|
||||
"EXCEPTION" + //
|
||||
" WHEN DUP_VAL_ON_INDEX THEN" + //
|
||||
" ROLLBACK TO my_savepoint;" + //
|
||||
" DBMS_OUTPUT.PUT_LINE('Transaction rolled back.');" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(2, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name")));
|
||||
|
||||
Assert.assertEquals(7, visitor.getColumns().size());
|
||||
Assert.assertEquals(3, visitor.getConditions().size());
|
||||
Assert.assertEquals(1, visitor.getRelationships().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest7 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DROP TABLE employees_temp; " + //
|
||||
"CREATE TABLE employees_temp AS " + //
|
||||
" SELECT employee_id, first_name, last_name " + //
|
||||
" FROM employees;" + //
|
||||
" " + //
|
||||
"DECLARE" + //
|
||||
" emp_id employees_temp.employee_id%TYPE := 299;" + //
|
||||
" emp_first_name employees_temp.first_name%TYPE := 'Bob';" + //
|
||||
" emp_last_name employees_temp.last_name%TYPE := 'Henry';" + //
|
||||
"BEGIN" + //
|
||||
" INSERT INTO employees_temp (employee_id, first_name, last_name) " + //
|
||||
" VALUES (emp_id, emp_first_name, emp_last_name);" + //
|
||||
" " + //
|
||||
" UPDATE employees_temp" + //
|
||||
" SET first_name = 'Robert'" + //
|
||||
" WHERE employee_id = emp_id;" + //
|
||||
" " + //
|
||||
" DELETE FROM employees_temp" + //
|
||||
" WHERE employee_id = emp_id" + //
|
||||
" RETURNING first_name, last_name" + //
|
||||
" INTO emp_first_name, emp_last_name;" + //
|
||||
"" + //
|
||||
" COMMIT;" + //
|
||||
" DBMS_OUTPUT.PUT_LINE (emp_first_name || ' ' || emp_last_name);" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(3, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(2, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees_temp")));
|
||||
|
||||
Assert.assertEquals(6, visitor.getColumns().size());
|
||||
Assert.assertEquals(2, visitor.getConditions().size());
|
||||
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest8 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" + //
|
||||
" daily_order_total NUMBER(12,2);" + //
|
||||
" weekly_order_total NUMBER(12,2); " + //
|
||||
" monthly_order_total NUMBER(12,2);" + //
|
||||
"BEGIN" + //
|
||||
" COMMIT; -- end previous transaction\n" + //
|
||||
" SET TRANSACTION READ ONLY NAME 'Calculate Order Totals';" + //
|
||||
"" + //
|
||||
" SELECT SUM (order_total)" + //
|
||||
" INTO daily_order_total" + //
|
||||
" FROM orders" + //
|
||||
" WHERE order_date = SYSDATE;" + //
|
||||
"" + //
|
||||
" SELECT SUM (order_total)" + //
|
||||
" INTO weekly_order_total" + //
|
||||
" FROM orders" + //
|
||||
" WHERE order_date = SYSDATE - 7;" + //
|
||||
"" + //
|
||||
" SELECT SUM (order_total)" + //
|
||||
" INTO monthly_order_total" + //
|
||||
" FROM orders" + //
|
||||
" WHERE order_date = SYSDATE - 30;" + //
|
||||
"" + //
|
||||
" COMMIT; -- ends read-only transaction\n" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(1, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("orders")));
|
||||
|
||||
Assert.assertEquals(2, visitor.getColumns().size());
|
||||
Assert.assertEquals(1, visitor.getConditions().size());
|
||||
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("orders", "order_total")));
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("orders", "order_date")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleBlockTest9 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "DECLARE" + //
|
||||
" my_emp_id NUMBER(6);" + //
|
||||
" my_job_id VARCHAR2(10);" + //
|
||||
" my_sal NUMBER(8,2);" + //
|
||||
" CURSOR c1 IS" + //
|
||||
" SELECT employee_id, job_id, salary" + //
|
||||
" FROM employees FOR UPDATE;" + //
|
||||
"BEGIN" + //
|
||||
" OPEN c1;" + //
|
||||
" LOOP" + //
|
||||
" FETCH c1 INTO my_emp_id, my_job_id, my_sal;" + //
|
||||
" IF my_job_id = 'SA_REP' THEN" + //
|
||||
" UPDATE employees" + //
|
||||
" SET salary = salary * 1.02" + //
|
||||
" WHERE CURRENT OF c1;" + //
|
||||
" END IF;" + //
|
||||
" EXIT WHEN c1%NOTFOUND;" + //
|
||||
" END LOOP;" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(1, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees")));
|
||||
|
||||
Assert.assertEquals(3, visitor.getColumns().size());
|
||||
Assert.assertEquals(0, visitor.getConditions().size());
|
||||
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id")));
|
||||
Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "job_id")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleCreateProcedureTest1 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "CREATE OR REPLACE PROCEDURE p (" +
|
||||
" dept_no NUMBER" +
|
||||
") AS " +
|
||||
"BEGIN" +
|
||||
" DELETE FROM dept_temp" +
|
||||
" WHERE department_id = dept_no;" +
|
||||
" " +
|
||||
" IF SQL%FOUND THEN" +
|
||||
" DBMS_OUTPUT.PUT_LINE (" +
|
||||
" 'Delete succeeded for department number ' || dept_no" +
|
||||
" );" +
|
||||
" ELSE" +
|
||||
" DBMS_OUTPUT.PUT_LINE ('No department number ' || dept_no);" +
|
||||
" END IF;" +
|
||||
"END;" +
|
||||
"/" +
|
||||
"BEGIN" +
|
||||
" p(270);" +
|
||||
" p(400);" +
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(3, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(1, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dept_temp")));
|
||||
|
||||
// Assert.assertEquals(7, visitor.getColumns().size());
|
||||
Assert.assertEquals(2, visitor.getConditions().size());
|
||||
Assert.assertEquals(1, visitor.getRelationships().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.alibaba.druid.bvt.sql.oracle;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.OracleTest;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
|
||||
public class OracleCreateProcedureTest2 extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql = "CREATE OR REPLACE PROCEDURE transfer (" + //
|
||||
" from_acct NUMBER," + //
|
||||
" to_acct NUMBER," + //
|
||||
" amount NUMBER" + //
|
||||
") AS " + //
|
||||
"BEGIN" + //
|
||||
" UPDATE accounts" + //
|
||||
" SET balance = balance - amount" + //
|
||||
" WHERE account_id = from_acct;" + //
|
||||
" " + //
|
||||
" UPDATE accounts" + //
|
||||
" SET balance = balance + amount" + //
|
||||
" WHERE account_id = to_acct;" + //
|
||||
" " + //
|
||||
" COMMIT WRITE IMMEDIATE NOWAIT;" + //
|
||||
"END;"; //
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
print(statementList);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
for (SQLStatement statement : statementList) {
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("relationships : " + visitor.getRelationships());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
Assert.assertEquals(1, visitor.getTables().size());
|
||||
|
||||
Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("accounts")));
|
||||
|
||||
Assert.assertEquals(5, visitor.getColumns().size());
|
||||
Assert.assertEquals(3, visitor.getConditions().size());
|
||||
Assert.assertEquals(2, visitor.getRelationships().size());
|
||||
|
||||
// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary")));
|
||||
}
|
||||
}
|
||||
@@ -19,9 +19,9 @@ public class OracleResourceTest extends OracleTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
// 13
|
||||
// exec_test("bvt/parser/oracle-17.txt");
|
||||
for (int i = 0; i <= 53; ++i) {
|
||||
exec_test("bvt/parser/oracle-" + i + ".txt");
|
||||
// exec_test("bvt/parser/oracle-56.txt");
|
||||
for (int i = 0; i <= 56; ++i) {
|
||||
exec_test("bvt/parser/oracle-" + i + ".txt");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,16 +39,19 @@ public class OracleResourceTest extends OracleTest {
|
||||
|
||||
OracleStatementParser parser = new OracleStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement statemen = statementList.get(0);
|
||||
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
// Assert.assertEquals(1, statementList.size());
|
||||
|
||||
System.out.println(sql);
|
||||
|
||||
|
||||
print(statementList);
|
||||
|
||||
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
|
||||
statemen.accept(visitor);
|
||||
|
||||
for (int i = 0, size = statementList.size(); i < size; ++i) {
|
||||
SQLStatement statement = statementList.get(i);
|
||||
statement.accept(visitor);
|
||||
}
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
|
||||
Reference in New Issue
Block a user