package com.alibaba.druid.bvt.sql.oracle;
import java.util.List;
import com.alibaba.druid.sql.PagerUtils;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.util.JdbcUtils;
import org.junit.Assert;
import junit.framework.TestCase;
public class OracleHintTest extends TestCase {
public void test_hint1() throws Exception {
String sql = "SELECT /*+leading(e) index(e ORD_ORDER_ITEM_GS_BS_DI_IND)*/ distinct e.id from ord_order_item e where e.F1 = Date '2011-10-01'";
OracleStatementParser parser = new OracleStatementParser(sql);
List<SQLStatement> statementList = parser.parseStatementList();
SQLStatement stmt = statementList.get(0);
StringBuilder out = new StringBuilder();
stmt.accept(new OracleOutputVisitor(out, true));
String newSQL = out.toString();
Assert.assertEquals("SELECT /*+leading(e) index(e ORD_ORDER_ITEM_GS_BS_DI_IND)*/ DISTINCT e.id\nFROM ord_order_item e\nWHERE e.F1 = DATE '2011-10-01';\n", newSQL);
}
public void test_hint2() throws Exception {
String sql = "SELECT /*+leading(e) index(e ORD_ORDER_ITEM_GS_BS_DI_IND)*/ distinct e.id from ord_order_item e where e.F1 = Date '2011-10-01'";
String countSQL = PagerUtils.count(sql, JdbcUtils.ORACLE);
Assert.assertEquals("SELECT /*+leading(e) index(e ORD_ORDER_ITEM_GS_BS_DI_IND)*/ COUNT(DISTINCT e.id)\nFROM ord_order_item e\nWHERE e.F1 = DATE '2011-10-01'", countSQL);
}
public void test_hint3() throws Exception {
String sql = "SELECT /*+index(a MTN_SMS_LOG_PK)*/ * from MTN_SMS_LOG a";
String formattedSql = SQLUtils.formatOracle(sql);
Assert.assertEquals("SELECT /*+index(a MTN_SMS_LOG_PK)*/ *" + "\nFROM MTN_SMS_LOG a", formattedSql);
}
public void test_hint4() throws Exception {
String sql = "UPDATE /*+index(a MTN_SMS_LOG_PK)*/ MTN_SMS_LOG a SET GMT_MODIFIED = sysdate WHERE id=1";
String formattedSql = SQLUtils.formatOracle(sql);
Assert.assertEquals("UPDATE /*+index(a MTN_SMS_LOG_PK)*/ MTN_SMS_LOG a"
+ "\nSET GMT_MODIFIED = SYSDATE"
+ "\nWHERE id = 1", formattedSql);
}
public void test_hint5() throws Exception {
String sql = "SELECT /*+index(clk) use_nl(clk) */ distinct log.id log_id from t";
String formattedSql = SQLUtils.formatOracle(sql);
Assert.assertEquals("SELECT /*+index(clk) use_nl(clk) */ DISTINCT log.id AS log_id" + "\nFROM t", formattedSql);
}
public void test_hint6() throws Exception {
String sql = "insert /*+APPEND*/ into emp_new select a.no, sysdate, a.name, b.service_duration from emp a, work b where a.no=b.no";
String formattedSql = SQLUtils.formatOracle(sql);
Assert.assertEquals("INSERT /*+APPEND*/ INTO emp_new" + "\nSELECT a.no, SYSDATE, a.name, b.service_duration"
+ "\nFROM emp a, work b" + "\nWHERE a.no = b.no", formattedSql);
}
public void test_hint7() throws Exception {
String sql = "delete /*+PARALLEL(semp, 5) */ from semp";
String formattedSql = SQLUtils.formatOracle(sql);
Assert.assertEquals("DELETE /*+PARALLEL(semp, 5) */ FROM semp", formattedSql);
}
}