Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Tighten test_predtest's input checks, and improve error messages.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 7 Jun 2024 20:45:56 +0000 (16:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 7 Jun 2024 20:45:56 +0000 (16:45 -0400)
test_predtest() neglected to consider the possibility that
SPI_plan_get_cached_plan would return NULL.  This led to a core
dump if the input (incorrectly) contains more than one SQL
command.

While here, let's expend more than zero effort on the error
message for this case and nearby ones.

Per (half of) bug #18483 from Alexander Kozhemyakin.
Back-patch to all supported branches, not because this is
very significant (it's merely test scaffolding) but to make
our world a bit safer for fuzz testing.

Discussion: https://postgr.es/m/18483-30bfff42de238000@postgresql.org

src/test/modules/test_predtest/test_predtest.c

index 9c0aadd61c87136b0a691489175e9c4e651869d2..51e87f784acc7453b3fcaefafc0e8990ad38b0ac 100644 (file)
@@ -74,7 +74,7 @@ test_predtest(PG_FUNCTION_ARGS)
    if (tupdesc->natts != 2 ||
        TupleDescAttr(tupdesc, 0)->atttypid != BOOLOID ||
        TupleDescAttr(tupdesc, 1)->atttypid != BOOLOID)
-       elog(ERROR, "query must yield two boolean columns");
+       elog(ERROR, "test_predtest query must yield two boolean columns");
 
    s_i_holds = w_i_holds = s_r_holds = w_r_holds = true;
    for (i = 0; i < SPI_processed; i++)
@@ -124,11 +124,11 @@ test_predtest(PG_FUNCTION_ARGS)
     */
    cplan = SPI_plan_get_cached_plan(spiplan);
 
-   if (list_length(cplan->stmt_list) != 1)
-       elog(ERROR, "failed to decipher query plan");
+   if (cplan == NULL || list_length(cplan->stmt_list) != 1)
+       elog(ERROR, "test_predtest query string must contain exactly one query");
    stmt = linitial_node(PlannedStmt, cplan->stmt_list);
    if (stmt->commandType != CMD_SELECT)
-       elog(ERROR, "failed to decipher query plan");
+       elog(ERROR, "test_predtest query must be a SELECT");
    plan = stmt->planTree;
    Assert(list_length(plan->targetlist) >= 2);
    clause1 = castNode(TargetEntry, linitial(plan->targetlist))->expr;