/*      query(sql)   */
static VALUE query(VALUE obj, VALUE sql)
{
    MYSQL* m = GetHandler(obj);
    Check_Type(sql, T_STRING);
    if (rb_block_given_p()) {
#if MYSQL_VERSION_ID >= 40101
        if (mysql_get_server_version(m) >= 40101 && mysql_set_server_option(m, MYSQL_OPTION_MULTI_STATEMENTS_ON) != 0)
            mysql_raise(m);
#endif
        if (mysql_real_query(m, RSTRING(sql)->ptr, RSTRING(sql)->len) != 0)
            mysql_raise(m);
        do {
            MYSQL_RES* res = mysql_store_result(m);
            if (res == NULL) {
                if (mysql_field_count(m) != 0)
                    mysql_raise(m);
            } else {
                VALUE robj = mysqlres2obj(res);
                rb_ensure(rb_yield, robj, res_free, robj);
            }
        }
#if MYSQL_VERSION_ID >= 40101
        while (mysql_next_result(m) == 0);
#else
        while (0);
#endif
        return obj;
    }
    if (mysql_real_query(m, RSTRING(sql)->ptr, RSTRING(sql)->len) != 0)
        mysql_raise(m);
    if (GetMysqlStruct(obj)->query_with_result == Qfalse)
        return obj;
    if (mysql_field_count(m) == 0)
        return Qnil;
    return store_result(obj);
}