package sqlancer.sqlite3.ast; import java.util.ArrayList; import java.util.Collections; import java.util.List; import sqlancer.common.ast.newast.Select; import sqlancer.sqlite3.SQLite3Visitor; import sqlancer.sqlite3.ast.SQLite3Expression.Join; import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column; import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column.SQLite3CollateSequence; import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Table; public class SQLite3Select extends SQLite3Expression implements Select { private SelectType fromOptions = SelectType.ALL; private List fromList = Collections.emptyList(); private SQLite3Expression whereClause; private List groupByClause = Collections.emptyList(); private SQLite3Expression limitClause; private List orderByClause = Collections.emptyList(); private SQLite3Expression offsetClause; private List fetchColumns = Collections.emptyList(); private List joinStatements = Collections.emptyList(); private SQLite3Expression havingClause; public SQLite3Select() { } public SQLite3Select(SQLite3Select other) { fromOptions = other.fromOptions; fromList = new ArrayList<>(other.fromList); whereClause = other.whereClause; groupByClause = other.groupByClause; limitClause = other.limitClause; orderByClause = new ArrayList<>(other.orderByClause); offsetClause = other.offsetClause; fetchColumns = new ArrayList<>(other.fetchColumns); joinStatements = new ArrayList<>(); for (Join j : other.joinStatements) { joinStatements.add(new Join(j)); } havingClause = other.havingClause; } public enum SelectType { DISTINCT, ALL; } public void setSelectType(SelectType fromOptions) { this.setFromOptions(fromOptions); } public SelectType getFromOptions() { return fromOptions; } public void setFromOptions(SelectType fromOptions) { this.fromOptions = fromOptions; } @Override public List getFromList() { return fromList; } @Override public void setFromList(List fromList) { this.fromList = fromList; } @Override public SQLite3Expression getWhereClause() { return whereClause; } @Override public void setWhereClause(SQLite3Expression whereClause) { this.whereClause = whereClause; } @Override public void setGroupByClause(List groupByClause) { this.groupByClause = groupByClause; } @Override public List getGroupByClause() { return groupByClause; } @Override public void setLimitClause(SQLite3Expression limitClause) { this.limitClause = limitClause; } @Override public SQLite3Expression getLimitClause() { return limitClause; } @Override public List getOrderByClauses() { return orderByClause; } @Override public void setOrderByClauses(List orderBy) { this.orderByClause = orderBy; } @Override public void setOffsetClause(SQLite3Expression offsetClause) { this.offsetClause = offsetClause; } @Override public SQLite3Expression getOffsetClause() { return offsetClause; } @Override public void setFetchColumns(List fetchColumns) { this.fetchColumns = fetchColumns; } @Override public List getFetchColumns() { return fetchColumns; } @Override public void setJoinClauses(List joinStatements) { this.joinStatements = joinStatements; } @Override public List getJoinClauses() { return joinStatements; } @Override public SQLite3CollateSequence getExplicitCollateSequence() { // TODO implement? return null; } @Override public void setHavingClause(SQLite3Expression havingClause) { this.havingClause = havingClause; } @Override public SQLite3Expression getHavingClause() { assert orderByClause != null; return havingClause; } @Override public String asString() { return SQLite3Visitor.asString(this); } }