Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Add CHECK_FOR_INTERRUPTS() to the repeat() function
authorJoe Conway <mail@joeconway.com>
Thu, 28 May 2020 17:17:11 +0000 (13:17 -0400)
committerJoe Conway <mail@joeconway.com>
Thu, 28 May 2020 17:17:11 +0000 (13:17 -0400)
The repeat() function loops for potentially a long time without
ever checking for interrupts. This prevents, for example, a query
cancel from interrupting until the work is all done. Fix by
inserting a CHECK_FOR_INTERRUPTS() into the loop.

Backpatch to all supported versions.

Discussion: https://www.postgresql.org/message-id/flat/8692553c-7fe8-17d9-cbc1-7cddb758f4c6%40joeconway.com

src/backend/utils/adt/oracle_compat.c

index b82016500b0cc7d5d0a9c5e3ac0ffd38f966ce34..80298349daf913927d26234357ec2e82c55f9ef7 100644 (file)
@@ -18,7 +18,7 @@
 #include "utils/builtins.h"
 #include "utils/formatting.h"
 #include "mb/pg_wchar.h"
-
+#include "miscadmin.h"
 
 static text *dotrim(const char *string, int stringlen,
       const char *set, int setlen,
@@ -1068,6 +1068,7 @@ repeat(PG_FUNCTION_ARGS)
    {
        memcpy(cp, sp, slen);
        cp += slen;
+       CHECK_FOR_INTERRUPTS();
    }
 
    PG_RETURN_TEXT_P(result);