You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AQuery/monetdb/msvc/sql_scan.h

69 lines
2.6 KiB

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V.
*/
#ifndef _SQL_SCAN_H_
#define _SQL_SCAN_H_
#include "sql_mem.h"
#include "sql_list.h"
#include "stream.h"
typedef enum { LINE_1, LINE_N } prot;
struct scanner {
bstream *rs;
stream *ws;
stream *log;
int yynext; /* next token, lr(1) isn't powerful enough for sql */
int yylast; /* previous token, to detect superfluous semi-colons */
int yyval; /* current token */
size_t yysval; /* start of current token */
size_t yycur; /* next char in the queue */
size_t as; /* start of query part of view's etc */
char yybak; /* sometimes it's needed to write an EOS marker */
int started; /* found at least one token */
prot mode; /* which mode (line (1,N), blocked) */
char *schema; /* Keep schema name of create statement, needed AUTO_INCREMENT, SERIAL */
char *errstr; /* error message from the bowels of the scanner */
/* Currently, MonetDB interprets \ specially in strings. This is contrary
* to the SQL standard. The default behavior of the reader is controlled by
* ``raw_strings`` mserver5 option (``--set raw_strings=<true|false>``) and
* the database property of the same name of merovingian (``monetdb set
* raw_strings=yes <database>``). If it is ``true`` by default the reader
* interprets strings as specified in the SQL standard, i.e. no
* interpretation of the \ characters. If it is ``false`` \ characters are
* used for escaping.
*
* The default value of this setting is false as of the Jul2021 release,
* i.e. MonetDB by default interprets \ in strings.
*
* In case that we are interpreting \ in strings, we need state in the
* scanner so that we Do The Right Thing (TM) when we get a unicode string
* split up in multiple parts (i.e. U&'string1' 'string2') where the second
* and subsequent string MUST NOT undergo \ interpretation.
*
* Because we need to be backward compatible (i.e. we need have ``select
* char_length('a\nb')`` return 3) the next 2 members will probably stay for
* the forseeable future.
*/
bool next_string_is_raw;
bool raw_string_mode;
};
#define QUERY(scanner) (scanner.rs->buf+scanner.rs->pos)
extern char *query_cleaned(sql_allocator *sa, const char *query);
extern void scanner_init(struct scanner *s, bstream *rs, stream *ws);
sql_export void scanner_query_processed(struct scanner *s);
extern int scanner_init_keywords(void);
#endif /* _SQL_SCAN_H_ */