improved parser performance.

This commit is contained in:
wenshao
2017-08-21 15:34:10 +08:00
parent 17772cde69
commit 5804eea0c9
20 changed files with 484 additions and 151 deletions
@@ -0,0 +1,48 @@
package com.alibaba.druid.benckmark.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import org.apache.ibatis.jdbc.SQL;
import java.util.List;
public class MySqlInsertBenchmark extends TestCase {
static String sql = "INSERT INTO test_table VALUES (1, '1', '2017-10-10', true, false, '2017-10-10 10:10:10', '10:10:10', 1.111, null);";
List<SQLStatement> stmtList;
protected void setUp() throws Exception {
stmtList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
}
public void test_perf() throws Exception {
for (int i = 0; i < 5; ++i) {
perf();
// perf_toString(); // 425
}
}
public void perf_toString() {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
SQLUtils.toMySqlString(stmtList.get(0));
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
public void perf() {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
List<SQLStatement> stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
// stmt.toString();
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
}
@@ -0,0 +1,50 @@
package com.alibaba.druid.benckmark.sql;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.util.JdbcConstants;
import junit.framework.TestCase;
import java.util.List;
public class MySqlInsertBenchmark_2 extends TestCase {
static String sql = "INSERT INTO test_table VALUES (1, '1', '2017-10-10', true, false, '2017-10-10 10:10:10', '10:10:10', 1.111, NULL), (2, '2', '2017-10-10', true, false, '2017-10-10 10:10:10', '10:10:10', 2.222, NULL)" +
", (2, '2', '2017-09-09', true, false, '2017-10-10 10:10:10', '10:10:10', 3.333, NULL)" +
", (3, '3', '2017-10-10', true, false, '2017-10-10 10:10:10', '11:11:11', 4.333, NULL)" +
", (4, '4', '2017-10-10', true, false, '2017-10-10 10:10:10', '11:11:11', 4.333, NULL)" +
", (5, '5', '2017-10-10', true, false, '2017-10-10 10:10:10', '11:11:11', 4.333, NULL);";
List<SQLStatement> stmtList;
protected void setUp() throws Exception {
stmtList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
}
public void test_perf() throws Exception {
System.out.println(sql);
for (int i = 0; i < 5; ++i) {
perf(); // 5043
// perf_toString(); // 2101
}
}
public void perf() {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
List<SQLStatement> stmt = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
// stmt.toString();
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
public void perf_toString() {
long startMillis = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) {
SQLUtils.toMySqlString(stmtList.get(0));
}
long millis = System.currentTimeMillis() - startMillis;
System.out.println("millis : " + millis);
}
}
@@ -61,7 +61,7 @@ public class DMLInsertParserTest extends TestCase {
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("INSERT LOW_PRIORITY INTO t1\nVALUES (0.12, 1, 2)," + //
Assert.assertEquals("INSERT LOW_PRIORITY INTO t1\nVALUES (12e-2, 1, 2)," + //
"\n\t(?)," + //
"\n\t(DEFAULT)", output);
}
@@ -59,7 +59,7 @@ public class DMLReplaceParserTest extends TestCase {
SQLStatement stmt = parser.parseStatementList().get(0);
parser.match(Token.EOF);
String output = SQLUtils.toMySqlString(stmt);
Assert.assertEquals("REPLACE LOW_PRIORITY INTO t1\nVALUES (0.12), (?)", output);
Assert.assertEquals("REPLACE LOW_PRIORITY INTO t1\nVALUES (12e-2), (?)", output);
}
public void testReplace_4() throws Exception {
@@ -268,7 +268,7 @@ public class MathematicalFunctionsTest extends TestCase {
String text = output(stmtList);
Assert.assertEquals("SELECT PI() + 0E-18", text);
Assert.assertEquals("SELECT PI() + 0.000000000000000000", text);
}
public void test_22() throws Exception {
@@ -323,7 +323,7 @@ public class MathematicalFunctionsTest extends TestCase {
String text = output(stmtList);
Assert.assertEquals("SELECT ROUND(2.5), ROUND(2.5)", text);
Assert.assertEquals("SELECT ROUND(2.5), ROUND(25E-1)", text);
}
private String output(List<SQLStatement> stmtList) {
@@ -38,7 +38,7 @@ public class NumberTest extends TestCase {
String text = SQLUtils.toSQLString(stmtList, JdbcConstants.MYSQL);
Assert.assertEquals("SELECT -3.20326809E+14;", text);
Assert.assertEquals("SELECT -32032.6809e+10;", text);
}
public void test_1() throws Exception {
@@ -56,10 +56,10 @@ public class OdpsSelectTest22 extends TestCase {
") A\n" +
"group by bucket_id;";//
assertEquals("SELECT bucket_id, SUM(pv) AS pv, SUM(clk) AS clk\n" +
"\t, SUM(clk) / (SUM(pv) + 1E-10) AS ctr\n" +
"\t, SUM(clk) / (SUM(pv) + 1e-10) AS ctr\n" +
"\t, SUM(ut_ad_clk) AS ut_ad_clk, SUM(ad_clk) AS ad_clk\n" +
"\t, SUM(cost) AS cost\n" +
"\t, SUM(cost) * 1000 / (SUM(pv) + 1E-10) / 100 AS rpm\n" +
"\t, SUM(cost) * 1000 / (SUM(pv) + 1e-10) / 100 AS rpm\n" +
"FROM (\n" +
"\tSELECT bucket_id, UT.pv AS pv, UT.clk AS clk, UT.ad_clk AS ut_ad_clk, CLK.clk AS ad_clk\n" +
"\t\t, CLK.cost AS cost\n" +
@@ -95,10 +95,10 @@ public class OdpsSelectTest22 extends TestCase {
"GROUP BY bucket_id;", SQLUtils.formatOdps(sql));
assertEquals("select bucket_id, sum(pv) as pv, sum(clk) as clk\n" +
"\t, sum(clk) / (sum(pv) + 1E-10) as ctr\n" +
"\t, sum(clk) / (sum(pv) + 1e-10) as ctr\n" +
"\t, sum(ut_ad_clk) as ut_ad_clk, sum(ad_clk) as ad_clk\n" +
"\t, sum(cost) as cost\n" +
"\t, sum(cost) * 1000 / (sum(pv) + 1E-10) / 100 as rpm\n" +
"\t, sum(cost) * 1000 / (sum(pv) + 1e-10) / 100 as rpm\n" +
"from (\n" +
"\tselect bucket_id, UT.pv as pv, UT.clk as clk, UT.ad_clk as ut_ad_clk, CLK.clk as ad_clk\n" +
"\t\t, CLK.cost as cost\n" +
@@ -32,7 +32,7 @@ public class OracleNumberLiteralTest extends TestCase {
String text = TestUtils.outputOracle(stmt);
Assert.assertEquals("SELECT 7, 255, 0.5, 6.34, 0.025\n\t, 6.34F, 0.5D, -1.0D\nFROM DUAL", text);
Assert.assertEquals("SELECT 7, 255, 0.5, 6.34, 25e-03\n\t, 6.34F, 0.5D, -1.0D\nFROM DUAL", text);
System.out.println(text);
}
@@ -46,7 +46,7 @@ public class OracleInsertTest12 extends OracleTest {
+ "\n\t(employee_id, last_name, email, hire_date, job_id" //
+ "\n\t, salary, commission_pct)" //
+ "\nVALUES (207, 'Gregory', 'pgregory@example.com', SYSDATE, 'PU_CLERK'" //
+ "\n\t, 1.2E+3, NULL);",//
+ "\n\t, 1.2E3, NULL);",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
@@ -45,7 +45,7 @@ public class OracleInsertTest14 extends OracleTest {
Assert.assertEquals("INSERT INTO raises" //
+ "\nSELECT employee_id, salary * 1.1"//
+ "\nFROM employees"//
+ "\nWHERE commission_pct > 0.2"//
+ "\nWHERE commission_pct > .2"//
+ "\nLOG ERRORS INTO errlog ('my_bad') REJECT LIMIT 10;",//
SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE));