Skip to content

Commit c0f62d2

Browse files
ZhengguanLilizongbo
authored andcommitted
Improve INDEX BY table parsing
1 parent d2a3249 commit c0f62d2

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -2044,13 +2044,16 @@ private void parserParameters(List<SQLParameter> parameters, SQLObject parent) {
20442044
int len = lenExpr.getNumber().intValue();
20452045
dataType = new SQLDataTypeImpl(typeName, len);
20462046
accept(Token.RPAREN);
2047+
} else {
2048+
String typeName = "TABLE OF " + sqlName.toString();
2049+
dataType = new SQLDataTypeImpl(typeName);
2050+
}
20472051

2048-
if (lexer.token() == Token.INDEX) {
2049-
lexer.nextToken();
2050-
accept(Token.BY);
2051-
SQLExpr indexBy = this.exprParser.primary();
2052-
((SQLDataTypeImpl) dataType).setIndexBy(indexBy);
2053-
}
2052+
if (lexer.token() == Token.INDEX) {
2053+
lexer.nextToken();
2054+
accept(Token.BY);
2055+
SQLExpr indexBy = this.exprParser.primary();
2056+
((SQLDataTypeImpl) dataType).setIndexBy(indexBy);
20542057
}
20552058
dataType.setDbType(dbType);
20562059
} else if (lexer.identifierEquals("VARRAY")) {

core/src/test/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleParameterParserTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,25 @@ public void testNestedParameter() {
2424
Assert.assertEquals(sql, stat.toString());
2525
System.out.println("=============");
2626
}
27+
28+
@Test
29+
public void testNestedParameter_NumberIndexBy() {
30+
String sql = "DECLARE\n" +
31+
"\tTYPE NUMBER_ARRAY_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;\n" +
32+
"\tmyArray NUMBER_ARRAY_TYPE;\n" +
33+
"BEGIN\n" +
34+
"\tFOR i IN 1..10\n" +
35+
"\tLOOP\n" +
36+
"\t\tmyArray(i) := i * 10;\n" +
37+
"\tEND LOOP;\n" +
38+
"\tFOR i IN 1..10\n" +
39+
"\tLOOP\n" +
40+
"\t\tDBMS_OUTPUT.PUT_LINE('Index: ' || i || ', Value: ' || myArray(i));\n" +
41+
"\tEND LOOP;\n" +
42+
"END;";
43+
SQLStatement stat = SQLUtils.parseSingleStatement(sql, DbType.oracle, false);
44+
System.out.println(stat);
45+
Assert.assertEquals(sql, stat.toString());
46+
System.out.println("=============");
47+
}
2748
}

0 commit comments

Comments
 (0)