From d54c14c644448a8ad35c0b02192332acd5364e9e Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 25 Nov 2016 13:56:08 -0800 Subject: [PATCH] If InnoDB FULLTEXT is available, use it for for fulltext indexes Summary: Ref T11741. I'll wait until the release cut to land this; it just adds a test for InnoDB FULLTEXT being available instead of always returning `false`. Test Plan: - Ran with InnoDB fulltext locally for a day and a half without issues. - Ran `bin/storage upgrade`, saw it detect InnoDB fulltext. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11741 Differential Revision: https://secure.phabricator.com/D16946 --- .../document/PhabricatorSearchDocument.php | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/applications/search/storage/document/PhabricatorSearchDocument.php b/src/applications/search/storage/document/PhabricatorSearchDocument.php index aee47cb9d3..424a3ccd9b 100644 --- a/src/applications/search/storage/document/PhabricatorSearchDocument.php +++ b/src/applications/search/storage/document/PhabricatorSearchDocument.php @@ -40,15 +40,15 @@ final class PhabricatorSearchDocument extends PhabricatorSearchDAO { } public static function newQueryCompiler() { - $table = new self(); - $conn = $table->establishConnection('r'); - $compiler = new PhutilSearchQueryCompiler(); if (self::isInnoDBFulltextEngineAvailable()) { // The InnoDB fulltext boolean operators are always the same as the // default MyISAM operators, so we do not need to adjust the compiler. } else { + $table = new self(); + $conn = $table->establishConnection('r'); + $operators = queryfx_one( $conn, 'SELECT @@ft_boolean_syntax AS syntax'); @@ -61,8 +61,25 @@ final class PhabricatorSearchDocument extends PhabricatorSearchDAO { } public static function isInnoDBFulltextEngineAvailable() { - // For now, never consider this engine to be available. - return false; + static $available; + + if ($available === null) { + $table = new self(); + $conn = $table->establishConnection('r'); + + // If this system variable exists, we can use InnoDB fulltext. If it + // does not, this query will throw and we're stuck with MyISAM. + try { + queryfx_one( + $conn, + 'SELECT @@innodb_ft_max_token_size'); + $available = true; + } catch (AphrontQueryException $x) { + $available = false; + } + } + + return $available; } }