int ObSystemConfigKey::set_int(const ObString &key, int64_t intval)
{
  int ret = OB_SUCCESS;
  if (key == ObString::make_string("cluster_id"))
  {
    cluster_id_ = intval;
  }
  else if (key == ObString::make_string("svr_port"))
  {
    server_port_ = intval;
  }
  else
  {
    ret = OB_INVALID_ARGUMENT;
    TBSYS_LOG(ERROR, "unknow sys config column name: %.*s",
              key.length(), key.ptr());
  }
  return ret;
}
Пример #2
0
int ObMetaTable3::get_table_schema(const ObString &tname, TableSchema &table_schema)
{
  int ret = OB_SUCCESS;
  if (OB_SUCCESS != (ret = schema_service_.get_table_schema(tname, table_schema)))
  {
    TBSYS_LOG(WARN, "failed to get table schema, err=%d", ret);
  }
  else if (TableSchema::META != table_schema.table_type_)
  {
    ret = OB_ERR_UNEXPECTED;
    TBSYS_LOG(ERROR, "this table is not meta table, tname=%.*s type=%d",
              tname.length(), tname.ptr(), table_schema.table_type_);
  }
  else if (0 >= table_schema.rowkey_column_num_)
  {
    ret = OB_ERR_UNEXPECTED;
    TBSYS_LOG(ERROR, "BUG rowkey column num=%d", table_schema.rowkey_column_num_);
  }
  return ret;
}
Пример #3
0
int main(int argc, char ** argv)
{
  UNUSED(argc);
  UNUSED(argv);
  int ret = OB_SUCCESS;
  //char * test = "00596331192663719";
  char * test = "00912219024438372";
  ObString rowkey;
  rowkey.assign(test, strlen(test));
  char temp[1024];
  hex_to_str(rowkey.ptr(), rowkey.length(), temp, 1024);
  printf("test2str:test[%s], str[%s]\n", test, temp);

  int64_t ip = 539289610; //488957962; //522512394;
  ObServer server;
  server.set_ipv4_addr(ip, 1024);
  static const int32_t MAX_SERVER_ADDR_SIZE = 128;
  char server_addr[MAX_SERVER_ADDR_SIZE];
  server.to_string(server_addr, MAX_SERVER_ADDR_SIZE);
  printf("server:[%ld], server[%s]\n", ip, server_addr);
  return ret;
}
int ObInnerTableOperator::update_all_trigger_event(ObString & sql, const int64_t timestamp,
    const ObServer & server, const int64_t type, const int64_t param)
{
  UNUSED(param);
  int ret = OB_SUCCESS;
  if ((sql.ptr() == NULL) || (0 == sql.size()))
  {
    TBSYS_LOG(WARN, "Check SQL buffer size failed! ptr[%p], size[%d]", sql.ptr(), sql.size());
    ret = OB_INVALID_ARGUMENT;
  }
  else
  {
    char buf[OB_MAX_SERVER_ADDR_SIZE] = "";
    if (server.ip_to_string(buf, sizeof(buf)) != true)
    {
      ret = OB_CONVERT_ERROR;
    }
    else
    {
      const char * format = "REPLACE INTO %s"
        "(event_ts, src_ip, event_type, event_param) "
        "values (%ld, '%s', %ld, %ld);";
      int size = snprintf(sql.ptr(), sql.size(), format,
          OB_ALL_TRIGGER_EVENT_TABLE_NAME, timestamp, buf, type, param);
      if (size >= sql.size())
      {
        TBSYS_LOG(ERROR, "SQL buffer size not enough! size: [%d], need: [%d], sql: [%.*s]",
            sql.size(), size, sql.length(), sql.ptr());
        ret = OB_SIZE_OVERFLOW;
      }
      else
      {
        sql.assign_ptr(sql.ptr(), size);
      }
    }
  }
  return ret;
}
int ObInnerTableOperator::update_all_server(ObString & sql, const int64_t cluster_id,
    const char * server_type, const ObServer & server, const uint32_t inner_port, const char * version)
{
  int ret = OB_SUCCESS;
  if ((sql.ptr() == NULL) || (0 == sql.size()))
  {
    TBSYS_LOG(WARN, "Check SQL buffer size failed! ptr[%p], size[%d]", sql.ptr(), sql.size());
    ret = OB_INVALID_ARGUMENT;
  }
  else
  {
    char buf[OB_MAX_SERVER_ADDR_SIZE] = "";
    if (server.ip_to_string(buf, sizeof(buf)) != true)
    {
      ret = OB_CONVERT_ERROR;
    }
    else
    {
      const char * format = "REPLACE INTO %s"
        "(cluster_id, svr_type, svr_ip, svr_port, inner_port, svr_role, svr_version) "
        "values (%d, '%s', '%s', %u, %u, %d, '%s');";
      int size = snprintf(sql.ptr(), sql.size(), format, OB_ALL_SERVER, cluster_id,
          server_type, buf, server.get_port(), inner_port, 0, version);
      if (size >= sql.size())
      {
        TBSYS_LOG(ERROR, "SQL buffer size not enough! size: [%d], need: [%d], sql: [%.*s]",
            sql.size(), size, sql.length(), sql.ptr());
        ret = OB_SIZE_OVERFLOW;
      }
      else
      {
        sql.assign_ptr(sql.ptr(), size);
      }
    }
  }
  return ret;
}
Пример #6
0
static int get_table_id(ResultPlan* result_plan, const ObString &table_name, uint64_t &table_id)
{
  int ret = OB_SUCCESS;
  OB_ASSERT(NULL != result_plan);
  ObLogicalPlan* logical_plan = static_cast<ObLogicalPlan*>(result_plan->plan_tree_);
  ObSchemaChecker* schema_checker = static_cast<ObSchemaChecker*>(result_plan->schema_checker_);

  if (logical_plan == NULL)
  {
    ret = OB_ERR_UNEXPECTED;
    PARSER_LOG("unexpected branch, logical_plan is NULL");
  }
  else if (NULL == schema_checker)
  {
    ret = OB_ERR_SCHEMA_UNSET;
    PARSER_LOG("unexpected branch, schema_checker is NULL");
  }
  else if (OB_INVALID_ID == (table_id = schema_checker->get_table_id(table_name)))
  {
    ret = OB_ERR_TABLE_UNKNOWN;
    PARSER_LOG("Table `%.*s' does not exist", table_name.length(), table_name.ptr());
  }
  return ret;
}
Пример #7
0
int TaskFactory::init_new_task(const ObString & table_name, const ObRowkey & start_key,
    const ObRowkey & end_key, ObScanParam & scan_param, TaskInfo & task) const
{
  int ret = OB_SUCCESS;
  if (!check_string(table_name))
  {
    TBSYS_LOG(WARN, "check table name or end key failed:name[%.*s]",
      table_name.length(), table_name.ptr());
    ret = OB_ERROR;
  }
  else
  {
    ObNewRange range;
    range.border_flag_.unset_inclusive_start();
    range.border_flag_.set_inclusive_end();
    if (NULL == start_key.ptr())
    {
      range.border_flag_.set_min_value();
    }
    else
    {
      range.start_key_ = start_key;
      range.border_flag_.unset_min_value();
    }
    range.border_flag_.unset_max_value();
    range.end_key_ = end_key;
    scan_param.set(OB_INVALID_ID, table_name, range);
    // deep copy the param to task info param
    ret = task.set_param(scan_param);
    if (ret != OB_SUCCESS)
    {
      TBSYS_LOG(ERROR, "set param failed:ret[%d]", ret);
    }
  }
  return ret;
}
int ObInnerTableOperator::delete_all_server(ObString & sql, const int64_t cluster_id,
    const char * server_type, const ObServer & server)
{
  int ret = OB_SUCCESS;
  if ((sql.ptr() == NULL) || (0 == sql.size()))
  {
    TBSYS_LOG(WARN, "Check SQL buffer size failed! ptr[%p], size[%d]", sql.ptr(), sql.size());
    ret = OB_INVALID_ARGUMENT;
  }
  else
  {
    char buf[OB_MAX_SERVER_ADDR_SIZE] = "";
    if (server.ip_to_string(buf, sizeof (buf)) != true)
    {
      ret = OB_CONVERT_ERROR;
    }
    else
    {
      const char * format = "DELETE FROM %s WHERE cluster_id = %d AND svr_type = '%s' "
        "AND svr_ip = '%s' AND svr_port = %u;";
      int size = snprintf(sql.ptr(), sql.size(), format, OB_ALL_SERVER,
          cluster_id, server_type, buf, server.get_port());
      if (size >= sql.size())
      {
        TBSYS_LOG(ERROR, "SQL buffer size not enough! size: [%d], need: [%d], sql: [%.*s]",
            sql.size(), size, sql.length(), sql.ptr());
        ret = OB_SIZE_OVERFLOW;
      }
      else
      {
        sql.assign_ptr(sql.ptr(), size);
      }
    }
  }
  return ret;
}
      void ObTabletJoinTest::test_big_data(ObTabletJoin &tablet_join)
      {
        system("python gen_test_data.py join");

        ObTabletJoin::TableJoinInfo tablet_join_info;
        tablet_join_info.left_table_id_ = LEFT_TABLE_ID;
        tablet_join_info.right_table_id_ = RIGHT_TABLE_ID;

        ObTabletJoin::JoinInfo join_info;

        OK(tablet_join_info.join_condition_.push_back(1));

        OK(read_join_info(tablet_join_info, "tablet_join_test_data/join_info.ini"));

        tablet_join.set_table_join_info(tablet_join_info);

        ObFakeUpsMultiGet fake_ups_multi_get("tablet_join_test_data/big_ups_scan2.ini");
        ObFileTable result("tablet_join_test_data/big_result2.ini");

        ObFakeSSTableScan sstable("tablet_join_test_data/big_sstable2.ini");
        ObFakeUpsScan ups_scan("tablet_join_test_data/none_ups.ini");

        ObTabletScanFuse tablet_fuse;
        OK(tablet_fuse.set_sstable_scan(&sstable));
        OK(tablet_fuse.set_incremental_scan(&ups_scan));

        tablet_join.set_child(0, tablet_fuse);
        tablet_join.set_batch_count(30000);
        tablet_join.set_ups_multi_get(&fake_ups_multi_get);
        
        OK(sstable.open());
        OK(sstable.close());

        uint64_t table_id = OB_INVALID_ID;
        uint64_t column_id = OB_INVALID_ID;

        const ObRowDesc *row_desc = NULL;
        sstable.get_row_desc(row_desc);
        for(int64_t i=0;i<row_desc->get_column_num();i++)
        {
          row_desc->get_tid_cid(i, table_id, column_id);
          tablet_join.add_column_id(column_id);
        }

        ObGetParam get_param(true);

        const ObRow *row = NULL;
        const ObRow *result_row = NULL;
        const ObObj *value = NULL;
        const ObObj *result_value = NULL;
        
        OK(result.open());
        OK(tablet_join.open());

        int err = OB_SUCCESS;
        int64_t count = 0;
        
        while(OB_SUCCESS == (err = tablet_join.get_next_row(row)))
        {
          OK(result.get_next_row(result_row));
          count ++;

          for(int64_t i=0;i<row->get_column_num();i++)
          {
            OK(row->raw_get_cell(i, value, table_id, column_id));
            OK(result_row->get_cell(table_id, column_id, result_value));

            if( *value != *result_value )
            {
              printf("row:[%ld], column[%ld]===========\n", count, i);

              ObString rowkey;
              get_rowkey(*row, rowkey);
              printf("row rowkey: %.*s\n", rowkey.length(), rowkey.ptr());
              printf("row: %s\n", print_obj(*value));
              get_rowkey(*result_row, rowkey);
              printf("result rowkey: %.*s\n", rowkey.length(), rowkey.ptr());
              printf("result: %s\n", print_obj(*result_value));
            }

            ASSERT_TRUE((*value) == (*result_value));
          }
        }
        ASSERT_TRUE(OB_SUCCESS == err || OB_ITER_END == err);

        OK(result.close());
        OK(tablet_join.close());

      }
