Topic on Extension talk:Replace Text

no such function "SUBSTRING" with sqlite

3
Summary by Yaron Koren

Bug was fixed.

Shouya0 (talkcontribs)

Hi, I use sqlite backend for my wiki and get this error when using this extension. Here's the error message.

[a6aca714a657d084c9540dca] /index.php/Special:ReplaceText   Wikimedia\Rdbms\DBQueryError from line 1699 of /var/www/html/includes/libs/rdbms/database/Database.php: A database query error has occurred. Did you forget to run your application's database schema updater after upgrading?
 
 Error 1: no such function: SUBSTRING
 Function: ReplaceTextSearch::doSearchQuery
 Query: SELECT  page_id,page_namespace,page_title,old_text  FROM page,revision,text,slots,content    WHERE (old_text  LIKE '%[[Category: Apartment]]%' ESCAPE '`' ) AND page_namespace IN (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,106,107,710,711,828,829,2300,2301,2302,2303)  AND (rev_id = page_latest) AND (rev_id = slot_revision_id) AND (slot_content_id = content_id) AND (CAST(SUBSTRING(content_address, 4) AS INTEGER) = old_id)  ORDER BY page_namespace, page_title LIMIT 250  
Backtrace:
#0 /var/www/html/includes/libs/rdbms/database/Database.php(1683): Wikimedia\Rdbms\Database->getQueryException(string, integer, string, string)
 #1 /var/www/html/includes/libs/rdbms/database/Database.php(1658): Wikimedia\Rdbms\Database->getQueryExceptionAndLog(string, integer, string, string)
 #2 /var/www/html/includes/libs/rdbms/database/Database.php(1227): Wikimedia\Rdbms\Database->reportQueryError(string, integer, string, string, boolean)
 #3 /var/www/html/includes/libs/rdbms/database/Database.php(1907): Wikimedia\Rdbms\Database->query(string, string, integer)
 #4 /var/www/html/includes/libs/rdbms/database/DBConnRef.php(68): Wikimedia\Rdbms\Database->select(array, array, array, string, array)
 #5 /var/www/html/includes/libs/rdbms/database/DBConnRef.php(313): Wikimedia\Rdbms\DBConnRef->__call(string, array)
 #6 /var/www/html/extensions/ReplaceText/src/ReplaceTextSearch.php(64): Wikimedia\Rdbms\DBConnRef->select(array, array, array, string, array)
 #7 /var/www/html/extensions/ReplaceText/src/SpecialReplaceText.php(303): ReplaceTextSearch::doSearchQuery(string, array, string, string, boolean)
 #8 /var/www/html/extensions/ReplaceText/src/SpecialReplaceText.php(172): SpecialReplaceText->getTitlesForEditingWithContext()
 #9 /var/www/html/extensions/ReplaceText/src/SpecialReplaceText.php(73): SpecialReplaceText->doSpecialReplaceText()
 #10 /var/www/html/includes/specialpage/SpecialPage.php(600): SpecialReplaceText->execute(NULL)
 #11 /var/www/html/includes/specialpage/SpecialPageFactory.php(635): SpecialPage->run(NULL)
 #12 /var/www/html/includes/MediaWiki.php(307): MediaWiki\SpecialPage\SpecialPageFactory->executePath(Title, RequestContext)
 #13 /var/www/html/includes/MediaWiki.php(940): MediaWiki->performRequest()
 #14 /var/www/html/includes/MediaWiki.php(543): MediaWiki->main()
 #15 /var/www/html/index.php(53): MediaWiki->run()
 #16 /var/www/html/index.php(46): wfIndexMain()
 #17 {main}

The reason is that "SUBSTRING" is not an available function in SQLite. Fortunately, I was able to fix it by replacing the line:

      'CAST(SUBSTRING(content_address, 4) AS INTEGER) = old_id'

into

      'CAST(SUBSTR(content_address, 4) AS INTEGER) = old_id'

in src/ReplaceTextSearch.php file.

It worked for me, but I hope this bug can be fixed on the upstream. Good day!

Ciencia Al Poder (talkcontribs)

You should bugreport this so devs are aware of the bug

Yaron Koren (talkcontribs)

Thanks for this suggested patch; SUBSTR() thankfully seems to work with MySQL, PostgreSQL and SQLite. I just checked in this fix.