parser_ut.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include <yql/essentials/parser/pg_wrapper/interface/raw_parser.h>
  2. #include <util/stream/str.h>
  3. #include <util/system/thread.h>
  4. #include <library/cpp/testing/unittest/registar.h>
  5. using namespace NYql;
  6. class TEvents : public IPGParseEvents {
  7. public:
  8. void OnResult(const List* raw) override {
  9. Result = PrintPGTree(raw);
  10. }
  11. void OnError(const TIssue& issue) override {
  12. Issue = issue;
  13. }
  14. TMaybe<TIssue> Issue;
  15. TMaybe<TString> Result;
  16. };
  17. const TStringBuf ExpectedSelect1 = "({RAWSTMT :stmt {SELECTSTMT :distinctClause <> :intoClause <> :targetList "
  18. "({RESTARGET :name <> :indirection <> :val {A_CONST :val 1 :location 7} :location 7}) :fromClause <> :whereClause "
  19. "<> :groupClause <> :groupDistinct false :havingClause <> :windowClause <> :valuesLists <> :sortClause <>"
  20. " :limitOffset <> :limitCount <> :limitOption 0 :lockingClause <> :withClause <> :op 0 :all false :larg <> :rarg <>}"
  21. " :stmt_location 0 :stmt_len 0})";
  22. const TString Error1 = "ERROR: syntax error at or near \"SELECT1\"\n";
  23. Y_UNIT_TEST_SUITE(ParseTests) {
  24. Y_UNIT_TEST(TestOk) {
  25. TEvents events;
  26. PGParse(TString("SELECT 1"), events);
  27. UNIT_ASSERT(events.Result);
  28. UNIT_ASSERT(!events.Issue);
  29. UNIT_ASSERT_NO_DIFF(*events.Result, ExpectedSelect1);
  30. }
  31. Y_UNIT_TEST(TestFail) {
  32. TEvents events;
  33. PGParse(TString(" \n SELECT1"), events);
  34. UNIT_ASSERT(!events.Result);
  35. UNIT_ASSERT(events.Issue);
  36. auto msg = events.Issue->GetMessage();
  37. UNIT_ASSERT_NO_DIFF(msg, Error1);
  38. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Row, 2);
  39. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Column, 3);
  40. }
  41. Y_UNIT_TEST(TestErrorPosUtf8) {
  42. {
  43. TEvents events;
  44. PGParse(TString("/* привет */SELECT1"), events);
  45. UNIT_ASSERT(!events.Result);
  46. UNIT_ASSERT(events.Issue);
  47. auto msg = events.Issue->GetMessage();
  48. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Row, 1);
  49. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Column, 13);
  50. }
  51. {
  52. TEvents events;
  53. PGParse(TString("/* привет */\n\nSELECT1"), events);
  54. UNIT_ASSERT(!events.Result);
  55. UNIT_ASSERT(events.Issue);
  56. auto msg = events.Issue->GetMessage();
  57. UNIT_ASSERT_NO_DIFF(msg, Error1);
  58. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Row, 3);
  59. UNIT_ASSERT_VALUES_EQUAL(events.Issue->Position.Column, 1);
  60. }
  61. }
  62. }
  63. const ui32 threadsCount = 10;
  64. Y_UNIT_TEST_SUITE(MTParseTests) {
  65. Y_UNIT_TEST(TestOk) {
  66. TVector<THolder<TThread>> threads;
  67. for (ui32 i = 0; i < threadsCount; ++i) {
  68. threads.emplace_back(MakeHolder<TThread>([]() {
  69. ui32 iters = 10000;
  70. #if defined(_san_enabled_)
  71. iters /= 100;
  72. #endif
  73. for (ui32 i = 0; i < iters; ++i) {
  74. TEvents events;
  75. PGParse(TString("SELECT 1"), events);
  76. Y_ENSURE(events.Result);
  77. Y_ENSURE(!events.Issue);
  78. Y_ENSURE(*events.Result == ExpectedSelect1);
  79. }
  80. }));
  81. }
  82. for (ui32 i = 0; i < threadsCount; ++i) {
  83. threads[i]->Start();
  84. }
  85. for (ui32 i = 0; i < threadsCount; ++i) {
  86. threads[i]->Join();
  87. }
  88. }
  89. Y_UNIT_TEST(TestFail) {
  90. TVector<THolder<TThread>> threads;
  91. for (ui32 i = 0; i < threadsCount; ++i) {
  92. threads.emplace_back(MakeHolder<TThread>([]() {
  93. ui32 iters = 10000;
  94. #if defined(_san_enabled_)
  95. iters /= 100;
  96. #endif
  97. for (ui32 i = 0; i < iters; ++i) {
  98. TEvents events;
  99. PGParse(TString(" \n SELECT1"), events);
  100. Y_ENSURE(!events.Result);
  101. Y_ENSURE(events.Issue);
  102. auto msg = events.Issue->GetMessage();
  103. Y_ENSURE(msg == Error1);
  104. Y_ENSURE(events.Issue->Position.Row == 2);
  105. Y_ENSURE(events.Issue->Position.Column == 3);
  106. }
  107. }));
  108. }
  109. for (ui32 i = 0; i < threadsCount; ++i) {
  110. threads[i]->Start();
  111. }
  112. for (ui32 i = 0; i < threadsCount; ++i) {
  113. threads[i]->Join();
  114. }
  115. }
  116. }