Skip to content

Commit b7e12f3

Browse files
committed
Fix output precision limit for double values (issue #118)
pgSphere used its own setting (set_sphere_output_precision function) to limit the output precision of double values, that could not be greater than 15 significant digits (DBL_DIG). It introduced some problems with dump/restore. PostgreSQL uses its own precision setting: extra_float_digits. The PostgreSQL setting allows to use more significant digits. This patch changes the default pgSphere output behaviour to utilize PostgreSQL extra_float_digits. Now, extra_float_digits is used by default, until set_sphere_output_precision is called. The old behaviour is kept for compatibility purposes. Once, set_sphere_output_precision is called, pgSphere starts to use the old behaviour (read, please, issue #118 discussion). The patch introduces a new function - reset_sphere_output_precision. It is used to reset to the PostgreSQL behaviour after using set_sphere_output_precision.
1 parent 462fa03 commit b7e12f3

File tree

3 files changed

+956
-11
lines changed

3 files changed

+956
-11
lines changed

expected/bounding_box_gist_2.out

+240
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
SET enable_seqscan=true;
2+
CREATE TABLE bbox_ellipse (e sellipse not null);
3+
INSERT INTO bbox_ellipse VALUES ('<{10d, 0.1d}, (0d,0d), 0d>');
4+
SELECT spoint '(5d, 0d)' @ sellipse '<{10d, 0.1d}, (0d,0d), 0d>' AS inside;
5+
inside
6+
--------
7+
t
8+
(1 row)
9+
10+
SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e;
11+
count
12+
-------
13+
1
14+
(1 row)
15+
16+
SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' <@ e;
17+
count
18+
-------
19+
1
20+
(1 row)
21+
22+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e;
23+
QUERY PLAN
24+
-----------------------------------------------------------
25+
Aggregate
26+
-> Seq Scan on bbox_ellipse
27+
Filter: ('(0.08726646259971647 , 0)'::spoint @ e)
28+
(3 rows)
29+
30+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' <@ e;
31+
QUERY PLAN
32+
------------------------------------------------------------
33+
Aggregate
34+
-> Seq Scan on bbox_ellipse
35+
Filter: ('(0.08726646259971647 , 0)'::spoint <@ e)
36+
(3 rows)
37+
38+
-- The ellipse has semi-major axis length of 10 degrees along the equator,
39+
-- so (lon,lat) = (5,0) should be inside.
40+
CREATE INDEX idx_bbox_ellipse ON bbox_ellipse USING gist (e);
41+
ANALYZE bbox_ellipse;
42+
SET enable_seqscan=false;
43+
SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e;
44+
count
45+
-------
46+
1
47+
(1 row)
48+
49+
SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' <@ e;
50+
count
51+
-------
52+
1
53+
(1 row)
54+
55+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' @ e;
56+
QUERY PLAN
57+
---------------------------------------------------------------
58+
Aggregate
59+
-> Index Scan using idx_bbox_ellipse on bbox_ellipse
60+
Index Cond: (e ~ '(0.08726646259971647 , 0)'::spoint)
61+
(3 rows)
62+
63+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_ellipse WHERE spoint '(5d, 0d)' <@ e;
64+
QUERY PLAN
65+
----------------------------------------------------------------
66+
Aggregate
67+
-> Index Scan using idx_bbox_ellipse on bbox_ellipse
68+
Index Cond: (e @> '(0.08726646259971647 , 0)'::spoint)
69+
(3 rows)
70+
71+
SET enable_seqscan=true;
72+
CREATE TABLE bbox_poly (p spoly not null);
73+
INSERT INTO bbox_poly VALUES ('{(40d,-40d), (0d,80d), (-40d,-40d)}');
74+
SELECT spoint '(0d, 0d)' @ spoly '{(40d,-40d), (0d,80d), (-40d,-40d)}' AS inside;
75+
inside
76+
--------
77+
t
78+
(1 row)
79+
80+
SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p;
81+
count
82+
-------
83+
1
84+
(1 row)
85+
86+
SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' <@ p;
87+
count
88+
-------
89+
1
90+
(1 row)
91+
92+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p;
93+
QUERY PLAN
94+
-----------------------------------------
95+
Aggregate
96+
-> Seq Scan on bbox_poly
97+
Filter: ('(0 , 0)'::spoint @ p)
98+
(3 rows)
99+
100+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' <@ p;
101+
QUERY PLAN
102+
------------------------------------------
103+
Aggregate
104+
-> Seq Scan on bbox_poly
105+
Filter: ('(0 , 0)'::spoint <@ p)
106+
(3 rows)
107+
108+
CREATE INDEX idx_bbox_poly ON bbox_poly USING gist (p);
109+
ANALYZE bbox_poly;
110+
SET enable_seqscan=false;
111+
SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p;
112+
count
113+
-------
114+
1
115+
(1 row)
116+
117+
SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' <@ p;
118+
count
119+
-------
120+
1
121+
(1 row)
122+
123+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' @ p;
124+
QUERY PLAN
125+
---------------------------------------------------
126+
Aggregate
127+
-> Index Scan using idx_bbox_poly on bbox_poly
128+
Index Cond: (p ~ '(0 , 0)'::spoint)
129+
(3 rows)
130+
131+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_poly WHERE spoint '(0d, 0d)' <@ p;
132+
QUERY PLAN
133+
---------------------------------------------------
134+
Aggregate
135+
-> Index Scan using idx_bbox_poly on bbox_poly
136+
Index Cond: (p @> '(0 , 0)'::spoint)
137+
(3 rows)
138+
139+
SET enable_seqscan=true;
140+
CREATE TABLE bbox_path (p spath not null);
141+
INSERT INTO bbox_path VALUES ('{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}');
142+
SELECT sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS crossing;
143+
crossing
144+
----------
145+
t
146+
(1 row)
147+
148+
SELECT spoint '(0d, 0d)' @ spath '{(-46d,0d), (-45d,80d), (-45d,0d), (80d,0d)}' AS inside;
149+
inside
150+
--------
151+
t
152+
(1 row)
153+
154+
SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p;
155+
count
156+
-------
157+
1
158+
(1 row)
159+
160+
SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p;
161+
count
162+
-------
163+
1
164+
(1 row)
165+
166+
SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' <@ p;
167+
count
168+
-------
169+
1
170+
(1 row)
171+
172+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p;
173+
QUERY PLAN
174+
---------------------------------------------------------------------------------------------------------
175+
Aggregate
176+
-> Seq Scan on bbox_path
177+
Filter: ('( 6.1086523819801535, 1.5707963267948966, 0, ZXZ ), 0.34906585039886584'::sline && p)
178+
(3 rows)
179+
180+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p;
181+
QUERY PLAN
182+
-----------------------------------------
183+
Aggregate
184+
-> Seq Scan on bbox_path
185+
Filter: ('(0 , 0)'::spoint @ p)
186+
(3 rows)
187+
188+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' <@ p;
189+
QUERY PLAN
190+
------------------------------------------
191+
Aggregate
192+
-> Seq Scan on bbox_path
193+
Filter: ('(0 , 0)'::spoint <@ p)
194+
(3 rows)
195+
196+
CREATE INDEX idx_bbox_path ON bbox_path USING gist (p);
197+
ANALYZE bbox_path;
198+
SET enable_seqscan=false;
199+
SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p;
200+
count
201+
-------
202+
1
203+
(1 row)
204+
205+
SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p;
206+
count
207+
-------
208+
1
209+
(1 row)
210+
211+
SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' <@ p;
212+
count
213+
-------
214+
1
215+
(1 row)
216+
217+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE sline(spoint '(0d, -10d)', spoint '(0d, 10d)') && p;
218+
QUERY PLAN
219+
-------------------------------------------------------------------------------------------------------------
220+
Aggregate
221+
-> Index Scan using idx_bbox_path on bbox_path
222+
Index Cond: (p && '( 6.1086523819801535, 1.5707963267948966, 0, ZXZ ), 0.34906585039886584'::sline)
223+
(3 rows)
224+
225+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' @ p;
226+
QUERY PLAN
227+
---------------------------------------------------
228+
Aggregate
229+
-> Index Scan using idx_bbox_path on bbox_path
230+
Index Cond: (p ~ '(0 , 0)'::spoint)
231+
(3 rows)
232+
233+
EXPLAIN (COSTS OFF) SELECT COUNT(*) FROM bbox_path WHERE spoint '(0d, 0d)' <@ p;
234+
QUERY PLAN
235+
---------------------------------------------------
236+
Aggregate
237+
-> Index Scan using idx_bbox_path on bbox_path
238+
Index Cond: (p @> '(0 , 0)'::spoint)
239+
(3 rows)
240+

expected/epochprop_1.out

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
SELECT
2+
to_char(DEGREES(tp[1]), '999D9999999999'),
3+
to_char(DEGREES(tp[2]), '999D9999999999'),
4+
to_char(tp[3], '999D999'),
5+
to_char(DEGREES(tp[4])*3.6e6, '999D999'),
6+
to_char(DEGREES(tp[5])*3.6e6, '99999D999'),
7+
to_char(tp[6], '999D999')
8+
FROM (
9+
SELECT epoch_prop(spoint(radians(269.45207695), radians(4.693364966)),
10+
546.9759,
11+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6), -110,
12+
-100) AS tp) AS q;
13+
to_char | to_char | to_char | to_char | to_char | to_char
14+
-----------------+-----------------+----------+----------+------------+----------
15+
269.4742714391 | 4.4072939987 | 543.624 | -791.442 | 10235.412 | -110.450
16+
(1 row)
17+
18+
SELECT
19+
to_char(DEGREES(tp[1]), '999D9999999999'),
20+
to_char(DEGREES(tp[2]), '999D9999999999'),
21+
to_char(tp[3], '999D999'),
22+
to_char(DEGREES(tp[4])*3.6e6, '999D999'),
23+
to_char(DEGREES(tp[5])*3.6e6, '99999D999'),
24+
to_char(tp[6], '999D999')
25+
FROM (
26+
SELECT epoch_prop(spoint(radians(269.45207695), radians(4.693364966)),
27+
0,
28+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6), -110,
29+
-100) AS tp) AS q;
30+
to_char | to_char | to_char | to_char | to_char | to_char
31+
-----------------+-----------------+---------+----------+------------+---------
32+
269.4744079540 | 4.4055337210 | | -801.210 | 10361.762 |
33+
(1 row)
34+
35+
SELECT
36+
to_char(DEGREES(tp[1]), '999D9999999999'),
37+
to_char(DEGREES(tp[2]), '999D9999999999'),
38+
to_char(tp[3], '999D999'),
39+
to_char(DEGREES(tp[4])*3.6e6, '999D999'),
40+
to_char(DEGREES(tp[5])*3.6e6, '99999D999'),
41+
to_char(tp[6], '999D999')
42+
FROM (
43+
SELECT epoch_prop(spoint(radians(269.45207695), radians(4.693364966)),
44+
NULL,
45+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6), -110,
46+
-100) AS tp) AS q;
47+
to_char | to_char | to_char | to_char | to_char | to_char
48+
-----------------+-----------------+---------+----------+------------+---------
49+
269.4744079540 | 4.4055337210 | | -801.210 | 10361.762 |
50+
(1 row)
51+
52+
SELECT
53+
to_char(DEGREES(tp[1]), '999D9999999999'),
54+
to_char(DEGREES(tp[2]), '999D9999999999'),
55+
to_char(tp[3], '999D999'),
56+
to_char(DEGREES(tp[4])*3.6e6, '999D999'),
57+
to_char(DEGREES(tp[5])*3.6e6, '99999D999'),
58+
to_char(tp[6], '999D999')
59+
FROM (
60+
SELECT epoch_prop(spoint(radians(269.45207695), radians(4.693364966)),
61+
23,
62+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6), NULL,
63+
20) AS tp) AS q;
64+
to_char | to_char | to_char | to_char | to_char | to_char
65+
-----------------+-----------------+----------+----------+------------+----------
66+
269.4476085384 | 4.7509315989 | 23.000 | -801.617 | 10361.984 | 2.159
67+
(1 row)
68+
69+
SELECT
70+
to_char(DEGREES(tp[1]), '999D9999999999'),
71+
to_char(DEGREES(tp[2]), '999D9999999999'),
72+
to_char(tp[3], '999D999'),
73+
to_char(DEGREES(tp[4])*3.6e6, '999D999'),
74+
to_char(DEGREES(tp[5])*3.6e6, '99999D999'),
75+
to_char(tp[6], '999D999')
76+
FROM (
77+
SELECT epoch_prop(spoint(radians(269.45207695), radians(4.693364966)),
78+
23,
79+
NULL, RADIANS(10362/3.6e6), -110,
80+
120) AS tp) AS q;
81+
to_char | to_char | to_char | to_char | to_char | to_char
82+
-----------------+-----------------+----------+----------+------------+----------
83+
269.4520769500 | 5.0388680565 | 23.007 | -.000 | 10368.061 | -97.120
84+
(1 row)
85+
86+
SELECT epoch_prop(NULL,
87+
23,
88+
0.01 , RADIANS(10362/3.6e6), -110,
89+
120);
90+
ERROR: NULL position not supported in epoch propagation
91+
SELECT epoch_prop_pos(spoint(radians(269.45207695), radians(4.693364966)),
92+
23,
93+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6), -110,
94+
20) AS tp;
95+
tp
96+
-------------------------------------------
97+
(4.702747926583129 , 0.08291945093459933)
98+
(1 row)
99+
100+
SELECT epoch_prop_pos(spoint(radians(269.45207695), radians(4.693364966)),
101+
RADIANS(-801.551/3.6e6), RADIANS(10362/3.6e6),
102+
20) AS tp;
103+
tp
104+
-------------------------------------------
105+
(4.702747930619516 , 0.08291939893808763)
106+
(1 row)
107+

0 commit comments

Comments
 (0)