1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
CREATE FUNCTION crash_test() RETURNS boolean
LANGUAGE pljs IMMUTABLE STRICT
AS $$
var a = new ArrayBuffer(8);
return true;
$$;
SELECT crash_test();
-- ES6 / harmony features
CREATE TABLE rectangle (
id INTEGER,
data JSON
);
INSERT INTO rectangle (id, data) VALUES
(1, '{"width": 20.3, "height": 1.5}'),
(2, '{"width": 10.2, "height": 9.5}'),
(3, '{"width": 3.5, "height": 5.2}'),
(4, '{"width": 8.2, "height": 8.2}'),
(5, '{"width": 9.4, "height": 0.2}'),
(6, '{"width": 1.2, "height": 1.5}');
-- for..of loop over result array with break
CREATE OR REPLACE FUNCTION get_rectangles_area(min_area NUMERIC)
RETURNS json AS $$
var rectangles = pljs.execute('SELECT id, data FROM rectangle ORDER BY id');
var result = [];
var area = 0.0;
for (var rectangle of rectangles) {
area += rectangle.data.width * rectangle.data.height;
result.push({id: rectangle.id, data: rectangle.data});
if (area >= min_area) {
break;
}
}
return result;
$$ LANGUAGE pljs STABLE STRICT;
SELECT get_rectangles_area(130.0);
-- same for..of loop, this time using a cursor within a generator
CREATE OR REPLACE FUNCTION get_rectangles_area(min_area NUMERIC)
RETURNS json AS $$
var plan = pljs.prepare('SELECT id, data FROM rectangle ORDER BY id');
var cursor = plan.cursor();
var generator = function* () {
var row;
while (row = cursor.fetch()) {
yield row;
}
};
var rectangles = generator();
var result = [];
var area = 0.0;
for (var rectangle of rectangles) {
area += rectangle.data.width * rectangle.data.height;
result.push({id: rectangle.id, data: rectangle.data});
if (area >= min_area) {
break;
}
}
cursor.close();
plan.free();
return result;
$$ LANGUAGE pljs STABLE STRICT;
SELECT get_rectangles_area(130.0);
|