@@ -983,7 +983,7 @@ int read_last_val(struct uls_read_context *rctx, uint32_t pos,
983983 u32 = uls_derive_data_len (* out_col_type );
984984 if (u32 > val_len )
985985 u32 = val_len ;
986- memcpy (val_at , data_ptr , val_len );
986+ memcpy (val_at , data_ptr , u32 );
987987 }
988988 return ULS_RES_OK ;
989989}
@@ -1097,40 +1097,53 @@ int compare_bin(const byte *v1, byte len1, const byte *v2, byte len2) {
10971097 return (len1 < len2 ? - k : k );
10981098}
10991099
1100+ int64_t convert_to_i64 (byte * val , int len , byte is_big_endian ) {
1101+ int64_t ival_at = 0 ;
1102+ switch (len ) {
1103+ case 4 : {
1104+ uint32_t u32_val_at = (is_big_endian ? read_uint32 (val ) : * ((uint32_t * ) val ));
1105+ if (u32_val_at & 0x80000000 ) {
1106+ ival_at = 0xFFFFFFFF - u32_val_at ;
1107+ ival_at = 0xFFFFFFFFFFFFFFFF - ival_at ;
1108+ } else
1109+ ival_at = u32_val_at ;
1110+ break ;
1111+ }
1112+ case 2 : {
1113+ uint16_t u16_val_at = (is_big_endian ? read_uint16 (val ) : * ((uint16_t * ) val ));
1114+ ival_at = u16_val_at & 0x7FFF ;
1115+ if (u16_val_at & 0x8000 ) {
1116+ ival_at = 0xFFFF - u16_val_at ;
1117+ ival_at = 0xFFFFFFFFFFFFFFFF - ival_at ;
1118+ } else
1119+ ival_at = u16_val_at ;
1120+ break ;
1121+ }
1122+ case 6 :
1123+ case 8 :
1124+ ival_at = (is_big_endian ? read_uint64 (val ) : * ((int64_t * ) val ));
1125+ break ;
1126+ case 1 : {
1127+ uint8_t u8_val_at = (is_big_endian ? read_uint8 (val ) : * ((uint8_t * ) val ));
1128+ ival_at = u8_val_at & 0x7F ;
1129+ if (u8_val_at & 0x80 ) {
1130+ ival_at = 0xFF - u8_val_at ;
1131+ ival_at = 0xFFFFFFFFFFFFFFFF - ival_at ;
1132+ } else
1133+ ival_at = u8_val_at ;
1134+ }
1135+ }
1136+ return ival_at ;
1137+ }
1138+
11001139// Compare values for binary search and return 1, -1 or 0
11011140int compare_values (byte * val_at , uint32_t u32_at , int val_type , void * val , uint16_t len , byte is_rowid ) {
11021141 if (is_rowid )
11031142 return (u32_at > * ((uint32_t * ) val ) ? 1 : u32_at < * ((uint32_t * ) val ) ? -1 : 0 );
11041143 switch (val_type ) {
11051144 case ULS_TYPE_INT : {
1106- int64_t ival_at ;
1107- switch (u32_at ) {
1108- case 4 :
1109- ival_at = (int64_t ) read_uint32 (val_at );
1110- break ;
1111- case 2 :
1112- ival_at = (int64_t ) read_uint16 (val_at );
1113- break ;
1114- case 6 :
1115- ival_at = read_uint64 (val_at );
1116- break ;
1117- case 1 :
1118- ival_at = (int64_t ) read_uint8 (val_at );
1119- }
1120- int64_t ival ;
1121- switch (len ) {
1122- case 4 :
1123- ival = * ((int32_t * ) val );
1124- break ;
1125- case 2 :
1126- ival = * ((int16_t * ) val );
1127- break ;
1128- case 8 :
1129- ival = * ((int64_t * ) val );
1130- break ;
1131- case 1 :
1132- ival = * ((int8_t * ) val );
1133- }
1145+ int64_t ival_at = convert_to_i64 (val_at , u32_at , 1 );
1146+ int64_t ival = convert_to_i64 (val , len , 0 );
11341147 return ival_at > ival ? 1 : (ival_at < ival ? -1 : 0 );
11351148 }
11361149 case ULS_TYPE_REAL :
0 commit comments