1 /*------------------------------------------------------------------------- 2 * 3 * psqlscan.h 4 * lexical scanner for SQL commands 5 * 6 * This lexer used to be part of psql, and that heritage is reflected in 7 * the file name as well as function and typedef names, though it can now 8 * be used by other frontend programs as well. It's also possible to extend 9 * this lexer with a compatible add-on lexer to handle program-specific 10 * backslash commands. 11 * 12 * 13 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group 14 * Portions Copyright (c) 1994, Regents of the University of California 15 * 16 * src/include/fe_utils/psqlscan.h 17 * 18 *------------------------------------------------------------------------- 19 */ 20 #ifndef PSQLSCAN_H 21 #define PSQLSCAN_H 22 23 #include "pqexpbuffer.h" 24 25 26 /* Abstract type for lexer's internal state */ 27 typedef struct PsqlScanStateData *PsqlScanState; 28 29 /* Termination states for psql_scan() */ 30 typedef enum 31 { 32 PSCAN_SEMICOLON, /* found command-ending semicolon */ 33 PSCAN_BACKSLASH, /* found backslash command */ 34 PSCAN_INCOMPLETE, /* end of line, SQL statement incomplete */ 35 PSCAN_EOL /* end of line, SQL possibly complete */ 36 } PsqlScanResult; 37 38 /* Prompt type returned by psql_scan() */ 39 typedef enum _promptStatus 40 { 41 PROMPT_READY, 42 PROMPT_CONTINUE, 43 PROMPT_COMMENT, 44 PROMPT_SINGLEQUOTE, 45 PROMPT_DOUBLEQUOTE, 46 PROMPT_DOLLARQUOTE, 47 PROMPT_PAREN, 48 PROMPT_COPY 49 } promptStatus_t; 50 51 /* Quoting request types for get_variable() callback */ 52 typedef enum 53 { 54 PQUOTE_PLAIN, /* just return the actual value */ 55 PQUOTE_SQL_LITERAL, /* add quotes to make a valid SQL literal */ 56 PQUOTE_SQL_IDENT, /* quote if needed to make a SQL identifier */ 57 PQUOTE_SHELL_ARG /* quote if needed to be safe in a shell cmd */ 58 } PsqlScanQuoteType; 59 60 /* Callback functions to be used by the lexer */ 61 typedef struct PsqlScanCallbacks 62 { 63 /* Fetch value of a variable, as a free'able string; NULL if unknown */ 64 /* This pointer can be NULL if no variable substitution is wanted */ 65 char *(*get_variable) (const char *varname, PsqlScanQuoteType quote, 66 void *passthrough); 67 /* Print an error message someplace appropriate */ 68 /* (very old gcc versions don't support attributes on function pointers) */ 69 #if defined(__GNUC__) && __GNUC__ < 4 70 void (*write_error) (const char *fmt,...); 71 #else 72 void (*write_error) (const char *fmt,...) pg_attribute_printf(1, 2); 73 #endif 74 } PsqlScanCallbacks; 75 76 77 extern PsqlScanState psql_scan_create(const PsqlScanCallbacks *callbacks); 78 extern void psql_scan_destroy(PsqlScanState state); 79 80 extern void psql_scan_set_passthrough(PsqlScanState state, void *passthrough); 81 82 extern void psql_scan_setup(PsqlScanState state, 83 const char *line, int line_len, 84 int encoding, bool std_strings); 85 extern void psql_scan_finish(PsqlScanState state); 86 87 extern PsqlScanResult psql_scan(PsqlScanState state, 88 PQExpBuffer query_buf, 89 promptStatus_t *prompt); 90 91 extern void psql_scan_reset(PsqlScanState state); 92 93 extern void psql_scan_reselect_sql_lexer(PsqlScanState state); 94 95 extern bool psql_scan_in_quote(PsqlScanState state); 96 97 #endif /* PSQLSCAN_H */ 98