<?
    // Sample script to illustrate MySQL hangs on fulltext search when query is in wrong encoding
    // (C) 2009 Serguei I. Ivantsov aka ManOwaR Linux Lover

    // Constants (fill in with appropriate values)

    $my_user = 'root';
    $my_pass = '';
    $my_host = '127.0.0.1:3350';
    $my_db = 'test';
    
    // Queries used
    
	$set_names_query = 'SET NAMES utf8';
	
    $drop_table_query = 'DROP TABLE IF EXISTS test_messages';
    
    $make_table_query = 'CREATE TABLE test_messages ' .
	'(ms_id int(11) NOT NULL auto_increment, ms_text text NOT NULL, ' .
	'PRIMARY KEY (ms_id), FULLTEXT KEY k_ms_text (ms_text)) ' .
	'ENGINE=MyISAM DEFAULT CHARSET=utf8';
	
    $fill_table_query = 'INSERT INTO test_messages (ms_text) VALUES ("Peter loves Masha"),("Masha loves Vova"),("Vova loves Peter"),("Andrey ' . iconv( 'Windows-1251' , 'utf-8' , 'любит' ) . ' Sveta"),' .
	'("Петя любит чай")';
    
    $good_query = 'SELECT * FROM test_messages WHERE MATCH (ms_text) AGAINST ("+loves" IN BOOLEAN MODE)';
    
    // Note: bad query contains the search keyword in CP1251 encoding
    // After executing we have a 100% MySQL hang on 5.0.XX versions
    // The process infinite waits in 'FULLTEXT initialization' state
    
    $bad_query = "select `ms_id` FROM test_messages WHERE MATCH (`ms_text`) AGAINST ('+6070 +инструкция +mp3 +василий +колотушка +6600' IN BOOLEAN MODE)";
    
    // Connecting to MySQL
    $my_link = mysql_connect( $my_host, $my_user, $my_pass );
    if ( ! $my_link )
	die( 'Could not connect: ' . mysql_error() );    
    
    // Selecting DB
    $db_sel = mysql_select_db( $my_db , $my_link );
    if ( ! $db_sel )
	die ( 'Can\'t select DB : ' . mysql_error() );
	
	// Set names
    $res = mysql_query( $set_names_query , $my_link );
    if ( ! $res )
        die( 'Invalid set names query: ' . mysql_error() );
    
	// Dropping table
    $res = mysql_query( $drop_table_query , $my_link );
    if ( ! $res )
        die( 'Invalid drop query: ' . mysql_error() );
    
    // Creating table
    $res = mysql_query( $make_table_query , $my_link );
    if ( ! $res )
        die( 'Invalid make query: ' . mysql_error() );
    
    // Filling table
    $res = mysql_query( $fill_table_query , $my_link );
    if ( ! $res )
        die( 'Invalid fill query: ' . mysql_error() );
    
    // Quering database with a good query
	
    $res = mysql_query( $good_query , $my_link );
    if ( ! $res )
        die( 'Invalid good query: ' . mysql_error() );
        
    while ( $row = mysql_fetch_array( $res , MYSQL_NUM ) )
	printf( "ID: %s, Name: '%s'\n", $row[0], $row[1] );  
    
    mysql_free_result( $res );        
        
    // Quering database with a bad query        
    
    $res = mysql_query( $bad_query , $my_link );
    if ( ! $res )
        die( 'Invalid bad query: ' . mysql_error() );
        
    while ( $row = mysql_fetch_array( $res , MYSQL_NUM ) )
	printf( "ID: %s, Name: '%s'\n", $row[0], $row[1] );  
    
    mysql_free_result( $res );        

    // Disconnecting from MySQL
    mysql_close( $my_link );    
?>
