PostgreSQL Source Code git master
psqlscan.h File Reference
#include "pqexpbuffer.h"
Include dependency graph for psqlscan.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  PsqlScanCallbacks
 

Typedefs

typedef struct PsqlScanStateDataPsqlScanState
 
typedef enum _promptStatus promptStatus_t
 
typedef struct PsqlScanCallbacks PsqlScanCallbacks
 

Enumerations

enum  PsqlScanResult { PSCAN_SEMICOLON , PSCAN_BACKSLASH , PSCAN_INCOMPLETE , PSCAN_EOL }
 
enum  _promptStatus {
  PROMPT_READY , PROMPT_CONTINUE , PROMPT_COMMENT , PROMPT_SINGLEQUOTE ,
  PROMPT_DOUBLEQUOTE , PROMPT_DOLLARQUOTE , PROMPT_PAREN , PROMPT_COPY
}
 
enum  PsqlScanQuoteType { PQUOTE_PLAIN , PQUOTE_SQL_LITERAL , PQUOTE_SQL_IDENT , PQUOTE_SHELL_ARG }
 

Functions

PsqlScanState psql_scan_create (const PsqlScanCallbacks *callbacks)
 
void psql_scan_destroy (PsqlScanState state)
 
void psql_scan_set_passthrough (PsqlScanState state, void *passthrough)
 
void psql_scan_setup (PsqlScanState state, const char *line, int line_len, int encoding, bool std_strings)
 
void psql_scan_finish (PsqlScanState state)
 
PsqlScanResult psql_scan (PsqlScanState state, PQExpBuffer query_buf, promptStatus_t *prompt)
 
void psql_scan_reset (PsqlScanState state)
 
void psql_scan_reselect_sql_lexer (PsqlScanState state)
 
bool psql_scan_in_quote (PsqlScanState state)
 

Typedef Documentation

◆ promptStatus_t

◆ PsqlScanCallbacks

◆ PsqlScanState

Definition at line 27 of file psqlscan.h.

Enumeration Type Documentation

◆ _promptStatus

Enumerator
PROMPT_READY 
PROMPT_CONTINUE 
PROMPT_COMMENT 
PROMPT_SINGLEQUOTE 
PROMPT_DOUBLEQUOTE 
PROMPT_DOLLARQUOTE 
PROMPT_PAREN 
PROMPT_COPY 

Definition at line 39 of file psqlscan.h.

40{
enum _promptStatus promptStatus_t
@ PROMPT_READY
Definition: psqlscan.h:41
@ PROMPT_COPY
Definition: psqlscan.h:48
@ PROMPT_PAREN
Definition: psqlscan.h:47
@ PROMPT_COMMENT
Definition: psqlscan.h:43
@ PROMPT_CONTINUE
Definition: psqlscan.h:42
@ PROMPT_SINGLEQUOTE
Definition: psqlscan.h:44
@ PROMPT_DOLLARQUOTE
Definition: psqlscan.h:46
@ PROMPT_DOUBLEQUOTE
Definition: psqlscan.h:45

◆ PsqlScanQuoteType

Enumerator
PQUOTE_PLAIN 
PQUOTE_SQL_LITERAL 
PQUOTE_SQL_IDENT 
PQUOTE_SHELL_ARG 

Definition at line 52 of file psqlscan.h.

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 */
PsqlScanQuoteType
Definition: psqlscan.h:53
@ PQUOTE_SQL_LITERAL
Definition: psqlscan.h:55
@ PQUOTE_PLAIN
Definition: psqlscan.h:54
@ PQUOTE_SHELL_ARG
Definition: psqlscan.h:57
@ PQUOTE_SQL_IDENT
Definition: psqlscan.h:56

◆ PsqlScanResult

Enumerator
PSCAN_SEMICOLON 
PSCAN_BACKSLASH 
PSCAN_INCOMPLETE 
PSCAN_EOL 

Definition at line 30 of file psqlscan.h.

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 */
PsqlScanResult
Definition: psqlscan.h:31
@ PSCAN_BACKSLASH
Definition: psqlscan.h:33
@ PSCAN_EOL
Definition: psqlscan.h:35
@ PSCAN_INCOMPLETE
Definition: psqlscan.h:34
@ PSCAN_SEMICOLON
Definition: psqlscan.h:32

Function Documentation

◆ psql_scan()

PsqlScanResult psql_scan ( PsqlScanState  state,
PQExpBuffer  query_buf,
promptStatus_t prompt 
)

Definition at line 1117 of file psqlscan.l.

1120{
1121 PsqlScanResult result;
1122 int lexresult;
1123
1124 /* Must be scanning already */
1125 Assert(state->scanbufhandle != NULL);
1126
1127 /* Set current output target */
1128 state->output_buf = query_buf;
1129
1130 /* Set input source */
1131 if (state->buffer_stack != NULL)
1132 yy_switch_to_buffer(state->buffer_stack->buf, state->scanner);
1133 else
1134 yy_switch_to_buffer(state->scanbufhandle, state->scanner);
1135
1136 /* And lex. */
1137 lexresult = yylex(NULL, state->scanner);
1138
1139 /*
1140 * Check termination state and return appropriate result info.
1141 */
1142 switch (lexresult)
1143 {
1144 case LEXRES_EOL: /* end of input */
1145 switch (state->start_state)
1146 {
1147 case INITIAL:
1148 case xqs: /* we treat this like INITIAL */
1149 if (state->paren_depth > 0)
1150 {
1151 result = PSCAN_INCOMPLETE;
1152 *prompt = PROMPT_PAREN;
1153 }
1154 else if (state->begin_depth > 0)
1155 {
1156 result = PSCAN_INCOMPLETE;
1157 *prompt = PROMPT_CONTINUE;
1158 }
1159 else if (query_buf->len > 0)
1160 {
1161 result = PSCAN_EOL;
1162 *prompt = PROMPT_CONTINUE;
1163 }
1164 else
1165 {
1166 /* never bother to send an empty buffer */
1167 result = PSCAN_INCOMPLETE;
1168 *prompt = PROMPT_READY;
1169 }
1170 break;
1171 case xb:
1172 result = PSCAN_INCOMPLETE;
1173 *prompt = PROMPT_SINGLEQUOTE;
1174 break;
1175 case xc:
1176 result = PSCAN_INCOMPLETE;
1177 *prompt = PROMPT_COMMENT;
1178 break;
1179 case xd:
1180 result = PSCAN_INCOMPLETE;
1181 *prompt = PROMPT_DOUBLEQUOTE;
1182 break;
1183 case xh:
1184 result = PSCAN_INCOMPLETE;
1185 *prompt = PROMPT_SINGLEQUOTE;
1186 break;
1187 case xe:
1188 result = PSCAN_INCOMPLETE;
1189 *prompt = PROMPT_SINGLEQUOTE;
1190 break;
1191 case xq:
1192 result = PSCAN_INCOMPLETE;
1193 *prompt = PROMPT_SINGLEQUOTE;
1194 break;
1195 case xdolq:
1196 result = PSCAN_INCOMPLETE;
1197 *prompt = PROMPT_DOLLARQUOTE;
1198 break;
1199 case xui:
1200 result = PSCAN_INCOMPLETE;
1201 *prompt = PROMPT_DOUBLEQUOTE;
1202 break;
1203 case xus:
1204 result = PSCAN_INCOMPLETE;
1205 *prompt = PROMPT_SINGLEQUOTE;
1206 break;
1207 default:
1208 /* can't get here */
1209 fprintf(stderr, "invalid YY_START\n");
1210 exit(1);
1211 }
1212 break;
1213 case LEXRES_SEMI: /* semicolon */
1214 result = PSCAN_SEMICOLON;
1215 *prompt = PROMPT_READY;
1216 break;
1217 case LEXRES_BACKSLASH: /* backslash */
1218 result = PSCAN_BACKSLASH;
1219 *prompt = PROMPT_READY;
1220 break;
1221 default:
1222 /* can't get here */
1223 fprintf(stderr, "invalid yylex result\n");
1224 exit(1);
1225 }
1226
1227 return result;
1228}
#define Assert(condition)
Definition: c.h:815
#define fprintf(file, fmt, msg)
Definition: cubescan.l:21
exit(1)
#define LEXRES_BACKSLASH
Definition: psqlscan.l:59
#define LEXRES_SEMI
Definition: psqlscan.l:58
#define LEXRES_EOL
Definition: psqlscan.l:57
int yylex(YYSTYPE *yylval_param, yyscan_t yyscanner)
Definition: psqlscan.l:385
Definition: regguts.h:323

References Assert, exit(), fprintf, PQExpBufferData::len, LEXRES_BACKSLASH, LEXRES_EOL, LEXRES_SEMI, PROMPT_COMMENT, PROMPT_CONTINUE, PROMPT_DOLLARQUOTE, PROMPT_DOUBLEQUOTE, PROMPT_PAREN, PROMPT_READY, PROMPT_SINGLEQUOTE, PSCAN_BACKSLASH, PSCAN_EOL, PSCAN_INCOMPLETE, PSCAN_SEMICOLON, and yylex().

Referenced by MainLoop(), ParseScript(), and test_psql_parse().

◆ psql_scan_create()

PsqlScanState psql_scan_create ( const PsqlScanCallbacks callbacks)

Definition at line 1001 of file psqlscan.l.

1002{
1004
1006
1007 state->callbacks = callbacks;
1008
1009 yylex_init(&state->scanner);
1010
1011 yyset_extra(state, state->scanner);
1012
1014
1015 return state;
1016}
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
void psql_scan_reset(PsqlScanState state)
Definition: psqlscan.l:1267

References pg_malloc0(), and psql_scan_reset().

Referenced by main(), MainLoop(), ParseScript(), and test_psql_parse().

◆ psql_scan_destroy()

void psql_scan_destroy ( PsqlScanState  state)

Definition at line 1022 of file psqlscan.l.

1023{
1025
1027
1028 yylex_destroy(state->scanner);
1029
1030 free(state);
1031}
#define free(a)
Definition: header.h:65
void psql_scan_finish(PsqlScanState state)
Definition: psqlscan.l:1240

References free, psql_scan_finish(), and psql_scan_reset().

Referenced by main(), MainLoop(), ParseScript(), and test_psql_parse().

◆ psql_scan_finish()

void psql_scan_finish ( PsqlScanState  state)

Definition at line 1240 of file psqlscan.l.

1241{
1242 /* Drop any incomplete variable expansions. */
1243 while (state->buffer_stack != NULL)
1245
1246 /* Done with the outer scan buffer, too */
1247 if (state->scanbufhandle)
1248 yy_delete_buffer(state->scanbufhandle, state->scanner);
1249 state->scanbufhandle = NULL;
1250 if (state->scanbuf)
1251 free(state->scanbuf);
1252 state->scanbuf = NULL;
1253}
void psqlscan_pop_buffer_stack(PsqlScanState state)
Definition: psqlscan.l:1359

References free, and psqlscan_pop_buffer_stack().

Referenced by MainLoop(), ParseScript(), and psql_scan_destroy().

◆ psql_scan_in_quote()

bool psql_scan_in_quote ( PsqlScanState  state)

Definition at line 1308 of file psqlscan.l.

1309{
1310 return state->start_state != INITIAL &&
1311 state->start_state != xqs;
1312}

Referenced by MainLoop().

◆ psql_scan_reselect_sql_lexer()

void psql_scan_reselect_sql_lexer ( PsqlScanState  state)

Definition at line 1295 of file psqlscan.l.

1296{
1297 state->start_state = INITIAL;
1298}

Referenced by expr_lex_one_word(), expr_scanner_finish(), psql_scan_slash_command(), psql_scan_slash_command_end(), and psql_scan_slash_option().

◆ psql_scan_reset()

void psql_scan_reset ( PsqlScanState  state)

Definition at line 1267 of file psqlscan.l.

1268{
1269 state->start_state = INITIAL;
1270 state->paren_depth = 0;
1271 state->xcdepth = 0; /* not really necessary */
1272 if (state->dolqstart)
1273 free(state->dolqstart);
1274 state->dolqstart = NULL;
1275 state->identifier_count = 0;
1276 state->begin_depth = 0;
1277}

References free.

Referenced by exec_command_reset(), exec_command_watch(), MainLoop(), psql_scan_create(), and psql_scan_destroy().

◆ psql_scan_set_passthrough()

void psql_scan_set_passthrough ( PsqlScanState  state,
void *  passthrough 
)

Definition at line 1041 of file psqlscan.l.

1042{
1043 state->cb_passthrough = passthrough;
1044}

Referenced by main(), and MainLoop().

◆ psql_scan_setup()

void psql_scan_setup ( PsqlScanState  state,
const char *  line,
int  line_len,
int  encoding,
bool  std_strings 
)

Definition at line 1059 of file psqlscan.l.

1062{
1063 /* Mustn't be scanning already */
1064 Assert(state->scanbufhandle == NULL);
1065 Assert(state->buffer_stack == NULL);
1066
1067 /* Do we need to hack the character set encoding? */
1068 state->encoding = encoding;
1069 state->safe_encoding = pg_valid_server_encoding_id(encoding);
1070
1071 /* Save standard-strings flag as well */
1072 state->std_strings = std_strings;
1073
1074 /* Set up flex input buffer with appropriate translation and padding */
1075 state->scanbufhandle = psqlscan_prepare_buffer(state, line, line_len,
1076 &state->scanbuf);
1077 state->scanline = line;
1078
1079 /* Set lookaside data in case we have to map unsafe encoding */
1080 state->curline = state->scanbuf;
1081 state->refline = state->scanline;
1082}
int32 encoding
Definition: pg_database.h:41
#define pg_valid_server_encoding_id
Definition: pg_wchar.h:632
YY_BUFFER_STATE psqlscan_prepare_buffer(PsqlScanState state, const char *txt, int len, char **txtcopy)
Definition: psqlscan.l:1422

References Assert, encoding, pg_valid_server_encoding_id, and psqlscan_prepare_buffer().

Referenced by main(), MainLoop(), ParseScript(), and test_psql_parse().