Skip to content

Commit 599ad46

Browse files
committed
test: define PostgreSQL compatibility result mapping
1 parent 6669125 commit 599ad46

4 files changed

Lines changed: 686 additions & 0 deletions

File tree

Lines changed: 337 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,337 @@
1+
#include "tools/pg_compat/result.h"
2+
#include "tools/pg_compat/statement_type_map.h"
3+
4+
#include <cassert>
5+
#include <cstring>
6+
7+
namespace {
8+
9+
using pg_compat::CompatibilityResult;
10+
using pg_compat::MappingKind;
11+
using pg_compat::StatementTypeMapping;
12+
using sql_parser::StmtType;
13+
14+
struct MappingCase {
15+
PgQuery__Node__NodeCase node_case;
16+
MappingKind kind;
17+
StmtType type;
18+
};
19+
20+
struct NameCase {
21+
PgQuery__Node__NodeCase node_case;
22+
const char* name;
23+
};
24+
25+
struct StmtTypeNameCase {
26+
StmtType type;
27+
const char* name;
28+
};
29+
30+
void assert_mapping(
31+
const StatementTypeMapping& mapping,
32+
MappingKind expected_kind,
33+
StmtType expected_type) {
34+
assert(mapping.kind == expected_kind);
35+
assert(mapping.type == expected_type);
36+
}
37+
38+
void test_result_names() {
39+
struct ResultNameCase {
40+
CompatibilityResult result;
41+
const char* name;
42+
};
43+
44+
const ResultNameCase cases[] = {
45+
{CompatibilityResult::DeepSupported, "DEEP_SUPPORTED"},
46+
{CompatibilityResult::ClassifiedOnly, "CLASSIFIED_ONLY"},
47+
{CompatibilityResult::Partial, "PARTIAL"},
48+
{CompatibilityResult::Error, "ERROR"},
49+
{CompatibilityResult::TrailingInput, "TRAILING_INPUT"},
50+
{CompatibilityResult::TypeMismatch, "TYPE_MISMATCH"},
51+
{CompatibilityResult::OracleRejected, "ORACLE_REJECTED"},
52+
};
53+
54+
for (const auto& test_case : cases) {
55+
assert(std::strcmp(pg_compat::result_name(test_case.result), test_case.name) == 0);
56+
}
57+
}
58+
59+
void test_default_and_simple_mappings() {
60+
const StatementTypeMapping default_mapping;
61+
assert_mapping(default_mapping, MappingKind::Unmapped, StmtType::UNKNOWN);
62+
63+
const MappingCase cases[] = {
64+
{PG_QUERY__NODE__NODE_SELECT_STMT, MappingKind::Equivalent, StmtType::SELECT},
65+
{PG_QUERY__NODE__NODE_INSERT_STMT, MappingKind::Equivalent, StmtType::INSERT},
66+
{PG_QUERY__NODE__NODE_UPDATE_STMT, MappingKind::Equivalent, StmtType::UPDATE},
67+
{PG_QUERY__NODE__NODE_DELETE_STMT, MappingKind::Equivalent, StmtType::DELETE_STMT},
68+
{PG_QUERY__NODE__NODE_VARIABLE_SET_STMT, MappingKind::Equivalent, StmtType::SET},
69+
{PG_QUERY__NODE__NODE_VARIABLE_SHOW_STMT, MappingKind::Equivalent, StmtType::SHOW},
70+
{PG_QUERY__NODE__NODE_PREPARE_STMT, MappingKind::Equivalent, StmtType::PREPARE},
71+
{PG_QUERY__NODE__NODE_EXECUTE_STMT, MappingKind::Equivalent, StmtType::EXECUTE},
72+
{PG_QUERY__NODE__NODE_DEALLOCATE_STMT, MappingKind::Equivalent, StmtType::DEALLOCATE},
73+
{PG_QUERY__NODE__NODE_EXPLAIN_STMT, MappingKind::Equivalent, StmtType::EXPLAIN},
74+
{PG_QUERY__NODE__NODE_CALL_STMT, MappingKind::Equivalent, StmtType::CALL},
75+
{PG_QUERY__NODE__NODE_DO_STMT, MappingKind::Equivalent, StmtType::DO_STMT},
76+
{PG_QUERY__NODE__NODE_TRUNCATE_STMT, MappingKind::Equivalent, StmtType::TRUNCATE},
77+
{PG_QUERY__NODE__NODE_LOCK_STMT, MappingKind::Equivalent, StmtType::LOCK},
78+
{PG_QUERY__NODE__NODE_CREATE_STMT, MappingKind::Equivalent, StmtType::CREATE},
79+
{PG_QUERY__NODE__NODE_CREATE_SCHEMA_STMT, MappingKind::Equivalent, StmtType::CREATE},
80+
{PG_QUERY__NODE__NODE_CREATE_TABLE_AS_STMT, MappingKind::Equivalent, StmtType::CREATE},
81+
{PG_QUERY__NODE__NODE_INDEX_STMT, MappingKind::Equivalent, StmtType::CREATE},
82+
{PG_QUERY__NODE__NODE_CREATE_FUNCTION_STMT, MappingKind::Equivalent, StmtType::CREATE},
83+
{PG_QUERY__NODE__NODE_CREATE_ROLE_STMT, MappingKind::Equivalent, StmtType::CREATE},
84+
{PG_QUERY__NODE__NODE_CREATE_SEQ_STMT, MappingKind::Equivalent, StmtType::CREATE},
85+
{PG_QUERY__NODE__NODE_CREATE_DOMAIN_STMT, MappingKind::Equivalent, StmtType::CREATE},
86+
{PG_QUERY__NODE__NODE_CREATE_ENUM_STMT, MappingKind::Equivalent, StmtType::CREATE},
87+
{PG_QUERY__NODE__NODE_CREATE_RANGE_STMT, MappingKind::Equivalent, StmtType::CREATE},
88+
{PG_QUERY__NODE__NODE_CREATEDB_STMT, MappingKind::Equivalent, StmtType::CREATE},
89+
{PG_QUERY__NODE__NODE_ALTER_TABLE_STMT, MappingKind::Equivalent, StmtType::ALTER},
90+
{PG_QUERY__NODE__NODE_ALTER_FUNCTION_STMT, MappingKind::Equivalent, StmtType::ALTER},
91+
{PG_QUERY__NODE__NODE_ALTER_ROLE_STMT, MappingKind::Equivalent, StmtType::ALTER},
92+
{PG_QUERY__NODE__NODE_ALTER_SEQ_STMT, MappingKind::Equivalent, StmtType::ALTER},
93+
{PG_QUERY__NODE__NODE_ALTER_DOMAIN_STMT, MappingKind::Equivalent, StmtType::ALTER},
94+
{PG_QUERY__NODE__NODE_ALTER_ENUM_STMT, MappingKind::Equivalent, StmtType::ALTER},
95+
{PG_QUERY__NODE__NODE_ALTER_DATABASE_STMT, MappingKind::Equivalent, StmtType::ALTER},
96+
{PG_QUERY__NODE__NODE_RENAME_STMT, MappingKind::Equivalent, StmtType::ALTER},
97+
{PG_QUERY__NODE__NODE_DROP_STMT, MappingKind::Equivalent, StmtType::DROP},
98+
{PG_QUERY__NODE__NODE_DROPDB_STMT, MappingKind::Equivalent, StmtType::DROP},
99+
{PG_QUERY__NODE__NODE_DROP_ROLE_STMT, MappingKind::Equivalent, StmtType::DROP},
100+
{PG_QUERY__NODE__NODE_DROP_TABLE_SPACE_STMT, MappingKind::Equivalent, StmtType::DROP},
101+
{PG_QUERY__NODE__NODE_COPY_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
102+
{PG_QUERY__NODE__NODE_MERGE_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
103+
{PG_QUERY__NODE__NODE_VACUUM_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
104+
{PG_QUERY__NODE__NODE_NOTIFY_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
105+
{PG_QUERY__NODE__NODE_LISTEN_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
106+
{PG_QUERY__NODE__NODE_UNLISTEN_STMT, MappingKind::NoEquivalent, StmtType::UNKNOWN},
107+
};
108+
109+
for (const auto& test_case : cases) {
110+
PgQuery__Node node{};
111+
node.node_case = test_case.node_case;
112+
assert_mapping(
113+
pg_compat::expected_stmt_type(node),
114+
test_case.kind,
115+
test_case.type);
116+
}
117+
118+
PgQuery__Node unknown{};
119+
unknown.node_case = PG_QUERY__NODE__NODE__NOT_SET;
120+
assert_mapping(
121+
pg_compat::expected_stmt_type(unknown),
122+
MappingKind::Unmapped,
123+
StmtType::UNKNOWN);
124+
}
125+
126+
void test_transaction_mappings() {
127+
struct TransactionCase {
128+
PgQuery__TransactionStmtKind kind;
129+
StmtType type;
130+
};
131+
132+
const TransactionCase cases[] = {
133+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_BEGIN, StmtType::BEGIN},
134+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_START, StmtType::START_TRANSACTION},
135+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_COMMIT, StmtType::COMMIT},
136+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_COMMIT_PREPARED, StmtType::COMMIT},
137+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_ROLLBACK, StmtType::ROLLBACK},
138+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_ROLLBACK_TO, StmtType::ROLLBACK},
139+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_ROLLBACK_PREPARED, StmtType::ROLLBACK},
140+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_SAVEPOINT, StmtType::SAVEPOINT},
141+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_RELEASE, StmtType::SAVEPOINT},
142+
{PG_QUERY__TRANSACTION_STMT_KIND__TRANS_STMT_PREPARE, StmtType::PREPARE},
143+
};
144+
145+
PgQuery__Node node{};
146+
node.node_case = PG_QUERY__NODE__NODE_TRANSACTION_STMT;
147+
148+
PgQuery__TransactionStmt transaction{};
149+
node.transaction_stmt = &transaction;
150+
for (const auto& test_case : cases) {
151+
transaction.kind = test_case.kind;
152+
assert_mapping(
153+
pg_compat::expected_stmt_type(node),
154+
MappingKind::Equivalent,
155+
test_case.type);
156+
}
157+
158+
transaction.kind =
159+
PG_QUERY__TRANSACTION_STMT_KIND__TRANSACTION_STMT_KIND_UNDEFINED;
160+
assert_mapping(
161+
pg_compat::expected_stmt_type(node),
162+
MappingKind::Unmapped,
163+
StmtType::UNKNOWN);
164+
165+
transaction.kind = static_cast<PgQuery__TransactionStmtKind>(999);
166+
assert_mapping(
167+
pg_compat::expected_stmt_type(node),
168+
MappingKind::Unmapped,
169+
StmtType::UNKNOWN);
170+
171+
node.transaction_stmt = nullptr;
172+
assert_mapping(
173+
pg_compat::expected_stmt_type(node),
174+
MappingKind::Unmapped,
175+
StmtType::UNKNOWN);
176+
}
177+
178+
void test_grant_and_revoke_mappings() {
179+
PgQuery__Node grant_node{};
180+
grant_node.node_case = PG_QUERY__NODE__NODE_GRANT_STMT;
181+
assert_mapping(
182+
pg_compat::expected_stmt_type(grant_node),
183+
MappingKind::Unmapped,
184+
StmtType::UNKNOWN);
185+
186+
PgQuery__GrantStmt grant{};
187+
grant_node.grant_stmt = &grant;
188+
grant.is_grant = 1;
189+
assert_mapping(
190+
pg_compat::expected_stmt_type(grant_node),
191+
MappingKind::Equivalent,
192+
StmtType::GRANT);
193+
grant.is_grant = 0;
194+
assert_mapping(
195+
pg_compat::expected_stmt_type(grant_node),
196+
MappingKind::Equivalent,
197+
StmtType::REVOKE);
198+
199+
PgQuery__Node grant_role_node{};
200+
grant_role_node.node_case = PG_QUERY__NODE__NODE_GRANT_ROLE_STMT;
201+
assert_mapping(
202+
pg_compat::expected_stmt_type(grant_role_node),
203+
MappingKind::Unmapped,
204+
StmtType::UNKNOWN);
205+
206+
PgQuery__GrantRoleStmt grant_role{};
207+
grant_role_node.grant_role_stmt = &grant_role;
208+
grant_role.is_grant = 1;
209+
assert_mapping(
210+
pg_compat::expected_stmt_type(grant_role_node),
211+
MappingKind::Equivalent,
212+
StmtType::GRANT);
213+
grant_role.is_grant = 0;
214+
assert_mapping(
215+
pg_compat::expected_stmt_type(grant_role_node),
216+
MappingKind::Equivalent,
217+
StmtType::REVOKE);
218+
}
219+
220+
void test_oracle_node_names() {
221+
const NameCase cases[] = {
222+
{PG_QUERY__NODE__NODE_SELECT_STMT, "PG_QUERY__NODE__NODE_SELECT_STMT"},
223+
{PG_QUERY__NODE__NODE_INSERT_STMT, "PG_QUERY__NODE__NODE_INSERT_STMT"},
224+
{PG_QUERY__NODE__NODE_UPDATE_STMT, "PG_QUERY__NODE__NODE_UPDATE_STMT"},
225+
{PG_QUERY__NODE__NODE_DELETE_STMT, "PG_QUERY__NODE__NODE_DELETE_STMT"},
226+
{PG_QUERY__NODE__NODE_VARIABLE_SET_STMT, "PG_QUERY__NODE__NODE_VARIABLE_SET_STMT"},
227+
{PG_QUERY__NODE__NODE_VARIABLE_SHOW_STMT, "PG_QUERY__NODE__NODE_VARIABLE_SHOW_STMT"},
228+
{PG_QUERY__NODE__NODE_PREPARE_STMT, "PG_QUERY__NODE__NODE_PREPARE_STMT"},
229+
{PG_QUERY__NODE__NODE_EXECUTE_STMT, "PG_QUERY__NODE__NODE_EXECUTE_STMT"},
230+
{PG_QUERY__NODE__NODE_DEALLOCATE_STMT, "PG_QUERY__NODE__NODE_DEALLOCATE_STMT"},
231+
{PG_QUERY__NODE__NODE_EXPLAIN_STMT, "PG_QUERY__NODE__NODE_EXPLAIN_STMT"},
232+
{PG_QUERY__NODE__NODE_CALL_STMT, "PG_QUERY__NODE__NODE_CALL_STMT"},
233+
{PG_QUERY__NODE__NODE_DO_STMT, "PG_QUERY__NODE__NODE_DO_STMT"},
234+
{PG_QUERY__NODE__NODE_TRUNCATE_STMT, "PG_QUERY__NODE__NODE_TRUNCATE_STMT"},
235+
{PG_QUERY__NODE__NODE_LOCK_STMT, "PG_QUERY__NODE__NODE_LOCK_STMT"},
236+
{PG_QUERY__NODE__NODE_TRANSACTION_STMT, "PG_QUERY__NODE__NODE_TRANSACTION_STMT"},
237+
{PG_QUERY__NODE__NODE_CREATE_STMT, "PG_QUERY__NODE__NODE_CREATE_STMT"},
238+
{PG_QUERY__NODE__NODE_CREATE_SCHEMA_STMT, "PG_QUERY__NODE__NODE_CREATE_SCHEMA_STMT"},
239+
{PG_QUERY__NODE__NODE_CREATE_TABLE_AS_STMT, "PG_QUERY__NODE__NODE_CREATE_TABLE_AS_STMT"},
240+
{PG_QUERY__NODE__NODE_INDEX_STMT, "PG_QUERY__NODE__NODE_INDEX_STMT"},
241+
{PG_QUERY__NODE__NODE_CREATE_FUNCTION_STMT, "PG_QUERY__NODE__NODE_CREATE_FUNCTION_STMT"},
242+
{PG_QUERY__NODE__NODE_CREATE_ROLE_STMT, "PG_QUERY__NODE__NODE_CREATE_ROLE_STMT"},
243+
{PG_QUERY__NODE__NODE_CREATE_SEQ_STMT, "PG_QUERY__NODE__NODE_CREATE_SEQ_STMT"},
244+
{PG_QUERY__NODE__NODE_CREATE_DOMAIN_STMT, "PG_QUERY__NODE__NODE_CREATE_DOMAIN_STMT"},
245+
{PG_QUERY__NODE__NODE_CREATE_ENUM_STMT, "PG_QUERY__NODE__NODE_CREATE_ENUM_STMT"},
246+
{PG_QUERY__NODE__NODE_CREATE_RANGE_STMT, "PG_QUERY__NODE__NODE_CREATE_RANGE_STMT"},
247+
{PG_QUERY__NODE__NODE_CREATEDB_STMT, "PG_QUERY__NODE__NODE_CREATEDB_STMT"},
248+
{PG_QUERY__NODE__NODE_ALTER_TABLE_STMT, "PG_QUERY__NODE__NODE_ALTER_TABLE_STMT"},
249+
{PG_QUERY__NODE__NODE_ALTER_FUNCTION_STMT, "PG_QUERY__NODE__NODE_ALTER_FUNCTION_STMT"},
250+
{PG_QUERY__NODE__NODE_ALTER_ROLE_STMT, "PG_QUERY__NODE__NODE_ALTER_ROLE_STMT"},
251+
{PG_QUERY__NODE__NODE_ALTER_SEQ_STMT, "PG_QUERY__NODE__NODE_ALTER_SEQ_STMT"},
252+
{PG_QUERY__NODE__NODE_ALTER_DOMAIN_STMT, "PG_QUERY__NODE__NODE_ALTER_DOMAIN_STMT"},
253+
{PG_QUERY__NODE__NODE_ALTER_ENUM_STMT, "PG_QUERY__NODE__NODE_ALTER_ENUM_STMT"},
254+
{PG_QUERY__NODE__NODE_ALTER_DATABASE_STMT, "PG_QUERY__NODE__NODE_ALTER_DATABASE_STMT"},
255+
{PG_QUERY__NODE__NODE_RENAME_STMT, "PG_QUERY__NODE__NODE_RENAME_STMT"},
256+
{PG_QUERY__NODE__NODE_DROP_STMT, "PG_QUERY__NODE__NODE_DROP_STMT"},
257+
{PG_QUERY__NODE__NODE_DROPDB_STMT, "PG_QUERY__NODE__NODE_DROPDB_STMT"},
258+
{PG_QUERY__NODE__NODE_DROP_ROLE_STMT, "PG_QUERY__NODE__NODE_DROP_ROLE_STMT"},
259+
{PG_QUERY__NODE__NODE_DROP_TABLE_SPACE_STMT, "PG_QUERY__NODE__NODE_DROP_TABLE_SPACE_STMT"},
260+
{PG_QUERY__NODE__NODE_COPY_STMT, "PG_QUERY__NODE__NODE_COPY_STMT"},
261+
{PG_QUERY__NODE__NODE_MERGE_STMT, "PG_QUERY__NODE__NODE_MERGE_STMT"},
262+
{PG_QUERY__NODE__NODE_VACUUM_STMT, "PG_QUERY__NODE__NODE_VACUUM_STMT"},
263+
{PG_QUERY__NODE__NODE_NOTIFY_STMT, "PG_QUERY__NODE__NODE_NOTIFY_STMT"},
264+
{PG_QUERY__NODE__NODE_LISTEN_STMT, "PG_QUERY__NODE__NODE_LISTEN_STMT"},
265+
{PG_QUERY__NODE__NODE_UNLISTEN_STMT, "PG_QUERY__NODE__NODE_UNLISTEN_STMT"},
266+
{PG_QUERY__NODE__NODE_GRANT_STMT, "PG_QUERY__NODE__NODE_GRANT_STMT"},
267+
{PG_QUERY__NODE__NODE_GRANT_ROLE_STMT, "PG_QUERY__NODE__NODE_GRANT_ROLE_STMT"},
268+
};
269+
270+
for (const auto& test_case : cases) {
271+
const char* actual = pg_compat::oracle_node_name(test_case.node_case);
272+
assert(std::strcmp(actual, "UNMAPPED_NODE_CASE") != 0);
273+
assert(std::strcmp(actual, test_case.name) == 0);
274+
}
275+
276+
assert(std::strcmp(
277+
pg_compat::oracle_node_name(PG_QUERY__NODE__NODE__NOT_SET),
278+
"UNMAPPED_NODE_CASE") == 0);
279+
}
280+
281+
void test_stmt_type_names() {
282+
const StmtTypeNameCase cases[] = {
283+
{StmtType::UNKNOWN, "UNKNOWN"},
284+
{StmtType::SELECT, "SELECT"},
285+
{StmtType::INSERT, "INSERT"},
286+
{StmtType::UPDATE, "UPDATE"},
287+
{StmtType::DELETE_STMT, "DELETE"},
288+
{StmtType::REPLACE, "REPLACE"},
289+
{StmtType::SET, "SET"},
290+
{StmtType::USE, "USE"},
291+
{StmtType::SHOW, "SHOW"},
292+
{StmtType::BEGIN, "BEGIN"},
293+
{StmtType::START_TRANSACTION, "START_TRANSACTION"},
294+
{StmtType::COMMIT, "COMMIT"},
295+
{StmtType::ROLLBACK, "ROLLBACK"},
296+
{StmtType::SAVEPOINT, "SAVEPOINT"},
297+
{StmtType::PREPARE, "PREPARE"},
298+
{StmtType::EXECUTE, "EXECUTE"},
299+
{StmtType::DEALLOCATE, "DEALLOCATE"},
300+
{StmtType::CREATE, "CREATE"},
301+
{StmtType::ALTER, "ALTER"},
302+
{StmtType::DROP, "DROP"},
303+
{StmtType::TRUNCATE, "TRUNCATE"},
304+
{StmtType::GRANT, "GRANT"},
305+
{StmtType::REVOKE, "REVOKE"},
306+
{StmtType::LOCK, "LOCK"},
307+
{StmtType::UNLOCK, "UNLOCK"},
308+
{StmtType::LOAD_DATA, "LOAD_DATA"},
309+
{StmtType::RESET, "RESET"},
310+
{StmtType::EXPLAIN, "EXPLAIN"},
311+
{StmtType::DESCRIBE, "DESCRIBE"},
312+
{StmtType::CALL, "CALL"},
313+
{StmtType::DO_STMT, "DO"},
314+
};
315+
316+
for (const auto& test_case : cases) {
317+
assert(std::strcmp(
318+
pg_compat::stmt_type_name(test_case.type),
319+
test_case.name) == 0);
320+
}
321+
322+
assert(std::strcmp(
323+
pg_compat::stmt_type_name(static_cast<StmtType>(255)),
324+
"OTHER") == 0);
325+
}
326+
327+
} // namespace
328+
329+
int main() {
330+
test_result_names();
331+
test_default_and_simple_mappings();
332+
test_transaction_mappings();
333+
test_grant_and_revoke_mappings();
334+
test_oracle_node_names();
335+
test_stmt_type_names();
336+
return 0;
337+
}

