Skip to content

Commit 97985bc

Browse files
committed
fix(parser): refresh transformer production doc and pin exact STRICT output
Signed-off-by: 付典 <fudianchn@gmail.com>
1 parent 8e6e3c1 commit 97985bc

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8333,9 +8333,9 @@ Expression SelectItemExpression() #ColumnsExpression(transformers != null):
83338333
}
83348334

83358335
/**
8336-
* Parses a single ClickHouse transformer: APPLY(expression), EXCEPT (columns) or
8337-
* REPLACE (selectItems). ClickHouse parses these in a loop, so they may repeat
8338-
* and combine in any order.
8336+
* Parses a single ClickHouse transformer: APPLY(expression), EXCEPT [STRICT] (columns)
8337+
* or a pattern, REPLACE [STRICT] (selectItems). ClickHouse parses these in a loop, so
8338+
* they may repeat and combine in any order.
83398339
*/
83408340
ColumnsTransformer ColumnsTransformer():
83418341
{
@@ -8359,7 +8359,7 @@ ColumnsTransformer ColumnsTransformer():
83598359
{ transformer = new ColumnsTransformer(ColumnsTransformer.ColumnsTransformerType.APPLY)
83608360
.setApplyExpression(applyExpression); }
83618361

8362-
| tk=<K_EXCEPT>
8362+
| <K_EXCEPT>
83638363
{ strict = false; }
83648364
[ <K_STRICT> { strict = true; } ]
83658365
(
@@ -8375,7 +8375,7 @@ ColumnsTransformer ColumnsTransformer():
83758375
transformer.setExceptColumns(exceptColumns);
83768376
} }
83778377

8378-
| tk=<K_EXCLUDE> exceptColumns = ParenthesedColumnList()
8378+
| <K_EXCLUDE> exceptColumns = ParenthesedColumnList()
83798379
{ transformer = new ColumnsTransformer(ColumnsTransformer.ColumnsTransformerType.EXCLUDE)
83808380
.setExceptColumns(exceptColumns); }
83818381

‎src/test/java/net/sf/jsqlparser/statement/select/ClickHouseTest.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
2626
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
2727
import net.sf.jsqlparser.util.TablesNamesFinder;
28+
import net.sf.jsqlparser.util.deparser.StatementDeParser;
2829
import org.junit.jupiter.api.Assertions;
2930
import org.junit.jupiter.api.Test;
3031
import org.junit.jupiter.params.ParameterizedTest;
@@ -397,6 +398,16 @@ public void testAllColumnsExceptStrictIssue2636() throws JSQLParserException {
397398
Assertions.assertFalse(allColumns.getTransformers().get(1).isStrict());
398399
assertSqlCanBeParsedAndDeparsed(sql, true);
399400

401+
// the transformer survives as the second leg of a set operation
402+
sql = "SELECT 1 UNION SELECT * EXCEPT STRICT (a) FROM t";
403+
SetOperationList union = (SetOperationList) ((Select) CCJSqlParserUtil.parse(sql))
404+
.getSelectBody();
405+
PlainSelect rightLeg = (PlainSelect) union.getSelects().get(1);
406+
AllColumns legColumns = Assertions.assertInstanceOf(AllColumns.class,
407+
rightLeg.getSelectItems().get(0).getExpression());
408+
Assertions.assertTrue(legColumns.getTransformers().get(0).isStrict());
409+
assertSqlCanBeParsedAndDeparsed(sql, true);
410+
400411
// the COLUMNS(...) matcher accepts the same STRICT form
401412
sql = "SELECT COLUMNS('m') EXCEPT STRICT (a) FROM t";
402413
select = (Select) CCJSqlParserUtil.parse(sql);
@@ -420,6 +431,10 @@ public void testAllColumnsReplaceStrictIssue2636() throws JSQLParserException {
420431
Assertions.assertTrue(transformer.isStrict());
421432
Assertions.assertEquals(2, transformer.getReplaceItems().size());
422433
Assertions.assertEquals("a", transformer.getReplaceItems().get(0).getAlias().getName());
434+
Assertions.assertEquals(sql, select.toString());
435+
StatementDeParser statementDeParser = new StatementDeParser(new StringBuilder());
436+
select.accept(statementDeParser, null);
437+
Assertions.assertEquals(sql, statementDeParser.getBuilder().toString());
423438
assertSqlCanBeParsedAndDeparsed(sql, true);
424439

425440
sql = "SELECT COLUMNS('m') REPLACE STRICT(x + 1 AS x) FROM t";

0 commit comments

Comments
 (0)