in src/backend/parser/cypher_parser.c [28:138]
int cypher_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, ag_scanner_t scanner)
{
/*
* This list must match ag_token_type.
* 0 means end-of-input.
*/
const int type_map[] = {
0,
INTEGER,
DECIMAL,
STRING,
IDENTIFIER,
PARAMETER,
NOT_EQ,
LT_EQ,
GT_EQ,
DOT_DOT,
TYPECAST,
PLUS_EQ,
EQ_TILDE,
LEFT_CONTAINS,
RIGHT_CONTAINS,
ACCESS_PATH,
ANY_EXISTS,
ALL_EXISTS,
CONCAT,
CHAR,
BQIDENT
};
ag_token token;
token = ag_scanner_next_token(scanner);
switch (token.type)
{
case AG_TOKEN_NULL:
break;
case AG_TOKEN_INTEGER:
lvalp->integer = token.value.i;
break;
case AG_TOKEN_DECIMAL:
case AG_TOKEN_STRING:
lvalp->string = pstrdup(token.value.s);
break;
case AG_TOKEN_IDENTIFIER:
{
int kwnum;
char *ident;
kwnum = ScanKeywordLookup(token.value.s, &CypherKeyword);
if (kwnum >= 0)
{
/*
* use token.value.s instead of keyword->name to preserve
* case sensitivity
*/
lvalp->keyword = GetScanKeyword(kwnum, &CypherKeyword);
ident = pstrdup(token.value.s);
truncate_identifier(ident, strlen(ident), true);
lvalp->string = ident;
*llocp = token.location;
return CypherKeywordTokens[kwnum];
}
ident = pstrdup(token.value.s);
truncate_identifier(ident, strlen(ident), true);
lvalp->string = ident;
break;
}
case AG_TOKEN_BQIDENT:
{
char *ident;
/* these are identifiers, just back ticked */
token.type = AG_TOKEN_IDENTIFIER;
ident = pstrdup(token.value.s);
truncate_identifier(ident, strlen(ident), true);
lvalp->string = ident;
break;
}
case AG_TOKEN_PARAMETER:
lvalp->string = pstrdup(token.value.s);
break;
case AG_TOKEN_LT_GT:
case AG_TOKEN_LT_EQ:
case AG_TOKEN_GT_EQ:
case AG_TOKEN_DOT_DOT:
case AG_TOKEN_PLUS_EQ:
case AG_TOKEN_EQ_TILDE:
case AG_TOKEN_ACCESS_PATH:
case AG_TOKEN_ALL_EXISTS:
case AG_TOKEN_ANY_EXISTS:
case AG_TOKEN_LEFT_CONTAINS:
case AG_TOKEN_RIGHT_CONTAINS:
case AG_TOKEN_CONCAT:
break;
case AG_TOKEN_TYPECAST:
break;
case AG_TOKEN_CHAR:
*llocp = token.location;
return token.value.c;
default:
ereport(ERROR, (errmsg("unexpected ag_token_type: %d", token.type)));
break;
}
*llocp = token.location;
return type_map[token.type];
}