Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit80b3513

Browse files
committed
The attached patch provides cube with 4 functions for building cubes
directly from float8 values. (As opposed to converting the values tostringsand then parsing the strings.)The functions are:cube(float8) returns cubecube(float8,float8) returns cubecube(cube,float8) returns cubecube(cube,float8,float8) returns cubeBruno Wolff III
1 parentf249daf commit80b3513

File tree

5 files changed

+205
-17
lines changed

5 files changed

+205
-17
lines changed

‎contrib/cube/README.cube

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,27 @@ cube(text) returns cube
264264
cube takes text input and returns a cube. This is useful for making cubes
265265
from computed strings.
266266

267+
cube(float8) returns cube
268+
This makes a one dimensional cube with both coordinates the same.
269+
If the type of the argument is a numeric type other than float8 an
270+
explicit cast to float8 may be needed.
271+
cube(1) == '(1)'
272+
273+
cube(float8, float8) returns cube
274+
This makes a one dimensional cube.
275+
cube(1,2) == '(1),(2)'
276+
277+
cube(cube, float8) returns cube
278+
This builds a new cube by adding a dimension on to an existing cube with
279+
the same values for both parts of the new coordinate. This is useful for
280+
building cubes piece by piece from calculated values.
281+
cube('(1)',2) == '(1,2),(1,2)'
282+
283+
cube(cube, float8, float8) returns cube
284+
This builds a new cube by adding a dimension on to an existing cube.
285+
This is useful for building cubes piece by piece from calculated values.
286+
cube('(1,2)',3,4) == '(1,3),(2,4)'
287+
267288
cube_dim(cube) returns int
268289
cube_dim returns the number of dimensions stored in the the data structure
269290
for a cube. This is useful for constraints on the dimensions of a cube.

‎contrib/cube/cube.c

Lines changed: 82 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ extern intcube_yyparse();
3030
NDBOX*cube_in(char*str);
3131
NDBOX*cube(text*str);
3232
char*cube_out(NDBOX*cube);
33+
NDBOX*cube_f8(double*);
34+
NDBOX*cube_f8_f8(double*,double*);
35+
NDBOX*cube_c_f8(NDBOX*,double*);
36+
NDBOX*cube_c_f8_f8(NDBOX*,double*,double*);
37+
int4cube_dim(NDBOX*a);
38+
double*cube_ll_coord(NDBOX*a,int4n);
39+
double*cube_ur_coord(NDBOX*a,int4n);
3340

3441

3542
/*
@@ -73,9 +80,6 @@ boolcube_right(NDBOX * a, NDBOX * b);
7380
boolcube_lt(NDBOX*a,NDBOX*b);
7481
boolcube_gt(NDBOX*a,NDBOX*b);
7582
double*cube_distance(NDBOX*a,NDBOX*b);
76-
int4cube_dim(NDBOX*a);
77-
double*cube_ll_coord(NDBOX*a,int4n);
78-
double*cube_ur_coord(NDBOX*a,int4n);
7983
boolcube_is_point(NDBOX*a);
8084
NDBOX*cube_enlarge(NDBOX*a,double*r,int4n);
8185

@@ -1226,3 +1230,78 @@ cube_enlarge(NDBOX * a, double *r, int4 n)
12261230
}
12271231
returnresult;
12281232
}
1233+
1234+
/* Create a one dimensional box with identical upper and lower coordinates */
1235+
NDBOX*
1236+
cube_f8(double*x1)
1237+
{
1238+
NDBOX*result;
1239+
intsize;
1240+
size= offsetof(NDBOX,x[0])+sizeof(double)*2;
1241+
result= (NDBOX*)palloc(size);
1242+
memset(result,0,size);
1243+
result->size=size;
1244+
result->dim=1;
1245+
result->x[0]=*x1;
1246+
result->x[1]=*x1;
1247+
returnresult;
1248+
}
1249+
1250+
/* Create a one dimensional box */
1251+
NDBOX*
1252+
cube_f8_f8(double*x1,double*x2)
1253+
{
1254+
NDBOX*result;
1255+
intsize;
1256+
size= offsetof(NDBOX,x[0])+sizeof(double)*2;
1257+
result= (NDBOX*)palloc(size);
1258+
memset(result,0,size);
1259+
result->size=size;
1260+
result->dim=1;
1261+
result->x[0]=*x1;
1262+
result->x[1]=*x2;
1263+
returnresult;
1264+
}
1265+
1266+
/* Add a dimension to an existing cube with the same values for the new
1267+
coordinate */
1268+
NDBOX*
1269+
cube_c_f8(NDBOX*c,double*x1)
1270+
{
1271+
NDBOX*result;
1272+
intsize;
1273+
inti;
1274+
size= offsetof(NDBOX,x[0])+sizeof(double)* (c->dim+1)*2;
1275+
result= (NDBOX*)palloc(size);
1276+
memset(result,0,size);
1277+
result->size=size;
1278+
result->dim=c->dim+1;
1279+
for (i=0;i<c->dim;i++) {
1280+
result->x[i]=c->x[i];
1281+
result->x[result->dim+i]=c->x[c->dim+i];
1282+
}
1283+
result->x[result->dim-1]=*x1;
1284+
result->x[2*result->dim-1]=*x1;
1285+
returnresult;
1286+
}
1287+
1288+
/* Add a dimension to an existing cube */
1289+
NDBOX*
1290+
cube_c_f8_f8(NDBOX*c,double*x1,double*x2)
1291+
{
1292+
NDBOX*result;
1293+
intsize;
1294+
inti;
1295+
size= offsetof(NDBOX,x[0])+sizeof(double)* (c->dim+1)*2;
1296+
result= (NDBOX*)palloc(size);
1297+
memset(result,0,size);
1298+
result->size=size;
1299+
result->dim=c->dim+1;
1300+
for (i=0;i<c->dim;i++) {
1301+
result->x[i]=c->x[i];
1302+
result->x[result->dim+i]=c->x[c->dim+i];
1303+
}
1304+
result->x[result->dim-1]=*x1;
1305+
result->x[2*result->dim-1]=*x2;
1306+
returnresult;
1307+
}

