connectivity/source/parse/sqlnode.cxx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
New commits: commit f5a2fedaebcf71824ecef9b5e7683237646175b4 Author: Tamas Bunth <tamas.bu...@collabora.co.uk> Date: Sun Apr 8 13:34:27 2018 +0200 tdf#105075 Firebird: Support Limit of query_GUI Firebird uses "SELECT FIRST <num> ..." format to limit the number of result row numbers instead of "SELECT ... LIMIT <num>" My first approach was to improve OSQLParser and make it understand the Firebird dialect. But it is hard because the parser has hard-coded getChild(int) calls all over the code and all the indexes should be updated. Instead of this, we recognise the LIMIT keyword with the parser, remove it and push the FIRST <num> part manually right after SELECT. All of this should happen in case of Firebird and only when using the query-GUI. Change-Id: I53f3f977f77cf98b91b25a7eaa6ebb2ee8ac0951 Reviewed-on: https://gerrit.libreoffice.org/52591 Reviewed-by: Lionel Elie Mamane <lio...@mamane.lu> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/connectivity/source/parse/sqlnode.cxx b/connectivity/source/parse/sqlnode.cxx index eb4a02ca36e9..adc48a446a2e 100644 --- a/connectivity/source/parse/sqlnode.cxx +++ b/connectivity/source/parse/sqlnode.cxx @@ -347,6 +347,18 @@ bool OSQLParseNode::parseNodeToExecutableStatement( OUString& _out_rString, cons aParseParam.pParser = &_rParser; + // LIMIT keyword differs in Firebird + OSQLParseNode* pTableExp = getChild(3); + Reference< XDatabaseMetaData > xMeta( _rxConnection->getMetaData() ); + OUString sLimitValue; + if( pTableExp->getChild(6)->count() >= 2 && pTableExp->getChild(6)->getChild(1) + && (xMeta->getURL().equalsIgnoreAsciiCase("sdbc:embedded:firebird") + || xMeta->getURL().startsWithIgnoreAsciiCase("sdbc:firebird:"))) + { + sLimitValue = pTableExp->getChild(6)->getChild(1)->getTokenValue(); + pTableExp->removeAt(6); + } + _out_rString.clear(); OUStringBuffer sBuffer; bool bSuccess = false; @@ -360,6 +372,14 @@ bool OSQLParseNode::parseNodeToExecutableStatement( OUString& _out_rString, cons if ( _pErrorHolder ) *_pErrorHolder = e; } + + if(sLimitValue.getLength() > 0) + { + constexpr char SELECT_KEYWORD[] = "SELECT"; + sBuffer.insert(sBuffer.indexOf(SELECT_KEYWORD) + strlen(SELECT_KEYWORD), + " FIRST " + sLimitValue); + } + _out_rString = sBuffer.makeStringAndClear(); return bSuccess; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits