summaryrefslogtreecommitdiff
path: root/contrib/spi/timetravel.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/spi/timetravel.c')
-rw-r--r--contrib/spi/timetravel.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/contrib/spi/timetravel.c b/contrib/spi/timetravel.c
index a37cbee8631..0699438d6f6 100644
--- a/contrib/spi/timetravel.c
+++ b/contrib/spi/timetravel.c
@@ -35,10 +35,10 @@ static int nPlans = 0;
typedef struct _TTOffList
{
struct _TTOffList *next;
- char name[1];
+ char name[FLEXIBLE_ARRAY_MEMBER];
} TTOffList;
-static TTOffList TTOff = {NULL, {0}};
+static TTOffList *TTOff = NULL;
static int findTTStatus(char *name);
static EPlan *find_plan(char *ident, EPlan **eplan, int *nplans);
@@ -428,10 +428,11 @@ set_timetravel(PG_FUNCTION_ARGS)
char *d;
char *s;
int32 ret;
- TTOffList *p,
+ TTOffList *prev,
*pp;
- for (pp = (p = &TTOff)->next; pp; pp = (p = pp)->next)
+ prev = NULL;
+ for (pp = TTOff; pp; prev = pp, pp = pp->next)
{
if (namestrcmp(relname, pp->name) == 0)
break;
@@ -442,7 +443,10 @@ set_timetravel(PG_FUNCTION_ARGS)
if (on != 0)
{
/* turn ON */
- p->next = pp->next;
+ if (prev)
+ prev->next = pp->next;
+ else
+ TTOff = pp->next;
free(pp);
}
ret = 0;
@@ -456,15 +460,18 @@ set_timetravel(PG_FUNCTION_ARGS)
s = rname = DatumGetCString(DirectFunctionCall1(nameout, NameGetDatum(relname)));
if (s)
{
- pp = malloc(sizeof(TTOffList) + strlen(rname));
+ pp = malloc(offsetof(TTOffList, name) +strlen(rname) + 1);
if (pp)
{
pp->next = NULL;
- p->next = pp;
d = pp->name;
while (*s)
*d++ = tolower((unsigned char) *s++);
*d = '\0';
+ if (prev)
+ prev->next = pp;
+ else
+ TTOff = pp;
}
pfree(rname);
}
@@ -486,7 +493,7 @@ get_timetravel(PG_FUNCTION_ARGS)
Name relname = PG_GETARG_NAME(0);
TTOffList *pp;
- for (pp = TTOff.next; pp; pp = pp->next)
+ for (pp = TTOff; pp; pp = pp->next)
{
if (namestrcmp(relname, pp->name) == 0)
PG_RETURN_INT32(0);
@@ -499,7 +506,7 @@ findTTStatus(char *name)
{
TTOffList *pp;
- for (pp = TTOff.next; pp; pp = pp->next)
+ for (pp = TTOff; pp; pp = pp->next)
if (pg_strcasecmp(name, pp->name) == 0)
return 0;
return 1;