Пример #10
0
bool TaskFactory::check_string(const ObString & name)
{
  return ((NULL != name.ptr()) && (0 != name.length()));
}
Пример #11
0
const char *print_obj(const ObObj &obj)
{
  static __thread char buffer[1024 * 10];
  switch (obj.get_type())
  {
    case ObNullType:
      sprintf(buffer, "obj_type=null");
      break;
    case ObIntType:
      {
        bool is_add = false;
        int64_t tmp = 0;
        obj.get_int(tmp, is_add);
        sprintf(buffer, "obj_type=int value=%ld is_add=%s", tmp, STR_BOOL(is_add));
      }
      break;
    case ObFloatType:
      {
        bool is_add = false;
        float tmp = 0.0;
        obj.get_float(tmp, is_add);
        sprintf(buffer, "obj_type=float value=%f is_add=%s", tmp, STR_BOOL(is_add));
      }
      break;
    case ObDoubleType:
      {
        bool is_add = false;
        double tmp = 0.0;
        obj.get_double(tmp, is_add);
        sprintf(buffer, "obj_type=double value=%lf is_add=%s", tmp, STR_BOOL(is_add));
      }
      break;
    case ObDateTimeType:
      {
        bool is_add = false;
        ObDateTime tmp;
        obj.get_datetime(tmp, is_add);
        sprintf(buffer, "obj_type=data_time value=%s is_add=%s", time2str(tmp), STR_BOOL(is_add));
      }
      break;
    case ObPreciseDateTimeType:
      {
        bool is_add = false;
        ObDateTime tmp;
        obj.get_precise_datetime(tmp, is_add);
        sprintf(buffer, "obj_type=precise_data_time value=%s is_add=%s", time2str(tmp), STR_BOOL(is_add));
      }
      break;
    case ObVarcharType:
      {
        ObString tmp;
        obj.get_varchar(tmp);
        sprintf(buffer, "obj_type=var_char value=[%.*s]", tmp.length(), tmp.ptr());
      }
      break;
    case ObSeqType:
      {
        sprintf(buffer, "obj_type=seq");
      }
      break;
    case ObCreateTimeType:
      {
        ObCreateTime tmp = 0;
        obj.get_createtime(tmp);
        snprintf(buffer, BUFFER_SIZE, "obj_type=create_time value=%s", time2str(tmp));
      }
      break;
    case ObModifyTimeType:
      {
        ObModifyTime tmp = 0;
        obj.get_modifytime(tmp);
        snprintf(buffer, BUFFER_SIZE, "obj_type=modify_time value=%s", time2str(tmp));
      }
      break;
    case ObExtendType:
      {
        int64_t tmp = 0;
        obj.get_ext(tmp);
        sprintf(buffer, "obj_type=extend value=%ld", tmp);
      }
      break;
    default:
      break;
  }
  return buffer;
}
Пример #12
0
int ObAlterSysCnf::open()
{
  int ret = OB_SUCCESS;
  if (sys_cnf_items_.count() <= 0)
  {
    ret = OB_NOT_INIT;
    TBSYS_LOG(USER_ERROR, "No param to be changed, ret=%d", ret);
  }
  else if ((local_context_.schema_manager_ =
                local_context_.merger_schema_mgr_->get_user_schema(0)) == NULL)
  {
    ret = OB_ERROR;
    TBSYS_LOG(USER_ERROR, "Fail to get schema manager, ret=%d", ret);
  }
  else if ((ret = execute_transaction_stmt(START_TRANSACTION)) != OB_SUCCESS)
  {
    TBSYS_LOG(WARN, "Start transaction failed, ret=%d", ret);
  }
  else
  {
    for (int64_t i = 0; i < sys_cnf_items_.count(); i++)
    {
      ObSysCnfItem& cnf_item = sys_cnf_items_.at(i);
      if (cnf_item.server_ip_.length() > 15)
      {
        ret = OB_ERROR;
        TBSYS_LOG(USER_ERROR, "Invalid server ip: %.*s",
                  cnf_item.server_ip_.length(), cnf_item.server_ip_.ptr());
        break;
      }
      else if (cnf_item.server_ip_.length() > 0)
      {
        // check ip address
        uint32_t ip = 0;
        char buf[16];
        memcpy(buf, cnf_item.server_ip_.ptr(), cnf_item.server_ip_.length());
        buf[cnf_item.server_ip_.length()] = '\0';
        if ((ip = inet_addr(buf)) == INADDR_NONE)
        {
          ret = OB_ERROR;
          TBSYS_LOG(USER_ERROR, "Invalid server ip: %.*s",
                    cnf_item.server_ip_.length(), cnf_item.server_ip_.ptr());
          break;
        }
      }
      else
      {
        cnf_item.server_ip_ = ObString::make_string("ANY"); // @see
      }
/**
mysql> desc __all_sys_config;
+--------------+--------------+----------+------+---------+-------+
| field        | type         | nullable | key  | default | extra |
+--------------+--------------+----------+------+---------+-------+
| gm_create    | createtime   |          |    0 | NULL    |       |
| gm_modify    | modifytime   |          |    0 | NULL    |       |
| cluster_id   | int          |          |    1 | NULL    |       |
| svr_type     | varchar(16)  |          |    2 | NULL    |       |
| svr_ip       | varchar(32)  |          |    3 | NULL    |       |
| svr_port     | int          |          |    4 | NULL    |       |
| name         | varchar(256) |          |    5 | NULL    |       |
| section      | varchar(256) |          |    0 | NULL    |       |
| data_type    | varchar(256) |          |    0 | NULL    |       |
| value        | varchar(256) |          |    0 | NULL    |       |
| value_strict | varchar(512) |          |    0 | NULL    |       |
| info         | varchar(512) |          |    0 | NULL    |       |
+--------------+--------------+----------+------+---------+-------+
 */
      int64_t pos = 0;
      char sql_buff[OB_MAX_VARCHAR_LENGTH];
      databuff_printf(sql_buff, OB_MAX_VARCHAR_LENGTH, pos,
                      "replace into %s"
                      "(cluster_id, svr_type, svr_ip, "
                      "svr_port, name, section, data_type, "
                      "value, value_strict, info) "
                      "values(%lu, '%s', '%.*s', %lu, '%.*s', 'unknown', '%s', '",
                      OB_ALL_SYS_CONFIG_TABLE_NAME,
                      cnf_item.cluster_id_ != OB_INVALID_ID ? cnf_item.cluster_id_ : 0,
                      print_role(cnf_item.server_type_),
                      cnf_item.server_ip_.length(), cnf_item.server_ip_.ptr(),
                      cnf_item.server_port_ != OB_INVALID_ID ? cnf_item.server_port_ : 0,
                      cnf_item.param_name_.length(), cnf_item.param_name_.ptr(),
                      ob_obj_type_str(cnf_item.param_value_.get_type()));
      if (cnf_item.param_value_.get_type() == ObNullType)
      {
        databuff_printf(sql_buff, OB_MAX_VARCHAR_LENGTH, pos, "NULL");
      }
      else
      {
        char varchar_buf[OB_MAX_VARCHAR_LENGTH];
        ObString varchar(OB_MAX_VARCHAR_LENGTH, OB_MAX_VARCHAR_LENGTH, varchar_buf);
        ObObj casted_cell;
        casted_cell.set_varchar(varchar);
        const ObObj *res_value = NULL;
        ObObj data_type;
        data_type.set_type(ObVarcharType);
        ObString val;
        if ((ret = obj_cast(cnf_item.param_value_, data_type, casted_cell, res_value)) != OB_SUCCESS)
        {
          TBSYS_LOG(WARN, "Fail to cast obj, err=%d", ret);
          break;
        }
        else if ((ret = res_value->get_varchar(val)) != OB_SUCCESS)
        {
          TBSYS_LOG(WARN, "Get casted value failed, err=%d", ret);
          break;
        }
        databuff_printf(sql_buff, OB_MAX_VARCHAR_LENGTH, pos, "%.*s", val.length(), val.ptr());
      }
      databuff_printf(sql_buff, OB_MAX_VARCHAR_LENGTH, pos, "', 'unknown', '%.*s')",
                      cnf_item.comment_.length(), cnf_item.comment_.ptr());
      ObString sql_string(OB_MAX_VARCHAR_LENGTH, static_cast<int32_t>(pos), sql_buff);
      ObResultSet tmp_result;
      if (OB_SUCCESS != (ret = tmp_result.init()))
      {
        TBSYS_LOG(WARN, "Init temp result set failed, ret=%d", ret);
      }
      else if (OB_SUCCESS != (ret = ObSql::direct_execute(sql_string, tmp_result, local_context_)))
      {
        TBSYS_LOG(USER_ERROR, "Direct_execute failed, sql=%.*s ret=%d",
                  sql_string.length(), sql_string.ptr(), ret);
        break;
      }
      else if (OB_SUCCESS != (ret = tmp_result.open()))
      {
        TBSYS_LOG(WARN, "Open result set failed, sql=%.*s ret=%d",
                  sql_string.length(), sql_string.ptr(), ret);
        break;
      }
      else
      {
        /*
        if (tmp_result.get_affected_rows() <= 0)
        {
          TBSYS_LOG(WARN, "Fail to update param %.*s, sql=%.*s",
                    cnf_item.param_name_.length(), cnf_item.param_name_.ptr(),
                    sql_string.length(), sql_string.ptr());
        }
        */
        if ((ret = tmp_result.close()) != OB_SUCCESS)
        {
          TBSYS_LOG(WARN, "Failed to close temp result set, sql=%.*s ret=%d",
                    sql_string.length(), sql_string.ptr(), ret);
          break;
        }
      }
    }
    if (ret == OB_SUCCESS)
    {
      if ((ret = execute_transaction_stmt(COMMIT)) != OB_SUCCESS)
      {
        TBSYS_LOG(WARN, "Commit transaction failed, ret=%d", ret);
      }
      else
      {
        // notify all servers to update config
        ObResultSet tmp_result;
        if (OB_SUCCESS != (ret = tmp_result.init()))
        {
          TBSYS_LOG(WARN, "Init temp result set failed, ret=%d", ret);
        }
        else if (OB_SUCCESS != (ret = ObDirectTriggerEventUtil::refresh_new_config(tmp_result, local_context_)))
        {
          TBSYS_LOG(ERROR, "fail to refresh new config. ret=%d", ret);
        }
        // to release resouce, call open & close
        else if (OB_SUCCESS != (ret = tmp_result.open()))
        {
          TBSYS_LOG(WARN, "fail to open tmp result. ret=%d", ret);
        }
        else if (OB_SUCCESS != (ret = tmp_result.close()))
        {
          TBSYS_LOG(WARN, "fail to close tmp result. ret=%d", ret);
        }
      }
    }
    else
    {
      if (execute_transaction_stmt(ROLLBACK) != OB_SUCCESS)
      {
        TBSYS_LOG(WARN, "Rollback transaction failed");
      }
    }
  }
  if (local_context_.schema_manager_ != NULL)
  {
    local_context_.merger_schema_mgr_->release_schema(local_context_.schema_manager_);
    local_context_.schema_manager_ = NULL;
  }
  return ret;
}
Пример #13
0
int ObSelectStmt::check_having_ident(
  ResultPlan& result_plan,
  ObString& column_name,
  TableItem* table_item,
  ObRawExpr*& ret_expr) const
{
  ObSqlRawExpr  *sql_expr;
  ObRawExpr     *expr;
  ret_expr = NULL;
  int& ret = result_plan.err_stat_.err_code_ = OB_SUCCESS;
  ObLogicalPlan* logical_plan = static_cast<ObLogicalPlan*>(result_plan.plan_tree_);
  if (logical_plan == NULL)
  {
    ret = OB_ERR_LOGICAL_PLAN_FAILD;
    snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
              "Wrong invocation of ObStmt::add_table_item, logical_plan must exist!!!");
  }

  ObSchemaChecker* schema_checker = NULL;
  if (ret == OB_SUCCESS)
  {
    schema_checker = static_cast<ObSchemaChecker*>(result_plan.schema_checker_);
    if (schema_checker == NULL)
    {
      ret = OB_ERR_SCHEMA_UNSET;
      snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
              "Schema(s) are not set");
    }
  }

  for (int32_t i = 0; ret == OB_SUCCESS && i < select_items_.size(); i++)
  {
    const SelectItem& select_item = get_select_item(i);
    // for single column expression, we already set it as alias name
    if (column_name == select_item.alias_name_)
    {
      sql_expr = logical_plan->get_expr(select_item.expr_id_);
      expr = sql_expr->get_expr();
      if (table_item)
      {
        if (expr->get_expr_type() == T_REF_COLUMN)
        {
          ObBinaryRefRawExpr* col_expr = dynamic_cast<ObBinaryRefRawExpr *>(expr);
          if (col_expr && col_expr->get_first_ref_id() == table_item->table_id_)
          {
            ColumnItem* column_item = get_column_item_by_id(col_expr->get_first_ref_id(), col_expr->get_second_ref_id());
            if (column_item && column_item->column_name_ == column_name)
            {
              ObBinaryRefRawExpr *b_expr = (ObBinaryRefRawExpr*)parse_malloc(sizeof(ObBinaryRefRawExpr), name_pool_);
              b_expr = new(b_expr) ObBinaryRefRawExpr();
              b_expr->set_expr_type(T_REF_COLUMN);
              b_expr->set_first_ref_id(col_expr->get_first_ref_id());
              b_expr->set_second_ref_id(col_expr->get_second_ref_id());
              ret_expr = b_expr;
              break;
            }
          }
        }
      }
      else
      {
        if (ret_expr)
        {
          ret = OB_ERR_COLUMN_AMBIGOUS;
          snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
              "column %.*s of having clause is ambiguous", column_name.length(), column_name.ptr());
          parse_free(ret_expr);
          ret_expr = NULL;
          break;
        }
        // for having clause: having cc > 0
        // type 1: select t1.cc
        if (expr->get_expr_type() == T_REF_COLUMN && !select_item.is_real_alias_)
        {
          ObBinaryRefRawExpr *col_expr = dynamic_cast<ObBinaryRefRawExpr *>(expr);
          ObBinaryRefRawExpr *b_expr = (ObBinaryRefRawExpr*)parse_malloc(sizeof(ObBinaryRefRawExpr), name_pool_);
          b_expr = new(b_expr) ObBinaryRefRawExpr();
          b_expr->set_expr_type(T_REF_COLUMN);
          b_expr->set_first_ref_id(col_expr->get_first_ref_id());
          b_expr->set_second_ref_id(col_expr->get_second_ref_id());
          ret_expr = b_expr;
        }
        // type 2: select t1.cc as cc
        // type 3: select t1.c1 as cc
        // type 4: select t1.c1 + t2.c1 as cc
        else
        {
          ObBinaryRefRawExpr *b_expr = (ObBinaryRefRawExpr*)parse_malloc(sizeof(ObBinaryRefRawExpr), name_pool_);
          b_expr = new(b_expr) ObBinaryRefRawExpr();
          b_expr->set_expr_type(T_REF_COLUMN);
          b_expr->set_first_ref_id(OB_INVALID_ID);
          b_expr->set_second_ref_id(sql_expr->get_column_id());
          ret_expr = b_expr;
        }
      }
    }
  }

  // No non-duplicated ident found
  if (ret == OB_SUCCESS && ret_expr == NULL)
  {
    for (int32_t i = 0; ret == OB_SUCCESS && i < group_expr_ids_.size(); i++)
    {
      sql_expr = logical_plan->get_expr(group_expr_ids_[i]);
      expr = sql_expr->get_expr();
      //ObRawExpr* expr = logical_plan->get_expr(group_expr_ids_[i])->get_expr();
      if (expr->get_expr_type() != T_REF_COLUMN)
        continue;

      ObBinaryRefRawExpr* col_expr = dynamic_cast<ObBinaryRefRawExpr *>(expr);
      // Only need to check original columns, alias columns are already checked before
      if (table_item == NULL || table_item->table_id_ == col_expr->get_first_ref_id())
      {
        ColumnItem* column_item = get_column_item_by_id(
                                      col_expr->get_first_ref_id(),
                                      col_expr->get_second_ref_id());
        if (column_item && column_name == column_item->column_name_)
        {
          ObBinaryRefRawExpr *b_expr = (ObBinaryRefRawExpr*)parse_malloc(sizeof(ObBinaryRefRawExpr), name_pool_);
          b_expr = new(b_expr) ObBinaryRefRawExpr();
          b_expr->set_expr_type(T_REF_COLUMN);
          b_expr->set_first_ref_id(column_item->table_id_);
          b_expr->set_second_ref_id(column_item->column_id_);
          ret_expr = b_expr;
          break;
        }
      }
    }
  }

  if (ret == OB_SUCCESS && ret_expr == NULL)
  {
    ret = OB_ERR_COLUMN_UNKNOWN;
    snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
        "Unknown %.*s in having clause", column_name.length(), column_name.ptr());
  }
  return ret;
}
Пример #14
0
TEST(ObObj,NOP)
{
  ObObj src_obj;
  ObObj mut_obj;
  int64_t val = 0;
  int64_t mutation = 5;
  ///create time
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_createtime(mutation);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_createtime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_FALSE(src_obj.get_add());

  ///create time
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_modifytime(mutation);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_modifytime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_FALSE(src_obj.get_add());

  ///precise time
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_precise_datetime(mutation);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_precise_datetime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_FALSE(src_obj.get_add());

  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_precise_datetime(mutation, true);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_precise_datetime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_TRUE(src_obj.get_add());

  ///date time
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_datetime(mutation);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_datetime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_FALSE(src_obj.get_add());

  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_datetime(mutation, true);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_datetime(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_TRUE(src_obj.get_add());

  /// int
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_int(mutation);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_int(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_FALSE(src_obj.get_add());

  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_int(mutation, true);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_int(val),OB_SUCCESS);
  ASSERT_EQ(val, mutation);
  ASSERT_TRUE(src_obj.get_add());

  /// obstring
  const char * cname = "cname";
  ObString str;
  ObString res;
  str.assign((char*)cname, static_cast<int32_t>(strlen(cname)));
  src_obj.set_ext(ObActionFlag::OP_NOP);
  mut_obj.set_varchar(str);
  ASSERT_EQ(src_obj.apply(mut_obj),OB_SUCCESS);
  ASSERT_EQ(src_obj.get_varchar(res),OB_SUCCESS);
  ASSERT_EQ((uint64_t)res.length(), strlen(cname));
  ASSERT_EQ(memcmp(res.ptr(),cname, res.length()), 0);
  ASSERT_FALSE(src_obj.get_add());
}
Пример #15
0
TEST(TestMemTable, trans_set)
{
  MemTable mt;
  mt.init();
  PageArena<char> allocer;
  ObUpsMutator ups_mutator;
  //ObMutator &mutator = ups_mutator.get_mutator();
  ObMutator result;
  ObScanParam scan_param;
  read_scan_param("test_cases/test_mt_set.scan.ini", "MT_SET_SCAN", allocer, scan_param);

  MemTableTransDescriptor td;

  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  EXPECT_NE(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  _US_
  // case begin
  // 对于hash engine,测试在已经有rowkey A 的情况下,开一个事务按A B A的顺序写入,在结束事务的时候是否正常
  // 避免出现结束事务时引用的rowkey是mutator临时申请的
  ObUpsMutator ups_mutator;
  ObMutator &mutator = ups_mutator.get_mutator();
  ObMutator result;
  read_cell_infos("test_cases/test_mt_set_unsorted.ci.ini", "MT_SET_UNSORTED_CI", allocer, mutator, result);
  EXPECT_EQ(OB_SUCCESS, mt.start_mutation(td));
  EXPECT_EQ(OB_SUCCESS, mt.set(td, ups_mutator));
  EXPECT_EQ(OB_SUCCESS, mt.end_mutation(td, false));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.start_mutation(td));
  EXPECT_EQ(OB_SUCCESS, mt.set(td, ups_mutator));
  // 此处模拟mutator被析构或重置
  while (OB_SUCCESS == mutator.next_cell())
  {
    ObMutatorCellInfo *mutator_ci = NULL;
    if (OB_SUCCESS == mutator.get_cell(&mutator_ci))
    {
      ObString rk = mutator_ci->cell_info.row_key_;
      memset(rk.ptr(), 0, rk.length());
    }
  }
  mutator.reset_iter();
  EXPECT_EQ(OB_SUCCESS, mt.end_mutation(td, false));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));

  mutator.reset();
  result.reset();
  read_cell_infos("test_cases/test_mt_ret_unsorted.ci.ini", "MT_RET_UNSORTED_CI", allocer, mutator, result);
  MemTableIterator iter;
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.scan(td, *(scan_param.get_range()), false, iter));
  ObRowCompaction rc;
  rc.set_iterator(&iter);
  while (OB_SUCCESS == result.next_cell())
  {
    ObMutatorCellInfo *ci_orig = NULL;
    ObCellInfo *ci_scan = NULL;
    EXPECT_EQ(OB_SUCCESS, rc.next_cell());
    EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    if (ObModifyTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    if (ObCreateTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    result.get_cell(&ci_orig);
    EXPECT_EQ(true, equal(ci_orig->cell_info, *ci_scan));
  }
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  mt.clear();
  _UE_
  // case end

  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.start_mutation(td));
  EXPECT_EQ(OB_SUCCESS, mt.set(td, ups_mutator));
  // 事务没有提交,scan结果应该为空
  _US_
  MemTableTransDescriptor td;
  MemTableIterator iter;
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
  _US_
    MemTableTransDescriptor td;
    EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
    EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  _UE_
  EXPECT_EQ(OB_SUCCESS, mt.scan(td, *(scan_param.get_range()), false, iter));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  EXPECT_EQ(OB_ITER_END, iter.next_cell());
  _UE_

  EXPECT_EQ(OB_SUCCESS, mt.end_mutation(td, false));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  ObUpsMutator ups_mutator2;
  ObMutator &mutator2 = ups_mutator2.get_mutator();
  ObMutator result2;
  read_cell_infos("test_cases/test_mt_trans_set.ci.ini", "MT_TRANS_SET_CI", allocer, mutator2, result2);
  ups_mutator2.set_mutate_timestamp(tbsys::CTimeUtil::getTime());
  EXPECT_EQ(OB_ERROR, mt.set(td, ups_mutator2));
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.start_mutation(td));
  EXPECT_EQ(OB_SUCCESS, mt.set(td, ups_mutator2));

  // 只能scan到第一个事务的结果
  _US_
  MemTableTransDescriptor td;
  MemTableIterator iter;
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.scan(td, *(scan_param.get_range()), false, iter));
  ObRowCompaction rc;
  rc.set_iterator(&iter);
  result.reset_iter();
  while (OB_SUCCESS == result.next_cell())
  {
    ObMutatorCellInfo *ci_orig = NULL;
    ObCellInfo *ci_scan = NULL;
    EXPECT_EQ(OB_SUCCESS, rc.next_cell());
    EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    if (ObModifyTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    if (ObCreateTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    result.get_cell(&ci_orig);
    EXPECT_EQ(true, equal(ci_orig->cell_info, *ci_scan));
  }
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td));
  _UE_

  // 第二个事务提交后可以看到全部结果
  EXPECT_EQ(OB_SUCCESS, mt.end_mutation(td, false));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, false));
  _US_
  MemTableTransDescriptor td;
  ObUpsMutator ups_mutator;
  ObMutator &mutator = ups_mutator.get_mutator();
  ObMutator result;
  read_cell_infos("test_cases/test_mt_trans_set.ret.ini", "MT_TRANS_SET_RET", allocer, mutator, result);
  MemTableIterator iter;
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.scan(td, *(scan_param.get_range()), false, iter));
  ObRowCompaction rc;
  rc.set_iterator(&iter);
  while (OB_SUCCESS == result.next_cell())
  {
    ObMutatorCellInfo *ci_orig = NULL;
    ObCellInfo *ci_scan = NULL;
    EXPECT_EQ(OB_SUCCESS, rc.next_cell());
    EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    if (ObModifyTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    if (ObCreateTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    result.get_cell(&ci_orig);
    EXPECT_EQ(true, equal(ci_orig->cell_info, *ci_scan));
  }
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td));
  _UE_

  // 第三个事务被会滚 看到的结果与第二个一样
  ObUpsMutator ups_mutator3;
  ObUpsMutator ups_result3;
  ObMutator &mutator3 = ups_mutator3.get_mutator();
  ObMutator &result3 = ups_result3.get_mutator();
  read_cell_infos("test_cases/test_mt_trans_set.ci.ini", "MT_TRANS_SET_CI", allocer, mutator3, result3);
  EXPECT_EQ(OB_ERROR, mt.set(td, ups_mutator3));
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(WRITE_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.start_mutation(td));
  EXPECT_EQ(OB_SUCCESS, mt.set(td, ups_mutator3));
  EXPECT_EQ(OB_SUCCESS, mt.end_mutation(td, true));
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td, true));
  _US_
  MemTableTransDescriptor td;
  ObUpsMutator ups_mutator;
  ObMutator &mutator = ups_mutator.get_mutator();
  ObMutator result;
  read_cell_infos("test_cases/test_mt_trans_set.ret.ini", "MT_TRANS_SET_RET", allocer, mutator, result);
  MemTableIterator iter;
  EXPECT_EQ(OB_SUCCESS, mt.start_transaction(READ_TRANSACTION, td));
  EXPECT_EQ(OB_SUCCESS, mt.scan(td, *(scan_param.get_range()), false, iter));
  ObRowCompaction rc;
  rc.set_iterator(&iter);
  while (OB_SUCCESS == result.next_cell())
  {
    ObMutatorCellInfo *ci_orig = NULL;
    ObCellInfo *ci_scan = NULL;
    EXPECT_EQ(OB_SUCCESS, rc.next_cell());
    EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    if (ObModifyTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    if (ObCreateTimeType == ci_scan->value_.get_type())
    {
      EXPECT_EQ(OB_SUCCESS, rc.next_cell());
      EXPECT_EQ(OB_SUCCESS, rc.get_cell(&ci_scan));
    }
    result.get_cell(&ci_orig);
    EXPECT_EQ(true, equal(ci_orig->cell_info, *ci_scan));
  }
  EXPECT_EQ(OB_SUCCESS, mt.end_transaction(td));
  _UE_

  mt.destroy();
}
uint64_t ObMetaTableColumnSchema::get_cid(const CF cf, const int32_t i) const
{
  uint64_t ret = OB_INVALID_ID;
  if (i >= ObTabletMetaTableRow::MAX_REPLICA_COUNT || 0 > i)
  {
    TBSYS_LOG(ERROR, "BUG invalid index, i=%d", i);
  }
  else
  {
    ObString cname;
    const int buf_len = meta_table_cname::STARTKEY_OBJ_PREFIX.length() + 8;
    char cname_buf[buf_len];
    cname_buf[0] = '\0';
    int print_len = 0;
    switch(cf)
    {
      case CF_TID:
        cname = COLUMNS_NAME[CIDX_TID];
        break;
      case CF_VERSION:
        cname = COLUMNS_NAME[CIDX_REPLICA1_VERSION + i * COLUMNS_PER_REPLICA];
        break;
      case CF_CHECKSUM:
        cname = COLUMNS_NAME[CIDX_REPLICA1_CHECKSUM + i * COLUMNS_PER_REPLICA];
        break;
      case CF_ROW_COUNT:
        cname = COLUMNS_NAME[CIDX_REPLICA1_ROW_COUNT + i * COLUMNS_PER_REPLICA];
        break;
      case CF_SIZE:
        cname = COLUMNS_NAME[CIDX_REPLICA1_SIZE + i * COLUMNS_PER_REPLICA];
        break;
      case CF_IPV4:
        cname = COLUMNS_NAME[CIDX_REPLICA1_IPV4 + i * COLUMNS_PER_REPLICA];
        break;
      case CF_IPV6_HIGH:
        cname = COLUMNS_NAME[CIDX_REPLICA1_IPV6_HIGH + i * COLUMNS_PER_REPLICA];
        break;
      case CF_IPV6_LOW:
        cname = COLUMNS_NAME[CIDX_REPLICA1_IPV6_LOW + i * COLUMNS_PER_REPLICA];
        break;
      case CF_PORT:
        cname = COLUMNS_NAME[CIDX_REPLICA1_IP_PORT + i * COLUMNS_PER_REPLICA];
        break;
      case CF_STARTKEY_COL:
        print_len = snprintf(cname_buf, buf_len, "%.*s%d", meta_table_cname::STARTKEY_OBJ_PREFIX.length(),
                           meta_table_cname::STARTKEY_OBJ_PREFIX.ptr(), i + 1);
        cname.assign_ptr(cname_buf, print_len);
        break;
      default:
        TBSYS_LOG(ERROR, "BUG invalid meta table column, cf=%d", cf);
        break;
    } // end switch

    if (OB_SUCCESS != get_cid_by_name(cname, ret))
    {
      TBSYS_LOG(ERROR, "meta table column not found, cname=%.*s tid=%lu",
                cname.length(), cname.ptr(), table_schema_.table_id_);
    }
  }
  return ret;
}
Пример #17
0
 uint64_t ObStringSearch::cal_print(const ObString & pattern)
 {
   const char* pat = pattern.ptr();
   const int64_t pat_len = pattern.length();
   return cal_print(pat, pat_len);
 }
Пример #18
0
bool check_result(const ObScanParam &scan_param,  ObScanner &ob_scanner, 
                  ObFinalResult & local_result)
{
  int err = OB_SUCCESS;
  bool res = true;
  ObScanner local_scanner;
  ObCellInfo *ob_cell = NULL;
  ObCellInfo *local_cell = NULL;
  err = local_result.scan(scan_param,local_scanner);
  if (OB_SUCCESS != err)
  {
    TBSYS_LOG(WARN,"fail to scan local result");
  }
  int64_t row_number = 0;
  bool ob_end = false;
  ObString rowkey;

  while (OB_SUCCESS == err)
  {
    for (int64_t scan_idx = 0; scan_idx < scan_param.get_column_name_size(); scan_idx ++)
    {
      if (OB_SUCCESS == err)
      {
        err = ob_scanner.next_cell();
      }
      if (OB_ITER_END == err && scan_idx == 0)
      {
        ob_end = true;
        err = OB_SUCCESS;
      }
      else if (OB_SUCCESS == err)
      {
        err = ob_scanner.get_cell(&ob_cell);
      }
      if (OB_SUCCESS != err)
      {
        TBSYS_LOG(WARN,"fail to get cell from ob result [row_idx:%lld,idx:%lld]", 
                  row_number, scan_idx);
      }
      if (OB_SUCCESS == err)
      {
        err = local_scanner.next_cell();
        if (ob_end && OB_ITER_END != err)
        {
          TBSYS_LOG(WARN,"local result return more cells than ob result");
          err = OB_INVALID_ARGUMENT;
        }
        if ( !ob_end && OB_ITER_END == err)
        {
          TBSYS_LOG(WARN,"ob result return more cells than local result");
          err = OB_INVALID_ARGUMENT;
        }
        if (ob_end && OB_ITER_END == err)
        {
          err = OB_ITER_END;
          break;
        }
        if (OB_SUCCESS == err)
        {
          err = local_scanner.get_cell(&local_cell);
        }
        if (OB_SUCCESS != err)
        {
          TBSYS_LOG(WARN,"fail to get cell from local result [row_idx:%lld,idx:%lld]", 
                    row_number, scan_idx);
        }
      }
      if (OB_SUCCESS == err)
      {
        if (0 == scan_idx)
        {
          rowkey = ob_cell->row_key_;
        }
        /// check ob result
        if (ob_cell->table_name_ != scan_param.get_table_name())
        {
          TBSYS_LOG(WARN,"ob result table name error [row_idx:%lld,idx:%lld,ob.table_name_:%.*s,"
                    "param.table_name_:%.*s]", row_number, scan_idx,ob_cell->table_name_.length(),
                    ob_cell->table_name_.ptr(), scan_param.get_table_name().length(), 
                    scan_param.get_table_name().ptr());
          err = OB_INVALID_ARGUMENT;
        }

        if (ob_cell->column_name_ != scan_param.get_column_name()[scan_idx])
        {
          TBSYS_LOG(WARN,"ob result rowkey error [row_idx:%lld,idx:%lld,ob.column_name_:%.*s,"
                    "param.column_name_:%.*s]", row_number, scan_idx,ob_cell->column_name_.length(),
                    ob_cell->column_name_.ptr(), scan_param.get_column_name()[scan_idx].length(), 
                    scan_param.get_column_name()[scan_idx].ptr());
          err = OB_INVALID_ARGUMENT;
        }
        /// check local result
        if (local_cell->table_name_ != scan_param.get_table_name())
        {
          TBSYS_LOG(WARN,"ob result table name error [row_idx:%lld,idx:%lld,ob.table_name_:%.*s,"
                    "param.table_name_:%.*s]", row_number, scan_idx,local_cell->table_name_.length(),
                    local_cell->table_name_.ptr(), scan_param.get_table_name().length(), 
                    scan_param.get_table_name().ptr());
          err = OB_INVALID_ARGUMENT;
        }

        if (local_cell->column_name_ != scan_param.get_column_name()[scan_idx])
        {
          TBSYS_LOG(WARN,"ob result rowkey error [row_idx:%lld,idx:%lld,ob.column_name_:%.*s,"
                    "param.column_name_:%.*s]", row_number,scan_idx,local_cell->column_name_.length(),
                    local_cell->column_name_.ptr(), scan_param.get_column_name()[scan_idx].length(), 
                    scan_param.get_column_name()[scan_idx].ptr());
          err = OB_INVALID_ARGUMENT;
        }


        if (local_cell->row_key_ != ob_cell->row_key_)
        {
          TBSYS_LOG(WARN,"rowkey error [row_idx:%lld,idx:%lld,ob.row_key_:%.*s,"
                    "local.row_key_:%.*s]", row_number, scan_idx,ob_cell->row_key_.length(),
                    ob_cell->row_key_.ptr(), local_cell->row_key_.length(), 
                    local_cell->row_key_.ptr());
          err = OB_INVALID_ARGUMENT;
        }
        if (local_cell->row_key_ != rowkey)
        {
          TBSYS_LOG(WARN,"rowkey error [row_idx:%lld,idx:%lld,ob.row_key_:%.*s,"
                    "row_first_cell.row_key_:%.*s]", row_number,scan_idx,local_cell->row_key_.length(),
                    local_cell->row_key_.ptr(), rowkey.length(),  rowkey.ptr());
          err = OB_INVALID_ARGUMENT;
        }

        if (OB_SUCCESS == err)
        {
          if (ob_cell->value_.get_ext() != local_cell->value_.get_ext())
          {
            TBSYS_LOG(WARN,"ext info not coincident [row_idx:%lld,idx:%lld,"
                      "ob.ext:%lld,local.ext:%lld]",
                      row_number, scan_idx, ob_cell->value_.get_ext(), local_cell->value_.get_ext());
            err = OB_INVALID_ARGUMENT;
          }
          if (ob_cell->value_.get_type() == ObNullType 
              && ob_cell->value_.get_type() == local_cell->value_.get_type())
          {
            /// check pass
          }
          else
          {
            int64_t ob_value = 0;
            int64_t local_value = 0;
            if (OB_SUCCESS == err)
            {
              err = ob_cell->value_.get_int(ob_value);
            }
            if (OB_SUCCESS == err)
            {
              err = local_cell->value_.get_int(local_value);
            }
            if (OB_SUCCESS != err)
            {
              TBSYS_LOG(WARN,"fail to get int value [row_idx:%lld,idx:%lld]",row_number, scan_idx);
              err = OB_INVALID_ARGUMENT;
            }
            else
            {
              if (ob_value != local_value)
              {
                TBSYS_LOG(WARN,"value not coincident [row_idx:%lld,idx:%lld,ob.value:%lld,"
                          "local.value:%lld]",row_number, scan_idx, ob_value, local_value);
                err = OB_INVALID_ARGUMENT;
              }
            }
          }
        }
      }
    }
    if (OB_ITER_END == err)
    {
      err  = OB_SUCCESS;
      break;
    }

    row_number ++;
  } 

  if (OB_SUCCESS != err)
  {
    res = false;
    TBSYS_LOG(DEBUG, "check fail");
  }
  else
  {
    res = true;
    TBSYS_LOG(DEBUG, "check pass");
  }
  return res;
}
Пример #19
0
int serialize_cell(ObCellInfo *cell, ObDataBuffer &buff)
{
  int64_t cap = buff.get_remain();
  int64_t len = -1;
  int type = cell->value_.get_type();
  char *data = buff.get_data();
  int64_t pos = buff.get_position();

  switch(type) {
   case ObNullType:
//     TBSYS_LOG(INFO, "Null Type");
     len = 0;
     break;
   case ObIntType:
     int64_t val;
     if (cell->value_.get_int(val) != OB_SUCCESS) {
       TBSYS_LOG(ERROR, "get_int error");
       break;
     }
     len = snprintf(data + pos, cap, "%ld", val);
     break;
   case ObVarcharType:
     {
       ObString str;
       if (cell->value_.get_varchar(str) != OB_SUCCESS ||
           cap < str.length()) {
         TBSYS_LOG(ERROR, "get_varchar error");
         break;
       }

       memcpy(data + pos, str.ptr(), str.length());
       escape_varchar(data + pos, str.length());
       len = str.length();
     }
     break;
   case ObPreciseDateTimeType:
     {
       int64_t value;
       if (cell->value_.get_precise_datetime(value) != OB_SUCCESS) {
         TBSYS_LOG(ERROR, "get_precise_datetime error");
         break;
       }
       len = ObDateTime2MySQLDate(value, type, data + pos, cap);
     }
    break;
   case ObDateTimeType:
     {
       int64_t value;
       if (cell->value_.get_datetime(value) != OB_SUCCESS) {
          TBSYS_LOG(ERROR, "get_datetime error ");
          break;
       }
       len = ObDateTime2MySQLDate(value, type, data + pos, cap);
     }
      break;
   case ObModifyTimeType:
     {
       int64_t value;
       if (cell->value_.get_modifytime(value) != OB_SUCCESS) {
         TBSYS_LOG(ERROR, "get_modifytime error ");
         break;
       }
       len = ObDateTime2MySQLDate(value, type, data + pos, cap);
     }
    break;
   case ObCreateTimeType:
     {
       int64_t value;
       if (cell->value_.get_createtime(value) != OB_SUCCESS) {
         TBSYS_LOG(ERROR, "get_createtime error");
         break;
       }
       len = ObDateTime2MySQLDate(value, type, data + pos, cap);
     }
     break;
   case ObFloatType:
     {
       float value;
       if (cell->value_.get_float(value) != OB_SUCCESS) {
         TBSYS_LOG(ERROR, "get_float error");
         break;
       }
       len = snprintf(data + pos, cap, "%f", value);
     }
     break;
   case ObDoubleType:
     {
       double value;
       if (cell->value_.get_double(value) != OB_SUCCESS) {
         TBSYS_LOG(ERROR, "get_double error");
         break;
       }
       len = snprintf(data + pos, cap, "%f", value);
     }
     break;
   default:
     TBSYS_LOG(WARN, "Not Defined Type %d", cell->value_.get_type());
     break;
  }

  if (len >= 0 ) {
    buff.get_position() += len;
  }

  return len;
}
Пример #20
0
    int ObMergeServerParams::update_item(const ObObj &item_name, const ObObj &item_value)
    {
      int ret = OB_SUCCESS;
      static const int max_name_len = 256;
      char name[max_name_len];
      int64_t value = 0;
      ObString str;

      if (OB_SUCCESS != (ret = item_name.get_varchar(str)))
      {
        TBSYS_LOG(WARN, "fail to get item name value. ret=%d", ret);
      }
      else if (str.length() < max_name_len)
      {
        strncpy(name, str.ptr(), str.length());
        name[str.length()] = '\0';
      }
      else
      {
        TBSYS_LOG(WARN, "item name too long. are you sure about this? item_name len=%d, max=%d", str.length(), max_name_len);
      }

      if ((OB_SUCCESS == ret) && (OB_SUCCESS != (ret = item_value.get_int(value))))
      {
        TBSYS_LOG(WARN, "fail to get value. expect int type");
      }

      if (OB_SUCCESS == ret)
      {
        if (0 == strcmp(name, OBMS_RETRY_TIMES))
        {
          retry_times_ = static_cast<int32_t>(value);
        }
        else if (0 == strcmp(name,  OBMS_TASK_QUEUE_SIZE))
        {
          task_queue_size_ = static_cast<int32_t>(value);
        }
        else if (0 == strcmp(name,  OBMS_TASK_THREAD_COUNT))
        {
          task_thread_count_ = static_cast<int32_t>(value);
        }
        else if (0 == strcmp(name,  OBMS_TASK_LEFT_TIME))
        {
          task_left_time_ = value;
        }
        else if (0 == strcmp(name,  OBMS_LOG_INTERVAL_COUNT))
        {
          log_interval_count_ = value;
        }
        else if (0 == strcmp(name,  OBMS_NETWORK_TIMEOUT))
        {
          network_time_out_ = value;
        }
        else if (0 == strcmp(name,  OBMS_LEASE_INTERVAL))
        {
          check_lease_interval_ = value;
        }
        else if (0 == strcmp(name,  OBMS_MONITOR_INTERVAL))
        {
          monitor_interval_ = value;
        }
        else if (0 == strcmp(name,  OBMS_UPSLIST_INTERVAL))
        {
          fetch_ups_interval_ = value;
        }
        else if (0 == strcmp(name,  OBMS_UPSVERION_TIMEOT))
        {
          frozen_version_timeout_ = value;
        }
        else if (0 == strcmp(name,  OBMS_BLACKLIST_TIMEOUT))
        {
          ups_blacklist_timeout_ = value;
        }
        else if (0 == strcmp(name,  OBMS_BLACKLIST_FAIL_COUNT))
        {
          ups_fail_count_ = value;
        }
        else if (0 == strcmp(name,  OBMS_LOCATION_CACHE_SIZE))
        {
          location_cache_size_ = static_cast<int32_t>(value) * 1024 * 1024L;
        }
        else if (0 == strcmp(name,  OBMS_LOCATION_CACHE_TIMEOUT))
        {
          location_cache_timeout_ = value;
        }
        else if (0 == strcmp(name,  OBMS_INTERMEDIATE_BUFFER_SIZE))
        {
          intermediate_buffer_size_  = value * (1024*1024);
        }
        else if (0 == strcmp(name,  OBMS_MAX_REQ_PROCESS_TIME))
        {
          max_req_process_time_ = value;
        }
        else if (0 == strcmp(name,  OBMS_MEMORY_SIZE_LIMIT_PERCENT))
        {
          memory_size_limit_ = value * (sysconf(_SC_PHYS_PAGES)*sysconf(_SC_PAGE_SIZE)) / 100;
        }
        else if (0 == strcmp(name, OBMS_MAX_CS_TIMEOUT_PERCENT))
        {
          max_cs_timeout_percent_ = static_cast<double>(value) / 100.0f;
        }
        else if (0 == strcmp(name,  OBMS_ALLOW_RETURN_UNCOMPLETE_RESULT))
        {
          allow_return_uncomplete_result_ = static_cast<int32_t>(value);
        }
        else if (0 == strcmp(name,  OBMS_MAX_PARELLEL_COUNT))
        {
          max_parellel_count_ = value;
        }
        else if (0 == strcmp(name,  OBMS_MAX_GET_ROWS_PER_SUBREQ))
        {
          max_get_rows_per_subreq_ = value;
        }
        else if (0 == strcmp(name,  OBMS_GET_REQUEST_FACTOR))
        {
          get_request_factor_ = value;
        }
        else if (0 == strcmp(name,  OBMS_SCAN_REQUEST_FACTOR))
        {
          scan_request_factor_ = value;
        }
        else if (0 == strcmp(name,  OBMS_SLOW_QUERY_THRESHOLD))
        {
          slow_query_threshold_ = value;
        }
        else
        {
          TBSYS_LOG(ERROR, "unexpected config item name. name=%s", name);
          ret = OB_ERROR;
        }
      }
      return ret;
    }
Пример #21
0
int ObTabletJoin::get_next_row(const ObRow *&row)
{
  int ret = OB_SUCCESS;
  ObString rowkey;
  ObString value;
  ObRow tmp_row;
  ObUpsRow tmp_ups_row;

  tmp_row.set_row_desc(curr_row_desc_);
  tmp_ups_row.set_row_desc(ups_row_desc_);

  ObGetParam *get_param = NULL;
  uint64_t right_table_id = OB_INVALID_ID;

  if(NULL == (get_param = GET_TSI_MULT(ObGetParam, common::TSI_SQL_GET_PARAM_1)))
  {
    ret = OB_ALLOCATE_MEMORY_FAILED;
    TBSYS_LOG(WARN, "get tsi get_param fail:ret[%d]", ret);
  }
  else
  {
    get_param->reset(true);
  }

  bool row_valid = false;

  if(OB_SUCCESS == ret)
  {
    ret = fused_row_store_.get_next_row(tmp_row);
    /* 如果fused cache里面的行已经使用完 */
    if(OB_ITER_END == ret)
    {
      fused_row_store_.clear();
      if(OB_SUCCESS != (ret = fetch_fused_row(get_param)))
      {
        if(OB_ITER_END != ret)
        {
          TBSYS_LOG(WARN, "fetch_fused_row fail :ret[%d]", ret);
        }
      }
      else if(OB_SUCCESS != (ret = fetch_ups_row(get_param)))
      {
        TBSYS_LOG(WARN, "fetch_ups_row fail:ret[%d]", ret);
      }
    }
    else if(OB_SUCCESS == ret)
    {
      row_valid = true;
    }
    else
    {
      TBSYS_LOG(WARN, "fused row store next row fail:ret[%d]", ret);
    }
  }

  if(OB_SUCCESS == ret)
  {
    if(!row_valid)
    {
      ret = fused_row_store_.get_next_row(tmp_row);
      if(OB_SUCCESS != ret || OB_ITER_END == ret)
      {
        TBSYS_LOG(WARN, "fused row store next row fail:ret[%d]", ret);
      }
    }

    if(OB_SUCCESS == ret)
    {
      if(OB_SUCCESS != (ret = get_right_table_rowkey(tmp_row, right_table_id, rowkey)))
      {
        TBSYS_LOG(WARN, "get rowkey from tmp_row fail:ret[%d]", ret);
      }
    }

    if(OB_SUCCESS == ret)
    {
      ret = ups_row_cache_.get(rowkey, value);
      if(OB_SUCCESS == ret)
      {
        if(OB_SUCCESS != (ret = ObUpsRowUtil::convert(right_table_id, value, tmp_ups_row)))
        {
          TBSYS_LOG(WARN, "convert to ups row fail:ret[%d]", ret);
        }
        else
        {
          tmp_ups_row.set_row_desc(ups_row_desc_for_join_);
          if(OB_SUCCESS != (ret = ObRowFuse::fuse_row(&tmp_ups_row, &tmp_row, &curr_row_)))
          {
            TBSYS_LOG(WARN, "fused ups row to row fail:ret[%d]", ret);
          }
          else
          {
            row = &curr_row_;
          }
        }
      }
      else if(OB_ENTRY_NOT_EXIST == ret)
      {
        curr_row_.assign(tmp_row);
        row = &curr_row_;
        ret = OB_SUCCESS;
      }
      else
      {
        TBSYS_LOG(WARN, "ups_row_cache_ get fail:ret[%d] rowkey[%.*s]", ret, rowkey.length(), rowkey.ptr());
      }
    }
  }

  return ret;
}
Пример #22
0
 int DES_crypt::des_encrypt(const ObString &user_name, const int64_t timestamp, const int64_t skey, char *buffer, int64_t &buffer_length)
 {
   int err = OB_SUCCESS;
   if(buffer_length <= (int64_t)(sizeof(int64_t) + 2 * sizeof(int32_t) + user_name.length()) || buffer_length % 8 != 0)
   {
     err = OB_INVALID_ARGUMENT;
     TBSYS_LOG(WARN, "invalid argument. buffer_length = %ld, should be 80", buffer_length);
   }
   if(OB_SUCCESS == err)
   {
     if(user_name.length() == 0)
     {
       err = OB_INVALID_ARGUMENT;
       TBSYS_LOG(WARN, "user_name should not be null. user_name.length=%d", user_name.length());
     }
   }
   if(OB_SUCCESS == err)
   {
     data_.initialized = 0;
     err = stringTobyte(keybyte_, OB_ENRYPT_KEY_BYTE, reinterpret_cast<const char*>(&skey), sizeof(int64_t));
     if(err != OB_SUCCESS)
     {
       TBSYS_LOG(WARN, "fail to stringTobyte. err=%d", err);
     }
     else
     {
       setkey_r(keybyte_, &data_);
     }
   }
   int64_t length = 0;
   if(OB_SUCCESS == err)
   {
     length = 2 * sizeof(int32_t)  + sizeof(int64_t) + user_name.length();
     original_txt_length_ = static_cast<int32_t>(length);
     err = pad(txtptr_, OB_MAX_TOKEN_BUFFER_LENGTH, length);
     if(OB_SUCCESS != err)
     {
       TBSYS_LOG(WARN, "fail to pad array. err=%d", err);
     }
   }
   int64_t pos = 0;
   if(OB_SUCCESS == err)
   {
     *(reinterpret_cast<int32_t*>(txtptr_ + pos)) = OB_CRYPT_MAGIC_NUM;
     pos += sizeof(int32_t);
     *(reinterpret_cast<int32_t*>(txtptr_ + pos)) = user_name.length();
     pos += sizeof(int32_t);
     memcpy(txtptr_ + pos, user_name.ptr(), user_name.length());
     pos += user_name.length();
     *(reinterpret_cast<int64_t*>(txtptr_ + pos)) = timestamp;
     pos += sizeof(int64_t);       
   }
   if(OB_SUCCESS == err)
   {
     err = stringTobyte(txtbyte_, OB_ENCRYPT_TXT_BYTE, txtptr_, length);
     if(err != OB_SUCCESS)
     {
       TBSYS_LOG(WARN, "fail to translate string to byte.err=%d", err);
     }
   }  
   if(OB_SUCCESS == err)
   {
     length = length * OB_BYTE_NUM;
     char *ptr = txtbyte_;
     for(int64_t i = 0; i < length; i += OB_CRYPT_UNIT)
     {
       ptr = &txtbyte_[i];
       encrypt_r(ptr, ENCODE_FLAG, &data_);
     }
   }
   if(OB_SUCCESS == err)
   {
     err = byteTostring(buffer, buffer_length, txtbyte_, length);
     if(err != OB_SUCCESS)
     {
       TBSYS_LOG(WARN, "fail to translate to string.err=%d", err);
     }
     else
     {
       buffer_length = length / OB_BYTE_NUM;
     }
   }  
   return err;
 }
Пример #23
0
 const char *print_obj(const ObObj &obj)
 {
   static const int64_t BUFFER_SIZE = 128 * 1024;
   static __thread char buffers[2][BUFFER_SIZE];
   static __thread int64_t i = 0;
   char *buffer = buffers[i++ % 2];
   buffer[0] = '\0';
   switch (obj.get_type())
   {
     case ObNullType:
       snprintf(buffer, BUFFER_SIZE, "obj_type=null");
       break;
     case ObIntType:
       {
         bool is_add = false;
         int64_t tmp = 0;
         obj.get_int(tmp, is_add);
         snprintf(buffer, BUFFER_SIZE, "obj_type=int value=%ld is_add=%s", tmp, STR_BOOL(is_add));
       }
       break;
     case ObDateTimeType:
       {
         bool is_add = false;
         ObDateTime tmp = 0;
         obj.get_datetime(tmp, is_add);
         snprintf(buffer, BUFFER_SIZE, "obj_type=data_time value=%s is_add=%s", time2str(tmp), STR_BOOL(is_add));
       }
       break;
     case ObPreciseDateTimeType:
       {
         bool is_add = false;
         ObDateTime tmp = 0;
         obj.get_precise_datetime(tmp, is_add);
         snprintf(buffer, BUFFER_SIZE, "obj_type=precise_data_time value=%s is_add=%s", time2str(tmp), STR_BOOL(is_add));
       }
       break;
     case ObVarcharType:
       {
         ObString tmp;
         obj.get_varchar(tmp);
         if (NULL != tmp.ptr()
             && 0 != tmp.length()
             && !str_isprint(tmp.ptr(), tmp.length()))
         {
           char hex_buffer[BUFFER_SIZE] = {'\0'};
           common::hex_to_str(tmp.ptr(), tmp.length(), hex_buffer, BUFFER_SIZE);
           snprintf(buffer, BUFFER_SIZE, "obj_type=var_char value=[0x %s] value_ptr=%p value_length=%d",
                   hex_buffer, tmp.ptr(), tmp.length());
         }
         else
         {
           snprintf(buffer, BUFFER_SIZE, "obj_type=var_char value=[%.*s] value_ptr=%p value_length=%d",
                   tmp.length(), tmp.ptr(), tmp.ptr(), tmp.length());
         }
       }
       break;
     case ObSeqType:
       snprintf(buffer, BUFFER_SIZE, "obj_type=seq");
       break;
     case ObCreateTimeType:
       {
         ObCreateTime tmp = 0;
         obj.get_createtime(tmp);
         snprintf(buffer, BUFFER_SIZE, "obj_type=create_time value=%s", time2str(tmp));
       }
       break;
     case ObModifyTimeType:
       {
         ObModifyTime tmp = 0;
         obj.get_modifytime(tmp);
         snprintf(buffer, BUFFER_SIZE, "obj_type=modify_time value=%s", time2str(tmp));
       }
       break;
     case ObExtendType:
       {
         int64_t tmp = 0;
         obj.get_ext(tmp);
         snprintf(buffer, BUFFER_SIZE, "obj_type=extend value=%ld", tmp);
       }
       break;
     default:
       break;
   }
   return buffer;
 }
Пример #24
0
 ObPermInfoKey::ObPermInfoKey(const uint64_t table_id, ObString& user_name) : table_id_(table_id),
                                                                              user_name_(user_name.ptr()),
                                                                              length_(user_name.length()),
                                                                              buffer_(NULL)
 {
 }
Пример #25
0
 ObUserInfoKey::ObUserInfoKey(ObString& user_name) : user_name_(user_name.ptr()),
                                                     length_(user_name.length()),
                                                     buffer_(NULL)
 {
 }
Пример #26
0
// waring:all return cell in a row must be same as root table's columns,
//        and the second row is this row allocated chunkserver list
int ObMergerRootRpcProxy::scan_root_table(ObMergerTabletLocationCache * cache, 
    const uint64_t table_id, const ObString & row_key, const ObServer & addr,
    ObMergerTabletLocationList & location)
{
  assert(location.get_buffer() != NULL);
  int ret = OB_SUCCESS;
  bool find_right_tablet = false;
  ObScanner scanner;
  // root table id = 0
  ret = rpc_stub_->fetch_tablet_location(rpc_timeout_, root_server_, 0,
      table_id, row_key, scanner);
  if (ret != OB_SUCCESS)
  {
    TBSYS_LOG(WARN, "fetch tablet location failed:table_id[%lu], length[%d], ret[%d]",
        table_id, row_key.length(), ret);
    hex_dump(row_key.ptr(), row_key.length(), true);
  }
  else
  {
    ObRange range;
    range.border_flag_.unset_inclusive_start();
    range.border_flag_.set_inclusive_end();
    ObString start_key;
    ObString end_key; 
    ObServer server;
    ObCellInfo * cell = NULL;
    bool row_change = false;
    ObScannerIterator iter = scanner.begin();
    TBSYS_LOG(DEBUG, "%s", "parse scanner result for get some tablet locations");
    // all return cell in a row must be same as root table's columns
    ++iter;
    while ((iter != scanner.end()) 
        && (OB_SUCCESS == (ret = iter.get_cell(&cell, &row_change))) && !row_change)
    {
      if (NULL == cell)
      {
        ret = OB_INNER_STAT_ERROR;
        break;
      }
      start_key.assign(cell->row_key_.ptr(), cell->row_key_.length());
      ++iter;
    }

    if (ret == OB_SUCCESS)
    {
      int64_t ip = 0;
      int64_t port = 0;
      bool second_row = true;
      // next cell
      ObMergerTabletLocationList list;
      for (++iter; iter != scanner.end(); ++iter)
      {
        ret = iter.get_cell(&cell, &row_change);
        if (ret != OB_SUCCESS)
        {
          TBSYS_LOG(ERROR, "get cell from scanner iterator failed:ret[%d]", ret);
          break;
        }
        else if (row_change) // && (iter != last_iter))
        {
          range.table_id_ = table_id;
          if (NULL == start_key.ptr())
          {
            range.border_flag_.set_min_value();
          }
          else
          {
            range.border_flag_.unset_min_value();
            range.start_key_ = start_key;
          }
          range.border_flag_.unset_max_value();
          range.end_key_ = end_key;
          start_key = end_key;
          end_key.assign(cell->row_key_.ptr(), cell->row_key_.length());
          list.set_timestamp(tbsys::CTimeUtil::getTime()); 
          list.sort(addr);
          // not deep copy the range
          list.set_tablet_range(range);
          // the second row is this row allocated chunkserver list
          if (second_row)
          {
            second_row = false;
            if ((row_key <= range.end_key_) && (row_key > range.start_key_))
            {
              find_right_tablet = true;
              location = list;
              assert(location.get_buffer() != NULL);
              location.set_tablet_range(range);
            }
            else
            {
              ret = OB_DATA_NOT_SERVE;
              TBSYS_LOG(ERROR, "check range not include this key:ret[%d]", ret);
              hex_dump(row_key.ptr(), row_key.length());
              range.hex_dump();
              break;
            }
          }
          // add to cache
          if (OB_SUCCESS != cache->set(range, list))
          {
            TBSYS_LOG(WARN, "%s", "add the range to cache failed");
          }
          list.clear();
        }
        else
        {
          end_key.assign(cell->row_key_.ptr(), cell->row_key_.length());
          if ((cell->column_name_.compare("1_port") == 0) 
              || (cell->column_name_.compare("2_port") == 0) 
              || (cell->column_name_.compare("3_port") == 0))
          {
            ret = cell->value_.get_int(port);
          }
          else if ((cell->column_name_.compare("1_ipv4") == 0)
              || (cell->column_name_.compare("2_ipv4") == 0)
              || (cell->column_name_.compare("3_ipv4") == 0))
          {
            ret = cell->value_.get_int(ip);
            if (OB_SUCCESS == ret)
            {
              if (port == 0)
              {
                TBSYS_LOG(WARN, "check port failed:ip[%ld], port[%ld]", ip, port);
              }
              server.set_ipv4_addr(static_cast<int32_t>(ip), static_cast<int32_t>(port));
              ObTabletLocation addr(0, server);
              if (OB_SUCCESS != (ret = list.add(addr)))
              {
                TBSYS_LOG(ERROR, "add addr failed:ip[%ld], port[%ld], ret[%d]", 
                    ip, port, ret);
                break;
              }
              else
              {
                TBSYS_LOG(DEBUG, "add addr succ:ip[%ld], port[%ld]", ip, port);
              }
              ip = port = 0;
            }
          }

          if (ret != OB_SUCCESS)
          {
            TBSYS_LOG(ERROR, "check get value failed:ret[%d]", ret);
            break;
          }
        }
      }

      // for the last row 
      if ((OB_SUCCESS == ret) && (start_key != end_key))
      {
        range.table_id_ = table_id;
        if (NULL == start_key.ptr())
        {
          range.border_flag_.set_min_value();
        }
        else
        {
          range.border_flag_.unset_min_value();
          range.start_key_ = start_key;
        }
        range.border_flag_.unset_max_value();
        range.end_key_ = end_key;
        list.set_timestamp(tbsys::CTimeUtil::getTime());
        // not deep copy the range
        list.set_tablet_range(range);
        list.sort(addr);
        // double check add all range->locationlist to cache
        if ((row_key <= range.end_key_) && (row_key > range.start_key_))
        {
          find_right_tablet = true;
          location = list;
          // deep copy range
          assert(location.get_buffer() != NULL);
          location.set_tablet_range(range);
        }
        else if (second_row)
        {
          range.hex_dump();
          ret = OB_DATA_NOT_SERVE;
          TBSYS_LOG(ERROR, "check range not include this key:ret[%d]", ret);
        }
        // add to list to cache
        if (OB_SUCCESS != cache->set(range, list))
        {
          range.hex_dump();
          TBSYS_LOG(WARN, "%s", "add the range to cache failed");
        }
      }
    }
    else
    {
      TBSYS_LOG(ERROR, "check get first row cell failed:ret[%d]", ret);
    }
  }

  if ((OB_SUCCESS == ret) && (0 == location.size()))
  {
    TBSYS_LOG(ERROR, "check get location size failed:table_id[%ld], find[%d], count[%ld]",
        table_id, find_right_tablet, location.size());
    hex_dump(row_key.ptr(), row_key.length());
    ret = OB_INNER_STAT_ERROR;
  }
  ms_get_counter_set().inc(ObMergerCounterIds::C_SCAN_ROOT_TABLE);
  return ret;
}
Пример #27
0
 ObUserInfoValue::ObUserInfoValue(ObString& password) : passwd_(password.ptr()),
                                                        length_(password.length())
 {
 }
