Fix segfault in cagg_validate_query

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
This commit is contained in:
Sven Klemm 2024-02-14 20:55:24 +01:00 committed by Sven Klemm
parent 265ec175fa
commit 7ab0566ff1
4 changed files with 34 additions and 2 deletions

2
.unreleased/pr_6655 Normal file
View File

@ -0,0 +1,2 @@
Fixes: #6655 Fix segfault in cagg_validate_query
Thanks: @kav23alex for reporting a segfault in cagg_validate_query

View File

@ -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;

View File

@ -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 | XX000 | 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 | XX000 | 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 | XX000 | 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

View File

@ -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 $$);
@ -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 $$);