Skip to content

Commit

Permalink
Fix segfault in cagg_validate_query
Browse files Browse the repository at this point in the history
When the input to pg_parse_query does not contain anything to parse
it will return NIL. This patch adds a check for NIL to prevent the
segfault that would otherwise happen later in the code.

Fixes: #6625
  • Loading branch information
svenklemm committed Feb 14, 2024
1 parent 59f50f2 commit 58a03f9
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 2 deletions.
2 changes: 2 additions & 0 deletions .unreleased/pr_6655
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fixes: #6655 Fix segfault in cagg_validate_query
Thanks: @kav23alex for reporting a segfault in cagg_validate_query
8 changes: 7 additions & 1 deletion tsl/src/continuous_aggs/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,13 @@ continuous_agg_validate_query(PG_FUNCTION_ARGS)

tree = pg_parse_query(sql);

if (list_length(tree) > 1)
if (tree == NIL)
{
edata->elevel = ERROR;
edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
edata->message = "failed to parse query";
}
else if (list_length(tree) > 1)
{
edata->elevel = WARNING;
edata->sqlerrcode = ERRCODE_FEATURE_NOT_SUPPORTED;
Expand Down
19 changes: 19 additions & 0 deletions tsl/test/expected/cagg_utils.out
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,25 @@ SELECT * FROM cagg_validate_query(NULL);
| | | | |
(1 row)

-- nothing to parse
SELECT * FROM cagg_validate_query('');
is_valid | error_level | error_code | error_message | error_detail | error_hint
----------+-------------+------------+-----------------------+--------------+------------
f | ERROR | 0A000 | failed to parse query | |
(1 row)

SELECT * FROM cagg_validate_query('--');
is_valid | error_level | error_code | error_message | error_detail | error_hint
----------+-------------+------------+-----------------------+--------------+------------
f | ERROR | 0A000 | failed to parse query | |
(1 row)

SELECT * FROM cagg_validate_query(';');
is_valid | error_level | error_code | error_message | error_detail | error_hint
----------+-------------+------------+-----------------------+--------------+------------
f | ERROR | 0A000 | failed to parse query | |
(1 row)

-- syntax error
SELECT * FROM cagg_validate_query('blahh');
is_valid | error_level | error_code | error_message | error_detail | error_hint
Expand Down
7 changes: 6 additions & 1 deletion tsl/test/sql/cagg_utils.sql
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ WITH NO DATA;
-- return NULL
SELECT * FROM cagg_validate_query(NULL);

-- nothing to parse
SELECT * FROM cagg_validate_query('');
SELECT * FROM cagg_validate_query('--');
SELECT * FROM cagg_validate_query(';');

-- syntax error
SELECT * FROM cagg_validate_query('blahh');
SELECT * FROM cagg_validate_query($$ SELECT time_bucket(blahh "time") FROM metrics GROUP BY 1 $$);
Expand Down Expand Up @@ -96,4 +101,4 @@ SELECT * FROM cagg_validate_query($$ SELECT time_bucket('1 hour', "time", timezo
-- caggs on caggs
SELECT * FROM cagg_validate_query($$ SELECT time_bucket('1 day', bucket) AS bucket, sum(count) AS count FROM metrics_by_hour GROUP BY 1 $$);
SELECT * FROM cagg_validate_query($$ SELECT time_bucket('1 month', bucket) AS bucket, sum(count) AS count FROM metrics_by_hour GROUP BY 1 $$);
SELECT * FROM cagg_validate_query($$ SELECT time_bucket('1 year', bucket) AS bucket, sum(count) AS count FROM metrics_by_month GROUP BY 1 $$);
SELECT * FROM cagg_validate_query($$ SELECT time_bucket('1 year', bucket) AS bucket, sum(count) AS count FROM metrics_by_month GROUP BY 1 $$);

0 comments on commit 58a03f9

Please sign in to comment.