sql.cpp 12 KB

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