translation_settings.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "translation_settings.h"
  2. #include <ydb/library/yql/core/issue/yql_issue.h>
  3. #include <ydb/library/yql/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.yql"}})
  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(false)
  47. , PgParser(false)
  48. , InferSyntaxVersion(false)
  49. , V0Behavior(EV0Behavior::Disable)
  50. , V0ForceDisable(InTestEnvironment())
  51. , PGDisable(false)
  52. , WarnOnV0(true)
  53. , V0WarnAsError(ISqlFeaturePolicy::MakeAlwaysDisallow())
  54. , DqDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
  55. , BlockDefaultAuto(ISqlFeaturePolicy::MakeAlwaysDisallow())
  56. , AssumeYdbOnClusterWithSlash(false)
  57. {}
  58. bool ParseTranslationSettings(const TString& query, TTranslationSettings& settings, NYql::TIssues& issues) {
  59. if (!NYql::IsUtf8(query)) {
  60. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, 0), NYql::TIssuesIds::DEFAULT_ERROR, "Invalid UTF8 input"));
  61. return false;
  62. }
  63. TSplitDelimiters lineDelimiters("\n\r");
  64. TDelimitersSplit linesSplit(query, lineDelimiters);
  65. auto lineIterator = linesSplit.Iterator();
  66. auto lineNumber = 0;
  67. while (!lineIterator.Eof()) {
  68. const TString& line = lineIterator.NextString();
  69. ++lineNumber;
  70. TVector<TStringBuf> parts;
  71. TSetDelimiter<const char> partsDelimiters(" \t");
  72. Split(line, partsDelimiters, parts);
  73. if (parts.empty()) {
  74. continue;
  75. }
  76. if (!parts[0].StartsWith("--!")) {
  77. break;
  78. }
  79. if (parts.size() > 1) {
  80. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  81. "Bad translation settings format"));
  82. return false;
  83. }
  84. auto value = TString(parts[0].SubString(3, TString::npos));
  85. if (value.empty()) {
  86. continue;
  87. }
  88. if ((value == "syntax_v0" || value == "syntax_v1") && !settings.InferSyntaxVersion) {
  89. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  90. "Explicit syntax version is not allowed"));
  91. return false;
  92. }
  93. if (value == "syntax_v0") {
  94. if (settings.V0ForceDisable || settings.V0Behavior == NSQLTranslation::EV0Behavior::Disable) {
  95. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  96. "V0 syntax is disabled"));
  97. return false;
  98. }
  99. settings.SyntaxVersion = 0;
  100. } else if (value == "syntax_v1") {
  101. settings.SyntaxVersion = 1;
  102. } else if (value == "ansi_lexer") {
  103. settings.AnsiLexer = true;
  104. } else if (value == "antlr4_parser") {
  105. settings.Antlr4Parser = true;
  106. } else if (value == "syntax_pg") {
  107. settings.PgParser = true;
  108. } else {
  109. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(0, lineNumber), NYql::TIssuesIds::DEFAULT_ERROR,
  110. TStringBuilder() << "Unknown SQL translation setting: " << value));
  111. return false;
  112. }
  113. }
  114. return true;
  115. }
  116. } // namespace NSQLTranslation