Skip to content

Commit 955ac98

Browse files
committed
Add support for jdbc parameters in ColDataType precision and scale
1 parent 1668528 commit 955ac98

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6992,6 +6992,7 @@ ColDataType DataType():
69926992
Token prefix = null;
69936993
Token tk = null;
69946994
Token tk2 = null;
6995+
JdbcParameter jdbc = null;
69956996
String schema;
69966997
String type="";
69976998
List<String> argumentsStringList = new ArrayList<String>();
@@ -7026,12 +7027,29 @@ ColDataType DataType():
70267027
| tk=<K_CHAR> | tk=<K_JSON> | tk=<K_STRING> ) { type += " " + tk.image; } )+
70277028
]
70287029
[
7029-
LOOKAHEAD(2) "(" ( tk=<S_LONG> { precision = Integer.valueOf(tk.image); } | tk=<K_MAX> { precision = Integer.MAX_VALUE; } )
7030-
[ "," tk = <S_LONG> { scale = Integer.valueOf(tk.image); } ]
7030+
LOOKAHEAD(2) "("
7031+
(
7032+
// Handle precision: S_LONG, K_MAX, or JDBC Parameter
7033+
tk=<S_LONG> { precision = Integer.valueOf(tk.image); }
7034+
| tk=<K_MAX> { precision = Integer.MAX_VALUE; }
7035+
| jdbc = JdbcParameter() { precision = -1; argumentsStringList.add("?"); }
7036+
)
7037+
[
7038+
","
7039+
(
7040+
tk = <S_LONG> { scale = Integer.valueOf(tk.image); }
7041+
| jdbc = JdbcParameter() { scale = -1; argumentsStringList.add("?"); }
7042+
)
7043+
]
70317044
")"
70327045
]
70337046
{
7034-
colDataType = new ColDataType(type, precision, scale);
7047+
// If JDBC parameters were used, construct with string arguments
7048+
if (!argumentsStringList.isEmpty()) {
7049+
colDataType = new ColDataType(type + "(" + String.join(", ", argumentsStringList) + ")");
7050+
} else {
7051+
colDataType = new ColDataType(type, precision, scale);
7052+
}
70357053
}
70367054
)
70377055
)

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5343,6 +5343,32 @@ public void testMissingBracketsNestedInIssue() throws JSQLParserException {
53435343
true);
53445344
}
53455345

5346+
@Test
5347+
public void testJdbcParameterInColDataTypePrecision() throws JSQLParserException {
5348+
assertSqlCanBeParsedAndDeparsed(
5349+
"SELECT price::VARCHAR(?) FROM products WHERE quantity = 50;",
5350+
true);
5351+
}
5352+
5353+
@Test
5354+
public void testJdbcParameterInColDataTypePrecisionAndScale() throws JSQLParserException {
5355+
assertSqlCanBeParsedAndDeparsed(
5356+
"SELECT price::DECIMAL(?, ?) FROM products WHERE quantity = 50;",
5357+
true);
5358+
}
5359+
5360+
@Test
5361+
public void testPrecisionJdbcParameterWithWhitespaces() throws JSQLParserException {
5362+
assertSqlCanBeParsedAndDeparsed(
5363+
"SELECT price :: numeric(?) FROM products WHERE quantity = 50;",
5364+
true);
5365+
}
5366+
5367+
@Test
5368+
public void testCastWithPrecisionJdbcParameter() throws JSQLParserException {
5369+
assertSqlCanBeParsedAndDeparsed("SELECT (CAST(? AS VARCHAR(?))) FROM products;");
5370+
}
5371+
53465372
@Test
53475373
public void testAnyComparisionExpressionValuesList1232() throws JSQLParserException {
53485374
assertSqlCanBeParsedAndDeparsed("select * from foo where id != ALL(VALUES 1,2,3)", true);

0 commit comments

Comments
 (0)