@@ -80,23 +80,28 @@ int MemRow::decode_key(int32_t tuple_id, IndexInfo& index,
80
80
pos += sizeof (uint8_t );
81
81
}
82
82
for (uint32_t idx = 0 ; idx < index .fields .size (); ++idx) {
83
+ // DB_WARNING("null_flag: %ld, %u, %d, %d, %s",
84
+ // index.id, null_flag, pos, index.fields[idx].can_null,
85
+ // key.data().ToString(true).c_str());
86
+ if (((null_flag >> (7 - idx)) & 0x01 ) && index .fields [idx].can_null ) {
87
+ // DB_DEBUG("field is null: %d", idx);
88
+ continue ;
89
+ }
83
90
int32_t slot = field_slot[index .fields [idx].id ];
84
91
// 说明不需要解析
92
+ // pos需要更新,容易出bug
85
93
if (slot == 0 ) {
94
+ if (0 != key.skip_field (index .fields [idx], pos)) {
95
+ DB_WARNING (" skip index field error" );
96
+ return -1 ;
97
+ }
86
98
continue ;
87
99
}
88
100
const FieldDescriptor* field = descriptor->field (slot - 1 );
89
101
if (field == nullptr ) {
90
102
DB_WARNING (" invalid field: %d slot: %d" , index .fields [idx].id , slot);
91
103
return -1 ;
92
104
}
93
- // DB_WARNING("null_flag: %ld, %u, %d, %d, %s",
94
- // index.id, null_flag, pos, index.fields[idx].can_null,
95
- // key.data().ToString(true).c_str());
96
- if (((null_flag >> (7 - idx)) & 0x01 ) && index .fields [idx].can_null ) {
97
- // DB_DEBUG("field is null: %d", idx);
98
- continue ;
99
- }
100
105
if (0 != key.decode_field (tuple, reflection, field, index .fields [idx], pos)) {
101
106
DB_WARNING (" decode index field error" );
102
107
return -1 ;
@@ -121,7 +126,12 @@ int MemRow::decode_primary_key(int32_t tuple_id, IndexInfo& index, std::vector<i
121
126
for (uint32_t idx = 0 ; idx < index .pk_fields .size (); ++idx) {
122
127
int32_t slot = field_slot[index .pk_fields [idx].id ];
123
128
// 说明不需要解析
129
+ // pos需要更新,容易出bug
124
130
if (slot == 0 ) {
131
+ if (0 != key.skip_field (index .fields [idx], pos)) {
132
+ DB_WARNING (" skip index field error" );
133
+ return -1 ;
134
+ }
125
135
continue ;
126
136
}
127
137
const FieldDescriptor* field = descriptor->field (slot - 1 );
0 commit comments