@@ -61,7 +61,7 @@ ltree_in(PG_FUNCTION_ARGS) {
61
61
if ( lptr -> len > 255 )
62
62
elog (ERROR ,"Name of level is too long (%d, must be < 256) in position %d" ,
63
63
lptr -> len , lptr -> start - buf );
64
- totallen += lptr -> len + LEVEL_HDRSIZE ;
64
+ totallen += MAXALIGN ( lptr -> len + LEVEL_HDRSIZE ) ;
65
65
lptr ++ ;
66
66
state = LTPRS_WAITNAME ;
67
67
} else if ( !ISALNUM (* ptr ) )
@@ -76,7 +76,7 @@ ltree_in(PG_FUNCTION_ARGS) {
76
76
if ( lptr -> len > 255 )
77
77
elog (ERROR ,"Name of level is too long (%d, must be < 256) in position %d" ,
78
78
lptr -> len , lptr -> start - buf );
79
- totallen += lptr -> len + LEVEL_HDRSIZE ;
79
+ totallen += MAXALIGN ( lptr -> len + LEVEL_HDRSIZE ) ;
80
80
lptr ++ ;
81
81
} else if ( ! (state == LTPRS_WAITNAME && lptr == list ) )
82
82
elog (ERROR ,"Unexpected end of line" );
@@ -94,7 +94,6 @@ ltree_in(PG_FUNCTION_ARGS) {
94
94
}
95
95
96
96
pfree (list );
97
-
98
97
PG_RETURN_POINTER (result );
99
98
}
100
99
@@ -134,7 +133,9 @@ ltree_out(PG_FUNCTION_ARGS) {
134
133
#define LQPRS_WAITVAR 8
135
134
136
135
137
- #define GETVAR (x ) ( *((nodeitem**)LQL_FIRST(x)) )
136
+ #define GETVAR (x ) ( *((nodeitem**)LQL_FIRST(x)) )
137
+ #define ITEMSIZE MAXALIGN(LQL_HDRSIZE+sizeof(nodeitem*))
138
+ #define NEXTLEV (x ) ( (lquery_level*)( ((char*)(x)) + ITEMSIZE) )
138
139
139
140
Datum
140
141
lquery_in (PG_FUNCTION_ARGS ) {
@@ -159,8 +160,8 @@ lquery_in(PG_FUNCTION_ARGS) {
159
160
}
160
161
161
162
num ++ ;
162
- curqlevel = tmpql = (lquery_level * ) palloc ( ( LQL_HDRSIZE + sizeof ( nodeitem * ) ) * ( num ) );
163
- memset ((void * )tmpql ,0 , ( LQL_HDRSIZE + sizeof ( nodeitem * ) ) * ( num ) );
163
+ curqlevel = tmpql = (lquery_level * ) palloc ( ITEMSIZE * num );
164
+ memset ((void * )tmpql ,0 , ITEMSIZE * num );
164
165
ptr = buf ;
165
166
while ( * ptr ) {
166
167
if ( state == LQPRS_WAITLEVEL ) {
@@ -224,7 +225,7 @@ lquery_in(PG_FUNCTION_ARGS) {
224
225
elog (ERROR ,"Name of level is too long (%d, must be < 256) in position %d" ,
225
226
lptr -> len , lptr -> start - buf );
226
227
state = LQPRS_WAITLEVEL ;
227
- curqlevel ++ ;
228
+ curqlevel = NEXTLEV ( curqlevel ) ;
228
229
} else if ( ISALNUM (* ptr ) ) {
229
230
if ( lptr -> flag )
230
231
UNCHAR ;
@@ -236,7 +237,7 @@ lquery_in(PG_FUNCTION_ARGS) {
236
237
} else if ( * ptr == '.' ) {
237
238
curqlevel -> low = 0 ;
238
239
curqlevel -> high = 0xffff ;
239
- curqlevel ++ ;
240
+ curqlevel = NEXTLEV ( curqlevel ) ;
240
241
state = LQPRS_WAITLEVEL ;
241
242
} else
242
243
UNCHAR ;
@@ -273,7 +274,7 @@ lquery_in(PG_FUNCTION_ARGS) {
273
274
} else if ( state == LQPRS_WAITEND ) {
274
275
if ( * ptr == '.' ) {
275
276
state = LQPRS_WAITLEVEL ;
276
- curqlevel ++ ;
277
+ curqlevel = NEXTLEV ( curqlevel ) ;
277
278
} else
278
279
UNCHAR ;
279
280
} else
@@ -300,19 +301,19 @@ lquery_in(PG_FUNCTION_ARGS) {
300
301
301
302
curqlevel = tmpql ;
302
303
totallen = LQUERY_HDRSIZE ;
303
- while ( curqlevel - tmpql < num ) {
304
+ while ( ( char * ) curqlevel - ( char * ) tmpql < num * ITEMSIZE ) {
304
305
totallen += LQL_HDRSIZE ;
305
306
if ( curqlevel -> numvar ) {
306
307
lptr = GETVAR (curqlevel );
307
308
while ( lptr - GETVAR (curqlevel ) < curqlevel -> numvar ) {
308
- totallen += LVAR_HDRSIZE + lptr -> len ;
309
+ totallen += MAXALIGN ( LVAR_HDRSIZE + lptr -> len ) ;
309
310
lptr ++ ;
310
311
}
311
312
} else if ( curqlevel -> low > curqlevel -> high )
312
313
elog (ERROR ,"Low limit(%d) is greater than upper(%d)" ,curqlevel -> low ,curqlevel -> high );
313
- curqlevel ++ ;
314
+ curqlevel = NEXTLEV ( curqlevel ) ;
314
315
}
315
-
316
+
316
317
result = (lquery * )palloc ( totallen );
317
318
result -> len = totallen ;
318
319
result -> numlevel = num ;
@@ -322,14 +323,14 @@ lquery_in(PG_FUNCTION_ARGS) {
322
323
result -> flag |= LQUERY_HASNOT ;
323
324
cur = LQUERY_FIRST (result );
324
325
curqlevel = tmpql ;
325
- while ( curqlevel - tmpql < num ) {
326
+ while ( ( char * ) curqlevel - ( char * ) tmpql < num * ITEMSIZE ) {
326
327
memcpy (cur ,curqlevel ,LQL_HDRSIZE );
327
328
cur -> totallen = LQL_HDRSIZE ;
328
329
if ( curqlevel -> numvar ) {
329
330
lrptr = LQL_FIRST (cur );
330
331
lptr = GETVAR (curqlevel );
331
332
while ( lptr - GETVAR (curqlevel ) < curqlevel -> numvar ) {
332
- cur -> totallen += LVAR_HDRSIZE + lptr -> len ;
333
+ cur -> totallen += MAXALIGN ( LVAR_HDRSIZE + lptr -> len ) ;
333
334
lrptr -> len = lptr -> len ;
334
335
lrptr -> flag = lptr -> flag ;
335
336
lrptr -> val = crc32_sz ((uint8 * ) lptr -> start , lptr -> len );
@@ -344,7 +345,7 @@ lquery_in(PG_FUNCTION_ARGS) {
344
345
(result -> firstgood )++ ;
345
346
} else
346
347
wasbad = true;
347
- curqlevel ++ ;
348
+ curqlevel = NEXTLEV ( curqlevel ) ;
348
349
cur = LQL_NEXT (cur );
349
350
}
350
351
0 commit comments