Skip to content

Commit 15b7cc3

Browse files
committed
Merge origin/master
2 parents 75ceb1a + 43c282d commit 15b7cc3

File tree

9 files changed

+134
-0
lines changed

9 files changed

+134
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2021 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
import net.sf.jsqlparser.statement.select.PlainSelect;
14+
15+
import java.util.List;
16+
17+
public class ArrayConstructor extends ASTNodeAccessImpl implements Expression {
18+
private List<Expression> expressions;
19+
private boolean arrayKeyword;
20+
21+
public List<Expression> getExpressions() {
22+
return expressions;
23+
}
24+
25+
public void setExpressions(List<Expression> expressions) {
26+
this.expressions = expressions;
27+
}
28+
29+
public boolean isArrayKeyword() {
30+
return arrayKeyword;
31+
}
32+
33+
public void setArrayKeyword(boolean arrayKeyword) {
34+
this.arrayKeyword = arrayKeyword;
35+
}
36+
37+
public ArrayConstructor(List<Expression> expressions, boolean arrayKeyword) {
38+
this.expressions = expressions;
39+
this.arrayKeyword = arrayKeyword;
40+
}
41+
42+
@Override
43+
public void accept(ExpressionVisitor expressionVisitor) {
44+
expressionVisitor.visit(this);
45+
}
46+
47+
@Override
48+
public String toString() {
49+
StringBuilder sb = new StringBuilder();
50+
if (arrayKeyword) {
51+
sb.append("ARRAY");
52+
}
53+
sb.append("[");
54+
sb.append(PlainSelect.getStringList(expressions, true, false));
55+
sb.append("]");
56+
return sb.toString();
57+
}
58+
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ public interface ExpressionVisitor {
158158

159159
public void visit(ArrayExpression aThis);
160160

161+
public void visit(ArrayConstructor aThis);
162+
161163
public void visit(VariableAssignment aThis);
162164

163165
public void visit(XMLSerializeExpr aThis);

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,13 @@ public void visit(ArrayExpression array) {
542542
array.getIndexExpression().accept(this);
543543
}
544544

545+
@Override
546+
public void visit(ArrayConstructor aThis) {
547+
for (Expression expression : aThis.getExpressions()) {
548+
expression.accept(this);
549+
}
550+
}
551+
545552
@Override
546553
public void visit(VariableAssignment var) {
547554
var.getVariable().accept(this);

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import net.sf.jsqlparser.expression.AnalyticExpression;
1616
import net.sf.jsqlparser.expression.AnyComparisonExpression;
1717
import net.sf.jsqlparser.expression.ArrayExpression;
18+
import net.sf.jsqlparser.expression.ArrayConstructor;
1819
import net.sf.jsqlparser.expression.BinaryExpression;
1920
import net.sf.jsqlparser.expression.CaseExpression;
2021
import net.sf.jsqlparser.expression.CastExpression;
@@ -875,6 +876,13 @@ public void visit(ArrayExpression array) {
875876
array.getIndexExpression().accept(this);
876877
}
877878

879+
@Override
880+
public void visit(ArrayConstructor array) {
881+
for (Expression expression : array.getExpressions()) {
882+
expression.accept(this);
883+
}
884+
}
885+
878886
@Override
879887
public void visit(CreateSequence createSequence) {
880888
throw new UnsupportedOperationException("Finding tables from CreateSequence is not supported");

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import net.sf.jsqlparser.expression.AnalyticType;
1818
import net.sf.jsqlparser.expression.AnyComparisonExpression;
1919
import net.sf.jsqlparser.expression.ArrayExpression;
20+
import net.sf.jsqlparser.expression.ArrayConstructor;
2021
import net.sf.jsqlparser.expression.BinaryExpression;
2122
import net.sf.jsqlparser.expression.CaseExpression;
2223
import net.sf.jsqlparser.expression.CastExpression;
@@ -897,6 +898,24 @@ public void visit(ArrayExpression array) {
897898
buffer.append("]");
898899
}
899900

901+
@Override
902+
public void visit(ArrayConstructor aThis) {
903+
if (aThis.isArrayKeyword()) {
904+
buffer.append("ARRAY");
905+
}
906+
buffer.append("[");
907+
boolean first = true;
908+
for (Expression expression : aThis.getExpressions()) {
909+
if (!first) {
910+
buffer.append(", ");
911+
} else {
912+
first = false;
913+
}
914+
expression.accept(this);
915+
}
916+
buffer.append("]");
917+
}
918+
900919
@Override
901920
void deParse(Expression statement) {
902921
statement.accept(this);

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import net.sf.jsqlparser.expression.AllComparisonExpression;
1313
import net.sf.jsqlparser.expression.AnalyticExpression;
1414
import net.sf.jsqlparser.expression.AnyComparisonExpression;
15+
import net.sf.jsqlparser.expression.ArrayConstructor;
1516
import net.sf.jsqlparser.expression.ArrayExpression;
1617
import net.sf.jsqlparser.expression.BinaryExpression;
1718
import net.sf.jsqlparser.expression.CaseExpression;
@@ -532,6 +533,13 @@ public void visit(ArrayExpression array) {
532533
array.getIndexExpression().accept(this);
533534
}
534535

536+
@Override
537+
public void visit(ArrayConstructor aThis) {
538+
for (Expression expression : aThis.getExpressions()) {
539+
expression.accept(this);
540+
}
541+
}
542+
535543
@Override
536544
public void validate(Expression expression) {
537545
expression.accept(this);

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
129129
| <K_AND_OPERATOR:"&&">
130130
| <K_ANY:"ANY">
131131
| <K_APPLY:"APPLY">
132+
| <K_ARRAY_LITERAL: "ARRAY" >
132133
| <K_AS: "AS">
133134
| <K_ASC:"ASC">
134135
| <K_AUTHORIZATION:"AUTHORIZATION">
@@ -1345,6 +1346,7 @@ String RelObjectNameWithoutValue() :
13451346
| tk=<K_VIEW> | tk=<K_NOLOCK> | tk=<K_VALIDATE> | tk=<K_CYCLE> | tk=<K_OF> | tk=<K_EXCLUDE>
13461347
/*| tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
13471348
| tk=<K_FORMAT> | tk=<K_DIV> | tk=<K_UNSIGNED> | tk=<K_CASE>
1349+
| tk=<K_ARRAY_LITERAL>
13481350
)
13491351

13501352
{ return tk.image; }
@@ -3328,6 +3330,8 @@ Expression PrimaryExpression() #PrimaryExpression:
33283330

33293331
| LOOKAHEAD(2) retval=DateTimeLiteralExpression()
33303332

3333+
| LOOKAHEAD(2) <K_ARRAY_LITERAL> retval=ArrayConstructor(true)
3334+
33313335
| LOOKAHEAD(2) retval = NextValExpression()
33323336

33333337
| retval=Column()
@@ -3438,6 +3442,21 @@ DateTimeLiteralExpression DateTimeLiteralExpression() : {
34383442
t=<S_CHAR_LITERAL> { expr.setValue(t.image); return expr; }
34393443
}
34403444

3445+
ArrayConstructor ArrayConstructor(final boolean arrayKeyword) : {
3446+
ArrayList<Expression> expList = new ArrayList();
3447+
ArrayConstructor array = new ArrayConstructor(expList, arrayKeyword);
3448+
Expression exp = null;
3449+
} {
3450+
"["
3451+
[ (LOOKAHEAD(3) exp = SimpleExpression() | exp = ArrayConstructor(false))
3452+
{ expList.add(exp); }
3453+
("," (exp = SimpleExpression() | exp = ArrayConstructor(false))
3454+
{ expList.add(exp); })*
3455+
]
3456+
"]"
3457+
{ return array; }
3458+
}
3459+
34413460
JsonExpression JsonExpression() : {
34423461
JsonExpression result = new JsonExpression();
34433462
Column column;
@@ -4498,6 +4517,8 @@ List<String> CreateParameter():
44984517
|
44994518
tk=<K_FALSE> { param.add(tk.image); }
45004519
|
4520+
(<K_ARRAY_LITERAL> exp=ArrayConstructor(true)) { param.add(exp.toString()); }
4521+
|
45014522
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
45024523
)
45034524
{return param;}

src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,4 +687,9 @@ public void testCreateTableWithCommentIssue413_2() throws JSQLParserException {
687687
public void testCreateTableWithParameterDefaultFalseIssue1089() throws JSQLParserException {
688688
assertSqlCanBeParsedAndDeparsed("create table ADDRESS_TYPE ( address_type CHAR(1) not null, at_name VARCHAR(250) not null, is_disabled BOOL not null default FALSE, constraint PK_ADDRESS_TYPE primary key (address_type) )", true);
689689
}
690+
@Test
691+
public void testDefaultArray() throws JSQLParserException {
692+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE t (f1 text[] DEFAULT ARRAY[] :: text[] NOT NULL, f2 int[] DEFAULT ARRAY[1, 2])");
693+
}
694+
690695
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4446,4 +4446,10 @@ public void testSignedKeywordIssue995() throws JSQLParserException {
44464446
public void testSelectTuple() throws JSQLParserException {
44474447
assertSqlCanBeParsedAndDeparsed("SELECT hyperloglog_distinct((1, 2)) FROM t");
44484448
}
4449+
4450+
@Test
4451+
public void testArrayDeclare() throws JSQLParserException {
4452+
assertSqlCanBeParsedAndDeparsed("SELECT ARRAY[1, f1], ARRAY[[1, 2], [3, f2 + 1]], ARRAY[]::text[] FROM t1");
4453+
}
4454+
44494455
}

0 commit comments

Comments
 (0)