Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: [MySQL] Support TABLE STATEMENT #1921

Merged
merged 4 commits into from
Dec 16, 2023
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
5 changes: 5 additions & 0 deletions src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,11 @@ public enum Feature {
*/
values,

/**
* SQL "TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]“
*/
tableStatement,

/**
* SQL "UPDATE" statement is allowed
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ public interface SelectVisitor {
void visit(Values aThis);

void visit(LateralSubSelect lateralSubSelect);

void visit(TableStatement tableStatement);
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,9 @@ public void visit(Values aThis) {
public void visit(LateralSubSelect lateralSubSelect) {

}

@Override
public void visit(TableStatement tableStatement) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2019 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement.select;

import net.sf.jsqlparser.schema.Table;

/**
* @see <a href="https://dev.mysql.com/doc/refman/8.2/en/table.html"></a> `TABLE table_name [ORDER
* BY column_name] [LIMIT number [OFFSET number]]` Union not currently supported
*
* @author jxnu-liguobin
*/
public class TableStatement extends Select {

private Table table;

public Table getTable() {
return table;
}

public void setTable(Table table) {
this.table = table;
}

@Override
public StringBuilder appendSelectBodyTo(StringBuilder builder) {
builder.append("TABLE ").append(table.getName());
return builder;
}

@SuppressWarnings({"PMD.CyclomaticComplexity"})
@Override
public StringBuilder appendTo(StringBuilder builder) {

appendSelectBodyTo(builder);

builder.append(orderByToString(false, orderByElements));

if (limit != null) {
builder.append(limit);
}
if (offset != null) {
builder.append(offset);
}
return builder;
}

@Override
public void accept(SelectVisitor selectVisitor) {
selectVisitor.visit(this);
}
}
11 changes: 8 additions & 3 deletions src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package net.sf.jsqlparser.util;

import java.util.LinkedList;
import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.statement.select.LateralSubSelect;
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
Expand All @@ -18,12 +20,10 @@
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;

import java.util.LinkedList;
import java.util.List;

/**
* Add aliases to every column and expression selected by a select - statement. Existing aliases are
* recognized and preserved. This class standard uses a prefix of A and a counter to generate new
Expand Down Expand Up @@ -112,4 +112,9 @@ public void visit(Values aThis) {
public void visit(LateralSubSelect lateralSubSelect) {
lateralSubSelect.getSelect().accept(this);
}

@Override
public void visit(TableStatement tableStatement) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package net.sf.jsqlparser.util;

import java.util.LinkedList;
import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.statement.select.LateralSubSelect;
Expand All @@ -19,12 +21,10 @@
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;

import java.util.LinkedList;
import java.util.List;

/**
* Connect all selected expressions with a binary expression. Out of select a,b from table one gets
* select a || b as expr from table. The type of binary expression is set by overwriting this class
Expand Down Expand Up @@ -103,4 +103,8 @@ public void visit(Values aThis) {
throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void visit(TableStatement tableStatement) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
6 changes: 6 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableFunction;
import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
Expand Down Expand Up @@ -691,6 +692,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
lateralSubSelect.getSelect().accept((SelectVisitor) this);
}

@Override
public void visit(TableStatement tableStatement) {
tableStatement.getTable().accept(this);
}

/**
* Initializes table names collector. Important is the usage of Column instances to find table
* names. This is only allowed for expression parsing, where a better place for tablenames could
Expand Down
15 changes: 10 additions & 5 deletions src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
*/
package net.sf.jsqlparser.util.deparser;

import static java.util.stream.Collectors.joining;

import java.util.Iterator;
import java.util.List;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
Expand Down Expand Up @@ -40,16 +44,12 @@
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.Skip;
import net.sf.jsqlparser.statement.select.TableFunction;
import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Top;
import net.sf.jsqlparser.statement.select.UnPivot;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;

import java.util.Iterator;
import java.util.List;

import static java.util.stream.Collectors.joining;

@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
public class SelectDeParser extends AbstractDeParser<PlainSelect> implements SelectVisitor,
SelectItemVisitor, FromItemVisitor, PivotVisitor {
Expand Down Expand Up @@ -589,6 +589,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
visit((ParenthesedSelect) lateralSubSelect);
}

@Override
public void visit(TableStatement tableStatement) {
new TableStatementDeParser(expressionVisitor, buffer).deParse(tableStatement);
}

@Override
public void visit(TableFunction tableFunction) {
buffer.append(tableFunction.toString());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2019 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.util.deparser;

import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.statement.select.LateralSubSelect;
import net.sf.jsqlparser.statement.select.Offset;
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SelectVisitor;
import net.sf.jsqlparser.statement.select.SetOperationList;
import net.sf.jsqlparser.statement.select.TableStatement;
import net.sf.jsqlparser.statement.select.Values;
import net.sf.jsqlparser.statement.select.WithItem;

/**
* @author jxnu-liguobin
*/
public class TableStatementDeParser extends AbstractDeParser<TableStatement>
implements SelectVisitor {

private final ExpressionVisitor expressionVisitor;

public TableStatementDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
super(buffer);
this.expressionVisitor = expressionVisitor;
}

@Override
public void deParse(TableStatement tableStatement) {
tableStatement.accept(this);
}

public void visit(Offset offset) {
buffer.append(" OFFSET ");
offset.getOffset().accept(expressionVisitor);
if (offset.getOffsetParam() != null) {
buffer.append(" ").append(offset.getOffsetParam());
}

}

@Override
public void visit(ParenthesedSelect parenthesedSelect) {

}

@Override
public void visit(PlainSelect plainSelect) {

}

@Override
public void visit(SetOperationList setOpList) {

}

@Override
public void visit(WithItem withItem) {

}

@Override
public void visit(Values aThis) {

}

@Override
public void visit(LateralSubSelect lateralSubSelect) {

}

@Override
public void visit(TableStatement tableStatement) {
buffer.append("TABLE ");
buffer.append(tableStatement.getTable());
if (tableStatement.getOrderByElements() != null) {
new OrderByDeParser(expressionVisitor, buffer)
.deParse(tableStatement.getOrderByElements());
}

if (tableStatement.getLimit() != null) {
new LimitDeparser(expressionVisitor, buffer).deParse(tableStatement.getLimit());
}
if (tableStatement.getOffset() != null) {
visit(tableStatement.getOffset());
}

// TODO UNION
}
}
Loading
Loading