From acca9da96fdc7f9d128d558cb778daddc610be1b Mon Sep 17 00:00:00 2001 From: Sven Klemm <31455525+svenklemm@users.noreply.github.com> Date: Fri, 29 Apr 2022 21:25:43 +0200 Subject: [PATCH] Add support for PLPGSQL Assert (#135) Add support for PLPGSQL Assert so any PLPGSQL code using Assert can be parsed successfully. --- src/pg_query_json_plpgsql.c | 14 ++++++++++++++ test/plpgsql_samples.expected.json | 3 ++- test/plpgsql_samples.sql | 12 ++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/pg_query_json_plpgsql.c b/src/pg_query_json_plpgsql.c index 13bb78d7..8c122497 100644 --- a/src/pg_query_json_plpgsql.c +++ b/src/pg_query_json_plpgsql.c @@ -117,6 +117,7 @@ static void dump_return_next(StringInfo out, PLpgSQL_stmt_return_next *stmt); static void dump_return_query(StringInfo out, PLpgSQL_stmt_return_query *stmt); static void dump_raise(StringInfo out, PLpgSQL_stmt_raise *stmt); static void dump_raise_option(StringInfo out, PLpgSQL_raise_option *node); +static void dump_assert(StringInfo out, PLpgSQL_stmt_assert *stmt); static void dump_execsql(StringInfo out, PLpgSQL_stmt_execsql *stmt); static void dump_dynexecute(StringInfo out, PLpgSQL_stmt_dynexecute *stmt); static void dump_dynfors(StringInfo out, PLpgSQL_stmt_dynfors *stmt); @@ -187,6 +188,9 @@ dump_stmt(StringInfo out, PLpgSQL_stmt *node) case PLPGSQL_STMT_RAISE: dump_raise(out, (PLpgSQL_stmt_raise *) node); break; + case PLPGSQL_STMT_ASSERT: + dump_assert(out, (PLpgSQL_stmt_assert *) node); + break; case PLPGSQL_STMT_EXECSQL: dump_execsql(out, (PLpgSQL_stmt_execsql *) node); break; @@ -562,6 +566,16 @@ dump_raise_option(StringInfo out, PLpgSQL_raise_option *node) WRITE_EXPR_FIELD(expr); } +static void +dump_assert(StringInfo out, PLpgSQL_stmt_assert *node) +{ + WRITE_NODE_TYPE("PLpgSQL_stmt_assert"); + + WRITE_INT_FIELD(lineno, lineno, lineno); + WRITE_EXPR_FIELD(cond); + WRITE_EXPR_FIELD(message); +} + static void dump_execsql(StringInfo out, PLpgSQL_stmt_execsql *node) { diff --git a/test/plpgsql_samples.expected.json b/test/plpgsql_samples.expected.json index 31ee369d..79f9edf6 100644 --- a/test/plpgsql_samples.expected.json +++ b/test/plpgsql_samples.expected.json @@ -17,5 +17,6 @@ {"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"p_time_start","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"p_time_end","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"p_time_interval","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"ts","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"arbitrary_return","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}}],"action":{"PLpgSQL_stmt_block":{"lineno":2,"body":[{"PLpgSQL_stmt_if":{"lineno":6,"cond":{"PLpgSQL_expr":{"query":"SELECT p_time_interval IS NULL"}},"then_body":[{"PLpgSQL_stmt_assign":{"lineno":7,"varno":2,"expr":{"PLpgSQL_expr":{"query":"SELECT interval_from_start_end(p_time_start, p_time_end)"}}}}]}},{"PLpgSQL_stmt_return_query":{"lineno":9,"query":{"PLpgSQL_expr":{"query":"SELECT\n bucket_function(p_time_interval, timestamp) AS ts,\n arbitrary_return\n FROM test.some_table\n WHERE\n start \u003e= p_time_start\n AND \"end\" \u003c p_time_end\n GROUP BY 1"}}}},{"PLpgSQL_stmt_return":{}}]}}}}, {"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"_result","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"active_on_to_date","lineno":3,"datatype":{"PLpgSQL_type":{"typname":"uuid[]"}}}}],"action":{"PLpgSQL_stmt_block":{"lineno":4,"body":[{"PLpgSQL_stmt_assign":{"lineno":5,"expr":{"PLpgSQL_expr":{"query":"SELECT ARRAY( SELECT some_id FROM some_table)"}}}},{"PLpgSQL_stmt_return":{}}]}}}}, {"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"v_name","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"v_version","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"_a","lineno":3,"datatype":{"PLpgSQL_type":{"typname":"int"}}}}],"action":{"PLpgSQL_stmt_block":{"lineno":5,"body":[{"PLpgSQL_stmt_if":{"lineno":6,"cond":{"PLpgSQL_expr":{"query":"SELECT v_version IS NULL"}},"then_body":[{"PLpgSQL_stmt_return":{"lineno":7,"expr":{"PLpgSQL_expr":{"query":"SELECT v_name"}}}}]}},{"PLpgSQL_stmt_return":{"lineno":10,"expr":{"PLpgSQL_expr":{"query":"SELECT v_name || '/' || v_version"}}}}]}}}}, -{"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"str","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_rec":{"refname":"v3","dno":2,"lineno":3}},{"PLpgSQL_var":{"refname":"v4","lineno":4,"datatype":{"PLpgSQL_type":{"typname":"integer"}}}},{"PLpgSQL_recfield":{"fieldname":"c1","recparentno":2}}],"action":{"PLpgSQL_stmt_block":{"lineno":5,"body":[{"PLpgSQL_stmt_execsql":{"lineno":6,"sqlstmt":{"PLpgSQL_expr":{"query":"select 1 as c1, 2 as c2"}},"into":true,"target":{"PLpgSQL_rec":{"refname":"v3","dno":2,"lineno":3}}}},{"PLpgSQL_stmt_assign":{"lineno":7,"varno":4,"expr":{"PLpgSQL_expr":{"query":"SELECT 4"}}}},{"PLpgSQL_stmt_return":{}}]}}}} +{"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"str","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}},{"PLpgSQL_rec":{"refname":"v3","dno":2,"lineno":3}},{"PLpgSQL_var":{"refname":"v4","lineno":4,"datatype":{"PLpgSQL_type":{"typname":"integer"}}}},{"PLpgSQL_recfield":{"fieldname":"c1","recparentno":2}}],"action":{"PLpgSQL_stmt_block":{"lineno":5,"body":[{"PLpgSQL_stmt_execsql":{"lineno":6,"sqlstmt":{"PLpgSQL_expr":{"query":"select 1 as c1, 2 as c2"}},"into":true,"target":{"PLpgSQL_rec":{"refname":"v3","dno":2,"lineno":3}}}},{"PLpgSQL_stmt_assign":{"lineno":7,"varno":4,"expr":{"PLpgSQL_expr":{"query":"SELECT 4"}}}},{"PLpgSQL_stmt_return":{}}]}}}}, +{"PLpgSQL_function":{"datums":[{"PLpgSQL_var":{"refname":"found","datatype":{"PLpgSQL_type":{"typname":"UNKNOWN"}}}}],"action":{"PLpgSQL_stmt_block":{"lineno":2,"body":[{"PLpgSQL_stmt_assert":{"lineno":3,"cond":{"PLpgSQL_expr":{"query":"SELECT true"}}}},{"PLpgSQL_stmt_assert":{"lineno":4,"cond":{"PLpgSQL_expr":{"query":"SELECT now() \u003c '2000-01-01'"}}}},{"PLpgSQL_stmt_assert":{"lineno":5,"cond":{"PLpgSQL_expr":{"query":"SELECT false"}},"message":{"PLpgSQL_expr":{"query":"SELECT 'msg'"}}}},{"PLpgSQL_stmt_assert":{"lineno":6,"cond":{"PLpgSQL_expr":{"query":"SELECT false"}},"message":{"PLpgSQL_expr":{"query":"SELECT version()"}}}},{"PLpgSQL_stmt_return":{"lineno":8,"expr":{"PLpgSQL_expr":{"query":"SELECT 1"}}}}]}}}} ] diff --git a/test/plpgsql_samples.sql b/test/plpgsql_samples.sql index 4078074c..8db4e77e 100644 --- a/test/plpgsql_samples.sql +++ b/test/plpgsql_samples.sql @@ -511,3 +511,15 @@ BEGIN select 1 as c1, 2 as c2 into v3; v3.c1 := 4; END;$$; + +CREATE FUNCTION test_assert() RETURNS integer +LANGUAGE plpgsql +AS $$ +BEGIN + ASSERT true; + ASSERT now() < '2000-01-01'; + ASSERT false, 'msg'; + ASSERT false, version(); + + RETURN 1; +END;$$;