@@ -128,9 +128,9 @@ multirange_in(PG_FUNCTION_ARGS)
128
128
MultirangeType * ret ;
129
129
MultirangeParseState parse_state ;
130
130
const char * ptr = input_str ;
131
- const char * range_str = NULL ;
131
+ const char * range_str_begin = NULL ;
132
132
int32 range_str_len ;
133
- char * range_str_copy ;
133
+ char * range_str ;
134
134
135
135
cache = get_multirange_io_data (fcinfo , mltrngtypoid , IOFunc_input );
136
136
rangetyp = cache -> typcache -> rngtype ;
@@ -170,7 +170,7 @@ multirange_in(PG_FUNCTION_ARGS)
170
170
case MULTIRANGE_BEFORE_RANGE :
171
171
if (ch == '[' || ch == '(' )
172
172
{
173
- range_str = ptr ;
173
+ range_str_begin = ptr ;
174
174
parse_state = MULTIRANGE_IN_RANGE ;
175
175
}
176
176
else if (ch == '}' && ranges_seen == 0 )
@@ -191,14 +191,10 @@ multirange_in(PG_FUNCTION_ARGS)
191
191
errdetail ("Expected range start." )));
192
192
break ;
193
193
case MULTIRANGE_IN_RANGE :
194
- if (ch == '"' )
195
- parse_state = MULTIRANGE_IN_RANGE_QUOTED ;
196
- else if (ch == '\\' )
197
- parse_state = MULTIRANGE_IN_RANGE_ESCAPED ;
198
- else if (ch == ']' || ch == ')' )
194
+ if (ch == ']' || ch == ')' )
199
195
{
200
- range_str_len = ptr - range_str + 1 ;
201
- range_str_copy = pnstrdup (range_str , range_str_len );
196
+ range_str_len = ptr - range_str_begin + 1 ;
197
+ range_str = pnstrdup (range_str_begin , range_str_len );
202
198
if (range_capacity == range_count )
203
199
{
204
200
range_capacity *= 2 ;
@@ -207,18 +203,30 @@ multirange_in(PG_FUNCTION_ARGS)
207
203
}
208
204
ranges_seen ++ ;
209
205
range = DatumGetRangeTypeP (InputFunctionCall (& cache -> typioproc ,
210
- range_str_copy ,
206
+ range_str ,
211
207
cache -> typioparam ,
212
208
typmod ));
213
209
if (!RangeIsEmpty (range ))
214
210
ranges [range_count ++ ] = range ;
215
211
parse_state = MULTIRANGE_AFTER_RANGE ;
216
212
}
217
213
else
218
- /* include it in range_str */ ;
214
+ {
215
+ if (ch == '"' )
216
+ parse_state = MULTIRANGE_IN_RANGE_QUOTED ;
217
+ else if (ch == '\\' )
218
+ parse_state = MULTIRANGE_IN_RANGE_ESCAPED ;
219
+ /*
220
+ * We will include this character into range_str once we
221
+ * find the end of the range value.
222
+ */
223
+ }
219
224
break ;
220
225
case MULTIRANGE_IN_RANGE_ESCAPED :
221
- /* include it in range_str */
226
+ /*
227
+ * We will include this character into range_str once we find
228
+ * the end of the range value.
229
+ */
222
230
parse_state = MULTIRANGE_IN_RANGE ;
223
231
break ;
224
232
case MULTIRANGE_IN_RANGE_QUOTED :
@@ -232,8 +240,11 @@ multirange_in(PG_FUNCTION_ARGS)
232
240
parse_state = MULTIRANGE_IN_RANGE ;
233
241
else if (ch == '\\' )
234
242
parse_state = MULTIRANGE_IN_RANGE_QUOTED_ESCAPED ;
235
- else
236
- /* include it in range_str */ ;
243
+
244
+ /*
245
+ * We will include this character into range_str once we
246
+ * find the end of the range value.
247
+ */
237
248
break ;
238
249
case MULTIRANGE_AFTER_RANGE :
239
250
if (ch == ',' )
@@ -248,7 +259,10 @@ multirange_in(PG_FUNCTION_ARGS)
248
259
errdetail ("Expected comma or end of multirange." )));
249
260
break ;
250
261
case MULTIRANGE_IN_RANGE_QUOTED_ESCAPED :
251
- /* include it in range_str */
262
+ /*
263
+ * We will include this character into range_str once we find
264
+ * the end of the range value.
265
+ */
252
266
parse_state = MULTIRANGE_IN_RANGE_QUOTED ;
253
267
break ;
254
268
default :
0 commit comments