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  }