sql.cpp 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "sql.h"
  2. #include <yql/essentials/core/issue/yql_issue.h>
  3. #include <google/protobuf/arena.h>
  4. #include <util/string/builder.h>
  5. namespace NSQLTranslation {
  6. NYql::TAstParseResult SqlToYql(const TTranslators& translators, const TString& query, const TTranslationSettings& settings,
  7. NYql::TWarningRules* warningRules, NYql::TStmtParseInfo* stmtParseInfo, TTranslationSettings* effectiveSettings)
  8. {
  9. NYql::TAstParseResult result;
  10. TTranslationSettings parsedSettings(settings);
  11. if (!ParseTranslationSettings(query, parsedSettings, result.Issues)) {
  12. return result;
  13. }
  14. if (effectiveSettings) {
  15. *effectiveSettings = parsedSettings;
  16. }
  17. google::protobuf::Arena arena;
  18. if (!parsedSettings.Arena) {
  19. parsedSettings.Arena = &arena;
  20. }
  21. if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
  22. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  23. "Externally declared named expressions not supported in V0 syntax"));
  24. return result;
  25. }
  26. if (parsedSettings.PgParser && parsedSettings.PGDisable) {
  27. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  28. "PG syntax is disabled"));
  29. return result;
  30. }
  31. if (parsedSettings.PgParser) {
  32. return translators.PG->TextToAst(query, parsedSettings, warningRules, stmtParseInfo);
  33. }
  34. switch (parsedSettings.SyntaxVersion) {
  35. case 0:
  36. if (settings.V0ForceDisable || parsedSettings.V0Behavior == EV0Behavior::Disable) {
  37. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  38. "V0 syntax is disabled"));
  39. return result;
  40. }
  41. if (parsedSettings.AnsiLexer) {
  42. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  43. "Ansi lexer is not supported in V0 syntax"));
  44. return result;
  45. }
  46. return translators.V0->TextToAst(query, parsedSettings, warningRules, nullptr);
  47. case 1:
  48. return translators.V1->TextToAst(query, parsedSettings, warningRules, nullptr);
  49. default:
  50. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  51. TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
  52. return result;
  53. }
  54. }
  55. google::protobuf::Message* SqlAST(const TTranslators& translators, const TString& query, const TString& queryName, NYql::TIssues& issues,
  56. size_t maxErrors, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
  57. {
  58. TTranslationSettings parsedSettings(settings);
  59. if (!ParseTranslationSettings(query, parsedSettings, issues)) {
  60. return nullptr;
  61. }
  62. if (actualSyntaxVersion) {
  63. *actualSyntaxVersion = parsedSettings.SyntaxVersion;
  64. }
  65. switch (parsedSettings.SyntaxVersion) {
  66. case 0:
  67. if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
  68. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  69. "V0 syntax is disabled"));
  70. return nullptr;
  71. }
  72. if (parsedSettings.AnsiLexer) {
  73. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  74. "Ansi lexer is not supported in V0 syntax"));
  75. return nullptr;
  76. }
  77. return translators.V0->TextToMessage(query, queryName, issues, maxErrors, settings);
  78. case 1:
  79. return translators.V1->TextToMessage(query, queryName, issues, maxErrors, parsedSettings);
  80. default:
  81. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  82. TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
  83. return nullptr;
  84. }
  85. }
  86. ILexer::TPtr SqlLexer(const TTranslators& translators, const TString& query, NYql::TIssues& issues, const TTranslationSettings& settings, ui16* actualSyntaxVersion)
  87. {
  88. TTranslationSettings parsedSettings(settings);
  89. if (!ParseTranslationSettings(query, parsedSettings, issues)) {
  90. return {};
  91. }
  92. if (actualSyntaxVersion) {
  93. *actualSyntaxVersion = parsedSettings.SyntaxVersion;
  94. }
  95. switch (parsedSettings.SyntaxVersion) {
  96. case 0:
  97. if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
  98. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  99. "V0 syntax is disabled"));
  100. return {};
  101. }
  102. if (parsedSettings.AnsiLexer) {
  103. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  104. "Ansi lexer is not supported in V0 syntax"));
  105. return {};
  106. }
  107. return translators.V0->MakeLexer(parsedSettings);
  108. case 1:
  109. return translators.V1->MakeLexer(parsedSettings);
  110. default:
  111. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  112. TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
  113. return {};
  114. }
  115. }
  116. NYql::TAstParseResult SqlASTToYql(const TTranslators& translators, const TString& query,
  117. const google::protobuf::Message& protoAst, const TSQLHints& hints, const TTranslationSettings& settings) {
  118. NYql::TAstParseResult result;
  119. switch (settings.SyntaxVersion) {
  120. case 0:
  121. if (settings.V0ForceDisable || settings.V0Behavior == EV0Behavior::Disable) {
  122. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  123. "V0 syntax is disabled"));
  124. return result;
  125. }
  126. if (settings.AnsiLexer) {
  127. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  128. "Ansi lexer is not supported in V0 syntax"));
  129. return result;
  130. }
  131. return translators.V0->TextAndMessageToAst(query, protoAst, hints, settings);
  132. case 1:
  133. return translators.V1->TextAndMessageToAst(query, protoAst, hints, settings);
  134. default:
  135. result.Issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  136. TStringBuilder() << "Unknown SQL syntax version: " << settings.SyntaxVersion));
  137. return result;
  138. }
  139. }
  140. TVector<NYql::TAstParseResult> SqlToAstStatements(const TTranslators& translators, const TString& query,
  141. const TTranslationSettings& settings, NYql::TWarningRules* warningRules, ui16* actualSyntaxVersion,
  142. TVector<NYql::TStmtParseInfo>* stmtParseInfo)
  143. {
  144. TVector<NYql::TAstParseResult> result;
  145. NYql::TIssues issues;
  146. TTranslationSettings parsedSettings(settings);
  147. google::protobuf::Arena arena;
  148. if (!parsedSettings.Arena) {
  149. parsedSettings.Arena = &arena;
  150. }
  151. if (!ParseTranslationSettings(query, parsedSettings, issues)) {
  152. return {};
  153. }
  154. if (actualSyntaxVersion) {
  155. *actualSyntaxVersion = parsedSettings.SyntaxVersion;
  156. }
  157. if (!parsedSettings.DeclaredNamedExprs.empty() && !parsedSettings.PgParser && parsedSettings.SyntaxVersion != 1) {
  158. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  159. "Externally declared named expressions not supported in V0 syntax"));
  160. return {};
  161. }
  162. if (parsedSettings.PgParser && parsedSettings.PGDisable) {
  163. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  164. "PG syntax is disabled"));
  165. return result;
  166. }
  167. if (parsedSettings.PgParser) {
  168. return translators.PG->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
  169. }
  170. switch (parsedSettings.SyntaxVersion) {
  171. case 0:
  172. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  173. "V0 syntax is disabled"));
  174. return translators.V0->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
  175. case 1:
  176. return translators.V1->TextToManyAst(query, parsedSettings, warningRules, stmtParseInfo);
  177. default:
  178. issues.AddIssue(NYql::YqlIssue(NYql::TPosition(), NYql::TIssuesIds::DEFAULT_ERROR,
  179. TStringBuilder() << "Unknown SQL syntax version: " << parsedSettings.SyntaxVersion));
  180. return {};
  181. }
  182. }
  183. TTranslators::TTranslators(TTranslatorPtr v0, TTranslatorPtr v1, TTranslatorPtr pg)
  184. : V0(v0 ? v0 : MakeDummyTranslator("v0"))
  185. , V1(v1 ? v1 : MakeDummyTranslator("v1"))
  186. , PG(pg ? pg : MakeDummyTranslator("pg"))
  187. {}
  188. } // namespace NSQLTranslation