diff --git a/mysql/const.go b/mysql/const.go index f7cba0242..2883a06b9 100644 --- a/mysql/const.go +++ b/mysql/const.go @@ -147,6 +147,8 @@ const ( MYSQL_TYPE_TIME2 ) +const MYSQL_TYPE_VECTOR = 0xf2 + const ( MYSQL_TYPE_JSON byte = iota + 0xf5 MYSQL_TYPE_NEWDECIMAL diff --git a/mysql/rowdata.go b/mysql/rowdata.go index d55178f3b..9c7a0883a 100644 --- a/mysql/rowdata.go +++ b/mysql/rowdata.go @@ -173,10 +173,10 @@ func (p RowData) ParseBinary(f []*Field, dst []FieldValue) ([]FieldValue, error) pos += 8 continue - case MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, - MYSQL_TYPE_BIT, MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TINY_BLOB, - MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, - MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_STRING, MYSQL_TYPE_GEOMETRY, MYSQL_TYPE_JSON: + case MYSQL_TYPE_DECIMAL, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_VARCHAR, MYSQL_TYPE_BIT, + MYSQL_TYPE_ENUM, MYSQL_TYPE_SET, MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, + MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB, MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_STRING, + MYSQL_TYPE_VECTOR, MYSQL_TYPE_GEOMETRY, MYSQL_TYPE_JSON: v, isNull, n, err = LengthEncodedString(p[pos:]) pos += n if err != nil { diff --git a/notes/field_type.md b/notes/field_type.md index 6ceb1b42f..8f8e12b3f 100644 --- a/notes/field_type.md +++ b/notes/field_type.md @@ -63,6 +63,7 @@ Here is a list collected from `mysql-8.0/sql/field.h`: | | | +--Field_varstring | MYSQL_TYPE_VARCHAR | MYSQL_TYPE_VARCHAR | | | | | +--Field_blob | MYSQL_TYPE_BLOB | | | | | | +--Field_geom | MYSQL_TYPE_GEOMETRY | | | +| | | +--Field_vector | MYSQL_TYPE_VECTOR | | | | | | +--Field_json | MYSQL_TYPE_JSON | | | | | | +--Field_typed_array | real_type_to_type(m_elt_type) | m_elt_type | MYSQL_TYPE_TYPED_ARRAY | | | | | | | | diff --git a/replication/row_event.go b/replication/row_event.go index d64bfdef2..5f481e18c 100644 --- a/replication/row_event.go +++ b/replication/row_event.go @@ -181,6 +181,7 @@ func bitmapByteSize(columnCount int) int { MYSQL_TYPE_DOUBLE MYSQL_TYPE_BLOB MYSQL_TYPE_GEOMETRY + MYSQL_TYPE_VECTOR //maybe MYSQL_TYPE_TIME2 @@ -226,6 +227,7 @@ func (e *TableMapEvent) decodeMeta(data []byte) error { mysql.MYSQL_TYPE_DOUBLE, mysql.MYSQL_TYPE_FLOAT, mysql.MYSQL_TYPE_GEOMETRY, + mysql.MYSQL_TYPE_VECTOR, mysql.MYSQL_TYPE_JSON: e.ColumnMeta[i] = uint16(data[pos]) pos++ @@ -891,6 +893,7 @@ const RowsEventStmtEndFlag = 0x01 // - mysql.MYSQL_TYPE_STRING: string // - mysql.MYSQL_TYPE_JSON: []byte / *replication.JsonDiff // - mysql.MYSQL_TYPE_GEOMETRY: []byte +// - mysql.MYSQL_TYPE_VECTOR: []byte type RowsEvent struct { // 0, 1, 2 Version int @@ -1407,6 +1410,8 @@ func (e *RowsEvent) decodeValue(data []byte, tp byte, meta uint16, isPartial boo // I also find some go libs to handle WKB if possible // see https://github.com/twpayne/go-geom or https://github.com/paulmach/go.geo v, n, err = decodeBlob(data, meta) + case mysql.MYSQL_TYPE_VECTOR: + v, n, err = decodeBlob(data, meta) default: err = fmt.Errorf("unsupport type %d in binlog and don't know how to handle", tp) } diff --git a/server/stmt.go b/server/stmt.go index 40486678b..ca9eae796 100644 --- a/server/stmt.go +++ b/server/stmt.go @@ -276,10 +276,10 @@ func (c *Conn) bindStmtArgs(s *Stmt, nullBitmap, paramTypes, paramValues []byte) pos += 8 continue - case mysql.MYSQL_TYPE_DECIMAL, mysql.MYSQL_TYPE_NEWDECIMAL, mysql.MYSQL_TYPE_VARCHAR, - mysql.MYSQL_TYPE_BIT, mysql.MYSQL_TYPE_ENUM, mysql.MYSQL_TYPE_SET, mysql.MYSQL_TYPE_TINY_BLOB, - mysql.MYSQL_TYPE_MEDIUM_BLOB, mysql.MYSQL_TYPE_LONG_BLOB, mysql.MYSQL_TYPE_BLOB, - mysql.MYSQL_TYPE_VAR_STRING, mysql.MYSQL_TYPE_STRING, mysql.MYSQL_TYPE_GEOMETRY, + case mysql.MYSQL_TYPE_DECIMAL, mysql.MYSQL_TYPE_NEWDECIMAL, mysql.MYSQL_TYPE_VARCHAR, mysql.MYSQL_TYPE_BIT, + mysql.MYSQL_TYPE_ENUM, mysql.MYSQL_TYPE_SET, mysql.MYSQL_TYPE_TINY_BLOB, mysql.MYSQL_TYPE_MEDIUM_BLOB, + mysql.MYSQL_TYPE_LONG_BLOB, mysql.MYSQL_TYPE_BLOB, mysql.MYSQL_TYPE_VAR_STRING, mysql.MYSQL_TYPE_STRING, + mysql.MYSQL_TYPE_GEOMETRY, mysql.MYSQL_TYPE_VECTOR, mysql.MYSQL_TYPE_DATE, mysql.MYSQL_TYPE_NEWDATE, mysql.MYSQL_TYPE_TIMESTAMP, mysql.MYSQL_TYPE_DATETIME, mysql.MYSQL_TYPE_TIME: if len(paramValues) < (pos + 1) {