‎contrib/cube/cube.sql.in

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,22 @@ RETURNS float8
165165
AS 'MODULE_PATHNAME'
166166
LANGUAGE 'C' IMMUTABLE STRICT;
167167

168+
CREATE OR REPLACE FUNCTION cube(float8) RETURNS cube
169+
AS 'MODULE_PATHNAME', 'cube_f8'
170+
LANGUAGE 'C' IMMUTABLE STRICT;
171+
172+
CREATE OR REPLACE FUNCTION cube(float8, float8) RETURNS cube
173+
AS 'MODULE_PATHNAME', 'cube_f8_f8'
174+
LANGUAGE 'C' IMMUTABLE STRICT;
175+
176+
CREATE OR REPLACE FUNCTION cube(cube, float8) RETURNS cube
177+
AS 'MODULE_PATHNAME', 'cube_c_f8'
178+
LANGUAGE 'C' IMMUTABLE STRICT;
179+
180+
CREATE OR REPLACE FUNCTION cube(cube, float8, float8) RETURNS cube
181+
AS 'MODULE_PATHNAME', 'cube_c_f8_f8'
182+
LANGUAGE 'C' IMMUTABLE STRICT;
183+
168184
-- Test if cube is also a point
169185

170186
CREATE OR REPLACE FUNCTION cube_is_point(cube)

‎contrib/cube/expected/cube.out

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -258,46 +258,46 @@ SELECT '[(0,0,0,0),(1,0,0,0)]'::cube AS cube;
258258
SELECT ''::cube AS cube;
259259
ERROR: cube_in: can't parse an empty string
260260
SELECT 'ABC'::cube AS cube;
261-
ERROR:parse error at or before position 1, character ('A', \101), input: 'ABC'
261+
ERROR:syntax error at or before position 1, character ('A', \101), input: 'ABC'
262262

263263
SELECT '()'::cube AS cube;
264-
ERROR:parse error at or before position 2, character (')', \051), input: '()'
264+
ERROR:syntax error at or before position 2, character (')', \051), input: '()'
265265

266266
SELECT '[]'::cube AS cube;
267-
ERROR:parse error at or before position 2, character (']', \135), input: '[]'
267+
ERROR:syntax error at or before position 2, character (']', \135), input: '[]'
268268

269269
SELECT '[()]'::cube AS cube;
270-
ERROR:parse error at or before position 3, character (')', \051), input: '[()]'
270+
ERROR:syntax error at or before position 3, character (')', \051), input: '[()]'
271271

272272
SELECT '[(1)]'::cube AS cube;
273-
ERROR:parse error at or before position 5, character (']', \135), input: '[(1)]'
273+
ERROR:syntax error at or before position 5, character (']', \135), input: '[(1)]'
274274

275275
SELECT '[(1),]'::cube AS cube;
276-
ERROR:parse error at or before position 6, character (']', \135), input: '[(1),]'
276+
ERROR:syntax error at or before position 6, character (']', \135), input: '[(1),]'
277277

