parse.cpp 2.1 KB

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