PostgreSQL Source Code git master
Loading...
Searching...
No Matches
pgpa_scanner.l File Reference
#include "postgres.h"
#include "common/string.h"
#include "nodes/miscnodes.h"
#include "parser/scansup.h"
#include "pgpa_ast.h"
#include "pgpa_parser.h"

Go to the source code of this file.

Data Structures

struct  pgpa_yy_extra_type
 

Macros

#define YY_DECL
 
#define YY_READ_BUF_SIZE   16777216
 
#define fprintf(file, fmt, msg)   fprintf_to_ereport(fmt, msg)
 

Typedefs

typedef struct pgpa_yy_extra_type pgpa_yy_extra_type
 

Functions

static void fprintf_to_ereport (const char *fmt, const char *msg)
 
int yylex (YYSTYPE *yylval_param, yyscan_t yyscanner)
 
void pgpa_yyerror (List **result, char **parse_error_msg_p, yyscan_t yyscanner, const char *message)
 
void pgpa_scanner_init (const char *str, yyscan_t *yyscannerp)
 
void pgpa_scanner_finish (yyscan_t yyscanner)
 
voidyyalloc (yy_size_t size, yyscan_t yyscanner)
 
voidyyrealloc (void *ptr, yy_size_t size, yyscan_t yyscanner)
 
void yyfree (void *ptr, yyscan_t yyscanner)
 

Macro Definition Documentation

◆ fprintf

#define fprintf (   file,
  fmt,
  msg 
)    fprintf_to_ereport(fmt, msg)

Definition at line 43 of file pgpa_scanner.l.

◆ YY_DECL

#define YY_DECL
Value:
extern int pgpa_yylex(union YYSTYPE *yylval_param, List **result, \
char **parse_error_msg_p, yyscan_t yyscanner)
void * yyscan_t
Definition cubedata.h:65
int pgpa_yylex(union YYSTYPE *yylval_param, List **result, char **parse_error_msg_p, yyscan_t yyscanner)
static int fb(int x)
int YYSTYPE
Definition pg_list.h:54

Definition at line 34 of file pgpa_scanner.l.

◆ YY_READ_BUF_SIZE

#define YY_READ_BUF_SIZE   16777216

Definition at line 39 of file pgpa_scanner.l.

Typedef Documentation

◆ pgpa_yy_extra_type

Function Documentation

◆ fprintf_to_ereport()

static void fprintf_to_ereport ( const char fmt,
const char msg 
)
static

Definition at line 46 of file pgpa_scanner.l.

