| -- test plperl utility functions (defined in Util.xs) |
| -- test quote_literal |
| create or replace function perl_quote_literal() returns setof text language plperl as $$ |
| return_next "undef: ".quote_literal(undef); |
| return_next sprintf"$_: ".quote_literal($_) |
| for q{foo}, q{a'b}, q{a"b}, q{c''d}, q{e\f}, q{}; |
| return undef; |
| $$; |
| select perl_quote_literal(); |
| perl_quote_literal |
| -------------------- |
| undef: |
| foo: 'foo' |
| a'b: 'a''b' |
| a"b: 'a"b' |
| c''d: 'c''''d' |
| e\f: E'e\\f' |
| : '' |
| (7 rows) |
| |
| -- test quote_nullable |
| create or replace function perl_quote_nullable() returns setof text language plperl as $$ |
| return_next "undef: ".quote_nullable(undef); |
| return_next sprintf"$_: ".quote_nullable($_) |
| for q{foo}, q{a'b}, q{a"b}, q{c''d}, q{e\f}, q{}; |
| return undef; |
| $$; |
| select perl_quote_nullable(); |
| perl_quote_nullable |
| --------------------- |
| undef: NULL |
| foo: 'foo' |
| a'b: 'a''b' |
| a"b: 'a"b' |
| c''d: 'c''''d' |
| e\f: E'e\\f' |
| : '' |
| (7 rows) |
| |
| -- test quote_ident |
| create or replace function perl_quote_ident() returns setof text language plperl as $$ |
| return_next "undef: ".quote_ident(undef); # generates undef warning if warnings enabled |
| return_next "$_: ".quote_ident($_) |
| for q{foo}, q{a'b}, q{a"b}, q{c''d}, q{e\f}, q{g.h}, q{}; |
| return undef; |
| $$; |
| select perl_quote_ident(); |
| perl_quote_ident |
| ------------------ |
| undef: "" |
| foo: foo |
| a'b: "a'b" |
| a"b: "a""b" |
| c''d: "c''d" |
| e\f: "e\f" |
| g.h: "g.h" |
| : "" |
| (8 rows) |
| |
| -- test decode_bytea |
| create or replace function perl_decode_bytea() returns setof text language plperl as $$ |
| return_next "undef: ".decode_bytea(undef); # generates undef warning if warnings enabled |
| return_next "$_: ".decode_bytea($_) |
| for q{foo}, q{a\047b}, q{}; |
| return undef; |
| $$; |
| select perl_decode_bytea(); |
| perl_decode_bytea |
| ------------------- |
| undef: |
| foo: foo |
| a\047b: a'b |
| : |
| (4 rows) |
| |
| -- test encode_bytea |
| create or replace function perl_encode_bytea() returns setof text language plperl as $$ |
| return_next encode_bytea(undef); # generates undef warning if warnings enabled |
| return_next encode_bytea($_) |
| for q{@}, qq{@\x01@}, qq{@\x00@}, q{}; |
| return undef; |
| $$; |
| select perl_encode_bytea(); |
| perl_encode_bytea |
| ------------------- |
| \x |
| \x40 |
| \x400140 |
| \x400040 |
| \x |
| (5 rows) |
| |
| -- test encode_array_literal |
| create or replace function perl_encode_array_literal() returns setof text language plperl as $$ |
| return_next encode_array_literal(undef); |
| return_next encode_array_literal(0); |
| return_next encode_array_literal(42); |
| return_next encode_array_literal($_) |
| for [], [0], [1..5], [[]], [[1,2,[3]],4]; |
| return_next encode_array_literal($_,'|') |
| for [], [0], [1..5], [[]], [[1,2,[3]],4]; |
| return undef; |
| $$; |
| select perl_encode_array_literal(); |
| perl_encode_array_literal |
| --------------------------- |
| |
| 0 |
| 42 |
| {} |
| {"0"} |
| {"1", "2", "3", "4", "5"} |
| {{}} |
| {{"1", "2", {"3"}}, "4"} |
| {} |
| {"0"} |
| {"1"|"2"|"3"|"4"|"5"} |
| {{}} |
| {{"1"|"2"|{"3"}}|"4"} |
| (13 rows) |
| |
| -- test encode_array_constructor |
| create or replace function perl_encode_array_constructor() returns setof text language plperl as $$ |
| return_next encode_array_constructor(undef); |
| return_next encode_array_constructor(0); |
| return_next encode_array_constructor(42); |
| return_next encode_array_constructor($_) |
| for [], [0], [1..5], [[]], [[1,2,[3]],4]; |
| return undef; |
| $$; |
| select perl_encode_array_constructor(); |
| perl_encode_array_constructor |
| ----------------------------------------- |
| NULL |
| '0' |
| '42' |
| ARRAY[] |
| ARRAY['0'] |
| ARRAY['1', '2', '3', '4', '5'] |
| ARRAY[ARRAY[]] |
| ARRAY[ARRAY['1', '2', ARRAY['3']], '4'] |
| (8 rows) |
| |
| -- test looks_like_number |
| create or replace function perl_looks_like_number() returns setof text language plperl as $$ |
| return_next "undef is undef" if not defined looks_like_number(undef); |
| return_next quote_nullable($_).": ". (looks_like_number($_) ? "number" : "not number") |
| for 'foo', 0, 1, 1.3, '+3.e-4', |
| '42 x', # trailing garbage |
| '99 ', # trailing space |
| ' 99', # leading space |
| ' ', # only space |
| ''; # empty string |
| return undef; |
| $$; |
| select perl_looks_like_number(); |
| perl_looks_like_number |
| ------------------------ |
| undef is undef |
| 'foo': not number |
| '0': number |
| '1': number |
| '1.3': number |
| '+3.e-4': number |
| '42 x': not number |
| '99 ': number |
| ' 99': number |
| ' ': not number |
| '': not number |
| (11 rows) |
| |
| -- test encode_typed_literal |
| create type perl_foo as (a integer, b text[]); |
| create type perl_bar as (c perl_foo[]); |
| create domain perl_foo_pos as perl_foo check((value).a > 0); |
| create or replace function perl_encode_typed_literal() returns setof text language plperl as $$ |
| return_next encode_typed_literal(undef, 'text'); |
| return_next encode_typed_literal([[1,2,3],[3,2,1],[1,3,2]], 'integer[]'); |
| return_next encode_typed_literal({a => 1, b => ['PL','/','Perl']}, 'perl_foo'); |
| return_next encode_typed_literal({c => [{a => 9, b => ['PostgreSQL']}, {b => ['Postgres'], a => 1}]}, 'perl_bar'); |
| return_next encode_typed_literal({a => 1, b => ['PL','/','Perl']}, 'perl_foo_pos'); |
| $$; |
| select perl_encode_typed_literal(); |
| perl_encode_typed_literal |
| ----------------------------------------------- |
| |
| {{1,2,3},{3,2,1},{1,3,2}} |
| (1,"{PL,/,Perl}") |
| ("{""(9,{PostgreSQL})"",""(1,{Postgres})""}") |
| (1,"{PL,/,Perl}") |
| (5 rows) |
| |
| create or replace function perl_encode_typed_literal() returns setof text language plperl as $$ |
| return_next encode_typed_literal({a => 0, b => ['PL','/','Perl']}, 'perl_foo_pos'); |
| $$; |
| select perl_encode_typed_literal(); -- fail |
| ERROR: value for domain perl_foo_pos violates check constraint "perl_foo_pos_check" |
| CONTEXT: PL/Perl function "perl_encode_typed_literal" |