package sqlancer.sqlite3.ast;
import java.util.Optional;
import sqlancer.sqlite3.schema.SQLite3Schema.SQLite3Column.SQLite3CollateSequence;
public abstract class SQLite3Case extends SQLite3Expression {
protected final CasePair[] pairs;
protected final SQLite3Expression elseExpr;
public SQLite3Case(CasePair[] pairs, SQLite3Expression elseExpr) {
this.pairs = pairs.clone();
this.elseExpr = elseExpr;
}
public static class CasePair {
private final SQLite3Expression cond;
private final SQLite3Expression then;
public CasePair(SQLite3Expression cond, SQLite3Expression then) {
this.cond = cond;
this.then = then;
}
public SQLite3Expression getCond() {
return cond;
}
public SQLite3Expression getThen() {
return then;
}
}
public CasePair[] getPairs() {
return pairs.clone();
}
public SQLite3Expression getElseExpr() {
return elseExpr;
}
protected SQLite3CollateSequence getExplicitCasePairAndElseCollate() {
for (CasePair c : pairs) {
if (c.getCond().getExplicitCollateSequence() != null) {
return c.getCond().getExplicitCollateSequence();
} else if (c.getThen().getExplicitCollateSequence() != null) {
return c.getThen().getExplicitCollateSequence();
}
}
if (elseExpr == null) {
return null;
} else {
return elseExpr.getExplicitCollateSequence();
}
}
public static class SQLite3CaseWithoutBaseExpression extends SQLite3Case {
public SQLite3CaseWithoutBaseExpression(CasePair[] pairs, SQLite3Expression elseExpr) {
super(pairs, elseExpr);
}
@Override
public SQLite3CollateSequence getExplicitCollateSequence() {
return getExplicitCasePairAndElseCollate();
}
@Override
public SQLite3Constant getExpectedValue() {
for (CasePair c : pairs) {
SQLite3Constant expectedValue = c.getCond().getExpectedValue();
if (expectedValue == null) {
return null;
}
Optional