278278
SELECT '[(1),2]'::cube AS cube;
279-
ERROR:parse error at or before position 7, character (']', \135), input: '[(1),2]'
279+
ERROR:syntax error at or before position 7, character (']', \135), input: '[(1),2]'
280280

281281
SELECT '[(1),(2),(3)]'::cube AS cube;
282-
ERROR:parse error at or before position 9, character (',', \054), input: '[(1),(2),(3)]'
282+
ERROR:syntax error at or before position 9, character (',', \054), input: '[(1),(2),(3)]'
283283

284284
SELECT '1,'::cube AS cube;
285-
ERROR:parse error at or before position 2, character (',', \054), input: '1,'
285+
ERROR:syntax error at or before position 2, character (',', \054), input: '1,'
286286

287287
SELECT '1,2,'::cube AS cube;
288-
ERROR:parse error at or before position 4, character (',', \054), input: '1,2,'
288+
ERROR:syntax error at or before position 4, character (',', \054), input: '1,2,'
289289

290290
SELECT '1,,2'::cube AS cube;
291-
ERROR:parse error at or before position 3, character (',', \054), input: '1,,2'
291+
ERROR:syntax error at or before position 3, character (',', \054), input: '1,,2'
292292

293293
SELECT '(1,)'::cube AS cube;
294-
ERROR:parse error at or before position 4, character (')', \051), input: '(1,)'
294+
ERROR:syntax error at or before position 4, character (')', \051), input: '(1,)'
295295

296296
SELECT '(1,2,)'::cube AS cube;
297-
ERROR:parse error at or before position 6, character (')', \051), input: '(1,2,)'
297+
ERROR:syntax error at or before position 6, character (')', \051), input: '(1,2,)'
298298

299299
SELECT '(1,,2)'::cube AS cube;
300-
ERROR:parse error at or before position 4, character (',', \054), input: '(1,,2)'
300+
ERROR:syntax error at or before position 4, character (',', \054), input: '(1,,2)'
301301

302302
-- invalid input: semantic errors and trailing garbage
303303
SELECT '[(1),(2)],'::cube AS cube; -- 0
@@ -339,6 +339,60 @@ ERROR: (7) bad cube representation; garbage at or before char 4, ('end of input
339339
SELECT '1..2'::cube AS cube; -- 7
340340
ERROR: (7) bad cube representation; garbage at or before char 4, ('end of input', \000)
341341

342+
--
343+
-- Testing building cubes from float8 values
344+
--
345+
SELECT cube(0::float8);
346+
cube
347+
------
348+
(0)
349+
(1 row)
350+
351+
SELECT cube(1::float8);
352+
cube
353+
------
354+
(1)
355+
(1 row)
356+
357+
SELECT cube(1,2);
358+
cube
359+
---------
360+
(1),(2)
361+
(1 row)
362+
363+
SELECT cube(cube(1,2),3);
364+
cube
365+
---------------
366+
(1, 3),(2, 3)
367+
(1 row)
368+
369+
SELECT cube(cube(1,2),3,4);
370+
cube
371+
---------------
372+
(1, 3),(2, 4)
373+
(1 row)
374+
375+
SELECT cube(cube(cube(1,2),3,4),5);
376+
cube
377+
---------------------
378+
(1, 3, 5),(2, 4, 5)
379+
(1 row)
380+
381+
SELECT cube(cube(cube(1,2),3,4),5,6);
382+
cube
383+
---------------------
384+
(1, 3, 5),(2, 4, 6)
385+
(1 row)
386+
387+
--
388+
-- Test that the text -> cube cast was installed.
389+
--
390+
SELECT '(0)'::text::cube;
391+
cube
392+
------
393+
(0)
394+
(1 row)
395+
342396
--
343397
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
344398
--

‎contrib/cube/sql/cube.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,24 @@ SELECT '1 e7'::cube AS cube; -- 6
9292
SELECT'1,2a'::cubeAS cube;-- 7
9393
SELECT'1..2'::cubeAS cube;-- 7
9494

95+
--
96+
-- Testing building cubes from float8 values
97+
--
98+
99+
SELECT cube(0::float8);
100+
SELECT cube(1::float8);
101+
SELECT cube(1,2);
102+
SELECT cube(cube(1,2),3);
103+
SELECT cube(cube(1,2),3,4);
104+
SELECT cube(cube(cube(1,2),3,4),5);
105+
SELECT cube(cube(cube(1,2),3,4),5,6);
106+
107+
--
108+
-- Test that the text -> cube cast was installed.
109+
--
110+
111+
SELECT'(0)'::text::cube;
112+
95113
--
96114
-- Testing limit of CUBE_MAX_DIM dimensions check in cube_in.
97115
--

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp