@@ -40,7 +40,6 @@ struct ParseValue {
40
40
return ty;
41
41
}
42
42
Value getValue () const {
43
- int type_value = static_cast <int >(ty);
44
43
// llvm::errs() << "ty: " << type_value << "\n";
45
44
// llvm::errs() << "value: " << value << "\n";
46
45
// llvm::errs() << "attr: " << attr << "\n";
@@ -57,7 +56,8 @@ struct ParseValue {
57
56
enum class ParseMode {
58
57
None,
59
58
Column,
60
- Table
59
+ Table,
60
+ Bool,
61
61
};
62
62
63
63
@@ -80,11 +80,6 @@ class SQLParser {
80
80
81
81
SQLParser (Location loc, OpBuilder &builder, std::string sql, int i) : loc(loc), builder(builder),
82
82
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
- // }
88
83
}
89
84
90
85
std::string peek () {
@@ -179,60 +174,67 @@ class SQLParser {
179
174
Value table = nullptr ;
180
175
while (true ) {
181
176
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 {
187
196
break ;
197
+ // assert(0 && " additional clauses like limit/etc not yet handled");
188
198
}
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
- // }
207
199
}
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 ());
212
203
} else if (is_number (&peekStr)){
213
204
pop ();
214
205
return ParseValue (builder.create <IntOp>(loc, ExprType::get (builder.getContext ()), builder.getStringAttr (peekStr)).getResult ());
215
206
} else if (mode == ParseMode::Column) {
216
207
// 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
+ }
222
212
pop ();
223
213
return ParseValue (builder.create <ColumnOp>(loc, ExprType::get (builder.getContext ()), builder.getStringAttr (peekStr)).getResult ());
224
214
} else if (mode == ParseMode::Table) {
225
215
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
+ }
228
230
llvm::errs () << " Unknown token to parse: " << peekStr << " \n " ;
229
231
llvm_unreachable (" Unknown token to parse" );
230
232
}
231
233
232
234
};
233
235
234
236
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"
236
238
};
237
239
238
240
0 commit comments