Пример #28
0
int64_t MutatorBuilder::get_cur_seed_(const seed_map_t &seed_map, const ObSchema &schema, const ObString &row_key, const bool using_id)
{
  int64_t cur_seed = 0;
  
  TEKey te_key;
  te_key.table_id = schema.get_table_id();
  te_key.row_key = row_key;

  int hash_ret = 0;
  if (HASH_EXIST != (hash_ret = seed_map.get(te_key, cur_seed)))
  {
    ObGetParam get_param;
    ObScanner scanner;
    ObCellInfo cell_info;
    cell_info.row_key_ = row_key;
    if (using_id)
    {
      cell_info.table_id_ = schema.get_table_id();
      cell_info.column_id_ = SEED_COLUMN_ID;
    }
    else
    {
      cell_info.table_name_.assign_ptr(const_cast<char*>(schema.get_table_name()), static_cast<int32_t>(strlen(schema.get_table_name())));
      cell_info.column_name_.assign_ptr((char*)SEED_COLUMN_NAME, static_cast<int32_t>(strlen(SEED_COLUMN_NAME)));
    }
    get_param.add_cell(cell_info);
    ObVersionRange version_range;
    version_range.start_version_ = table_start_version_;
    version_range.border_flag_.set_max_value();
    version_range.border_flag_.set_inclusive_start();
    get_param.set_version_range(version_range);
    if (OB_SUCCESS == client_.get(get_param, scanner))
    {
      CellinfoBuilder::result_set_t result_set;
      MemTank mem_tank;
      while (OB_SUCCESS == scanner.next_cell())
      {
        ObCellInfo *ci = NULL;
        if (OB_SUCCESS != scanner.get_cell(&ci))
        {
          break;
        }
        if (!using_id)
        {
          ::trans_name2id(*ci, schema);
        }
        ObCellInfo *new_ci = copy_cell(mem_tank, ci);
        CellinfoBuilder::merge_obj(new_ci, result_set);
      }
      if (0 != result_set.size())
      {
        ObCellInfo *ret_ci = NULL;
        result_set.get(SEED_COLUMN_ID, ret_ci);
        if (NULL != ret_ci)
        {
          ret_ci->value_.get_int(cur_seed);
        }
        TBSYS_LOG(DEBUG, "seed get from oceanbase %s", print_cellinfo(ret_ci));
      }
    }
    else
    {
      abort();
    }
  }
  if (0 == cur_seed)
  {
    cur_seed = SEED_START;
    TBSYS_LOG(DEBUG, "first seed from cur_seed=%ld row_key=[%.*s]", cur_seed, row_key.length(), row_key.ptr());
  }
  else
  {
    cur_seed += 1;
  }
  TBSYS_LOG(DEBUG, "get cur_seed=%ld hash_ret=%d row_key=[%.*s]", cur_seed, hash_ret, row_key.length(), row_key.ptr());
  return cur_seed;
}
Пример #29
0
int ObSelectStmt::check_alias_name(
    ResultPlan& result_plan,
    const ObString& alias_name) const
{
  int& ret = result_plan.err_stat_.err_code_ = OB_SUCCESS;
  ObLogicalPlan *logical_plan = static_cast<ObLogicalPlan*>(result_plan.plan_tree_);
  ObSchemaChecker *schema_checker = static_cast<ObSchemaChecker*>(result_plan.schema_checker_);
  if (schema_checker == NULL)
  {
    ret = OB_ERR_SCHEMA_UNSET;
    snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
        "Schema(s) are not set");
  }

  for (int32_t i = 0; ret == OB_SUCCESS && i < table_items_.size(); i++)
  {
    /* check if it is column of base-table */
    TableItem& item = table_items_[i];
    if (item.type_ == TableItem::BASE_TABLE
      || item.type_ == TableItem::ALIAS_TABLE)
    {
      if (schema_checker->column_exists(item.table_name_, alias_name))
      {
        ret = OB_ERR_COLUMN_DUPLICATE;
        snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
            "alias name %.*s is ambiguous", alias_name.length(), alias_name.ptr());
        break;
      }
    }
    else if (item.type_ == TableItem::GENERATED_TABLE)
    {
      /* check if it is column of generated-table */
      ObSelectStmt* sub_query = static_cast<ObSelectStmt*>(logical_plan->get_query(item.ref_id_));
      for (int32_t j = 0; ret == OB_SUCCESS && j < sub_query->get_select_item_size(); j++)
      {
        const SelectItem& select_item = sub_query->get_select_item(j);
        if (select_item.alias_name_ == alias_name)
        {
          ret = OB_ERR_COLUMN_DUPLICATE;
          snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
              "alias name %.*s is ambiguous", alias_name.length(), alias_name.ptr());
          break;
        }
      }
    }
  }

  /* check if it is alias name of self-select */
  for (int32_t i = 0; ret == OB_SUCCESS && i < select_items_.size(); i++)
  {
    const SelectItem& select_item = get_select_item(i);
    if (select_item.alias_name_ == alias_name)
    {
      ret = OB_ERR_COLUMN_DUPLICATE;
      snprintf(result_plan.err_stat_.err_msg_, MAX_ERROR_MSG,
          "alias name %.*s is ambiguous", alias_name.length(), alias_name.ptr());
      break;
    }
  }

  return ret;
}
Пример #30
0
int RowkeyWrapper::append_rowkey_item(const ObString &key, const RowkeyItem &item,
                                      ObDataBuffer & buffer) const
{
  int ret = OB_SUCCESS;
  int type = item.type;

  switch(type) {
    case INT64:
    case INT32:
    case INT16:
      {
        int64_t value;
        int key_part_len = 8;
        char val_buf[8];

        if (type == INT16)
        {
          key_part_len = 2;
        }
        else if (type == INT32)
        {
          key_part_len = 4;
        }

        if (key.length() < (item.start_pos + item.item_len) ||
            item.item_len != key_part_len)
        {
          TBSYS_LOG(ERROR, "rowkey item config error, start_pos=%d, type=%d, key_part_len = %d",
              item.start_pos, item.type, key_part_len);
          ret = OB_ERROR;
          break;
        }

        memset(val_buf, 0, 8);
        memcpy(val_buf, key.ptr() + item.start_pos, key_part_len);
        reverse(val_buf, val_buf + key_part_len);
        memcpy(&value, val_buf, 8);

        ret = append_int64(value, buffer);
      }
      break;
    case INT8:
      {
        int8_t value;
        if (key.length() < (item.start_pos + 1) ||
            item.item_len != 1)
        {
          TBSYS_LOG(ERROR, "rowkey item config error, start_pos=%d, type=%d",
              item.start_pos, item.type);
          ret = OB_ERROR;
          break;
        }

        value = key.ptr()[item.start_pos];
        ret = append_int8(value, buffer);
        break;
      }
      break;
    case STR:
      {
        if (key.length() < item.start_pos + item.item_len)
        {
          TBSYS_LOG(ERROR, "configuration error, item.start_pos=%d, item.item_len=%d",
              item.start_pos, item.item_len);
          break;
        }

        ret = append_str(key.ptr() + item.start_pos, item.item_len, buffer);
      }
      break;
    case VSTR:
      {
        if (key.length() < item.start_pos)
        {
          TBSYS_LOG(ERROR, "configuration error, item.start_pos=%d",
              item.start_pos);
          break;
        }

        int64_t len = key.length() - item.start_pos;
        ret = append_str(key.ptr() + item.start_pos, len, buffer);
      }
      break;
    default:
      TBSYS_LOG(ERROR, "such type [%d] is not supported now", type);
      break;
  }

  return ret;
}