47{
48 ereport(ERROR, (errmsg_internal("%s", msg)));
int int errmsg_internal(const char *fmt,...) pg_attribute_printf(1
#define ERROR
Definition elog.h:39
#define ereport(elevel,...)
Definition elog.h:150
49}

References ereport, errmsg_internal(), and ERROR.

◆ pgpa_scanner_finish()

void pgpa_scanner_finish ( yyscan_t  yyscanner)

Definition at line 267 of file pgpa_scanner.l.

268{
269 yylex_destroy(yyscanner);
270}

References fb().

◆ pgpa_scanner_init()

void pgpa_scanner_init ( const char str,
yyscan_t yyscannerp 
)

Definition at line 244 of file pgpa_scanner.l.

245{
246 yyscan_t yyscanner;
#define palloc0_object(type)
Definition fe_memutils.h:75
248
249 if (yylex_init(yyscannerp) != 0)
250 elog(ERROR, "yylex_init() failed: %m");
#define elog(elevel,...)
Definition elog.h:226
251
252 yyscanner = *yyscannerp;
253
254 initStringInfo(&yyext->litbuf);
255 pgpa_yyset_extra(yyext, yyscanner);
void initStringInfo(StringInfo str)
Definition stringinfo.c:97
256
257 yy_scan_string(str, yyscanner);
const char * str
258}

References elog, ERROR, fb(), initStringInfo(), palloc0_object, and str.

◆ pgpa_yyerror()

void pgpa_yyerror ( List **  result,
char **  parse_error_msg_p,
yyscan_t  yyscanner,
const char message 
)

Definition at line 221 of file pgpa_scanner.l.

223{
224 struct yyguts_t *yyg = (struct yyguts_t *) yyscanner; /* needed for yytext
225 * macro */
226
227
228 /* report only the first error in a parse operation */
230 return;
231
232 if (yytext[0])
233 *parse_error_msg_p = psprintf("%s at or near \"%s\"", message, yytext);
234 else
235 *parse_error_msg_p = psprintf("%s at end of input", message);
char * psprintf(const char *fmt,...)
Definition psprintf.c:43
236}

References fb(), and psprintf().

◆ yyalloc()

void * yyalloc ( yy_size_t  size,
yyscan_t  yyscanner 
)

Definition at line 278 of file pgpa_scanner.l.

279{
280 return palloc(size);
void * palloc(Size size)
Definition mcxt.c:1387
281}

References palloc().

◆ yyfree()

void yyfree ( void ptr,
yyscan_t  yyscanner 
)

Definition at line 293 of file pgpa_scanner.l.

294{
295 if (ptr)
296 pfree(ptr);
void pfree(void *pointer)
Definition mcxt.c:1616
297}

References pfree().

◆ yylex()

int yylex ( YYSTYPE yylval_param,
yyscan_t  yyscanner 
)

Definition at line 99 of file pgpa_scanner.l.

101{whitespace} { /* ignore */ }
102
103{identifier} {
104 char *str;
105 bool fail;
pgpa_advice_tag_type
Definition pgpa_ast.h:81
107
108 /*
109 * Unlike the core scanner, we don't truncate identifiers
110 * here. There is no obvious reason to do so.
111 */
112 str = downcase_identifier(yytext, yyleng, false, false);
113 yylval->str = str;
#define yyleng
Definition scan.l:1099
char * downcase_identifier(const char *ident, int len, bool warn, bool truncate)
Definition scansup.c:47
114
115 /*
116 * If it's not a tag, just return TOK_IDENT; else, return
117 * a token type based on how further parsing should
118 * proceed.
119 */
121 if (fail)
122 return TOK_IDENT;
123 else if (tag == PGPA_TAG_JOIN_ORDER)
124 return TOK_TAG_JOIN_ORDER;
125 else if (tag == PGPA_TAG_INDEX_SCAN ||
127 return TOK_TAG_INDEX;
128 else if (tag == PGPA_TAG_SEQ_SCAN ||
129 tag == PGPA_TAG_TID_SCAN ||
131 tag == PGPA_TAG_NO_GATHER)
132 return TOK_TAG_SIMPLE;
133 else
134 return TOK_TAG_GENERIC;
135 }
pgpa_advice_tag_type pgpa_parse_advice_tag(const char *tag, bool *fail)
Definition pgpa_ast.c:85
@ PGPA_TAG_INDEX_SCAN
Definition pgpa_ast.h:88
@ PGPA_TAG_BITMAP_HEAP_SCAN
Definition pgpa_ast.h:82
@ PGPA_TAG_NO_GATHER
Definition pgpa_ast.h:95
@ PGPA_TAG_INDEX_ONLY_SCAN
Definition pgpa_ast.h:87
@ PGPA_TAG_SEQ_SCAN
Definition pgpa_ast.h:99
@ PGPA_TAG_JOIN_ORDER
Definition pgpa_ast.h:89
@ PGPA_TAG_TID_SCAN
Definition pgpa_ast.h:100
136
137{decinteger} {
138 char *endptr;
139
140 errno = 0;
141 yylval->integer = strtoint(yytext, &endptr, 10);
142 if (*endptr != '\0' || errno == ERANGE)
143 pgpa_yyerror(result, parse_error_msg_p, yyscanner,
144 "integer out of range");
145 return TOK_INTEGER;
146 }
void pgpa_yyerror(List **result, char **parse_error_msg_p, yyscan_t yyscanner, const char *message)
int strtoint(const char *pg_restrict str, char **pg_restrict endptr, int base)
Definition string.c:50
147
148{xcstart} {
149 BEGIN(xc);
150 }
151
152{xdstart} {
153 BEGIN(xd);
154 resetStringInfo(&yyextra->litbuf);
155 }
#define yyextra
Definition scan.l:1093
void resetStringInfo(StringInfo str)
Definition stringinfo.c:126
156
157. { return yytext[0]; }
158
159<xc>{xcstop} {
160 BEGIN(INITIAL);
161 }
162
163<xc>{xcinside} {
164 /* discard multiple characters without slash or asterisk */
165 }
166
167<xc>. {
168 /*
169 * Discard any single character. flex prefers longer
170 * matches, so this rule will never be picked when we could
171 * have matched xcstop.
172 *
173 * NB: At present, we don't bother to support nested
174 * C-style comments here, but this logic could be extended
175 * if that restriction poses a problem.
176 */
177 }
178
179<xc><<EOF>> {
180 BEGIN(INITIAL);
181 pgpa_yyerror(result, parse_error_msg_p, yyscanner,
182 "unterminated comment");
183 }
184
185<xd>{xdstop} {
186 BEGIN(INITIAL);
187 if (yyextra->litbuf.len == 0)
188 pgpa_yyerror(result, parse_error_msg_p, yyscanner,
189 "zero-length delimited identifier");
190 yylval->str = pstrdup(yyextra->litbuf.data);
191 return TOK_IDENT;
192 }
char * pstrdup(const char *in)
Definition mcxt.c:1781
193
194<xd>{xddouble} {
195 appendStringInfoChar(&yyextra->litbuf, '"');
196 }
void appendStringInfoChar(StringInfo str, char ch)
Definition stringinfo.c:242
197
198<xd>{xdinside} {
200 }
void appendBinaryStringInfo(StringInfo str, const void *data, int datalen)
Definition stringinfo.c:281
201
202<xd><<EOF>> {
203 BEGIN(INITIAL);
204 pgpa_yyerror(result, parse_error_msg_p, yyscanner,
205 "unterminated quoted identifier");
206 }
207
208%%

◆ yyrealloc()

void * yyrealloc ( void ptr,
yy_size_t  size,
yyscan_t  yyscanner 
)

Definition at line 284 of file pgpa_scanner.l.

285{
286 if (ptr)
287 return repalloc(ptr, size);
288 else
289 return palloc(size);
void * repalloc(void *pointer, Size size)
Definition mcxt.c:1632
290}

References palloc(), and repalloc().