7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.1.1.1 1996/07/09 06:22:03 scrappy Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.2 1996/07/20 07:58:44 scrappy Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -877,7 +877,11 @@ array_set(ArrayType *array,
877
877
* fixed length arrays -- these are assumed to be 1-d
878
878
*/
879
879
if (indx [0 ]* elmlen > arraylen )
880
+ #ifdef ARRAY_PATCH
880
881
elog (WARN , "array_ref: array bound exceeded" );
882
+ #else
883
+ elog (WARN , "array_set: array bound exceeded" );
884
+ #endif
881
885
pos = (char * )array + indx [0 ]* elmlen ;
882
886
ArrayCastAndSet (dataPtr , (bool ) reftype , elmlen , pos );
883
887
return ((char * )array );
@@ -888,7 +892,14 @@ array_set(ArrayType *array,
888
892
nbytes = (* (int32 * ) array ) - ARR_OVERHEAD (ndim );
889
893
890
894
if (!SanityCheckInput (ndim , n , dim , lb , indx ))
895
+ #ifdef ARRAY_PATCH
896
+ {
897
+ elog (WARN , "array_set: array bound exceeded" );
898
+ return ((char * )array );
899
+ }
900
+ #else
891
901
return ((char * )array );
902
+ #endif
892
903
offset = GetOffset ( n , dim , lb , indx );
893
904
894
905
if (ARR_IS_LO (array )) {
@@ -924,7 +935,41 @@ array_set(ArrayType *array,
924
935
if (nbytes - offset < 1 ) return ((char * )array );
925
936
pos = ARR_DATA_PTR (array ) + offset ;
926
937
} else {
938
+ #ifdef ARRAY_PATCH
939
+ ArrayType * newarray ;
940
+ char * elt_ptr ;
941
+ int oldsize , newsize , oldlen , newlen , lth0 , lth1 , lth2 ;
942
+
943
+ elt_ptr = array_seek (ARR_DATA_PTR (array ), -1 , offset );
944
+ oldlen = INTALIGN (* (int32 * )elt_ptr );
945
+ newlen = INTALIGN (* (int32 * )dataPtr );
946
+
947
+ if (oldlen == newlen ) {
948
+ /* new element with same size, overwrite old data */
949
+ ArrayCastAndSet (dataPtr , (bool )reftype , elmlen , elt_ptr );
950
+ return ((char * )array );
951
+ }
952
+
953
+ /* new element with different size, reallocate the array */
954
+ oldsize = array -> size ;
955
+ lth0 = ARR_OVERHEAD (n );
956
+ lth1 = (int )(elt_ptr - ARR_DATA_PTR (array ));
957
+ lth2 = (int )(oldsize - lth0 - lth1 - oldlen );
958
+ newsize = lth0 + lth1 + newlen + lth2 ;
959
+
960
+ newarray = (ArrayType * )palloc (newsize );
961
+ memmove ((char * )newarray , (char * )array , lth0 + lth1 );
962
+ newarray -> size = newsize ;
963
+ newlen = ArrayCastAndSet (dataPtr , (bool )reftype , elmlen ,
964
+ (char * )newarray + lth0 + lth1 );
965
+ memmove ((char * )newarray + lth0 + lth1 + newlen ,
966
+ (char * )array + lth0 + lth1 + oldlen , lth2 );
967
+
968
+ /* ??? who should free this storage ??? */
969
+ return ((char * )newarray );
970
+ #else
927
971
elog (WARN , "array_set: update of variable length fields not supported" );
972
+ #endif
928
973
}
929
974
ArrayCastAndSet (dataPtr , (bool ) reftype , elmlen , pos );
930
975
return ((char * )array );
0 commit comments