mirror of
https://github.com/postgres/postgres.git
synced 2025-10-19 15:49:24 +03:00
Split copy.c into four files.
Copy.c has grown really large. Split it into more manageable parts: - copy.c now contains only a few functions that are common to COPY FROM and COPY TO. - copyto.c contains code for COPY TO. - copyfrom.c contains code for initializing COPY FROM, and inserting the tuples to the correct table. - copyfromparse.c contains code for reading from the client/file/program, and parsing the input text/CSV/binary format into tuples. All of these parts are fairly complicated, and fairly independent of each other. There is a patch being discussed to implement parallel COPY FROM, which will add a lot of new code to the COPY FROM path, and another patch which would allow INSERTs to use the same multi-insert machinery as COPY FROM, both of which will require refactoring that code. With those two patches, there's going to be a lot of code churn in copy.c anyway, so now seems like a good time to do this refactoring. The CopyStateData struct is also split. All the formatting options, like FORMAT, QUOTE, ESCAPE, are put in a new CopyFormatOption struct, which is used by both COPY FROM and TO. Other state data are kept in separate CopyFromStateData and CopyToStateData structs. Reviewed-by: Soumyadeep Chakraborty, Erik Rijkers, Vignesh C, Andres Freund Discussion: https://www.postgresql.org/message-id/8e15b560-f387-7acc-ac90-763986617bfb%40iki.fi
This commit is contained in:
@@ -19,26 +19,71 @@
|
||||
#include "parser/parse_node.h"
|
||||
#include "tcop/dest.h"
|
||||
|
||||
/* CopyStateData is private in commands/copy.c */
|
||||
typedef struct CopyStateData *CopyState;
|
||||
/*
|
||||
* A struct to hold COPY options, in a parsed form. All of these are related
|
||||
* to formatting, except for 'freeze', which doesn't really belong here, but
|
||||
* it's expedient to parse it along with all the other options.
|
||||
*/
|
||||
typedef struct CopyFormatOptions
|
||||
{
|
||||
/* parameters from the COPY command */
|
||||
int file_encoding; /* file or remote side's character encoding,
|
||||
* -1 if not specified */
|
||||
bool binary; /* binary format? */
|
||||
bool freeze; /* freeze rows on loading? */
|
||||
bool csv_mode; /* Comma Separated Value format? */
|
||||
bool header_line; /* CSV header line? */
|
||||
char *null_print; /* NULL marker string (server encoding!) */
|
||||
int null_print_len; /* length of same */
|
||||
char *null_print_client; /* same converted to file encoding */
|
||||
char *delim; /* column delimiter (must be 1 byte) */
|
||||
char *quote; /* CSV quote char (must be 1 byte) */
|
||||
char *escape; /* CSV escape char (must be 1 byte) */
|
||||
List *force_quote; /* list of column names */
|
||||
bool force_quote_all; /* FORCE_QUOTE *? */
|
||||
bool *force_quote_flags; /* per-column CSV FQ flags */
|
||||
List *force_notnull; /* list of column names */
|
||||
bool *force_notnull_flags; /* per-column CSV FNN flags */
|
||||
List *force_null; /* list of column names */
|
||||
bool *force_null_flags; /* per-column CSV FN flags */
|
||||
bool convert_selectively; /* do selective binary conversion? */
|
||||
List *convert_select; /* list of column names (can be NIL) */
|
||||
} CopyFormatOptions;
|
||||
|
||||
/* These are private in commands/copy[from|to].c */
|
||||
typedef struct CopyFromStateData *CopyFromState;
|
||||
typedef struct CopyToStateData *CopyToState;
|
||||
|
||||
typedef int (*copy_data_source_cb) (void *outbuf, int minread, int maxread);
|
||||
|
||||
extern void DoCopy(ParseState *state, const CopyStmt *stmt,
|
||||
int stmt_location, int stmt_len,
|
||||
uint64 *processed);
|
||||
|
||||
extern void ProcessCopyOptions(ParseState *pstate, CopyState cstate, bool is_from, List *options);
|
||||
extern CopyState BeginCopyFrom(ParseState *pstate, Relation rel, const char *filename,
|
||||
extern void ProcessCopyOptions(ParseState *pstate, CopyFormatOptions *ops_out, bool is_from, List *options);
|
||||
extern CopyFromState BeginCopyFrom(ParseState *pstate, Relation rel, Node *whereClause,
|
||||
const char *filename,
|
||||
bool is_program, copy_data_source_cb data_source_cb, List *attnamelist, List *options);
|
||||
extern void EndCopyFrom(CopyState cstate);
|
||||
extern bool NextCopyFrom(CopyState cstate, ExprContext *econtext,
|
||||
extern void EndCopyFrom(CopyFromState cstate);
|
||||
extern bool NextCopyFrom(CopyFromState cstate, ExprContext *econtext,
|
||||
Datum *values, bool *nulls);
|
||||
extern bool NextCopyFromRawFields(CopyState cstate,
|
||||
extern bool NextCopyFromRawFields(CopyFromState cstate,
|
||||
char ***fields, int *nfields);
|
||||
extern void CopyFromErrorCallback(void *arg);
|
||||
|
||||
extern uint64 CopyFrom(CopyState cstate);
|
||||
extern uint64 CopyFrom(CopyFromState cstate);
|
||||
|
||||
extern DestReceiver *CreateCopyDestReceiver(void);
|
||||
|
||||
/*
|
||||
* internal prototypes
|
||||
*/
|
||||
extern CopyToState BeginCopyTo(ParseState *pstate, Relation rel, RawStmt *query,
|
||||
Oid queryRelId, const char *filename, bool is_program,
|
||||
List *attnamelist, List *options);
|
||||
extern void EndCopyTo(CopyToState cstate);
|
||||
extern uint64 DoCopyTo(CopyToState cstate);
|
||||
extern List *CopyGetAttnums(TupleDesc tupDesc, Relation rel,
|
||||
List *attnamelist);
|
||||
|
||||
#endif /* COPY_H */
|
||||
|
Reference in New Issue
Block a user