blob: 120a459f2d5379696ef8ef8848aac348b29e2219 [file]
/*-------------------------------------------------------------------------
*
* copyto_internal.h
* Internal definitions for COPY TO command.
*
*
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/commands/copyto_internal.h
*
*-------------------------------------------------------------------------
*/
#ifndef COPYTO_INTERNAL_H
#define COPYTO_INTERNAL_H
#include "commands/copy.h"
#include "commands/copyfrom_internal.h"
typedef CopySource CopyDest;
/*
* This struct contains all the state variables used throughout a COPY TO
* operation.
*
* Multi-byte encodings: all supported client-side encodings encode multi-byte
* characters by having the first byte's high bit set. Subsequent bytes of the
* character can have the high bit not set. When scanning data in such an
* encoding to look for a match to a single-byte (ie ASCII) character, we must
* use the full pg_encoding_mblen() machinery to skip over multibyte
* characters, else we might find a false match to a trailing byte. In
* supported server encodings, there is no possibility of a false match, and
* it's faster to make useless comparisons to trailing bytes than it is to
* invoke pg_encoding_mblen() to skip over them. encoding_embeds_ascii is true
* when we have to do it the hard way.
*/
typedef struct CopyToStateData
{
/* low-level state data */
CopyDest copy_dest; /* type of copy source/destination */
FILE *copy_file; /* used if copy_dest == COPY_FILE */
StringInfo fe_msgbuf; /* used for all dests during COPY TO */
int file_encoding; /* file or remote side's character encoding */
bool need_transcoding; /* file encoding diff from server? */
bool encoding_embeds_ascii; /* ASCII can be non-first byte? */
/* parameters from the COPY command */
Relation rel; /* relation to copy to */
QueryDesc *queryDesc; /* executable query to copy from */
List *attnumlist; /* integer list of attnums to copy */
List *attnamelist; /* list of attributes by name */
char *filename; /* filename, or NULL for STDOUT */
char *dirfilename; /* filename of directory table, not NULL for copy directory table to */
bool is_program; /* is 'filename' a program to popen? */
copy_data_dest_cb data_dest_cb; /* function for writing data */
CopyFormatOptions opts;
Node *whereClause; /* WHERE condition (or NULL) */
/*
* Working state
*/
CopyDispatchMode dispatch_mode;
MemoryContext copycontext; /* per-copy execution context */
FmgrInfo *out_functions; /* lookup info for output functions */
MemoryContext rowcontext; /* per-row evaluation context */
uint64 bytes_processed; /* number of bytes processed so far */
/* Apache Cloudberry specific variables */
Oid conversion_proc; /* encoding conversion function */
FmgrInfo *enc_conversion_proc; /* conv proc from exttbl encoding to
server or the other way around */
bool escape_off; /* treat backslashes as non-special? */
/* Information on the connections to QEs. */
ProgramPipes *program_pipes; /* COPY PROGRAM pipes for data and stderr */
CdbCopy *cdbCopy;
/* end Apache Cloudberry specific variables */
} CopyToStateData;
#endif /* COPYTO_INTERNAL_H */