| 231 | using CommandParserWithNode = std::pair<CommandParserFromConst<std::vector<std::string>>, std::unique_ptr<kqir::Node>>; |
| 232 | |
| 233 | static StatusOr<CommandParserWithNode> ParseSQLQuery(const std::vector<std::string> &args) { |
| 234 | CommandParser parser(args, 1); |
| 235 | |
| 236 | auto sql = GET_OR_RET(parser.TakeStr()); |
| 237 | |
| 238 | kqir::ParamMap param_map; |
| 239 | if (parser.EatEqICase("PARAMS")) { |
| 240 | auto nargs = GET_OR_RET(parser.TakeInt<size_t>()); |
| 241 | if (nargs % 2 != 0) { |
| 242 | return {Status::NotOK, "nargs of PARAMS must be multiple of 2"}; |
| 243 | } |
| 244 | |
| 245 | for (size_t i = 0; i < nargs / 2; ++i) { |
| 246 | auto key = GET_OR_RET(parser.TakeStr()); |
| 247 | auto val = GET_OR_RET(parser.TakeStr()); |
| 248 | |
| 249 | param_map.emplace(key, val); |
| 250 | } |
| 251 | } |
| 252 | |
| 253 | auto ir = GET_OR_RET(kqir::sql::ParseToIR(kqir::peg::string_input(sql, "ft.searchsql"), param_map)); |
| 254 | return std::make_pair(parser, std::move(ir)); |
| 255 | } |
| 256 | |
| 257 | class CommandFTExplainSQL : public Commander { |
| 258 | Status Parse([[maybe_unused]] const std::vector<std::string> &args) override { |
no test coverage detected