mirror of
https://github.com/postgres/postgres.git
synced 2026-02-12 23:33:27 -05:00
These changes allow backtick command evaluation and psql variable interpolation to happen on substrings of a single meta-command argument. Formerly, no such evaluations happened at all if the backtick or colon wasn't the first character of the argument, and we considered an argument completed as soon as we'd processed one backtick, variable reference, or quoted substring. A string like 'FOO'BAR was thus taken as two arguments not one, not exactly what one would expect. In the new coding, an argument is considered terminated only by unquoted whitespace or backslash. Also, clean up a bunch of omissions, infelicities and outright errors in the psql documentation of variables and metacommand argument syntax.
64 lines
1.7 KiB
C
64 lines
1.7 KiB
C
/*
|
|
* psql - the PostgreSQL interactive terminal
|
|
*
|
|
* Copyright (c) 2000-2011, PostgreSQL Global Development Group
|
|
*
|
|
* src/bin/psql/psqlscan.h
|
|
*/
|
|
#ifndef PSQLSCAN_H
|
|
#define PSQLSCAN_H
|
|
|
|
#include "pqexpbuffer.h"
|
|
|
|
#include "prompt.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;
|
|
|
|
/* Different ways for scan_slash_option to handle parameter words */
|
|
enum slash_option_type
|
|
{
|
|
OT_NORMAL, /* normal case */
|
|
OT_SQLID, /* treat as SQL identifier */
|
|
OT_SQLIDHACK, /* SQL identifier, but don't downcase */
|
|
OT_FILEPIPE, /* it's a filename or pipe */
|
|
OT_WHOLE_LINE, /* just snarf the rest of the line */
|
|
OT_NO_EVAL /* no expansion of backticks or variables */
|
|
};
|
|
|
|
|
|
extern PsqlScanState psql_scan_create(void);
|
|
extern void psql_scan_destroy(PsqlScanState state);
|
|
|
|
extern void psql_scan_setup(PsqlScanState state,
|
|
const char *line, int line_len);
|
|
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 bool psql_scan_in_quote(PsqlScanState state);
|
|
|
|
extern char *psql_scan_slash_command(PsqlScanState state);
|
|
|
|
extern char *psql_scan_slash_option(PsqlScanState state,
|
|
enum slash_option_type type,
|
|
char *quote,
|
|
bool semicolon);
|
|
|
|
extern void psql_scan_slash_command_end(PsqlScanState state);
|
|
|
|
#endif /* PSQLSCAN_H */
|