Skip to content

Commit

Permalink
R3.0alpha (#357)
Browse files Browse the repository at this point in the history
* fix some jsonb conversion issues
* change undefined to simply not create the value
  • Loading branch information
JerrySievert committed Aug 13, 2019
1 parent 77b9411 commit 84faf14
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 6 deletions.
13 changes: 12 additions & 1 deletion Changes
@@ -1,12 +1,23 @@
Revision history for plv8

3.0alpha
- update to v8 7.0
- update to v8 7.4
- add Bigint support
- add BigInt64Array support
- add direct JSONB conversion to and from v8 objects
- add plv8.memory_usage()

2.3.12 2019-06-28
- support postgres 12

2.3.11 2019-03-24
- add permissions check for find-function
- add better upgrade script

2.3.10 2019-03-23
- add direct jsonb conversion option
- add memory context for jsonb conversion

2.3.9 2018-12-09
- work around pg11 forced filename endings

Expand Down
40 changes: 40 additions & 0 deletions expected/jsonb_conv.out
Expand Up @@ -43,3 +43,43 @@ SELECT get_keyb('ok', data) FROM jsonbonly;
{"ok": true}
(1 row)

CREATE FUNCTION jsonb_cat(data jsonb) RETURNS jsonb LANGUAGE plv8
AS $$
return data;
$$;
SELECT jsonb_cat('[{"a": 1},{"b": 2},{"c": 3}]'::jsonb);
jsonb_cat
--------------------------------
[{"a": 1}, {"b": 2}, {"c": 3}]
(1 row)

CREATE TABLE test_infinity_tbl (
id INT,
version_actual_period_start timestamp,
version_actual_period_end timestamp
);
INSERT INTO test_infinity_tbl VALUES(1, '2019-03-01', 'infinity'::timestamp);
CREATE OR REPLACE FUNCTION test_plv8_with_infinite_date() RETURNS JSONB AS
$$
var data = [];
data = plv8.execute("SELECT * FROM test_infinity_tbl");
return data[0];
$$
LANGUAGE plv8 STABLE;
SELECT test_plv8_with_infinite_date();
test_plv8_with_infinite_date
---------------------------------------------------------------------------------------------------------
{"id": 1, "version_actual_period_end": null, "version_actual_period_start": "2019-03-01T00:00:00.000Z"}
(1 row)

CREATE FUNCTION jsonb_undefined(data jsonb) RETURNS jsonb AS
$$
return Object.assign({}, data, { key: undefined });
$$
LANGUAGE plv8;
SELECT jsonb_undefined('{"foo": "bar"}'::jsonb);
jsonb_undefined
-----------------
{"foo": "bar"}
(1 row)

19 changes: 14 additions & 5 deletions plv8_type.cc
Expand Up @@ -206,9 +206,9 @@ JsonbIterate(JsonbIterator **it, Local<v8::Object> container) {
obj = v8::Object::New(plv8_isolate);
if (container->IsArray()) {
container->Set(count, JsonbIterate(it, obj));
count++;
} else {
container->Set(key, JsonbIterate(it, obj));
count++;
}
break;

Expand All @@ -221,9 +221,9 @@ JsonbIterate(JsonbIterator **it, Local<v8::Object> container) {
obj = v8::Array::New(plv8_isolate);
if (container->IsArray()) {
container->Set(count, JsonbIterate(it, obj));
count++;
} else {
container->Set(key, JsonbIterate(it, obj));
count++;
}
break;

Expand Down Expand Up @@ -411,6 +411,8 @@ JsonbFromValue(JsonbParseState **pstate, Local<v8::Value> value, JsonbIteratorTo
val.val.boolean = value->BooleanValue(plv8_isolate->GetCurrentContext()).ToChecked();
} else if (value->IsNull()) {
val.type = jbvNull;
} else if (value->IsUndefined()) {
return NULL;
} else if (value->IsString()) {
val.type = jbvString;
String::Utf8Value utf8(plv8_isolate, value->ToString(plv8_isolate));
Expand All @@ -433,9 +435,13 @@ JsonbFromValue(JsonbParseState **pstate, Local<v8::Value> value, JsonbIteratorTo
}
} else if (value->IsDate()) {
double t = value->NumberValue(plv8_isolate->GetCurrentContext()).ToChecked();
val.val.string.val = TimeAs8601(t);
val.val.string.len = 24;
val.type = jbvString;
if (isnan(t)) {
val.type = jbvNull;
} else {
val.val.string.val = TimeAs8601(t);
val.val.string.len = 24;
val.type = jbvString;
}
} else {
LogType(value, false);
val.type = jbvString;
Expand Down Expand Up @@ -1132,6 +1138,9 @@ ToString(const char *str, int len, int encoding)
{
char *utf8;

if (str == NULL) {
return String::NewFromUtf8(plv8_isolate, "(null)", String::kNormalString, 6);
}
if (len < 0)
len = strlen(str);

Expand Down
33 changes: 33 additions & 0 deletions sql/jsonb_conv.sql
Expand Up @@ -30,3 +30,36 @@ COPY jsonbonly (data) FROM stdin;
-- Call twice to test the function cache.
SELECT get_keyb('ok', data) FROM jsonbonly;
SELECT get_keyb('ok', data) FROM jsonbonly;

CREATE FUNCTION jsonb_cat(data jsonb) RETURNS jsonb LANGUAGE plv8
AS $$
return data;
$$;

SELECT jsonb_cat('[{"a": 1},{"b": 2},{"c": 3}]'::jsonb);

CREATE TABLE test_infinity_tbl (
id INT,
version_actual_period_start timestamp,
version_actual_period_end timestamp
);

INSERT INTO test_infinity_tbl VALUES(1, '2019-03-01', 'infinity'::timestamp);

CREATE OR REPLACE FUNCTION test_plv8_with_infinite_date() RETURNS JSONB AS
$$
var data = [];
data = plv8.execute("SELECT * FROM test_infinity_tbl");
return data[0];
$$
LANGUAGE plv8 STABLE;

SELECT test_plv8_with_infinite_date();

CREATE FUNCTION jsonb_undefined(data jsonb) RETURNS jsonb AS
$$
return Object.assign({}, data, { key: undefined });
$$
LANGUAGE plv8;

SELECT jsonb_undefined('{"foo": "bar"}'::jsonb);

0 comments on commit 84faf14

Please sign in to comment.