Skip to content

Commit 2b568ce

Browse files
committed
progress
1 parent b0f6226 commit 2b568ce

File tree

5 files changed

+273
-61
lines changed

5 files changed

+273
-61
lines changed

include/sql/SQLOps.td

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ def ColumnOp : SQL_Op<"column", [Pure]> {
3838
let hasCanonicalizer = 0;
3939
}
4040

41-
def TableOp : SQL_Op<"table", [Pure]> {
42-
let summary = "table";
41+
def AllColumnsOp : SQL_Op<"all_columns", [Pure]> {
42+
let summary = "all columns op";
4343

4444
let arguments = (ins StrAttr:$expr);
4545
let results = (outs SQLExprType:$result);
@@ -48,20 +48,88 @@ def TableOp : SQL_Op<"table", [Pure]> {
4848
let hasCanonicalizer = 0;
4949
}
5050

51-
def EmptyTableOp : SQL_Op<"empty_table", [Pure]> {
52-
let summary = "empty_table";
53-
// i need to specify the size of a Variadic?
51+
def WhereOp: SQL_Op<"where", [Pure]> {
52+
let summary = "where op";
53+
54+
let arguments = (ins SQLBoolType:$expr);
55+
let results = (outs SQLExprType:$result);
56+
57+
let hasFolder = 0;
58+
let hasCanonicalizer = 0;
59+
}
60+
61+
def CalcBoolOp: SQL_Op<"calc_bool", [Pure]> {
62+
let summary = "calc_bool op";
63+
64+
let arguments = (ins StrAttr:$expr);
65+
let results = (outs SQLBoolType:$result);
66+
67+
let hasFolder = 0;
68+
let hasCanonicalizer = 0;
69+
}
70+
71+
def AndOp: SQL_Op<"and", [Pure]> {
72+
let summary = "and op";
73+
74+
let arguments = (ins Variadic<SQLBoolType>:$expr);
75+
let results = (outs SQLBoolType:$result);
76+
77+
let hasFolder = 0;
78+
let hasCanonicalizer = 0;
79+
}
80+
81+
def OrOp: SQL_Op<"or", [Pure]> {
82+
let summary = "or op";
83+
84+
let arguments = (ins Variadic<SQLBoolType>:$expr);
85+
let results = (outs SQLBoolType:$result);
86+
87+
let hasFolder = 0;
88+
let hasCanonicalizer = 0;
89+
}
90+
91+
def TableOp : SQL_Op<"table", [Pure]> {
92+
let summary = "table";
93+
5494
let arguments = (ins StrAttr:$expr);
5595
let results = (outs SQLExprType:$result);
5696

5797
let hasFolder = 0;
5898
let hasCanonicalizer = 0;
5999
}
60100

61-
// def VectorNotEmpty : AttrConstraint<CPred<"$_self.size() > 0">,
62-
// "VectorNotEmpty">;
63101

64-
102+
def SQLConstantStringOp : SQL_Op<"str_constant", [Pure]> {
103+
let summary = "str_constant";
104+
105+
let arguments = (ins StrAttr:$input);
106+
let results = (outs AnyType:$result);
107+
108+
let hasFolder = 0;
109+
let hasCanonicalizer = 0;
110+
}
111+
112+
def SQLToStringOp : SQL_Op<"to_string", [Pure]> {
113+
let summary = "to_string";
114+
115+
let arguments = (ins SQLExprType:$expr);
116+
let results = (outs AnyType:$result);
117+
118+
let hasFolder = 0;
119+
let hasCanonicalizer = 0;
120+
}
121+
122+
123+
def SQLStringConcatOp : SQL_Op<"string_concat", [Pure]> {
124+
let summary = "string_concat";
125+
126+
let arguments = (ins Variadic<AnyType>:$expr);
127+
let results = (outs AnyType:$result);
128+
129+
let hasFolder = 0;
130+
let hasCanonicalizer = 1;
131+
}
132+
65133
def SelectOp : SQL_Op<"select", [Pure]> {
66134
let summary = "select";
67135
// i need to specify the size of a Variadic?

include/sql/SQLTypes.td

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,14 @@ def SQLExprType : SQL_Type<"Expr", "expr"> {
2828
// let assemblyFormat = "`<` $value `>`";
2929
}
3030

31+
32+
def SQLBoolType : SQL_Type<"Bool", "bool"> {
33+
let summary = "SQL boolean type";
34+
let description = "Custom attr or value type in sql dialect";
35+
36+
// placeholder params
37+
// let parameters = (ins StringRefParameter<"the custom value">:$value);
38+
// let assemblyFormat = "`<` $value `>`";
39+
}
40+
3141
#endif // SQL_TYPES

lib/sql/Ops.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,4 +212,27 @@ class UnparsedOpInnerCast final : public OpRewritePattern<UnparsedOp> {
212212
void UnparsedOp::getCanonicalizationPatterns(RewritePatternSet &results,
213213
MLIRContext *context) {
214214
results.insert<UnparsedOpInnerCast<polygeist::Pointer2MemrefOp> >(context);
215+
}
216+
217+
218+
class SQLStringConcatOpCanonicalization final : public OpRewritePattern<SQLStringConcatOp> {
219+
public:
220+
using OpRewritePattern<SQLStringConcatOp>::OpRewritePattern;
221+
222+
LogicalResult matchAndRewrite(SQLStringConcatOp op,
223+
PatternRewriter &rewriter) const override {
224+
225+
auto input1 = op->getOperand(0).getDefiningOp<SQLConstantStringOp>();
226+
auto input2 = op->getOperand(1).getDefiningOp<SQLConstantStringOp>();
227+
228+
if (!input1 || !input2) return failure();
229+
230+
rewriter.replaceOpWithNewOp<SQLConstantStringOp>(op, op.getType(), (input1.getInput() + input2.getInput()).str());
231+
return success();
232+
}
233+
};
234+
235+
void SQLStringConcatOp::getCanonicalizationPatterns(RewritePatternSet &results,
236+
MLIRContext *context) {
237+
results.insert<SQLStringConcatOpCanonicalization>(context);
215238
}

lib/sql/Parser.cpp

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ struct ParseValue {
4040
return ty;
4141
}
4242
Value getValue() const {
43-
int type_value = static_cast<int>(ty);
4443
// llvm::errs() << "ty: " << type_value << "\n";
4544
// llvm::errs() << "value: " << value << "\n";
4645
// llvm::errs() << "attr: " << attr << "\n";
@@ -57,7 +56,8 @@ struct ParseValue {
5756
enum class ParseMode {
5857
None,
5958
Column,
60-
Table
59+
Table,
60+
Bool,
6161
};
6262

6363

@@ -80,11 +80,6 @@ class SQLParser {
8080

8181
SQLParser(Location loc, OpBuilder &builder, std::string sql, int i) : loc(loc), builder(builder),
8282
sql(sql), i(i) {
83-
// llvm::errs() << "last three " << sql.substr(sql.size()-6, sql.size()) << "\n";
84-
// if (!sql.substr(sql.size()-2, sql.size()).compare("\\00")){
85-
// llvm::errs() << "triggers trim" << "\n";
86-
// sql = sql.substr(0, sql.size()-1);
87-
// }
8883
}
8984

9085
std::string peek() {
@@ -179,60 +174,67 @@ class SQLParser {
179174
Value table = nullptr;
180175
while (true) {
181176
peekStr = peek();
182-
// if (hasColumns) {
183-
if (peekStr == "FROM") {
184-
pop();
185-
table = parseNext(ParseMode::Table).getValue();
186-
hasColumns = false;
177+
if (hasColumns) {
178+
if (peekStr == "FROM") {
179+
pop();
180+
table = parseNext(ParseMode::Table).getValue();
181+
hasColumns = false;
182+
break;
183+
}
184+
ParseValue col = parseNext(ParseMode::Column);
185+
if (col.getType() == ParseType::Nothing) {
186+
hasColumns = false;
187+
break;
188+
} else {
189+
columns.push_back(col.getValue());
190+
}
191+
if (peekStr == ",") pop();
192+
} else if (peekStr == "WHERE") {
193+
pop();
194+
hasWhere = true;
195+
} else {
187196
break;
197+
// assert(0 && " additional clauses like limit/etc not yet handled");
188198
}
189-
ParseValue col = parseNext(ParseMode::Column);
190-
if (col.getType() == ParseType::Nothing) {
191-
hasColumns = false;
192-
break;
193-
} else {
194-
columns.push_back(col.getValue());
195-
}
196-
if (peekStr == ",") pop();
197-
// } else if (peekStr == "WHERE") {
198-
// pop();
199-
// hasWhere = true;
200-
// } else if (hasWhere){
201-
// // do something here
202-
// break;
203-
// } else {
204-
// break;
205-
// // assert(0 && " additional clauses like limit/etc not yet handled");
206-
// }
207199
}
208-
if (table)
209-
return ParseValue(builder.create<sql::SelectOp>(loc, ExprType::get(builder.getContext()), columns, table).getResult());
210-
else
211-
return ParseValue(builder.create<sql::SelectOp>(loc, ExprType::get(builder.getContext()), columns).getResult());
200+
if (!table)
201+
table = builder.create<sql::TableOp>(loc, ExprType::get(builder.getContext()), builder.getStringAttr("")).getResult();
202+
return ParseValue(builder.create<sql::SelectOp>(loc, ExprType::get(builder.getContext()), columns, table).getResult());
212203
} else if (is_number(&peekStr)){
213204
pop();
214205
return ParseValue(builder.create<IntOp>(loc, ExprType::get(builder.getContext()), builder.getStringAttr(peekStr)).getResult());
215206
} else if (mode == ParseMode::Column) {
216207
// do we need this??
217-
// if (peekStr == "*") {
218-
// pop();
219-
220-
// return ParseValue(builder.create<ColumnOp>(loc, ExprType::get(builder.getContext()), );
221-
// }
208+
if (peekStr == "*") {
209+
pop();
210+
return ParseValue(builder.create<AllColumnsOp>(loc, ExprType::get(builder.getContext()), builder.getStringAttr(peekStr)).getResult());
211+
}
222212
pop();
223213
return ParseValue(builder.create<ColumnOp>(loc, ExprType::get(builder.getContext()), builder.getStringAttr(peekStr)).getResult());
224214
} else if (mode == ParseMode::Table) {
225215
pop();
226-
return ParseValue(builder.create<TableOp>(loc,ExprType::get(builder.getContext()) , builder.getStringAttr(peekStr)).getResult());
227-
}
216+
return ParseValue(builder.create<TableOp>(loc,ExprType::get(builder.getContext()), builder.getStringAttr(peekStr)).getResult());
217+
} else if (mode == ParseMode::Bool) {
218+
// col = peekStr;
219+
pop();
220+
221+
} else if (peekStr == "(") {
222+
pop();
223+
ParseValue res = parseNext(ParseMode::None);
224+
assert(peek() == ")");
225+
pop();
226+
return res;
227+
} else if (peekStr == ")") {
228+
return ParseValue();
229+
}
228230
llvm::errs() << " Unknown token to parse: " << peekStr << "\n";
229231
llvm_unreachable("Unknown token to parse");
230232
}
231233

232234
};
233235

234236
std::vector<std::string> SQLParser::reservedWords = {
235-
"(", ")", ">=", "<=", "!=", ",", "=", ">", "<", "SELECT", "INSERT INTO", "VALUES", "UPDATE", "DELETE FROM", "WHERE", "FROM", "SET", "AS"
237+
"(", ")", ">=", "<=", "!=", ",", "=", ">", "<", "SELECT", "DISTINCT", "INSERT INTO", "VALUES", "UPDATE", "DELETE FROM", "WHERE", "FROM", "SET", "AS"
236238
};
237239

238240

0 commit comments

Comments
 (0)