github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/disttae/tools.go (about) 1 // Copyright 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package disttae 16 17 import ( 18 "context" 19 "fmt" 20 "regexp" 21 "time" 22 23 "github.com/google/uuid" 24 "github.com/matrixorigin/matrixone/pkg/catalog" 25 "github.com/matrixorigin/matrixone/pkg/common/moerr" 26 "github.com/matrixorigin/matrixone/pkg/common/mpool" 27 "github.com/matrixorigin/matrixone/pkg/container/batch" 28 "github.com/matrixorigin/matrixone/pkg/container/types" 29 "github.com/matrixorigin/matrixone/pkg/container/vector" 30 "github.com/matrixorigin/matrixone/pkg/defines" 31 "github.com/matrixorigin/matrixone/pkg/fileservice" 32 "github.com/matrixorigin/matrixone/pkg/pb/api" 33 "github.com/matrixorigin/matrixone/pkg/pb/metadata" 34 "github.com/matrixorigin/matrixone/pkg/pb/plan" 35 "github.com/matrixorigin/matrixone/pkg/pb/timestamp" 36 "github.com/matrixorigin/matrixone/pkg/pb/txn" 37 "github.com/matrixorigin/matrixone/pkg/sql/colexec" 38 plantool "github.com/matrixorigin/matrixone/pkg/sql/plan" 39 "github.com/matrixorigin/matrixone/pkg/vm/engine" 40 "github.com/matrixorigin/matrixone/pkg/vm/process" 41 ) 42 43 func genCreateDatabaseTuple(sql string, accountId, userId, roleId uint32, 44 name string, databaseId uint64, m *mpool.MPool) (*batch.Batch, error) { 45 bat := batch.NewWithSize(len(catalog.MoDatabaseSchema)) 46 bat.Attrs = append(bat.Attrs, catalog.MoDatabaseSchema...) 47 bat.SetZs(1, m) 48 { 49 idx := catalog.MO_DATABASE_DAT_ID_IDX 50 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_id 51 if err := bat.Vecs[idx].Append(uint64(databaseId), false, m); err != nil { 52 return nil, err 53 } 54 idx = catalog.MO_DATABASE_DAT_NAME_IDX 55 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // datname 56 if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil { 57 return nil, err 58 } 59 idx = catalog.MO_DATABASE_DAT_CATALOG_NAME_IDX 60 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_catalog_name 61 if err := bat.Vecs[idx].Append([]byte(catalog.MO_CATALOG), false, m); err != nil { 62 return nil, err 63 } 64 idx = catalog.MO_DATABASE_CREATESQL_IDX 65 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_createsql 66 if err := bat.Vecs[idx].Append([]byte(sql), false, m); err != nil { // TODO 67 return nil, err 68 } 69 idx = catalog.MO_DATABASE_OWNER_IDX 70 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // owner 71 if err := bat.Vecs[idx].Append(roleId, false, m); err != nil { 72 return nil, err 73 } 74 idx = catalog.MO_DATABASE_CREATOR_IDX 75 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // creator 76 if err := bat.Vecs[idx].Append(userId, false, m); err != nil { 77 return nil, err 78 } 79 idx = catalog.MO_DATABASE_CREATED_TIME_IDX 80 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // created_time 81 if err := bat.Vecs[idx].Append(types.Timestamp(time.Now().UnixMicro()+types.GetUnixEpochSecs()), false, m); err != nil { 82 return nil, err 83 } 84 idx = catalog.MO_DATABASE_ACCOUNT_ID_IDX 85 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // account_id 86 if err := bat.Vecs[idx].Append(accountId, false, m); err != nil { 87 return nil, err 88 } 89 } 90 return bat, nil 91 } 92 93 func genDropDatabaseTuple(id uint64, name string, m *mpool.MPool) (*batch.Batch, error) { 94 bat := batch.NewWithSize(2) 95 bat.Attrs = append(bat.Attrs, catalog.MoDatabaseSchema[:2]...) 96 bat.SetZs(1, m) 97 { 98 idx := catalog.MO_DATABASE_DAT_ID_IDX 99 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_id 100 if err := bat.Vecs[idx].Append(id, false, m); err != nil { 101 return nil, err 102 } 103 idx = catalog.MO_DATABASE_DAT_NAME_IDX 104 bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // datname 105 if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil { 106 return nil, err 107 } 108 } 109 return bat, nil 110 } 111 112 func genTableConstraintTuple(tblId, dbId uint64, tblName, dbName string, constraint []byte, 113 m *mpool.MPool) (*batch.Batch, error) { 114 bat := batch.NewWithSize(5) 115 bat.Attrs = append(bat.Attrs, catalog.MoTablesSchema[:4]...) 116 bat.Attrs = append(bat.Attrs, catalog.SystemRelAttr_Constraint) 117 bat.SetZs(1, m) 118 119 { 120 idx := catalog.MO_TABLES_REL_ID_IDX 121 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_id 122 if err := bat.Vecs[idx].Append(tblId, false, m); err != nil { 123 return nil, err 124 } 125 idx = catalog.MO_TABLES_REL_NAME_IDX 126 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relname 127 if err := bat.Vecs[idx].Append([]byte(tblName), false, m); err != nil { 128 return nil, err 129 } 130 idx = catalog.MO_TABLES_RELDATABASE_IDX 131 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase 132 if err := bat.Vecs[idx].Append([]byte(dbName), false, m); err != nil { 133 return nil, err 134 } 135 idx = catalog.MO_TABLES_RELDATABASE_ID_IDX 136 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase_id 137 if err := bat.Vecs[idx].Append(dbId, false, m); err != nil { 138 return nil, err 139 } 140 idx = catalog.MO_TABLES_UPDATE_CONSTRAINT 141 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[catalog.MO_TABLES_CONSTRAINT_IDX]) // constraint 142 if err := bat.Vecs[idx].Append(constraint, false, m); err != nil { 143 return nil, err 144 } 145 } 146 147 return bat, nil 148 } 149 150 func genCreateTableTuple(tbl *table, sql string, accountId, userId, roleId uint32, name string, 151 tableId uint64, databaseId uint64, databaseName string, 152 comment string, m *mpool.MPool) (*batch.Batch, error) { 153 bat := batch.NewWithSize(len(catalog.MoTablesSchema)) 154 bat.Attrs = append(bat.Attrs, catalog.MoTablesSchema...) 155 bat.SetZs(1, m) 156 { 157 idx := catalog.MO_TABLES_REL_ID_IDX 158 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_id 159 if err := bat.Vecs[idx].Append(tableId, false, m); err != nil { 160 return nil, err 161 } 162 idx = catalog.MO_TABLES_REL_NAME_IDX 163 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relname 164 if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil { 165 return nil, err 166 } 167 idx = catalog.MO_TABLES_RELDATABASE_IDX 168 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase 169 if err := bat.Vecs[idx].Append([]byte(databaseName), false, m); err != nil { 170 return nil, err 171 } 172 idx = catalog.MO_TABLES_RELDATABASE_ID_IDX 173 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase_id 174 if err := bat.Vecs[idx].Append(databaseId, false, m); err != nil { 175 return nil, err 176 } 177 idx = catalog.MO_TABLES_RELPERSISTENCE_IDX 178 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relpersistence 179 if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil { 180 return nil, err 181 } 182 idx = catalog.MO_TABLES_RELKIND_IDX 183 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relkind 184 if err := bat.Vecs[idx].Append([]byte(tbl.relKind), false, m); err != nil { 185 return nil, err 186 } 187 idx = catalog.MO_TABLES_REL_COMMENT_IDX 188 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_comment 189 if err := bat.Vecs[idx].Append([]byte(tbl.comment), false, m); err != nil { 190 return nil, err 191 } 192 idx = catalog.MO_TABLES_REL_CREATESQL_IDX 193 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_createsql 194 if err := bat.Vecs[idx].Append([]byte(tbl.createSql), false, m); err != nil { 195 return nil, err 196 } 197 idx = catalog.MO_TABLES_CREATED_TIME_IDX 198 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // created_time 199 if err := bat.Vecs[idx].Append(types.Timestamp(time.Now().Unix()), false, m); err != nil { 200 return nil, err 201 } 202 idx = catalog.MO_TABLES_CREATOR_IDX 203 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // creator 204 if err := bat.Vecs[idx].Append(userId, false, m); err != nil { 205 return nil, err 206 } 207 idx = catalog.MO_TABLES_OWNER_IDX 208 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // owner 209 if err := bat.Vecs[idx].Append(roleId, false, m); err != nil { 210 return nil, err 211 } 212 idx = catalog.MO_TABLES_ACCOUNT_ID_IDX 213 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // account_id 214 if err := bat.Vecs[idx].Append(accountId, false, m); err != nil { 215 return nil, err 216 } 217 idx = catalog.MO_TABLES_PARTITIONED_IDX 218 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // partition 219 if err := bat.Vecs[idx].Append([]byte(tbl.partition), false, m); err != nil { 220 return nil, err 221 } 222 idx = catalog.MO_TABLES_VIEWDEF_IDX 223 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // viewdef 224 if err := bat.Vecs[idx].Append([]byte(tbl.viewdef), false, m); err != nil { 225 return nil, err 226 } 227 idx = catalog.MO_TABLES_CONSTRAINT_IDX 228 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // constraint 229 if err := bat.Vecs[idx].Append(tbl.constraint, false, m); err != nil { 230 return nil, err 231 } 232 } 233 return bat, nil 234 } 235 236 func genCreateColumnTuple(col column, m *mpool.MPool) (*batch.Batch, error) { 237 bat := batch.NewWithSize(len(catalog.MoColumnsSchema)) 238 bat.Attrs = append(bat.Attrs, catalog.MoColumnsSchema...) 239 bat.SetZs(1, m) 240 { 241 idx := catalog.MO_COLUMNS_ATT_UNIQ_NAME_IDX 242 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_uniq_name 243 if err := bat.Vecs[idx].Append([]byte(genColumnPrimaryKey(col.tableId, col.name)), 244 false, m); err != nil { 245 return nil, err 246 } 247 idx = catalog.MO_COLUMNS_ACCOUNT_ID_IDX 248 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // account_id 249 if err := bat.Vecs[idx].Append(col.accountId, false, m); err != nil { 250 return nil, err 251 } 252 idx = catalog.MO_COLUMNS_ATT_DATABASE_ID_IDX 253 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_database_id 254 if err := bat.Vecs[idx].Append(col.databaseId, false, m); err != nil { 255 return nil, err 256 } 257 idx = catalog.MO_COLUMNS_ATT_DATABASE_IDX 258 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_database 259 if err := bat.Vecs[idx].Append([]byte(col.databaseName), false, m); err != nil { 260 return nil, err 261 } 262 idx = catalog.MO_COLUMNS_ATT_RELNAME_ID_IDX 263 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_relname_id 264 if err := bat.Vecs[idx].Append(col.tableId, false, m); err != nil { 265 return nil, err 266 } 267 idx = catalog.MO_COLUMNS_ATT_RELNAME_IDX 268 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_relname 269 if err := bat.Vecs[idx].Append([]byte(col.tableName), false, m); err != nil { 270 return nil, err 271 } 272 idx = catalog.MO_COLUMNS_ATTNAME_IDX 273 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attname 274 if err := bat.Vecs[idx].Append([]byte(col.name), false, m); err != nil { 275 return nil, err 276 } 277 idx = catalog.MO_COLUMNS_ATTTYP_IDX 278 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // atttyp 279 if err := bat.Vecs[idx].Append(col.typ, false, m); err != nil { 280 return nil, err 281 } 282 idx = catalog.MO_COLUMNS_ATTNUM_IDX 283 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attnum 284 if err := bat.Vecs[idx].Append(col.num, false, m); err != nil { 285 return nil, err 286 } 287 idx = catalog.MO_COLUMNS_ATT_LENGTH_IDX 288 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_length 289 if err := bat.Vecs[idx].Append(col.typLen, false, m); err != nil { 290 return nil, err 291 } 292 idx = catalog.MO_COLUMNS_ATTNOTNULL_IDX 293 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attnotnul 294 if err := bat.Vecs[idx].Append(col.notNull, false, m); err != nil { 295 return nil, err 296 } 297 idx = catalog.MO_COLUMNS_ATTHASDEF_IDX 298 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // atthasdef 299 if err := bat.Vecs[idx].Append(col.hasDef, false, m); err != nil { 300 return nil, err 301 } 302 idx = catalog.MO_COLUMNS_ATT_DEFAULT_IDX 303 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_default 304 if err := bat.Vecs[idx].Append(col.defaultExpr, false, m); err != nil { 305 return nil, err 306 } 307 idx = catalog.MO_COLUMNS_ATTISDROPPED_IDX 308 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attisdropped 309 if err := bat.Vecs[idx].Append(int8(0), false, m); err != nil { 310 return nil, err 311 } 312 idx = catalog.MO_COLUMNS_ATT_CONSTRAINT_TYPE_IDX 313 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_constraint_type 314 if err := bat.Vecs[idx].Append([]byte(col.constraintType), false, m); err != nil { 315 return nil, err 316 } 317 idx = catalog.MO_COLUMNS_ATT_IS_UNSIGNED_IDX 318 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_unsigned 319 if err := bat.Vecs[idx].Append(int8(0), false, m); err != nil { 320 return nil, err 321 } 322 idx = catalog.MO_COLUMNS_ATT_IS_AUTO_INCREMENT_IDX 323 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_auto_increment 324 if err := bat.Vecs[idx].Append(col.isAutoIncrement, false, m); err != nil { 325 return nil, err 326 } 327 idx = catalog.MO_COLUMNS_ATT_COMMENT_IDX 328 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_comment 329 if err := bat.Vecs[idx].Append([]byte(col.comment), false, m); err != nil { 330 return nil, err 331 } 332 idx = catalog.MO_COLUMNS_ATT_IS_HIDDEN_IDX 333 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_hidden 334 if err := bat.Vecs[idx].Append(col.isHidden, false, m); err != nil { 335 return nil, err 336 } 337 idx = catalog.MO_COLUMNS_ATT_HAS_UPDATE_IDX 338 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_has_update 339 if err := bat.Vecs[idx].Append(col.hasUpdate, false, m); err != nil { 340 return nil, err 341 } 342 idx = catalog.MO_COLUMNS_ATT_UPDATE_IDX 343 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_update 344 if err := bat.Vecs[idx].Append(col.updateExpr, false, m); err != nil { 345 return nil, err 346 } 347 idx = catalog.MO_COLUMNS_ATT_IS_CLUSTERBY 348 bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_constraint_type 349 if err := bat.Vecs[idx].Append(col.isClusterBy, false, m); err != nil { 350 return nil, err 351 } 352 353 } 354 return bat, nil 355 } 356 357 func genDropTableTuple(id, databaseId uint64, name, databaseName string, 358 m *mpool.MPool) (*batch.Batch, error) { 359 bat := batch.NewWithSize(4) 360 bat.Attrs = append(bat.Attrs, catalog.MoTablesSchema[:4]...) 361 bat.SetZs(1, m) 362 { 363 idx := catalog.MO_TABLES_REL_ID_IDX 364 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_id 365 if err := bat.Vecs[idx].Append(id, false, m); err != nil { 366 return nil, err 367 } 368 idx = catalog.MO_TABLES_REL_NAME_IDX 369 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relname 370 if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil { 371 return nil, err 372 } 373 idx = catalog.MO_TABLES_RELDATABASE_IDX 374 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase 375 if err := bat.Vecs[idx].Append([]byte(databaseName), false, m); err != nil { 376 return nil, err 377 } 378 idx = catalog.MO_TABLES_RELDATABASE_ID_IDX 379 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase_id 380 if err := bat.Vecs[idx].Append(databaseId, false, m); err != nil { 381 return nil, err 382 } 383 } 384 return bat, nil 385 } 386 387 func genTruncateTableTuple(id, databaseId uint64, name, databaseName string, 388 m *mpool.MPool) (*batch.Batch, error) { 389 bat := batch.NewWithSize(4) 390 bat.Attrs = append(bat.Attrs, catalog.MoTablesSchema[:4]...) 391 bat.SetZs(1, m) 392 { 393 idx := catalog.MO_TABLES_REL_ID_IDX 394 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_id 395 if err := bat.Vecs[idx].Append(id, false, m); err != nil { 396 return nil, err 397 } 398 idx = catalog.MO_TABLES_REL_NAME_IDX 399 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relname 400 if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil { 401 return nil, err 402 } 403 idx = catalog.MO_TABLES_RELDATABASE_IDX 404 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase 405 if err := bat.Vecs[idx].Append([]byte(databaseName), false, m); err != nil { 406 return nil, err 407 } 408 idx = catalog.MO_TABLES_RELDATABASE_ID_IDX 409 bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase_id 410 if err := bat.Vecs[idx].Append(databaseId, false, m); err != nil { 411 return nil, err 412 } 413 } 414 return bat, nil 415 } 416 417 /* 418 func genDropColumnsTuple(name string) *batch.Batch { 419 return &batch.Batch{} 420 } 421 */ 422 423 // genDatabaseIdExpr generate an expression to find database info 424 // by database name and accountId 425 /* 426 func genDatabaseIdExpr(ctx context.Context, accountId uint32, name string) *plan.Expr { 427 var left, right *plan.Expr 428 429 { 430 var args []*plan.Expr 431 432 args = append(args, newColumnExpr(MO_DATABASE_ID_NAME_IDX, types.T_varchar, 433 catalog.MoDatabaseSchema[catalog.MO_DATABASE_DAT_NAME_IDX])) 434 args = append(args, newStringConstVal(name)) 435 left = plantool.MakeExpr(ctx, "=", args) 436 } 437 { 438 var args []*plan.Expr 439 440 args = append(args, newColumnExpr(MO_DATABASE_ID_ACCOUNT_IDX, types.T_uint32, 441 catalog.MoDatabaseSchema[catalog.MO_DATABASE_ACCOUNT_ID_IDX])) 442 args = append(args, newIntConstVal(accountId)) 443 right = plantool.MakeExpr(ctx, "=", args) 444 } 445 return plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 446 } 447 */ 448 449 /* 450 // genDatabaseIdExpr generate an expression to find database list 451 // by accountId 452 func genDatabaseListExpr(ctx context.Context, accountId uint32) *plan.Expr { 453 var args []*plan.Expr 454 455 args = append(args, newColumnExpr(MO_DATABASE_LIST_ACCOUNT_IDX, types.T_uint32, 456 catalog.MoDatabaseSchema[catalog.MO_DATABASE_ACCOUNT_ID_IDX])) 457 args = append(args, newIntConstVal(accountId)) 458 return plantool.MakeExpr(ctx, "=", args) 459 } 460 461 // genTableInfoExpr generate an expression to find table info 462 // by database id and table name and accountId 463 func genTableInfoExpr(ctx context.Context, accountId uint32, databaseId uint64, name string) *plan.Expr { 464 var left, right *plan.Expr 465 466 { 467 var args []*plan.Expr 468 469 args = append(args, newColumnExpr(catalog.MO_TABLES_REL_NAME_IDX, types.T_varchar, 470 catalog.MoTablesSchema[catalog.MO_TABLES_REL_NAME_IDX])) 471 args = append(args, newStringConstVal(name)) 472 left = plantool.MakeExpr(ctx, "=", args) 473 } 474 { 475 var args []*plan.Expr 476 477 args = append(args, newColumnExpr(catalog.MO_TABLES_RELDATABASE_ID_IDX, types.T_uint64, 478 catalog.MoTablesSchema[catalog.MO_TABLES_RELDATABASE_ID_IDX])) 479 args = append(args, newIntConstVal(databaseId)) 480 right = plantool.MakeExpr(ctx, "=", args) 481 left = plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 482 } 483 { 484 var args []*plan.Expr 485 486 args = append(args, newColumnExpr(catalog.MO_TABLES_ACCOUNT_ID_IDX, types.T_uint32, 487 catalog.MoTablesSchema[catalog.MO_TABLES_ACCOUNT_ID_IDX])) 488 args = append(args, newIntConstVal(accountId)) 489 right = plantool.MakeExpr(ctx, "=", args) 490 } 491 return plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 492 } 493 494 // genTableIdExpr generate an expression to find table info 495 // by database id and table name and accountId 496 func genTableIdExpr(ctx context.Context, accountId uint32, databaseId uint64, name string) *plan.Expr { 497 var left, right *plan.Expr 498 499 { 500 var args []*plan.Expr 501 502 args = append(args, newColumnExpr(MO_TABLE_ID_NAME_IDX, types.T_varchar, 503 catalog.MoTablesSchema[catalog.MO_TABLES_REL_NAME_IDX])) 504 args = append(args, newStringConstVal(name)) 505 left = plantool.MakeExpr(ctx, "=", args) 506 } 507 { 508 var args []*plan.Expr 509 510 args = append(args, newColumnExpr(MO_TABLE_ID_DATABASE_ID_IDX, types.T_uint64, 511 catalog.MoTablesSchema[catalog.MO_TABLES_RELDATABASE_ID_IDX])) 512 args = append(args, newIntConstVal(databaseId)) 513 right = plantool.MakeExpr(ctx, "=", args) 514 left = plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 515 } 516 { 517 var args []*plan.Expr 518 519 args = append(args, newColumnExpr(MO_TABLE_ID_ACCOUNT_IDX, types.T_uint32, 520 catalog.MoTablesSchema[catalog.MO_TABLES_ACCOUNT_ID_IDX])) 521 args = append(args, newIntConstVal(accountId)) 522 right = plantool.MakeExpr(ctx, "=", args) 523 } 524 return plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 525 } 526 527 // genTableListExpr generate an expression to find table list 528 // by database id and accountId 529 func genTableListExpr(ctx context.Context, accountId uint32, databaseId uint64) *plan.Expr { 530 var left, right *plan.Expr 531 532 { 533 var args []*plan.Expr 534 535 args = append(args, newColumnExpr(MO_TABLE_LIST_DATABASE_ID_IDX, types.T_uint64, 536 catalog.MoTablesSchema[catalog.MO_TABLES_RELDATABASE_ID_IDX])) 537 args = append(args, newIntConstVal(databaseId)) 538 left = plantool.MakeExpr(ctx, "=", args) 539 } 540 { 541 var args []*plan.Expr 542 543 args = append(args, newColumnExpr(MO_TABLE_LIST_ACCOUNT_IDX, types.T_uint32, 544 catalog.MoTablesSchema[catalog.MO_TABLES_ACCOUNT_ID_IDX])) 545 args = append(args, newIntConstVal(accountId)) 546 right = plantool.MakeExpr(ctx, "=", args) 547 } 548 return plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 549 } 550 551 // genColumnInfoExpr generate an expression to find column info list 552 // by database id and table id and accountId 553 func genColumnInfoExpr(ctx context.Context, accountId uint32, databaseId, tableId uint64) *plan.Expr { 554 var left, right *plan.Expr 555 556 { 557 var args []*plan.Expr 558 559 args = append(args, newColumnExpr(catalog.MO_COLUMNS_ATT_DATABASE_ID_IDX, types.T_uint64, 560 catalog.MoColumnsSchema[catalog.MO_COLUMNS_ATT_DATABASE_ID_IDX])) 561 args = append(args, newIntConstVal(databaseId)) 562 left = plantool.MakeExpr(ctx, "=", args) 563 } 564 { 565 var args []*plan.Expr 566 567 args = append(args, newColumnExpr(catalog.MO_COLUMNS_ATT_RELNAME_ID_IDX, types.T_uint64, 568 catalog.MoTablesSchema[catalog.MO_COLUMNS_ATT_RELNAME_ID_IDX])) 569 args = append(args, newIntConstVal(tableId)) 570 right = plantool.MakeExpr(ctx, "=", args) 571 left = plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 572 } 573 { 574 var args []*plan.Expr 575 576 args = append(args, newColumnExpr(catalog.MO_COLUMNS_ACCOUNT_ID_IDX, types.T_uint32, 577 catalog.MoTablesSchema[catalog.MO_COLUMNS_ACCOUNT_ID_IDX])) 578 args = append(args, newIntConstVal(accountId)) 579 right = plantool.MakeExpr(ctx, "=", args) 580 } 581 return plantool.MakeExpr(ctx, "and", []*plan.Expr{left, right}) 582 } 583 584 // genInsertExpr used to generate an expression to partition table data 585 func genInsertExpr(ctx context.Context, defs []engine.TableDef, dnNum int) *plan.Expr { 586 var args []*plan.Expr 587 588 i := 0 589 for _, def := range defs { 590 if attr, ok := def.(*engine.AttributeDef); ok { 591 if attr.Attr.Primary { 592 args = append(args, newColumnExpr(i, attr.Attr.Type.Oid, attr.Attr.Name)) 593 } 594 i++ 595 } 596 } 597 if len(args) == 0 { 598 return nil 599 } 600 return plantool.MakeExpr(ctx, "hash_value", args) 601 } 602 */ 603 604 /* 605 func newIntConstVal(v any) *plan.Expr { 606 var val int64 607 608 switch x := v.(type) { 609 case int32: 610 val = int64(x) 611 case int64: 612 val = int64(x) 613 case uint32: 614 val = int64(x) 615 case uint64: 616 val = int64(x) 617 } 618 return plantool.MakePlan2Int64ConstExprWithType(val) 619 } 620 621 func newStringConstVal(v string) *plan.Expr { 622 return &plan.Expr{ 623 Typ: types.NewProtoType(types.T_varchar), 624 Expr: &plan.Expr_C{ 625 C: &plan.Const{ 626 Value: &plan.Const_Sval{Sval: v}, 627 }, 628 }, 629 } 630 } 631 632 func newColumnExpr(pos int, oid types.T, name string) *plan.Expr { 633 return &plan.Expr{ 634 Typ: types.NewProtoType(oid), 635 Expr: &plan.Expr_Col{ 636 Col: &plan.ColRef{ 637 Name: name, 638 ColPos: int32(pos), 639 }, 640 }, 641 } 642 } 643 */ 644 645 func genWriteReqs(writes [][]Entry) ([]txn.TxnRequest, error) { 646 mq := make(map[string]DNStore) 647 mp := make(map[string][]*api.Entry) 648 for i := range writes { 649 for _, e := range writes[i] { 650 if e.bat.Length() == 0 { 651 continue 652 } 653 pe, err := toPBEntry(e) 654 if err != nil { 655 return nil, err 656 } 657 mp[e.dnStore.UUID] = append(mp[e.dnStore.UUID], pe) 658 if _, ok := mq[e.dnStore.UUID]; !ok { 659 mq[e.dnStore.UUID] = e.dnStore 660 } 661 } 662 } 663 reqs := make([]txn.TxnRequest, 0, len(mp)) 664 for k := range mp { 665 payload, err := types.Encode(api.PrecommitWriteCmd{EntryList: mp[k]}) 666 if err != nil { 667 return nil, err 668 } 669 dn := mq[k] 670 for _, info := range dn.Shards { 671 reqs = append(reqs, txn.TxnRequest{ 672 CNRequest: &txn.CNOpRequest{ 673 OpCode: uint32(api.OpCode_OpPreCommit), 674 Payload: payload, 675 Target: metadata.DNShard{ 676 DNShardRecord: metadata.DNShardRecord{ 677 ShardID: info.ShardID, 678 }, 679 ReplicaID: info.ReplicaID, 680 Address: dn.ServiceAddress, 681 }, 682 }, 683 Options: &txn.TxnRequestOptions{ 684 RetryCodes: []int32{ 685 // dn shard not found 686 int32(moerr.ErrDNShardNotFound), 687 }, 688 RetryInterval: int64(time.Second), 689 }, 690 }) 691 } 692 } 693 return reqs, nil 694 } 695 696 func toPBEntry(e Entry) (*api.Entry, error) { 697 var ebat *batch.Batch 698 699 if e.typ == INSERT { 700 ebat = batch.NewWithSize(0) 701 if e.bat.Attrs[0] == catalog.BlockMeta_MetaLoc { 702 ebat.Vecs = e.bat.Vecs 703 ebat.Attrs = e.bat.Attrs 704 } else { 705 ebat.Vecs = e.bat.Vecs[1:] 706 ebat.Attrs = e.bat.Attrs[1:] 707 } 708 } else { 709 ebat = e.bat 710 } 711 typ := api.Entry_Insert 712 if e.typ == DELETE { 713 typ = api.Entry_Delete 714 } else if e.typ == UPDATE { 715 typ = api.Entry_Update 716 } 717 bat, err := toPBBatch(ebat) 718 if err != nil { 719 return nil, err 720 } 721 return &api.Entry{ 722 Bat: bat, 723 EntryType: typ, 724 TableId: e.tableId, 725 DatabaseId: e.databaseId, 726 TableName: e.tableName, 727 DatabaseName: e.databaseName, 728 FileName: e.fileName, 729 }, nil 730 } 731 732 func toPBBatch(bat *batch.Batch) (*api.Batch, error) { 733 rbat := new(api.Batch) 734 rbat.Attrs = bat.Attrs 735 for _, vec := range bat.Vecs { 736 pbVector, err := vector.VectorToProtoVector(vec) 737 if err != nil { 738 return nil, err 739 } 740 rbat.Vecs = append(rbat.Vecs, pbVector) 741 } 742 return rbat, nil 743 } 744 745 func getTableComment(defs []engine.TableDef) string { 746 for _, def := range defs { 747 if cdef, ok := def.(*engine.CommentDef); ok { 748 return cdef.Comment 749 } 750 } 751 return "" 752 } 753 754 /* 755 func genTableDefOfComment(comment string) engine.TableDef { 756 return &engine.CommentDef{ 757 Comment: comment, 758 } 759 } 760 761 func getColumnsFromRows(rows [][]any) []column { 762 cols := make([]column, len(rows)) 763 for i, row := range rows { 764 cols[i].name = string(row[catalog.MO_COLUMNS_ATTNAME_IDX].([]byte)) 765 cols[i].comment = string(row[catalog.MO_COLUMNS_ATT_COMMENT_IDX].([]byte)) 766 cols[i].isHidden = row[catalog.MO_COLUMNS_ATT_IS_HIDDEN_IDX].(int8) 767 cols[i].isAutoIncrement = row[catalog.MO_COLUMNS_ATT_IS_AUTO_INCREMENT_IDX].(int8) 768 cols[i].constraintType = string(row[catalog.MO_COLUMNS_ATT_CONSTRAINT_TYPE_IDX].([]byte)) 769 cols[i].typ = row[catalog.MO_COLUMNS_ATTTYP_IDX].([]byte) 770 cols[i].hasDef = row[catalog.MO_COLUMNS_ATTHASDEF_IDX].(int8) 771 cols[i].defaultExpr = row[catalog.MO_COLUMNS_ATT_DEFAULT_IDX].([]byte) 772 cols[i].hasUpdate = row[catalog.MO_COLUMNS_ATT_HAS_UPDATE_IDX].(int8) 773 cols[i].updateExpr = row[catalog.MO_COLUMNS_ATT_UPDATE_IDX].([]byte) 774 cols[i].num = row[catalog.MO_COLUMNS_ATTNUM_IDX].(int32) 775 cols[i].isClusterBy = row[catalog.MO_COLUMNS_ATT_IS_CLUSTERBY].(int8) 776 } 777 sort.Sort(Columns(cols)) 778 return cols 779 } 780 781 func genTableDefOfColumn(col column) engine.TableDef { 782 var attr engine.Attribute 783 784 attr.ID = uint64(col.num) 785 attr.Name = col.name 786 attr.Alg = compress.Lz4 787 attr.Comment = col.comment 788 attr.IsHidden = col.isHidden == 1 789 attr.AutoIncrement = col.isAutoIncrement == 1 790 if err := types.Decode(col.typ, &attr.Type); err != nil { 791 panic(err) 792 } 793 if col.hasDef == 1 { 794 attr.Default = new(plan.Default) 795 if err := types.Decode(col.defaultExpr, attr.Default); err != nil { 796 panic(err) 797 } 798 } 799 if col.hasUpdate == 1 { 800 attr.OnUpdate = new(plan.OnUpdate) 801 if err := types.Decode(col.updateExpr, attr.OnUpdate); err != nil { 802 panic(err) 803 } 804 } 805 if col.constraintType == catalog.SystemColPKConstraint { 806 attr.Primary = true 807 } 808 if col.isClusterBy == 1 { 809 attr.ClusterBy = true 810 } 811 return &engine.AttributeDef{Attr: attr} 812 } 813 */ 814 815 func genColumns(accountId uint32, tableName, databaseName string, 816 tableId, databaseId uint64, defs []engine.TableDef) ([]column, error) { 817 { // XXX Why not store PrimaryIndexDef and 818 // then use PrimaryIndexDef for all primary key constraints. 819 mp := make(map[string]int) 820 for i, def := range defs { 821 if attr, ok := def.(*engine.AttributeDef); ok { 822 mp[attr.Attr.Name] = i 823 } 824 } 825 for _, def := range defs { 826 if constraintDef, ok := def.(*engine.ConstraintDef); ok { 827 for _, ct := range constraintDef.Cts { 828 if pkdef, ok2 := ct.(*engine.PrimaryKeyDef); ok2 { 829 pos := mp[pkdef.Pkey.PkeyColName] 830 attr, _ := defs[pos].(*engine.AttributeDef) 831 attr.Attr.Primary = true 832 } 833 } 834 } 835 836 if clusterByDef, ok := def.(*engine.ClusterByDef); ok { 837 attr, _ := defs[mp[clusterByDef.Name]].(*engine.AttributeDef) 838 attr.Attr.ClusterBy = true 839 } 840 } 841 } 842 var num int32 = 1 843 cols := make([]column, 0, len(defs)) 844 for _, def := range defs { 845 attrDef, ok := def.(*engine.AttributeDef) 846 if !ok { 847 continue 848 } 849 typ, err := types.Encode(&attrDef.Attr.Type) 850 if err != nil { 851 return nil, err 852 } 853 col := column{ 854 typ: typ, 855 typLen: int32(len(typ)), 856 accountId: accountId, 857 tableId: tableId, 858 databaseId: databaseId, 859 name: attrDef.Attr.Name, 860 tableName: tableName, 861 databaseName: databaseName, 862 num: num, 863 comment: attrDef.Attr.Comment, 864 } 865 attrDef.Attr.ID = uint64(num) 866 col.hasDef = 0 867 if attrDef.Attr.Default != nil { 868 defaultExpr, err := types.Encode(attrDef.Attr.Default) 869 if err != nil { 870 return nil, err 871 } 872 if len(defaultExpr) > 0 { 873 col.hasDef = 1 874 col.defaultExpr = defaultExpr 875 } 876 } 877 if attrDef.Attr.OnUpdate != nil { 878 expr, err := types.Encode(attrDef.Attr.OnUpdate) 879 if err != nil { 880 return nil, err 881 } 882 if len(expr) > 0 { 883 col.hasUpdate = 1 884 col.updateExpr = expr 885 } 886 } 887 if attrDef.Attr.IsHidden { 888 col.isHidden = 1 889 } 890 if attrDef.Attr.AutoIncrement { 891 col.isAutoIncrement = 1 892 } 893 if attrDef.Attr.Primary { 894 col.constraintType = catalog.SystemColPKConstraint 895 } else { 896 col.constraintType = catalog.SystemColNoConstraint 897 } 898 if attrDef.Attr.ClusterBy { 899 col.isClusterBy = 1 900 } 901 902 cols = append(cols, col) 903 num++ 904 } 905 return cols, nil 906 } 907 908 func getSql(ctx context.Context) string { 909 if v := ctx.Value(defines.SqlKey{}); v != nil { 910 return v.(string) 911 } 912 return "" 913 } 914 915 func getAccountId(ctx context.Context) uint32 { 916 if v := ctx.Value(defines.TenantIDKey{}); v != nil { 917 return v.(uint32) 918 } 919 return 0 920 } 921 922 func getAccessInfo(ctx context.Context) (uint32, uint32, uint32) { 923 var accountId, userId, roleId uint32 924 925 if v := ctx.Value(defines.TenantIDKey{}); v != nil { 926 accountId = v.(uint32) 927 } 928 if v := ctx.Value(defines.UserIDKey{}); v != nil { 929 userId = v.(uint32) 930 } 931 if v := ctx.Value(defines.RoleIDKey{}); v != nil { 932 roleId = v.(uint32) 933 } 934 return accountId, userId, roleId 935 } 936 937 func partitionBatch(bat *batch.Batch, expr *plan.Expr, proc *process.Process, dnNum int) ([]*batch.Batch, error) { 938 pvec, err := colexec.EvalExpr(bat, proc, expr) 939 if err != nil { 940 return nil, err 941 } 942 defer pvec.Free(proc.Mp()) 943 bats := make([]*batch.Batch, dnNum) 944 for i := range bats { 945 bats[i] = batch.New(true, bat.Attrs) 946 for j := range bats[i].Vecs { 947 bats[i].SetVector(int32(j), vector.New(bat.GetVector(int32(j)).GetType())) 948 } 949 } 950 vs := vector.GetFixedVectorValues[int64](pvec) 951 for i := range bat.Vecs { 952 vec := bat.GetVector(int32(i)) 953 for j, v := range vs { 954 idx := uint64(v) % uint64(dnNum) 955 if err := vector.UnionOne(bats[idx].GetVector(int32(i)), vec, int64(j), proc.Mp()); err != nil { 956 for _, bat := range bats { 957 bat.Clean(proc.Mp()) 958 } 959 return nil, err 960 } 961 } 962 } 963 for i := range bats { 964 bats[i].SetZs(bats[i].GetVector(0).Length(), proc.Mp()) 965 } 966 return bats, nil 967 } 968 969 func partitionDeleteBatch(tbl *table, bat *batch.Batch) ([]*batch.Batch, error) { 970 txn := tbl.db.txn 971 bats := make([]*batch.Batch, len(tbl.parts)) 972 for i := range bats { 973 bats[i] = batch.New(true, bat.Attrs) 974 for j := range bats[i].Vecs { 975 bats[i].SetVector(int32(j), vector.New(bat.GetVector(int32(j)).GetType())) 976 } 977 } 978 vec := bat.GetVector(0) 979 vs := vector.MustTCols[types.Rowid](vec) 980 for i, v := range vs { 981 for j, part := range tbl.parts { 982 var blks []BlockMeta 983 984 if tbl.meta != nil { 985 blks = tbl.meta.blocks[j] 986 } 987 if inParttion(v, part, txn.meta.SnapshotTS, blks) { 988 if err := vector.UnionOne(bats[j].GetVector(0), vec, int64(i), txn.proc.Mp()); err != nil { 989 for _, bat := range bats { 990 bat.Clean(txn.proc.Mp()) 991 } 992 return nil, err 993 } 994 break 995 } 996 } 997 } 998 for i := range bats { 999 bats[i].SetZs(bats[i].GetVector(0).Length(), txn.proc.Mp()) 1000 } 1001 return bats, nil 1002 } 1003 1004 func genDatabaseKey(ctx context.Context, name string) databaseKey { 1005 return databaseKey{ 1006 name: name, 1007 accountId: getAccountId(ctx), 1008 } 1009 } 1010 1011 func genTableKey(ctx context.Context, name string, databaseId uint64) tableKey { 1012 return tableKey{ 1013 name: name, 1014 databaseId: databaseId, 1015 accountId: getAccountId(ctx), 1016 } 1017 } 1018 1019 func genMetaTableName(id uint64) string { 1020 return fmt.Sprintf("_%v_meta", id) 1021 } 1022 1023 func isMetaTable(name string) bool { 1024 ok, _ := regexp.MatchString(`\_\d+\_meta`, name) 1025 return ok 1026 } 1027 1028 func genBlockMetas( 1029 ctx context.Context, 1030 rows [][]any, 1031 columnLength int, 1032 fs fileservice.FileService, 1033 m *mpool.MPool, prefetch bool) ([]BlockMeta, error) { 1034 blockInfos := catalog.GenBlockInfo(rows) 1035 { 1036 mp := make(map[uint64]catalog.BlockInfo) // block list 1037 for i := range blockInfos { 1038 if blk, ok := mp[blockInfos[i].BlockID]; ok { 1039 if blk.CommitTs.Less(blockInfos[i].CommitTs) { 1040 mp[blk.BlockID] = blockInfos[i] 1041 } 1042 } else { 1043 mp[blockInfos[i].BlockID] = blockInfos[i] 1044 } 1045 } 1046 blockInfos = blockInfos[:0] 1047 for _, blk := range mp { 1048 blockInfos = append(blockInfos, blk) 1049 } 1050 } 1051 1052 metas := make([]BlockMeta, len(blockInfos)) 1053 1054 idxs := make([]uint16, columnLength) 1055 for i := 0; i < columnLength; i++ { 1056 idxs[i] = uint16(i) 1057 } 1058 1059 for i, blockInfo := range blockInfos { 1060 zm, rows, err := fetchZonemapAndRowsFromBlockInfo(ctx, idxs, blockInfo, fs, m) 1061 if err != nil { 1062 if prefetch { 1063 continue 1064 } 1065 return nil, err 1066 } 1067 metas[i] = BlockMeta{ 1068 Rows: int64(rows), 1069 Info: blockInfos[i], 1070 Zonemap: zm, 1071 } 1072 } 1073 return metas, nil 1074 } 1075 1076 func inBlockMap(blk BlockMeta, blockMap map[uint64]bool) bool { 1077 _, ok := blockMap[blk.Info.BlockID] 1078 return ok 1079 } 1080 1081 func genModifedBlocks(ctx context.Context, deletes map[uint64][]int, orgs, modfs []BlockMeta, 1082 expr *plan.Expr, tableDef *plan.TableDef, proc *process.Process) []ModifyBlockMeta { 1083 blks := make([]ModifyBlockMeta, 0, len(orgs)-len(modfs)) 1084 1085 lenblks := len(modfs) 1086 blockMap := make(map[uint64]bool, lenblks) 1087 for i := 0; i < lenblks; i++ { 1088 blockMap[modfs[i].Info.BlockID] = true 1089 } 1090 1091 exprMono := plantool.CheckExprIsMonotonic(ctx, expr) 1092 columnMap, columns, maxCol := plantool.GetColumnsByExpr(expr, tableDef) 1093 for i, blk := range orgs { 1094 if !inBlockMap(blk, blockMap) { 1095 if !exprMono || needRead(ctx, expr, blk, tableDef, columnMap, columns, maxCol, proc) { 1096 blks = append(blks, ModifyBlockMeta{ 1097 meta: orgs[i], 1098 deletes: deletes[orgs[i].Info.BlockID], 1099 }) 1100 } 1101 } 1102 } 1103 return blks 1104 } 1105 1106 func genInsertBatch(bat *batch.Batch, m *mpool.MPool) (*api.Batch, error) { 1107 var attrs []string 1108 var vecs []*vector.Vector 1109 1110 { 1111 vec := vector.New(types.New(types.T_Rowid, 0, 0, 0)) 1112 for i := 0; i < bat.Length(); i++ { 1113 val := types.Rowid(uuid.New()) 1114 if err := vec.Append(val, false, m); err != nil { 1115 return nil, err 1116 } 1117 } 1118 vecs = append(vecs, vec) 1119 attrs = append(attrs, "rowid") 1120 } 1121 { 1122 var val types.TS 1123 1124 vec := vector.New(types.New(types.T_TS, 0, 0, 0)) 1125 for i := 0; i < bat.Length(); i++ { 1126 if err := vec.Append(val, false, m); err != nil { 1127 return nil, err 1128 } 1129 } 1130 vecs = append(vecs, vec) 1131 attrs = append(attrs, "timestamp") 1132 } 1133 bat.Vecs = append(vecs, bat.Vecs...) 1134 bat.Attrs = append(attrs, bat.Attrs...) 1135 return batch.BatchToProtoBatch(bat) 1136 } 1137 1138 func genColumnPrimaryKey(tableId uint64, name string) string { 1139 return fmt.Sprintf("%v-%v", tableId, name) 1140 } 1141 1142 func inParttion(v types.Rowid, part *Partition, 1143 ts timestamp.Timestamp, blocks []BlockMeta) bool { 1144 if part.Get(v, ts) { 1145 return true 1146 } 1147 if len(blocks) == 0 { 1148 return false 1149 } 1150 blkId := rowIDToBlockID(RowID(v)) 1151 for _, blk := range blocks { 1152 if blk.Info.BlockID == blkId { 1153 return true 1154 } 1155 } 1156 return false 1157 } 1158 1159 // transfer DataValue to rows 1160 func genRow(val *DataValue, cols []string) []any { 1161 row := make([]any, len(cols)) 1162 for i, col := range cols { 1163 switch v := val.value[col].Value.(type) { 1164 case bool: 1165 row[i] = v 1166 case int8: 1167 row[i] = v 1168 case int16: 1169 row[i] = v 1170 case int32: 1171 row[i] = v 1172 case int64: 1173 row[i] = v 1174 case uint8: 1175 row[i] = v 1176 case uint16: 1177 row[i] = v 1178 case uint32: 1179 row[i] = v 1180 case uint64: 1181 row[i] = v 1182 case float32: 1183 row[i] = v 1184 case float64: 1185 row[i] = v 1186 case []byte: 1187 row[i] = v 1188 case types.Date: 1189 row[i] = v 1190 case types.Datetime: 1191 row[i] = v 1192 case types.Timestamp: 1193 row[i] = v 1194 case types.Decimal64: 1195 row[i] = v 1196 case types.Decimal128: 1197 row[i] = v 1198 case types.TS: 1199 row[i] = v 1200 case types.Rowid: 1201 row[i] = v 1202 case types.Uuid: 1203 row[i] = v 1204 default: 1205 panic(fmt.Sprintf("unknown type: %T", v)) 1206 } 1207 } 1208 return row 1209 } 1210 1211 /* 1212 func genDatabaseIndexKey(databaseName string, accountId uint32) memtable.Tuple { 1213 return memtable.Tuple{ 1214 index_Database, 1215 memtable.ToOrdered([]byte(databaseName)), 1216 memtable.ToOrdered(accountId), 1217 } 1218 1219 } 1220 1221 func genTableIndexKey(tableName string, databaseId uint64, accountId uint32) memtable.Tuple { 1222 return memtable.Tuple{ 1223 index_Table, 1224 memtable.ToOrdered([]byte(tableName)), 1225 memtable.ToOrdered(databaseId), 1226 memtable.ToOrdered(accountId), 1227 } 1228 } 1229 1230 func genColumnIndexKey(id uint64) memtable.Tuple { 1231 return memtable.Tuple{ 1232 index_Column, 1233 memtable.ToOrdered(id), 1234 } 1235 } 1236 */ 1237 1238 func transferIval[T int32 | int64](v T, oid types.T) (bool, any) { 1239 switch oid { 1240 case types.T_int8: 1241 return true, int8(v) 1242 case types.T_int16: 1243 return true, int16(v) 1244 case types.T_int32: 1245 return true, int32(v) 1246 case types.T_int64: 1247 return true, int64(v) 1248 case types.T_uint8: 1249 return true, uint8(v) 1250 case types.T_uint16: 1251 return true, uint16(v) 1252 case types.T_uint32: 1253 return true, uint32(v) 1254 case types.T_uint64: 1255 return true, uint64(v) 1256 case types.T_float32: 1257 return true, float32(v) 1258 case types.T_float64: 1259 return true, float64(v) 1260 default: 1261 return false, nil 1262 } 1263 } 1264 1265 func transferUval[T uint32 | uint64](v T, oid types.T) (bool, any) { 1266 switch oid { 1267 case types.T_int8: 1268 return true, int8(v) 1269 case types.T_int16: 1270 return true, int16(v) 1271 case types.T_int32: 1272 return true, int32(v) 1273 case types.T_int64: 1274 return true, int64(v) 1275 case types.T_uint8: 1276 return true, uint8(v) 1277 case types.T_uint16: 1278 return true, uint16(v) 1279 case types.T_uint32: 1280 return true, uint32(v) 1281 case types.T_uint64: 1282 return true, uint64(v) 1283 case types.T_float32: 1284 return true, float32(v) 1285 case types.T_float64: 1286 return true, float64(v) 1287 default: 1288 return false, nil 1289 } 1290 } 1291 1292 func transferFval(v float32, oid types.T) (bool, any) { 1293 switch oid { 1294 case types.T_float32: 1295 return true, float32(v) 1296 case types.T_float64: 1297 return true, float64(v) 1298 default: 1299 return false, nil 1300 } 1301 } 1302 1303 func transferDval(v float64, oid types.T) (bool, any) { 1304 switch oid { 1305 case types.T_float32: 1306 return true, float32(v) 1307 case types.T_float64: 1308 return true, float64(v) 1309 default: 1310 return false, nil 1311 } 1312 } 1313 1314 func transferSval(v string, oid types.T) (bool, any) { 1315 switch oid { 1316 case types.T_json: 1317 return true, []byte(v) 1318 case types.T_char, types.T_varchar: 1319 return true, []byte(v) 1320 case types.T_text, types.T_blob: 1321 return true, []byte(v) 1322 case types.T_uuid: 1323 var uv types.Uuid 1324 copy(uv[:], []byte(v)[:]) 1325 return true, uv 1326 default: 1327 return false, nil 1328 } 1329 } 1330 1331 func transferBval(v bool, oid types.T) (bool, any) { 1332 switch oid { 1333 case types.T_bool: 1334 return true, v 1335 default: 1336 return false, nil 1337 } 1338 } 1339 1340 func transferDateval(v int32, oid types.T) (bool, any) { 1341 switch oid { 1342 case types.T_date: 1343 return true, types.Date(v) 1344 default: 1345 return false, nil 1346 } 1347 } 1348 1349 func transferTimeval(v int64, oid types.T) (bool, any) { 1350 switch oid { 1351 case types.T_time: 1352 return true, types.Time(v) 1353 default: 1354 return false, nil 1355 } 1356 } 1357 1358 func transferDatetimeval(v int64, oid types.T) (bool, any) { 1359 switch oid { 1360 case types.T_datetime: 1361 return true, types.Datetime(v) 1362 default: 1363 return false, nil 1364 } 1365 } 1366 1367 func transferTimestampval(v int64, oid types.T) (bool, any) { 1368 switch oid { 1369 case types.T_timestamp: 1370 return true, types.Timestamp(v) 1371 default: 1372 return false, nil 1373 } 1374 } 1375 1376 func transferDecimal64val(v int64, oid types.T) (bool, any) { 1377 switch oid { 1378 case types.T_decimal64: 1379 return true, types.Decimal64FromInt64Raw(v) 1380 default: 1381 return false, nil 1382 } 1383 } 1384 1385 func transferDecimal128val(a, b int64, oid types.T) (bool, any) { 1386 switch oid { 1387 case types.T_decimal128: 1388 return true, types.Decimal128FromInt64Raw(a, b) 1389 default: 1390 return false, nil 1391 } 1392 }