parse.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <yql/essentials/sql/v1/sql.h>
  2. #include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
  3. #include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
  4. #include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
  5. #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
  6. #include <yql/essentials/providers/common/provider/yql_provider_names.h>
  7. #include <util/datetime/cputimer.h>
  8. #include <util/string/builder.h>
  9. using namespace NSQLTranslationV1;
  10. enum class EDebugOutput {
  11. None,
  12. ToCerr,
  13. };
  14. TString Err2Str(NYql::TAstParseResult& res, EDebugOutput debug = EDebugOutput::None) {
  15. TStringStream s;
  16. res.Issues.PrintTo(s);
  17. if (debug == EDebugOutput::ToCerr) {
  18. Cerr << s.Str() << Endl;
  19. }
  20. return s.Str();
  21. }
  22. NYql::TAstParseResult SqlToYqlWithMode(const TString& query, NSQLTranslation::ESqlMode mode = NSQLTranslation::ESqlMode::QUERY, size_t maxErrors = 10, const TString& provider = {}, EDebugOutput debug = EDebugOutput::None) {
  23. google::protobuf::Arena arena;
  24. const auto service = provider ? provider : TString(NYql::YtProviderName);
  25. const TString cluster = "plato";
  26. NSQLTranslation::TTranslationSettings settings;
  27. settings.ClusterMapping[cluster] = service;
  28. settings.MaxErrors = maxErrors;
  29. settings.Mode = mode;
  30. settings.Arena = &arena;
  31. NSQLTranslationV1::TLexers lexers;
  32. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  33. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  34. NSQLTranslationV1::TParsers parsers;
  35. parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
  36. parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
  37. auto res = SqlToYql(lexers, parsers, query, settings);
  38. if (debug == EDebugOutput::ToCerr) {
  39. Err2Str(res, debug);
  40. }
  41. return res;
  42. }
  43. NYql::TAstParseResult SqlToYql(const TString& query, size_t maxErrors = 10, const TString& provider = {}, EDebugOutput debug = EDebugOutput::None) {
  44. return SqlToYqlWithMode(query, NSQLTranslation::ESqlMode::QUERY, maxErrors, provider, debug);
  45. }
  46. int main(int, char**) {
  47. TStringBuilder builder;
  48. builder << "USE plato;\n";
  49. for (ui32 i = 0; i < 10; ++i) {
  50. builder << "$query = SELECT ";
  51. for (ui32 j = 0; j < 500; ++j) {
  52. if (j > 0) {
  53. builder << ",";
  54. }
  55. builder << "fld" << j;
  56. };
  57. builder << " FROM " << (i == 0? "Input" : "$query") << ";\n";
  58. }
  59. builder << "SELECT * FROM $query;\n";
  60. TString sql = builder;
  61. //Cerr << sql;
  62. TSimpleTimer timer;
  63. for (ui32 i = 0; i < 100; ++i) {
  64. NYql::TAstParseResult res = SqlToYql(sql);
  65. Y_ENSURE(res.Root);
  66. }
  67. Cerr << "Elapsed: " << timer.Get() << "\n";
  68. return 0;
  69. }