From 6304bf9652c006987262af94d6db01cce09f9bf8 Mon Sep 17 00:00:00 2001 From: chenchangao Date: Mon, 13 Jul 2026 15:28:34 +0800 Subject: [PATCH] Switch to extension owner when modifying job_run_details. --- src/job_metadata.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/job_metadata.c b/src/job_metadata.c index 515d25c..c62cc9b 100644 --- a/src/job_metadata.c +++ b/src/job_metadata.c @@ -1081,6 +1081,8 @@ InsertJobRunDetail(int64 runId, int64 *jobId, char *database, char *username, ch Oid argTypes[6]; Datum argValues[6]; MemoryContext originalContext = CurrentMemoryContext; + Oid savedUserId = InvalidOid; + int savedSecurityContext = 0; SetCurrentStatementStartTimestamp(); StartTransactionCommand(); @@ -1096,6 +1098,9 @@ InsertJobRunDetail(int64 runId, int64 *jobId, char *database, char *username, ch initStringInfo(&querybuf); + GetUserIdAndSecContext(&savedUserId, &savedSecurityContext); + SetUserIdAndSecContext(CronExtensionOwner(), SECURITY_LOCAL_USERID_CHANGE); + /* Open SPI context. */ if (SPI_connect() != SPI_OK_CONNECT) elog(ERROR, "SPI_connect failed"); @@ -1136,6 +1141,7 @@ InsertJobRunDetail(int64 runId, int64 *jobId, char *database, char *username, ch pfree(querybuf.data); SPI_finish(); + SetUserIdAndSecContext(savedUserId, savedSecurityContext); PopActiveSnapshot(); CommitTransactionCommand(); MemoryContextSwitchTo(originalContext); @@ -1150,6 +1156,8 @@ UpdateJobRunDetail(int64 runId, int32 *job_pid, char *status, char *return_messa Datum argValues[6]; int i; MemoryContext originalContext = CurrentMemoryContext; + Oid savedUserId = InvalidOid; + int savedSecurityContext = 0; SetCurrentStatementStartTimestamp(); StartTransactionCommand(); @@ -1166,6 +1174,9 @@ UpdateJobRunDetail(int64 runId, int32 *job_pid, char *status, char *return_messa initStringInfo(&querybuf); i = 0; + GetUserIdAndSecContext(&savedUserId, &savedSecurityContext); + SetUserIdAndSecContext(CronExtensionOwner(), SECURITY_LOCAL_USERID_CHANGE); + /* Open SPI context. */ if (SPI_connect() != SPI_OK_CONNECT) elog(ERROR, "SPI_connect failed"); @@ -1237,6 +1248,7 @@ UpdateJobRunDetail(int64 runId, int32 *job_pid, char *status, char *return_messa pfree(querybuf.data); SPI_finish(); + SetUserIdAndSecContext(savedUserId, savedSecurityContext); PopActiveSnapshot(); CommitTransactionCommand(); MemoryContextSwitchTo(originalContext); @@ -1421,6 +1433,8 @@ MarkPendingRunsAsFailed(void) { StringInfoData querybuf; MemoryContext originalContext = CurrentMemoryContext; + Oid savedUserId = InvalidOid; + int savedSecurityContext = 0; SetCurrentStatementStartTimestamp(); StartTransactionCommand(); @@ -1436,6 +1450,9 @@ MarkPendingRunsAsFailed(void) initStringInfo(&querybuf); + GetUserIdAndSecContext(&savedUserId, &savedSecurityContext); + SetUserIdAndSecContext(CronExtensionOwner(), SECURITY_LOCAL_USERID_CHANGE); + /* Open SPI context. */ if (SPI_connect() != SPI_OK_CONNECT) elog(ERROR, "SPI_connect failed"); @@ -1452,6 +1469,7 @@ MarkPendingRunsAsFailed(void) pfree(querybuf.data); SPI_finish(); + SetUserIdAndSecContext(savedUserId, savedSecurityContext); PopActiveSnapshot(); CommitTransactionCommand(); MemoryContextSwitchTo(originalContext);