Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ public class ParserKeywordsUtils {
{"SELECT", RESTRICTED_ALIAS},
{"SEMI", RESTRICTED_JSQLPARSER},
{"SET", RESTRICTED_JSQLPARSER},
{"SETTINGS", RESTRICTED_JSQLPARSER},
{"SOME", RESTRICTED_JSQLPARSER},
{"START", RESTRICTED_JSQLPARSER},
{"STATEMENT", RESTRICTED_JSQLPARSER},
Expand Down
49 changes: 40 additions & 9 deletions src/main/java/net/sf/jsqlparser/statement/select/PlainSelect.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,7 @@
*/
package net.sf.jsqlparser.statement.select;

import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.PreferringClause;
import net.sf.jsqlparser.expression.WindowDefinition;
import net.sf.jsqlparser.schema.Table;
import static java.util.stream.Collectors.joining;

import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -24,8 +18,14 @@
import java.util.Iterator;
import java.util.List;
import java.util.Optional;

import static java.util.stream.Collectors.joining;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.OracleHierarchicalExpression;
import net.sf.jsqlparser.expression.OracleHint;
import net.sf.jsqlparser.expression.PreferringClause;
import net.sf.jsqlparser.expression.WindowDefinition;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.update.UpdateSet;

@SuppressWarnings({"PMD.CyclomaticComplexity"})
public class PlainSelect extends Select {
Expand Down Expand Up @@ -65,6 +65,7 @@ public class PlainSelect extends Select {
private boolean isUsingOnly = false;
private boolean useWithNoLog = false;
private Table intoTempTable = null;
private List<UpdateSet> settings = null;

public PlainSelect() {}

Expand Down Expand Up @@ -323,6 +324,19 @@ public PlainSelect withIntoTempTable(Table intoTempTable) {
return this;
}

public List<UpdateSet> getSettings() {
return settings;
}

public void setSettings(List<UpdateSet> settings) {
this.settings = settings;
}

public PlainSelect withSettings(List<UpdateSet> settings) {
this.setSettings(settings);
return this;
}

@Override
public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
return selectVisitor.visit(this, context);
Expand Down Expand Up @@ -632,6 +646,11 @@ public String toString() {
StringBuilder builder = new StringBuilder();
super.appendTo(builder);

if (settings != null && !settings.isEmpty()) {
builder.append(" SETTINGS ");
UpdateSet.appendUpdateSetsTo(builder, settings);
}

if (optimizeFor != null) {
builder.append(optimizeFor);
}
Expand Down Expand Up @@ -779,6 +798,18 @@ public PlainSelect addJoins(Collection<? extends Join> joins) {
return this.withJoins(collection);
}

public PlainSelect addSettings(UpdateSet... settings) {
List<UpdateSet> collection = Optional.ofNullable(getSettings()).orElseGet(ArrayList::new);
Collections.addAll(collection, settings);
return this.withSettings(collection);
}

public PlainSelect addSettings(Collection<? extends UpdateSet> settings) {
List<UpdateSet> collection = Optional.ofNullable(getSettings()).orElseGet(ArrayList::new);
collection.addAll(settings);
return this.withSettings(collection);
}

public <E extends FromItem> E getFromItem(Class<E> type) {
return type.cast(getFromItem());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,10 @@ public <S> StringBuilder visit(PlainSelect plainSelect, S context) {
builder.append(" SKIP LOCKED");
}
}
if (plainSelect.getSettings() != null && !plainSelect.getSettings().isEmpty()) {
builder.append(" SETTINGS ");
deparseUpdateSets(plainSelect.getSettings(), builder, expressionVisitor);
}
if (plainSelect.getOptimizeFor() != null) {
deparseOptimizeFor(plainSelect.getOptimizeFor());
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_SEPARATOR:"SEPARATOR">
| <K_SESSION:"SESSION">
| <K_SET:"SET">
| <K_SETTINGS:"SETTINGS">
| <K_SETS:"SETS">
| <K_SHOW : "SHOW">
| <K_SHUTDOWN : "SHUTDOWN">
Expand Down Expand Up @@ -4292,6 +4293,7 @@ PlainSelect PlainSelect() #PlainSelect:
String windowName = null;
WindowDefinition winDef;
Table intoTempTable = null;
List<UpdateSet> settings = null;
Distinct distinct;
}
{
Expand Down Expand Up @@ -4408,6 +4410,7 @@ PlainSelect PlainSelect() #PlainSelect:
[ LOOKAHEAD(2) (<K_NOWAIT> { plainSelect.setNoWait(true); }
| <K_SKIP> <K_LOCKED> { plainSelect.setSkipLocked(true); }) ]
]
[ LOOKAHEAD(2) <K_SETTINGS> settings = UpdateSets() { plainSelect.setSettings(settings); } ]
[ LOOKAHEAD(<K_OPTIMIZE>) optimize = OptimizeFor() { plainSelect.setOptimizeFor(optimize); } ]
[ LOOKAHEAD(3) <K_INTO> <K_TEMP> intoTempTable = Table() { plainSelect.setIntoTempTable(intoTempTable);} ]
[ LOOKAHEAD(3)<K_WITH> <K_NO> <K_LOG> { plainSelect.setUseWithNoLog(true); } ]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
*/
package net.sf.jsqlparser.statement.select;

import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;

import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;

public class ClickHouseTest {

@Test
Expand Down Expand Up @@ -132,4 +132,21 @@ public void testParameterizedAggregateFunctionIssue2125() throws JSQLParserExcep
Assertions.assertEquals(1, function.getParameters().size());
Assertions.assertEquals(1, function.getChainedParameters().size());
}

@Test
public void testSettingsClauseIssue2362() throws JSQLParserException {
String sql = "SELECT *\nFROM events\nSETTINGS max_threads = 1";
PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
Assertions.assertNotNull(select.getSettings());
Assertions.assertEquals(1, select.getSettings().size());
Assertions.assertEquals("max_threads = 1", select.getSettings().get(0).toString());
}

@Test
public void testMultipleSettingsClauseIssue2362() throws JSQLParserException {
String sql = "SELECT * FROM events SETTINGS max_threads = 1, max_rows_to_read = 1000";
PlainSelect select = (PlainSelect) assertSqlCanBeParsedAndDeparsed(sql, true);
Assertions.assertNotNull(select.getSettings());
Assertions.assertEquals(2, select.getSettings().size());
}
}