sql_formatter.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <yql/essentials/sql/v1/format/sql_format.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 <library/cpp/getopt/last_getopt.h>
  7. #include <google/protobuf/arena.h>
  8. #include <util/stream/file.h>
  9. int RunFormat(int argc, char* argv[]) {
  10. NLastGetopt::TOpts opts = NLastGetopt::TOpts::Default();
  11. TString outFileName;
  12. TString inFileName;
  13. TString queryString;
  14. opts.AddLongOption('o', "output", "save output to file").RequiredArgument("file").StoreResult(&outFileName);
  15. opts.AddLongOption('i', "input", "input file").RequiredArgument("input").StoreResult(&inFileName);
  16. opts.AddLongOption('p', "print-query", "print given query before parsing").NoArgument();
  17. opts.AddLongOption('f', "obfuscate", "obfuscate query").NoArgument();
  18. opts.AddLongOption("ansi-lexer", "use ansi lexer").NoArgument();
  19. opts.AddHelpOption();
  20. NLastGetopt::TOptsParseResult res(&opts, argc, argv);
  21. THolder<TFixedBufferFileOutput> outFile;
  22. if (!outFileName.empty()) {
  23. outFile.Reset(new TFixedBufferFileOutput(outFileName));
  24. }
  25. IOutputStream& out = outFile ? *outFile.Get() : Cout;
  26. THolder<TUnbufferedFileInput> inFile;
  27. if (!inFileName.empty()) {
  28. inFile.Reset(new TUnbufferedFileInput(inFileName));
  29. }
  30. IInputStream& in = inFile ? *inFile.Get() : Cin;
  31. queryString = in.ReadAll();
  32. int errors = 0;
  33. TString queryFile("query");
  34. if (res.Has("print-query")) {
  35. out << queryString << Endl;
  36. }
  37. google::protobuf::Arena arena;
  38. NSQLTranslation::TTranslationSettings settings;
  39. settings.Arena = &arena;
  40. settings.AnsiLexer = res.Has("ansi-lexer");
  41. NSQLTranslationV1::TLexers lexers;
  42. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  43. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  44. NSQLTranslationV1::TParsers parsers;
  45. parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
  46. parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
  47. auto formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
  48. TString frm_query;
  49. TString error;
  50. NYql::TIssues issues;
  51. if (!formatter->Format(queryString, frm_query, issues, res.Has("obfuscate") ?
  52. NSQLFormat::EFormatMode::Obfuscate : NSQLFormat::EFormatMode::Pretty)) {
  53. ++errors;
  54. Cerr << "Error formatting query: " << issues.ToString() << Endl;
  55. } else {
  56. out << frm_query;
  57. }
  58. return errors;
  59. }
  60. int main(int argc, char* argv[]) {
  61. try {
  62. return RunFormat(argc, argv);
  63. } catch (const yexception& e) {
  64. Cerr << "Caught exception:" << e.what() << Endl;
  65. return 1;
  66. } catch (...) {
  67. Cerr << CurrentExceptionMessage() << Endl;
  68. return 1;
  69. }
  70. return 0;
  71. }