tools/pg_compat/result.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef TOOLS_PG_COMPAT_RESULT_H
2+
#define TOOLS_PG_COMPAT_RESULT_H
3+
4+
namespace pg_compat {
5+
6+
enum class CompatibilityResult {
7+
DeepSupported,
8+
ClassifiedOnly,
9+
Partial,
10+
Error,
11+
TrailingInput,
12+
TypeMismatch,
13+
OracleRejected,
14+
};
15+
16+
inline const char* result_name(CompatibilityResult result) {
17+
switch (result) {
18+
case CompatibilityResult::DeepSupported:
19+
return "DEEP_SUPPORTED";
20+
case CompatibilityResult::ClassifiedOnly:
21+
return "CLASSIFIED_ONLY";
22+
case CompatibilityResult::Partial:
23+
return "PARTIAL";
24+
case CompatibilityResult::Error:
25+
return "ERROR";
26+
case CompatibilityResult::TrailingInput:
27+
return "TRAILING_INPUT";
28+
case CompatibilityResult::TypeMismatch:
29+
return "TYPE_MISMATCH";
30+
case CompatibilityResult::OracleRejected:
31+
return "ORACLE_REJECTED";
32+
}
33+
return "UNKNOWN";
34+
}
35+
36+
} // namespace pg_compat
37+
38+
#endif // TOOLS_PG_COMPAT_RESULT_H

0 commit comments

Comments
 (0)