globegit-postgresql-plruby 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/Changes +121 -0
  2. data/README.markdown +155 -0
  3. data/Rakefile +48 -0
  4. data/docs/plruby.rb +1931 -0
  5. data/ex_trans.sql +33 -0
  6. data/extconf.rb +267 -0
  7. data/plruby.html +1454 -0
  8. data/plruby.rd +1571 -0
  9. data/postgresql-plruby.gemspec +56 -0
  10. data/src/conversions.h +5 -0
  11. data/src/conversions/basic/conversions.h +25 -0
  12. data/src/conversions/basic/extconf.rb +8 -0
  13. data/src/conversions/basic/plruby_basic.c +357 -0
  14. data/src/conversions/bitstring/bitstring.sql +75 -0
  15. data/src/conversions/bitstring/conversions.h +15 -0
  16. data/src/conversions/bitstring/extconf.rb +8 -0
  17. data/src/conversions/bitstring/plruby_bitstring.c +579 -0
  18. data/src/conversions/convcommon.h +129 -0
  19. data/src/conversions/datetime/conversions.h +13 -0
  20. data/src/conversions/datetime/extconf.rb +8 -0
  21. data/src/conversions/datetime/plruby_datetime.c +269 -0
  22. data/src/conversions/geometry/conversions.h +37 -0
  23. data/src/conversions/geometry/extconf.rb +8 -0
  24. data/src/conversions/geometry/geometry.sql +196 -0
  25. data/src/conversions/geometry/plruby_geometry.c +2494 -0
  26. data/src/conversions/network/conversions.h +21 -0
  27. data/src/conversions/network/extconf.rb +8 -0
  28. data/src/conversions/network/network.sql +63 -0
  29. data/src/conversions/network/plruby_network.c +537 -0
  30. data/src/package.h +20 -0
  31. data/src/plpl.c +1708 -0
  32. data/src/plplan.c +893 -0
  33. data/src/plruby.c +1676 -0
  34. data/src/plruby.h +324 -0
  35. data/src/pltrans.c +388 -0
  36. data/test/conv_bitstring/b.rb +45 -0
  37. data/test/conv_bitstring/runtest +26 -0
  38. data/test/conv_bitstring/test.expected.73 +148 -0
  39. data/test/conv_bitstring/test.expected.74 +148 -0
  40. data/test/conv_bitstring/test.expected.80 +148 -0
  41. data/test/conv_bitstring/test.expected.81 +148 -0
  42. data/test/conv_bitstring/test.expected.82 +148 -0
  43. data/test/conv_bitstring/test.expected.83 +148 -0
  44. data/test/conv_bitstring/test.expected.84 +148 -0
  45. data/test/conv_bitstring/test.out +148 -0
  46. data/test/conv_bitstring/test_mklang.sql +8 -0
  47. data/test/conv_bitstring/test_queries.sql +63 -0
  48. data/test/conv_bitstring/test_queries.sql.in +63 -0
  49. data/test/conv_geometry/b.rb +45 -0
  50. data/test/conv_geometry/runtest +26 -0
  51. data/test/conv_geometry/test.expected.73 +265 -0
  52. data/test/conv_geometry/test.expected.74 +265 -0
  53. data/test/conv_geometry/test.expected.80 +265 -0
  54. data/test/conv_geometry/test.expected.81 +265 -0
  55. data/test/conv_geometry/test.expected.82 +265 -0
  56. data/test/conv_geometry/test.expected.83 +265 -0
  57. data/test/conv_geometry/test.expected.84 +265 -0
  58. data/test/conv_geometry/test.out +265 -0
  59. data/test/conv_geometry/test_mklang.sql +8 -0
  60. data/test/conv_geometry/test_queries.sql +194 -0
  61. data/test/conv_geometry/test_queries.sql.in +194 -0
  62. data/test/conv_network/b.rb +45 -0
  63. data/test/conv_network/runtest +26 -0
  64. data/test/conv_network/test.expected.73 +213 -0
  65. data/test/conv_network/test.expected.74 +237 -0
  66. data/test/conv_network/test.expected.80 +237 -0
  67. data/test/conv_network/test.expected.81 +237 -0
  68. data/test/conv_network/test.expected.82 +237 -0
  69. data/test/conv_network/test.expected.83 +237 -0
  70. data/test/conv_network/test.expected.84 +237 -0
  71. data/test/conv_network/test.out +237 -0
  72. data/test/conv_network/test_mklang.sql +8 -0
  73. data/test/conv_network/test_queries.sql +60 -0
  74. data/test/conv_network/test_queries.sql.in +60 -0
  75. data/test/plp/b.rb +34 -0
  76. data/test/plp/runtest +29 -0
  77. data/test/plp/test.expected.73 +472 -0
  78. data/test/plp/test.expected.74 +472 -0
  79. data/test/plp/test.expected.75 +472 -0
  80. data/test/plp/test.expected.80 +472 -0
  81. data/test/plp/test.expected.81 +472 -0
  82. data/test/plp/test.expected.82 +472 -0
  83. data/test/plp/test.expected.83 +472 -0
  84. data/test/plp/test.expected.84 +472 -0
  85. data/test/plp/test.out +472 -0
  86. data/test/plp/test_mklang.sql +8 -0
  87. data/test/plp/test_queries.sql +273 -0
  88. data/test/plp/test_setup.sql +931 -0
  89. data/test/plp/test_setup.sql.in +931 -0
  90. data/test/plt/b.rb +34 -0
  91. data/test/plt/runtest +29 -0
  92. data/test/plt/test.expected.73 +178 -0
  93. data/test/plt/test.expected.74 +178 -0
  94. data/test/plt/test.expected.75 +178 -0
  95. data/test/plt/test.expected.80 +178 -0
  96. data/test/plt/test.expected.81 +178 -0
  97. data/test/plt/test.expected.82 +178 -0
  98. data/test/plt/test.expected.83 +164 -0
  99. data/test/plt/test.expected.84 +168 -0
  100. data/test/plt/test.out +168 -0
  101. data/test/plt/test_mklang.sql +8 -0
  102. data/test/plt/test_queries.sql +72 -0
  103. data/test/plt/test_setup.sql +252 -0
  104. data/test/plt/test_setup.sql.in +252 -0
  105. data/test/range/b.rb +45 -0
  106. data/test/range/runtest +26 -0
  107. data/test/range/test.expected.73 +396 -0
  108. data/test/range/test.expected.73.in +396 -0
  109. data/test/range/test.expected.74 +396 -0
  110. data/test/range/test.expected.74.in +396 -0
  111. data/test/range/test.expected.75 +396 -0
  112. data/test/range/test.expected.75.in +396 -0
  113. data/test/range/test.expected.80 +396 -0
  114. data/test/range/test.expected.81 +397 -0
  115. data/test/range/test.expected.82 +397 -0
  116. data/test/range/test.expected.83 +397 -0
  117. data/test/range/test.expected.84 +399 -0
  118. data/test/range/test.out +399 -0
  119. data/test/range/test_mklang.sql +8 -0
  120. data/test/range/test_queries.sql +249 -0
  121. data/test/range/test_queries.sql.in +249 -0
  122. metadata +207 -0
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/ruby
2
+ require 'rbconfig'
3
+ include Config
4
+ pwd = Dir.pwd
5
+ pwd.sub!(%r{[^/]+/[^/]+$}, "")
6
+
7
+ language, extension = 'C', '_new_trigger'
8
+ opaque = 'language_handler'
9
+
10
+ version = ARGV[0].to_i
11
+ suffix = ARGV[1].to_s
12
+
13
+ begin
14
+ f = File.new("test_setup.sql", "w")
15
+ IO.foreach("test_setup.sql.in") do |x|
16
+ x.gsub!(/language\s+'plruby'/i, "language 'plruby#{suffix}'")
17
+ f.print x
18
+ end
19
+ f.close
20
+ f = File.new("test_mklang.sql", "w")
21
+ f.print <<EOF
22
+
23
+ create function plruby#{suffix}_call_handler() returns #{opaque}
24
+ as '#{pwd}src/plruby#{suffix}.#{CONFIG["DLEXT"]}'
25
+ language '#{language}';
26
+
27
+ create trusted procedural language 'plruby#{suffix}'
28
+ handler plruby#{suffix}_call_handler
29
+ lancompiler 'PL/Ruby';
30
+ EOF
31
+ f.close
32
+ rescue
33
+ raise "Why I can't write #$!"
34
+ end
@@ -0,0 +1,29 @@
1
+ #!/bin/sh
2
+
3
+ DBNAME=plruby_test
4
+ export DBNAME
5
+
6
+ sleep 1
7
+ echo "**** Destroy old database $DBNAME ****"
8
+ dropdb $DBNAME
9
+
10
+ echo "**** Create test database $DBNAME ****"
11
+ createdb $DBNAME
12
+
13
+ echo "**** Create procedural language plruby$2 ****"
14
+ "${RUBY-ruby}" b.rb $*
15
+ psql -q -n -X $DBNAME < test_mklang.sql
16
+
17
+ echo "**** Create tables, functions and triggers ****"
18
+ psql -q -n -X $DBNAME < test_setup.sql
19
+
20
+ echo "**** Running test queries ****"
21
+ psql -q -n -X -e $DBNAME < test_queries.sql > test.out 2>&1
22
+
23
+ if cmp -s test.expected.$1 test.out; then
24
+ echo " Tests passed O.K."
25
+ else
26
+ echo " Tests failed - look at diffs between"
27
+ echo " test.expected.$1 and test.out"
28
+ fi
29
+
@@ -0,0 +1,178 @@
1
+ insert into T_pkey1 values (1, 'key1-1', 'test key');
2
+ insert into T_pkey1 values (1, 'key1-2', 'test key');
3
+ insert into T_pkey1 values (1, 'key1-3', 'test key');
4
+ insert into T_pkey1 values (2, 'key2-1', 'test key');
5
+ insert into T_pkey1 values (2, 'key2-2', 'test key');
6
+ insert into T_pkey1 values (2, 'key2-3', 'test key');
7
+ insert into T_pkey2 values (1, 'key1-1', 'test key');
8
+ insert into T_pkey2 values (1, 'key1-2', 'test key');
9
+ insert into T_pkey2 values (1, 'key1-3', 'test key');
10
+ insert into T_pkey2 values (2, 'key2-1', 'test key');
11
+ insert into T_pkey2 values (2, 'key2-2', 'test key');
12
+ insert into T_pkey2 values (2, 'key2-3', 'test key');
13
+ select * from T_pkey1;
14
+ key1 | key2 | txt
15
+ ------+--------+----------
16
+ 1 | key1-1 | test key
17
+ 1 | key1-2 | test key
18
+ 1 | key1-3 | test key
19
+ 2 | key2-1 | test key
20
+ 2 | key2-2 | test key
21
+ 2 | key2-3 | test key
22
+ (6 rows)
23
+
24
+ select * from T_pkey2;
25
+ key1 | key2 | txt
26
+ ------+--------+----------
27
+ 1 | KEY1-1 | test key
28
+ 1 | KEY1-2 | test key
29
+ 1 | KEY1-3 | test key
30
+ 2 | KEY2-1 | test key
31
+ 2 | KEY2-2 | test key
32
+ 2 | KEY2-3 | test key
33
+ (6 rows)
34
+
35
+ insert into T_pkey1 values (1, 'KEY1-3', 'should work');
36
+ insert into T_pkey2 values (1, 'KEY1-3', 'should fail');
37
+ ERROR: duplicate key '1', 'KEY1-3' for T_pkey2
38
+ insert into T_dta1 values ('trec 1', 1, 'key1-1');
39
+ insert into T_dta1 values ('trec 2', 1, 'key1-2');
40
+ insert into T_dta1 values ('trec 3', 1, 'key1-3');
41
+ insert into T_dta1 values ('trec 4', 1, 'key1-4');
42
+ ERROR: key for t_dta1 not in t_pkey1
43
+ insert into T_dta2 values ('trec 1', 1, 'KEY1-1');
44
+ insert into T_dta2 values ('trec 2', 1, 'KEY1-2');
45
+ insert into T_dta2 values ('trec 3', 1, 'KEY1-3');
46
+ insert into T_dta2 values ('trec 4', 1, 'KEY1-4');
47
+ ERROR: key for t_dta2 not in t_pkey2
48
+ select * from T_dta1;
49
+ tkey | ref1 | ref2
50
+ --------+------+--------
51
+ trec 1 | 1 | key1-1
52
+ trec 2 | 1 | key1-2
53
+ trec 3 | 1 | key1-3
54
+ (3 rows)
55
+
56
+ select * from T_dta2;
57
+ tkey | ref1 | ref2
58
+ --------+------+--------
59
+ trec 1 | 1 | KEY1-1
60
+ trec 2 | 1 | KEY1-2
61
+ trec 3 | 1 | KEY1-3
62
+ (3 rows)
63
+
64
+ update T_pkey1 set key2 = 'key2-9' where key1 = 2 and key2 = 'key2-1';
65
+ update T_pkey1 set key2 = 'key1-9' where key1 = 1 and key2 = 'key1-1';
66
+ ERROR: key '1', 'key1-1' referenced by T_dta1
67
+ delete from T_pkey1 where key1 = 2 and key2 = 'key2-2';
68
+ delete from T_pkey1 where key1 = 1 and key2 = 'key1-2';
69
+ ERROR: key '1', 'key1-2' referenced by T_dta1
70
+ update T_pkey2 set key2 = 'KEY2-9' where key1 = 2 and key2 = 'KEY2-1';
71
+ update T_pkey2 set key2 = 'KEY1-9' where key1 = 1 and key2 = 'KEY1-1';
72
+ NOTICE: updated 1 entries in T_dta2 for new key in T_pkey2
73
+ delete from T_pkey2 where key1 = 2 and key2 = 'KEY2-2';
74
+ delete from T_pkey2 where key1 = 1 and key2 = 'KEY1-2';
75
+ NOTICE: deleted 1 entries from T_dta2
76
+ select * from T_pkey1;
77
+ key1 | key2 | txt
78
+ ------+--------+-------------
79
+ 1 | key1-1 | test key
80
+ 1 | key1-2 | test key
81
+ 1 | key1-3 | test key
82
+ 2 | key2-3 | test key
83
+ 1 | KEY1-3 | should work
84
+ 2 | key2-9 | test key
85
+ (6 rows)
86
+
87
+ select * from T_pkey2;
88
+ key1 | key2 | txt
89
+ ------+--------+----------
90
+ 1 | KEY1-3 | test key
91
+ 2 | KEY2-3 | test key
92
+ 2 | KEY2-9 | test key
93
+ 1 | KEY1-9 | test key
94
+ (4 rows)
95
+
96
+ select * from T_dta1;
97
+ tkey | ref1 | ref2
98
+ --------+------+--------
99
+ trec 1 | 1 | key1-1
100
+ trec 2 | 1 | key1-2
101
+ trec 3 | 1 | key1-3
102
+ (3 rows)
103
+
104
+ select * from T_dta2;
105
+ tkey | ref1 | ref2
106
+ --------+------+--------
107
+ trec 3 | 1 | KEY1-3
108
+ trec 1 | 1 | KEY1-9
109
+ (2 rows)
110
+
111
+ select ruby_avg(key1) from T_pkey1;
112
+ ruby_avg
113
+ ----------
114
+ 1
115
+ (1 row)
116
+
117
+ select ruby_sum(key1) from T_pkey1;
118
+ ruby_sum
119
+ ----------
120
+ 8
121
+ (1 row)
122
+
123
+ select ruby_avg(key1) from T_pkey2;
124
+ ruby_avg
125
+ ----------
126
+ 1
127
+ (1 row)
128
+
129
+ select ruby_sum(key1) from T_pkey2;
130
+ ruby_sum
131
+ ----------
132
+ 6
133
+ (1 row)
134
+
135
+ select ruby_avg(key1) from T_pkey1 where key1 = 99;
136
+ ruby_avg
137
+ ----------
138
+
139
+ (1 row)
140
+
141
+ select ruby_sum(key1) from T_pkey1 where key1 = 99;
142
+ ruby_sum
143
+ ----------
144
+ 0
145
+ (1 row)
146
+
147
+ select 1 @< 2;
148
+ ?column?
149
+ ----------
150
+ t
151
+ (1 row)
152
+
153
+ select 100 @< 4;
154
+ ?column?
155
+ ----------
156
+ f
157
+ (1 row)
158
+
159
+ select * from T_pkey1 order by key1 using @<;
160
+ key1 | key2 | txt
161
+ ------+--------+-------------
162
+ 1 | key1-1 | test key
163
+ 1 | key1-2 | test key
164
+ 1 | key1-3 | test key
165
+ 1 | KEY1-3 | should work
166
+ 2 | key2-3 | test key
167
+ 2 | key2-9 | test key
168
+ (6 rows)
169
+
170
+ select * from T_pkey2 order by key1 using @<;
171
+ key1 | key2 | txt
172
+ ------+--------+----------
173
+ 1 | KEY1-3 | test key
174
+ 1 | KEY1-9 | test key
175
+ 2 | KEY2-3 | test key
176
+ 2 | KEY2-9 | test key
177
+ (4 rows)
178
+
@@ -0,0 +1,178 @@
1
+ insert into T_pkey1 values (1, 'key1-1', 'test key');
2
+ insert into T_pkey1 values (1, 'key1-2', 'test key');
3
+ insert into T_pkey1 values (1, 'key1-3', 'test key');
4
+ insert into T_pkey1 values (2, 'key2-1', 'test key');
5
+ insert into T_pkey1 values (2, 'key2-2', 'test key');
6
+ insert into T_pkey1 values (2, 'key2-3', 'test key');
7
+ insert into T_pkey2 values (1, 'key1-1', 'test key');
8
+ insert into T_pkey2 values (1, 'key1-2', 'test key');
9
+ insert into T_pkey2 values (1, 'key1-3', 'test key');
10
+ insert into T_pkey2 values (2, 'key2-1', 'test key');
11
+ insert into T_pkey2 values (2, 'key2-2', 'test key');
12
+ insert into T_pkey2 values (2, 'key2-3', 'test key');
13
+ select * from T_pkey1;
14
+ key1 | key2 | txt
15
+ ------+--------+----------
16
+ 1 | key1-1 | test key
17
+ 1 | key1-2 | test key
18
+ 1 | key1-3 | test key
19
+ 2 | key2-1 | test key
20
+ 2 | key2-2 | test key
21
+ 2 | key2-3 | test key
22
+ (6 rows)
23
+
24
+ select * from T_pkey2;
25
+ key1 | key2 | txt
26
+ ------+--------+----------
27
+ 1 | KEY1-1 | test key
28
+ 1 | KEY1-2 | test key
29
+ 1 | KEY1-3 | test key
30
+ 2 | KEY2-1 | test key
31
+ 2 | KEY2-2 | test key
32
+ 2 | KEY2-3 | test key
33
+ (6 rows)
34
+
35
+ insert into T_pkey1 values (1, 'KEY1-3', 'should work');
36
+ insert into T_pkey2 values (1, 'KEY1-3', 'should fail');
37
+ ERROR: duplicate key '1', 'KEY1-3' for T_pkey2
38
+ insert into T_dta1 values ('trec 1', 1, 'key1-1');
39
+ insert into T_dta1 values ('trec 2', 1, 'key1-2');
40
+ insert into T_dta1 values ('trec 3', 1, 'key1-3');
41
+ insert into T_dta1 values ('trec 4', 1, 'key1-4');
42
+ ERROR: key for t_dta1 not in t_pkey1
43
+ insert into T_dta2 values ('trec 1', 1, 'KEY1-1');
44
+ insert into T_dta2 values ('trec 2', 1, 'KEY1-2');
45
+ insert into T_dta2 values ('trec 3', 1, 'KEY1-3');
46
+ insert into T_dta2 values ('trec 4', 1, 'KEY1-4');
47
+ ERROR: key for t_dta2 not in t_pkey2
48
+ select * from T_dta1;
49
+ tkey | ref1 | ref2
50
+ --------+------+--------
51
+ trec 1 | 1 | key1-1
52
+ trec 2 | 1 | key1-2
53
+ trec 3 | 1 | key1-3
54
+ (3 rows)
55
+
56
+ select * from T_dta2;
57
+ tkey | ref1 | ref2
58
+ --------+------+--------
59
+ trec 1 | 1 | KEY1-1
60
+ trec 2 | 1 | KEY1-2
61
+ trec 3 | 1 | KEY1-3
62
+ (3 rows)
63
+
64
+ update T_pkey1 set key2 = 'key2-9' where key1 = 2 and key2 = 'key2-1';
65
+ update T_pkey1 set key2 = 'key1-9' where key1 = 1 and key2 = 'key1-1';
66
+ ERROR: key '1', 'key1-1' referenced by T_dta1
67
+ delete from T_pkey1 where key1 = 2 and key2 = 'key2-2';
68
+ delete from T_pkey1 where key1 = 1 and key2 = 'key1-2';
69
+ ERROR: key '1', 'key1-2' referenced by T_dta1
70
+ update T_pkey2 set key2 = 'KEY2-9' where key1 = 2 and key2 = 'KEY2-1';
71
+ update T_pkey2 set key2 = 'KEY1-9' where key1 = 1 and key2 = 'KEY1-1';
72
+ NOTICE: updated 1 entries in T_dta2 for new key in T_pkey2
73
+ delete from T_pkey2 where key1 = 2 and key2 = 'KEY2-2';
74
+ delete from T_pkey2 where key1 = 1 and key2 = 'KEY1-2';
75
+ NOTICE: deleted 1 entries from T_dta2
76
+ select * from T_pkey1;
77
+ key1 | key2 | txt
78
+ ------+--------+-------------
79
+ 1 | key1-1 | test key
80
+ 1 | key1-2 | test key
81
+ 1 | key1-3 | test key
82
+ 2 | key2-3 | test key
83
+ 1 | KEY1-3 | should work
84
+ 2 | key2-9 | test key
85
+ (6 rows)
86
+
87
+ select * from T_pkey2;
88
+ key1 | key2 | txt
89
+ ------+--------+----------
90
+ 1 | KEY1-3 | test key
91
+ 2 | KEY2-3 | test key
92
+ 2 | KEY2-9 | test key
93
+ 1 | KEY1-9 | test key
94
+ (4 rows)
95
+
96
+ select * from T_dta1;
97
+ tkey | ref1 | ref2
98
+ --------+------+--------
99
+ trec 1 | 1 | key1-1
100
+ trec 2 | 1 | key1-2
101
+ trec 3 | 1 | key1-3
102
+ (3 rows)
103
+
104
+ select * from T_dta2;
105
+ tkey | ref1 | ref2
106
+ --------+------+--------
107
+ trec 3 | 1 | KEY1-3
108
+ trec 1 | 1 | KEY1-9
109
+ (2 rows)
110
+
111
+ select ruby_avg(key1) from T_pkey1;
112
+ ruby_avg
113
+ ----------
114
+ 1
115
+ (1 row)
116
+
117
+ select ruby_sum(key1) from T_pkey1;
118
+ ruby_sum
119
+ ----------
120
+ 8
121
+ (1 row)
122
+
123
+ select ruby_avg(key1) from T_pkey2;
124
+ ruby_avg
125
+ ----------
126
+ 1
127
+ (1 row)
128
+
129
+ select ruby_sum(key1) from T_pkey2;
130
+ ruby_sum
131
+ ----------
132
+ 6
133
+ (1 row)
134
+
135
+ select ruby_avg(key1) from T_pkey1 where key1 = 99;
136
+ ruby_avg
137
+ ----------
138
+
139
+ (1 row)
140
+
141
+ select ruby_sum(key1) from T_pkey1 where key1 = 99;
142
+ ruby_sum
143
+ ----------
144
+ 0
145
+ (1 row)
146
+
147
+ select 1 @< 2;
148
+ ?column?
149
+ ----------
150
+ t
151
+ (1 row)
152
+
153
+ select 100 @< 4;
154
+ ?column?
155
+ ----------
156
+ f
157
+ (1 row)
158
+
159
+ select * from T_pkey1 order by key1 using @<;
160
+ key1 | key2 | txt
161
+ ------+--------+-------------
162
+ 1 | key1-1 | test key
163
+ 1 | key1-2 | test key
164
+ 1 | key1-3 | test key
165
+ 1 | KEY1-3 | should work
166
+ 2 | key2-3 | test key
167
+ 2 | key2-9 | test key
168
+ (6 rows)
169
+
170
+ select * from T_pkey2 order by key1 using @<;
171
+ key1 | key2 | txt
172
+ ------+--------+----------
173
+ 1 | KEY1-3 | test key
174
+ 1 | KEY1-9 | test key
175
+ 2 | KEY2-3 | test key
176
+ 2 | KEY2-9 | test key
177
+ (4 rows)
178
+
@@ -0,0 +1,178 @@
1
+ insert into T_pkey1 values (1, 'key1-1', 'test key');
2
+ insert into T_pkey1 values (1, 'key1-2', 'test key');
3
+ insert into T_pkey1 values (1, 'key1-3', 'test key');
4
+ insert into T_pkey1 values (2, 'key2-1', 'test key');
5
+ insert into T_pkey1 values (2, 'key2-2', 'test key');
6
+ insert into T_pkey1 values (2, 'key2-3', 'test key');
7
+ insert into T_pkey2 values (1, 'key1-1', 'test key');
8
+ insert into T_pkey2 values (1, 'key1-2', 'test key');
9
+ insert into T_pkey2 values (1, 'key1-3', 'test key');
10
+ insert into T_pkey2 values (2, 'key2-1', 'test key');
11
+ insert into T_pkey2 values (2, 'key2-2', 'test key');
12
+ insert into T_pkey2 values (2, 'key2-3', 'test key');
13
+ select * from T_pkey1;
14
+ key1 | key2 | txt
15
+ ------+--------+----------
16
+ 1 | key1-1 | test key
17
+ 1 | key1-2 | test key
18
+ 1 | key1-3 | test key
19
+ 2 | key2-1 | test key
20
+ 2 | key2-2 | test key
21
+ 2 | key2-3 | test key
22
+ (6 rows)
23
+
24
+ select * from T_pkey2;
25
+ key1 | key2 | txt
26
+ ------+--------+----------
27
+ 1 | KEY1-1 | test key
28
+ 1 | KEY1-2 | test key
29
+ 1 | KEY1-3 | test key
30
+ 2 | KEY2-1 | test key
31
+ 2 | KEY2-2 | test key
32
+ 2 | KEY2-3 | test key
33
+ (6 rows)
34
+
35
+ insert into T_pkey1 values (1, 'KEY1-3', 'should work');
36
+ insert into T_pkey2 values (1, 'KEY1-3', 'should fail');
37
+ ERROR: duplicate key '1', 'KEY1-3' for T_pkey2
38
+ insert into T_dta1 values ('trec 1', 1, 'key1-1');
39
+ insert into T_dta1 values ('trec 2', 1, 'key1-2');
40
+ insert into T_dta1 values ('trec 3', 1, 'key1-3');
41
+ insert into T_dta1 values ('trec 4', 1, 'key1-4');
42
+ ERROR: key for t_dta1 not in t_pkey1
43
+ insert into T_dta2 values ('trec 1', 1, 'KEY1-1');
44
+ insert into T_dta2 values ('trec 2', 1, 'KEY1-2');
45
+ insert into T_dta2 values ('trec 3', 1, 'KEY1-3');
46
+ insert into T_dta2 values ('trec 4', 1, 'KEY1-4');
47
+ ERROR: key for t_dta2 not in t_pkey2
48
+ select * from T_dta1;
49
+ tkey | ref1 | ref2
50
+ --------+------+--------
51
+ trec 1 | 1 | key1-1
52
+ trec 2 | 1 | key1-2
53
+ trec 3 | 1 | key1-3
54
+ (3 rows)
55
+
56
+ select * from T_dta2;
57
+ tkey | ref1 | ref2
58
+ --------+------+--------
59
+ trec 1 | 1 | KEY1-1
60
+ trec 2 | 1 | KEY1-2
61
+ trec 3 | 1 | KEY1-3
62
+ (3 rows)
63
+
64
+ update T_pkey1 set key2 = 'key2-9' where key1 = 2 and key2 = 'key2-1';
65
+ update T_pkey1 set key2 = 'key1-9' where key1 = 1 and key2 = 'key1-1';
66
+ ERROR: key '1', 'key1-1' referenced by T_dta1
67
+ delete from T_pkey1 where key1 = 2 and key2 = 'key2-2';
68
+ delete from T_pkey1 where key1 = 1 and key2 = 'key1-2';
69
+ ERROR: key '1', 'key1-2' referenced by T_dta1
70
+ update T_pkey2 set key2 = 'KEY2-9' where key1 = 2 and key2 = 'KEY2-1';
71
+ update T_pkey2 set key2 = 'KEY1-9' where key1 = 1 and key2 = 'KEY1-1';
72
+ NOTICE: updated 1 entries in T_dta2 for new key in T_pkey2
73
+ delete from T_pkey2 where key1 = 2 and key2 = 'KEY2-2';
74
+ delete from T_pkey2 where key1 = 1 and key2 = 'KEY1-2';
75
+ NOTICE: deleted 1 entries from T_dta2
76
+ select * from T_pkey1;
77
+ key1 | key2 | txt
78
+ ------+--------+-------------
79
+ 1 | key1-1 | test key
80
+ 1 | key1-2 | test key
81
+ 1 | key1-3 | test key
82
+ 2 | key2-3 | test key
83
+ 1 | KEY1-3 | should work
84
+ 2 | key2-9 | test key
85
+ (6 rows)
86
+
87
+ select * from T_pkey2;
88
+ key1 | key2 | txt
89
+ ------+--------+----------
90
+ 1 | KEY1-3 | test key
91
+ 2 | KEY2-3 | test key
92
+ 2 | KEY2-9 | test key
93
+ 1 | KEY1-9 | test key
94
+ (4 rows)
95
+
96
+ select * from T_dta1;
97
+ tkey | ref1 | ref2
98
+ --------+------+--------
99
+ trec 1 | 1 | key1-1
100
+ trec 2 | 1 | key1-2
101
+ trec 3 | 1 | key1-3
102
+ (3 rows)
103
+
104
+ select * from T_dta2;
105
+ tkey | ref1 | ref2
106
+ --------+------+--------
107
+ trec 3 | 1 | KEY1-3
108
+ trec 1 | 1 | KEY1-9
109
+ (2 rows)
110
+
111
+ select ruby_avg(key1) from T_pkey1;
112
+ ruby_avg
113
+ ----------
114
+ 1
115
+ (1 row)
116
+
117
+ select ruby_sum(key1) from T_pkey1;
118
+ ruby_sum
119
+ ----------
120
+ 8
121
+ (1 row)
122
+
123
+ select ruby_avg(key1) from T_pkey2;
124
+ ruby_avg
125
+ ----------
126
+ 1
127
+ (1 row)
128
+
129
+ select ruby_sum(key1) from T_pkey2;
130
+ ruby_sum
131
+ ----------
132
+ 6
133
+ (1 row)
134
+
135
+ select ruby_avg(key1) from T_pkey1 where key1 = 99;
136
+ ruby_avg
137
+ ----------
138
+
139
+ (1 row)
140
+
141
+ select ruby_sum(key1) from T_pkey1 where key1 = 99;
142
+ ruby_sum
143
+ ----------
144
+ 0
145
+ (1 row)
146
+
147
+ select 1 @< 2;
148
+ ?column?
149
+ ----------
150
+ t
151
+ (1 row)
152
+
153
+ select 100 @< 4;
154
+ ?column?
155
+ ----------
156
+ f
157
+ (1 row)
158
+
159
+ select * from T_pkey1 order by key1 using @<;
160
+ key1 | key2 | txt
161
+ ------+--------+-------------
162
+ 1 | key1-1 | test key
163
+ 1 | key1-2 | test key
164
+ 1 | key1-3 | test key
165
+ 1 | KEY1-3 | should work
166
+ 2 | key2-3 | test key
167
+ 2 | key2-9 | test key
168
+ (6 rows)
169
+
170
+ select * from T_pkey2 order by key1 using @<;
171
+ key1 | key2 | txt
172
+ ------+--------+----------
173
+ 1 | KEY1-3 | test key
174
+ 1 | KEY1-9 | test key
175
+ 2 | KEY2-3 | test key
176
+ 2 | KEY2-9 | test key
177
+ (4 rows)
178
+