delimiter // DROP TABLE IF EXISTS /*table-prefix*/breakchar// CREATE TABLE /*table-prefix*/breakchar ( c VARCHAR(1) ) ENGINE=InnoDB// INSERT INTO /*table-prefix*/breakchar VALUES (' '),('.'),(';'),(','),('-'),('_'),('('),(')'),('/'),('\\')// DROP TABLE IF EXISTS keyword_query// CREATE TABLE keyword_query(location INT, querygroup INT, word VARCHAR(64))// DROP PROCEDURE IF EXISTS /*table-prefix*/parse_query_natural// CREATE PROCEDURE /*table-prefix*/parse_query_natural (query TEXT) LANGUAGE SQL DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT 'Parses a natural-language query into a table.' BEGIN DECLARE i INT DEFAULT 0; DECLARE in_quote INT DEFAULT 0; DECLARE word VARCHAR(64) DEFAULT ''; DECLARE location INT DEFAULT 1; DECLARE querygroup INT DEFAULT 1; each_letter: WHILE i < LENGTH(query) DO BEGIN DECLARE curchar VARCHAR(1); DECLARE breakchar VARCHAR(1); DECLARE done INT DEFAULT 0; DECLARE breakchar_cursor CURSOR FOR SELECT c FROM /*table-prefix*/breakchar; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; SET i = i + 1; SET curchar = SUBSTRING(query,i,1); SELECT curchar; IF curchar = '"' THEN BEGIN IF in_quote = 0 THEN SET in_quote = 1; ELSE SET in_quote = 0; END IF; ITERATE each_letter; END; END IF; OPEN breakchar_cursor; LOOP FETCH breakchar_cursor INTO breakchar; IF done = 1 THEN BEGIN /* not a break character */ CLOSE breakchar_cursor; SET word = CONCAT(word,curchar); ITERATE each_letter; END; END IF; IF curchar = breakchar THEN BEGIN CLOSE breakchar_cursor; IF LENGTH(word) > 0 THEN BEGIN INSERT INTO /*table-prefix*/keyword_query SET location=location,querygroup=querygroup,word=word; SET word = ''; SET location = location + 1; IF in_quote = 0 THEN SET querygroup = querygroup + 1; END IF; END; END IF; ITERATE each_letter; END; END IF; END LOOP; END; END WHILE; END// CALL parse_query_natural('foo bar')//