translation_settings.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "translation_settings.h"
  2. #include <yql/essentials/core/issue/yql_issue.h>
  3. #include <yql/essentials/utils/utf8.h>
  4. #include <library/cpp/deprecated/split/split_iterator.h>
  5. #include <util/string/split.h>
  6. #include <util/system/env.h>
  7. namespace {
  8. bool InTestEnvironment() {
  9. return GetEnv("YQL_LOCAL_ENVIRONMENT") || GetEnv("YA_TEST_RUNNER");
  10. }
  11. using namespace NSQLTranslation;
  12. class TAlwaysDiallowPolicy : public ISqlFeaturePolicy {
  13. public:
  14. TAlwaysDiallowPolicy() = default;
  15. bool Allow() const override {
  16. return false;
  17. }
  18. };
  19. class TAlwaysAllowPolicy : public ISqlFeaturePolicy {
  20. public:
  21. TAlwaysAllowPolicy() = default;
  22. bool Allow() const override {
  23. return true;
  24. }
  25. };
  26. }
  27. namespace NSQLTranslation {
  28. ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysDisallow() {
  29. return new TAlwaysDiallowPolicy;
  30. }
  31. ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::MakeAlwaysAllow() {
  32. return new TAlwaysAllowPolicy;
  33. }
  34. ISqlFeaturePolicy::TPtr ISqlFeaturePolicy::Make(bool allow) {
  35. return allow ? MakeAlwaysAllow() : MakeAlwaysDisallow();
  36. }
  37. TTranslationSettings::TTranslationSettings()
  38. : ModuleMapping({{"core", "/lib/yql/core.yqls"}})
  39. , BindingsMode(EBindingsMode::ENABLED)
  40. , Mode(ESqlMode::QUERY)
  41. , MaxErrors(SQL_MAX_PARSER_ERRORS)
  42. , EndOfQueryCommit(true)
  43. , EnableGenericUdfs(true)
  44. , SyntaxVersion(1)
  45. , AnsiLexer(false)
  46. , Antlr4Parser(true)
  47. , PgParser(false)
  48. , InferSyntaxVersion(false)
  49. , V0Behavior(EV0Behavior::Disable)
  50. , V0ForceDisable(InTestEnvironment())
  51. , PGDisable(false)
  52. , WarnOnV0(true)
  53. , TestAntlr4(false)
  54. , V0WarnAsError(ISqlFeaturePolicy::MakeAlwaysDisallow())
  55. , DqDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
  56. , BlockDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
  57. , AssumeYdbOnClusterWithSlash(false)
  58. {}
  59. bool ParseTranslationSettings(const TString& query, TTranslationSettings& settings, NYql::TIssues& issues) {
  60. if (!NYql::IsUtf8(query)) {
  61. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, 0), NYql::TIssuesIds::DEFAULT_ERROR, "Invalid UTF8 input"));
  62. return false;
  63. }
  64. TSplitDelimiters lineDelimiters("\n\r");
  65. TDelimitersSplit linesSplit(query, lineDelimiters);
  66. auto lineIterator = linesSplit.Iterator();
  67. auto lineNumber = 0;
  68. while (!lineIterator.Eof()) {
  69. const TString& line = lineIterator.NextString();
  70. ++lineNumber;
  71. TVector<TStringBuf> parts;
  72. TSetDelimiter<const char> partsDelimiters(" \t");
  73. Split(line, partsDelimiters, parts);
  74. if (parts.empty()) {
  75. continue;
  76. }
  77. if (!parts[0].StartsWith("--!")) {
  78. break;
  79. }
  80. if (parts.size() > 1) {
  81. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  82. "Bad translation settings format"));
  83. return false;
  84. }
  85. auto value = TString(parts[0].SubString(3, TString::npos));
  86. if (value.empty()) {
  87. continue;
  88. }
  89. if ((value == "syntax_v0" || value == "syntax_v1") && !settings.InferSyntaxVersion) {
  90. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  91. "Explicit syntax version is not allowed"));
  92. return false;
  93. }
  94. if (value == "syntax_v0") {
  95. if (settings.V0ForceDisable || settings.V0Behavior == NSQLTranslation::EV0Behavior::Disable) {
  96. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  97. "V0 syntax is disabled"));
  98. return false;
  99. }
  100. settings.SyntaxVersion = 0;
  101. } else if (value == "syntax_v1") {
  102. settings.SyntaxVersion = 1;
  103. } else if (value == "ansi_lexer") {
  104. settings.AnsiLexer = true;
  105. } else if (value == "antlr4_parser") {
  106. settings.Antlr4Parser = true;
  107. } else if (value == "antlr3_parser") {
  108. settings.Antlr4Parser = false;
  109. } else if (value == "syntax_pg") {
  110. settings.PgParser = true;
  111. } else {
  112. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  113. TStringBuilder() << "Unknown SQL translation setting: " << value));
  114. return false;
  115. }
  116. }
  117. return true;
  118. }
  119. } // namespace NSQLTranslation