Annotation of embedaddon/php/ext/mysqli/tests/mysqli_report.phpt, revision 1.1.1.2

1.1       misho       1: --TEST--
                      2: mysqli_report()
                      3: --SKIPIF--
                      4: <?php
                      5: require_once('skipif.inc');
                      6: require_once('skipifemb.inc');
                      7: require_once('skipifconnectfailure.inc');
                      8: ?>
                      9: --FILE--
                     10: <?php
                     11:        require_once("connect.inc");
                     12: 
                     13:        $tmp    = NULL;
                     14:        $link   = NULL;
                     15: 
                     16:        if (NULL !== ($tmp = @mysqli_report()))
                     17:                printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
                     18: 
                     19:        if (true !== ($tmp = mysqli_report(-1)))
                     20:                printf("[002] Expecting boolean/true even for invalid flags, got %s/%s\n", gettype($tmp), $tmp);
                     21: 
                     22:        if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_ERROR)))
                     23:                printf("[003] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
                     24: 
                     25:        if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_STRICT)))
                     26:                printf("[004] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
                     27: 
                     28:        if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_INDEX)))
                     29:                printf("[005] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
                     30: 
                     31:        if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_ALL)))
                     32:                printf("[007] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
                     33: 
                     34:        if (true !== ($tmp = mysqli_report(MYSQLI_REPORT_OFF)))
                     35:                printf("[008] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
                     36: 
                     37:        require('table.inc');
                     38: 
                     39:        /*
                     40:        Internal macro MYSQL_REPORT_ERROR
                     41:        */
                     42:        mysqli_report(MYSQLI_REPORT_ERROR);
                     43: 
                     44:        mysqli_multi_query($link, "BAR; FOO;");
                     45:        mysqli_query($link, "FOO");
                     46:        /* This might work if you accept anonymous users in your setup */
                     47:        mysqli_change_user($link, "0123456789-10-456789-20-456789-30-456789-40-456789-50-456789-60-456789-70-456789-80-456789-90-456789", "password", $db);
                     48:        mysqli_kill($link, -1);
                     49: 
                     50:        // mysqli_ping() cannot be tested, because one would need to cause an error inside the C function to test it
                     51:        mysqli_prepare($link, "FOO");
                     52:        mysqli_real_query($link, "FOO");
                     53:        if (@mysqli_select_db($link, "Oh lord, let this be an unknown database name"))
                     54:                printf("[009] select_db should have failed\n");
                     55:        // mysqli_store_result() and mysqli_use_result() cannot be tested, because one would need to cause an error inside the C function to test it
                     56: 
                     57: 
                     58:        // Check that none of the above would have caused any error messages if MYSQL_REPORT_ERROR would
                     59:        // not have been set. If that would be the case, the test would be broken.
                     60:        mysqli_report(MYSQLI_REPORT_OFF);
                     61: 
                     62:        mysqli_multi_query($link, "BAR; FOO;");
                     63:        mysqli_query($link, "FOO");
                     64:        mysqli_change_user($link, "This might work if you accept anonymous users in your setup", "password", $db);
                     65:        mysqli_kill($link, -1);
                     66:        mysqli_prepare($link, "FOO");
                     67:        mysqli_real_query($link, "FOO");
                     68:        mysqli_select_db($link, "Oh lord, let this be an unknown database name");
                     69: 
                     70:        /*
                     71:        Internal macro MYSQL_REPORT_STMT_ERROR
                     72:        */
                     73: 
                     74:        mysqli_report(MYSQLI_REPORT_ERROR);
                     75: 
                     76:        $stmt = mysqli_stmt_init($link);
                     77:        mysqli_stmt_prepare($stmt, "FOO");
                     78: 
                     79:        $stmt = mysqli_stmt_init($link);
                     80:        mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?");
                     81:        $id = 1;
                     82:        mysqli_kill($link, mysqli_thread_id($link));
                     83:        mysqli_stmt_bind_param($stmt, "i", $id);
                     84:        mysqli_stmt_close($stmt);
                     85:        mysqli_close($link);
                     86: 
                     87:        /* mysqli_stmt_execute() = mysql_stmt_execute cannot be tested from PHP */
                     88:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                     89:                        printf("[008] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                     90:        $stmt = mysqli_stmt_init($link);
                     91:        mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?");
                     92:        $id = 1;
                     93:        mysqli_stmt_bind_param($stmt, "i", $id);
                     94:        // mysqli_kill($link, mysqli_thread_id($link));
                     95:        mysqli_stmt_execute($stmt);
                     96:        mysqli_stmt_close($stmt);
                     97:        mysqli_close($link);
                     98: 
                     99:        /* mysqli_kill() "trick" does not work for any of the following because of an E_COMMANDS_OUT_OF_SYNC */
                    100:        /* mysqli_stmt_bind_result() = mysql_stmt_bind_result() cannot be tested from PHP */
                    101:        /* mysqli_stmt_fetch() = mysql_stmt_fetch() cannot be tested from PHP */
                    102:        /* mysqli_stmt_result_metadata() = mysql_stmt_result_metadata() cannot be tested from PHP */
                    103:        /* mysqli_stmt_store_result() = mysql_stmt_store_result() cannot be tested from PHP */
                    104: 
                    105:        // Check
                    106:        mysqli_report(MYSQLI_REPORT_OFF);
                    107: 
                    108:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                    109:                printf("[010] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                    110:        $stmt = mysqli_stmt_init($link);
                    111:        mysqli_stmt_prepare($stmt, "FOO");
                    112: 
                    113:        $stmt = mysqli_stmt_init($link);
                    114:        mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?");
                    115:        $id = 1;
                    116:        mysqli_kill($link, mysqli_thread_id($link));
                    117:        mysqli_stmt_bind_param($stmt, "i", $id);
                    118:        mysqli_stmt_close($stmt);
                    119:        mysqli_close($link);
                    120: 
                    121:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                    122:                printf("[011] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                    123:        $stmt = mysqli_stmt_init($link);
                    124:        mysqli_stmt_prepare($stmt, "SELECT id FROM test WHERE id > ?");
                    125:        $id = 1;
                    126:        mysqli_stmt_bind_param($stmt, "i", $id);
                    127:        mysqli_kill($link, mysqli_thread_id($link));
                    128:        mysqli_stmt_execute($stmt);
                    129:        mysqli_stmt_close($stmt);
                    130:        mysqli_close($link);
                    131: 
                    132:        /*
                    133:        MYSQLI_REPORT_STRICT
                    134: 
                    135:        MYSQLI_REPORT_STRICT --->
                    136:        php_mysqli_report_error() ->
                    137:                MYSQLI_REPORT_MYSQL_ERROR,
                    138:                MYSQLI_REPORT_STMT_ERROR ->
                    139:                        already tested
                    140: 
                    141:        php_mysqli_throw_sql_exception() ->
                    142:                my_mysqli_real_connect()
                    143:                my_mysqli_connect()
                    144: 
                    145:        can't be tested: mysqli_query() via mysql_use_result()/mysql_store_result()
                    146:        */
                    147:        mysqli_report(MYSQLI_REPORT_OFF);
                    148:        mysqli_report(MYSQLI_REPORT_STRICT);
                    149: 
                    150:        try {
                    151: 
                    152:                if ($link = my_mysqli_connect($host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket))
                    153:                        printf("[012] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n",
                    154:                                $host, $user . 'unknown_really', $db, $port, $socket);
                    155:                mysqli_close($link);
                    156: 
                    157:        } catch (mysqli_sql_exception $e) {
                    158:                printf("[013] %s\n", $e->getMessage());
                    159:        }
                    160: 
                    161:        try {
                    162:                if (!$link = mysqli_init())
                    163:                        printf("[014] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                    164: 
                    165:                if ($link = my_mysqli_real_connect($link, $host, $user . 'unknown_really', $passwd . 'non_empty', $db, $port, $socket))
                    166:                        printf("[015] Can connect to the server using host=%s, user=%s, passwd=***non_empty, dbname=%s, port=%s, socket=%s\n",
                    167:                                $host, $user . 'unknown_really', $db, $port, $socket);
                    168:                mysqli_close($link);
                    169:        } catch (mysqli_sql_exception $e) {
                    170:                printf("[016] %s\n", $e->getMessage());
                    171:        }
                    172: 
                    173:        /*
                    174:        MYSQLI_REPORT_INDEX --->
                    175:        mysqli_query()
                    176:        mysqli_stmt_execute()
                    177:        mysqli_prepare()
                    178:        mysqli_real_query()
                    179:        mysqli_store_result()
                    180:        mysqli_use_result()
                    181: 
                    182:        No test, because of to many prerequisites:
                    183:                - Server needs to be started with and
                    184:                        --log-slow-queries --log-queries-not-using-indexes
                    185:                - query must cause the warning on all MySQL versions
                    186: 
                    187:        TODO:
                    188:        */
                    189:        $log_slow_queries = false;
                    190:        $log_queries_not_using_indexes = false;
                    191:        mysqli_report(MYSQLI_REPORT_OFF);
                    192:        mysqli_report(MYSQLI_REPORT_INDEX);
                    193: 
                    194:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                    195:                printf("[017] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                    196: 
1.1.1.2 ! misho     197:        if (mysqli_get_server_version($link) <= 50600) {
        !           198:                // this might cause a warning - no index used
        !           199:                if (!$res = @mysqli_query($link, "SHOW VARIABLES LIKE 'log_slow_queries'"))
        !           200:                        printf("[018] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
1.1       misho     201: 
1.1.1.2 ! misho     202:                if (!$row = mysqli_fetch_assoc($res))
        !           203:                        printf("[019] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
1.1       misho     204: 
1.1.1.2 ! misho     205:                $log_slow_query = ('ON' == $row['Value']);
1.1       misho     206: 
1.1.1.2 ! misho     207:                if (mysqli_get_server_version($link) >= 50111) {
        !           208:                        // this might cause a warning - no index used
        !           209:                        if (!$res = @mysqli_query($link, "SHOW VARIABLES LIKE 'log_queries_not_using_indexes'"))
        !           210:                                printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
1.1       misho     211: 
1.1.1.2 ! misho     212:                        if (!$row = mysqli_fetch_assoc($res))
        !           213:                                printf("[021] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
1.1       misho     214: 
1.1.1.2 ! misho     215:                        $log_queries_not_using_indexes = ('ON' == $row['Value']);
1.1       misho     216: 
1.1.1.2 ! misho     217:                        if ($log_slow_queries && $log_queries_not_using_indexes) {
1.1       misho     218: 
1.1.1.2 ! misho     219:                                for ($i = 100; $i < 20000; $i++) {
        !           220:                                        if (!mysqli_query($link, "INSERT INTO test(id, label) VALUES ($i, 'z')"))
        !           221:                                                printf("[022 - %d] [%d] %s\n", $i - 99, mysqli_errno($link), mysqli_error($link));
        !           222:                                }
1.1       misho     223: 
1.1.1.2 ! misho     224:                                // this might cause a warning - no index used
        !           225:                                if (!$res = @mysqli_query($link, "SELECT id, label FROM test WHERE id = 1323"))
        !           226:                                        printf("[023] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
1.1       misho     227: 
1.1.1.2 ! misho     228:                                mysqli_free_result($res);
        !           229:                        }
1.1       misho     230:                }
                    231:        }
                    232: 
                    233:        // Maybe we've provoked an index message, maybe not.
                    234:        // All we can do is make a few dummy calls to ensure that all codes gets executed which
                    235:        // checks the flag. Functions to check: mysqli_query() - done above,
                    236:        // mysqli_stmt_execute(), mysqli_prepare(), mysqli_real_query(), mysqli_store_result()
                    237:        // mysqli_use_result(), mysqli_thread_safe(), mysqli_thread_id()
                    238:        mysqli_report(MYSQLI_REPORT_OFF);
                    239:        mysqli_close($link);
                    240:        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                    241:                printf("[024] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
                    242: 
                    243:        if (!$stmt = mysqli_stmt_init($link))
                    244:                printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    245: 
                    246:        if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test'))
                    247:                printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
                    248: 
                    249:        if (!mysqli_stmt_execute($stmt))
                    250:                printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
                    251: 
                    252:        mysqli_stmt_close($stmt);
                    253: 
                    254:        if (!mysqli_real_query($link, 'SELECT label, id FROM test'))
                    255:                printf("[028] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    256: 
                    257:        if (!$res = mysqli_use_result($link))
                    258:                printf("[029] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    259: 
                    260:        mysqli_free_result($res);
                    261: 
                    262:        if (!mysqli_real_query($link, 'SELECT label, id FROM test'))
                    263:                printf("[030]  [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    264: 
                    265:        if (!$res = mysqli_store_result($link))
                    266:                printf("[031]  [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    267: 
                    268:        mysqli_free_result($res);
                    269: 
                    270:        if (!$stmt = mysqli_prepare($link, 'SELECT id * 3 FROM test'))
                    271:                printf("[032] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    272:        else
                    273:                mysqli_stmt_close($stmt);
                    274: 
                    275:        if (!mysqli_query($link, "INSERT INTO test(id, label) VALUES (100, 'z')", MYSQLI_USE_RESULT) ||
                    276:                        !mysqli_query($link, 'DELETE FROM test WHERE id > 50', MYSQLI_USE_RESULT))
                    277:                printf("[033] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
                    278: 
                    279:        $tmp = mysqli_thread_safe($link);
                    280:        $tmp = mysqli_thread_id($link);
                    281: 
                    282:        mysqli_close($link);
                    283:        print "done!";
                    284: ?>
                    285: --CLEAN--
                    286: <?php
                    287:        require_once("clean_table.inc");
                    288: ?>
                    289: --EXPECTF--
                    290: Warning: mysqli_multi_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BAR; FOO' at line 1 in %s on line %d
                    291: 
                    292: Warning: mysqli_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOO' at line 1 in %s on line %d
                    293: 
                    294: Warning: mysqli_change_user(): (%d/%d): Access denied for user '%s'@'%s' (using password: %s) in %s on line %d
                    295: 
                    296: Warning: mysqli_kill(): processid should have positive value in %s on line %d
                    297: 
                    298: Warning: mysqli_prepare(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOO' at line 1 in %s on line %d
                    299: 
                    300: Warning: mysqli_real_query(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOO' at line 1 in %s on line %d
                    301: 
                    302: Warning: mysqli_kill(): processid should have positive value in %s on line %d
                    303: 
                    304: Warning: mysqli_stmt_prepare(): (%d/%d): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOO' at line 1 in %s on line %d
                    305: [013] Access denied for user '%s'@'%s' (using password: YES)
                    306: [016] Access denied for user '%s'@'%s' (using password: YES)
                    307: done!

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>