mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-07-23 19:25:25 +03:00
51 lines
1.6 KiB
Diff
51 lines
1.6 KiB
Diff
diff --git a/pglogical_apply_spi.c b/pglogical_apply_spi.c
|
|
index 3eaccc4..111a4eb 100644
|
|
--- a/pglogical_apply_spi.c
|
|
+++ b/pglogical_apply_spi.c
|
|
@@ -454,7 +454,7 @@ static void
|
|
pglogical_proccess_copy(pglogical_copyState *pglcstate)
|
|
{
|
|
uint64 processed;
|
|
- FILE *save_stdin;
|
|
+ int save_stdin;
|
|
|
|
if (!pglcstate->copy_parsetree || !pglcstate->copy_buffered_tuples)
|
|
return;
|
|
@@ -489,8 +489,16 @@ pglogical_proccess_copy(pglogical_copyState *pglcstate)
|
|
* for this relation. Before that we save the current 'stdin' stream and
|
|
* restore it back when the COPY is done
|
|
*/
|
|
- save_stdin = stdin;
|
|
- stdin = pglcstate->copy_read_file;
|
|
+ save_stdin = dup(fileno(stdin));
|
|
+ if (save_stdin < 0)
|
|
+ ereport(FATAL,
|
|
+ (errcode_for_file_access(),
|
|
+ errmsg("could not save stdin: %m")));
|
|
+
|
|
+ if (dup2(fileno(pglcstate->copy_read_file), fileno(stdin)) < 0)
|
|
+ ereport(FATAL,
|
|
+ (errcode_for_file_access(),
|
|
+ errmsg("could not redirect stdin: %m")));
|
|
|
|
/* COPY may call into SPI (triggers, ...) and we already are in SPI. */
|
|
SPI_push();
|
|
@@ -501,10 +509,17 @@ pglogical_proccess_copy(pglogical_copyState *pglcstate)
|
|
|
|
/* Clean up SPI state */
|
|
SPI_pop();
|
|
+ /*
|
|
+ * Also close the read end of the pipe and restore 'stdin' to its original
|
|
+ * value
|
|
+ */
|
|
+ if (dup2(save_stdin, fileno(stdin)) < 0)
|
|
+ ereport(FATAL,
|
|
+ (errcode_for_file_access(),
|
|
+ errmsg("could not restore stdin: %m")));
|
|
|
|
fclose(pglcstate->copy_read_file);
|
|
pglcstate->copy_read_file = NULL;
|
|
- stdin = save_stdin;
|
|
|
|
/* Ensure we processed correct number of tuples */
|
|
Assert(processed == pglcstate->copy_buffered_tuples);
|