Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
23db70bf
Commit
23db70bf
authored
Sep 08, 1997
by
Bruce Momjian
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Lex/yacc source cleanup like indent.
parent
319dbfa7
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2725 additions
and
2714 deletions
+2725
-2714
src/backend/bootstrap/bootparse.y
src/backend/bootstrap/bootparse.y
+213
-205
src/backend/bootstrap/bootscanner.l
src/backend/bootstrap/bootscanner.l
+60
-60
src/backend/parser/gram.y
src/backend/parser/gram.y
+2263
-2260
src/backend/parser/scan.l
src/backend/parser/scan.l
+186
-186
src/lextest/scan.l
src/lextest/scan.l
+3
-3
No files found.
src/backend/bootstrap/bootparse.y
View file @
23db70bf
...
...
@@ -2,13 +2,13 @@
/*-------------------------------------------------------------------------
*
* backendparse.y--
*
yacc parser grammer for the "backend" initialization program.
*
yacc parser grammer for the "backend" initialization program.
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
*
$Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.4 1996/11/13 20:47:45 scrappy
Exp $
*
$Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.5 1997/09/08 03:19:50 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -16,11 +16,11 @@
#include "postgres.h"
#include "catalog/pg_attribute.h"
#include "access/attnum.h"
#include "access/attnum.h"
#include "nodes/pg_list.h"
#include "access/tupdesc.h"
#include "access/tupdesc.h"
#include "storage/fd.h"
#include "catalog/pg_am.h"
#include "catalog/pg_am.h"
#include "catalog/pg_class.h"
#include "nodes/nodes.h"
#include "rewrite/prs2lock.h"
...
...
@@ -57,24 +57,27 @@
#include "miscadmin.h"
#define DO_START { StartTransactionCommand();\
}
#define DO_START { \
StartTransactionCommand();\
}
#define DO_END { CommitTransactionCommand();\
if (!Quiet) { EMITPROMPT; }\
fflush(stdout); \
}
#define DO_END { \
CommitTransactionCommand();\
if (!Quiet) { EMITPROMPT; }\
fflush(stdout); \
}
int num_tuples_read = 0;
static Oid objectid;
%}
%union {
List *list;
IndexElem *ielem;
char *str;
int ival;
%union
{
List *list;
IndexElem *ielem;
char *str;
int ival;
}
%type <list> arg_list
...
...
@@ -84,7 +87,7 @@ static Oid objectid;
%token <ival> CONST ID
%token OPEN XCLOSE XCREATE INSERT_TUPLE
%token STRING XDEFINE
%token STRING XDEFINE
%token XDECLARE INDEX ON USING XBUILD INDICES
%token COMMA EQUALS LPAREN RPAREN
%token OBJ_ID XBOOTSTRAP NULLVAL
...
...
@@ -96,228 +99,233 @@ static Oid objectid;
%%
TopLevel:
Queries
|
;
Queries
|
;
Queries:
Query
| Queries Query
;
Query
| Queries Query
;
Query :
OpenStmt
| CloseStmt
| CreateStmt
| InsertStmt
| DeclareIndexStmt
| BuildIndsStmt
;
OpenStmt:
OPEN ident
{
DO_START;
boot_openrel(LexIDStr($2));
DO_END;
}
;
OpenStmt
| CloseStmt
| CreateStmt
| InsertStmt
| DeclareIndexStmt
| BuildIndsStmt
;
OpenStmt:
OPEN ident
{
DO_START;
boot_openrel(LexIDStr($2));
DO_END;
}
;
CloseStmt:
XCLOSE ident %prec low
{
DO_START;
closerel(LexIDStr($2));
DO_END;
}
| XCLOSE %prec high
{
DO_START;
closerel(NULL);
DO_END;
}
;
XCLOSE ident %prec low
{
DO_START;
closerel(LexIDStr($2));
DO_END;
}
| XCLOSE %prec high
{
DO_START;
closerel(NULL);
DO_END;
}
;
CreateStmt:
XCREATE optbootstrap ident LPAREN
{
DO_START;
numattr=(int)0;
}
typelist
{
if (!Quiet) putchar('\n');
DO_END;
}
RPAREN
{
DO_START;
if ($2) {
extern Relation reldesc;
TupleDesc tupdesc;
if (reldesc) {
puts("create bootstrap: Warning, open relation");
puts("exists, closing first");
closerel(NULL);
}
if (DebugMode)
puts("creating bootstrap relation");
tupdesc = CreateTupleDesc(numattr,attrtypes);
reldesc = heap_creatr(LexIDStr($3),
DEFAULT_SMGR,
tupdesc);
if (DebugMode)
puts("bootstrap relation created ok");
} else {
Oid id;
TupleDesc tupdesc;
/* extern Oid heap_create();*/
tupdesc = CreateTupleDesc(numattr,attrtypes);
id = heap_create(LexIDStr($3),
NULL,
'n',
DEFAULT_SMGR,
tupdesc);
if (!Quiet)
printf("CREATED relation %s with OID %d\n",
LexIDStr($3), id);
}
DO_END;
if (DebugMode)
puts("Commit End");
}
;
XCREATE optbootstrap ident LPAREN
{
DO_START;
numattr=(int)0;
}
typelist
{
if (!Quiet)
putchar('\n');
DO_END;
}
RPAREN
{
DO_START;
if ($2)
{
extern Relation reldesc;
TupleDesc tupdesc;
if (reldesc)
{
puts("create bootstrap: Warning, open relation");
puts("exists, closing first");
closerel(NULL);
}
if (DebugMode)
puts("creating bootstrap relation");
tupdesc = CreateTupleDesc(numattr,attrtypes);
reldesc = heap_creatr(LexIDStr($3),
DEFAULT_SMGR,
tupdesc);
if (DebugMode)
puts("bootstrap relation created ok");
}
else
{
Oid id;
TupleDesc tupdesc;
/* extern Oid heap_create();*/
tupdesc = CreateTupleDesc(numattr,attrtypes);
id = heap_create(LexIDStr($3),
NULL,
'n',
DEFAULT_SMGR,
tupdesc);
if (!Quiet)
printf("CREATED relation %s with OID %d\n",
LexIDStr($3), id);
}
DO_END;
if (DebugMode)
puts("Commit End");
}
;
InsertStmt:
INSERT_TUPLE optoideq
{
DO_START;
if (DebugMode)
printf("tuple %d<", $2);
num_tuples_read = 0;
}
LPAREN tuplelist RPAREN
{
if (num_tuples_read != numattr)
elog(WARN,"incorrect number of values for tuple");
if (reldesc == (Relation)NULL) {
elog(WARN,"must OPEN RELATION before INSERT\n");
err_out();
}
if (DebugMode)
puts("Insert Begin");
objectid = $2;
InsertOneTuple(objectid);
if (DebugMode)
puts("Insert End");
if (!Quiet) { putchar('\n'); }
DO_END;
if (DebugMode)
puts("Transaction End");
}
;
INSERT_TUPLE optoideq
{
DO_START;
if (DebugMode)
printf("tuple %d<", $2);
num_tuples_read = 0;
}
LPAREN tuplelist RPAREN
{
if (num_tuples_read != numattr)
elog(WARN,"incorrect number of values for tuple");
if (reldesc == (Relation)NULL)
{
elog(WARN,"must OPEN RELATION before INSERT\n");
err_out();
}
if (DebugMode)
puts("Insert Begin");
objectid = $2;
InsertOneTuple(objectid);
if (DebugMode)
puts("Insert End");
if (!Quiet)
putchar('\n');
DO_END;
if (DebugMode)
puts("Transaction End");
}
;
DeclareIndexStmt:
XDECLARE INDEX ident ON ident USING ident LPAREN index_params RPAREN
{
List *params;
XDECLARE INDEX ident ON ident USING ident LPAREN index_params RPAREN
{
List *params;
DO_START;
DO_START;
params = lappend(NIL, (List*)$9);
DefineIndex(LexIDStr($5),
LexIDStr($3),
LexIDStr($7),
params, NIL, 0, 0, NIL);
DO_END;
}
;
params = lappend(NIL, (List*)$9);
DefineIndex(LexIDStr($5),
LexIDStr($3),
LexIDStr($7),
params, NIL, 0, 0, NIL);
DO_END;
}
;
BuildIndsStmt:
XBUILD INDICES
{ build_indices(); }
XBUILD INDICES
{ build_indices(); }
index_params:
index_on ident
{
IndexElem *n = (IndexElem*)$1;
n->class = LexIDStr($2);
$$ = n;
}
index_on ident
{
IndexElem *n = (IndexElem*)$1;
n->class = LexIDStr($2);
$$ = n;
}
index_on:
ident
{
IndexElem *n = makeNode(IndexElem);
n->name = LexIDStr($1);
$$ = n;
}
| ident LPAREN arg_list RPAREN
{
IndexElem *n = makeNode(IndexElem);
n->name = LexIDStr($1);
n->args = (List*)$3;
$$ = n;
}
ident
{
IndexElem *n = makeNode(IndexElem);
n->name = LexIDStr($1);
$$ = n;
}
| ident LPAREN arg_list RPAREN
{
IndexElem *n = makeNode(IndexElem);
n->name = LexIDStr($1);
n->args = (List*)$3;
$$ = n;
}
arg_list:
ident
{
$$ = lappend(NIL, makeString(LexIDStr($1)));
}
| arg_list COMMA ident
{
$$ = lappend((List*)$1, makeString(LexIDStr($3)));
}
ident
{
$$ = lappend(NIL, makeString(LexIDStr($1)));
}
| arg_list COMMA ident
{
$$ = lappend((List*)$1, makeString(LexIDStr($3)));
}
optbootstrap:
XBOOTSTRAP { $$ = 1; }
|
{ $$ = 0; }
;
XBOOTSTRAP { $$ = 1; }
|
{ $$ = 0; }
;
typelist:
typething
| typelist COMMA typething
;
typething
| typelist COMMA typething
;
typething:
ident EQUALS ident
{
if(++numattr > MAXATTR)
elog(FATAL,"Too many attributes\n");
DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
if (DebugMode)
printf("\n");
}
;
ident EQUALS ident
{
if(++numattr > MAXATTR)
elog(FATAL,"Too many attributes\n");
DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
if (DebugMode)
printf("\n");
}
;
optoideq:
OBJ_ID EQUALS ident { $$ = atol(LexIDStr($3));
}
|
{ extern Oid newoid(); $$ = newoid(); }
;
OBJ_ID EQUALS ident { $$ = atol(LexIDStr($3));
}
|
{ extern Oid newoid(); $$ = newoid(); }
;
tuplelist:
tuple
| tuplelist tuple
| tuplelist COMMA tuple
;
tuple
| tuplelist tuple
| tuplelist COMMA tuple
;
tuple:
ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
| const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
| NULLVAL
{ InsertOneNull(num_tuples_read++); }
;
ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
| const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
| NULLVAL
{ InsertOneNull(num_tuples_read++); }
;
const :
CONST { $$=yylval.ival; }
;
CONST { $$=yylval.ival; }
;
ident :
ID { $$=yylval.ival; }
;
ID { $$=yylval.ival; }
;
%%
src/backend/bootstrap/bootscanner.l
View file @
23db70bf
...
...
@@ -2,13 +2,13 @@
/*-------------------------------------------------------------------------
*
* bootscanner.lex--
*
a lexical scanner for the bootstrap parser
*
a lexical scanner for the bootstrap parser
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
*
$Header: /cvsroot/pgsql/src/backend/bootstrap/bootscanner.l,v 1.6 1997/01/10 20:16:26
momjian Exp $
*
$Header: /cvsroot/pgsql/src/backend/bootstrap/bootscanner.l,v 1.7 1997/09/08 03:19:53
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -29,7 +29,7 @@
#include "storage/fd.h"
#include "catalog/pg_am.h"
#include "catalog/pg_class.h"
#include "nodes/nodes.h"
#include "nodes/nodes.h"
#include "rewrite/prs2lock.h"
#include "access/skey.h"
#include "access/strat.h"
...
...
@@ -38,7 +38,7 @@
#include "nodes/primnodes.h"
#include "utils/nabstime.h"
#include "access/htup.h"
#include "access/htup.h"
#include "utils/tqual.h"
#include "nodes/parsenodes.h"
...
...
@@ -46,82 +46,82 @@
#include "bootstrap_tokens.h"
#define YY_NO_UNPUT
#define
YY_NO_UNPUT
/* some versions of lex define this as a macro */
#if defined(yywrap)
#undef yywrap
#endif /* yywrap */
YYSTYPE
yylval;
int yyline; /* keep track of the line number for error reporting */
YYSTYPE
yylval;
int
yyline; /* keep track of the line number for error reporting */
%}
D [0-9]
oct
\\{D}{D}{D}
Exp [Ee][-+]?{D}+
id
([A-Za-z0-9_]|{oct}|\-)+
sid
\"([^\"])*\"
arrayid
[A-Za-z0-9_]+\[{D}*\]
D
[0-9]
oct
\\{D}{D}{D}
Exp
[Ee][-+]?{D}+
id
([A-Za-z0-9_]|{oct}|\-)+
sid
\"([^\"])*\"
arrayid
[A-Za-z0-9_]+\[{D}*\]
%%
open
{ return(OPEN); }
open
{ return(OPEN); }
close { return(XCLOSE); }
close
{ return(XCLOSE); }
create { return(XCREATE); }
create
{ return(XCREATE); }
OID
{ return(OBJ_ID); }
bootstrap { return(XBOOTSTRAP); }
_null_ { return(NULLVAL); }
OID
{ return(OBJ_ID); }
bootstrap
{ return(XBOOTSTRAP); }
_null_
{ return(NULLVAL); }
insert { return(INSERT_TUPLE); }
insert
{ return(INSERT_TUPLE); }
","
{ return(COMMA); }
"=" { return(EQUALS); }
"(" { return(LPAREN); }
")" { return(RPAREN); }
","
{ return(COMMA); }
"="
{ return(EQUALS); }
"("
{ return(LPAREN); }
")"
{ return(RPAREN); }
[\n]
{ yyline++; }
[\t] ;
" "
;
[\n]
{ yyline++; }
[\t]
;
" "
;
^\#[^\n]* ; /* drop everything after "#" for comments */
"declare" { return(XDECLARE); }
"build" { return(XBUILD); }
"indices" { return(INDICES); }
"index" { return(INDEX); }
"on" { return(ON); }
"using" { return(USING); }
{arrayid} {
yylval.ival = EnterString(MapArrayTypeName((char*)yytext));
return(ID);
}
{id}
{
yylval.ival = EnterString(scanstr((char*)yytext));
return(ID);
}
{sid} {
yytext[strlen(yytext)-1] = '\0'; /* strip off quotes */
yylval.ival = EnterString(scanstr((char*)yytext+1));
yytext[strlen(yytext)] = '"'; /* restore quotes */
return(ID);
}
(-)?{D}+"."{D}*({Exp})?
|
(-)?{D}*"."{D}+({Exp})?
|
(-)?{D}+{Exp} {
yylval.ival = EnterString((char*)yytext);
return(CONST);
}
. {
printf("syntax error %d : -> %s\n", yyline, yytext);
}
"declare"
{ return(XDECLARE); }
"build"
{ return(XBUILD); }
"indices"
{ return(INDICES); }
"index"
{ return(INDEX); }
"on"
{ return(ON); }
"using"
{ return(USING); }
{arrayid}
{
yylval.ival = EnterString(MapArrayTypeName((char*)yytext));
return(ID);
}
{id}
{
yylval.ival = EnterString(scanstr((char*)yytext));
return(ID);
}
{sid}
{
yytext[strlen(yytext)-1] = '\0'; /* strip off quotes */
yylval.ival = EnterString(scanstr((char*)yytext+1));
yytext[strlen(yytext)] = '"'; /* restore quotes */
return(ID);
}
(-)?{D}+"."{D}*({Exp})?
|
(-)?{D}*"."{D}+({Exp})?
|
(-)?{D}+{Exp}
{
yylval.ival = EnterString((char*)yytext);
return(CONST);
}
.
{
printf("syntax error %d : -> %s\n", yyline, yytext);
}
...
...
@@ -130,11 +130,11 @@ insert { return(INSERT_TUPLE); }
int
yywrap(void)
{
return 1;
return 1;
}
void
yyerror(const char *str)
{
fprintf(stderr,"\tsyntax error %d : %s",yyline, str);
fprintf(stderr,"\tsyntax error %d : %s",yyline, str);
}
src/backend/parser/gram.y
View file @
23db70bf
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/backend/parser/scan.l
View file @
23db70bf
...
...
@@ -2,13 +2,13 @@
/*-------------------------------------------------------------------------
*
* scan.l--
*
lexical scanner for POSTGRES
*
lexical scanner for POSTGRES
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
*
$Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.18 1997/09/05 09:05:48 vadim
Exp $
*
$Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.19 1997/09/08 03:20:04 momjian
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -64,207 +64,207 @@ int llen;
char literal[MAX_PARSE_BUFFER];
%}
/* OK, here is a short description of lex/flex rules behavior.
* The longest pattern which matches an input string is always chosen.
* For equal-length patterns, the first occurring in the rules list is chosen.
* INITIAL is the starting condition, to which all non-conditional rules apply.
* <xc> is an exclusive condition to allow embedded C-style comments.
* When in an exclusive condition, only those rules defined for that condition apply.
* So, when in condition <xc>, only strings which would terminate the "extended comment"
*
trigger any action other than "ignore".
* The "extended comment" syntax closely resembles allowable operator syntax.
* Therefore, be sure to match _any_ candidate comment, including those with appended
*
operator-like symbols. - thomas 1997-07-14
*/
/* define an exclusive condition to allow extended C-style comments - tgl 1997-07-12 */
/* OK, here is a short description of lex/flex rules behavior.
* The longest pattern which matches an input string is always chosen.
* For equal-length patterns, the first occurring in the rules list is chosen.
* INITIAL is the starting condition, to which all non-conditional rules apply.
* <xc> is an exclusive condition to allow embedded C-style comments.
* When in an exclusive condition, only those rules defined for that condition apply.
* So, when in condition <xc>, only strings which would terminate the "extended comment"
*
trigger any action other than "ignore".
* The "extended comment" syntax closely resembles allowable operator syntax.
* Therefore, be sure to match _any_ candidate comment, including those with appended
*
operator-like symbols. - thomas 1997-07-14
*/
/* define an exclusive condition to allow extended C-style comments - tgl 1997-07-12 */
%x xc
/* define an exclusive condition for quoted strings - tgl 1997-07-30 */
/* define an exclusive condition for quoted strings - tgl 1997-07-30 */
%x xq
/* We used to allow double-quoted strings, but SQL doesn't so we won't either */
quote
'
xqstart {quote}
xqstop {quote}
xqdouble {quote}{quote}
xqinside [^\']*
xqliteral [\\].
/* We used to allow double-quoted strings, but SQL doesn't so we won't either */
quote
'
xqstart
{quote}
xqstop
{quote}
xqdouble
{quote}{quote}
xqinside
[^\']*
xqliteral
[\\].
xcline [\/][\*].*[\*][\/]{space}*\n*
xcstart [\/][\*]{op_and_self}*
xcstop {op_and_self}*[\*][\/]({space}*|\n)
xcinside [^*]*
xcstar [^/]
xcline
[\/][\*].*[\*][\/]{space}*\n*
xcstart
[\/][\*]{op_and_self}*
xcstop
{op_and_self}*[\*][\/]({space}*|\n)
xcinside
[^*]*
xcstar
[^/]
digit [0-9]
letter [_A-Za-z]
letter_or_digit
[_A-Za-z0-9]
digit
[0-9]
letter
[_A-Za-z]
letter_or_digit
[_A-Za-z0-9]
sysfunc SYS_{letter}{letter_or_digit}*
sysfunc
SYS_{letter}{letter_or_digit}*
identifier {letter}{letter_or_digit}*
identifier
{letter}{letter_or_digit}*
typecast "::"
typecast
"::"
self [,()\[\].;$\:\+\-\*\/\<\>\=\|]
selfm {self}[\-][\.0-9]
self
[,()\[\].;$\:\+\-\*\/\<\>\=\|]
selfm
{self}[\-][\.0-9]
op_and_self [\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=]
op_and_self
[\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=]
operator {op_and_self}+
operatorm {op_and_self}+[\-][\.0-9]
operator
{op_and_self}+
operatorm
{op_and_self}+[\-][\.0-9]
integer -?{digit}+
real -?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
integer
-?{digit}+
real
-?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
param \${integer}
param
\${integer}
comment "--".*\n
comment2 "//".*\n
comment
"--".*\n
comment2
"//".*\n
space [ \t\n\f]
other .
space
[ \t\n\f]
other
.
%%
{sysfunc} {
yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
return (SCONST);
}
{sysfunc}
{
yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
return (SCONST);
}
{comment} { /* ignore */ }
{comment2} { /* ignore */ }
{comment}
{ /* ignore */ }
{comment2}
{ /* ignore */ }
{xcline} { /* ignore */ }
{xcline}
{ /* ignore */ }
<xc>{xcstar} |
{xcstart} { BEGIN(xc); }
{xcstart}
{ BEGIN(xc); }
<xc>{xcstop} { BEGIN(INITIAL); }
<xc>{xcinside} { /* ignore */ }
{xqstart} {
BEGIN(xq);
llen = 0;
*literal = '\0';
}
BEGIN(xq);
llen = 0;
*literal = '\0';
}
<xq>{xqstop} {
BEGIN(INITIAL);
yylval.str = pstrdup(scanstr(literal));
return (SCONST);
}
BEGIN(INITIAL);
yylval.str = pstrdup(scanstr(literal));
return (SCONST);
}
<xq>{xqdouble} |
<xq>{xqinside} {
if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1)) {
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
/* not reached */
}
memcpy(literal+llen, yytext, yyleng+1);
llen += yyleng;
}
<xq>{xqliteral} {
if ((llen+yyleng-1) > (MAX_PARSE_BUFFER - 1)) {
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
/* not reached */
}
memcpy(literal+llen, yytext+1, yyleng);
llen += yyleng-1;
}
{typecast} { return TYPECAST; }
{selfm} {
yyless(yyleng-2);
return (yytext[0]);
}
{self} { return (yytext[0]); }
{operatorm} {
yyless(yyleng-2);
yylval.str = pstrdup((char*)yytext);
return (Op);
}
{operator} {
if (strcmp((char*)yytext,"!=") == 0)
yylval.str = pstrdup("<>"); /* compatability */
else
yylval.str = pstrdup((char*)yytext);
return (Op);
}
{param} { yylval.ival = atoi((char*)&yytext[1]);
return (PARAM);
}
{integer} {
yylval.ival = atoi((char*)yytext);
return (ICONST);
}
{real} {
char* endptr;
errno = 0;
yylval.dval = strtod(((char *)yytext),&endptr);
if (*endptr != '\0' || errno == ERANGE)
elog(WARN,"\tBad float8 input format\n");
CheckFloat8Val(yylval.dval);
return (FCONST);
}
if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1))
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
memcpy(literal+llen, yytext, yyleng+1);
llen += yyleng;
}
<xq>{xqliteral} {
if ((llen+yyleng-1) > (MAX_PARSE_BUFFER - 1))
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
memcpy(literal+llen, yytext+1, yyleng);
llen += yyleng-1;
}
{typecast} { return TYPECAST; }
{selfm} {
yyless(yyleng-2);
return (yytext[0]);
}
{self} { return (yytext[0]); }
{operatorm} {
yyless(yyleng-2);
yylval.str = pstrdup((char*)yytext);
return (Op);
}
{operator} {
if (strcmp((char*)yytext,"!=") == 0)
yylval.str = pstrdup("<>"); /* compatability */
else
yylval.str = pstrdup((char*)yytext);
return (Op);
}
{param} {
yylval.ival = atoi((char*)&yytext[1]);
return (PARAM);
}
{integer} {
yylval.ival = atoi((char*)yytext);
return (ICONST);
}
{real} {
char* endptr;
errno = 0;
yylval.dval = strtod(((char *)yytext),&endptr);
if (*endptr != '\0' || errno == ERANGE)
elog(WARN,"\tBad float8 input format\n");
CheckFloat8Val(yylval.dval);
return (FCONST);
}
{identifier} {
int i;
ScanKeyword *keyword;
for(i = strlen(yytext); i >= 0; i--)
if (isupper(yytext[i]))
yytext[i] = tolower(yytext[i]);
keyword = ScanKeywordLookup((char*)yytext);
if (keyword != NULL) {
if ( keyword->value == DEFAULT ) {
DefaultStartPosition = CurScanPosition () + yyleng + 1;
printf( "default offset is %d\n", DefaultStartPosition);
} else if ( keyword->value == CHECK ) {
CheckStartPosition = CurScanPosition () + yyleng + 1;
printf( "check offset is %d\n", CheckStartPosition);
};
return (keyword->value);
} else {
yylval.str = pstrdup((char*)yytext);
return (IDENT);
}
}
{space} { /* ignore */ }
{other} { return (yytext[0]); }
int i;
ScanKeyword *keyword;
for(i = strlen(yytext); i >= 0; i--)
if (isupper(yytext[i]))
yytext[i] = tolower(yytext[i]);
keyword = ScanKeywordLookup((char*)yytext);
if (keyword != NULL) {
if ( keyword->value == DEFAULT )
{
DefaultStartPosition = CurScanPosition () + yyleng + 1;
printf( "default offset is %d\n", DefaultStartPosition);
}
else if ( keyword->value == CHECK )
{
CheckStartPosition = CurScanPosition () + yyleng + 1;
printf( "check offset is %d\n", CheckStartPosition);
}
return (keyword->value);
}
else
{
yylval.str = pstrdup((char*)yytext);
return (IDENT);
}
}
{space} { /* ignore */ }
{other} { return (yytext[0]); }
%%
void yyerror(char message[])
{
elog(WARN, "parser: %s at or near \"%s\"\n", message, yytext);
elog(WARN, "parser: %s at or near \"%s\"\n", message, yytext);
}
int yywrap()
{
return(1);
return(1);
}
/*
init_io:
called by postgres before any actual parsing is done
called by postgres before any actual parsing is done
*/
void
init_io()
{
/* it's important to set this to NULL
because input()/myinput() checks the non-nullness of parseCh
to know when to pass the string to lex/flex */
parseCh = NULL;
/* it's important to set this to NULL
because input()/myinput() checks the non-nullness of parseCh
to know when to pass the string to lex/flex */
parseCh = NULL;
#if defined(FLEX_SCANNER)
if (YY_CURRENT_BUFFER)
yy_flush_buffer(YY_CURRENT_BUFFER);
if (YY_CURRENT_BUFFER)
yy_flush_buffer(YY_CURRENT_BUFFER);
#endif /* FLEX_SCANNER */
BEGIN INITIAL;
BEGIN INITIAL;
}
...
...
@@ -274,63 +274,63 @@ init_io()
int
input()
{
if (parseCh == NULL) {
parseCh = parseString;
return(*parseCh++);
} else if (*parseCh == '\0') {
return(0);
} else {
return(*parseCh++);
}
if (parseCh == NULL)
{
parseCh = parseString;
return(*parseCh++);
}
else if (*parseCh == '\0')
return(0);
else
return(*parseCh++);
}
/* undo lex input from a string instead of from stdin */
void
unput(char c)
{
if (parseCh == NULL) {
elog(FATAL, "Unput() failed.\n");
} else if (c != 0) {
*--parseCh = c;
}
if (parseCh == NULL)
elog(FATAL, "Unput() failed.\n");
else if (c != 0)
*--parseCh = c;
}
int
CurScanPosition(void)
{
return (parseCh - parseString - yyleng);
return (parseCh - parseString - yyleng);
}
#endif /* !defined(FLEX_SCANNER) */
#ifdef FLEX_SCANNER
/* input routine for flex to read input from a string instead of a file */
int
int
myinput(char* buf, int max)
{
int len, copylen;
if (parseCh == NULL) {
len = strlen(parseString);
if (len >= max)
copylen = max - 1;
int len, copylen;
if (parseCh == NULL)
{
len = strlen(parseString);
if (len >= max)
copylen = max - 1;
else
copylen = len;
if (copylen > 0)
memcpy(buf, parseString, copylen);
buf[copylen] = '\0';
parseCh = parseString;
return copylen;
}
else
copylen = len;
if (copylen > 0)
memcpy(buf, parseString, copylen);
buf[copylen] = '\0';
parseCh = parseString;
return copylen;
} else {
return 0; /* end of string */
}
return 0; /* end of string */
}
int
CurScanPosition(void)
{
printf( "current position is %d\n", yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
return (yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
printf( "current position is %d\n", yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
return (yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
}
#endif /* FLEX_SCANNER */
...
...
src/lextest/scan.l
View file @
23db70bf
%{
/*
This should work, but non-patched flex 2.5.3 fails because input()
doesn't return EOF or '\0'
Bruce Momjian <root@candle.pha.pa.us>
This should work, but non-patched flex 2.5.3 fails because input()
doesn't return EOF or '\0'
Bruce Momjian <root@candle.pha.pa.us>
*/
%}
%%
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment