Merge pull request #217 from dubek/lua-interop
[jackhill/mal.git] / plpgsql / printer.sql
CommitLineData
adc5b4fb
JM
1-- ---------------------------------------------------------
2-- printer.sql
3
494792ab
JM
4CREATE SCHEMA printer;
5
6CREATE FUNCTION printer.pr_str_array(arr integer[],
7 sep varchar, print_readably boolean)
5340418b
JM
8 RETURNS varchar AS $$
9DECLARE
10 i integer;
11 res varchar[];
12BEGIN
13 IF array_length(arr, 1) > 0 THEN
14 FOR i IN array_lower(arr, 1) .. array_upper(arr, 1)
15 LOOP
494792ab 16 res := array_append(res, printer.pr_str(arr[i], print_readably));
5340418b
JM
17 END LOOP;
18 RETURN array_to_string(res, sep);
19 ELSE
20 RETURN '';
21 END IF;
22END; $$ LANGUAGE plpgsql;
23
494792ab
JM
24CREATE FUNCTION printer.pr_str(ast integer,
25 print_readably boolean DEFAULT true)
5340418b 26 RETURNS varchar AS $$
adc5b4fb 27DECLARE
adc5b4fb 28 type integer;
b642c0db
JM
29 seq integer[];
30 hash hstore;
adc5b4fb
JM
31 cid integer;
32 vid integer;
5340418b
JM
33 pid integer;
34 str varchar;
adc5b4fb
JM
35BEGIN
36 -- RAISE NOTICE 'pr_str ast: %', ast;
494792ab 37 SELECT type_id FROM types.value WHERE value_id = ast INTO type;
adc5b4fb
JM
38 -- RAISE NOTICE 'pr_str type: %', type;
39 CASE
40 WHEN type = 0 THEN RETURN 'nil';
41 WHEN type = 1 THEN RETURN 'false';
42 WHEN type = 2 THEN RETURN 'true';
5340418b 43 WHEN type = 3 THEN -- integer
adc5b4fb 44 RETURN CAST((SELECT val_int
494792ab 45 FROM types.value WHERE value_id = ast) as varchar);
5340418b 46 WHEN type = 5 THEN -- string
494792ab 47 str := types._valueToString(ast);
08e44c41 48 IF chr(CAST(x'7f' AS integer)) = substring(str FROM 1 FOR 1) THEN
53105a77
JM
49 RETURN ':' || substring(str FROM 2 FOR (char_length(str)-1));
50 ELSIF print_readably THEN
5340418b
JM
51 str := replace(str, E'\\', '\\');
52 str := replace(str, '"', '\"');
53 str := replace(str, E'\n', '\n');
54 RETURN '"' || str || '"';
55 ELSE
56 RETURN str;
57 END IF;
58 WHEN type = 7 THEN -- symbol
494792ab 59 RETURN types._valueToString(ast);
5340418b 60 WHEN type = 8 THEN -- list
adc5b4fb 61 BEGIN
494792ab 62 SELECT val_seq INTO seq FROM types.value WHERE value_id = ast;
adc5b4fb
JM
63 RETURN '(' ||
64 array_to_string(array(
494792ab 65 SELECT printer.pr_str(x, print_readably)
b642c0db 66 FROM unnest(seq) AS x), ' ') ||
adc5b4fb
JM
67 ')';
68 END;
5340418b 69 WHEN type = 9 THEN -- vector
adc5b4fb 70 BEGIN
494792ab 71 SELECT val_seq INTO seq FROM types.value WHERE value_id = ast;
adc5b4fb
JM
72 RETURN '[' ||
73 array_to_string(array(
494792ab 74 SELECT printer.pr_str(x, print_readably)
b642c0db 75 FROM unnest(seq) AS x), ' ') ||
adc5b4fb
JM
76 ']';
77 END;
53105a77
JM
78 WHEN type = 10 THEN -- hash-map
79 BEGIN
494792ab 80 SELECT val_hash INTO hash FROM types.value WHERE value_id = ast;
53105a77
JM
81 RETURN '{' ||
82 array_to_string(array(
494792ab
JM
83 SELECT printer.pr_str(CAST(key AS integer),
84 print_readably) || ' ' ||
85 printer.pr_str(CAST(value AS integer),
86 print_readably)
b642c0db 87 FROM each(hash)), ' ') ||
53105a77
JM
88 '}';
89 END;
5340418b
JM
90 WHEN type = 11 THEN -- native function
91 RETURN '#<function ' ||
494792ab 92 (SELECT val_string FROM types.value WHERE value_id = ast) ||
5340418b
JM
93 '>';
94 WHEN type = 12 THEN -- mal function
adc5b4fb 95 BEGIN
b642c0db
JM
96 SELECT ast_id, params_id
97 INTO vid, pid
494792ab
JM
98 FROM types.value WHERE value_id = ast;
99 RETURN '(fn* ' || printer.pr_str(pid, print_readably) ||
100 ' ' || printer.pr_str(vid, print_readably) || ')';
5340418b
JM
101 END;
102 WHEN type = 13 THEN -- atom
103 BEGIN
b642c0db 104 SELECT val_seq[1] INTO vid
494792ab
JM
105 FROM types.value WHERE value_id = ast;
106 RETURN '(atom ' || printer.pr_str(vid, print_readably) || ')';
adc5b4fb
JM
107 END;
108 ELSE
109 RETURN 'unknown';
110 END CASE;
111END; $$ LANGUAGE plpgsql;