Changeset: 5125f7ae04bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5125f7ae04bf
Modified Files:
monetdb5/modules/atoms/json.c
monetdb5/modules/atoms/pg_jsonpath/jsonpath.c
monetdb5/modules/atoms/pg_jsonpath/jsonpath.h
monetdb5/modules/atoms/pg_jsonpath/jsonpath_exec.c
monetdb5/modules/atoms/pg_jsonpath/jsonpath_scan.l
monetdb5/modules/atoms/pg_jsonpath/postgres_defines.h
monetdb5/modules/atoms/pg_jsonpath/postgres_defines_internal.h
monetdb5/modules/atoms/pg_jsonpath/yyjson.c
monetdb5/modules/atoms/pg_jsonpath/yyjson.h
Branch: json-extend
Log Message:
It lives... (yyjson/postgres mix compiles in our json module)
diffs (truncated from 5749 to 300 lines):
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -13,6 +13,11 @@
/*
* (c) 2013 Martin Kersten
*/
+#ifdef free
+#undef free
+#endif
+#include "yyjson.h"
+
#include "monetdb_config.h"
#include "gdk.h"
#include "mal.h"
@@ -1636,6 +1641,7 @@ JSONfilterArrayDefault_hge(json *ret, co
}
#endif
+
#include "jsonpath.h"
static str
@@ -1651,10 +1657,19 @@ JSONfilter(json *ret, const json *js, co
if (!escontext)
throw(MAL, "json.filter", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- JsonPathParseResult* result = parsejsonpath(*expr, strlen(*expr),
escontext);
- (void) result;
+ JsonPathParseResult* path = parsejsonpath(*expr, strlen(*expr),
escontext);
- return JSONfilterInternal(ret, js, expr, 0);
+ yyjson_doc *doc = yyjson_read(*js, strlen(*js), 0);
+ yyjson_val *root = yyjson_doc_get_root(doc);
+ bool empty;
+ bool error;
+ const char *column_name = NULL;
+ yyjson_val *res = JsonPathValue((Datum) root, path, &empty, &error,
NULL, column_name); // TODO pass the result as yyjson document
+ char* tmp_res = yyjson_val_write(res, 0, NULL); // TODO use different
allocation or doc write
+ *ret = GDKstrdup(tmp_res);
+ free(tmp_res);
+ return MAL_SUCCEED;
+ // return JSONfilterInternal(ret, js, expr, 0);
}
// glue all values together with an optional separator
diff --git a/monetdb5/modules/atoms/pg_jsonpath/jsonpath.c
b/monetdb5/modules/atoms/pg_jsonpath/jsonpath.c
--- a/monetdb5/modules/atoms/pg_jsonpath/jsonpath.c
+++ b/monetdb5/modules/atoms/pg_jsonpath/jsonpath.c
@@ -62,784 +62,7 @@
*/
#include "jsonpath.h"
-
-
-static Datum jsonPathFromCstring(char *in, int len, struct Node *escontext);
-static char *jsonPathToCstring(StringInfo out, JsonPath *in,
- int estimated_len);
-static bool flattenJsonPathParseItem(StringInfo buf, int *result,
- struct
Node *escontext,
-
JsonPathParseItem *item,
- int
nestingLevel, bool insideArraySubscript);
-static void alignStringInfoInt(StringInfo buf);
-static int32 reserveSpaceForItemPointer(StringInfo buf);
-static void printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey,
- bool printBracketes);
-static int operationPriority(JsonPathItemType op);
-
-
-/**************************** INPUT/OUTPUT ********************************/
-
-/*
- * jsonpath type input function
- */
-/*
-Datum
-jsonpath_in(PG_FUNCTION_ARGS)
-{
- char *in = PG_GETARG_CSTRING(0);
- int len = strlen(in);
-
- return jsonPathFromCstring(in, len, fcinfo->context);
-}
-*/
-
-/*
- * jsonpath type recv function
- *
- * The type is sent as text in binary mode, so this is almost the same
- * as the input function, but it's prefixed with a version number so we
- * can change the binary format sent in future if necessary. For now,
- * only version 1 is supported.
- */
-/*
-Datum
-jsonpath_recv(PG_FUNCTION_ARGS)
-{
- StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
- int version = pq_getmsgint(buf, 1);
- char *str;
- int nbytes;
-
- if (version == JSONPATH_VERSION)
- str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes);
- else
- elog(ERROR, "unsupported jsonpath version number: %d", version);
-
- return jsonPathFromCstring(str, nbytes, NULL);
-}
-*/
-
-/*
- * jsonpath type output function
- */
-/*
-Datum
-jsonpath_out(PG_FUNCTION_ARGS)
-{
- JsonPath *in = PG_GETARG_JSONPATH_P(0);
-
- PG_RETURN_CSTRING(jsonPathToCstring(NULL, in, VARSIZE(in)));
-}
-*/
-
-/*
- * jsonpath type send function
- *
- * Just send jsonpath as a version number, then a string of text
- */
-/*
-Datum
-jsonpath_send(PG_FUNCTION_ARGS)
-{
- JsonPath *in = PG_GETARG_JSONPATH_P(0);
- StringInfoData buf;
- StringInfoData jtext;
- int version = JSONPATH_VERSION;
-
- initStringInfo(&jtext);
- (void) jsonPathToCstring(&jtext, in, VARSIZE(in));
-
- pq_begintypsend(&buf);
- pq_sendint8(&buf, version);
- pq_sendtext(&buf, jtext.data, jtext.len);
- pfree(jtext.data);
-
- PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
-}
-*/
-
-/*
- * Converts C-string to a jsonpath value.
- *
- * Uses jsonpath parser to turn string into an AST, then
- * flattenJsonPathParseItem() does second pass turning AST into binary
- * representation of jsonpath.
- */
-/*
-static Datum
-jsonPathFromCstring(char *in, int len, struct Node *escontext)
-{
- JsonPathParseResult *jsonpath = parsejsonpath(in, len, escontext);
- JsonPath *res;
- StringInfoData buf;
-
- if (SOFT_ERROR_OCCURRED(escontext))
- return (Datum) 0;
-
- if (!jsonpath)
- return TODO_ERROR;
- ereturn(escontext, (Datum) 0,
- (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
- errmsg("invalid input syntax for type %s:
\"%s\"", "jsonpath",
- in)));
-
- initStringInfo(&buf);
- enlargeStringInfo(&buf, 4 * len );
-
- appendStringInfoSpaces(&buf, JSONPATH_HDRSZ);
-
- if (!flattenJsonPathParseItem(&buf, NULL, escontext,
-
jsonpath->expr, 0, false))
- return (Datum) 0;
-
- res = (JsonPath *) buf.data;
- SET_VARSIZE(res, buf.len);
- res->header = JSONPATH_VERSION;
- if (jsonpath->lax)
- res->header |= JSONPATH_LAX;
-
- PG_RETURN_JSONPATH_P(res);
-}
-*/
-
-/*
- * Converts jsonpath value to a C-string.
- *
- * If 'out' argument is non-null, the resulting C-string is stored inside the
- * StringBuffer. The resulting string is always returned.
- */
-/*
-static char *
-jsonPathToCstring(StringInfo out, JsonPath *in, int estimated_len)
-{
- StringInfoData buf;
- JsonPathItem v;
-
- if (!out)
- {
- out = &buf;
- initStringInfo(out);
- }
- enlargeStringInfo(out, estimated_len);
-
- if (!(in->header & JSONPATH_LAX))
- appendStringInfoString(out, "strict ");
-
- jspInit(&v, in);
- printJsonPathItem(out, &v, false, true);
-
- return out->data;
-}
-*/
-
-/*
- * Recursive function converting given jsonpath parse item and all its
- * children into a binary representation.
- */
-static bool
-flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext,
- JsonPathParseItem *item, int
nestingLevel,
- bool insideArraySubscript)
-{
- /* position from beginning of jsonpath data */
- int32 pos = buf->len - JSONPATH_HDRSZ;
- int32 chld;
- int32 next;
- int argNestingLevel = 0;
-
- check_stack_depth();
- CHECK_FOR_INTERRUPTS();
-
- appendStringInfoChar(buf, (char) (item->type));
-
- /*
- * We align buffer to int32 because a series of int32 values often goes
- * after the header, and we want to read them directly by dereferencing
- * int32 pointer (see jspInitByBuffer()).
- */
- alignStringInfoInt(buf);
-
- /*
- * Reserve space for next item pointer. Actual value will be recorded
- * later, after next and children items processing.
- */
- next = reserveSpaceForItemPointer(buf);
-
- switch (item->type)
- {
- case jpiString:
- case jpiVariable:
- case jpiKey:
- appendBinaryStringInfo(buf, &item->value.string.len,
-
sizeof(item->value.string.len));
- appendBinaryStringInfo(buf, item->value.string.val,
-
item->value.string.len);
- appendStringInfoChar(buf, '\0');
- break;
- case jpiNumeric:
- appendBinaryStringInfo(buf, item->value.numeric,
-
VARSIZE(item->value.numeric));
- break;
- case jpiBool:
- appendBinaryStringInfo(buf, &item->value.boolean,
-
sizeof(item->value.boolean));
- break;
- case jpiAnd:
- case jpiOr:
- case jpiEqual:
- case jpiNotEqual:
- case jpiLess:
- case jpiGreater:
- case jpiLessOrEqual:
- case jpiGreaterOrEqual:
- case jpiAdd:
- case jpiSub:
- case jpiMul:
- case jpiDiv:
- case jpiMod:
- case jpiStartsWith:
- case jpiDecimal:
- {
- /*
- * First, reserve place for left/right arg's
positions, then
- * record both args and sets actual position in
reserved
- * places.
- */
- int32 left =
reserveSpaceForItemPointer(buf);
- int32 right =
reserveSpaceForItemPointer(buf);
-
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]