Changeset: ec4cb4fec418 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ec4cb4fec418
Modified Files:
monetdb5/modules/atoms/pg_jsonpath/jsonpath_gram.y
monetdb5/modules/atoms/pg_jsonpath/jsonpath_scan.l
monetdb5/modules/atoms/pg_jsonpath/postgres_defines_internal.h
Branch: json-extend
Log Message:
use escontext->sa allocator in parser
diffs (truncated from 448 to 300 lines):
diff --git a/monetdb5/modules/atoms/pg_jsonpath/jsonpath_gram.y
b/monetdb5/modules/atoms/pg_jsonpath/jsonpath_gram.y
--- a/monetdb5/modules/atoms/pg_jsonpath/jsonpath_gram.y
+++ b/monetdb5/modules/atoms/pg_jsonpath/jsonpath_gram.y
@@ -17,20 +17,20 @@
#include "jsonpath_internal.h"
-static JsonPathParseItem *makeItemType(JsonPathItemType type);
-static JsonPathParseItem *makeItemString(JsonPathString *s);
-static JsonPathParseItem *makeItemVariable(JsonPathString *s);
-static JsonPathParseItem *makeItemKey(JsonPathString *s);
-static JsonPathParseItem *makeItemNumeric(JsonPathString *s);
-static JsonPathParseItem *makeItemBool(bool val);
-static JsonPathParseItem *makeItemBinary(JsonPathItemType type,
+static JsonPathParseItem *makeItemType(struct Node *escontext,
JsonPathItemType type);
+static JsonPathParseItem *makeItemString(struct Node *escontext,
JsonPathString *s);
+static JsonPathParseItem *makeItemVariable(struct Node *escontext,
JsonPathString *s);
+static JsonPathParseItem *makeItemKey(struct Node *escontext, JsonPathString
*s);
+static JsonPathParseItem *makeItemNumeric(struct Node *escontext,
JsonPathString *s);
+static JsonPathParseItem *makeItemBool(struct Node *escontext, bool val);
+static JsonPathParseItem *makeItemBinary(struct Node *escontext,
JsonPathItemType type,
JsonPathParseItem *la,
JsonPathParseItem *ra);
-static JsonPathParseItem *makeItemUnary(JsonPathItemType type,
+static JsonPathParseItem *makeItemUnary(struct Node *escontext,
JsonPathItemType type,
JsonPathParseItem *a);
static JsonPathParseItem *makeItemList(List *list);
-static JsonPathParseItem *makeIndexArray(List *list);
-static JsonPathParseItem *makeAny(int first, int last);
+static JsonPathParseItem *makeIndexArray(struct Node *escontext, List *list);
+static JsonPathParseItem *makeAny(struct Node *escontext, int first, int last);
/*
static bool makeItemLikeRegex(JsonPathParseItem *expr,
JsonPathString
*pattern,
@@ -44,8 +44,8 @@ static bool makeItemLikeRegex(JsonPathPa
* so we can easily have it use palloc instead of malloc. This prevents
* memory leaks if we error out during parsing.
*/
-#define YYMALLOC malloc
-#define YYFREE free
+#define YYMALLOC GDKmalloc
+#define YYFREE GDKfree
%}
@@ -113,7 +113,7 @@ static bool makeItemLikeRegex(JsonPathPa
result:
mode expr_or_predicate {
-
*result = palloc(sizeof(JsonPathParseResult));
+
*result = sa_alloc(escontext->sa, sizeof(JsonPathParseResult));
(*result)->expr = $2;
(*result)->lax = $1;
(void) yynerrs;
@@ -133,13 +133,13 @@ mode:
;
scalar_value:
- STRING_P { $$ =
makeItemString(&$1); }
- | NULL_P { $$ =
makeItemString(NULL); }
- | TRUE_P { $$ =
makeItemBool(true); }
- | FALSE_P { $$ =
makeItemBool(false); }
- | NUMERIC_P { $$ =
makeItemNumeric(&$1); }
- | INT_P { $$ =
makeItemNumeric(&$1); }
- | VARIABLE_P { $$ =
makeItemVariable(&$1); }
+ STRING_P { $$ =
makeItemString(escontext, &$1); }
+ | NULL_P { $$ =
makeItemString(escontext, NULL); }
+ | TRUE_P { $$ =
makeItemBool(escontext, true); }
+ | FALSE_P { $$ =
makeItemBool(escontext, false); }
+ | NUMERIC_P { $$ =
makeItemNumeric(escontext, &$1); }
+ | INT_P { $$ =
makeItemNumeric(escontext, &$1); }
+ | VARIABLE_P { $$ =
makeItemVariable(escontext, &$1); }
;
comp_op:
@@ -153,19 +153,19 @@ comp_op:
delimited_predicate:
'(' predicate ')' { $$ = $2; }
- | EXISTS_P '(' expr ')' { $$ = makeItemUnary(jpiExists,
$3); }
+ | EXISTS_P '(' expr ')' { $$ = makeItemUnary(escontext,
jpiExists, $3); }
;
predicate:
delimited_predicate { $$ = $1; }
- | expr comp_op expr { $$ =
makeItemBinary($2, $1, $3); }
- | predicate AND_P predicate { $$ = makeItemBinary(jpiAnd,
$1, $3); }
- | predicate OR_P predicate { $$ = makeItemBinary(jpiOr,
$1, $3); }
- | NOT_P delimited_predicate { $$ = makeItemUnary(jpiNot,
$2); }
+ | expr comp_op expr { $$ =
makeItemBinary(escontext, $2, $1, $3); }
+ | predicate AND_P predicate { $$ =
makeItemBinary(escontext, jpiAnd, $1, $3); }
+ | predicate OR_P predicate { $$ =
makeItemBinary(escontext, jpiOr, $1, $3); }
+ | NOT_P delimited_predicate { $$ = makeItemUnary(escontext,
jpiNot, $2); }
| '(' predicate ')' IS_P UNKNOWN_P
- { $$ =
makeItemUnary(jpiIsUnknown, $2); }
+ { $$ =
makeItemUnary(escontext, jpiIsUnknown, $2); }
| expr STARTS_P WITH_P starts_with_initial
- { $$ =
makeItemBinary(jpiStartsWith, $1, $4); }
+ { $$ =
makeItemBinary(escontext, jpiStartsWith, $1, $4); }
/*
| expr LIKE_REGEX_P STRING_P
{
@@ -185,15 +185,15 @@ predicate:
;
starts_with_initial:
- STRING_P { $$ =
makeItemString(&$1); }
- | VARIABLE_P { $$ =
makeItemVariable(&$1); }
+ STRING_P { $$ =
makeItemString(escontext, &$1); }
+ | VARIABLE_P { $$ =
makeItemVariable(escontext, &$1); }
;
path_primary:
scalar_value { $$ = $1; }
- | '$' { $$ =
makeItemType(jpiRoot); }
- | '@' { $$ =
makeItemType(jpiCurrent); }
- | LAST_P { $$ =
makeItemType(jpiLast); }
+ | '$' { $$ =
makeItemType(escontext, jpiRoot); }
+ | '@' { $$ =
makeItemType(escontext, jpiCurrent); }
+ | LAST_P { $$ =
makeItemType(escontext, jpiLast); }
;
accessor_expr:
@@ -206,18 +206,18 @@ accessor_expr:
expr:
accessor_expr { $$ =
makeItemList($1); }
| '(' expr ')' { $$ = $2; }
- | '+' expr %prec UMINUS { $$ = makeItemUnary(jpiPlus,
$2); }
- | '-' expr %prec UMINUS { $$ = makeItemUnary(jpiMinus,
$2); }
- | expr '+' expr { $$ =
makeItemBinary(jpiAdd, $1, $3); }
- | expr '-' expr { $$ =
makeItemBinary(jpiSub, $1, $3); }
- | expr '*' expr { $$ =
makeItemBinary(jpiMul, $1, $3); }
- | expr '/' expr { $$ =
makeItemBinary(jpiDiv, $1, $3); }
- | expr '%' expr { $$ =
makeItemBinary(jpiMod, $1, $3); }
+ | '+' expr %prec UMINUS { $$ = makeItemUnary(escontext,
jpiPlus, $2); }
+ | '-' expr %prec UMINUS { $$ = makeItemUnary(escontext,
jpiMinus, $2); }
+ | expr '+' expr { $$ =
makeItemBinary(escontext, jpiAdd, $1, $3); }
+ | expr '-' expr { $$ =
makeItemBinary(escontext, jpiSub, $1, $3); }
+ | expr '*' expr { $$ =
makeItemBinary(escontext, jpiMul, $1, $3); }
+ | expr '/' expr { $$ =
makeItemBinary(escontext, jpiDiv, $1, $3); }
+ | expr '%' expr { $$ =
makeItemBinary(escontext, jpiMod, $1, $3); }
;
index_elem:
- expr { $$ =
makeItemBinary(jpiSubscript, $1, NULL); }
- | expr TO_P expr { $$ =
makeItemBinary(jpiSubscript, $1, $3); }
+ expr { $$ =
makeItemBinary(escontext, jpiSubscript, $1, NULL); }
+ | expr TO_P expr { $$ =
makeItemBinary(escontext, jpiSubscript, $1, $3); }
;
index_list:
@@ -226,8 +226,8 @@ index_list:
;
array_accessor:
- '[' '*' ']' { $$ =
makeItemType(jpiAnyArray); }
- | '[' index_list ']' { $$ = makeIndexArray($2); }
+ '[' '*' ']' { $$ =
makeItemType(escontext, jpiAnyArray); }
+ | '[' index_list ']' { $$ =
makeIndexArray(escontext, $2); }
;
any_level:
@@ -236,27 +236,27 @@ any_level:
;
any_path:
- ANY_P { $$ =
makeAny(0, -1); }
- | ANY_P '{' any_level '}' { $$ = makeAny($3, $3); }
+ ANY_P { $$ =
makeAny(escontext, 0, -1); }
+ | ANY_P '{' any_level '}' { $$ = makeAny(escontext, $3,
$3); }
| ANY_P '{' any_level TO_P any_level '}'
- { $$ =
makeAny($3, $5); }
+ { $$ =
makeAny(escontext, $3, $5); }
;
accessor_op:
'.' key { $$ = $2; }
- | '.' '*' { $$ =
makeItemType(jpiAnyKey); }
+ | '.' '*' { $$ =
makeItemType(escontext, jpiAnyKey); }
| array_accessor { $$ = $1; }
| '.' any_path { $$ = $2; }
- | '.' method '(' ')' { $$ = makeItemType($2); }
- | '?' '(' predicate ')' { $$ = makeItemUnary(jpiFilter,
$3); }
+ | '.' method '(' ')' { $$ = makeItemType(escontext,
$2); }
+ | '?' '(' predicate ')' { $$ = makeItemUnary(escontext,
jpiFilter, $3); }
| '.' DECIMAL_P '(' opt_csv_list ')'
{
if (list_length($4) == 0)
- $$ = makeItemBinary(jpiDecimal, NULL, NULL);
+ $$ = makeItemBinary(escontext, jpiDecimal,
NULL, NULL);
else if (list_length($4) == 1)
- $$ = makeItemBinary(jpiDecimal, linitial($4),
NULL);
+ $$ = makeItemBinary(escontext, jpiDecimal,
linitial($4), NULL);
else if (list_length($4) == 2)
- $$ = makeItemBinary(jpiDecimal, linitial($4),
lsecond($4));
+ $$ = makeItemBinary(escontext, jpiDecimal,
linitial($4), lsecond($4));
else
ereturn(escontext, false,
(errcode(ERRCODE_SYNTAX_ERROR),
@@ -264,24 +264,24 @@ accessor_op:
errdetail(".decimal() can only
have an optional precision[,scale].")));
}
| '.' DATETIME_P '(' opt_datetime_template ')'
- { $$ = makeItemUnary(jpiDatetime, $4); }
+ { $$ = makeItemUnary(escontext, jpiDatetime, $4); }
| '.' TIME_P '(' opt_datetime_precision ')'
- { $$ = makeItemUnary(jpiTime, $4); }
+ { $$ = makeItemUnary(escontext, jpiTime, $4); }
| '.' TIME_TZ_P '(' opt_datetime_precision ')'
- { $$ = makeItemUnary(jpiTimeTz, $4); }
+ { $$ = makeItemUnary(escontext, jpiTimeTz, $4); }
| '.' TIMESTAMP_P '(' opt_datetime_precision ')'
- { $$ = makeItemUnary(jpiTimestamp, $4); }
+ { $$ = makeItemUnary(escontext, jpiTimestamp, $4); }
| '.' TIMESTAMP_TZ_P '(' opt_datetime_precision ')'
- { $$ = makeItemUnary(jpiTimestampTz, $4); }
+ { $$ = makeItemUnary(escontext, jpiTimestampTz, $4); }
;
csv_elem:
INT_P
- { $$ = makeItemNumeric(&$1); }
+ { $$ = makeItemNumeric(escontext, &$1); }
| '+' INT_P %prec UMINUS
- { $$ = makeItemUnary(jpiPlus, makeItemNumeric(&$2)); }
+ { $$ = makeItemUnary(escontext, jpiPlus,
makeItemNumeric(escontext, &$2)); }
| '-' INT_P %prec UMINUS
- { $$ = makeItemUnary(jpiMinus, makeItemNumeric(&$2)); }
+ { $$ = makeItemUnary(escontext, jpiMinus,
makeItemNumeric(escontext, &$2)); }
;
csv_list:
@@ -295,7 +295,7 @@ opt_csv_list:
;
datetime_precision:
- INT_P { $$ =
makeItemNumeric(&$1); }
+ INT_P { $$ =
makeItemNumeric(escontext, &$1); }
;
opt_datetime_precision:
@@ -304,7 +304,7 @@ opt_datetime_precision:
;
datetime_template:
- STRING_P { $$ =
makeItemString(&$1); }
+ STRING_P { $$ =
makeItemString(escontext, &$1); }
;
opt_datetime_template:
@@ -313,7 +313,7 @@ opt_datetime_template:
;
key:
- key_name { $$ =
makeItemKey(&$1); }
+ key_name { $$ =
makeItemKey(escontext, &$1); }
;
key_name:
@@ -377,9 +377,9 @@ method:
*/
static JsonPathParseItem *
-makeItemType(JsonPathItemType type)
+makeItemType(struct Node *escontext, JsonPathItemType type)
{
- JsonPathParseItem *v = palloc(sizeof(*v)); // TODO: palloc should use
the context allocator
+ JsonPathParseItem *v = sa_alloc(escontext->sa, sizeof(*v));
CHECK_FOR_INTERRUPTS();
@@ -390,17 +390,17 @@ makeItemType(JsonPathItemType type)
}
static JsonPathParseItem *
-makeItemString(JsonPathString *s)
+makeItemString(struct Node *escontext, JsonPathString *s)
{
JsonPathParseItem *v;
if (s == NULL)
{
- v = makeItemType(jpiNull);
+ v = makeItemType(escontext, jpiNull);
}
else
{
- v = makeItemType(jpiString);
+ v = makeItemType(escontext, jpiString);
v->value.string.val = s->val;
v->value.string.len = s->len;
}
@@ -409,11 +409,11 @@ makeItemString(JsonPathString *s)
}
static JsonPathParseItem *
-makeItemVariable(JsonPathString *s)
+makeItemVariable(struct Node *escontext, JsonPathString *s)
{
JsonPathParseItem *v;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]