Skip to content

Commit

Permalink
Add support for PLPGSQL Assert (#135)
Browse files Browse the repository at this point in the history
Add support for PLPGSQL Assert so any PLPGSQL code using Assert
can be parsed successfully.
  • Loading branch information
svenklemm authored Apr 29, 2022
1 parent c4a47f8 commit acca9da
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/pg_query_json_plpgsql.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down
3 changes: 2 additions & 1 deletion test/plpgsql_samples.expected.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"}}}}]}}}}
]
12 changes: 12 additions & 0 deletions test/plpgsql_samples.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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;$$;

0 comments on commit acca9da

Please sign in to comment.