Example #1
0
void print_schema(const ObSchemaManagerV2 &sm)
{
  uint64_t cur_table_id = OB_INVALID_ID;
  const ObColumnSchemaV2 *iter = NULL;
  for (iter = sm.column_begin(); iter != sm.column_end(); iter++)
  {
    if (NULL != iter)
    {
      if (iter->get_table_id() != cur_table_id)
      {
        const ObTableSchema *table_schema = sm.get_table_schema(iter->get_table_id());
        if (NULL != table_schema)
        {
          fprintf(stdout, "[TABLE_SCHEMA] table_id=%lu table_type=%d table_name=%s split_pos=%d rowkey_max_length=%d\n",
              iter->get_table_id(), table_schema->get_table_type(), table_schema->get_table_name(),
              table_schema->get_split_pos(), table_schema->get_rowkey_max_length());
        }
        else
        {
          fprintf(stdout, "[TABLE_SCHEMA] table_id=%lu\n", iter->get_table_id());
        }
        cur_table_id = iter->get_table_id();
      }
      fprintf(stdout, "              [COLUMN_SCHEMA] column_id=%lu column_name=%s column_type=%d size=%ld\n",
          iter->get_id(), iter->get_name(), iter->get_type(), iter->get_size());
    }
  }
}
int ObParamDecoder::decode_cell(const bool is_ext, const ObCellInfo & org_cell,
    const ObSchemaManagerV2 & schema, ObCellInfo & decoded_cell)
{
  int ret = OB_SUCCESS;
  if (false == is_ext)
  {
    const ObColumnSchemaV2 * column_schema = schema.get_column_schema(org_cell.table_name_,
        org_cell.column_name_);
    if (NULL == column_schema)
    {
      ret = OB_SCHEMA_ERROR;
      TBSYS_LOG(WARN, "check column failed:table[%.*s], column[%.*s], ret[%d]",
          org_cell.table_name_.length(), org_cell.table_name_.ptr(),
          org_cell.column_name_.length(), org_cell.column_name_.ptr(), ret);
    }
    else
    {
      decoded_cell.table_id_ = column_schema->get_table_id();
      decoded_cell.column_id_ = column_schema->get_id();
      decoded_cell.row_key_ = org_cell.row_key_;
      decoded_cell.value_ = org_cell.value_;
    }
  }
  else
  {
    const ObTableSchema * table_schema = schema.get_table_schema(org_cell.table_name_);
    if (NULL == table_schema)
    {
      ret = OB_SCHEMA_ERROR;
      TBSYS_LOG(WARN, "check table failed:table[%.*s], ret[%d]", org_cell.table_name_.length(),
          org_cell.table_name_.ptr(), ret);
    }
    else
    {
      decoded_cell.table_id_ = table_schema->get_table_id();
      // delete row is already using this column id
      // using OB_ALL_MAX_COLUMN_ID for exist type
      decoded_cell.column_id_ = OB_ALL_MAX_COLUMN_ID;
      decoded_cell.row_key_ = org_cell.row_key_;
      decoded_cell.value_ = org_cell.value_;
    }
  }
  return ret;
}
Example #3
0
int fill_sstable_schema(ObSchemaManagerV2 &mgr, const uint64_t table_id, ObSSTableSchema& sstable_schema)
{
  int ret = OB_SUCCESS;
  int32_t cols = 0;
  int32_t size = 0;
  ObSSTableSchemaColumnDef column_def;

  sstable_schema.reset();

  const ObColumnSchemaV2 *col = mgr.get_table_schema( table_id,size);

  if (NULL == col || size <= 0)
  {
    TBSYS_LOG(ERROR,"cann't find this table:%lu",table_id);
    ret = OB_ERROR;
  }
  else
  {
    for (int col_index = 0; col_index < size && OB_SUCCESS == ret; ++col_index)
    {
      memset(&column_def,0,sizeof(column_def));
      column_def.table_id_ = static_cast<uint32_t>(table_id);
      column_def.column_group_id_ = static_cast<uint16_t>((col + col_index)->get_column_group_id());
      column_def.column_name_id_ = static_cast<uint16_t>((col + col_index)->get_id());
      column_def.column_value_type_ = (col + col_index)->get_type();
      if ( (ret = sstable_schema.add_column_def(column_def)) != OB_SUCCESS )
      {
        TBSYS_LOG(ERROR,"add column_def(%u,%u,%u) failed col_index : %d",column_def.table_id_,
          column_def.column_group_id_,column_def.column_name_id_,col_index);
      }
      ++cols;
    }
  }

  if ( 0 == cols && OB_SUCCESS == ret ) //this table has moved to updateserver
  {
    ret = OB_CS_TABLE_HAS_DELETED;
  }
  return ret;
}
int ObCSCreatePlan::get_basic_column_and_join_info(
  const ObProject &project,
  const ObSchemaManagerV2 &schema_mgr,
  const uint64_t table_id, 
  const uint64_t renamed_table_id,
  ObArray<uint64_t> &basic_columns,
  ObTabletJoin::TableJoinInfo &table_join_info)
{
  int ret = OB_SUCCESS;
  ObSqlExpression expr;
  uint64_t column_id = OB_INVALID_ID;
  const ObColumnSchemaV2 *column_schema = NULL;
  const ObColumnSchemaV2::ObJoinInfo *join_info = NULL;
  const ObTableSchema *table_schema = NULL;
  ObTabletJoin::JoinInfo join_info_item;
  bool is_cid = false;

  column_ids_.clear();

  //找到所有的需要join的普通列
  for(int32_t i=0;OB_SUCCESS == ret && i<project.get_output_columns().count();i++)
  {
    if(OB_SUCCESS != (ret = project.get_output_columns().at(i, expr)))
    {
      TBSYS_LOG(WARN, "get expression from out columns fail:ret[%d] i[%d]", ret, i);
    }
    if(OB_SUCCESS == ret)
    {
      column_id = expr.get_column_id();

      if(OB_INVALID_ID == expr.get_table_id()
        || table_id == expr.get_table_id()
        || renamed_table_id == expr.get_table_id())
      {
        //do nothing 复合列 or OB_ACTION_FLAG_COLUMN_ID
      }
      else
      {
        ret = OB_ERR_UNEXPECTED;
        TBSYS_LOG(WARN, "Unknown expression id, table_id[%lu], renamed_table_id[%lu], expr_table_id[%lu]", 
            table_id, renamed_table_id, expr.get_table_id());
      }
    }

     if(OB_SUCCESS == ret)
     {
      //如果是普通列, 复合列不交给下层的物理操作符
      //if( (OB_SUCCESS == (ret = expr.is_column_index_expr(is_cid))) && is_cid)
      uint64_t tid = OB_INVALID_ID;
      if ( (OB_SUCCESS == (ret = expr.get_column_index_expr(tid, column_id, is_cid))) && is_cid && common::OB_ACTION_FLAG_COLUMN_ID != column_id)
      {
        if (column_ids_.has_member((int32_t)column_id))
        {
          TBSYS_LOG(DEBUG, "duplicate column [%lu]", column_id);
          continue; //如果发现重复列,就直接跳过
        }
        else if (!column_ids_.add_member((int32_t)column_id))
        {
          ret = OB_ERROR;
          TBSYS_LOG(WARN, "fail to add member[%lu]", column_id);
        }
        else if(NULL == (column_schema = schema_mgr.get_column_schema(table_id, column_id)))
        {
          ret = OB_ERROR;
          TBSYS_LOG(WARN, "get column schema fail:tid[%lu], table_id[%lu] column_id[%lu]", tid, table_id, column_id);
        }
        else
        {
          // erase duplicate columns;
          if(OB_SUCCESS != (ret = basic_columns.push_back(column_id)))
          {
            TBSYS_LOG(WARN, "fail to push item:ret[%d], column_id[%lu]", ret, column_id);
          }
        }

        //构造对应的join_info信息
        if(OB_SUCCESS == ret)
        {
          join_info = column_schema->get_join_info();
          if(NULL != join_info)
          {
            if(OB_INVALID_ID == table_join_info.left_table_id_)
            {
              table_join_info.left_table_id_ = table_id;
            }
            else if(table_join_info.left_table_id_ != table_id)
            {
              ret = OB_ERROR;
              TBSYS_LOG(WARN, "left table id cannot change:t1[%lu], t2[%lu]", table_join_info.left_table_id_, table_id);
            }

            if(OB_SUCCESS == ret)
            {
              if(table_join_info.join_condition_.count() == 0)
              {
                uint64_t left_rowkey_column_id = OB_INVALID_ID;
                for(uint64_t left_col_idx=0;left_col_idx<join_info->left_column_count_;left_col_idx++)
                {
                  int64_t col_idx = join_info->left_column_offset_array_[left_col_idx];
                  if(NULL == (table_schema = schema_mgr.get_table_schema(table_id)))
                  {
                    ret = OB_ERROR;
                    TBSYS_LOG(WARN, "get table schema fail:table_id[%lu]", table_id);
                  }
                  else if(OB_SUCCESS != (ret = table_schema->get_rowkey_info().get_column_id(col_idx, left_rowkey_column_id)))
                  {
                    TBSYS_LOG(WARN, "get left rowkey column id fail:ret[%d], col_idx[%ld]", ret, col_idx);
                  }
                  else if(OB_SUCCESS != (ret = table_join_info.join_condition_.push_back(left_rowkey_column_id)))
                  {
                    TBSYS_LOG(WARN, "push left rowkey column id fail:ret[%d], left_rowkey_column_id[%ld]", ret, left_rowkey_column_id);
                  }
                }
              }
              else if((uint64_t)table_join_info.join_condition_.count() != join_info->left_column_count_)
              {
                ret = OB_ERROR;
                TBSYS_LOG(WARN, "join info count change");
              }
            }

            if(OB_SUCCESS == ret)
            {
              table_join_info.right_table_id_ = join_info->join_table_;
              join_info_item.left_column_id_ = column_schema->get_id();
              join_info_item.right_column_id_ = join_info->correlated_column_;
              if(OB_SUCCESS != (ret = table_join_info.join_column_.push_back(join_info_item)))
              {
                TBSYS_LOG(WARN, "add join info item fail:ret[%d]", ret);
              }
            }
          }
        }
      }
     }
   }

  if(OB_SUCCESS == ret)
  {
    //如果存在需要join的列
    if(table_join_info.join_column_.count() > 0)
    {
      //添加join需要的列id
      if(OB_SUCCESS == ret)
      {
        uint64_t left_column_id = OB_INVALID_ID;
        for(int32_t i=0;OB_SUCCESS == ret && i<table_join_info.join_condition_.count();i++)
        {
          if(OB_SUCCESS != (ret = table_join_info.join_condition_.at(i, left_column_id)))
          {
            TBSYS_LOG(WARN, "get join cond fail:ret[%d] i[%d]", ret, i);
          }
          else if (column_ids_.has_member((int32_t)left_column_id))
          {
            //do nothing
          }
          else if (!column_ids_.add_member((int32_t)left_column_id))
          {
            ret = OB_ERROR;
            TBSYS_LOG(WARN, "fail to add member[%lu]", column_id);
          }
          else
          {
            // erase duplicate columns;
            if(OB_SUCCESS != (ret = basic_columns.push_back(left_column_id)))
            {
              TBSYS_LOG(WARN, "fail to push item:ret[%d], column_id[%lu]", ret, left_column_id);
            }
          }
        }
      }
    }
  }
  
  return ret;
}