Skip to content

Commit 9a32ff5

Browse files
authored
fix: prevent bare partition columns from inheriting the previous item's value (#2518)
Partitions() shares one production-level valueExpression across list items, so a bare (dynamic) partition column kept the value of the preceding item: PARTITION (dtime = '2024-04-03', region) deparsed as region = '2024-04-03', silently turning a dynamic partition into a static assignment. Reset the variable per item, same idiom as DeclareType, Alias and ColumnsNamesList. Fixes #2500 Signed-off-by: 付典 <fudianchn@gmail.com>
1 parent 864181b commit 9a32ff5

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4065,7 +4065,7 @@ List<Partition> Partitions():
40654065
(
40664066
LOOKAHEAD(2) (
40674067
","
4068-
tableColumn=Column() [ "=" valueExpression=Expression() ]
4068+
tableColumn=Column() { valueExpression = null; } [ "=" valueExpression=Expression() ]
40694069
{ partitions.add( new Partition (tableColumn, valueExpression)); }
40704070
)
40714071
)*

src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,58 @@ void testInsertOverwrite() throws JSQLParserException {
966966
assertFalse(insert.isOverwrite());
967967
}
968968

969+
@Test
970+
// a dynamic partition column without a value must not inherit the value of a
971+
// preceding static partition column (#2500)
972+
void testInsertMixedStaticAndDynamicPartitions() throws JSQLParserException {
973+
String sqlStr =
974+
"INSERT OVERWRITE TABLE t PARTITION (dtime = '2024-04-03', region) SELECT * FROM a";
975+
Insert insert = (Insert) assertSqlCanBeParsedAndDeparsed(sqlStr);
976+
assertEquals(2, insert.getPartitions().size());
977+
assertEquals("dtime", insert.getPartitions().get(0).getColumn().getColumnName());
978+
assertEquals("'2024-04-03'", insert.getPartitions().get(0).getValue().toString());
979+
assertEquals("region", insert.getPartitions().get(1).getColumn().getColumnName());
980+
assertNull(insert.getPartitions().get(1).getValue());
981+
982+
sqlStr =
983+
"INSERT OVERWRITE TABLE t PARTITION (region, dtime = '2024-04-03') SELECT * FROM a";
984+
insert = (Insert) assertSqlCanBeParsedAndDeparsed(sqlStr);
985+
assertEquals(2, insert.getPartitions().size());
986+
assertEquals("region", insert.getPartitions().get(0).getColumn().getColumnName());
987+
assertNull(insert.getPartitions().get(0).getValue());
988+
assertEquals("dtime", insert.getPartitions().get(1).getColumn().getColumnName());
989+
assertEquals("'2024-04-03'", insert.getPartitions().get(1).getValue().toString());
990+
991+
sqlStr = "INSERT OVERWRITE TABLE t PARTITION"
992+
+ " (dtime = '2024-04-03', region, dept) SELECT * FROM a";
993+
insert = (Insert) assertSqlCanBeParsedAndDeparsed(sqlStr);
994+
assertEquals(3, insert.getPartitions().size());
995+
assertEquals("dtime", insert.getPartitions().get(0).getColumn().getColumnName());
996+
assertEquals("'2024-04-03'", insert.getPartitions().get(0).getValue().toString());
997+
assertEquals("region", insert.getPartitions().get(1).getColumn().getColumnName());
998+
assertNull(insert.getPartitions().get(1).getValue());
999+
assertEquals("dept", insert.getPartitions().get(2).getColumn().getColumnName());
1000+
assertNull(insert.getPartitions().get(2).getValue());
1001+
1002+
sqlStr = "INSERT OVERWRITE TABLE t PARTITION (a, b = '1', c) SELECT * FROM a";
1003+
insert = (Insert) assertSqlCanBeParsedAndDeparsed(sqlStr);
1004+
assertEquals(3, insert.getPartitions().size());
1005+
assertEquals("a", insert.getPartitions().get(0).getColumn().getColumnName());
1006+
assertNull(insert.getPartitions().get(0).getValue());
1007+
assertEquals("b", insert.getPartitions().get(1).getColumn().getColumnName());
1008+
assertEquals("'1'", insert.getPartitions().get(1).getValue().toString());
1009+
assertEquals("c", insert.getPartitions().get(2).getColumn().getColumnName());
1010+
assertNull(insert.getPartitions().get(2).getValue());
1011+
1012+
sqlStr = "INSERT INTO TABLE t PARTITION (dtime = 20240403, region) SELECT * FROM a";
1013+
insert = (Insert) assertSqlCanBeParsedAndDeparsed(sqlStr);
1014+
assertEquals(2, insert.getPartitions().size());
1015+
assertEquals("dtime", insert.getPartitions().get(0).getColumn().getColumnName());
1016+
assertEquals("20240403", insert.getPartitions().get(0).getValue().toString());
1017+
assertNull(insert.getPartitions().get(1).getValue());
1018+
assertFalse(insert.isOverwrite());
1019+
}
1020+
9691021
@ParameterizedTest
9701022
@ValueSource(strings = {
9711023
"INSERT INTO mytable (foo) OVERRIDING SYSTEM VALUE VALUES (1)",

0 commit comments

Comments
 (0)