test_sql.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include <yql/essentials/public/purecalc/purecalc.h>
  2. #include "fake_spec.h"
  3. #include <yql/essentials/public/purecalc/ut/protos/test_structs.pb.h>
  4. #include <library/cpp/testing/unittest/registar.h>
  5. Y_UNIT_TEST_SUITE(TestSql) {
  6. using namespace NYql::NPureCalc;
  7. Y_UNIT_TEST(TestSqlCompile) {
  8. auto factory = MakeProgramFactory();
  9. auto sql = TString(R"(
  10. SELECT * FROM Input;
  11. )");
  12. UNIT_ASSERT_NO_EXCEPTION([&](){
  13. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  14. }());
  15. UNIT_ASSERT_NO_EXCEPTION([&](){
  16. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  17. }());
  18. auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  19. auto expectedIssues = TString(R"(<main>: Warning: Type annotation, code: 1030
  20. generated.sql:2:13: Warning: At function: PersistableRepr
  21. generated.sql:2:13: Warning: Persistable required. Atom, key, world, datasink, datasource, callable, resource, stream and lambda are not persistable, code: 1104
  22. )");
  23. UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
  24. }
  25. Y_UNIT_TEST(TestSqlCompileSingleUnnamedInput) {
  26. auto factory = MakeProgramFactory();
  27. auto sql = TString(R"(
  28. SELECT * FROM TABLES()
  29. )");
  30. UNIT_ASSERT_NO_EXCEPTION([&](){
  31. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  32. }());
  33. UNIT_ASSERT_NO_EXCEPTION([&](){
  34. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  35. }());
  36. UNIT_ASSERT_NO_EXCEPTION([&](){
  37. factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  38. }());
  39. }
  40. Y_UNIT_TEST(TestSqlCompileNamedMultiinputs) {
  41. auto factory = MakeProgramFactory();
  42. auto sql = TString(R"(
  43. SELECT * FROM Input0
  44. UNION ALL
  45. SELECT * FROM Input1
  46. )");
  47. UNIT_ASSERT_NO_EXCEPTION([&](){
  48. factory->MakePullListProgram(FakeIS(2), FakeOS(), sql, ETranslationMode::SQL);
  49. }());
  50. }
  51. Y_UNIT_TEST(TestSqlCompileUnnamedMultiinputs) {
  52. auto factory = MakeProgramFactory();
  53. auto sql = TString(R"(
  54. $t0, $t1, $t2 = PROCESS TABLES();
  55. SELECT * FROM $t0
  56. UNION ALL
  57. SELECT * FROM $t1
  58. UNION ALL
  59. SELECT * FROM $t2
  60. )");
  61. UNIT_ASSERT_NO_EXCEPTION([&](){
  62. factory->MakePullListProgram(FakeIS(3), FakeOS(), sql, ETranslationMode::SQL);
  63. }());
  64. }
  65. Y_UNIT_TEST(TestSqlCompileWithWarning) {
  66. auto factory = MakeProgramFactory();
  67. auto sql = TString(R"(
  68. $x = 1;
  69. $y = 2;
  70. SELECT $x as Name FROM Input;
  71. )");
  72. auto expectedIssues = TString(R"(generated.sql:3:13: Warning: Symbol $y is not used, code: 4527
  73. <main>: Warning: Type annotation, code: 1030
  74. generated.sql:4:13: Warning: At function: PersistableRepr
  75. generated.sql:4:13: Warning: Persistable required. Atom, key, world, datasink, datasource, callable, resource, stream and lambda are not persistable, code: 1104
  76. )");
  77. auto program = factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  78. UNIT_ASSERT_VALUES_EQUAL(expectedIssues, program->GetIssues().ToString());
  79. }
  80. Y_UNIT_TEST(TestSqlWrongTableName) {
  81. auto factory = MakeProgramFactory();
  82. auto sql = TString(R"(
  83. SELECT * FROM WrongTable;
  84. )");
  85. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  86. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  87. }(), TCompileError, "Failed to optimize");
  88. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  89. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  90. }(), TCompileError, "Failed to optimize");
  91. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  92. factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  93. }(), TCompileError, "Failed to optimize");
  94. }
  95. Y_UNIT_TEST(TestAllocateLargeStringOnEvaluate) {
  96. auto factory = MakeProgramFactory();
  97. auto sql = TString(R"(
  98. $data = Length(EvaluateExpr("long string" || " very loooong string"));
  99. SELECT $data as Name FROM Input;
  100. )");
  101. UNIT_ASSERT_NO_EXCEPTION([&](){
  102. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  103. }());
  104. UNIT_ASSERT_NO_EXCEPTION([&](){
  105. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  106. }());
  107. UNIT_ASSERT_NO_EXCEPTION([&](){
  108. factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  109. }());
  110. }
  111. Y_UNIT_TEST(TestInvalidSql) {
  112. auto factory = MakeProgramFactory();
  113. auto sql = TString(R"(
  114. Just some invalid SQL;
  115. )");
  116. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  117. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  118. }(), TCompileError, "failed to parse SQL");
  119. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  120. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  121. }(), TCompileError, "failed to parse SQL");
  122. UNIT_ASSERT_EXCEPTION_CONTAINS([&](){
  123. factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  124. }(), TCompileError, "failed to parse SQL");
  125. }
  126. Y_UNIT_TEST(TestUseProcess) {
  127. auto factory = MakeProgramFactory();
  128. auto sql = TString(R"(
  129. $processor = ($row) -> ($row);
  130. PROCESS Input using $processor(TableRow());
  131. )");
  132. UNIT_ASSERT_NO_EXCEPTION([&](){
  133. factory->MakePullStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  134. }());
  135. UNIT_ASSERT_NO_EXCEPTION([&](){
  136. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  137. }());
  138. UNIT_ASSERT_NO_EXCEPTION([&](){
  139. factory->MakePushStreamProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  140. }());
  141. }
  142. Y_UNIT_TEST(TestUseCodegen) {
  143. auto factory = MakeProgramFactory();
  144. auto sql = TString(R"(
  145. $processor = ($row) -> {
  146. $lambda = EvaluateCode(LambdaCode(($row) -> ($row)));
  147. return $lambda($row);
  148. };
  149. PROCESS Input using $processor(TableRow());
  150. )");
  151. UNIT_ASSERT_NO_EXCEPTION([&](){
  152. factory->MakePullListProgram(FakeIS(), FakeOS(), sql, ETranslationMode::SQL);
  153. }());
  154. }
  155. }