2 /* contrib/seg/segparse.y */
10 #include "nodes/miscnodes.h"
11 #include "utils/builtins.h"
12 #include "utils/float.h"
16 /* silence -Wmissing-variable-declarations */
17 extern
int seg_yychar
;
18 extern
int seg_yynerrs
;
21 * Bison doesn't allocate anything that needs to live across parser calls,
22 * so we can easily have it use palloc instead of malloc. This prevents
23 * memory leaks if we error out during parsing.
25 #define YYMALLOC palloc
28 static bool seg_atof
(char *value
, float *result
, struct Node
*escontext
);
30 static int sig_digits
(const char *value
);
34 /* BISON Declarations */
35 %parse
-param
{SEG
*result
}
36 %parse
-param
{struct Node
*escontext
}
50 %token
<text
> SEGFLOAT
53 %token
<text
> EXTENSION
62 range: boundary PLUMIN deviation
66 result
->lower
= $1.val
- $3.val
;
67 result
->upper
= $1.val
+ $3.val
;
68 snprintf
(strbuf
, sizeof
(strbuf
), "%g", result
->lower
);
69 result
->l_sigd
= Max
(sig_digits
(strbuf
), Max
($1.sigd
, $3.sigd
));
70 snprintf
(strbuf
, sizeof
(strbuf
), "%g", result
->upper
);
71 result
->u_sigd
= Max
(sig_digits
(strbuf
), Max
($1.sigd
, $3.sigd
));
76 | boundary RANGE boundary
78 result
->lower
= $1.val
;
79 result
->upper
= $3.val
;
80 if
( result
->lower
> result
->upper
) {
82 (errcode
(ERRCODE_INVALID_PARAMETER_VALUE
),
83 errmsg
("swapped boundaries: %g is greater than %g",
84 result
->lower
, result
->upper
)));
88 result
->l_sigd
= $1.sigd
;
89 result
->u_sigd
= $3.sigd
;
90 result
->l_ext
= ( $1.ext ?
$1.ext
: '\0' );
91 result
->u_ext
= ( $3.ext ?
$3.ext
: '\0' );
96 result
->lower
= $1.val
;
97 result
->upper
= HUGE_VAL
;
98 result
->l_sigd
= $1.sigd
;
100 result
->l_ext
= ( $1.ext ?
$1.ext
: '\0' );
106 result
->lower
= -HUGE_VAL
;
107 result
->upper
= $2.val
;
109 result
->u_sigd
= $2.sigd
;
111 result
->u_ext
= ( $2.ext ?
$2.ext
: '\0' );
116 result
->lower
= result
->upper
= $1.val
;
117 result
->l_sigd
= result
->u_sigd
= $1.sigd
;
118 result
->l_ext
= result
->u_ext
= ( $1.ext ?
$1.ext
: '\0' );
124 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
127 if
(!seg_atof
($1, &val
, escontext
))
131 $$.sigd
= sig_digits
($1);
136 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
139 if
(!seg_atof
($2, &val
, escontext
))
143 $$.sigd
= sig_digits
($2);
150 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
153 if
(!seg_atof
($1, &val
, escontext
))
157 $$.sigd
= sig_digits
($1);
166 seg_atof
(char *value
, float *result
, struct Node
*escontext
)
168 *result
= float4in_internal
(value
, NULL
, "seg", value
, escontext
);
169 if
(SOFT_ERROR_OCCURRED
(escontext
))
175 sig_digits
(const char *value
)
177 int n
= significant_digits
(value
);
179 /* Clamp, to ensure value will fit in sigd fields */
180 return Min
(n
, FLT_DIG
);