/** * test if we decode all valid types from EXECUTE stmt */ static void t_com_stmt_execute_from_packet_invalid(void) { network_mysqld_stmt_execute_packet_t *cmd; const char raw_packet[] = "\x12\x00\x00\x00" "\x17" /* COM_STMT_EXECUTE */ "\x01\x00\x00\x00" /* stmt-id */ "\x00" /* flags */ "\x01\x00\x00\x00" /* iteration count */ "\x00" "\x01" "\x0f\x00" "\x03\x66\x6f\x6f"; network_packet packet; network_mysqld_type_t *param; int param_ndx = 0; packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; #define EXPECTED_NUM_PARAMS 1 cmd = network_mysqld_stmt_execute_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, !=, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, EXPECTED_NUM_PARAMS)); #undef EXPECTED_NUM_PARAMS network_mysqld_stmt_execute_packet_free(cmd); }
static void t_com_stmt_execute_new(void) { network_mysqld_stmt_execute_packet_t *cmd; cmd = network_mysqld_stmt_execute_packet_new(); g_assert(cmd); network_mysqld_stmt_execute_packet_free(cmd); }
/** * if there are no parameters, we don't have any nul-flags to send */ static void t_com_stmt_execute_from_packet_no_params(void) { network_mysqld_stmt_execute_packet_t *cmd; const char raw_packet[] = "\x0a\x00\x00\x00" "\x17" /* COM_STMT_EXECUTE */ "\x01\x00\x00\x00" /* stmt-id */ "\x00" /* flags */ "\x01\x00\x00\x00" /* iteration count */ ; network_packet packet; packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; cmd = network_mysqld_stmt_execute_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, 0)); g_assert_cmpint(1, ==, cmd->stmt_id); g_assert_cmpint(0, ==, cmd->flags); g_assert_cmpint(1, ==, cmd->iteration_count); network_mysqld_stmt_execute_packet_free(cmd); }
/** * get the stmt-id from the com-stmt-execute packet */ static int lua_proto_get_stmt_execute_packet (lua_State *L) { size_t packet_len; const char *packet_str = luaL_checklstring(L, 1, &packet_len); int param_count = luaL_checkint(L, 2); network_mysqld_stmt_execute_packet_t *cmd; network_packet packet; GString s; int err = 0; s.str = (char *)packet_str; s.len = packet_len; packet.data = &s; packet.offset = 0; cmd = network_mysqld_stmt_execute_packet_new(); err = err || network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, param_count); if (err) { network_mysqld_stmt_execute_packet_free(cmd); luaL_error(L, "%s: network_mysqld_proto_get_stmt_execute_packet() failed", G_STRLOC); return 0; } lua_newtable(L); LUA_EXPORT_INT(cmd, stmt_id); LUA_EXPORT_INT(cmd, flags); LUA_EXPORT_INT(cmd, iteration_count); LUA_EXPORT_BOOL(cmd, new_params_bound); if (cmd->new_params_bound) { guint i; lua_newtable(L); for (i = 0; i < cmd->params->len; i++) { network_mysqld_type_t *param = g_ptr_array_index(cmd->params, i); lua_newtable(L); lua_pushnumber(L, param->type); lua_setfield(L, -2, "type"); if (param->is_null) { lua_pushnil(L); } else { const char *const_s; char *_s; gsize s_len; guint64 _i; gboolean is_unsigned; double d; switch (param->type) { case MYSQL_TYPE_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: if (0 != network_mysqld_type_get_string_const(param, &const_s, &s_len)) { return luaL_error(L, "%s: _get_string_const() failed for type = %d", G_STRLOC, param->type); } lua_pushlstring(L, const_s, s_len); break; case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONG: case MYSQL_TYPE_LONGLONG: if (0 != network_mysqld_type_get_int(param, &_i, &is_unsigned)) { return luaL_error(L, "%s: _get_int() failed for type = %d", G_STRLOC, param->type); } lua_pushinteger(L, _i); break; case MYSQL_TYPE_DOUBLE: case MYSQL_TYPE_FLOAT: if (0 != network_mysqld_type_get_double(param, &d)) { return luaL_error(L, "%s: _get_double() failed for type = %d", G_STRLOC, param->type); } lua_pushnumber(L, d); break; case MYSQL_TYPE_DATETIME: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_DATE: case MYSQL_TYPE_TIME: _s = NULL; s_len = 0; if (0 != network_mysqld_type_get_string(param, &_s, &s_len)) { return luaL_error(L, "%s: _get_string() failed for type = %d", G_STRLOC, param->type); } lua_pushlstring(L, _s, s_len); if (NULL != _s) g_free(_s); break; default: luaL_error(L, "%s: can't decode type %d yet", G_STRLOC, param->type); /* we don't have that value yet */ break; } } lua_setfield(L, -2, "value"); lua_rawseti(L, -2, i + 1); } lua_setfield(L, -2, "params"); } network_mysqld_stmt_execute_packet_free(cmd); return 1; }
/** * test if we decode all valid types from EXECUTE stmt */ static void t_com_stmt_execute_from_packet(void) { network_mysqld_stmt_execute_packet_t *cmd; const char raw_packet[] = "\x7a\x00\x00\x00" "\x17" /* COM_STMT_EXECUTE */ "\x01\x00\x00\x00" /* stmt-id */ "\x00" /* flags */ "\x01\x00\x00\x00" /* iteration count */ "\x03\x00" /* nul-flags */ "\x01" /* yeah, we have parameters */ "\xfe\x00\x06\x00\xfe\x00\x08\x00\x08\x80\x03\x00\x02\x00\x01\x00\x05\x00\x04\x00\x0a\x00\x0c\x00\x07\x00\x0b\x00" /* param-defs */ "\x03\x66\x6f\x6f" /* the string */ "\x01\x00\x00\x00\x00\x00\x00\x00" /* int64 */ "\x01\x00\x00\x00\x00\x00\x00\x00" /* int64 (unsigned) */ "\x01\x00\x00\x00" /* int32 */ "\x01\x00" /* int16 */ "\x01" /* int8 */ "\x66\x66\x66\x66\x66\x66\x24\x40" "\x33\x33\x23\x41" "\x04\xda\x07\x0a\x11" "\x0b\xda\x07\x0a\x11\x13\x1b\x1e\x01\x00\x00\x00" "\x0b\xda\x07\x0a\x11\x13\x1b\x1e\x01\x00\x00\x00" "\x0c\x01\x78\x00\x00\x00\x13\x1b\x1e\x01\x00\x00\x00"; network_packet packet; network_mysqld_type_t *param; int param_ndx = 0; packet.data = g_string_new_len(C(raw_packet)); packet.offset = 0; #define EXPECTED_NUM_PARAMS 14 cmd = network_mysqld_stmt_execute_packet_new(); g_assert_cmpint(0, ==, network_mysqld_proto_skip_network_header(&packet)); g_assert_cmpint(0, ==, network_mysqld_proto_get_stmt_execute_packet(&packet, cmd, EXPECTED_NUM_PARAMS)); g_assert_cmpint(1, ==, cmd->stmt_id); g_assert_cmpint(0, ==, cmd->flags); g_assert_cmpint(1, ==, cmd->iteration_count); g_assert_cmpint(1, ==, cmd->new_params_bound); g_assert_cmpint(EXPECTED_NUM_PARAMS, ==, cmd->params->len); #undef EXPECTED_NUM_PARAMS /* (_STRING)NULL */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_STRING, ==, param->type); g_assert_cmpint(TRUE, ==, param->is_null); /* (_NULL) */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_NULL, ==, param->type); g_assert_cmpint(TRUE, ==, param->is_null); /* (_STRING)"foo" */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_STRING, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { const char *s; gsize s_len; g_assert_cmpint(0, ==, param->get_string_const(param, &s, &s_len)); g_assert_cmpint(s_len, ==, 3); g_assert_cmpstr(s, ==, "foo"); }; /* (_INT64)1 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_LONGLONG, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); g_assert_cmpint(FALSE, ==, param->is_unsigned); { guint64 i; gboolean is_unsigned; g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned)); g_assert_cmpint(i, ==, 1); g_assert_cmpint(is_unsigned, ==, FALSE); }; /* (_UINT64)1 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_LONGLONG, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); g_assert_cmpint(TRUE, ==, param->is_unsigned); { guint64 i; gboolean is_unsigned; g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned)); g_assert_cmpint(i, ==, 1); }; /* (_INT32)1 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_LONG, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); g_assert_cmpint(FALSE, ==, param->is_unsigned); { guint64 i; gboolean is_unsigned; g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned)); g_assert_cmpint(i, ==, 1); }; /* (_INT16)1 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_SHORT, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); g_assert_cmpint(FALSE, ==, param->is_unsigned); { guint64 i; gboolean is_unsigned; g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned)); g_assert_cmpint(i, ==, 1); }; /* (_INT8)1 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_TINY, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); g_assert_cmpint(FALSE, ==, param->is_unsigned); { guint64 i; gboolean is_unsigned; g_assert_cmpint(0, ==, param->get_int(param, &i, &is_unsigned)); g_assert_cmpint(i, ==, 1); }; /* (_DOUBLE)10.2 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_DOUBLE, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { double d; g_assert_cmpint(0, ==, param->get_double(param, &d)); g_assert_cmpfloat(d, ==, 10.2); }; /* (_FLOAT)10.2 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_FLOAT, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { double d; g_assert_cmpint(0, ==, param->get_double(param, &d)); g_assert_cmpfloat(d, ==, (float)10.2); }; /* (_DATE)2010-10-17 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_DATE, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { network_mysqld_type_date_t date; g_assert_cmpint(0, ==, param->get_date(param, &date)); g_assert_cmpint(date.year, ==, 2010); g_assert_cmpint(date.month, ==, 10); g_assert_cmpint(date.day, ==, 17); g_assert_cmpint(date.hour, ==, 0); g_assert_cmpint(date.min, ==, 0); g_assert_cmpint(date.sec, ==, 0); g_assert_cmpint(date.nsec, ==, 0); }; /* (_DATETIME)2010-10-17 19:27:30.000 010 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_DATETIME, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { network_mysqld_type_date_t date; g_assert_cmpint(0, ==, param->get_date(param, &date)); g_assert_cmpint(date.year, ==, 2010); g_assert_cmpint(date.month, ==, 10); g_assert_cmpint(date.day, ==, 17); g_assert_cmpint(date.hour, ==, 19); g_assert_cmpint(date.min, ==, 27); g_assert_cmpint(date.sec, ==, 30); g_assert_cmpint(date.nsec, ==, 1); }; /* (_TIMESTAMP)2010-10-17 19:27:30.000 010 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_TIMESTAMP, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { network_mysqld_type_date_t date; g_assert_cmpint(0, ==, param->get_date(param, &date)); g_assert_cmpint(date.year, ==, 2010); g_assert_cmpint(date.month, ==, 10); g_assert_cmpint(date.day, ==, 17); g_assert_cmpint(date.hour, ==, 19); g_assert_cmpint(date.min, ==, 27); g_assert_cmpint(date.sec, ==, 30); g_assert_cmpint(date.nsec, ==, 1); }; /* (_TIME)-120 19:27:30.000 010 */ param = g_ptr_array_index(cmd->params, param_ndx++); g_assert(param); g_assert_cmpint(MYSQL_TYPE_TIME, ==, param->type); g_assert_cmpint(FALSE, ==, param->is_null); { network_mysqld_type_time_t t; g_assert_cmpint(0, ==, param->get_time(param, &t)); g_assert_cmpint(t.sign, ==, 1); g_assert_cmpint(t.days, ==, 120); g_assert_cmpint(t.hour, ==, 19); g_assert_cmpint(t.min, ==, 27); g_assert_cmpint(t.sec, ==, 30); g_assert_cmpint(t.nsec, ==, 1); }; network_mysqld_stmt_execute_packet_free(cmd); }