/*------------------------------------------------------------------------- * * psqlscan.h * lexical scanner for SQL commands * * This lexer used to be part of psql, and that heritage is reflected in * the file name as well as function and typedef names, though it can now * be used by other frontend programs as well. It's also possible to extend * this lexer with a compatible add-on lexer to handle program-specific * backslash commands. * * * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/psqlscan.h * *------------------------------------------------------------------------- */ #ifndef PSQLSCAN_H #define PSQLSCAN_H #include "pqexpbuffer.h" /* Abstract type for lexer's internal state */ typedef struct PsqlScanStateData *PsqlScanState; /* Termination states for psql_scan() */ typedef enum { PSCAN_SEMICOLON, /* found command-ending semicolon */ PSCAN_BACKSLASH, /* found backslash command */ PSCAN_INCOMPLETE, /* end of line, SQL statement incomplete */ PSCAN_EOL /* end of line, SQL possibly complete */ } PsqlScanResult; /* Prompt type returned by psql_scan() */ typedef enum _promptStatus { PROMPT_READY, PROMPT_CONTINUE, PROMPT_COMMENT, PROMPT_SINGLEQUOTE, PROMPT_DOUBLEQUOTE, PROMPT_DOLLARQUOTE, PROMPT_PAREN, PROMPT_COPY } promptStatus_t; /* Quoting request types for get_variable() callback */ typedef enum { PQUOTE_PLAIN, /* just return the actual value */ PQUOTE_SQL_LITERAL, /* add quotes to make a valid SQL literal */ PQUOTE_SQL_IDENT, /* quote if needed to make a SQL identifier */ PQUOTE_SHELL_ARG /* quote if needed to be safe in a shell cmd */ } PsqlScanQuoteType; /* Callback functions to be used by the lexer */ typedef struct PsqlScanCallbacks { /* Fetch value of a variable, as a free'able string; NULL if unknown */ /* This pointer can be NULL if no variable substitution is wanted */ char *(*get_variable) (const char *varname, PsqlScanQuoteType quote, void *passthrough); } PsqlScanCallbacks; extern PsqlScanState psql_scan_create(const PsqlScanCallbacks *callbacks); extern void psql_scan_destroy(PsqlScanState state); extern void psql_scan_set_passthrough(PsqlScanState state, void *passthrough); extern void psql_scan_setup(PsqlScanState state, const char *line, int line_len, int encoding, bool std_strings); extern void psql_scan_finish(PsqlScanState state); extern PsqlScanResult psql_scan(PsqlScanState state, PQExpBuffer query_buf, promptStatus_t *prompt); extern void psql_scan_reset(PsqlScanState state); extern void psql_scan_reselect_sql_lexer(PsqlScanState state); extern bool psql_scan_in_quote(PsqlScanState state); #endif /* PSQLSCAN_H */