diff --git a/libmariadb/mariadb_dyncol.c b/libmariadb/mariadb_dyncol.c index 01e0ba15..96f9a0fa 100644 --- a/libmariadb/mariadb_dyncol.c +++ b/libmariadb/mariadb_dyncol.c @@ -332,7 +332,7 @@ static my_bool type_and_offset_store_num(uchar *place, size_t offset_size, { ulong val = (((ulong) offset) << 3) | (type - 1); DBUG_ASSERT(type != DYN_COL_NULL); - DBUG_ASSERT(((type - 1) & (~0xf)) == 0); /* fit in 4 bits */ + DBUG_ASSERT(((type - 1) & (~7)) == 0); /* fit in 3 bits */ DBUG_ASSERT(offset_size >= 1 && offset_size <= 4); /* Index entry starts with column number; jump over it */ diff --git a/unittest/libmariadb/dyncol.c b/unittest/libmariadb/dyncol.c index 47ce313b..8fe0acb9 100644 --- a/unittest/libmariadb/dyncol.c +++ b/unittest/libmariadb/dyncol.c @@ -56,42 +56,6 @@ static int create_dyncol_named(MYSQL *mysql) mariadb_dyncol_init(&dyncol); rc= mariadb_dyncol_create_many_named(&dyncol, column_count, keys1, vals, 0); FAIL_IF(mariadb_dyncol_create_many_named(&dyncol, column_count, keys1, vals, 1) < 0, "Error"); - if (1) { - DYNAMIC_COLUMN foo, bar; - MYSQL_BIND bind; - MYSQL_STMT *stmt= mysql_stmt_init(mysql); - DYNAMIC_COLUMN_VALUE val; - MYSQL_LEX_STRING keys[]= {{(char *)"TEST", 4}}; - MYSQL_LEX_STRING keys2[]= {{(char *)"PyTuple", 7}}; - rc= mysql_query(mysql, "CREATE OR REPLACE TABLE dyn1 (a blob)"); - check_mysql_rc(rc, mysql); - rc= mysql_stmt_prepare(stmt, SL("INSERT INTO dyn1 VALUES (?)")); - check_stmt_rc(rc, stmt); - memset(&bind, 0, sizeof(MYSQL_BIND)); - mariadb_dyncol_init(&foo); - mariadb_dyncol_init(&bar); - memset(&val, 0, sizeof(DYNAMIC_COLUMN_VALUE)); - val.type= DYN_COL_DYNCOL; - val.x.string.value.str= dyncol.str; - val.x.string.value.length= dyncol.length; - if (mariadb_dyncol_create_many_named(&bar, 1, keys2, &val, 0) != ER_DYNCOL_OK) - val.type= DYN_COL_DYNCOL; - val.x.string.value.str= bar.str; - val.x.string.value.length= bar.length; - diag("l1: %lld\n", bar.length); - if (mariadb_dyncol_create_many_named(&foo, 1, keys2, &val, 0) != ER_DYNCOL_OK) - printf("Error\n"); - diag("l2: %lld\n", foo.length); - bind.buffer_type= MYSQL_TYPE_BLOB; - bind.buffer= (void *)foo.str; - bind.buffer_length= foo.length; - mysql_stmt_bind_param(stmt, &bind); - rc= mysql_stmt_execute(stmt); - check_stmt_rc(rc, stmt); - diag("check: %d %d", ER_DYNCOL_OK, mariadb_dyncol_check(&dyncol)); - exit(1); - } - column_count= 0; FAIL_IF(mariadb_dyncol_column_count(&dyncol, &column_count) < 0, "Error"); @@ -289,12 +253,54 @@ static int dyncol_column_count(MYSQL *unused __attribute__((unused))) return OK; } +static int dyncol_nested(MYSQL *mysql __attribute__((unused))) +{ + DYNAMIC_COLUMN col1, col2; + DYNAMIC_COLUMN_VALUE value[2]; + MYSQL_LEX_STRING cols[2]= {{(char *)"0",1},{(char *)"1",1}}; + DYNAMIC_STRING s; + + mariadb_dyncol_init(&col1); + mariadb_dyncol_init(&col2); + + memset(&value, 0, sizeof(DYNAMIC_COLUMN_VALUE)); + + value[0].type= DYN_COL_UINT; + value[0].x.ulong_value = 17; + + mariadb_dyncol_create_many_named(&col1, 1, cols, value, 0); + if (mariadb_dyncol_check(&col1) != ER_DYNCOL_OK) + { + diag("Error while creating col1"); + return FAIL; + } + + value[1].type= DYN_COL_DYNCOL; + value[1].x.string.value.str= col1.str; + value[1].x.string.value.length= col1.length; + + mariadb_dyncol_create_many_named(&col2, 2, cols, value, 0); + if (mariadb_dyncol_check(&col2) != ER_DYNCOL_OK) + { + diag("Error while creating col1"); + return FAIL; + } + mariadb_dyncol_json(&col2, &s); + if (strcmp(s.str, "{\"0\":17,\"1\":{\"0\":17}}") != 0) + { + diag("%s != %s", s.str, "{\"0\":17,\"1\":{\"0\":17}}"); + return FAIL; + } + return OK; +} + struct my_tests_st my_tests[] = { {"mdev_x1", mdev_x1, TEST_CONNECTION_NEW, 0, NULL, NULL}, {"mdev_4994", mdev_4994, TEST_CONNECTION_NEW, 0, NULL, NULL}, {"create_dyncol_named", create_dyncol_named, TEST_CONNECTION_NEW, 0, NULL, NULL}, {"create_dyncol_num", create_dyncol_num, TEST_CONNECTION_NEW, 0, NULL, NULL}, {"dyncol_column_count", dyncol_column_count, TEST_CONNECTION_NEW, 0, NULL, NULL}, + {"dyncol_nested", dyncol_nested, TEST_CONNECTION_NEW, 0, NULL, NULL}, {NULL, NULL, 0, 0, NULL, 0} };