summaryrefslogtreecommitdiff
path: root/connectivity/source/parse
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/parse')
-rw-r--r--connectivity/source/parse/PColumn.cxx298
-rw-r--r--connectivity/source/parse/internalnode.cxx88
-rwxr-xr-xconnectivity/source/parse/makefile.mk67
-rwxr-xr-xconnectivity/source/parse/sqlbison.y4828
-rwxr-xr-xconnectivity/source/parse/sqlflex.l836
-rw-r--r--connectivity/source/parse/sqliterator.cxx2249
-rw-r--r--connectivity/source/parse/sqlnode.cxx2838
-rw-r--r--connectivity/source/parse/wrap_sqlbison.cxx34
-rw-r--r--connectivity/source/parse/wrap_sqlflex.cxx38
9 files changed, 0 insertions, 11276 deletions
diff --git a/connectivity/source/parse/PColumn.cxx b/connectivity/source/parse/PColumn.cxx
deleted file mode 100644
index 0c1c95fa7f..0000000000
--- a/connectivity/source/parse/PColumn.cxx
+++ /dev/null
@@ -1,298 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-
-#include "connectivity/PColumn.hxx"
-#include "connectivity/dbtools.hxx"
-#include "TConnection.hxx"
-
-#include <comphelper/types.hxx>
-#include <tools/diagnose_ex.h>
-
-using namespace ::comphelper;
-using namespace connectivity;
-using namespace dbtools;
-using namespace connectivity::parse;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::sdbc;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::container;
-
-// -------------------------------------------------------------------------
-OParseColumn::OParseColumn(const Reference<XPropertySet>& _xColumn,sal_Bool _bCase)
- : connectivity::sdbcx::OColumn( getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)))
- , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))
- , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE)))
- , getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION)))
- , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE)))
- , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)))
- , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)))
- , getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))
- , getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT)))
- , sal_False
- , getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))
- , _bCase
- )
- , m_bFunction(sal_False)
- , m_bDbasePrecisionChanged(sal_False)
- , m_bAggregateFunction(sal_False)
- , m_bIsSearchable( sal_True )
-{
- construct();
-}
-
-// -------------------------------------------------------------------------
-OParseColumn::OParseColumn( const ::rtl::OUString& _Name,
- const ::rtl::OUString& _TypeName,
- const ::rtl::OUString& _DefaultValue,
- const ::rtl::OUString& _Description,
- sal_Int32 _IsNullable,
- sal_Int32 _Precision,
- sal_Int32 _Scale,
- sal_Int32 _Type,
- sal_Bool _IsAutoIncrement,
- sal_Bool _IsCurrency,
- sal_Bool _bCase
- ) : connectivity::sdbcx::OColumn(_Name,
- _TypeName,
- _DefaultValue,
- _Description,
- _IsNullable,
- _Precision,
- _Scale,
- _Type,
- _IsAutoIncrement,
- sal_False,
- _IsCurrency,
- _bCase)
- , m_bFunction(sal_False)
- , m_bDbasePrecisionChanged(sal_False)
- , m_bAggregateFunction(sal_False)
- , m_bIsSearchable( sal_True )
-{
- construct();
-}
-
-// -------------------------------------------------------------------------
-::rtl::Reference< OSQLColumns > OParseColumn::createColumnsForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
- const Reference< XDatabaseMetaData >& _rxDBMetaData,const Reference< XNameAccess>& i_xQueryColumns )
-{
- sal_Int32 nColumnCount = _rxResMetaData->getColumnCount();
- ::rtl::Reference< OSQLColumns > aReturn( new OSQLColumns ); aReturn->get().reserve( nColumnCount );
-
- StringMap aColumnMap;
- for ( sal_Int32 i = 1; i <= nColumnCount; ++i )
- {
- OParseColumn* pColumn = createColumnForResultSet( _rxResMetaData, _rxDBMetaData, i,aColumnMap );
- aReturn->get().push_back( pColumn );
- if ( i_xQueryColumns.is() && i_xQueryColumns->hasByName(pColumn->getRealName()) )
- {
- Reference<XPropertySet> xColumn(i_xQueryColumns->getByName(pColumn->getRealName()),UNO_QUERY_THROW);
- ::rtl::OUString sLabel;
- xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL)) >>= sLabel;
- if ( sLabel.getLength() )
- pColumn->setLabel(sLabel);
- }
- }
-
- return aReturn;
-}
-
-// -------------------------------------------------------------------------
-OParseColumn* OParseColumn::createColumnForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
- const Reference< XDatabaseMetaData >& _rxDBMetaData, sal_Int32 _nColumnPos,StringMap& _rColumns )
-{
- ::rtl::OUString sLabel = _rxResMetaData->getColumnLabel( _nColumnPos );
- // retrieve the name of the column
- // check for duplicate entries
- if(_rColumns.find(sLabel) != _rColumns.end())
- {
- ::rtl::OUString sAlias(sLabel);
- sal_Int32 searchIndex=1;
- while(_rColumns.find(sAlias) != _rColumns.end())
- {
- (sAlias = sLabel) += ::rtl::OUString::valueOf(searchIndex++);
- }
- sLabel = sAlias;
- }
- _rColumns.insert(StringMap::value_type(sLabel,0));
- OParseColumn* pColumn = new OParseColumn(
- sLabel,
- _rxResMetaData->getColumnTypeName( _nColumnPos ),
- ::rtl::OUString(),
- ::rtl::OUString(),
- _rxResMetaData->isNullable( _nColumnPos ),
- _rxResMetaData->getPrecision( _nColumnPos ),
- _rxResMetaData->getScale( _nColumnPos ),
- _rxResMetaData->getColumnType( _nColumnPos ),
- _rxResMetaData->isAutoIncrement( _nColumnPos ),
- _rxResMetaData->isCurrency( _nColumnPos ),
- _rxDBMetaData->supportsMixedCaseQuotedIdentifiers()
- );
- const ::rtl::OUString sTableName = _rxResMetaData->getTableName( _nColumnPos );
- if ( sTableName.getLength() )
- pColumn->setTableName( ::dbtools::composeTableName( _rxDBMetaData,
- _rxResMetaData->getCatalogName( _nColumnPos ),
- _rxResMetaData->getSchemaName( _nColumnPos ),
- sTableName,
- sal_False,
- eComplete
- ) );
- pColumn->setIsSearchable( _rxResMetaData->isSearchable( _nColumnPos ) );
- pColumn->setRealName(_rxResMetaData->getColumnName( _nColumnPos ));
- pColumn->setLabel(sLabel);
- return pColumn;
-}
-
-// -------------------------------------------------------------------------
-OParseColumn::~OParseColumn()
-{
-}
-// -------------------------------------------------------------------------
-void OParseColumn::construct()
-{
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FUNCTION), PROPERTY_ID_FUNCTION, 0, &m_bFunction, ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_AGGREGATEFUNCTION), PROPERTY_ID_AGGREGATEFUNCTION, 0, &m_bAggregateFunction, ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME), PROPERTY_ID_TABLENAME, 0, &m_aTableName, ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME), PROPERTY_ID_REALNAME, 0, &m_aRealName, ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DBASEPRECISIONCHANGED), PROPERTY_ID_DBASEPRECISIONCHANGED, 0, &m_bDbasePrecisionChanged, ::getCppuType(reinterpret_cast<sal_Bool*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISSEARCHABLE), PROPERTY_ID_ISSEARCHABLE, 0, &m_bIsSearchable, ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL), PROPERTY_ID_LABEL, 0, &m_sLabel, ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
-}
-// -----------------------------------------------------------------------------
-::cppu::IPropertyArrayHelper* OParseColumn::createArrayHelper() const
-{
- return doCreateArrayHelper();
-}
-// -----------------------------------------------------------------------------
-::cppu::IPropertyArrayHelper & SAL_CALL OParseColumn::getInfoHelper()
-{
- OSL_ENSURE( !isNew(), "OParseColumn::getInfoHelper: a *new* ParseColumn?" );
- return *OParseColumn_PROP::getArrayHelper();
-}
-
-// -----------------------------------------------------------------------------
-namespace
-{
- ::rtl::OUString lcl_getColumnTableName( const Reference< XPropertySet >& i_parseColumn )
- {
- ::rtl::OUString sColumnTableName;
- try
- {
- OSL_VERIFY( i_parseColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TABLENAME ) ) >>= sColumnTableName );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return sColumnTableName;
- }
-}
-
-// -----------------------------------------------------------------------------
-OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, const ::rtl::OUString& i_rOriginatingTableName,
- sal_Bool _bCase, sal_Bool _bAscending )
- : connectivity::sdbcx::OColumn(
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
- getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
- sal_False,
- getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
- _bCase
- )
- ,m_bAscending(_bAscending)
- ,m_sTableName( i_rOriginatingTableName )
-{
- construct();
-}
-
-// -----------------------------------------------------------------------------
-OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, sal_Bool _bCase, sal_Bool _bAscending )
- : connectivity::sdbcx::OColumn(
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
- getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
- getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
- getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
- sal_False,
- getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
- _bCase
- )
- ,m_bAscending(_bAscending)
- ,m_sTableName( lcl_getColumnTableName( _xColumn ) )
-{
- construct();
-}
-
-// -------------------------------------------------------------------------
-OOrderColumn::~OOrderColumn()
-{
-}
-
-// -------------------------------------------------------------------------
-void OOrderColumn::construct()
-{
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING,
- PropertyAttribute::READONLY, const_cast< sal_Bool* >( &m_bAscending ), ::getCppuType( reinterpret_cast< sal_Bool* >( NULL ) ) );
- registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME), PROPERTY_ID_TABLENAME,
- PropertyAttribute::READONLY, const_cast< ::rtl::OUString* >( &m_sTableName ), ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
-}
-// -----------------------------------------------------------------------------
-::cppu::IPropertyArrayHelper* OOrderColumn::createArrayHelper() const
-{
- return doCreateArrayHelper();
-}
-// -----------------------------------------------------------------------------
-::cppu::IPropertyArrayHelper & SAL_CALL OOrderColumn::getInfoHelper()
-{
- OSL_ENSURE( !isNew(), "OOrderColumn::getInfoHelper: a *new* OrderColumn?" );
- return *OOrderColumn_PROP::getArrayHelper();
-}
-// -----------------------------------------------------------------------------
-::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OOrderColumn::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException)
-{
- ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1);
- aSupported[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.OrderColumn"));
-
- return aSupported;
-}
-// -----------------------------------------------------------------------------
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/parse/internalnode.cxx b/connectivity/source/parse/internalnode.cxx
deleted file mode 100644
index a6c84f72a0..0000000000
--- a/connectivity/source/parse/internalnode.cxx
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-#include "internalnode.hxx"
-
-#include <algorithm>
-#include <connectivity/sqlparse.hxx>
-
-using namespace connectivity;
-
-//-----------------------------------------------------------------------------
-OSQLInternalNode::OSQLInternalNode(const sal_Char* pNewValue,
- SQLNodeType eNodeType,
- sal_uInt32 nNodeID)
- : OSQLParseNode(pNewValue,eNodeType,nNodeID)
-{
- OSL_ENSURE(OSQLParser::s_pGarbageCollector, "Collector not initialized");
- (*OSQLParser::s_pGarbageCollector)->push_back(this);
-}
-
-//-----------------------------------------------------------------------------
-OSQLInternalNode::OSQLInternalNode(const ::rtl::OString &_NewValue,
- SQLNodeType eNodeType,
- sal_uInt32 nNodeID)
- :OSQLParseNode(_NewValue,eNodeType,nNodeID)
-{
- OSL_ENSURE(OSQLParser::s_pGarbageCollector, "Collector not initialized");
- (*OSQLParser::s_pGarbageCollector)->push_back(this);
-}
-
-//-----------------------------------------------------------------------------
-OSQLInternalNode::OSQLInternalNode(const sal_Unicode* pNewValue,
- SQLNodeType eNodeType,
- sal_uInt32 nNodeID)
- :OSQLParseNode(pNewValue,eNodeType,nNodeID)
-{
- OSL_ENSURE(OSQLParser::s_pGarbageCollector, "Collector not initialized");
- (*OSQLParser::s_pGarbageCollector)->push_back(this);
-}
-
-//-----------------------------------------------------------------------------
-OSQLInternalNode::OSQLInternalNode(const ::rtl::OUString &_NewValue,
- SQLNodeType eNodeType,
- sal_uInt32 nNodeID)
- :OSQLParseNode(_NewValue,eNodeType,nNodeID)
-{
- OSL_ENSURE(OSQLParser::s_pGarbageCollector, "Collector not initialized");
- (*OSQLParser::s_pGarbageCollector)->push_back(this);
-}
-
-
-//-----------------------------------------------------------------------------
-OSQLInternalNode::~OSQLInternalNode()
-{
- // remove the node from the garbage list
-
- OSL_ENSURE(OSQLParser::s_pGarbageCollector, "Collector not initialized");
- (*OSQLParser::s_pGarbageCollector)->erase(this);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/parse/makefile.mk b/connectivity/source/parse/makefile.mk
deleted file mode 100755
index 510fbb2fc2..0000000000
--- a/connectivity/source/parse/makefile.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-#*************************************************************************
-#
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# Copyright 2000, 2010 Oracle and/or its affiliates.
-#
-# OpenOffice.org - a multi-platform office productivity suite
-#
-# This file is part of OpenOffice.org.
-#
-# OpenOffice.org is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License version 3
-# only, as published by the Free Software Foundation.
-#
-# OpenOffice.org is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Lesser General Public License version 3 for more details
-# (a copy is included in the LICENSE file that accompanied this code).
-#
-# You should have received a copy of the GNU Lesser General Public License
-# version 3 along with OpenOffice.org. If not, see
-# <http://www.openoffice.org/license.html>
-# for a copy of the LGPLv3 License.
-#
-#*************************************************************************
-
-PRJ=..$/..
-
-PRJNAME=connectivity
-TARGET=sql
-INCPRE=$(MISC)
-
-# --- Settings -----------------------------------------------------
-
-.INCLUDE : settings.mk
-.INCLUDE : $(PRJ)$/dbtools.pmk
-
-# --- Files --------------------------------------------------------
-
-YACCTARGET= $(MISC)$/sqlbison.cxx
-YACCFILES= sqlbison.y
-YACCFLAGS=-v -d -l -pSQLyy -bsql
-
-EXCEPTIONSFILES = \
- $(SLO)$/PColumn.obj \
- $(SLO)$/internalnode.obj \
- $(SLO)$/sqliterator.obj \
- $(SLO)$/sqlnode.obj \
- $(SLO)$/wrap_sqlbison.obj \
- $(SLO)$/wrap_sqlflex.obj
-
-SLOFILES = \
- $(EXCEPTIONSFILES)
-
-
-# --- Targets -------------------------------------------------------
-
-.INCLUDE : target.mk
-
-$(MISC)$/%.cxx: %.l
- flex -i -8 -PSQLyy -L -o$(MISC)$/sqlflex.cxx sqlflex.l
-
-$(INCCOM)$/sqlbison.hxx : $(YACCTARGET)
-$(EXCEPTIONSFILES) : $(INCCOM)$/sqlbison.hxx
-$(SLO)$/wrap_sqlbison.obj : $(YACCTARGET)
-$(SLO)$/wrap_sqlflex.obj : $(MISC)$/sqlflex.cxx $(INCCOM)$/sqlbison.hxx
diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y
deleted file mode 100755
index 1f2c577b8d..0000000000
--- a/connectivity/source/parse/sqlbison.y
+++ /dev/null
@@ -1,4828 +0,0 @@
-%{
-//--------------------------------------------------------------------------
-//
-// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-//
-// Copyright 2000, 2010 Oracle and/or its affiliates.
-//
-// OpenOffice.org - a multi-platform office productivity suite
-//
-// This file is part of OpenOffice.org.
-//
-// OpenOffice.org is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License version 3
-// only, as published by the Free Software Foundation.
-//
-// OpenOffice.org is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License version 3 for more details
-// (a copy is included in the LICENSE file that accompanied this code).
-//
-// You should have received a copy of the GNU Lesser General Public License
-// version 3 along with OpenOffice.org. If not, see
-// <http://www.openoffice.org/license.html>
-// for a copy of the LGPLv3 License.
-//
-//--------------------------------------------------------------------------
-
-#include <vector>
-#include <string.h>
-
-#ifndef _CONNECTIVITY_SQLNODE_HXX
-#include <connectivity/sqlnode.hxx>
-#endif
-#ifndef _CONNECTIVITY_SQLPARSE_HXX
-#include <connectivity/sqlparse.hxx>
-#endif
-#ifndef _CONNECTIVITY_SQLINTERNALNODE_HXX
-#include <internalnode.hxx>
-#endif
-#ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
-#include <com/sun/star/lang/Locale.hpp>
-#endif
-#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
-#include <com/sun/star/sdbc/DataType.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_DATE_HPP_
-#include <com/sun/star/util/Date.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_DATETIME_HPP_
-#include <com/sun/star/util/DateTime.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_TIME_HPP_
-#include <com/sun/star/util/Time.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTER_HPP_
-#include <com/sun/star/util/XNumberFormatter.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATSSUPPLIER_HPP_
-#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATS_HPP_
-#include <com/sun/star/util/XNumberFormats.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
-#include <com/sun/star/util/NumberFormat.hpp>
-#endif
-#ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
-#include <com/sun/star/util/XNumberFormatTypes.hpp>
-#endif
-#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
-#include <com/sun/star/beans/XPropertySet.hpp>
-#endif
-#ifndef _COM_SUN_STAR_I18N_KPARSETYPE_HPP_
-#include <com/sun/star/i18n/KParseType.hpp>
-#endif
-#ifndef _COM_SUN_STAR_I18N_KPARSETOKENS_HPP_
-#include <com/sun/star/i18n/KParseTokens.hpp>
-#endif
-#ifndef _CONNECTIVITY_SQLSCAN_HXX
-#include "sqlscan.hxx"
-#endif
-#ifndef _OSL_DIAGNOSE_H_
-#include <osl/diagnose.h>
-#endif
-#ifndef _DBHELPER_DBCONVERSION_HXX_
-#include "connectivity/dbconversion.hxx"
-#endif
-#include <rtl/ustrbuf.hxx>
-#include <sal/macros.h>
-
-#if defined __GNUC__
- #pragma GCC system_header
-#elif defined __SUNPRO_CC
-#pragma disable_warn
-#elif defined _MSC_VER
-#pragma warning(push, 1)
-#pragma warning(disable:4273 4701 4706)
-#endif
-
-static ::rtl::OUString aEmptyString;
-
-static connectivity::OSQLInternalNode* newNode(const sal_Char* pNewValue,
- const connectivity::SQLNodeType eNodeType,
- const sal_uInt32 nNodeID = 0)
-{
- return new connectivity::OSQLInternalNode(pNewValue, eNodeType, nNodeID);
-}
-
-static connectivity::OSQLInternalNode* newNode(const ::rtl::OString& _NewValue,
- const connectivity::SQLNodeType eNodeType,
- const sal_uInt32 nNodeID = 0)
-{
- return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID);
-}
-
-static connectivity::OSQLInternalNode* newNode(const ::rtl::OUString& _NewValue,
- const connectivity::SQLNodeType eNodeType,
- const sal_uInt32 nNodeID = 0)
-{
- return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID);
-}
-
-
-// yyi ist die interne Nr. der Regel, die gerade reduziert wird.
-// Ueber die Mapping-Tabelle yyrmap wird daraus eine externe Regel-Nr.
-#define SQL_NEW_RULE newNode(aEmptyString, SQL_NODE_RULE, yyr1[yyn])
-#define SQL_NEW_LISTRULE newNode(aEmptyString, SQL_NODE_LISTRULE, yyr1[yyn])
-#define SQL_NEW_COMMALISTRULE newNode(aEmptyString, SQL_NODE_COMMALISTRULE, yyr1[yyn])
-
-
-connectivity::OSQLParser* xxx_pGLOBAL_SQLPARSER;
-
-#define YYERROR_VERBOSE
-
-#define SQLyyerror(s) \
-{ \
- xxx_pGLOBAL_SQLPARSER->error(s); \
-}
-
-using namespace connectivity;
-#define SQLyylex xxx_pGLOBAL_SQLPARSER->SQLlex
-%}
- /* symbolic tokens */
-
-%union {
- connectivity::OSQLParseNode * pParseNode;
-}
-%type <pParseNode> '(' ')' ',' ':' ';' '?' '[' ']' '{' '}' '.' 'K' 'M' 'G' 'T' 'P'
-
-%token <pParseNode> SQL_TOKEN_STRING SQL_TOKEN_ACCESS_DATE SQL_TOKEN_INT SQL_TOKEN_REAL_NUM
-%token <pParseNode> SQL_TOKEN_INTNUM SQL_TOKEN_APPROXNUM SQL_TOKEN_NOT SQL_TOKEN_NAME
-
-
-%nonassoc <pParseNode> SQL_TOKEN_UMINUS
-
-
-
- /* literal keyword tokens */
-
-%token <pParseNode> SQL_TOKEN_ALL SQL_TOKEN_ALTER SQL_TOKEN_AMMSC SQL_TOKEN_ANY SQL_TOKEN_AS SQL_TOKEN_ASC SQL_TOKEN_AT SQL_TOKEN_AUTHORIZATION SQL_TOKEN_AVG
-
-%token <pParseNode> SQL_TOKEN_BETWEEN SQL_TOKEN_BIT SQL_TOKEN_BOTH SQL_TOKEN_BY
-
-%token <pParseNode> SQL_TOKEN_CAST SQL_TOKEN_CHARACTER SQL_TOKEN_CHECK SQL_TOKEN_COLLATE SQL_TOKEN_COMMIT SQL_TOKEN_CONTINUE SQL_TOKEN_CONVERT SQL_TOKEN_COUNT SQL_TOKEN_CREATE SQL_TOKEN_CROSS
-%token <pParseNode> SQL_TOKEN_CURRENT SQL_TOKEN_CURSOR
-
-%token <pParseNode> SQL_TOKEN_DATE SQL_TOKEN_DATEVALUE SQL_TOKEN_DAY SQL_TOKEN_DEC SQL_TOKEN_DECIMAL SQL_TOKEN_DECLARE SQL_TOKEN_DEFAULT SQL_TOKEN_DELETE SQL_TOKEN_DESC
-%token <pParseNode> SQL_TOKEN_DISTINCT SQL_TOKEN_DOUBLE SQL_TOKEN_DROP
-
-%token <pParseNode> SQL_TOKEN_ESCAPE SQL_TOKEN_EXCEPT SQL_TOKEN_EXISTS SQL_TOKEN_FALSE SQL_TOKEN_FETCH SQL_TOKEN_FLOAT SQL_TOKEN_FOR SQL_TOKEN_FOREIGN SQL_TOKEN_FOUND SQL_TOKEN_FROM SQL_TOKEN_FULL
-
-%token <pParseNode> SQL_TOKEN_GRANT SQL_TOKEN_GROUP SQL_TOKEN_HAVING SQL_TOKEN_IN SQL_TOKEN_INDICATOR SQL_TOKEN_INNER SQL_TOKEN_INTEGER SQL_TOKEN_INTO SQL_TOKEN_IS SQL_TOKEN_INTERSECT
-
-%token <pParseNode> SQL_TOKEN_JOIN SQL_TOKEN_KEY SQL_TOKEN_LEADING SQL_TOKEN_LIKE SQL_TOKEN_LOCAL SQL_TOKEN_LOWER
-%token <pParseNode> SQL_TOKEN_MAX SQL_TOKEN_MIN SQL_TOKEN_NATURAL SQL_TOKEN_NCHAR SQL_TOKEN_NULL SQL_TOKEN_NUMERIC
-
-%token <pParseNode> SQL_TOKEN_OCTET_LENGTH SQL_TOKEN_OF SQL_TOKEN_ON SQL_TOKEN_OPTION SQL_TOKEN_ORDER SQL_TOKEN_OUTER
-
-%token <pParseNode> SQL_TOKEN_PRECISION SQL_TOKEN_PRIMARY SQL_TOKEN_PRIVILEGES SQL_TOKEN_PROCEDURE SQL_TOKEN_PUBLIC
-%token <pParseNode> SQL_TOKEN_REAL SQL_TOKEN_REFERENCES SQL_TOKEN_ROLLBACK
-
-%token <pParseNode> SQL_TOKEN_SCHEMA SQL_TOKEN_SELECT SQL_TOKEN_SET SQL_TOKEN_SIZE SQL_TOKEN_SMALLINT SQL_TOKEN_SOME SQL_TOKEN_SQLCODE SQL_TOKEN_SQLERROR SQL_TOKEN_SUM
-
-%token <pParseNode> SQL_TOKEN_TABLE SQL_TOKEN_TIME SQL_TOKEN_TIMESTAMP SQL_TOKEN_TIMEZONE_HOUR SQL_TOKEN_TIMEZONE_MINUTE SQL_TOKEN_TO SQL_TOKEN_TRAILING SQL_TOKEN_TRANSLATE SQL_TOKEN_TRIM SQL_TOKEN_TRUE SQL_TOKEN_UNION
-%token <pParseNode> SQL_TOKEN_UNIQUE SQL_TOKEN_UNKNOWN SQL_TOKEN_UPDATE SQL_TOKEN_UPPER SQL_TOKEN_USAGE SQL_TOKEN_USER SQL_TOKEN_USING SQL_TOKEN_VALUES SQL_TOKEN_VIEW
-%token <pParseNode> SQL_TOKEN_WHERE SQL_TOKEN_WITH SQL_TOKEN_WORK SQL_TOKEN_ZONE
-
-/* ODBC KEYWORDS */
-%token <pParseNode> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ
-/* string functions */
-%token <pParseNode> SQL_TOKEN_ASCII SQL_TOKEN_BIT_LENGTH SQL_TOKEN_CHAR SQL_TOKEN_CHAR_LENGTH SQL_TOKEN_SQL_TOKEN_INTNUM
-%token <pParseNode> SQL_TOKEN_CONCAT
-%token <pParseNode> SQL_TOKEN_DIFFERENCE SQL_TOKEN_INSERT SQL_TOKEN_LCASE SQL_TOKEN_LEFT SQL_TOKEN_LENGTH SQL_TOKEN_LOCATE
-%token <pParseNode> SQL_TOKEN_LOCATE_2 SQL_TOKEN_LTRIM SQL_TOKEN_POSITION SQL_TOKEN_REPEAT SQL_TOKEN_REPLACE
-%token <pParseNode> SQL_TOKEN_RIGHT SQL_TOKEN_RTRIM SQL_TOKEN_SOUNDEX SQL_TOKEN_SPACE SQL_TOKEN_SUBSTRING SQL_TOKEN_UCASE
-
-/* time and date functions */
-%token <pParseNode> SQL_TOKEN_CURRENT_DATE SQL_TOKEN_CURRENT_TIME SQL_TOKEN_CURRENT_TIMESTAMP SQL_TOKEN_CURDATE SQL_TOKEN_CURTIME
-%token <pParseNode> SQL_TOKEN_DAYNAME SQL_TOKEN_DAYOFMONTH SQL_TOKEN_DAYOFWEEK SQL_TOKEN_DAYOFYEAR SQL_TOKEN_EXTRACT
-%token <pParseNode> SQL_TOKEN_HOUR SQL_TOKEN_MINUTE SQL_TOKEN_MONTH SQL_TOKEN_MONTHNAME SQL_TOKEN_NOW SQL_TOKEN_QUARTER SQL_TOKEN_DATEDIFF
-%token <pParseNode> SQL_TOKEN_SECOND SQL_TOKEN_TIMESTAMPADD SQL_TOKEN_TIMESTAMPDIFF SQL_TOKEN_TIMEVALUE SQL_TOKEN_WEEK SQL_TOKEN_YEAR
-
-/* numeric functions */
-%token <pParseNode> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING
-%token <pParseNode> SQL_TOKEN_COS SQL_TOKEN_COT SQL_TOKEN_DEGREES SQL_TOKEN_EXP SQL_TOKEN_FLOOR SQL_TOKEN_LOGF SQL_TOKEN_LOG SQL_TOKEN_LN
-%token <pParseNode> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND SQL_TOKEN_ROUNDMAGIC
-%token <pParseNode> SQL_TOKEN_ROUND SQL_TOKEN_SIGN SQL_TOKEN_SIN SQL_TOKEN_SQRT SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE
-
-// computational operation
-%token <pParseNode> SQL_TOKEN_EVERY SQL_TOKEN_INTERSECTION SQL_TOKEN_FUSION SQL_TOKEN_COLLECT SQL_TOKEN_VAR_POP SQL_TOKEN_VAR_SAMP
-%token <pParseNode> SQL_TOKEN_STDDEV_SAMP SQL_TOKEN_STDDEV_POP
-
-%token <pParseNode> SQL_TOKEN_RANK SQL_TOKEN_DENSE_RANK SQL_TOKEN_PERCENT_RANK SQL_TOKEN_CUME_DIST SQL_TOKEN_PERCENTILE_CONT SQL_TOKEN_PERCENTILE_DISC SQL_TOKEN_WITHIN SQL_TOKEN_ARRAY_AGG
-%token <pParseNode> SQL_TOKEN_CASE SQL_TOKEN_THEN SQL_TOKEN_END SQL_TOKEN_NULLIF SQL_TOKEN_COALESCE SQL_TOKEN_WHEN SQL_TOKEN_ELSE
-%token <pParseNode> SQL_TOKEN_BEFORE SQL_TOKEN_AFTER SQL_TOKEN_INSTEAD SQL_TOKEN_EACH SQL_TOKEN_REFERENCING SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_TOKEN_TRIGGER SQL_TOKEN_ROW SQL_TOKEN_STATEMENT
-%token <pParseNode> SQL_TOKEN_NEW SQL_TOKEN_OLD
-%token <pParseNode> SQL_TOKEN_VALUE SQL_TOKEN_CURRENT_CATALOG SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP SQL_TOKEN_CURRENT_PATH SQL_TOKEN_CURRENT_ROLE SQL_TOKEN_CURRENT_SCHEMA SQL_TOKEN_CURRENT_USER
-%token <pParseNode> SQL_TOKEN_SESSION_USER SQL_TOKEN_SYSTEM_USER SQL_TOKEN_VARCHAR SQL_TOKEN_VARBINARY SQL_TOKEN_VARYING SQL_TOKEN_OBJECT SQL_TOKEN_NCLOB SQL_TOKEN_NATIONAL
-%token <pParseNode> SQL_TOKEN_LARGE SQL_TOKEN_CLOB SQL_TOKEN_BLOB SQL_TOKEN_BIGINT SQL_TOKEN_BINARY SQL_TOKEN_WITHOUT SQL_TOKEN_BOOLEAN SQL_TOKEN_INTERVAL
-// window function
-%token <pParseNode> SQL_TOKEN_OVER SQL_TOKEN_ROW_NUMBER SQL_TOKEN_NTILE SQL_TOKEN_LEAD SQL_TOKEN_LAG SQL_TOKEN_RESPECT SQL_TOKEN_IGNORE SQL_TOKEN_NULLS
-%token <pParseNode> SQL_TOKEN_FIRST_VALUE SQL_TOKEN_LAST_VALUE SQL_TOKEN_NTH_VALUE SQL_TOKEN_FIRST SQL_TOKEN_LAST
-%token <pParseNode> SQL_TOKEN_EXCLUDE SQL_TOKEN_OTHERS SQL_TOKEN_TIES SQL_TOKEN_FOLLOWING SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING SQL_TOKEN_RANGE SQL_TOKEN_ROWS
-%token <pParseNode> SQL_TOKEN_PARTITION SQL_TOKEN_WINDOW SQL_TOKEN_NO
-// LIMIT and OFFSEt
-%token <pParseNode> SQL_TOKEN_LIMIT SQL_TOKEN_OFFSET SQL_TOKEN_NEXT SQL_TOKEN_ONLY
-
- /* operators */
-%left SQL_TOKEN_NAME
-%left <pParseNode> SQL_TOKEN_OR
-%left <pParseNode> SQL_TOKEN_AND
-
-%left <pParseNode> SQL_LESSEQ SQL_GREATEQ SQL_NOTEQUAL SQL_LESS SQL_GREAT SQL_EQUAL /* '<' '>' = <> < > <= >= != */
-%left <pParseNode> '+' '-' SQL_CONCAT
-%left <pParseNode> '*' '/'
-%left SQL_TOKEN_NATURAL SQL_TOKEN_CROSS SQL_TOKEN_FULL SQL_TOKEN_LEFT SQL_TOKEN_RIGHT
-%left ')'
-%right '='
-%right '.'
-%right '('
-
-
-%token <pParseNode> SQL_TOKEN_INVALIDSYMBOL
-
-/*%type <pParseNode> sql_single_statement */
-
-%type <pParseNode> sql /*schema */
-%type <pParseNode> column_def_opt_list column_def_opt table_constraint_def column_commalist
-%type <pParseNode> view_def opt_with_check_option opt_column_commalist privilege_def
-%type <pParseNode> opt_with_grant_option privileges operation_commalist operation
-%type <pParseNode> grantee_commalist grantee opt_order_by_clause ordering_spec_commalist
-%type <pParseNode> ordering_spec opt_asc_desc manipulative_statement commit_statement
-%type <pParseNode> /*delete_statement_positioned*/ delete_statement_searched fetch_statement
-%type <pParseNode> insert_statement values_or_query_spec
-%type <pParseNode> rollback_statement select_statement_into opt_all_distinct
-%type <pParseNode> /*update_statement_positioned*/ assignment_commalist assignment
-%type <pParseNode> update_statement_searched target_commalist target opt_where_clause
-%type <pParseNode> select_statement selection table_exp from_clause table_ref_commalist table_ref
-%type <pParseNode> where_clause opt_group_by_clause column_ref_commalist opt_having_clause
-%type <pParseNode> search_condition predicate comparison_predicate comparison_predicate_part_2 between_predicate between_predicate_part_2
-%type <pParseNode> like_predicate opt_escape test_for_null null_predicate_part_2 in_predicate in_predicate_part_2 character_like_predicate_part_2 other_like_predicate_part_2
-%type <pParseNode> all_or_any_predicate any_all_some existence_test subquery quantified_comparison_predicate_part_2
-%type <pParseNode> scalar_exp_commalist parameter_ref literal parenthesized_boolean_value_expression
-%type <pParseNode> column_ref data_type column cursor parameter range_variable user /*like_check*/
-/* neue Regeln bei OJ */
-%type <pParseNode> derived_column as_clause table_name num_primary term num_value_exp
-%type <pParseNode> value_exp_primary num_value_fct unsigned_value_spec cast_spec set_fct_spec scalar_subquery
-%type <pParseNode> position_exp extract_exp length_exp general_value_spec
-%type <pParseNode> general_set_fct set_fct_type query_exp non_join_query_exp joined_table
-%type <pParseNode> non_join_query_term non_join_query_primary simple_table
-%type <pParseNode> table_value_const_list row_value_constructor row_value_const_list row_value_constructor_elem
-%type <pParseNode> qualified_join value_exp query_term join_type outer_join_type join_condition boolean_term
-%type <pParseNode> boolean_factor truth_value boolean_test boolean_primary named_columns_join join_spec
-%type <pParseNode> cast_operand cast_target factor datetime_value_exp /*interval_value_exp*/ datetime_term datetime_factor
-%type <pParseNode> datetime_primary datetime_value_fct time_zone time_zone_specifier /*interval_term*/ interval_qualifier
-%type <pParseNode> start_field non_second_datetime_field end_field single_datetime_field extract_field datetime_field time_zone_field
-%type <pParseNode> extract_source char_length_exp octet_length_exp bit_length_exp select_sublist string_value_exp
-%type <pParseNode> char_value_exp concatenation char_factor char_primary string_value_fct char_substring_fct fold
-%type <pParseNode> form_conversion char_translation trim_fct trim_operands trim_spec bit_value_fct bit_substring_fct op_column_commalist
-%type <pParseNode> /*bit_concatenation*/ bit_value_exp bit_factor bit_primary collate_clause char_value_fct unique_spec value_exp_commalist in_predicate_value unique_test update_source
-%type <pParseNode> function_arg_commalist3 string_function_3Argument function_arg_commalist4 string_function_4Argument function_arg_commalist2 string_function_1Argument string_function_2Argument
-%type <pParseNode> date_function_0Argument date_function_1Argument function_name12 function_name23 function_name1 function_name2 function_name3 function_name0 numeric_function_0Argument numeric_function_1Argument numeric_function_2Argument
-%type <pParseNode> all query_primary sql_not for_length upper_lower comparison column_val cross_union /*opt_schema_element_list*/
-%type <pParseNode> /*op_authorization op_schema*/ nil_fkt schema_element base_table_def base_table_element base_table_element_commalist
-%type <pParseNode> column_def odbc_fct_spec odbc_call_spec odbc_fct_type op_parameter union_statement
-%type <pParseNode> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter function_args_commalist function_arg
-%type <pParseNode> catalog_name schema_name table_node numeric_function string_function function_name date_function table_primary_as_range_column opt_as
-%type <pParseNode> ordered_set_function inverse_distribution_function hypothetical_set_function hypothetical_set_function_value_expression_list rank_function_type within_group_specification inverse_distribution_function_type array_aggregate_function inverse_distribution_function_argument
-%type <pParseNode> case_expression else_clause result_expression result case_abbreviation case_specification searched_when_clause simple_when_clause searched_case simple_case
-%type <pParseNode> when_operand_list when_operand case_operand
-%type <pParseNode> trigger_definition trigger_name trigger_action_time trigger_event transition_table_or_variable_list triggered_action trigger_column_list triggered_when_clause triggered_SQL_statement SQL_procedure_statement old_transition_variable_name new_transition_variable_name
-%type <pParseNode> op_referencing op_trigger_columnlist op_triggered_action_for opt_row trigger_for SQL_procedure_statement_list transition_table_or_variable old_transition_table_name new_transition_table_name transition_table_name
-%type <pParseNode> searched_when_clause_list simple_when_clause_list predefined_type opt_char_set_spec opt_collate_clause character_string_type national_character_string_type
-%type <pParseNode> binary_string_type numeric_type boolean_type datetime_type interval_type opt_paren_precision paren_char_length opt_paren_char_large_length paren_character_large_object_length
-%type <pParseNode> large_object_length opt_multiplier character_large_object_type national_character_large_object_type binary_large_object_string_type opt_with_or_without_time_zone
-%type <pParseNode> approximate_numeric_type exact_numeric_type opt_paren_precision_scale
-/* window function rules */
-%type <pParseNode> window_function window_function_type ntile_function number_of_tiles lead_or_lag_function lead_or_lag lead_or_lag_extent offset default_expression null_treatment
-%type <pParseNode> first_or_last_value_function first_or_last_value nth_value_function nth_row from_first_or_last window_name_or_specification in_line_window_specification opt_lead_or_lag_function
-%type <pParseNode> opt_null_treatment opt_from_first_or_last simple_value_specification dynamic_parameter_specification window_name window_clause window_definition_list window_definition
-%type <pParseNode> new_window_name window_specification_details existing_window_name window_partition_clause window_partition_column_reference_list window_partition_column_reference window_frame_clause
-%type <pParseNode> window_frame_units window_frame_extent window_frame_start window_frame_preceding window_frame_between window_frame_bound_1 window_frame_bound_2 window_frame_bound window_frame_following window_frame_exclusion
-%type <pParseNode> opt_window_frame_clause opt_window_partition_clause opt_existing_window_name window_specification opt_window_frame_exclusion opt_window_clause opt_offset
-%type <pParseNode> opt_fetch_first_row_count fetch_first_clause offset_row_count fetch_first_row_count first_or_next row_or_rows opt_result_offset_clause result_offset_clause
-/* LIMIT and OFFSET */
-%type <pParseNode> opt_limit_offset_clause limit_offset_clause opt_fetch_first_clause
-%%
-
-/* Parse Tree an OSQLParser zurueckliefern
- * (der Zugriff ueber yyval nach Aufruf des Parsers scheitert,
- *
- */
-sql_single_statement:
- sql
- { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); }
- | sql ';'
- { xxx_pGLOBAL_SQLPARSER->setParseTree( $1 ); }
- ;
-
- /* schema definition language */
- /* Note: other ``sql:sal_Unicode() rules appear later in the grammar */
-
-sql:
- manipulative_statement
- | schema_element
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-
-/***
-
-op_authorization:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_AUTHORIZATION user
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-op_schema:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_NAME
- | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- ;
-
-schema:
- SQL_TOKEN_CREATE SQL_TOKEN_SCHEMA op_schema op_authorization opt_schema_element_list
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- ;
-
-opt_schema_element_list:
- {$$ = SQL_NEW_RULE;}
- | schema_glement_list
- ;
-
-schema_element_list:
- schema_element
- {$$ = SQL_NEW_LISTRULE;
- $$->append($1);}
- | schema_element_list schema_element
- {$1->append($2);
- $$ = $1;}
- ;
-*/
-
-schema_element:
- base_table_def
- | view_def
- | privilege_def
- | trigger_definition
- ;
-
-base_table_def:
- SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_node '(' base_table_element_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));}
- ;
-
-base_table_element_commalist:
- base_table_element
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | base_table_element_commalist ',' base_table_element
- {$1->append($3);
- $$ = $1;}
- ;
-
-base_table_element:
- column_def
- | table_constraint_def
- ;
-
-column_def:
- column data_type column_def_opt_list
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-
-column_def_opt_list:
- /* empty */ {$$ = SQL_NEW_LISTRULE;}
- | column_def_opt_list column_def_opt
- {$1->append($2);
- $$ = $1;}
- ;
-
-nil_fkt:
- datetime_value_fct
- ;
-unique_spec:
- SQL_TOKEN_UNIQUE
- | SQL_TOKEN_PRIMARY SQL_TOKEN_KEY
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-column_def_opt:
- SQL_TOKEN_NOT SQL_TOKEN_NULL
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | unique_spec
- | SQL_TOKEN_DEFAULT literal
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_DEFAULT SQL_TOKEN_NULL
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_DEFAULT SQL_TOKEN_USER
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_DEFAULT nil_fkt
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_CHECK
- | SQL_TOKEN_CHECK '(' search_condition ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
- | SQL_TOKEN_REFERENCES table_node
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));}
- ;
-
-table_constraint_def:
- unique_spec '(' column_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
- | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($6);
- $$->append($7);}
- | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($6);
- $$->append($7);
- $$->append($8 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($9);
- $$->append($10 = newNode(")", SQL_NODE_PUNCTUATION));}
- | SQL_TOKEN_CHECK '(' search_condition ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
- ;
-op_column_commalist:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | '(' column_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-column_commalist:
- column_commalist ',' column
- {$1->append($3);
- $$ = $1;}
- | column
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- ;
-
-view_def:
- SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_node opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);}
- ;
-
-opt_with_check_option:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_WITH SQL_TOKEN_CHECK SQL_TOKEN_OPTION
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);}
- ;
-
-opt_column_commalist:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | '(' column_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));}
- ;
-
-privilege_def:
- SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_node SQL_TOKEN_TO grantee_commalist
- opt_with_grant_option
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);}
- ;
-
-opt_with_grant_option:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_WITH SQL_TOKEN_GRANT SQL_TOKEN_OPTION
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);}
- ;
-
-privileges:
- SQL_TOKEN_ALL SQL_TOKEN_PRIVILEGES
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | operation_commalist
- ;
-
-operation_commalist:
- operation
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | operation_commalist ',' operation
- {$1->append($3);
- $$ = $1;}
- ;
-
-operation:
- SQL_TOKEN_SELECT
- | SQL_TOKEN_INSERT opt_column_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_DELETE
- | SQL_TOKEN_UPDATE opt_column_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_REFERENCES opt_column_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | SQL_TOKEN_USAGE
- ;
-
-
-grantee_commalist:
- grantee
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | grantee_commalist ',' grantee
- {$1->append($3);
- $$ = $1;}
- ;
-
-grantee:
- SQL_TOKEN_PUBLIC
- | user
- ;
-
- /* module language */
-
-opt_order_by_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ORDER SQL_TOKEN_BY ordering_spec_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);}
- ;
-
-ordering_spec_commalist:
- ordering_spec
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | ordering_spec_commalist ',' ordering_spec
- {$1->append($3);
- $$ = $1;}
- ;
-
-ordering_spec:
-/* SQL_TOKEN_INTNUM opt_asc_desc
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
-*/
- predicate opt_asc_desc
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
-
- | row_value_constructor_elem opt_asc_desc
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-
-opt_asc_desc:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ASC
- | SQL_TOKEN_DESC
- ;
-
-
-/***
-manipulative_statement_list:
- manipulative_statement
- {$$ = SQL_NEW_LISTRULE;
- $$->append($1);}
- | manipulative_statement_list manipulative_statement
- {$1->append($2);
- $$ = $1;}
- ;
-***/
-
-sql_not:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_NOT
- ;
-
-/* manipulative statements */
-
-manipulative_statement:
- commit_statement
-/* | delete_statement_positioned*/
- | delete_statement_searched
- | fetch_statement
- | insert_statement
- | rollback_statement
- | select_statement_into
-/* | update_statement_positioned*/
- | update_statement_searched
- | union_statement
- | '{' odbc_call_spec '}'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION));
- }
- ;
-
-union_statement:
- select_statement
- | union_statement SQL_TOKEN_UNION all select_statement
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-commit_statement:
- SQL_TOKEN_COMMIT SQL_TOKEN_WORK
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-/*
-delete_statement_positioned:
- SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);}
- ;
-*/
-delete_statement_searched:
- SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node opt_where_clause
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);}
- ;
-
-fetch_statement:
- SQL_TOKEN_FETCH cursor SQL_TOKEN_INTO target_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);}
- ;
-
-insert_statement:
- SQL_TOKEN_INSERT SQL_TOKEN_INTO table_node opt_column_commalist values_or_query_spec
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);}
- ;
-values_or_query_spec:
- SQL_TOKEN_VALUES '(' table_value_const_list ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-
-table_value_const_list:
- row_value_constructor
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | table_value_const_list ',' row_value_constructor
- {$1->append($3);
- $$ = $1;}
- ;
-row_value_const_list:
- row_value_constructor_elem
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | row_value_const_list ',' row_value_constructor_elem
- {$1->append($3);
- $$ = $1;}
- ;
-row_value_constructor:
- row_value_constructor_elem
-/* | '(' row_value_const_list ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- */
- ;
-row_value_constructor_elem:
- value_exp /*[^')']*/
- | SQL_TOKEN_DEFAULT
- ;
-
-
-rollback_statement:
- SQL_TOKEN_ROLLBACK SQL_TOKEN_WORK
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-
-
- /* INTO target_commalist herausgenommen */
-select_statement_into:
- SQL_TOKEN_SELECT opt_all_distinct selection SQL_TOKEN_INTO target_commalist table_exp
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6); }
- ;
-
-opt_all_distinct:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ALL
- | SQL_TOKEN_DISTINCT
-
- ;
-/*
-update_statement_positioned:
- SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist
- SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);
- $$->append($8);}
- ;
-*/
-assignment_commalist:
- assignment
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | assignment_commalist ',' assignment
- {$1->append($3);
- $$ = $1;}
- ;
-
-assignment:
- column SQL_EQUAL update_source
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);}
- ;
-update_source:
- value_exp
- | SQL_TOKEN_DEFAULT
- ;
-update_statement_searched:
- SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist opt_where_clause
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);}
- ;
-
-target_commalist:
- target
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | target_commalist ',' target
- {$1->append($3);
- $$ = $1;}
- ;
-
-target:
- parameter_ref
- ;
-
-opt_where_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | where_clause
- ;
-
- /* query expressions */
-
-query_term:
- non_join_query_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-/* SELECT STATEMENT */
-select_statement:
- SQL_TOKEN_SELECT opt_all_distinct selection table_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-
-selection:
- '*'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION));
- }
- | scalar_exp_commalist
- ;
-opt_result_offset_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | result_offset_clause
- ;
-result_offset_clause:
- SQL_TOKEN_OFFSET offset_row_count row_or_rows
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-opt_fetch_first_row_count:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | fetch_first_row_count
- ;
-first_or_next:
- SQL_TOKEN_FIRST
- | SQL_TOKEN_NEXT
- ;
-row_or_rows:
- SQL_TOKEN_ROW
- | SQL_TOKEN_ROWS
- ;
-opt_fetch_first_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | fetch_first_clause
- ;
-fetch_first_clause:
- SQL_TOKEN_FETCH first_or_next opt_fetch_first_row_count row_or_rows SQL_TOKEN_ONLY
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- ;
-offset_row_count:
- literal
- ;
-fetch_first_row_count:
- literal
- ;
-
-opt_limit_offset_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | limit_offset_clause
- ;
-opt_offset:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_OFFSET SQL_TOKEN_INTNUM
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-limit_offset_clause:
- SQL_TOKEN_LIMIT SQL_TOKEN_INTNUM opt_offset
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-table_exp:
- from_clause opt_where_clause opt_group_by_clause opt_having_clause opt_window_clause opt_order_by_clause opt_limit_offset_clause opt_result_offset_clause opt_fetch_first_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);
- $$->append($8);
- $$->append($9);
- }
- ;
-
-from_clause:
- SQL_TOKEN_FROM table_ref_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-
-table_ref_commalist:
-
- table_ref
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | table_ref_commalist ',' table_ref
- {$1->append($3);
- $$ = $1;}
- ;
-
-opt_as:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_AS
- ;
-opt_row:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ROW
- ;
-table_primary_as_range_column:
- {$$ = SQL_NEW_RULE;}
- | opt_as SQL_TOKEN_NAME op_column_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-table_ref:
- table_node table_primary_as_range_column
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | subquery range_variable op_column_commalist
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | joined_table
- | '{' SQL_TOKEN_OJ joined_table '}'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3);
- $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION));
- }
- | '(' joined_table ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-where_clause:
- SQL_TOKEN_WHERE search_condition
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-
-opt_group_by_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_GROUP SQL_TOKEN_BY column_ref_commalist
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);}
- ;
-
-column_ref_commalist:
- column_ref
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | set_fct_spec
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | column_ref_commalist ',' column_ref
- {$1->append($3);
- $$ = $1;}
- | column_ref_commalist ',' set_fct_spec
- {$1->append($3);
- $$ = $1;}
- ;
-
-opt_having_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_HAVING search_condition
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-
- /* search conditions */
-truth_value:
- SQL_TOKEN_TRUE
- | SQL_TOKEN_FALSE
- | SQL_TOKEN_UNKNOWN
- | SQL_TOKEN_NULL
- ;
-boolean_primary:
- predicate
- | '(' search_condition ')'
- { // boolean_primary: rule 2
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | row_value_constructor_elem /*[^')' ',']*/
- {
- if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// boolean_primary: rule 3
- {
- $$ = SQL_NEW_RULE;
- sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$1);
- if(nErg == 1)
- {
- OSQLParseNode* pTemp = $$;
- $$ = pTemp->removeAt((sal_uInt32)0);
- delete pTemp;
- }
- else
- {
- delete $$;
- if(nErg)
- YYERROR;
- else
- YYABORT;
- }
- }
- else
- YYERROR;
- }
- ;
-parenthesized_boolean_value_expression:
- '(' search_condition ')'
- { // boolean_primary: rule 2
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-boolean_test:
- boolean_primary
- | boolean_primary SQL_TOKEN_IS sql_not truth_value
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-boolean_factor:
- boolean_test
- | SQL_TOKEN_NOT boolean_test
- { // boolean_factor: rule 1
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-boolean_term:
- boolean_factor
- | boolean_term SQL_TOKEN_AND boolean_factor
- {
- $$ = SQL_NEW_RULE; // boolean_term: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-search_condition:
- boolean_term
- | search_condition SQL_TOKEN_OR boolean_term
- {
- $$ = SQL_NEW_RULE; // search_condition
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-predicate:
- comparison_predicate
- | between_predicate
- | all_or_any_predicate
- | existence_test
- | unique_test
- | test_for_null
- | in_predicate
- | like_predicate
- ;
-comparison_predicate_part_2:
- comparison row_value_constructor
- {
- $$ = SQL_NEW_RULE; // comparison_predicate: rule 1
- $$->append($1);
- $$->append($2);
- }
-comparison_predicate:
- row_value_constructor comparison row_value_constructor
- {
- $$ = SQL_NEW_RULE; // comparison_predicate: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | comparison row_value_constructor
- {
- if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // comparison_predicate: rule 2
- {
- $$ = SQL_NEW_RULE;
- sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1);
- if(nErg == 1)
- {
- OSQLParseNode* pTemp = $$;
- $$ = pTemp->removeAt((sal_uInt32)0);
- delete pTemp;
- }
- else
- {
- delete $$;
- YYABORT;
- }
- }
- else
- {
- YYERROR;
- }
- }
- ;
-comparison:
- SQL_LESS
- | SQL_NOTEQUAL
- | SQL_EQUAL
- | SQL_GREAT
- | SQL_LESSEQ
- | SQL_GREATEQ
- ;
-between_predicate_part_2:
- sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // between_predicate: rule 2
- {
- $$ = SQL_NEW_RULE;
-
- sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$3,$2,$5);
- if(nErg == 1)
- {
- OSQLParseNode* pTemp = $$;
- $$ = pTemp->removeAt((sal_uInt32)0);
- OSQLParseNode* pColumnRef = $$->removeAt((sal_uInt32)0);
- $$->insert(0,$1);
- OSQLParseNode* pBetween_predicate = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate));
- pBetween_predicate->append(pColumnRef);
- pBetween_predicate->append($$);
- $$ = pBetween_predicate;
-
- delete pTemp;
- delete $4;
- }
- else
- {
- delete $$;
- YYABORT;
- }
- }
- else
- {
- $$ = SQL_NEW_RULE; // between_predicate: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- }
-between_predicate:
- row_value_constructor between_predicate_part_2
- {
- $$ = SQL_NEW_RULE; // between_predicate: rule 1
- $$->append($1);
- $$->append($2);
- }
- | between_predicate_part_2
- ;
-character_like_predicate_part_2:
- sql_not SQL_TOKEN_LIKE string_value_exp opt_escape
- {
- $$ = SQL_NEW_RULE; // like_predicate: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-other_like_predicate_part_2:
- sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape
- {
- $$ = SQL_NEW_RULE; // like_predicate: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-like_predicate:
- row_value_constructor character_like_predicate_part_2
- {
- $$ = SQL_NEW_RULE; // like_predicate: rule 1
- $$->append($1);
- $$->append($2);
- }
- | row_value_constructor other_like_predicate_part_2
- {
- $$ = SQL_NEW_RULE; // like_predicate: rule 3
- $$->append($1);
- $$->append($2);
- }
- | character_like_predicate_part_2
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 5
- {
- OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
- $$ = SQL_NEW_RULE;
- $$->append(pColumnRef);
- $$->append($1);
- OSQLParseNode* p2nd = $1->removeAt(2);
- OSQLParseNode* p3rd = $1->removeAt(2);
- if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) )
- {
- delete $$;
- YYABORT;
- }
- $1->append(p3rd);
- }
- else
- YYERROR;
- }
- | other_like_predicate_part_2
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 6
- {
- OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
- $$ = SQL_NEW_RULE;
- $$->append(pColumnRef);
- $$->append($1);
- OSQLParseNode* p2nd = $1->removeAt(2);
- OSQLParseNode* p3rd = $1->removeAt(2);
- if ( !xxx_pGLOBAL_SQLPARSER->buildLikeRule($1,p2nd,p3rd) )
- {
- delete $$;
- YYABORT;
- }
- $1->append(p3rd);
- }
- else
- YYERROR;
- }
- ;
-
-opt_escape:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ESCAPE string_value_exp
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- | '{' SQL_TOKEN_ESCAPE SQL_TOKEN_STRING '}'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3);
- $$->append($4 = newNode("}", SQL_NODE_PUNCTUATION));
- }
- ;
-
-null_predicate_part_2:
- SQL_TOKEN_IS sql_not SQL_TOKEN_NULL
- {
- $$ = SQL_NEW_RULE; // test_for_null: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-test_for_null:
- row_value_constructor null_predicate_part_2
- {
- $$ = SQL_NEW_RULE; // test_for_null: rule 1
- $$->append($1);
- $$->append($2);
- }
- | null_predicate_part_2
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// test_for_null: rule 2
- {
- OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
- $$ = SQL_NEW_RULE;
- $$->append(pColumnRef);
- $$->append($1);
- }
- else
- YYERROR;
- }
- ;
-in_predicate_value:
- subquery
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | '(' value_exp_commalist ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-in_predicate_part_2:
- sql_not SQL_TOKEN_IN in_predicate_value
- {
- $$ = SQL_NEW_RULE;// in_predicate: rule 1
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-in_predicate:
- row_value_constructor in_predicate_part_2
- {
- $$ = SQL_NEW_RULE;// in_predicate: rule 1
- $$->append($1);
- $$->append($2);
- }
- | in_predicate_part_2
- {
- if ( xxx_pGLOBAL_SQLPARSER->inPredicateCheck() )// in_predicate: rule 2
- {
- OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
- $$ = SQL_NEW_RULE;
- $$->append(pColumnRef);
- $$->append($1);
- }
- else
- YYERROR;
- }
- ;
-quantified_comparison_predicate_part_2:
- comparison any_all_some subquery
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-all_or_any_predicate:
- row_value_constructor quantified_comparison_predicate_part_2
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | quantified_comparison_predicate_part_2
- {
- if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME));
-
- $$ = SQL_NEW_RULE;
- $$->append(pColumnRef);
- $$->append($1);
- }
- else
- YYERROR;
- }
- ;
-
-any_all_some:
- SQL_TOKEN_ANY
- | SQL_TOKEN_ALL
- | SQL_TOKEN_SOME
- ;
-
-existence_test:
- SQL_TOKEN_EXISTS subquery
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-unique_test:
- SQL_TOKEN_UNIQUE subquery
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);}
- ;
-subquery:
- '(' query_exp ')'
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));}
- ;
-
- /* scalar expressions */
-scalar_exp_commalist:
- select_sublist
- {
- $$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);
- }
- | scalar_exp_commalist ',' select_sublist
- {
- $1->append($3);
- $$ = $1;
- }
- ;
-select_sublist:
-/* table_node '.' '*'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
- }
-*/
- derived_column
-
- ;
-
-parameter_ref:
- parameter
- ;
-
-/*
-op_like:
- '*'
- {
- $$ = newNode("*", SQL_NODE_PUNCTUATION);
- }
- | '?'
- {
- $$ = newNode("?", SQL_NODE_PUNCTUATION);
- }
- | op_like '*'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
- }
- | op_like '?'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("?", SQL_NODE_PUNCTUATION));
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_False);
- }
- ;
-*/
-
-literal:
-/* SQL_TOKEN_STRING
- | */SQL_TOKEN_INT
- | SQL_TOKEN_REAL_NUM
- | SQL_TOKEN_INTNUM
- | SQL_TOKEN_APPROXNUM
- | SQL_TOKEN_ACCESS_DATE
-/* rules for predicate check */
- | literal SQL_TOKEN_STRING
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
- }
- else
- YYERROR;
- }
- | literal SQL_TOKEN_INT
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
- }
- else
- YYERROR;
- }
- | literal SQL_TOKEN_REAL_NUM
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
- }
- else
- YYERROR;
- }
- | literal SQL_TOKEN_APPROXNUM
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- xxx_pGLOBAL_SQLPARSER->reduceLiteral($$, sal_True);
- }
- else
- YYERROR;
- }
- ;
-
- /* miscellaneous */
-as_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_AS column
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | column
- ;
-position_exp:
- SQL_TOKEN_POSITION '(' value_exp SQL_TOKEN_IN value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_POSITION '(' value_exp_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-num_value_fct:
- position_exp
- | extract_exp
- | length_exp
- ;
-char_length_exp:
- SQL_TOKEN_CHAR_LENGTH '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_SQL_TOKEN_INTNUM '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
-
- ;
-octet_length_exp:
- SQL_TOKEN_OCTET_LENGTH '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-bit_length_exp:
- SQL_TOKEN_BIT_LENGTH '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-length_exp:
- char_length_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | octet_length_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | bit_length_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-datetime_field:
- non_second_datetime_field
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_SECOND
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-extract_field:
- time_zone_field
- | datetime_field
- | value_exp
- ;
-time_zone_field:
- SQL_TOKEN_TIMEZONE_HOUR
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_TIMEZONE_MINUTE
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-extract_source:
- datetime_value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
-/* | interval_value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- } */
- ;
-extract_exp:
- SQL_TOKEN_EXTRACT '(' extract_field SQL_TOKEN_FROM value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-unsigned_value_spec:
- general_value_spec
- | literal
- ;
-general_value_spec:
- parameter
- | SQL_TOKEN_USER
- /* | SQL_TOKEN_NULL*/
- | SQL_TOKEN_FALSE
- | SQL_TOKEN_TRUE
- | SQL_TOKEN_VALUE
- | SQL_TOKEN_CURRENT_CATALOG
- | SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP
- | SQL_TOKEN_CURRENT_PATH
- | SQL_TOKEN_CURRENT_ROLE
- | SQL_TOKEN_CURRENT_SCHEMA
- | SQL_TOKEN_CURRENT_USER
- | SQL_TOKEN_SESSION_USER
- | SQL_TOKEN_SYSTEM_USER
- ;
-set_fct_spec:
- general_set_fct
- | '{' odbc_fct_spec '}'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("{", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION));
- }
- | function_name '(' ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name0 '(' ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name1 '(' function_arg ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name2 '(' function_arg_commalist2 ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name3 '(' function_arg_commalist3 ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | string_function_4Argument '(' function_arg_commalist4 ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name '(' function_args_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | function_name12 '(' function_args_commalist ')'
- {
- if ( $3->count() == 1 || $3->count() == 2 )
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- else
- YYERROR;
- }
- | function_name23 '(' function_args_commalist ')'
- {
- if ( $3->count() == 2 || $3->count() == 3)
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- else
- YYERROR;
- }
- ;
-function_name0:
- date_function_0Argument
- | numeric_function_0Argument
- ;
-function_name1:
- string_function_1Argument
- | date_function_1Argument
- | numeric_function_1Argument
- ;
-function_name2:
- string_function_2Argument
- | numeric_function_2Argument
- ;
-function_name12:
- SQL_TOKEN_ROUND
- | SQL_TOKEN_WEEK
- | SQL_TOKEN_LOGF
- | SQL_TOKEN_LOG
- ;
-function_name23:
- SQL_TOKEN_LOCATE
- | SQL_TOKEN_DATEDIFF
- ;
-function_name3:
- string_function_3Argument
- ;
-function_name:
- string_function
- | date_function
- | numeric_function
- | SQL_TOKEN_NAME
- ;
-string_function_1Argument:
- SQL_TOKEN_LENGTH
- | SQL_TOKEN_ASCII
- | SQL_TOKEN_LCASE
- | SQL_TOKEN_LTRIM
- | SQL_TOKEN_RTRIM
- | SQL_TOKEN_SPACE
- | SQL_TOKEN_UCASE
- ;
-
-string_function_2Argument:
- SQL_TOKEN_REPEAT
- | SQL_TOKEN_LEFT
- | SQL_TOKEN_RIGHT
- ;
-string_function_3Argument:
- SQL_TOKEN_REPLACE
- ;
-string_function_4Argument:
- SQL_TOKEN_INSERT
- ;
-
-string_function:
- SQL_TOKEN_CHAR
- | SQL_TOKEN_CONCAT
- | SQL_TOKEN_DIFFERENCE
- | SQL_TOKEN_LOCATE_2
- | SQL_TOKEN_SOUNDEX
- ;
-date_function_0Argument:
- SQL_TOKEN_CURDATE
- | SQL_TOKEN_CURTIME
- | SQL_TOKEN_NOW
- ;
-date_function_1Argument:
- SQL_TOKEN_DAYOFWEEK
- | SQL_TOKEN_DAYOFMONTH
- | SQL_TOKEN_DAYOFYEAR
- | SQL_TOKEN_MONTH
- | SQL_TOKEN_DAYNAME
- | SQL_TOKEN_MONTHNAME
- | SQL_TOKEN_QUARTER
- | SQL_TOKEN_HOUR
- | SQL_TOKEN_MINUTE
- | SQL_TOKEN_SECOND
- | SQL_TOKEN_YEAR
- | SQL_TOKEN_DAY
- | SQL_TOKEN_TIMEVALUE
- | SQL_TOKEN_DATEVALUE
- ;
-
-date_function:
- SQL_TOKEN_TIMESTAMPADD
- | SQL_TOKEN_TIMESTAMPDIFF
- ;
-numeric_function_0Argument:
- SQL_TOKEN_PI
- ;
-numeric_function_1Argument:
- SQL_TOKEN_ABS
- | SQL_TOKEN_ACOS
- | SQL_TOKEN_ASIN
- | SQL_TOKEN_ATAN
- | SQL_TOKEN_CEILING
- | SQL_TOKEN_COS
- | SQL_TOKEN_COT
- | SQL_TOKEN_DEGREES
- | SQL_TOKEN_FLOOR
- | SQL_TOKEN_SIGN
- | SQL_TOKEN_SIN
- | SQL_TOKEN_SQRT
- | SQL_TOKEN_TAN
- | SQL_TOKEN_EXP
- | SQL_TOKEN_LOG10
- | SQL_TOKEN_LN
- | SQL_TOKEN_RADIANS
- | SQL_TOKEN_ROUNDMAGIC
- ;
-numeric_function_2Argument:
- SQL_TOKEN_ATAN2
- | SQL_TOKEN_MOD
- | SQL_TOKEN_POWER
- ;
-numeric_function:
- SQL_TOKEN_RAND
- | SQL_TOKEN_TRUNCATE
- ;
-
-window_function:
- window_function_type SQL_TOKEN_OVER window_name_or_specification
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-window_function_type :
- rank_function_type '(' ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_ROW_NUMBER '(' ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | general_set_fct
- | ntile_function
- | lead_or_lag_function
- | first_or_last_value_function
- | nth_value_function
-;
-ntile_function :
- SQL_TOKEN_NTILE '(' number_of_tiles ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-dynamic_parameter_specification:
- parameter
- ;
-simple_value_specification:
- literal
- ;
-number_of_tiles :
- simple_value_specification
- | dynamic_parameter_specification
- ;
-opt_lead_or_lag_function:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | ',' offset
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($2);
- }
- | ',' offset ',' default_expression
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($4);
- }
- ;
-opt_null_treatment:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | null_treatment
- ;
-
-lead_or_lag_function:
- lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' opt_null_treatment
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($6);
- }
- ;
-lead_or_lag:
- SQL_TOKEN_LEAD
- | SQL_TOKEN_LAG
- ;
-lead_or_lag_extent:
- value_exp
- ;
-offset:
- SQL_TOKEN_INTNUM
- ;
-default_expression:
- value_exp
- ;
-null_treatment:
- SQL_TOKEN_RESPECT SQL_TOKEN_NULLS
- | SQL_TOKEN_IGNORE SQL_TOKEN_NULLS
- ;
-first_or_last_value_function:
- first_or_last_value '(' value_exp ')' opt_null_treatment
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($5);
- }
- ;
-first_or_last_value :
- SQL_TOKEN_FIRST_VALUE
- | SQL_TOKEN_LAST_VALUE
- ;
-opt_from_first_or_last:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | from_first_or_last
- ;
-nth_value_function:
- SQL_TOKEN_NTH_VALUE '(' value_exp ',' nth_row ')' opt_from_first_or_last opt_null_treatment
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($7);
- $$->append($8);
- }
- ;
-nth_row:
- simple_value_specification
- | dynamic_parameter_specification
- ;
-from_first_or_last:
- SQL_TOKEN_FROM SQL_TOKEN_FIRST
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_FROM SQL_TOKEN_LAST
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-window_name:
- SQL_TOKEN_NAME
- ;
-window_name_or_specification:
- window_name
- | in_line_window_specification
- ;
-in_line_window_specification:
- window_specification
- ;
-opt_window_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | window_clause
- ;
-window_clause:
- SQL_TOKEN_WINDOW window_definition_list
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-window_definition_list:
- window_definition_list ',' window_definition
- {$1->append($3);
- $$ = $1;}
- | window_definition
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- ;
-window_definition:
- new_window_name SQL_TOKEN_AS window_specification
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-new_window_name:
- window_name
- ;
-window_specification:
- '(' window_specification_details ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-opt_existing_window_name:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | existing_window_name
- ;
-opt_window_partition_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | window_partition_clause
- ;
-opt_window_frame_clause:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | window_frame_clause
- ;
-window_specification_details:
- opt_existing_window_name
- opt_window_partition_clause
- opt_order_by_clause
- opt_window_frame_clause
- ;
-existing_window_name:
- window_name
- ;
-window_partition_clause:
- SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-window_partition_column_reference_list:
- window_partition_column_reference_list ',' window_partition_column_reference
- {$1->append($3);
- $$ = $1;}
- | window_partition_column_reference
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- ;
-window_partition_column_reference:
- column_ref opt_collate_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-opt_window_frame_exclusion:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | window_frame_exclusion
- ;
-window_frame_clause:
- window_frame_units window_frame_extent opt_window_frame_exclusion
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-window_frame_units:
- SQL_TOKEN_ROWS
- | SQL_TOKEN_RANGE
- ;
-window_frame_extent:
- window_frame_start
- | window_frame_between
- ;
-window_frame_start:
- SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | window_frame_preceding
- | SQL_TOKEN_CURRENT SQL_TOKEN_ROW
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-window_frame_preceding:
- unsigned_value_spec SQL_TOKEN_PRECEDING
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-window_frame_between:
- SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-window_frame_bound_1:
- window_frame_bound
- ;
-window_frame_bound_2:
- window_frame_bound
- ;
-window_frame_bound:
- window_frame_start
- | SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | window_frame_following
- ;
-window_frame_following:
- unsigned_value_spec SQL_TOKEN_FOLLOWING
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-window_frame_exclusion:
- SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-op_parameter:
- {$$ = SQL_NEW_RULE;}
- | '?' SQL_EQUAL
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION));
- $$->append($2);
- }
- ;
-odbc_call_spec:
- op_parameter SQL_TOKEN_CALL table_node op_odbc_call_parameter
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-
-op_odbc_call_parameter:
- {$$ = SQL_NEW_RULE;}
- | '(' odbc_parameter_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-
-odbc_parameter_commalist:
- odbc_parameter
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | odbc_parameter_commalist ',' odbc_parameter
- {
- $1->append($3);
- $$ = $1;
- }
- ;
-odbc_parameter:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | literal
- | parameter
- ;
-
-odbc_fct_spec:
- odbc_fct_type SQL_TOKEN_STRING
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_FN set_fct_spec
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-
-odbc_fct_type:
- SQL_TOKEN_D
- | SQL_TOKEN_T
- | SQL_TOKEN_TS
- ;
-
-general_set_fct:
- set_fct_type '(' opt_all_distinct function_arg ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_COUNT '(' '*' ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | ordered_set_function
- | array_aggregate_function
- ;
-set_fct_type:
- SQL_TOKEN_AVG
- | SQL_TOKEN_MAX
- | SQL_TOKEN_MIN
- | SQL_TOKEN_SUM
- | SQL_TOKEN_EVERY
- | SQL_TOKEN_ANY
- | SQL_TOKEN_SOME
- | SQL_TOKEN_STDDEV_POP
- | SQL_TOKEN_STDDEV_SAMP
- | SQL_TOKEN_VAR_SAMP
- | SQL_TOKEN_VAR_POP
- | SQL_TOKEN_COLLECT
- | SQL_TOKEN_FUSION
- | SQL_TOKEN_INTERSECTION
- ;
-
-ordered_set_function:
- hypothetical_set_function
- | inverse_distribution_function
- ;
-hypothetical_set_function:
- rank_function_type '(' hypothetical_set_function_value_expression_list ')' within_group_specification
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($5);
- }
- | rank_function_type '(' hypothetical_set_function_value_expression_list SQL_TOKEN_BY value_exp_commalist ')' within_group_specification
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($7);
- }
- ;
-
-within_group_specification:
- {
- $$ = SQL_NEW_RULE;
- }
- | SQL_TOKEN_WITHIN SQL_TOKEN_GROUP '(' opt_order_by_clause ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-hypothetical_set_function_value_expression_list:
- value_exp_commalist
- ;
-
-inverse_distribution_function:
- inverse_distribution_function_type '('inverse_distribution_function_argument ')' within_group_specification
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-inverse_distribution_function_argument:
- num_value_exp
- ;
-inverse_distribution_function_type:
- SQL_TOKEN_PERCENTILE_CONT
- | SQL_TOKEN_PERCENTILE_DISC
- ;
-
-array_aggregate_function:
- SQL_TOKEN_ARRAY_AGG '(' value_exp opt_order_by_clause ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-
-rank_function_type:
- SQL_TOKEN_RANK
- | SQL_TOKEN_DENSE_RANK
- | SQL_TOKEN_PERCENT_RANK
- | SQL_TOKEN_CUME_DIST
- ;
-outer_join_type:
- SQL_TOKEN_LEFT %prec SQL_TOKEN_LEFT
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_RIGHT %prec SQL_TOKEN_RIGHT
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_FULL %prec SQL_TOKEN_FULL
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-join_condition:
- SQL_TOKEN_ON search_condition
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-join_spec:
- join_condition
- | named_columns_join
- ;
-join_type:
- /* empty */ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_INNER
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | outer_join_type
- | outer_join_type SQL_TOKEN_OUTER
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-cross_union:
- table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-
-qualified_join:
- /* wenn SQL_TOKEN_NATURAL, dann keine join_spec */
- table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- | table_ref join_type SQL_TOKEN_JOIN table_ref join_spec
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- | cross_union
- ;
-joined_table:
- qualified_join
- ;
-named_columns_join:
- SQL_TOKEN_USING '(' column_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-simple_table:
- select_statement
- | values_or_query_spec
- ;
-
-non_join_query_primary:
- simple_table
- | '(' non_join_query_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-non_join_query_term:
- non_join_query_primary
- | query_term SQL_TOKEN_INTERSECT all query_primary
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-query_primary:
- non_join_query_primary
- ;
-non_join_query_exp:
- non_join_query_term
- | query_exp SQL_TOKEN_UNION all query_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | query_exp SQL_TOKEN_EXCEPT all query_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-all:
- /* empty*/ {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ALL
- ;
-query_exp:
- non_join_query_exp /*[^')']*/
- ;
-scalar_subquery:
- subquery
- ;
-cast_operand:
- value_exp
- ;
-cast_target:
- table_node
- | data_type
- ;
-cast_spec:
- SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-value_exp_primary:
- unsigned_value_spec
- | column_ref
- | set_fct_spec
- | scalar_subquery
- | case_expression
- | window_function
- | '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | cast_spec
- ;
-
-num_primary:
- value_exp_primary
- | num_value_fct
- ;
-factor:
- num_primary
- | '-' num_primary %prec SQL_TOKEN_UMINUS
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("-", SQL_NODE_PUNCTUATION));
- $$->append($2);
- }
- | '+' num_primary %prec SQL_TOKEN_UMINUS
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($2);
- }
- ;
-
-term:
- factor
- | term '*' factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | term '/' factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- ;
-
-num_value_exp:
- term
- | num_value_exp '+' term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | num_value_exp '-' term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- ;
-datetime_primary:
-/* value_exp_primary
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- |*/ datetime_value_fct
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-datetime_value_fct:
- SQL_TOKEN_CURRENT_DATE
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_CURRENT_TIME
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | SQL_TOKEN_CURRENT_TIMESTAMP
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-time_zone:
- SQL_TOKEN_AT time_zone_specifier
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-time_zone_specifier:
- SQL_TOKEN_LOCAL
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
-/* | SQL_TOKEN_TIME SQL_TOKEN_ZONE interval_value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }*/
- ;
-datetime_factor:
- datetime_primary
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | datetime_primary time_zone
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-datetime_term:
- datetime_factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-/*
-interval_term:
- literal
- | interval_term '*' factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("*", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | interval_term '/' factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("/", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- ;
-*/
-datetime_value_exp:
- datetime_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
-/* | interval_value_exp '+' datetime_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | datetime_value_exp '+' interval_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | datetime_value_exp '-' interval_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
-*/ ;
-/*
-interval_value_exp:
- interval_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | interval_value_exp '+' interval_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | interval_value_exp '-' interval_term
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("-", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | '(' datetime_value_exp '-' datetime_term ')' interval_qualifier
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode("-", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- $$->append($6);
- }
- ;
-*/
-non_second_datetime_field:
- SQL_TOKEN_YEAR
- | SQL_TOKEN_MONTH
- | SQL_TOKEN_DAY
- | SQL_TOKEN_HOUR
- | SQL_TOKEN_MINUTE
- ;
-start_field:
- non_second_datetime_field opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-end_field:
- non_second_datetime_field
- | SQL_TOKEN_SECOND opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-
-single_datetime_field:
- non_second_datetime_field opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_SECOND opt_paren_precision_scale
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-
-interval_qualifier:
- start_field SQL_TOKEN_TO end_field
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | single_datetime_field
- ;
-
-function_arg_commalist2:
- function_arg ',' function_arg
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);
- $$->append($3);}
- ;
-function_arg_commalist3:
- function_arg ',' function_arg ',' function_arg
- {
- $$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);
- $$->append($3);
- $$->append($5);
- }
- ;
-function_arg_commalist4:
- function_arg ',' function_arg ',' function_arg ',' function_arg
- {
- $$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);
- $$->append($3);
- $$->append($5);
- $$->append($7);
- }
- ;
-value_exp_commalist:
- value_exp
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | value_exp_commalist ',' value_exp
- {$1->append($3);
- $$ = $1;}
- /* this rule is only valid if we check predicates */
- | value_exp_commalist ';' value_exp
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $1->append($3);
- $$ = $1;
- }
- else
- YYERROR;
- }
- ;
-function_arg:
- result
- | value_exp comparison value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | value_exp SQL_TOKEN_USING value_exp comparison value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | value_exp SQL_TOKEN_BY value_exp_commalist
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-function_args_commalist:
- function_arg
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | function_args_commalist ',' function_arg
- {$1->append($3);
- $$ = $1;}
- /* this rule is only valid if we check predicates */
- | function_args_commalist ';' function_arg
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())
- {
- $1->append($3);
- $$ = $1;
- }
- else
- YYERROR;
- }
- ;
-
-value_exp:
- num_value_exp /*[^')']*/
- | string_value_exp
- | datetime_value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-string_value_exp:
- char_value_exp
-/* | bit_value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
-*/ ;
-char_value_exp:
- char_factor
- | concatenation
- ;
-concatenation:
- char_value_exp '+' char_factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | value_exp SQL_CONCAT value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-
-char_primary:
- SQL_TOKEN_STRING
- | string_value_fct
- ;
-collate_clause:
- SQL_TOKEN_COLLATE table_node
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-char_factor:
- char_primary
- | char_primary collate_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-string_value_fct:
- char_value_fct
- | bit_value_fct
- ;
-bit_value_fct:
- bit_substring_fct
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-bit_substring_fct:
- SQL_TOKEN_SUBSTRING '(' bit_value_exp SQL_TOKEN_FROM string_value_exp for_length ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-bit_value_exp:
- bit_factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-/*
- bit_concatenation
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- |
-bit_concatenation:
- bit_value_exp '+' bit_factor
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("+", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- ;
-*/
-bit_factor:
- bit_primary
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-bit_primary:
- {$$ = SQL_NEW_RULE;}
-/* value_exp_primary
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | string_value_fct
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }*/
- ;
-char_value_fct:
- char_substring_fct
- | fold
- | form_conversion
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | char_translation
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- | trim_fct
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- }
- ;
-for_length:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_FOR value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-char_substring_fct:
- SQL_TOKEN_SUBSTRING '(' value_exp SQL_TOKEN_FROM value_exp for_length ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_SUBSTRING '(' value_exp_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-upper_lower:
- SQL_TOKEN_UPPER
- | SQL_TOKEN_LOWER
- ;
-fold:
- upper_lower '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-form_conversion:
- SQL_TOKEN_CONVERT '(' string_value_exp SQL_TOKEN_USING table_node ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_CONVERT '(' cast_operand ',' cast_target ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($2 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-char_translation:
- SQL_TOKEN_TRANSLATE '(' string_value_exp SQL_TOKEN_USING table_node ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-trim_fct:
- SQL_TOKEN_TRIM '(' trim_operands ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-trim_operands:
- trim_spec value_exp SQL_TOKEN_FROM value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | trim_spec SQL_TOKEN_FROM value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | value_exp SQL_TOKEN_FROM value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_FROM value_exp
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | value_exp
- ;
-
-trim_spec:
- SQL_TOKEN_BOTH
- | SQL_TOKEN_LEADING
- | SQL_TOKEN_TRAILING
- ;
-
-derived_column:
- value_exp as_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-/* Tabellenname */
-table_node:
- table_name
- | schema_name
- | catalog_name
-;
-catalog_name:
- SQL_TOKEN_NAME '.' schema_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | SQL_TOKEN_NAME ':' schema_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(":", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
-;
-schema_name:
- SQL_TOKEN_NAME '.' table_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
-;
-
-table_name:
- SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
-;
-/* Columns */
-column_ref:
- column
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
-/* | table_node '.' column_val %prec '.'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);}
-*/
- | SQL_TOKEN_NAME '.' column_val %prec '.'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- }
- | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($5);}
- | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2= newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($7);
- }
- | SQL_TOKEN_NAME ':' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2= newNode(":", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($7);
- }
-/* | SQL_TOKEN_NAME ';' SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2= newNode(";", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($5);
- $$->append($6 = newNode(".", SQL_NODE_PUNCTUATION));
- $$->append($7);
- }
-*/ ;
-
- /* data types */
-column_val:
- column
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
- | '*'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("*", SQL_NODE_PUNCTUATION));
- }
- ;
-data_type:
- predefined_type
- ;
-opt_char_set_spec:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_CHARACTER SQL_TOKEN_SET SQL_TOKEN_NAME
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-opt_collate_clause:
- {$$ = SQL_NEW_RULE;}
- | collate_clause
- ;
-predefined_type:
- character_string_type opt_char_set_spec opt_collate_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | national_character_string_type opt_collate_clause
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | binary_string_type
- | numeric_type
- | boolean_type
- | datetime_type
- | interval_type
- ;
-character_string_type:
- SQL_TOKEN_CHARACTER opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_CHAR opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_VARCHAR paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | character_large_object_type
- ;
-opt_paren_precision:
- {$$ = SQL_NEW_RULE;}
- | paren_char_length
- ;
-paren_char_length:
- '(' SQL_TOKEN_INTNUM ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-opt_paren_char_large_length:
- {$$ = SQL_NEW_RULE;}
- | paren_character_large_object_length
- ;
-paren_character_large_object_length:
- '(' large_object_length ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-
-large_object_length:
- SQL_TOKEN_INTNUM opt_multiplier
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-opt_multiplier:
- {$$ = SQL_NEW_RULE;}
- | 'K'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("K", SQL_NODE_PUNCTUATION));
- }
- | 'M'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("M", SQL_NODE_PUNCTUATION));
- }
- | 'G'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("G", SQL_NODE_PUNCTUATION));
- }
- | 'T'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("T", SQL_NODE_PUNCTUATION));
- }
- | 'P'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("P", SQL_NODE_PUNCTUATION));
- }
- ;
-character_large_object_type:
- SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_CHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_CLOB opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-national_character_string_type:
- SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_NCHAR opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_NATIONAL SQL_TOKEN_CHAR SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_NCHAR SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | national_character_large_object_type
- ;
-national_character_large_object_type:
- SQL_TOKEN_NATIONAL SQL_TOKEN_CHARACTER SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- | SQL_TOKEN_NCHAR SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_NCLOB opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-binary_string_type:
- SQL_TOKEN_BINARY opt_paren_precision
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_BINARY SQL_TOKEN_VARYING paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_VARBINARY paren_char_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | binary_large_object_string_type
- ;
-binary_large_object_string_type:
- SQL_TOKEN_BINARY SQL_TOKEN_LARGE SQL_TOKEN_OBJECT opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_BLOB opt_paren_char_large_length
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-numeric_type:
- exact_numeric_type
- | approximate_numeric_type
- ;
-opt_paren_precision_scale:
- {$$ = SQL_NEW_RULE;}
- | '(' SQL_TOKEN_INTNUM ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | '(' SQL_TOKEN_INTNUM ',' SQL_TOKEN_INTNUM ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode(",", SQL_NODE_PUNCTUATION));
- $$->append($4);
- $$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-exact_numeric_type:
- SQL_TOKEN_NUMERIC opt_paren_precision_scale
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_DECIMAL opt_paren_precision_scale
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_DEC opt_paren_precision_scale
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- | SQL_TOKEN_SMALLINT
- | SQL_TOKEN_INTEGER
- | SQL_TOKEN_INT
- | SQL_TOKEN_BIGINT
- ;
-approximate_numeric_type:
- SQL_TOKEN_FLOAT '(' SQL_TOKEN_INTNUM ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_FLOAT
- | SQL_TOKEN_REAL
- | SQL_TOKEN_DOUBLE
- | SQL_TOKEN_DOUBLE SQL_TOKEN_PRECISION
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-boolean_type:
- SQL_TOKEN_BOOLEAN
-;
-datetime_type:
- SQL_TOKEN_DATE
- | SQL_TOKEN_TIME opt_paren_precision opt_with_or_without_time_zone
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_TIMESTAMP opt_paren_precision opt_with_or_without_time_zone
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-opt_with_or_without_time_zone:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_WITH SQL_TOKEN_TIME SQL_TOKEN_ZONE
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- | SQL_TOKEN_WITHOUT SQL_TOKEN_TIME SQL_TOKEN_ZONE
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-interval_type:
- SQL_TOKEN_INTERVAL interval_qualifier
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
- /* the various things you can name */
-
-column:
- SQL_TOKEN_NAME
- | SQL_TOKEN_POSITION
- {
- sal_uInt32 nNod = $$->getRuleID();
- delete $$;
- $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
- }
- | SQL_TOKEN_CHAR_LENGTH
- {
- sal_uInt32 nNod = $$->getRuleID();
- delete $$;
- $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
- }
- | SQL_TOKEN_EXTRACT
- {
- sal_uInt32 nNod = $$->getRuleID();
- delete $$;
- $$ = newNode(xxx_pGLOBAL_SQLPARSER->TokenIDToStr(nNod), SQL_NODE_NAME);
- }
- ;
-case_expression:
- case_abbreviation
- | case_specification
- ;
-case_abbreviation:
- SQL_TOKEN_NULLIF '(' value_exp_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_COALESCE '(' value_exp ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- | SQL_TOKEN_COALESCE '(' value_exp_commalist ')'
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
- $$->append($3);
- $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));
- }
- ;
-case_specification:
- simple_case
- | searched_case
- ;
-simple_case:
- SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- }
- ;
-searched_case:
- SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-simple_when_clause_list:
- simple_when_clause
- {
- $$ = SQL_NEW_LISTRULE;
- $$->append($1);
- }
- | searched_when_clause_list simple_when_clause
- {
- $1->append($2);
- $$ = $1;
- }
- ;
-simple_when_clause:
- SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-when_operand_list:
- when_operand
- {$$ = SQL_NEW_COMMALISTRULE;
- $$->append($1);}
- | when_operand_list ',' when_operand
- {$1->append($3);
- $$ = $1;}
- ;
-when_operand:
- row_value_constructor_elem
- | comparison_predicate_part_2
- | between_predicate_part_2
- | in_predicate_part_2
- | character_like_predicate_part_2
- | null_predicate_part_2
-;
-searched_when_clause_list:
- searched_when_clause
- {
- $$ = SQL_NEW_LISTRULE;
- $$->append($1);
- }
- | searched_when_clause_list searched_when_clause
- {
- $1->append($2);
- $$ = $1;
- }
- ;
-searched_when_clause:
- SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- ;
-else_clause:
- {$$ = SQL_NEW_RULE;}
- | SQL_TOKEN_ELSE result
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-result:
- result_expression
- | SQL_TOKEN_NULL
- ;
-result_expression:
- value_exp
- ;
-case_operand:
- row_value_constructor_elem
- ;
-
-cursor: SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
- ;
-
-/***
-module: SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
- ;
-***/
-
-parameter:
- ':' SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode(":", SQL_NODE_PUNCTUATION));
- $$->append($2);}
- | '?'
- {$$ = SQL_NEW_RULE; // test
- $$->append($1 = newNode("?", SQL_NODE_PUNCTUATION));}
- | '[' SQL_TOKEN_NAME ']'
- {$$ = SQL_NEW_RULE;
- $$->append($1 = newNode("[", SQL_NODE_PUNCTUATION));
- $$->append($2);
- $$->append($3 = newNode("]", SQL_NODE_PUNCTUATION));}
- ;
-
-/***
-procedure: SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1);}
- ;
-***/
-
-range_variable:
- {$$ = SQL_NEW_RULE;}
- | opt_as SQL_TOKEN_NAME
- {$$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-
-user: SQL_TOKEN_NAME
- ;
-
-/* PREDICATECHECK RULES */
-sql:
- search_condition /* checking predicats */
- {
- if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // sql: rule 1
- {
- $$ = $1;
- if ( SQL_ISRULE($$,search_condition) )
- {
- $$->insert(0,newNode("(", SQL_NODE_PUNCTUATION));
- $$->append(newNode(")", SQL_NODE_PUNCTUATION));
- }
- }
- else
- YYERROR;
- }
- | '(' sql ')' /* checking predicats */
- ;
-trigger_definition:
- SQL_TOKEN_CREATE SQL_TOKEN_TRIGGER trigger_name trigger_action_time trigger_event SQL_TOKEN_ON table_name op_referencing triggered_action
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- $$->append($5);
- $$->append($6);
- $$->append($7);
- $$->append($8);
- $$->append($9);
- }
- ;
-op_referencing:
- {
- $$ = SQL_NEW_RULE;
- }
- | SQL_TOKEN_REFERENCING transition_table_or_variable_list
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-trigger_action_time:
- SQL_TOKEN_BEFORE
- | SQL_TOKEN_AFTER
- | SQL_TOKEN_INSTEAD SQL_TOKEN_OF
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
-;
-trigger_event:
- SQL_TOKEN_INSERT
- | SQL_TOKEN_DELETE
- | SQL_TOKEN_UPDATE op_trigger_columnlist
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-op_trigger_columnlist:
- {
- $$ = SQL_NEW_RULE;
- }
- | SQL_TOKEN_OF trigger_column_list
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-trigger_column_list:
- column_commalist
- ;
-triggered_action:
- op_triggered_action_for triggered_when_clause triggered_SQL_statement
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-op_triggered_action_for:
- {
- $$ = SQL_NEW_RULE;
- }
- | SQL_TOKEN_FOR SQL_TOKEN_EACH trigger_for
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- }
- ;
-trigger_for:
- SQL_TOKEN_ROW
- | SQL_TOKEN_STATEMENT
- ;
-triggered_when_clause:
- {
- $$ = SQL_NEW_RULE;
- }
- | SQL_TOKEN_WHEN parenthesized_boolean_value_expression
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- }
- ;
-triggered_SQL_statement:
- SQL_procedure_statement
- | SQL_TOKEN_BEGIN SQL_TOKEN_ATOMIC SQL_procedure_statement_list ';' SQL_TOKEN_END
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4 = newNode(";", SQL_NODE_PUNCTUATION));
- $$->append($5);
- }
- ;
-SQL_procedure_statement_list:
- SQL_procedure_statement
- {
- $$ = SQL_NEW_LISTRULE;
- $$->append($1);
- }
- | SQL_procedure_statement_list ';' SQL_procedure_statement
- {
- $1->append($3);
- $$ = $1;
- }
- ;
-SQL_procedure_statement:
- sql
- ;
-
-transition_table_or_variable_list:
- transition_table_or_variable
- {
- $$ = SQL_NEW_LISTRULE;
- $$->append($1);
- }
- | transition_table_or_variable_list transition_table_or_variable
- {
- $1->append($2);
- $$ = $1;
- }
- ;
-
-transition_table_or_variable:
- SQL_TOKEN_OLD opt_row opt_as old_transition_variable_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_NEW opt_row opt_as new_transition_variable_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_OLD SQL_TOKEN_TABLE opt_as old_transition_table_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
- | SQL_TOKEN_NEW SQL_TOKEN_TABLE opt_as new_transition_table_name
- {
- $$ = SQL_NEW_RULE;
- $$->append($1);
- $$->append($2);
- $$->append($3);
- $$->append($4);
- }
-;
-old_transition_table_name:
- transition_table_name
-;
-new_transition_table_name:
- transition_table_name
-;
-transition_table_name:
- SQL_TOKEN_NAME
-;
-old_transition_variable_name:
- SQL_TOKEN_NAME
-;
-new_transition_variable_name:
- SQL_TOKEN_NAME
-;
-trigger_name:
- SQL_TOKEN_NAME
-;
-%%
-
-
-using namespace ::com::sun::star::sdbc;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::i18n;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::util;
-using namespace ::osl;
-using namespace ::dbtools;
-
-//============================================================
-//= a helper for static ascii pseudo-unicode strings
-//============================================================
-// string constants
-struct _ConstAsciiString_
-{
- sal_Int32 length;
- sal_Char const* str;
-
- operator rtl::OUString () const { return rtl::OUString(str, length, RTL_TEXTENCODING_ASCII_US); }
- operator const sal_Char * () const { return str; }
- operator ::rtl::OString() const { return str; }
-};
-
-#define IMPLEMENT_CONSTASCII_STRING( name, string ) \
- _ConstAsciiString_ const name = { sizeof(string)-1, string }
-
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_GENERAL, "Syntax error in SQL expression");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_VALUE_NO_LIKE, "The value #1 can not be used with LIKE.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_FIELD_NO_LIKE, "LIKE can not be used with this field.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COMPARE, "The entered criterion can not be compared with this field.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_DATE_COMPARE, "The field can not be compared with a date.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_REAL_COMPARE, "The field can not be compared with a floating point number.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_INT_COMPARE, "The field can not be compared with a number.");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE, "The database does not contain a table named \"#\".");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_OR_QUERY, "The database does contain neither a table nor a query named \"#\".");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_COLUMN, "The column \"#1\" is unknown in the table \"#2\".");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_TABLE_EXIST, "The database already contains a table or view with name \"#\".");
-IMPLEMENT_CONSTASCII_STRING(ERROR_STR_INVALID_QUERY_EXIST, "The database already contains a query with name \"#\".");
-
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_LIKE, "LIKE");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_NOT, "NOT");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_NULL, "NULL");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_TRUE, "True");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_FALSE, "False");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_IS, "IS");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_BETWEEN, "BETWEEN");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_OR, "OR");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_AND, "AND");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_AVG, "AVG");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_COUNT, "COUNT");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_MAX, "MAX");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_MIN, "MIN");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_SUM, "SUM");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_EVERY, "EVERY");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_ANY, "ANY");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_SOME, "SOME");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_POP, "STDDEV_POP");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_STDDEV_SAMP, "STDDEV_SAMP");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_SAMP, "VAR_SAMP");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_VAR_POP, "VAR_POP");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_COLLECT, "COLLECT");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_FUSION, "FUSION");
-IMPLEMENT_CONSTASCII_STRING(KEY_STR_INTERSECTION, "INTERSECTION");
-
-IMPLEMENT_CONSTASCII_STRING(FIELD_STR_NULLDATE, "NullDate");
-
-IMPLEMENT_CONSTASCII_STRING(STR_SQL_TOKEN, "SQL_TOKEN_");
-
-//==========================================================================
-//= OParseContext
-//==========================================================================
-//-----------------------------------------------------------------------------
-OParseContext::OParseContext()
-{
-}
-
-//-----------------------------------------------------------------------------
-OParseContext::~OParseContext()
-{
-}
-
-//-----------------------------------------------------------------------------
-::rtl::OUString OParseContext::getErrorMessage(ErrorCode _eCode) const
-{
- ::rtl::OUString aMsg;
- switch (_eCode)
- {
- case ERROR_GENERAL: aMsg = ERROR_STR_GENERAL; break;
- case ERROR_VALUE_NO_LIKE: aMsg = ERROR_STR_VALUE_NO_LIKE; break;
- case ERROR_FIELD_NO_LIKE: aMsg = ERROR_STR_FIELD_NO_LIKE; break;
- case ERROR_INVALID_COMPARE: aMsg = ERROR_STR_INVALID_COMPARE; break;
- case ERROR_INVALID_INT_COMPARE: aMsg = ERROR_STR_INVALID_INT_COMPARE; break;
- case ERROR_INVALID_DATE_COMPARE: aMsg = ERROR_STR_INVALID_DATE_COMPARE; break;
- case ERROR_INVALID_REAL_COMPARE: aMsg = ERROR_STR_INVALID_REAL_COMPARE; break;
- case ERROR_INVALID_TABLE: aMsg = ERROR_STR_INVALID_TABLE; break;
- case ERROR_INVALID_TABLE_OR_QUERY: aMsg = ERROR_STR_INVALID_TABLE_OR_QUERY; break;
- case ERROR_INVALID_COLUMN: aMsg = ERROR_STR_INVALID_COLUMN; break;
- case ERROR_INVALID_TABLE_EXIST: aMsg = ERROR_STR_INVALID_TABLE_EXIST; break;
- case ERROR_INVALID_QUERY_EXIST: aMsg = ERROR_STR_INVALID_QUERY_EXIST; break;
- default:
- OSL_FAIL( "OParseContext::getErrorMessage: unknown error code!" );
- break;
- }
- return aMsg;
-}
-
-//-----------------------------------------------------------------------------
-::rtl::OString OParseContext::getIntlKeywordAscii(InternationalKeyCode _eKey) const
-{
- ::rtl::OString aKeyword;
- switch (_eKey)
- {
- case KEY_LIKE: aKeyword = KEY_STR_LIKE; break;
- case KEY_NOT: aKeyword = KEY_STR_NOT; break;
- case KEY_NULL: aKeyword = KEY_STR_NULL; break;
- case KEY_TRUE: aKeyword = KEY_STR_TRUE; break;
- case KEY_FALSE: aKeyword = KEY_STR_FALSE; break;
- case KEY_IS: aKeyword = KEY_STR_IS; break;
- case KEY_BETWEEN: aKeyword = KEY_STR_BETWEEN; break;
- case KEY_OR: aKeyword = KEY_STR_OR; break;
- case KEY_AND: aKeyword = KEY_STR_AND; break;
- case KEY_AVG: aKeyword = KEY_STR_AVG; break;
- case KEY_COUNT: aKeyword = KEY_STR_COUNT; break;
- case KEY_MAX: aKeyword = KEY_STR_MAX; break;
- case KEY_MIN: aKeyword = KEY_STR_MIN; break;
- case KEY_SUM: aKeyword = KEY_STR_SUM; break;
- case KEY_EVERY: aKeyword = KEY_STR_EVERY; break;
- case KEY_ANY: aKeyword = KEY_STR_ANY; break;
- case KEY_SOME: aKeyword = KEY_STR_SOME; break;
- case KEY_STDDEV_POP: aKeyword = KEY_STR_STDDEV_POP; break;
- case KEY_STDDEV_SAMP: aKeyword = KEY_STR_STDDEV_SAMP; break;
- case KEY_VAR_SAMP: aKeyword = KEY_STR_VAR_SAMP; break;
- case KEY_VAR_POP: aKeyword = KEY_STR_VAR_POP; break;
- case KEY_COLLECT: aKeyword = KEY_STR_COLLECT; break;
- case KEY_FUSION: aKeyword = KEY_STR_FUSION; break;
- case KEY_INTERSECTION:aKeyword = KEY_STR_INTERSECTION; break;
- case KEY_NONE: break;
- default:
- OSL_FAIL( "OParseContext::getIntlKeywordAscii: unknown key!" );
- break;
- }
- return aKeyword;
-}
-
-//-----------------------------------------------------------------------------
-IParseContext::InternationalKeyCode OParseContext::getIntlKeyCode(const ::rtl::OString& rToken) const
-{
- static IParseContext::InternationalKeyCode Intl_TokenID[] =
- {
- KEY_LIKE, KEY_NOT, KEY_NULL, KEY_TRUE,
- KEY_FALSE, KEY_IS, KEY_BETWEEN, KEY_OR,
- KEY_AND, KEY_AVG, KEY_COUNT, KEY_MAX,
- KEY_MIN, KEY_SUM, KEY_EVERY,KEY_ANY,KEY_SOME,
- KEY_STDDEV_POP,KEY_STDDEV_SAMP,KEY_VAR_SAMP,
- KEY_VAR_POP,KEY_COLLECT,KEY_FUSION,KEY_INTERSECTION
- };
-
- sal_uInt32 nCount = SAL_N_ELEMENTS( Intl_TokenID );
- for (sal_uInt32 i = 0; i < nCount; i++)
- {
- ::rtl::OString aKey = getIntlKeywordAscii(Intl_TokenID[i]);
- if (rToken.equalsIgnoreAsciiCase(aKey))
- return Intl_TokenID[i];
- }
-
- return KEY_NONE;
-}
-
-//------------------------------------------------------------------------------
-static Locale& impl_getLocaleInstance( )
-{
- static Locale s_aLocale(
- ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "en" ) ),
- ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "US" ) ),
- ::rtl::OUString( )
- );
- return s_aLocale;
-}
-
-//------------------------------------------------------------------------------
-void OParseContext::setDefaultLocale( const ::com::sun::star::lang::Locale& _rLocale )
-{
- impl_getLocaleInstance() = _rLocale;
-}
-
-//------------------------------------------------------------------------------
-Locale OParseContext::getPreferredLocale( ) const
-{
- return getDefaultLocale();
-}
-
-//------------------------------------------------------------------------------
-const Locale& OParseContext::getDefaultLocale()
-{
- return impl_getLocaleInstance();
-}
-
-//==========================================================================
-//= misc
-//==========================================================================
-// Der (leider globale) yylval fuer die Uebergabe von
-// Werten vom Scanner an den Parser. Die globale Variable
-// wird nur kurzzeitig verwendet, der Parser liest die Variable
-// sofort nach dem Scanner-Aufruf in eine gleichnamige eigene
-// Member-Variable.
-
-const double fMilliSecondsPerDay = 86400000.0;
-
-//------------------------------------------------------------------------------
-
-
-//------------------------------------------------------------------
-::rtl::OUString ConvertLikeToken(const OSQLParseNode* pTokenNode, const OSQLParseNode* pEscapeNode, sal_Bool bInternational)
-{
- ::rtl::OUStringBuffer aMatchStr;
- if (pTokenNode->isToken())
- {
- sal_Unicode cEscape = 0;
- if (pEscapeNode->count())
- cEscape = pEscapeNode->getChild(1)->getTokenValue().toChar();
-
- // Platzhalter austauschen
- aMatchStr = pTokenNode->getTokenValue();
- const sal_Int32 nLen = aMatchStr.getLength();
- ::rtl::OUStringBuffer sSearch,sReplace;
- if ( bInternational )
- {
- sSearch.appendAscii("%_",2);
- sReplace.appendAscii("*?",2);
- }
- else
- {
- sSearch.appendAscii("*?",2);
- sReplace.appendAscii("%_",2);
- }
-
- for (sal_Int32 i = 0; i < nLen; i++)
- {
- const sal_Unicode c = aMatchStr.charAt(i);
- if (c == sSearch.charAt(0) || c == sSearch.charAt(1))
- {
- if (i > 0 && aMatchStr.charAt(i-1) == cEscape)
- continue;
- else
- {
- const sal_Unicode cCharacter = sReplace.charAt( (c == sSearch.charAt(0)) ? 0 : 1);
- aMatchStr.setCharAt(i , cCharacter);
- }
- }
- }
- }
- return aMatchStr.makeStringAndClear();
-}
-
-//==========================================================================
-//= OSQLParser
-//==========================================================================
-
-sal_uInt32 OSQLParser::s_nRuleIDs[OSQLParseNode::rule_count + 1];
-OSQLParser::RuleIDMap OSQLParser::s_aReverseRuleIDLookup;
-OParseContext OSQLParser::s_aDefaultContext;
-
-sal_Int32 OSQLParser::s_nRefCount = 0;
-// ::osl::Mutex OSQLParser::s_aMutex;
-OSQLScanner* OSQLParser::s_pScanner = 0;
-OSQLParseNodesGarbageCollector* OSQLParser::s_pGarbageCollector = 0;
-::com::sun::star::uno::Reference< ::com::sun::star::i18n::XLocaleData> OSQLParser::s_xLocaleData = NULL;
-//-----------------------------------------------------------------------------
-void setParser(OSQLParser* _pParser)
-{
- xxx_pGLOBAL_SQLPARSER = _pParser;
-}
-// -------------------------------------------------------------------------
-void OSQLParser::setParseTree(OSQLParseNode * pNewParseTree)
-{
- ::osl::MutexGuard aGuard(getMutex());
- m_pParseTree = pNewParseTree;
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::parseTree(::rtl::OUString& rErrorMessage,
- const ::rtl::OUString& rStatement,
- sal_Bool bInternational)
-{
-
-
- // Guard the parsing
- ::osl::MutexGuard aGuard(getMutex());
- // must be reset
- setParser(this);
-
- // defines how to scan
- s_pScanner->SetRule(s_pScanner->GetSQLRule()); // initial
- s_pScanner->prepareScan(rStatement, m_pContext, bInternational);
-
- SQLyylval.pParseNode = NULL;
- // SQLyypvt = NULL;
- m_pParseTree = NULL;
- m_sErrorMessage = ::rtl::OUString();
-
- // ... und den Parser anwerfen ...
- if (SQLyyparse() != 0)
- {
- // only set the error message, if it's not already set
- if (!m_sErrorMessage.getLength())
- m_sErrorMessage = s_pScanner->getErrorMessage();
- if (!m_sErrorMessage.getLength())
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_GENERAL);
-
- rErrorMessage = m_sErrorMessage;
-
- // clear the garbage collector
- (*s_pGarbageCollector)->clearAndDelete();
- return NULL;
- }
- else
- {
- (*s_pGarbageCollector)->clear();
-
- // Das Ergebnis liefern (den Root Parse Node):
-
- // OSL_ENSURE(Sdbyyval.pParseNode != NULL,"OSQLParser: Parser hat keinen ParseNode geliefert");
- // return Sdbyyval.pParseNode;
- // geht nicht wegen Bug in MKS YACC-erzeugtem Code (es wird ein falscher ParseNode
- // geliefert).
-
- // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree
- // - einfach diesen zurueckliefern:
- OSL_ENSURE(m_pParseTree != NULL,"OSQLParser: Parser hat keinen ParseTree geliefert");
- return m_pParseTree;
- }
-}
-//-----------------------------------------------------------------------------
-::rtl::OString OSQLParser::TokenIDToStr(sal_uInt32 nTokenID, const IParseContext* pContext)
-{
- ::rtl::OString aStr;
- if (pContext)
- {
- IParseContext::InternationalKeyCode eKeyCode = IParseContext::KEY_NONE;
- switch( nTokenID )
- {
- case SQL_TOKEN_LIKE: eKeyCode = IParseContext::KEY_LIKE; break;
- case SQL_TOKEN_NOT: eKeyCode = IParseContext::KEY_NOT; break;
- case SQL_TOKEN_NULL: eKeyCode = IParseContext::KEY_NULL; break;
- case SQL_TOKEN_TRUE: eKeyCode = IParseContext::KEY_TRUE; break;
- case SQL_TOKEN_FALSE: eKeyCode = IParseContext::KEY_FALSE; break;
- case SQL_TOKEN_IS: eKeyCode = IParseContext::KEY_IS; break;
- case SQL_TOKEN_BETWEEN: eKeyCode = IParseContext::KEY_BETWEEN; break;
- case SQL_TOKEN_OR: eKeyCode = IParseContext::KEY_OR; break;
- case SQL_TOKEN_AND: eKeyCode = IParseContext::KEY_AND; break;
- case SQL_TOKEN_AVG: eKeyCode = IParseContext::KEY_AVG; break;
- case SQL_TOKEN_COUNT: eKeyCode = IParseContext::KEY_COUNT; break;
- case SQL_TOKEN_MAX: eKeyCode = IParseContext::KEY_MAX; break;
- case SQL_TOKEN_MIN: eKeyCode = IParseContext::KEY_MIN; break;
- case SQL_TOKEN_SUM: eKeyCode = IParseContext::KEY_SUM; break;
- }
- if ( eKeyCode != IParseContext::KEY_NONE )
- aStr = pContext->getIntlKeywordAscii(eKeyCode);
- }
-
- if (!aStr.getLength())
- {
- aStr = yytname[YYTRANSLATE(nTokenID)];
- if(!aStr.compareTo("SQL_TOKEN_",10))
- aStr = aStr.copy(10);
- }
- return aStr;
-}
-
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParser::RuleIDToStr(sal_uInt32 nRuleID)
-{
- OSL_ENSURE(nRuleID < SAL_N_ELEMENTS(yytname), "OSQLParser::RuleIDToStr: Invalid nRuleId!");
- return ::rtl::OUString::createFromAscii(yytname[nRuleID]);
-}
-
-//-----------------------------------------------------------------------------
-sal_uInt32 OSQLParser::StrToRuleID(const ::rtl::OString & rValue)
-{
- // In yysvar nach dem angegebenen Namen suchen, den Index zurueckliefern
- // (oder 0, wenn nicht gefunden)
- static sal_uInt32 nLen = SAL_N_ELEMENTS(yytname);
- for (sal_uInt32 i = YYTRANSLATE(SQL_TOKEN_INVALIDSYMBOL); i < (nLen-1); i++)
- {
- if (yytname && rValue == yytname[i])
- return i;
- }
-
- // Nicht gefunden
- return 0;
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseNode::Rule OSQLParser::RuleIDToRule( sal_uInt32 _nRule )
-{
- return s_aReverseRuleIDLookup[ _nRule ];
-}
-
-//-----------------------------------------------------------------------------
-sal_uInt32 OSQLParser::RuleID(OSQLParseNode::Rule eRule)
-{
- return s_nRuleIDs[(sal_uInt16)eRule];
-}
-// -------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2)
-{
- OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref));
- pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME));
- OSQLParseNode* pComp = NULL;
- if ( SQL_ISTOKEN( pCompare, BETWEEN) && pLiteral2 )
- pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate_part_2));
- else
- pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate));
-
- pComp->append(pColumnRef);
- pComp->append(pCompare);
- pComp->append(pLiteral);
- if ( pLiteral2 )
- {
- pComp->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD,SQL_TOKEN_AND));
- pComp->append(pLiteral2);
- }
- pAppend->append(pComp);
- return 1;
-}
-//-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildStringNodes(OSQLParseNode*& pLiteral)
-{
- if(!pLiteral)
- return 1;
-
- if(SQL_ISRULE(pLiteral,set_fct_spec) || SQL_ISRULE(pLiteral,general_set_fct) || SQL_ISRULE(pLiteral,column_ref)
- || SQL_ISRULE(pLiteral,subquery))
- return 1; // here I have a function that I can't transform into a string
-
- if(pLiteral->getNodeType() == SQL_NODE_INTNUM || pLiteral->getNodeType() == SQL_NODE_APPROXNUM || pLiteral->getNodeType() == SQL_NODE_ACCESS_DATE)
- {
- OSQLParseNode* pParent = pLiteral->getParent();
-
- OSQLParseNode* pNewNode = new OSQLInternalNode(pLiteral->getTokenValue(), SQL_NODE_STRING);
- pParent->replace(pLiteral, pNewNode);
- delete pLiteral;
- pLiteral = NULL;
- return 1;
- }
-
- for(sal_uInt32 i=0;i<pLiteral->count();++i)
- {
- OSQLParseNode* pChild = pLiteral->getChild(i);
- buildStringNodes(pChild);
- }
- if(SQL_ISRULE(pLiteral,term) || SQL_ISRULE(pLiteral,value_exp_primary))
- {
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE);
- return 0;
- }
- return 1;
-}
-//-----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral)
-{
- OSQLParseNode* pComp = new OSQLInternalNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")), SQL_NODE_EQUAL);
- return buildPredicateRule(pAppend,pLiteral,pComp);
-}
-
-
-//-----------------------------------------------------------------------------
-void OSQLParser::reduceLiteral(OSQLParseNode*& pLiteral, sal_Bool bAppendBlank)
-{
- OSL_ENSURE(pLiteral->isRule(), "This is no ::com::sun::star::chaos::Rule");
- OSL_ENSURE(pLiteral->count() == 2, "OSQLParser::ReduceLiteral() Invalid count");
- OSQLParseNode* pTemp = pLiteral;
- ::rtl::OUStringBuffer aValue(pLiteral->getChild(0)->getTokenValue());
- if (bAppendBlank)
- {
- aValue.appendAscii(" ");
- }
-
- aValue.append(pLiteral->getChild(1)->getTokenValue());
-
- pLiteral = new OSQLInternalNode(aValue.makeStringAndClear(),SQL_NODE_STRING);
- delete pTemp;
-}
-
-// -------------------------------------------------------------------------
-void OSQLParser::error(const sal_Char *fmt)
-{
- if(!m_sErrorMessage.getLength())
- {
- ::rtl::OUString sStr(fmt,strlen(fmt),RTL_TEXTENCODING_UTF8);
- ::rtl::OUString sSQL_TOKEN(RTL_CONSTASCII_USTRINGPARAM("SQL_TOKEN_"));
-
- sal_Int32 nPos1 = sStr.indexOf(sSQL_TOKEN);
- if(nPos1 != -1)
- {
- ::rtl::OUString sFirst = sStr.copy(0,nPos1);
- sal_Int32 nPos2 = sStr.indexOf(sSQL_TOKEN,nPos1+1);
- if(nPos2 != -1)
- {
- ::rtl::OUString sSecond = sStr.copy(nPos1+sSQL_TOKEN.getLength(),nPos2-nPos1-sSQL_TOKEN.getLength());
- sFirst += sSecond;
- sFirst += sStr.copy(nPos2+sSQL_TOKEN.getLength());
- }
- else
- sFirst += sStr.copy(nPos1+sSQL_TOKEN.getLength());
-
- m_sErrorMessage = sFirst;
- }
- else
- m_sErrorMessage = sStr;
-
- ::rtl::OUString aError = s_pScanner->getErrorMessage();
- if(aError.getLength())
- {
- m_sErrorMessage += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(", "));
- m_sErrorMessage += aError;
- }
- }
-}
-// -------------------------------------------------------------------------
-int OSQLParser::SQLlex()
-{
- return s_pScanner->SQLlex();
-}
-
-#if defined __SUNPRO_CC
-#pragma enable_warn
-#elif defined _MSC_VER
-#pragma warning(pop)
-#endif
diff --git a/connectivity/source/parse/sqlflex.l b/connectivity/source/parse/sqlflex.l
deleted file mode 100755
index 85296a8633..0000000000
--- a/connectivity/source/parse/sqlflex.l
+++ /dev/null
@@ -1,836 +0,0 @@
-%{
-
-//--------------------------------------------------------------------------
-//
-// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-//
-// Copyright 2000, 2010 Oracle and/or its affiliates.
-//
-// OpenOffice.org - a multi-platform office productivity suite
-//
-// This file is part of OpenOffice.org.
-//
-// OpenOffice.org is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License version 3
-// only, as published by the Free Software Foundation.
-//
-// OpenOffice.org is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License version 3 for more details
-// (a copy is included in the LICENSE file that accompanied this code).
-//
-// You should have received a copy of the GNU Lesser General Public License
-// version 3 along with OpenOffice.org. If not, see
-// <http://www.openoffice.org/license.html>
-// for a copy of the LGPLv3 License.
-//
-//--------------------------------------------------------------------------
-
-#define YY_EXIT 1 // YY_FATAL will not halt the application
-
-#ifndef _CSTDARG_
-#include <cstdarg> // std::va_list
-#endif
-
-#ifndef _INC_STRING
-#include <string.h>
-#endif
-
-#include "internalnode.hxx"
-
-#ifndef _CONNECTIVITY_SQLYACC_HXX
-#define _CONNECTIVITY_SQLYACC_HXX
-
-#ifndef SQLYYDEBUG
-#define SQLYYDEBUG 1
-#endif
-
-#include "sqlbison.hxx"
-#endif
-#include "sqlscan.hxx"
-#include <osl/diagnose.h>
-#include <rtl/strbuf.hxx>
-#include <connectivity/sqlparse.hxx>
-
-#if defined __GNUC__
- #pragma GCC system_header
-#elif defined __SUNPRO_CC
-#pragma disable_warn
-#elif defined _MSC_VER
-#pragma warning(push, 1)
-/**/
-#ifdef yywrap
-#undef yywrap
-#define yywrap() 1
-#endif
-/**/
-#endif
-
-using namespace connectivity;
-
-//=============================================================================
-//
-// Erzeugung der Blaetter fuer die Token
-// Blaetter werden generell vom Lexer erzeugt
-
-static ::rtl::OUString aEmptyString;
-
-static sal_Int32 gatherString(sal_Int32 delim, sal_Int32 nTyp);
-static sal_Int32 gatherName(const sal_Char*);
-static sal_Int32 gatherNamePre(const sal_Char* );
-// has to be set before the parser starts
-OSQLScanner* xxx_pGLOBAL_SQLSCAN = NULL;
-
-#define SQL_NEW_NODE(text, token) \
- SQLyylval.pParseNode = new OSQLInternalNode(text, token);
-
-#define SQL_NEW_KEYWORD(token) \
- SQLyylval.pParseNode = new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, (token)); return token;
-
-#define SQL_NEW_INTNUM SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_INTNUM); return SQL_TOKEN_INTNUM;
-#define SQL_NEW_APPROXNUM SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_APPROXNUM); return SQL_TOKEN_APPROXNUM;
-#define SQL_NEW_DATE SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_ACCESS_DATE); return SQL_TOKEN_ACCESS_DATE;
-
-#define YY_INPUT(buf,result,max_size) \
-{ \
- buf[0] = xxx_pGLOBAL_SQLSCAN->SQLyygetc(); \
- result = buf[0] != -1; \
-}
-
-#define YY_FATAL_ERROR(msg) \
-{ \
- xxx_pGLOBAL_SQLSCAN->SQLyyerror(msg); \
-}
-
-//
-//=============================================================================
-
-%}
-
-%s SQL
-%s PREDICATE_ENG
-%s PREDICATE_GER
-%s DATE
-%s STRING
-
-%option noyywrap
-%option never-interactive
-%%
-
-ABS {SQL_NEW_KEYWORD(SQL_TOKEN_ABS); }
-ACOS {SQL_NEW_KEYWORD(SQL_TOKEN_ACOS); }
-AFTER {SQL_NEW_KEYWORD(SQL_TOKEN_AFTER); }
-ALL {SQL_NEW_KEYWORD(SQL_TOKEN_ALL); }
-ALTER {SQL_NEW_KEYWORD(SQL_TOKEN_ALTER); }
-AND {SQL_NEW_KEYWORD(SQL_TOKEN_AND); }
-ANY {SQL_NEW_KEYWORD(SQL_TOKEN_ANY); }
-ARRAY_AGG {SQL_NEW_KEYWORD(SQL_TOKEN_ARRAY_AGG); }
-AS {SQL_NEW_KEYWORD(SQL_TOKEN_AS); }
-ASC {SQL_NEW_KEYWORD(SQL_TOKEN_ASC); }
-ASCII {SQL_NEW_KEYWORD(SQL_TOKEN_ASCII); }
-ASIN {SQL_NEW_KEYWORD(SQL_TOKEN_ASIN); }
-AT {SQL_NEW_KEYWORD(SQL_TOKEN_AT); }
-ATAN {SQL_NEW_KEYWORD(SQL_TOKEN_ATAN); }
-ATAN2 {SQL_NEW_KEYWORD(SQL_TOKEN_ATAN2); }
-ATOMIC {SQL_NEW_KEYWORD(SQL_TOKEN_ATOMIC); }
-AUTHORIZATION {SQL_NEW_KEYWORD(SQL_TOKEN_AUTHORIZATION); }
-AVG {SQL_NEW_KEYWORD(SQL_TOKEN_AVG); }
-
-BEFORE {SQL_NEW_KEYWORD(SQL_TOKEN_BEFORE); }
-BEGIN {SQL_NEW_KEYWORD(SQL_TOKEN_BEGIN); }
-BETWEEN {SQL_NEW_KEYWORD(SQL_TOKEN_BETWEEN); }
-BIGINT {SQL_NEW_KEYWORD(SQL_TOKEN_BIGINT); }
-BINARY {SQL_NEW_KEYWORD(SQL_TOKEN_BINARY); }
-BIT {SQL_NEW_KEYWORD(SQL_TOKEN_BIT); }
-BIT_LENGTH {SQL_NEW_KEYWORD(SQL_TOKEN_BIT_LENGTH); }
-BLOB {SQL_NEW_KEYWORD(SQL_TOKEN_BLOB); }
-BOTH {SQL_NEW_KEYWORD(SQL_TOKEN_BOTH); }
-BY {SQL_NEW_KEYWORD(SQL_TOKEN_BY); }
-
-CALL {SQL_NEW_KEYWORD(SQL_TOKEN_CALL); }
-CASE {SQL_NEW_KEYWORD(SQL_TOKEN_CASE); }
-CAST {SQL_NEW_KEYWORD(SQL_TOKEN_CAST); }
-CEILING {SQL_NEW_KEYWORD(SQL_TOKEN_CEILING); }
-CHAR {SQL_NEW_KEYWORD(SQL_TOKEN_CHAR); }
-CHARACTER {SQL_NEW_KEYWORD(SQL_TOKEN_CHARACTER); }
-CHAR(ACTER)?_LENGTH {SQL_NEW_KEYWORD(SQL_TOKEN_CHAR_LENGTH); }
-CHECK {SQL_NEW_KEYWORD(SQL_TOKEN_CHECK); }
-CLOB {SQL_NEW_KEYWORD(SQL_TOKEN_CLOB); }
-COALESCE {SQL_NEW_KEYWORD(SQL_TOKEN_COALESCE); }
-COLLATE {SQL_NEW_KEYWORD(SQL_TOKEN_COLLATE); }
-COLLECT {SQL_NEW_KEYWORD(SQL_TOKEN_COLLECT); }
-COMMIT {SQL_NEW_KEYWORD(SQL_TOKEN_COMMIT); }
-CONCAT {SQL_NEW_KEYWORD(SQL_TOKEN_CONCAT); }
-CONTINUE {SQL_NEW_KEYWORD(SQL_TOKEN_CONTINUE); }
-CONVERT {SQL_NEW_KEYWORD(SQL_TOKEN_CONVERT); }
-COS {SQL_NEW_KEYWORD(SQL_TOKEN_COS); }
-COT {SQL_NEW_KEYWORD(SQL_TOKEN_COT); }
-COUNT {SQL_NEW_KEYWORD(SQL_TOKEN_COUNT); }
-CREATE {SQL_NEW_KEYWORD(SQL_TOKEN_CREATE); }
-CROSS {SQL_NEW_KEYWORD(SQL_TOKEN_CROSS); }
-CUME_RANK {SQL_NEW_KEYWORD(SQL_TOKEN_CUME_DIST); }
-CURRENT {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT); }
-CURRENT_DATE {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_DATE); }
-CURRENT_CATALOG {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_CATALOG); }
-CURRENT_DEFAULT_TRANSFORM_GROUP {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_DEFAULT_TRANSFORM_GROUP); }
-CURRENT_PATH {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_PATH); }
-CURRENT_ROLE {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_ROLE); }
-CURRENT_SCHEMA {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_SCHEMA); }
-CURRENT_USER {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_USER); }
-CURDATE {SQL_NEW_KEYWORD(SQL_TOKEN_CURDATE); }
-CURRENT_TIME {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_TIME); }
-CURTIME {SQL_NEW_KEYWORD(SQL_TOKEN_CURTIME); }
-CURRENT_TIMESTAMP {SQL_NEW_KEYWORD(SQL_TOKEN_CURRENT_TIMESTAMP); }
-CURSOR {SQL_NEW_KEYWORD(SQL_TOKEN_CURSOR); }
-
-D {SQL_NEW_KEYWORD(SQL_TOKEN_D); }
-DATE {SQL_NEW_KEYWORD(SQL_TOKEN_DATE); }
-DATEDIFF {SQL_NEW_KEYWORD(SQL_TOKEN_DATEDIFF); }
-DATEVALUE {SQL_NEW_KEYWORD(SQL_TOKEN_DATEVALUE); }
-DAY {SQL_NEW_KEYWORD(SQL_TOKEN_DAY); }
-DAYNAME {SQL_NEW_KEYWORD(SQL_TOKEN_DAYNAME); }
-DAYOFMONTH {SQL_NEW_KEYWORD(SQL_TOKEN_DAYOFMONTH); }
-DAYOFWEEK {SQL_NEW_KEYWORD(SQL_TOKEN_DAYOFWEEK); }
-DAYOFYEAR {SQL_NEW_KEYWORD(SQL_TOKEN_DAYOFYEAR); }
-DEC {SQL_NEW_KEYWORD(SQL_TOKEN_DEC); }
-DECIMAL {SQL_NEW_KEYWORD(SQL_TOKEN_DECIMAL); }
-DECLARE {SQL_NEW_KEYWORD(SQL_TOKEN_DECLARE); }
-DEFAULT {SQL_NEW_KEYWORD(SQL_TOKEN_DEFAULT); }
-DEGREES {SQL_NEW_KEYWORD(SQL_TOKEN_DEGREES); }
-DELETE {SQL_NEW_KEYWORD(SQL_TOKEN_DELETE); }
-DENSE_RANK {SQL_NEW_KEYWORD(SQL_TOKEN_DENSE_RANK); }
-DESC {SQL_NEW_KEYWORD(SQL_TOKEN_DESC); }
-DIFFERENCE {SQL_NEW_KEYWORD(SQL_TOKEN_DIFFERENCE); }
-DISTINCT {SQL_NEW_KEYWORD(SQL_TOKEN_DISTINCT); }
-DOUBLE {SQL_NEW_KEYWORD(SQL_TOKEN_DOUBLE); }
-DROP {SQL_NEW_KEYWORD(SQL_TOKEN_DROP); }
-
-EACH {SQL_NEW_KEYWORD(SQL_TOKEN_EACH); }
-ELSE {SQL_NEW_KEYWORD(SQL_TOKEN_ELSE); }
-END {SQL_NEW_KEYWORD(SQL_TOKEN_END); }
-EVERY {SQL_NEW_KEYWORD(SQL_TOKEN_EVERY); }
-ESCAPE {SQL_NEW_KEYWORD(SQL_TOKEN_ESCAPE); }
-EXCEPT {SQL_NEW_KEYWORD(SQL_TOKEN_EXCEPT); }
-EXCLUDE {SQL_NEW_KEYWORD(SQL_TOKEN_EXCLUDE); }
-EXISTS {SQL_NEW_KEYWORD(SQL_TOKEN_EXISTS); }
-EXP {SQL_NEW_KEYWORD(SQL_TOKEN_EXP); }
-EXTRACT {SQL_NEW_KEYWORD(SQL_TOKEN_EXTRACT); }
-
-FALSE {SQL_NEW_KEYWORD(SQL_TOKEN_FALSE); }
-FETCH {SQL_NEW_KEYWORD(SQL_TOKEN_FETCH); }
-FIRST {SQL_NEW_KEYWORD(SQL_TOKEN_FIRST); }
-FIRST_VALUE {SQL_NEW_KEYWORD(SQL_TOKEN_FIRST_VALUE); }
-FLOAT {SQL_NEW_KEYWORD(SQL_TOKEN_FLOAT); }
-FLOOR {SQL_NEW_KEYWORD(SQL_TOKEN_FLOOR); }
-FN {SQL_NEW_KEYWORD(SQL_TOKEN_FN); }
-FOLLOWING {SQL_NEW_KEYWORD(SQL_TOKEN_FOLLOWING); }
-FOR {SQL_NEW_KEYWORD(SQL_TOKEN_FOR); }
-FOREIGN {SQL_NEW_KEYWORD(SQL_TOKEN_FOREIGN); }
-FOUND {SQL_NEW_KEYWORD(SQL_TOKEN_FOUND); }
-FROM {SQL_NEW_KEYWORD(SQL_TOKEN_FROM); }
-FULL {SQL_NEW_KEYWORD(SQL_TOKEN_FULL); }
-FUSION {SQL_NEW_KEYWORD(SQL_TOKEN_FUSION); }
-
-GRANT {SQL_NEW_KEYWORD(SQL_TOKEN_GRANT); }
-GROUP {SQL_NEW_KEYWORD(SQL_TOKEN_GROUP); }
-
-HAVING {SQL_NEW_KEYWORD(SQL_TOKEN_HAVING); }
-HOUR {SQL_NEW_KEYWORD(SQL_TOKEN_HOUR); }
-
-IGNORE {SQL_NEW_KEYWORD(SQL_TOKEN_IGNORE); }
-IN {SQL_NEW_KEYWORD(SQL_TOKEN_IN); }
-INNER {SQL_NEW_KEYWORD(SQL_TOKEN_INNER); }
-INSERT {SQL_NEW_KEYWORD(SQL_TOKEN_INSERT); }
-INSTEAD {SQL_NEW_KEYWORD(SQL_TOKEN_INSTEAD); }
-INT(EGER)? {SQL_NEW_KEYWORD(SQL_TOKEN_INTEGER); }
-INTERSECT {SQL_NEW_KEYWORD(SQL_TOKEN_INTERSECT); }
-INTERVAL {SQL_NEW_KEYWORD(SQL_TOKEN_INTERVAL); }
-INTERSECTION {SQL_NEW_KEYWORD(SQL_TOKEN_INTERSECTION); }
-INTO {SQL_NEW_KEYWORD(SQL_TOKEN_INTO); }
-IS {SQL_NEW_KEYWORD(SQL_TOKEN_IS); }
-
-JOIN {SQL_NEW_KEYWORD(SQL_TOKEN_JOIN); }
-
-KEY {SQL_NEW_KEYWORD(SQL_TOKEN_KEY); }
-
-LAG {SQL_NEW_KEYWORD(SQL_TOKEN_LAG); }
-LARGE {SQL_NEW_KEYWORD(SQL_TOKEN_LARGE); }
-LAST {SQL_NEW_KEYWORD(SQL_TOKEN_LAST); }
-LAST_VALUE {SQL_NEW_KEYWORD(SQL_TOKEN_LAST_VALUE); }
-LCASE {SQL_NEW_KEYWORD(SQL_TOKEN_LCASE); }
-LEAD {SQL_NEW_KEYWORD(SQL_TOKEN_LEAD); }
-LEADING {SQL_NEW_KEYWORD(SQL_TOKEN_LEADING); }
-LEFT {SQL_NEW_KEYWORD(SQL_TOKEN_LEFT); }
-LENGTH {SQL_NEW_KEYWORD(SQL_TOKEN_LENGTH); }
-LIKE {SQL_NEW_KEYWORD(SQL_TOKEN_LIKE); }
-LIMIT {SQL_NEW_KEYWORD(SQL_TOKEN_LIMIT); }
-LN {SQL_NEW_KEYWORD(SQL_TOKEN_LN); }
-LOCAL {SQL_NEW_KEYWORD(SQL_TOKEN_LOCAL); }
-LOCATE {SQL_NEW_KEYWORD(SQL_TOKEN_LOCATE); }
-LOG {SQL_NEW_KEYWORD(SQL_TOKEN_LOG); }
-LOGF {SQL_NEW_KEYWORD(SQL_TOKEN_LOGF); }
-LOG10 {SQL_NEW_KEYWORD(SQL_TOKEN_LOG10); }
-LOWER {SQL_NEW_KEYWORD(SQL_TOKEN_LOWER); }
-LTRIM {SQL_NEW_KEYWORD(SQL_TOKEN_LTRIM); }
-
-MAX {SQL_NEW_KEYWORD(SQL_TOKEN_MAX); }
-MIN {SQL_NEW_KEYWORD(SQL_TOKEN_MIN); }
-MINUTE {SQL_NEW_KEYWORD(SQL_TOKEN_MINUTE); }
-MOD {SQL_NEW_KEYWORD(SQL_TOKEN_MOD); }
-MONTH {SQL_NEW_KEYWORD(SQL_TOKEN_MONTH); }
-MONTHNAME {SQL_NEW_KEYWORD(SQL_TOKEN_MONTHNAME); }
-
-NATIONAL {SQL_NEW_KEYWORD(SQL_TOKEN_NATIONAL); }
-NATURAL {SQL_NEW_KEYWORD(SQL_TOKEN_NATURAL); }
-NCHAR {SQL_NEW_KEYWORD(SQL_TOKEN_NCHAR); }
-NCLOB {SQL_NEW_KEYWORD(SQL_TOKEN_NCLOB); }
-NEW {SQL_NEW_KEYWORD(SQL_TOKEN_NEW); }
-NEXT {SQL_NEW_KEYWORD(SQL_TOKEN_NEXT); }
-NO {SQL_NEW_KEYWORD(SQL_TOKEN_NO); }
-NOT {SQL_NEW_KEYWORD(SQL_TOKEN_NOT); }
-NOW {SQL_NEW_KEYWORD(SQL_TOKEN_NOW); }
-NTH_VALUE {SQL_NEW_KEYWORD(SQL_TOKEN_NTH_VALUE); }
-NTILE {SQL_NEW_KEYWORD(SQL_TOKEN_NTILE); }
-NULL {SQL_NEW_KEYWORD(SQL_TOKEN_NULL); }
-NULLIF {SQL_NEW_KEYWORD(SQL_TOKEN_NULLIF); }
-NULLS {SQL_NEW_KEYWORD(SQL_TOKEN_NULLS); }
-NUMERIC {SQL_NEW_KEYWORD(SQL_TOKEN_NUMERIC); }
-
-OBJECT {SQL_NEW_KEYWORD(SQL_TOKEN_OBJECT); }
-OCTET_LENGTH {SQL_NEW_KEYWORD(SQL_TOKEN_OCTET_LENGTH); }
-OF {SQL_NEW_KEYWORD(SQL_TOKEN_OF); }
-OFFSET {SQL_NEW_KEYWORD(SQL_TOKEN_OFFSET); }
-OJ {SQL_NEW_KEYWORD(SQL_TOKEN_OJ); }
-OLD {SQL_NEW_KEYWORD(SQL_TOKEN_OLD); }
-ON {SQL_NEW_KEYWORD(SQL_TOKEN_ON); }
-ONLY {SQL_NEW_KEYWORD(SQL_TOKEN_ONLY); }
-OPTION {SQL_NEW_KEYWORD(SQL_TOKEN_OPTION); }
-OR {SQL_NEW_KEYWORD(SQL_TOKEN_OR); }
-ORDER {SQL_NEW_KEYWORD(SQL_TOKEN_ORDER); }
-OTHERS {SQL_NEW_KEYWORD(SQL_TOKEN_OTHERS); }
-OUTER {SQL_NEW_KEYWORD(SQL_TOKEN_OUTER); }
-OVER {SQL_NEW_KEYWORD(SQL_TOKEN_OVER); }
-
-PARTITION {SQL_NEW_KEYWORD(SQL_TOKEN_PARTITION); }
-PERCENT_RANK {SQL_NEW_KEYWORD(SQL_TOKEN_PERCENT_RANK); }
-PERCENTILE_CONT {SQL_NEW_KEYWORD(SQL_TOKEN_PERCENTILE_CONT); }
-PERCENTILE_DISC {SQL_NEW_KEYWORD(SQL_TOKEN_PERCENTILE_DISC); }
-PI {SQL_NEW_KEYWORD(SQL_TOKEN_PI); }
-POSITION {SQL_NEW_KEYWORD(SQL_TOKEN_POSITION); }
-POWER {SQL_NEW_KEYWORD(SQL_TOKEN_POWER); }
-PRECEDING {SQL_NEW_KEYWORD(SQL_TOKEN_PRECEDING); }
-PRECISION {SQL_NEW_KEYWORD(SQL_TOKEN_PRECISION); }
-PRIMARY {SQL_NEW_KEYWORD(SQL_TOKEN_PRIMARY); }
-PRIVILEGES {SQL_NEW_KEYWORD(SQL_TOKEN_PRIVILEGES); }
-PROCEDURE {SQL_NEW_KEYWORD(SQL_TOKEN_PROCEDURE); }
-PUBLIC {SQL_NEW_KEYWORD(SQL_TOKEN_PUBLIC); }
-
-QUARTER {SQL_NEW_KEYWORD(SQL_TOKEN_QUARTER); }
-
-RADIANS {SQL_NEW_KEYWORD(SQL_TOKEN_RADIANS); }
-RAND {SQL_NEW_KEYWORD(SQL_TOKEN_RAND); }
-RANGE {SQL_NEW_KEYWORD(SQL_TOKEN_RANGE); }
-RANK {SQL_NEW_KEYWORD(SQL_TOKEN_RANK); }
-REAL {SQL_NEW_KEYWORD(SQL_TOKEN_REAL); }
-REFERENCES {SQL_NEW_KEYWORD(SQL_TOKEN_REFERENCES); }
-REFERENCING {SQL_NEW_KEYWORD(SQL_TOKEN_REFERENCING); }
-REPEAT {SQL_NEW_KEYWORD(SQL_TOKEN_REPEAT); }
-REPLACE {SQL_NEW_KEYWORD(SQL_TOKEN_REPLACE); }
-RESPECT {SQL_NEW_KEYWORD(SQL_TOKEN_RESPECT); }
-ROLLBACK {SQL_NEW_KEYWORD(SQL_TOKEN_ROLLBACK); }
-ROUND {SQL_NEW_KEYWORD(SQL_TOKEN_ROUND); }
-ROUNDMAGIC {SQL_NEW_KEYWORD(SQL_TOKEN_ROUNDMAGIC); }
-ROW {SQL_NEW_KEYWORD(SQL_TOKEN_ROW); }
-ROWS {SQL_NEW_KEYWORD(SQL_TOKEN_ROWS); }
-ROW_NUMBER {SQL_NEW_KEYWORD(SQL_TOKEN_ROW_NUMBER); }
-RIGHT {SQL_NEW_KEYWORD(SQL_TOKEN_RIGHT); }
-RTRIM {SQL_NEW_KEYWORD(SQL_TOKEN_RTRIM); }
-
-SCHEMA {SQL_NEW_KEYWORD(SQL_TOKEN_SCHEMA); }
-SECOND {SQL_NEW_KEYWORD(SQL_TOKEN_SECOND); }
-SELECT {SQL_NEW_KEYWORD(SQL_TOKEN_SELECT); }
-SET {SQL_NEW_KEYWORD(SQL_TOKEN_SET); }
-SIZE {SQL_NEW_KEYWORD(SQL_TOKEN_SIZE); }
-SIGN {SQL_NEW_KEYWORD(SQL_TOKEN_SIGN); }
-SIN {SQL_NEW_KEYWORD(SQL_TOKEN_SIN); }
-SMALLINT {SQL_NEW_KEYWORD(SQL_TOKEN_SMALLINT); }
-SOME {SQL_NEW_KEYWORD(SQL_TOKEN_SOME); }
-SOUNDEX {SQL_NEW_KEYWORD(SQL_TOKEN_SOUNDEX); }
-SPACE {SQL_NEW_KEYWORD(SQL_TOKEN_SPACE); }
-SQRT {SQL_NEW_KEYWORD(SQL_TOKEN_SQRT); }
-STDDEV_POP {SQL_NEW_KEYWORD(SQL_TOKEN_STDDEV_POP); }
-STDDEV_SAMP {SQL_NEW_KEYWORD(SQL_TOKEN_STDDEV_SAMP); }
-STATEMENT {SQL_NEW_KEYWORD(SQL_TOKEN_STATEMENT); }
-SUBSTRING {SQL_NEW_KEYWORD(SQL_TOKEN_SUBSTRING); }
-SUM {SQL_NEW_KEYWORD(SQL_TOKEN_SUM); }
-SESSION_USER {SQL_NEW_KEYWORD(SQL_TOKEN_SESSION_USER); }
-SYSTEM_USER {SQL_NEW_KEYWORD(SQL_TOKEN_SYSTEM_USER); }
-
-TABLE {SQL_NEW_KEYWORD(SQL_TOKEN_TABLE); }
-TAN {SQL_NEW_KEYWORD(SQL_TOKEN_TAN); }
-THEN {SQL_NEW_KEYWORD(SQL_TOKEN_THEN); }
-TIES {SQL_NEW_KEYWORD(SQL_TOKEN_TIES); }
-TIME {SQL_NEW_KEYWORD(SQL_TOKEN_TIME); }
-TIMESTAMP {SQL_NEW_KEYWORD(SQL_TOKEN_TIMESTAMP); }
-TIMESTAMPADD {SQL_NEW_KEYWORD(SQL_TOKEN_TIMESTAMPADD); }
-TIMESTAMPDIFF {SQL_NEW_KEYWORD(SQL_TOKEN_TIMESTAMPDIFF); }
-TIMEVALUE {SQL_NEW_KEYWORD(SQL_TOKEN_TIMEVALUE); }
-TIMEZONE_HOUR {SQL_NEW_KEYWORD(SQL_TOKEN_TIMEZONE_HOUR); }
-TIMEZONE_MINUTE {SQL_NEW_KEYWORD(SQL_TOKEN_TIMEZONE_MINUTE); }
-TO {SQL_NEW_KEYWORD(SQL_TOKEN_TO); }
-TRAILING {SQL_NEW_KEYWORD(SQL_TOKEN_TRAILING); }
-TRANSLATE {SQL_NEW_KEYWORD(SQL_TOKEN_TRANSLATE); }
-TRIGGER {SQL_NEW_KEYWORD(SQL_TOKEN_TRIGGER); }
-TRIM {SQL_NEW_KEYWORD(SQL_TOKEN_TRIM); }
-TRUE {SQL_NEW_KEYWORD(SQL_TOKEN_TRUE); }
-TRUNCATE {SQL_NEW_KEYWORD(SQL_TOKEN_TRUNCATE); }
-TS {SQL_NEW_KEYWORD(SQL_TOKEN_TS); }
-T {SQL_NEW_KEYWORD(SQL_TOKEN_T); }
-
-UCASE {SQL_NEW_KEYWORD(SQL_TOKEN_UCASE); }
-UNBOUNDED {SQL_NEW_KEYWORD(SQL_TOKEN_UNBOUNDED); }
-UNION {SQL_NEW_KEYWORD(SQL_TOKEN_UNION); }
-UNIQUE {SQL_NEW_KEYWORD(SQL_TOKEN_UNIQUE); }
-UNKNOWN {SQL_NEW_KEYWORD(SQL_TOKEN_UNKNOWN); }
-UPDATE {SQL_NEW_KEYWORD(SQL_TOKEN_UPDATE); }
-UPPER {SQL_NEW_KEYWORD(SQL_TOKEN_UPPER); }
-USAGE {SQL_NEW_KEYWORD(SQL_TOKEN_USAGE); }
-USER {SQL_NEW_KEYWORD(SQL_TOKEN_USER); }
-USING {SQL_NEW_KEYWORD(SQL_TOKEN_USING); }
-
-VARBINARY {SQL_NEW_KEYWORD(SQL_TOKEN_VARBINARY); }
-VARCHAR {SQL_NEW_KEYWORD(SQL_TOKEN_VARCHAR); }
-VARYING {SQL_NEW_KEYWORD(SQL_TOKEN_VARYING); }
-VAR_POP {SQL_NEW_KEYWORD(SQL_TOKEN_VAR_POP); }
-VAR_SAMP {SQL_NEW_KEYWORD(SQL_TOKEN_VAR_SAMP); }
-VALUE {SQL_NEW_KEYWORD(SQL_TOKEN_VALUE); }
-VALUES {SQL_NEW_KEYWORD(SQL_TOKEN_VALUES); }
-VIEW {SQL_NEW_KEYWORD(SQL_TOKEN_VIEW); }
-
-WEEK {SQL_NEW_KEYWORD(SQL_TOKEN_WEEK); }
-WHEN {SQL_NEW_KEYWORD(SQL_TOKEN_WHEN); }
-WHERE {SQL_NEW_KEYWORD(SQL_TOKEN_WHERE); }
-WITH {SQL_NEW_KEYWORD(SQL_TOKEN_WITH); }
-WITHIN {SQL_NEW_KEYWORD(SQL_TOKEN_WITHIN); }
-WITHOUT {SQL_NEW_KEYWORD(SQL_TOKEN_WITHOUT); }
-WORK {SQL_NEW_KEYWORD(SQL_TOKEN_WORK); }
-
-YEAR {SQL_NEW_KEYWORD(SQL_TOKEN_YEAR); }
-
-ZONE {SQL_NEW_KEYWORD(SQL_TOKEN_ZONE); }
-
-"<" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_LESS);return SQL_LESS;}
-">" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_GREAT);return SQL_GREAT;}
-"=" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_EQUAL);return SQL_EQUAL;}
-"<=" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_LESSEQ);return SQL_LESSEQ;}
-">=" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_GREATEQ);return SQL_GREATEQ;}
-"<>" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_NOTEQUAL);return SQL_NOTEQUAL;}
-"!=" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_NOTEQUAL);return SQL_NOTEQUAL;}
-"||" { SQL_NEW_NODE(::rtl::OUString(SQLyytext,strlen(SQLyytext),RTL_TEXTENCODING_UTF8), SQL_NODE_CONCAT);return SQL_CONCAT;}
-
-
-[-+*/:(),.;?{}] { return SQLyytext[0]; }
-
-
-<SQL>[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_0-9]* {return gatherName( SQLyytext);}
-
-<SQL>([0-9]+) |
-<SQL>([0-9]+"."[0-9]*) |
-<SQL>("."[0-9]*) {SQL_NEW_INTNUM; }
-
-<SQL>[0-9]+[eE][+-]?[0-9]+ |
-<SQL>[0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
-<SQL>"."[0-9]*[eE][+-]?[0-9]+ {SQL_NEW_APPROXNUM; }
-
-<PREDICATE_GER,PREDICATE_ENG,DATE>[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z0-9_%.,*?\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375]* {return gatherNamePre(SQLyytext);}
-
-<PREDICATE_GER,PREDICATE_ENG>([0-9]+) {SQL_NEW_INTNUM; }
-<PREDICATE_ENG>([0-9]{1,3}(","[0-9]{3})+) {SQL_NEW_INTNUM; }
-<PREDICATE_GER>([0-9]{1,3}("."[0-9]{3})+) {SQL_NEW_INTNUM; }
-
-<PREDICATE_ENG>([0-9]+"."[0-9]+) |
-<PREDICATE_ENG>([0-9]{1,3}(","[0-9]{3})+"."[0-9]+) |
-<PREDICATE_ENG>("."[0-9]+) {SQL_NEW_APPROXNUM; }
-<PREDICATE_ENG>[0-9]+[eE][+-]?[0-9]+ |
-<PREDICATE_ENG>[0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
-<PREDICATE_ENG>"."[0-9]*[eE][+-]?[0-9]+ {SQL_NEW_APPROXNUM; }
-
-<PREDICATE_GER>([0-9]+","[0-9]+) |
-<PREDICATE_GER>([0-9]{1,3}("."[0-9]{3})+","[0-9]+) |
-<PREDICATE_GER>(","[0-9]+) {SQL_NEW_APPROXNUM; }
-<PREDICATE_GER>[0-9]+[eE][+-]?[0-9]+ |
-<PREDICATE_GER>[0-9]+","[0-9]*[eE][+-]?[0-9]+ |
-<PREDICATE_GER>","[0-9]*[eE][+-]?[0-9]+ {SQL_NEW_APPROXNUM; }
-
-<PREDICATE_GER,PREDICATE_ENG>[0-9.,][A-Za-z0-9_.,%]* {return gatherNamePre(SQLyytext);}
-
-<SQL>\" { return gatherString('\"',0); }
-<SQL>` { return gatherString('`' ,0); }
-
-<PREDICATE_GER,PREDICATE_ENG,DATE,SQL>"[" { return gatherString(']' ,0);}
-
-\' { return gatherString('\'',1); }
-
-<PREDICATE_GER,PREDICATE_ENG,DATE># { return gatherString('#' ,2); }
-
-<DATE>[0-9]{1,4}[^ ]*[0-9] |
-<DATE>[0-9]{1,4}[^ ]*[0-9][ ][0-9]{1,4}[^ ]*[0-9] { SQL_NEW_DATE; }
-
-<STRING>["-""+""*""/"":""("")"",""."";""?""{""}"] { return SQLyytext[0]; } /* */
-<STRING>"[" { return gatherString(']' ,0); }
-<STRING>[^ ':["?"]* { return gatherNamePre(SQLyytext); }
-
-\n {}
-
-[ \t\r]+ {}
-
-"--".*$ {}
-
-. {YY_FATAL_ERROR("Invalid symbol"); return SQL_TOKEN_INVALIDSYMBOL;}
-
-%%
-
-// Kludge around a bug (well, Posix incompatibility) in flex 2.5.x
-// http://bugs.debian.org/cgi-bin/bugreport.cgi?archive=no&bug=189332
-#if YY_FLEX_MAJOR_VERSION >= 2 && YY_FLEX_MINOR_VERSION >= 5
-
- #ifndef YY_FLUSH_BUFFER
- #define YY_FLUSH_BUFFER SQLyy_flush_buffer(YY_CURRENT_BUFFER )
- #endif
-
- #ifndef yytext_ptr
- #define yytext_ptr SQLyytext
- #endif
-
-#endif
-
-// Versions of flex apparently differ in whether input() resp. yyinput() returns
-// zero or EOF upon end of file:
-inline bool checkeof(int c) { return c == 0 || c == EOF; }
-
-/*
- * Read SQL string literal
- * Valid strings:
- * '' 'a string' 'quote '' within string'
- * "" "a string" "quote "" within string"
- * nTyp == 0 -> SQL_NODE_NAME
- * nTyp == 1 -> SQL_NODE_STRING
- * nTyp == 2 -> SQL_NODE_ACCESS_DATE
- */
-sal_Int32 gatherString( sal_Int32 delim, sal_Int32 nTyp)
-{
- sal_Char ch;
- ::rtl::OStringBuffer sBuffer(256);
-
- while (!checkeof(ch = yyinput()))
- {
- if (ch == delim)
- {
- if ((ch = yyinput()) != delim)
- {
- if (!checkeof(ch))
- unput(ch);
-
- switch(nTyp)
- {
- case 0:
- SQL_NEW_NODE(::rtl::OStringToOUString(sBuffer.makeStringAndClear(),RTL_TEXTENCODING_UTF8), SQL_NODE_NAME);
- return SQL_TOKEN_NAME;
- case 1:
- SQL_NEW_NODE(::rtl::OStringToOUString(sBuffer.makeStringAndClear(),RTL_TEXTENCODING_UTF8), SQL_NODE_STRING);
- return SQL_TOKEN_STRING;
- case 2:
- SQL_NEW_NODE(::rtl::OStringToOUString(sBuffer.makeStringAndClear(),RTL_TEXTENCODING_UTF8), SQL_NODE_ACCESS_DATE);
- return SQL_TOKEN_ACCESS_DATE;
- }
- }
- else
- {
- sBuffer.append(ch);
- }
-
- }
- else if (nTyp != 1 && (ch == '\r' || ch == '\n') )
- break;
- else
- {
- sBuffer.append(ch);
- }
- }
- YY_FATAL_ERROR("Unterminated name string");
- return SQL_TOKEN_INVALIDSYMBOL;
-}
-
-sal_Int32 mapEnumToToken(IParseContext::InternationalKeyCode _eKeyCode )
-{
- sal_Int32 nTokenID = 0;
- switch( _eKeyCode )
- {
- case IParseContext::KEY_LIKE: nTokenID = SQL_TOKEN_LIKE; break;
- case IParseContext::KEY_NOT: nTokenID = SQL_TOKEN_NOT; break;
- case IParseContext::KEY_NULL: nTokenID = SQL_TOKEN_NULL; break;
- case IParseContext::KEY_TRUE: nTokenID = SQL_TOKEN_TRUE; break;
- case IParseContext::KEY_FALSE: nTokenID = SQL_TOKEN_FALSE; break;
- case IParseContext::KEY_IS: nTokenID = SQL_TOKEN_IS; break;
- case IParseContext::KEY_BETWEEN: nTokenID = SQL_TOKEN_BETWEEN; break;
- case IParseContext::KEY_OR: nTokenID = SQL_TOKEN_OR; break;
- case IParseContext::KEY_AND: nTokenID = SQL_TOKEN_AND; break;
- case IParseContext::KEY_AVG: nTokenID = SQL_TOKEN_AVG; break;
- case IParseContext::KEY_COUNT: nTokenID = SQL_TOKEN_COUNT; break;
- case IParseContext::KEY_MAX: nTokenID = SQL_TOKEN_MAX; break;
- case IParseContext::KEY_MIN: nTokenID = SQL_TOKEN_MIN; break;
- case IParseContext::KEY_SUM: nTokenID = SQL_TOKEN_SUM; break;
- case IParseContext::KEY_EVERY: nTokenID = SQL_TOKEN_EVERY; break;
- case IParseContext::KEY_ANY: nTokenID = SQL_TOKEN_ANY; break;
- case IParseContext::KEY_SOME: nTokenID = SQL_TOKEN_SOME; break;
- case IParseContext::KEY_STDDEV_POP: nTokenID = SQL_TOKEN_STDDEV_POP; break;
- case IParseContext::KEY_STDDEV_SAMP: nTokenID = SQL_TOKEN_STDDEV_SAMP; break;
- case IParseContext::KEY_VAR_SAMP: nTokenID = SQL_TOKEN_VAR_SAMP; break;
- case IParseContext::KEY_VAR_POP: nTokenID = SQL_TOKEN_VAR_POP; break;
- case IParseContext::KEY_COLLECT: nTokenID = SQL_TOKEN_COLLECT; break;
- case IParseContext::KEY_FUSION: nTokenID = SQL_TOKEN_FUSION; break;
- case IParseContext::KEY_INTERSECTION: nTokenID = SQL_TOKEN_INTERSECTION; break;
- default:
- OSL_FAIL( "mapEnumToToken: unsupported key!" );
- }
- return nTokenID;
-}
-/*
- * Read SQL Name literal
- * Valid Names or internatioanl keywords:
- * As we have international keywords, we test first on them
- */
-sal_Int32 gatherName(const sal_Char* text)
-{
- sal_Int32 nToken;
- OSL_ENSURE(xxx_pGLOBAL_SQLSCAN,"You forgot to set the scanner!");
- IParseContext::InternationalKeyCode eKeyCode = xxx_pGLOBAL_SQLSCAN->getInternationalTokenID(text);
- switch (eKeyCode)
- {
- case IParseContext::KEY_LIKE:
- case IParseContext::KEY_NOT:
- case IParseContext::KEY_NULL:
- case IParseContext::KEY_TRUE:
- case IParseContext::KEY_FALSE:
- case IParseContext::KEY_IS:
- case IParseContext::KEY_BETWEEN:
- case IParseContext::KEY_OR:
- case IParseContext::KEY_AND:
- case IParseContext::KEY_COUNT:
- case IParseContext::KEY_AVG:
- case IParseContext::KEY_MAX:
- case IParseContext::KEY_MIN:
- case IParseContext::KEY_SUM:
- case IParseContext::KEY_EVERY:
- case IParseContext::KEY_ANY:
- case IParseContext::KEY_SOME:
- case IParseContext::KEY_STDDEV_POP:
- case IParseContext::KEY_STDDEV_SAMP:
- case IParseContext::KEY_VAR_SAMP:
- case IParseContext::KEY_VAR_POP:
- case IParseContext::KEY_COLLECT:
- case IParseContext::KEY_FUSION:
- case IParseContext::KEY_INTERSECTION:
- nToken = mapEnumToToken(eKeyCode);
- SQL_NEW_KEYWORD(nToken);
- break;
- default:
- SQL_NEW_NODE(::rtl::OUString(text,strlen(text),RTL_TEXTENCODING_UTF8), SQL_NODE_NAME);
- return SQL_TOKEN_NAME;
- }
-}
-/**
- Read SQL Name literal for predicate check
- Valid Names or internatioanl keywords:
- As we have international keywords, we test first on them
-*/
-sal_Int32 gatherNamePre(const sal_Char* text)
-{
- sal_Int32 nToken;
- OSL_ENSURE(xxx_pGLOBAL_SQLSCAN,"You forgot to set the scanner!");
- IParseContext::InternationalKeyCode eKeyCode = xxx_pGLOBAL_SQLSCAN->getInternationalTokenID(text);
- switch (eKeyCode)
- {
- case IParseContext::KEY_LIKE:
- case IParseContext::KEY_NOT:
- case IParseContext::KEY_NULL:
- case IParseContext::KEY_TRUE:
- case IParseContext::KEY_FALSE:
- case IParseContext::KEY_IS:
- case IParseContext::KEY_BETWEEN:
- case IParseContext::KEY_OR:
- case IParseContext::KEY_AND:
- case IParseContext::KEY_COUNT:
- case IParseContext::KEY_AVG:
- case IParseContext::KEY_MAX:
- case IParseContext::KEY_MIN:
- case IParseContext::KEY_SUM:
- case IParseContext::KEY_EVERY:
- case IParseContext::KEY_ANY:
- case IParseContext::KEY_SOME:
- case IParseContext::KEY_STDDEV_POP:
- case IParseContext::KEY_STDDEV_SAMP:
- case IParseContext::KEY_VAR_SAMP:
- case IParseContext::KEY_VAR_POP:
- case IParseContext::KEY_COLLECT:
- case IParseContext::KEY_FUSION:
- case IParseContext::KEY_INTERSECTION:
- nToken = mapEnumToToken(eKeyCode);
- SQL_NEW_KEYWORD(nToken);
- break;
- default:
- // we need a special handling for parameter
- {
- ::rtl::OString sStmt = xxx_pGLOBAL_SQLSCAN->getStatement();
- sal_Int32 nLength = strlen(text);
- sal_Int32 nPos = xxx_pGLOBAL_SQLSCAN->GetCurrentPos() - nLength - 2;
- if (sStmt.getStr()[nPos] == ':')
- {
- SQL_NEW_NODE(::rtl::OUString(text,nLength,RTL_TEXTENCODING_UTF8), SQL_NODE_NAME);
- nToken = SQL_TOKEN_NAME;
- }
- else
- {
- SQL_NEW_NODE(::rtl::OUString(text,nLength,RTL_TEXTENCODING_UTF8), SQL_NODE_STRING);
- nToken = SQL_TOKEN_STRING;
- }
- }
- }
- return nToken;
-}
-
-using namespace connectivity;
-
-static sal_uInt32 Intl_TokenID[] =
-{
- SQL_TOKEN_LIKE, SQL_TOKEN_NOT, SQL_TOKEN_NULL, SQL_TOKEN_TRUE,
- SQL_TOKEN_FALSE, SQL_TOKEN_IS, SQL_TOKEN_BETWEEN, SQL_TOKEN_OR,
- SQL_TOKEN_AND, SQL_TOKEN_AVG, SQL_TOKEN_COUNT, SQL_TOKEN_MAX,
- SQL_TOKEN_MIN, SQL_TOKEN_SUM
-};
-static bool IN_SQLyyerror;
-//------------------------------------------------------------------------------
-OSQLScanner::OSQLScanner()
- : m_nCurrentPos(0)
- , m_bInternational(sal_False)
- , m_pContext(NULL)
- , m_nRule(0) // 0 is INITIAL
-{
- IN_SQLyyerror = false;
-}
-
-//------------------------------------------------------------------------------
-OSQLScanner::~OSQLScanner()
-{
-}
-//------------------------------------------------------------------------------
-void OSQLScanner::SQLyyerror(sal_Char *fmt)
-{
-
- if(IN_SQLyyerror)
- return;
- IN_SQLyyerror = true;
-
- OSL_ENSURE(m_pContext, "OSQLScanner::SQLyyerror: No Context set");
- m_sErrorMessage = ::rtl::OUString(fmt,strlen(fmt),RTL_TEXTENCODING_UTF8);
- if (m_nCurrentPos < m_sStatement.getLength())
- {
- m_sErrorMessage += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(": "));
-
- ::rtl::OUString aError;
- static sal_Int32 BUFFERSIZE = 256;
- static sal_Char* Buffer = 0;
- if(!Buffer)
- Buffer = new sal_Char[BUFFERSIZE];
-
- sal_Char *s = Buffer;
- sal_Int32 nPos = 1;
- sal_Int32 ch = SQLyytext ? (SQLyytext[0] == 0 ? ' ' : SQLyytext[0]): ' ';
- *s++ = ch;
- while (!checkeof(ch = yyinput()))
- {
- if (ch == ' ')
- {
- if ((ch = yyinput()) != ' ')
- {
- if (!checkeof(ch))
- unput(ch);
- }
- *s = '\0';
- aError = ::rtl::OUString(Buffer,nPos,RTL_TEXTENCODING_UTF8);
- break;
- }
- else
- {
- *s++ = ch;
- if (++nPos == BUFFERSIZE)
- {
- ::rtl::OString aBuf(Buffer);
- delete[] Buffer;
- BUFFERSIZE *=2;
- Buffer = new sal_Char[BUFFERSIZE];
- for(sal_Int32 i=0;i<aBuf.getLength();++i,++Buffer)
- *Buffer = aBuf.getStr()[i];
- s = &Buffer[nPos];
- }
- }
- }
- m_sErrorMessage += aError;
- delete[] Buffer;
- Buffer = NULL;
- }
- IN_SQLyyerror = false;
- YY_FLUSH_BUFFER;
-}
-
-//------------------------------------------------------------------------------
-void OSQLScanner::prepareScan(const ::rtl::OUString & rNewStatement, const IParseContext* pContext, sal_Bool bInternational)
-{
- YY_FLUSH_BUFFER;
- BEGIN(m_nRule);
-
- m_sErrorMessage = ::rtl::OUString();
- m_sStatement = ::rtl::OString(rNewStatement,rNewStatement.getLength(), RTL_TEXTENCODING_UTF8);
- m_nCurrentPos = 0;
- m_bInternational = bInternational;
- m_pContext = pContext;
-}
-
-//------------------------------------------------------------------------------
-sal_Int32 OSQLScanner::SQLyygetc(void)
-{
- sal_Int32 nPos = (m_nCurrentPos >= m_sStatement.getLength()) ? -1 : m_sStatement.getStr()[m_nCurrentPos];
- m_nCurrentPos++;
- return nPos;
-}
-
-//------------------------------------------------------------------------------
-IParseContext::InternationalKeyCode OSQLScanner::getInternationalTokenID(const sal_Char* sToken) const
-{
- OSL_ENSURE(m_pContext, "OSQLScanner::getInternationalTokenID: No Context set");
- return (m_bInternational) ? m_pContext->getIntlKeyCode(::rtl::OString(sToken) ) : IParseContext::KEY_NONE;
-}
-// -------------------------------------------------------------------------
-sal_Int32 OSQLScanner::GetCurrentRule() const { return m_nRule; }
-sal_Int32 OSQLScanner::GetGERRule() const { return PREDICATE_GER; }
-sal_Int32 OSQLScanner::GetENGRule() const { return PREDICATE_ENG; }
-sal_Int32 OSQLScanner::GetSQLRule() const { return SQL; }
-sal_Int32 OSQLScanner::GetDATERule() const { return DATE; }
-sal_Int32 OSQLScanner::GetSTRINGRule() const { return STRING; }
-// -------------------------------------------------------------------------
-void OSQLScanner::setScanner(sal_Bool _bNull)
-{
- xxx_pGLOBAL_SQLSCAN = _bNull ? NULL : this;
-}
-// -------------------------------------------------------------------------
-sal_Int32 OSQLScanner::SQLlex()
-{
- return SQLyylex();
-}
-
-#if defined __SUNPRO_CC
-#pragma enable_warn
-#elif defined _MSC_VER
-#pragma warning(pop)
-#endif
diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx
deleted file mode 100644
index 62554d6d77..0000000000
--- a/connectivity/source/parse/sqliterator.cxx
+++ /dev/null
@@ -1,2249 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-#include "connectivity/sqliterator.hxx"
-#include "connectivity/sdbcx/VTable.hxx"
-#include <connectivity/sqlparse.hxx>
-#include <connectivity/dbtools.hxx>
-#include <connectivity/sqlerror.hxx>
-#include <com/sun/star/sdbc/ColumnValue.hpp>
-#include <com/sun/star/sdbc/DataType.hpp>
-#include <com/sun/star/sdbc/XRow.hpp>
-#include <com/sun/star/sdb/XQueriesSupplier.hpp>
-#include <com/sun/star/sdb/ErrorCondition.hpp>
-#ifdef SQL_TEST_PARSETREEITERATOR
-#include <iostream>
-#endif
-#include "connectivity/PColumn.hxx"
-#include "connectivity/dbtools.hxx"
-#include <tools/diagnose_ex.h>
-#include "TConnection.hxx"
-#include <comphelper/types.hxx>
-#include <connectivity/dbmetadata.hxx>
-#include <com/sun/star/sdb/SQLFilterOperator.hpp>
-#include "diagnose_ex.h"
-#include <rtl/logfile.hxx>
-
-#define SQL_ISRULEOR2(pParseNode, e1,e2) ((pParseNode)->isRule() && (\
- (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e1) || \
- (pParseNode)->getRuleID() == OSQLParser::RuleID(OSQLParseNode::e2)))
-
-using namespace ::comphelper;
-using namespace ::connectivity;
-using namespace ::connectivity::sdbcx;
-using namespace ::dbtools;
-using namespace ::connectivity::parse;
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::container;
-using namespace ::com::sun::star::sdbcx;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::sdbc;
-using namespace ::com::sun::star::sdb;
-
-namespace connectivity
-{
- struct OSQLParseTreeIteratorImpl
- {
- ::std::vector< TNodePair > m_aJoinConditions;
- Reference< XConnection > m_xConnection;
- Reference< XDatabaseMetaData > m_xDatabaseMetaData;
- Reference< XNameAccess > m_xTableContainer;
- Reference< XNameAccess > m_xQueryContainer;
-
- ::boost::shared_ptr< OSQLTables > m_pTables; /// all tables which participate in the SQL statement
- ::boost::shared_ptr< OSQLTables > m_pSubTables; /// all tables from sub queries not the tables from the select tables
- ::boost::shared_ptr< QueryNameSet > m_pForbiddenQueryNames;
-
- sal_uInt32 m_nIncludeMask;
-
- bool m_bIsCaseSensitive;
-
- OSQLParseTreeIteratorImpl( const Reference< XConnection >& _rxConnection, const Reference< XNameAccess >& _rxTables )
- :m_xConnection( _rxConnection )
- ,m_nIncludeMask( OSQLParseTreeIterator::All )
- ,m_bIsCaseSensitive( true )
- {
- OSL_PRECOND( m_xConnection.is(), "OSQLParseTreeIteratorImpl::OSQLParseTreeIteratorImpl: invalid connection!" );
- m_xDatabaseMetaData = m_xConnection->getMetaData();
-
- m_bIsCaseSensitive = m_xDatabaseMetaData.is() && m_xDatabaseMetaData->supportsMixedCaseQuotedIdentifiers();
- m_pTables.reset( new OSQLTables( m_bIsCaseSensitive ) );
- m_pSubTables.reset( new OSQLTables( m_bIsCaseSensitive ) );
-
- m_xTableContainer = _rxTables;
-
- DatabaseMetaData aMetaData( m_xConnection );
- if ( aMetaData.supportsSubqueriesInFrom() )
- {
- // connections might support the XQueriesSupplier interface, if they implement the css.sdb.Connection
- // service
- Reference< XQueriesSupplier > xSuppQueries( m_xConnection, UNO_QUERY );
- if ( xSuppQueries.is() )
- m_xQueryContainer = xSuppQueries->getQueries();
- }
- }
-
- public:
- inline bool isQueryAllowed( const ::rtl::OUString& _rQueryName )
- {
- if ( !m_pForbiddenQueryNames.get() )
- return true;
- if ( m_pForbiddenQueryNames->find( _rQueryName ) == m_pForbiddenQueryNames->end() )
- return true;
- return false;
- }
- };
-
- //-------------------------------------------------------------------------
- /** helper class for temporarily adding a query name to a list of forbidden query names
- */
- class ForbidQueryName
- {
- ::boost::shared_ptr< QueryNameSet >& m_rpAllForbiddenNames;
- ::rtl::OUString m_sForbiddenQueryName;
-
- public:
- ForbidQueryName( OSQLParseTreeIteratorImpl& _rIteratorImpl, const ::rtl::OUString _rForbiddenQueryName )
- :m_rpAllForbiddenNames( _rIteratorImpl.m_pForbiddenQueryNames )
- ,m_sForbiddenQueryName( _rForbiddenQueryName )
- {
- if ( !m_rpAllForbiddenNames.get() )
- m_rpAllForbiddenNames.reset( new QueryNameSet );
- m_rpAllForbiddenNames->insert( m_sForbiddenQueryName );
- }
-
- ~ForbidQueryName()
- {
- m_rpAllForbiddenNames->erase( m_sForbiddenQueryName );
- }
- };
-}
-//-----------------------------------------------------------------------------
-OSQLParseTreeIterator::OSQLParseTreeIterator(const Reference< XConnection >& _rxConnection,
- const Reference< XNameAccess >& _rxTables,
- const OSQLParser& _rParser,
- const OSQLParseNode* pRoot )
- :m_rParser( _rParser )
- ,m_pImpl( new OSQLParseTreeIteratorImpl( _rxConnection, _rxTables ) )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::OSQLParseTreeIterator" );
- setParseTree(pRoot);
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseTreeIterator::OSQLParseTreeIterator( const OSQLParseTreeIterator& _rParentIterator, const OSQLParser& _rParser, const OSQLParseNode* pRoot )
- :m_rParser( _rParser )
- ,m_pImpl( new OSQLParseTreeIteratorImpl( _rParentIterator.m_pImpl->m_xConnection, _rParentIterator.m_pImpl->m_xTableContainer ) )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::OSQLParseTreeIterator" );
- m_pImpl->m_pForbiddenQueryNames = _rParentIterator.m_pImpl->m_pForbiddenQueryNames;
- setParseTree( pRoot );
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseTreeIterator::~OSQLParseTreeIterator()
-{
- dispose();
-}
-
-// -----------------------------------------------------------------------------
-const OSQLTables& OSQLParseTreeIterator::getTables() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getTables" );
- return *m_pImpl->m_pTables;
-}
-
-// -----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::isCaseSensitive() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::isCaseSensitive" );
- return m_pImpl->m_bIsCaseSensitive;
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::dispose()
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::dispose" );
- m_aSelectColumns = NULL;
- m_aGroupColumns = NULL;
- m_aOrderColumns = NULL;
- m_aParameters = NULL;
- m_pImpl->m_xTableContainer = NULL;
- m_pImpl->m_xDatabaseMetaData = NULL;
- m_aCreateColumns = NULL;
- m_pImpl->m_pTables->clear();
- m_pImpl->m_pSubTables->clear();
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setParseTree" );
- m_pImpl->m_pTables->clear();
- m_pImpl->m_pSubTables->clear();
-
- m_aSelectColumns = new OSQLColumns();
- m_aGroupColumns = new OSQLColumns();
- m_aOrderColumns = new OSQLColumns();
- m_aParameters = new OSQLColumns();
- m_aCreateColumns = new OSQLColumns();
-
- m_pParseTree = pNewParseTree;
- if (!m_pParseTree)
- {
- m_eStatementType = SQL_STATEMENT_UNKNOWN;
- return;
- }
-
- // falls m_pParseTree aber keine Connection, dann Fehler
- if ( !m_pImpl->m_xTableContainer.is() )
- return;
-
- m_aErrors = SQLException();
-
-
- // Statement-Typ ermitteln ...
- if (SQL_ISRULE(m_pParseTree,select_statement) || SQL_ISRULE(m_pParseTree,union_statement) )
- {
- m_eStatementType = SQL_STATEMENT_SELECT;
- }
- else if (SQL_ISRULE(m_pParseTree,insert_statement))
- {
- m_eStatementType = SQL_STATEMENT_INSERT;
- }
- else if (SQL_ISRULE(m_pParseTree,update_statement_searched))
- {
- m_eStatementType = SQL_STATEMENT_UPDATE;
- }
- else if (SQL_ISRULE(m_pParseTree,delete_statement_searched))
- {
- m_eStatementType = SQL_STATEMENT_DELETE;
- }
- else if (m_pParseTree->count() == 3 && SQL_ISRULE(m_pParseTree->getChild(1),odbc_call_spec))
- {
- m_eStatementType = SQL_STATEMENT_ODBC_CALL;
- }
- else if (SQL_ISRULE(m_pParseTree->getChild(0),base_table_def))
- {
- m_eStatementType = SQL_STATEMENT_CREATE_TABLE;
- m_pParseTree = m_pParseTree->getChild(0);
- }
- else
- {
- m_eStatementType = SQL_STATEMENT_UNKNOWN;
- //aIteratorStatus.setInvalidStatement();
- return;
- }
-}
-
-//-----------------------------------------------------------------------------
-namespace
-{
- //.........................................................................
- static void impl_getRowString( const Reference< XRow >& _rxRow, const sal_Int32 _nColumnIndex, ::rtl::OUString& _out_rString )
- {
- _out_rString = _rxRow->getString( _nColumnIndex );
- if ( _rxRow->wasNull() )
- _out_rString= ::rtl::OUString();
- }
-
- //.........................................................................
- static ::rtl::OUString lcl_findTableInMetaData(
- const Reference< XDatabaseMetaData >& _rxDBMeta, const ::rtl::OUString& _rCatalog,
- const ::rtl::OUString& _rSchema, const ::rtl::OUString& _rTableName )
- {
- ::rtl::OUString sComposedName;
-
- static const ::rtl::OUString s_sTableTypeView(RTL_CONSTASCII_USTRINGPARAM("VIEW"));
- static const ::rtl::OUString s_sTableTypeTable(RTL_CONSTASCII_USTRINGPARAM("TABLE"));
- static const ::rtl::OUString s_sWildcard( RTL_CONSTASCII_USTRINGPARAM( "%" ));
-
- // we want all catalogues, all schemas, all tables
- Sequence< ::rtl::OUString > sTableTypes(3);
- sTableTypes[0] = s_sTableTypeView;
- sTableTypes[1] = s_sTableTypeTable;
- sTableTypes[2] = s_sWildcard; // just to be sure to include anything else ....
-
- if ( _rxDBMeta.is() )
- {
- sComposedName = ::rtl::OUString();
-
- Reference< XResultSet> xRes = _rxDBMeta->getTables(
- _rCatalog.getLength() ? makeAny( _rCatalog ) : Any(), _rSchema.getLength() ? _rSchema : s_sWildcard, _rTableName, sTableTypes );
-
- Reference< XRow > xCurrentRow( xRes, UNO_QUERY );
- if ( xCurrentRow.is() && xRes->next() )
- {
- ::rtl::OUString sCatalog, sSchema, sName;
-
- impl_getRowString( xCurrentRow, 1, sCatalog );
- impl_getRowString( xCurrentRow, 2, sSchema );
- impl_getRowString( xCurrentRow, 3, sName );
-
- sComposedName = ::dbtools::composeTableName(
- _rxDBMeta,
- sCatalog,
- sSchema,
- sName,
- sal_False,
- ::dbtools::eInDataManipulation
- );
- }
- }
- return sComposedName;
- }
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::impl_getQueryParameterColumns( const OSQLTable& _rQuery )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_getQueryParameterColumns" );
- if ( ( m_pImpl->m_nIncludeMask & Parameters ) != Parameters )
- // parameters not to be included in the traversal
- return;
-
- ::rtl::Reference< OSQLColumns > pSubQueryParameterColumns( new OSQLColumns() );
-
- // get the command and the EscapeProcessing properties from the sub query
- ::rtl::OUString sSubQueryCommand;
- sal_Bool bEscapeProcessing = sal_False;
- try
- {
- Reference< XPropertySet > xQueryProperties( _rQuery, UNO_QUERY_THROW );
- OSL_VERIFY( xQueryProperties->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_COMMAND ) ) >>= sSubQueryCommand );
- OSL_VERIFY( xQueryProperties->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ESCAPEPROCESSING ) ) >>= bEscapeProcessing );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- // parse the sub query
- do {
-
- if ( !bEscapeProcessing || ( sSubQueryCommand.getLength() == 0 ) )
- break;
-
- ::rtl::OUString sError;
- ::std::auto_ptr< OSQLParseNode > pSubQueryNode( const_cast< OSQLParser& >( m_rParser ).parseTree( sError, sSubQueryCommand, sal_False ) );
- if ( !pSubQueryNode.get() )
- break;
-
- OSQLParseTreeIterator aSubQueryIterator( *this, m_rParser, pSubQueryNode.get() );
- aSubQueryIterator.traverseSome( Parameters | SelectColumns );
- // SelectColumns might also contain parameters
- // #i77635# - 2007-07-23 / frank.schoenheit@sun.com
- pSubQueryParameterColumns = aSubQueryIterator.getParameters();
- aSubQueryIterator.dispose();
-
- } while ( false );
-
- // copy the parameters of the sub query to our own parameter array
- ::std::copy( pSubQueryParameterColumns->get().begin(), pSubQueryParameterColumns->get().end(),
- ::std::insert_iterator< OSQLColumns::Vector >( m_aParameters->get(), m_aParameters->get().end() ) );
-}
-
-//-----------------------------------------------------------------------------
-OSQLTable OSQLParseTreeIterator::impl_locateRecordSource( const ::rtl::OUString& _rComposedName )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_locateRecordSource" );
- if ( !_rComposedName.getLength() )
- {
- OSL_FAIL( "OSQLParseTreeIterator::impl_locateRecordSource: no object name at all?" );
- return OSQLTable();
- }
-
- OSQLTable aReturn;
- ::rtl::OUString sComposedName( _rComposedName );
-
- try
- {
- ::rtl::OUString sCatalog, sSchema, sName;
- qualifiedNameComponents( m_pImpl->m_xDatabaseMetaData, sComposedName, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation );
-
- // check whether there is a query with the given name
- bool bQueryDoesExist = m_pImpl->m_xQueryContainer.is() && m_pImpl->m_xQueryContainer->hasByName( sComposedName );
-
- // check whether the table container contains an object with the given name
- if ( !bQueryDoesExist && !m_pImpl->m_xTableContainer->hasByName( sComposedName ) )
- sComposedName = lcl_findTableInMetaData( m_pImpl->m_xDatabaseMetaData, sCatalog, sSchema, sName );
- bool bTableDoesExist = m_pImpl->m_xTableContainer->hasByName( sComposedName );
-
- // now obtain the object
-
- // if we're creating a table, and there already is a table or query with the same name,
- // this is worth an error
- if ( SQL_STATEMENT_CREATE_TABLE == m_eStatementType )
- {
- if ( bQueryDoesExist )
- impl_appendError( IParseContext::ERROR_INVALID_QUERY_EXIST, &sName );
- else if ( bTableDoesExist )
- impl_appendError( IParseContext::ERROR_INVALID_TABLE_EXIST, &sName );
- else
- aReturn = impl_createTableObject( sName, sCatalog, sSchema );
- }
- else
- {
- // queries win over tables, so if there's a query with this name, take this, no matter if
- // there's a table, too
- if ( bQueryDoesExist )
- {
- if ( !m_pImpl->isQueryAllowed( sComposedName ) )
- {
- impl_appendError( m_rParser.getErrorHelper().getSQLException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES, NULL ) );
- return NULL;
- }
-
- m_pImpl->m_xQueryContainer->getByName( sComposedName ) >>= aReturn;
-
- // collect the parameters from the sub query
- ForbidQueryName aForbidName( *m_pImpl, sComposedName );
- impl_getQueryParameterColumns( aReturn );
- }
- else if ( bTableDoesExist )
- m_pImpl->m_xTableContainer->getByName( sComposedName ) >>= aReturn;
- else
- {
- if ( m_pImpl->m_xQueryContainer.is() )
- // the connection on which we're working supports sub queries in from (else
- // m_xQueryContainer would not have been set), so emit a better error message
- impl_appendError( IParseContext::ERROR_INVALID_TABLE_OR_QUERY, &sName );
- else
- impl_appendError( IParseContext::ERROR_INVALID_TABLE, &sName );
- }
- }
- }
- catch(Exception&)
- {
- impl_appendError( IParseContext::ERROR_INVALID_TABLE, &sComposedName );
- }
-
- return aReturn;
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseOneTableName( OSQLTables& _rTables,const OSQLParseNode * pTableName, const ::rtl::OUString & rTableRange )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOneTableName" );
- if ( ( m_pImpl->m_nIncludeMask & TableNames ) != TableNames )
- // tables should not be included in the traversal
- return;
-
- OSL_ENSURE(pTableName != NULL,"OSQLParseTreeIterator::traverseOneTableName: pTableName == NULL");
-
- Any aCatalog;
- ::rtl::OUString aSchema,aTableName,aComposedName;
- ::rtl::OUString aTableRange(rTableRange);
-
- // Tabellenname abholen
- OSQLParseNode::getTableComponents(pTableName,aCatalog,aSchema,aTableName,m_pImpl->m_xDatabaseMetaData);
-
- // create the composed name like DOMAIN.USER.TABLE1
- aComposedName = ::dbtools::composeTableName(m_pImpl->m_xDatabaseMetaData,
- aCatalog.hasValue() ? ::comphelper::getString(aCatalog) : ::rtl::OUString(),
- aSchema,
- aTableName,
- sal_False,
- ::dbtools::eInDataManipulation);
-
- // if there is no alias for the table name assign the orignal name to it
- if ( !aTableRange.getLength() )
- aTableRange = aComposedName;
-
- // get the object representing this table/query
- OSQLTable aTable = impl_locateRecordSource( aComposedName );
- if ( aTable.is() )
- _rTables[ aTableRange ] = aTable;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::impl_fillJoinConditions(const OSQLParseNode* i_pJoinCondition)
-{
- if (i_pJoinCondition->count() == 3 && // Ausdruck is geklammert
- SQL_ISPUNCTUATION(i_pJoinCondition->getChild(0),"(") &&
- SQL_ISPUNCTUATION(i_pJoinCondition->getChild(2),")"))
- {
- impl_fillJoinConditions(i_pJoinCondition->getChild(1));
- }
- else if (SQL_ISRULEOR2(i_pJoinCondition,search_condition,boolean_term) && // AND/OR-Verknuepfung:
- i_pJoinCondition->count() == 3)
- {
- // nur AND Verknüpfung zulassen
- if ( SQL_ISTOKEN(i_pJoinCondition->getChild(1),AND) )
- {
- impl_fillJoinConditions(i_pJoinCondition->getChild(0));
- impl_fillJoinConditions(i_pJoinCondition->getChild(1));
- }
- }
- else if (SQL_ISRULE(i_pJoinCondition,comparison_predicate))
- {
- // only the comparison of columns is allowed
- OSL_ENSURE(i_pJoinCondition->count() == 3,"OQueryDesignView::InsertJoinConnection: Fehler im Parse Tree");
- if (SQL_ISRULE(i_pJoinCondition->getChild(0),column_ref) &&
- SQL_ISRULE(i_pJoinCondition->getChild(2),column_ref) &&
- i_pJoinCondition->getChild(1)->getNodeType() == SQL_NODE_EQUAL)
- {
- m_pImpl->m_aJoinConditions.push_back( TNodePair(i_pJoinCondition->getChild(0),i_pJoinCondition->getChild(2)) );
- }
- }
-}
-//-----------------------------------------------------------------------------
-::std::vector< TNodePair >& OSQLParseTreeIterator::getJoinConditions() const
-{
- return m_pImpl->m_aJoinConditions;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::getQualified_join( OSQLTables& _rTables, const OSQLParseNode *pTableRef, ::rtl::OUString& aTableRange )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getQualified_join" );
- OSL_PRECOND( SQL_ISRULE( pTableRef, cross_union ) || SQL_ISRULE( pTableRef, qualified_join ) ,
- "OSQLParseTreeIterator::getQualified_join: illegal node!" );
-
- aTableRange = ::rtl::OUString();
-
- const OSQLParseNode* pNode = getTableNode(_rTables,pTableRef->getChild(0),aTableRange);
- if ( isTableNode( pNode ) )
- traverseOneTableName( _rTables, pNode, aTableRange );
-
- sal_uInt32 nPos = 4;
- if( SQL_ISRULE(pTableRef,cross_union) || pTableRef->getChild(1)->getTokenID() != SQL_TOKEN_NATURAL)
- {
- nPos = 3;
- // join_condition,named_columns_join
- if ( SQL_ISRULE( pTableRef, qualified_join ) )
- {
- const OSQLParseNode* pJoin_spec = pTableRef->getChild(4);
- if ( SQL_ISRULE( pJoin_spec, join_condition ) )
- {
- impl_fillJoinConditions(pJoin_spec->getChild(1));
- }
- else
- {
- const OSQLParseNode* pColumnCommalist = pJoin_spec->getChild(2);
- // Alle Columns in der column_commalist ...
- for (sal_uInt32 i = 0; i < pColumnCommalist->count(); i++)
- {
- const OSQLParseNode * pCol = pColumnCommalist->getChild(i);
- // add twice because the column must exists in both tables
- m_pImpl->m_aJoinConditions.push_back( TNodePair(pCol,pCol) );
- }
- }
- }
- }
-
- pNode = getTableNode(_rTables,pTableRef->getChild(nPos),aTableRange);
- if ( isTableNode( pNode ) )
- traverseOneTableName( _rTables, pNode, aTableRange );
-}
-//-----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getTableNode( OSQLTables& _rTables, const OSQLParseNode *pTableRef,::rtl::OUString& rTableRange )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getTableNode" );
- OSL_PRECOND( SQL_ISRULE( pTableRef, table_ref ) || SQL_ISRULE( pTableRef, joined_table )
- || SQL_ISRULE( pTableRef, qualified_join ) || SQL_ISRULE( pTableRef, cross_union ),
- "OSQLParseTreeIterator::getTableNode: only to be called for table_ref nodes!" );
-
- const OSQLParseNode* pTableNameNode = NULL;
-
- if ( SQL_ISRULE( pTableRef, joined_table ) )
- {
- getQualified_join( _rTables, pTableRef->getChild(1), rTableRange );
- }
- if ( SQL_ISRULE( pTableRef, qualified_join ) || SQL_ISRULE( pTableRef, cross_union ) )
- {
- getQualified_join( _rTables, pTableRef, rTableRange );
- }
- else
- {
- rTableRange = OSQLParseNode::getTableRange(pTableRef);
- if ( ( pTableRef->count() == 4 ) // '{' SQL_TOKEN_OJ joined_table '}'
- || ( pTableRef->count() == 5 ) // '(' joined_table ')' range_variable op_column_commalist
- )
- {
- getQualified_join( _rTables, pTableRef->getChild(6 - pTableRef->count()), rTableRange );
- }
- else if ( pTableRef->count() == 3 ) // subquery range_variable op_column_commalist || '(' joined_table ')'
- {
- const OSQLParseNode* pSubQuery = pTableRef->getChild(0);
- if ( pSubQuery->isToken() )
- {
- getQualified_join( _rTables, pTableRef->getChild(1), rTableRange );
- }
- else
- {
- OSL_ENSURE( pSubQuery->count() == 3, "sub queries should have 3 children!" );
- const OSQLParseNode* pQueryExpression = pSubQuery->getChild(1);
- if ( SQL_ISRULE( pQueryExpression, select_statement ) )
- {
- getSelect_statement( *m_pImpl->m_pSubTables, pQueryExpression );
- }
- else
- {
- OSL_FAIL( "OSQLParseTreeIterator::getTableNode: subquery which is no select_statement: not yet implemented!" );
- }
- }
- }
- else if ( pTableRef->count() == 2 ) // table_node table_primary_as_range_column
- {
- pTableNameNode = pTableRef->getChild(0);
- }
- else
- OSL_FAIL( "OSQLParseTreeIterator::getTableNode: unhandled case!" );
- }
-
- return pTableNameNode;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::getSelect_statement(OSQLTables& _rTables,const OSQLParseNode* pSelect)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSelect_statement" );
- if(SQL_ISRULE(pSelect,union_statement))
- {
- getSelect_statement(_rTables,pSelect->getChild(0));
- //getSelect_statement(pSelect->getChild(3));
- return;
- }
- OSQLParseNode * pTableRefCommalist = pSelect->getChild(3)->getChild(0)->getChild(1);
-
- OSL_ENSURE(pTableRefCommalist != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableRefCommalist,table_ref_commalist),"OSQLParseTreeIterator: error in parse tree!");
-
- const OSQLParseNode* pTableName = NULL;
- ::rtl::OUString aTableRange;
- for (sal_uInt32 i = 0; i < pTableRefCommalist->count(); i++)
- { // from clause durchlaufen
- aTableRange = ::rtl::OUString();
-
- const OSQLParseNode* pTableListElement = pTableRefCommalist->getChild(i);
- if ( isTableNode( pTableListElement ) )
- {
- traverseOneTableName( _rTables, pTableListElement, aTableRange );
- }
- else if ( SQL_ISRULE( pTableListElement, table_ref ) )
- {
- // Tabellenreferenz kann aus Tabellennamen, Tabellennamen (+),'('joined_table')'(+) bestehen
- pTableName = pTableListElement->getChild(0);
- if( isTableNode( pTableName ) )
- { // Tabellennamen gefunden
- aTableRange = OSQLParseNode::getTableRange(pTableListElement);
- traverseOneTableName( _rTables, pTableName, aTableRange );
- }
- else if(SQL_ISPUNCTUATION(pTableName,"{"))
- { // '{' SQL_TOKEN_OJ joined_table '}'
- getQualified_join( _rTables, pTableListElement->getChild(2), aTableRange );
- }
- else
- { // '(' joined_table ')' range_variable op_column_commalist
- getTableNode( _rTables, pTableListElement, aTableRange );
- }
- }
- else if (SQL_ISRULE( pTableListElement, qualified_join ) || SQL_ISRULE( pTableListElement, cross_union ) )
- {
- getQualified_join( _rTables, pTableListElement, aTableRange );
- }
- else if ( SQL_ISRULE( pTableListElement, joined_table ) )
- {
- getQualified_join( _rTables, pTableListElement->getChild(1), aTableRange );
- }
-
- // if (! aIteratorStatus.IsSuccessful()) break;
- }
-}
-//-----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::traverseTableNames(OSQLTables& _rTables)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseTableNames" );
- if ( m_pParseTree == NULL )
- return false;
-
- OSQLParseNode* pTableName = NULL;
-
- switch ( m_eStatementType )
- {
- case SQL_STATEMENT_SELECT:
- getSelect_statement( _rTables, m_pParseTree );
- break;
-
- case SQL_STATEMENT_CREATE_TABLE:
- case SQL_STATEMENT_INSERT:
- case SQL_STATEMENT_DELETE:
- pTableName = m_pParseTree->getChild(2);
- break;
-
- case SQL_STATEMENT_UPDATE:
- pTableName = m_pParseTree->getChild(1);
- break;
- default:
- break;
- }
-
- if ( pTableName )
- {
- ::rtl::OUString sTableRange;
- traverseOneTableName( _rTables, pTableName, sTableRange );
- }
-
- return !hasErrors();
-}
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParseTreeIterator::getColumnAlias(const OSQLParseNode* _pDerivedColumn)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnAlias" );
- OSL_ENSURE(SQL_ISRULE(_pDerivedColumn,derived_column),"No derived column!");
- ::rtl::OUString sColumnAlias;
- if(_pDerivedColumn->getChild(1)->count() == 2)
- sColumnAlias = _pDerivedColumn->getChild(1)->getChild(1)->getTokenValue();
- else if(!_pDerivedColumn->getChild(1)->isRule())
- sColumnAlias = _pDerivedColumn->getChild(1)->getTokenValue();
- return sColumnAlias;
-}
-
-// -----------------------------------------------------------------------------
-namespace
-{
- void lcl_getColumnRange( const OSQLParseNode* _pColumnRef, const Reference< XConnection >& _rxConnection,
- ::rtl::OUString& _out_rColumnName, ::rtl::OUString& _out_rTableRange,
- const OSQLColumns* _pSelectColumns, ::rtl::OUString& _out_rColumnAliasIfPresent )
- {
- _out_rColumnName = _out_rTableRange = _out_rColumnAliasIfPresent = ::rtl::OUString();
- if ( SQL_ISRULE( _pColumnRef, column_ref ) )
- {
- if( _pColumnRef->count() > 1 )
- {
- for ( sal_Int32 i=0; i<((sal_Int32)_pColumnRef->count())-2; ++i )
- _pColumnRef->getChild(i)->parseNodeToStr( _out_rTableRange, _rxConnection, NULL, sal_False, sal_False );
- _out_rColumnName = _pColumnRef->getChild( _pColumnRef->count()-1 )->getChild(0)->getTokenValue();
- }
- else
- _out_rColumnName = _pColumnRef->getChild(0)->getTokenValue();
-
- // look up the column in the select column, to find an possible alias
- if ( _pSelectColumns )
- {
- for ( OSQLColumns::Vector::const_iterator lookupColumn = _pSelectColumns->get().begin();
- lookupColumn != _pSelectColumns->get().end();
- ++lookupColumn
- )
- {
- Reference< XPropertySet > xColumn( *lookupColumn );
- try
- {
- ::rtl::OUString sName, sTableName;
- xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_REALNAME ) ) >>= sName;
- xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TABLENAME ) ) >>= sTableName;
- if ( sName == _out_rColumnName && sTableName == _out_rTableRange )
- xColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_NAME ) ) >>= _out_rColumnAliasIfPresent;
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- }
- }
- else if(SQL_ISRULE(_pColumnRef,general_set_fct) || SQL_ISRULE(_pColumnRef,set_fct_spec))
- { // Funktion
- _pColumnRef->parseNodeToStr( _out_rColumnName, _rxConnection );
- }
- else if(_pColumnRef->getNodeType() == SQL_NODE_NAME)
- _out_rColumnName = _pColumnRef->getTokenValue();
- }
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef,
- ::rtl::OUString& _rColumnName,
- ::rtl::OUString& _rTableRange) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" );
- ::rtl::OUString sDummy;
- lcl_getColumnRange( _pColumnRef, m_pImpl->m_xConnection, _rColumnName, _rTableRange, NULL, sDummy );
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef,
- ::rtl::OUString& _rColumnName,
- ::rtl::OUString& _rTableRange,
- ::rtl::OUString& _out_rColumnAliasIfPresent ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" );
- lcl_getColumnRange( _pColumnRef, m_pImpl->m_xConnection, _rColumnName, _rTableRange, &*m_aSelectColumns, _out_rColumnAliasIfPresent );
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::getColumnRange( const OSQLParseNode* _pColumnRef,
- const Reference< XConnection >& _rxConnection, ::rtl::OUString& _out_rColumnName, ::rtl::OUString& _out_rTableRange )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnRange" );
- ::rtl::OUString sDummy;
- lcl_getColumnRange( _pColumnRef, _rxConnection, _out_rColumnName, _out_rTableRange, NULL, sDummy );
-}
-
-//-----------------------------------------------------------------------------
-sal_Bool OSQLParseTreeIterator::getColumnTableRange(const OSQLParseNode* pNode, ::rtl::OUString &rTableRange) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getColumnTableRange" );
- // Ermitteln ob alle Spalten zu einer Tabelle gehoeren
- if (SQL_ISRULE(pNode,column_ref))
- {
- ::rtl::OUString aColName, aTableRange;
- getColumnRange(pNode, aColName, aTableRange);
- if (!aTableRange.getLength()) // keinen gefunden
- {
- // dann die Spalte in den Tabellen suchen
- for (ConstOSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end(); ++aIter)
- {
- if (aIter->second.is())
- {
- try
- {
- Reference< XNameAccess > xColumns = aIter->second->getColumns();
- if(xColumns->hasByName(aColName))
- {
- Reference< XPropertySet > xColumn;
- if (xColumns->getByName(aColName) >>= xColumn)
- {
- OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!");
- aTableRange = aIter->first;
- break;
- }
- }
- }
- catch(Exception&)
- {
- }
- }
- }
- if (!aTableRange.getLength())
- return sal_False;
- }
-
-
- if (!rTableRange.getLength())
- rTableRange = aTableRange;
- else if (rTableRange != aTableRange)
- return sal_False;
- }
- else
- {
- for (sal_uInt32 i = 0, ncount = pNode->count(); i < ncount; i++)
- {
- if (!getColumnTableRange(pNode->getChild(i), rTableRange))
- return sal_False;
- }
- }
- return sal_True;
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseCreateColumns(const OSQLParseNode* pSelectNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseCreateColumns" );
- // aIteratorStatus.Clear();
-
- if (!pSelectNode || m_eStatementType != SQL_STATEMENT_CREATE_TABLE || m_pImpl->m_pTables->empty())
- {
- impl_appendError( IParseContext::ERROR_GENERAL );
- return;
- }
- if (!SQL_ISRULE(pSelectNode,base_table_element_commalist))
- return ;
-
- for (sal_uInt32 i = 0; i < pSelectNode->count(); i++)
- {
- OSQLParseNode *pColumnRef = pSelectNode->getChild(i);
-
- if (SQL_ISRULE(pColumnRef,column_def))
- {
- ::rtl::OUString aColumnName;
- ::rtl::OUString aTypeName;
- ::rtl::OUString aTableRange;
- sal_Int32 nType = DataType::VARCHAR;
- aColumnName = pColumnRef->getChild(0)->getTokenValue();
-
- OSQLParseNode *pDatatype = pColumnRef->getChild(1);
- if (pDatatype && SQL_ISRULE(pDatatype,character_string_type))
- {
- const OSQLParseNode *pType = pDatatype->getChild(0);
- aTypeName = pType->getTokenValue();
- if (pDatatype->count() == 2 && (pType->getTokenID() == SQL_TOKEN_CHAR || pType->getTokenID() == SQL_TOKEN_CHARACTER ))
- nType = DataType::CHAR;
-
- const OSQLParseNode *pParams = pDatatype->getChild(pDatatype->count()-1);
- if ( pParams->count() )
- {
- sal_Int32 nLen = pParams->getChild(1)->getTokenValue().toInt32();
- (void)nLen;
- }
- }
- else if(pDatatype && pDatatype->getNodeType() == SQL_NODE_KEYWORD)
- {
- aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VARCHAR"));
- }
-
- if (aTypeName.getLength())
- {
- //TODO:Create a new class for create statement to handle field length
- OParseColumn* pColumn = new OParseColumn(aColumnName,aTypeName,::rtl::OUString(),::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,0,0,nType,sal_False,sal_False,isCaseSensitive());
- pColumn->setFunction(sal_False);
- pColumn->setRealName(aColumnName);
-
- Reference< XPropertySet> xCol = pColumn;
- m_aCreateColumns->get().push_back(xCol);
- }
- }
-
- }
-}
-//-----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::traverseSelectColumnNames(const OSQLParseNode* pSelectNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSelectColumnNames" );
- if ( ( m_pImpl->m_nIncludeMask & SelectColumns ) != SelectColumns )
- return true;
-
- if (!pSelectNode || m_eStatementType != SQL_STATEMENT_SELECT || m_pImpl->m_pTables->empty())
- {
- impl_appendError( IParseContext::ERROR_GENERAL );
- return false;
- }
-
- if(SQL_ISRULE(pSelectNode,union_statement))
- {
- return traverseSelectColumnNames( pSelectNode->getChild( 0 ) )
- /*&& traverseSelectColumnNames( pSelectNode->getChild( 3 ) )*/;
- }
-
- static ::rtl::OUString aEmptyString;
- // nyi: mehr Pruefung auf korrekte Struktur!
- if (pSelectNode->getChild(2)->isRule() && SQL_ISPUNCTUATION(pSelectNode->getChild(2)->getChild(0),"*"))
- {
- // SELECT * ...
- setSelectColumnName(m_aSelectColumns,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), aEmptyString,aEmptyString);
- }
- else if (SQL_ISRULE(pSelectNode->getChild(2),scalar_exp_commalist))
- {
- // SELECT column[,column] oder SELECT COUNT(*) ...
- OSQLParseNode * pSelection = pSelectNode->getChild(2);
-
- for (sal_uInt32 i = 0; i < pSelection->count(); i++)
- {
- OSQLParseNode *pColumnRef = pSelection->getChild(i);
-
- //if (SQL_ISRULE(pColumnRef,select_sublist))
- if (SQL_ISRULE(pColumnRef,derived_column) &&
- SQL_ISRULE(pColumnRef->getChild(0),column_ref) &&
- pColumnRef->getChild(0)->count() == 3 &&
- SQL_ISPUNCTUATION(pColumnRef->getChild(0)->getChild(2),"*"))
- {
- // alle Spalten der Tabelle
- ::rtl::OUString aTableRange;
- pColumnRef->getChild(0)->parseNodeToStr( aTableRange, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- setSelectColumnName(m_aSelectColumns,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")), aEmptyString,aTableRange);
- continue;
- }
- else if (SQL_ISRULE(pColumnRef,derived_column))
- {
- ::rtl::OUString aColumnAlias(getColumnAlias(pColumnRef)); // kann leer sein
- ::rtl::OUString sColumnName;
- ::rtl::OUString aTableRange;
- sal_Int32 nType = DataType::VARCHAR;
- sal_Bool bFkt(sal_False);
- pColumnRef = pColumnRef->getChild(0);
- if (
- pColumnRef->count() == 3 &&
- SQL_ISPUNCTUATION(pColumnRef->getChild(0),"(") &&
- SQL_ISPUNCTUATION(pColumnRef->getChild(2),")")
- )
- pColumnRef = pColumnRef->getChild(1);
-
- if (SQL_ISRULE(pColumnRef,column_ref))
- {
- getColumnRange(pColumnRef,sColumnName,aTableRange);
- OSL_ENSURE(sColumnName.getLength(),"Columnname darf nicht leer sein");
- }
- else /*if (SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec) ||
- SQL_ISRULE(pColumnRef,position_exp) || SQL_ISRULE(pColumnRef,extract_exp) ||
- SQL_ISRULE(pColumnRef,length_exp) || SQL_ISRULE(pColumnRef,char_value_fct)||
- SQL_ISRULE(pColumnRef,num_value_exp) || SQL_ISRULE(pColumnRef,term))*/
- {
- /* Funktionsaufruf vorhanden */
- pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_True );
- ::rtl::OUString sTableRange;
- // check if the column is also a parameter
- traverseORCriteria(pColumnRef); // num_value_exp
-
- // gehoeren alle beteiligten Spalten der Funktion zu einer Tabelle
- if (m_pImpl->m_pTables->size() == 1)
- {
- aTableRange = m_pImpl->m_pTables->begin()->first;
- }
- else
- {
- getColumnTableRange(pColumnRef,aTableRange);
- }
- if ( pColumnRef->isRule() )
- {
- bFkt = sal_True;
- nType = getFunctionReturnType(pColumnRef);
- }
- }
- /*
- else
- {
- aIteratorStatus.setStatementTooComplex();
- return;
- }
- */
- if(!aColumnAlias.getLength())
- aColumnAlias = sColumnName;
- setSelectColumnName(m_aSelectColumns,sColumnName,aColumnAlias,aTableRange,bFkt,nType,SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec));
- }
- }
- }
-
- return !hasErrors();
-}
-
-
-//-----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::traverseOrderByColumnNames(const OSQLParseNode* pSelectNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOrderByColumnNames" );
- traverseByColumnNames( pSelectNode, sal_True );
- return !hasErrors();
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseByColumnNames(const OSQLParseNode* pSelectNode,sal_Bool _bOrder)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseByColumnNames" );
- // aIteratorStatus.Clear();
-
- if (pSelectNode == NULL)
- {
- //aIteratorStatus.setInvalidStatement();
- return;
- }
-
- if (m_eStatementType != SQL_STATEMENT_SELECT)
- {
- //aIteratorStatus.setInvalidStatement();
- return;
- }
-
- if(SQL_ISRULE(pSelectNode,union_statement))
- {
- traverseByColumnNames(pSelectNode->getChild(0),_bOrder);
- return;
- }
-
- OSL_ENSURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: error in parse tree!");
-
- OSQLParseNode * pTableExp = pSelectNode->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator:table_exp error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- sal_uInt32 nPos = ( _bOrder ? ORDER_BY_CHILD_POS : 2 );
-
- OSQLParseNode * pOptByClause = pTableExp->getChild(nPos);
- OSL_ENSURE(pOptByClause != NULL,"OSQLParseTreeIterator: error in parse tree!");
- if ( pOptByClause->count() == 0 )
- return;
-
- OSL_ENSURE(pOptByClause->count() == 3,"OSQLParseTreeIterator: error in parse tree!");
-
- OSQLParseNode * pOrderingSpecCommalist = pOptByClause->getChild(2);
- OSL_ENSURE(pOrderingSpecCommalist != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(!_bOrder || SQL_ISRULE(pOrderingSpecCommalist,ordering_spec_commalist),"OSQLParseTreeIterator:ordering_spec_commalist error in parse tree!");
- OSL_ENSURE(pOrderingSpecCommalist->count() > 0,"OSQLParseTreeIterator: error in parse tree!");
-
- ::rtl::OUString sColumnName,aColumnAlias;
- ::rtl::OUString aTableRange;
- sal_uInt32 nCount = pOrderingSpecCommalist->count();
- for (sal_uInt32 i = 0; i < nCount; ++i)
- {
- OSQLParseNode* pColumnRef = pOrderingSpecCommalist->getChild(i);
- OSL_ENSURE(pColumnRef != NULL,"OSQLParseTreeIterator: error in parse tree!");
- if ( _bOrder )
- {
- OSL_ENSURE(SQL_ISRULE(pColumnRef,ordering_spec),"OSQLParseTreeIterator:ordering_spec error in parse tree!");
- OSL_ENSURE(pColumnRef->count() == 2,"OSQLParseTreeIterator: error in parse tree!");
-
- pColumnRef = pColumnRef->getChild(0);
- }
- aTableRange = ::rtl::OUString();
- sColumnName = ::rtl::OUString();
- if ( SQL_ISRULE(pColumnRef,column_ref) )
- {
- // Column-Name (und TableRange):
- if(SQL_ISRULE(pColumnRef,column_ref))
- getColumnRange(pColumnRef,sColumnName,aTableRange);
- else // eine Expression
- pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
-
- OSL_ENSURE(sColumnName.getLength(),"sColumnName darf nicht leer sein");
- }
- else
- { // here I found a predicate
- pColumnRef->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- }
- OSL_ENSURE(pColumnRef != NULL,"OSQLParseTreeIterator: error in parse tree!");
- if ( _bOrder )
- {
- // Ascending/Descending
- OSQLParseNode * pOptAscDesc = pColumnRef->getParent()->getChild(1);
- OSL_ENSURE(pOptAscDesc != NULL,"OSQLParseTreeIterator: error in parse tree!");
-
- sal_Bool bAscending = pOptAscDesc && SQL_ISTOKEN(pOptAscDesc,ASC);
- setOrderByColumnName(sColumnName, aTableRange,bAscending);
- }
- else
- setGroupByColumnName(sColumnName, aTableRange);
- }
-}
-//-----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::traverseGroupByColumnNames(const OSQLParseNode* pSelectNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseGroupByColumnNames" );
- traverseByColumnNames( pSelectNode, sal_False );
- return !hasErrors();
-}
-
-// -----------------------------------------------------------------------------
-namespace
-{
- ::rtl::OUString lcl_generateParameterName( const OSQLParseNode& _rParentNode, const OSQLParseNode& _rParamNode )
- {
- ::rtl::OUString sColumnName( RTL_CONSTASCII_USTRINGPARAM( "param" ) );
- const sal_Int32 nCount = (sal_Int32)_rParentNode.count();
- for ( sal_Int32 i = 0; i < nCount; ++i )
- {
- if ( _rParentNode.getChild(i) == &_rParamNode )
- {
- sColumnName += ::rtl::OUString::valueOf( i+1 );
- break;
- }
- }
- return sColumnName;
- }
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseParameters(const OSQLParseNode* _pNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseParameters" );
- if ( _pNode == NULL )
- return;
-
- ::rtl::OUString sColumnName, sTableRange, aColumnAlias;
- const OSQLParseNode* pParent = _pNode->getParent();
- if ( pParent != NULL )
- {
- if ( SQL_ISRULE(pParent,comparison_predicate) ) // x = X
- {
- sal_uInt32 nPos = 0;
- if ( pParent->getChild(nPos) == _pNode )
- nPos = 2;
- const OSQLParseNode* pOther = pParent->getChild(nPos);
- if ( SQL_ISRULE( pOther, column_ref ) )
- getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias);
- else
- pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- } // if ( SQL_ISRULE(pParent,comparison_predicate) ) // x = X
- else if ( SQL_ISRULE(pParent,other_like_predicate_part_2) )
- {
- const OSQLParseNode* pOther = pParent->getParent()->getChild(0);
- if ( SQL_ISRULE( pOther, column_ref ) )
- getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias);
- else
- pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- }
- else if ( SQL_ISRULE(pParent,between_predicate_part_2) )
- {
- const OSQLParseNode* pOther = pParent->getParent()->getChild(0);
- if ( SQL_ISRULE( pOther, column_ref ) )
- getColumnRange( pOther, sColumnName, sTableRange, aColumnAlias);
- else
- {
- pOther->parseNodeToStr( sColumnName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- lcl_generateParameterName( *pParent, *_pNode );
- }
- }
- else if ( pParent->getNodeType() == SQL_NODE_COMMALISTRULE )
- {
- lcl_generateParameterName( *pParent, *_pNode );
- }
- }
- traverseParameter( _pNode, pParent, sColumnName, sTableRange, aColumnAlias );
- const sal_uInt32 nCount = _pNode->count();
- for (sal_uInt32 i = 0; i < nCount; ++i)
- {
- const OSQLParseNode* pChild = _pNode->getChild(i);
- traverseParameters( pChild );
- }
-}
-//-----------------------------------------------------------------------------
-bool OSQLParseTreeIterator::traverseSelectionCriteria(const OSQLParseNode* pSelectNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSelectionCriteria" );
- if ( pSelectNode == NULL )
- return false;
-
-
- // Parse Tree analysieren (je nach Statement-Typ)
- // und Zeiger auf WHERE-Klausel setzen:
- OSQLParseNode * pWhereClause = NULL;
-
- if (m_eStatementType == SQL_STATEMENT_SELECT)
- {
- if(SQL_ISRULE(pSelectNode,union_statement))
- {
- return traverseSelectionCriteria( pSelectNode->getChild( 0 ) )
- && traverseSelectionCriteria( pSelectNode->getChild( 3 ) );
- }
- OSL_ENSURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: error in parse tree!");
-
- OSQLParseNode * pTableExp = pSelectNode->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- pWhereClause = pTableExp->getChild(1);
- } else if (SQL_ISRULE(pSelectNode,update_statement_searched)) {
- OSL_ENSURE(pSelectNode->count() == 5,"OSQLParseTreeIterator: error in parse tree!");
- pWhereClause = pSelectNode->getChild(4);
- } else if (SQL_ISRULE(pSelectNode,delete_statement_searched)) {
- OSL_ENSURE(pSelectNode->count() == 4,"OSQLParseTreeIterator: error in parse tree!");
- pWhereClause = pSelectNode->getChild(3);
- } else if (SQL_ISRULE(pSelectNode,delete_statement_positioned)) {
- // nyi
- OSL_FAIL("OSQLParseTreeIterator::getSelectionCriteria: positioned nyi");
- } else {
- // Anderes Statement. Keine Selektionskriterien.
- return false;
- }
-
- if (! SQL_ISRULE(pWhereClause,where_clause)) {
- // Die Where Clause ist meistens optional, d. h. es koennte sich auch
- // um "optional_where_clause" handeln.
- OSL_ENSURE(SQL_ISRULE(pWhereClause,opt_where_clause),"OSQLParseTreeIterator: error in parse tree!");
- return false;
- }
-
- // Wenn es aber eine where_clause ist, dann darf sie nicht leer sein:
- OSL_ENSURE(pWhereClause->count() == 2,"OSQLParseTreeIterator: error in parse tree!");
-
- OSQLParseNode * pComparisonPredicate = pWhereClause->getChild(1);
- OSL_ENSURE(pComparisonPredicate != NULL,"OSQLParseTreeIterator: error in parse tree!");
-
- //
- // Und nun die Vergleichskriterien abarbeiten (rekursiv, alles ist erstmal ein OR-Kriterium):
- //
-
- traverseORCriteria(pComparisonPredicate);
-
- return !hasErrors();
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseORCriteria(OSQLParseNode * pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseORCriteria" );
-
-
- if (
- pSearchCondition->count() == 3 &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")
- )
- {
- // Runde Klammern um den Ausdruck
- traverseORCriteria(pSearchCondition->getChild(1));
- } else if (SQL_ISRULE(pSearchCondition,search_condition) &&
- pSearchCondition->count() == 3 &&
- SQL_ISTOKEN(pSearchCondition->getChild(1),OR))
- {
- // OR-Verknuepfung:
-
- for (int i = 0; i < 3; i++) {
- if (i == 1) continue; // Schluesselwort OR ueberspringen
-
- // Ist das erste Element wieder eine OR-Verknuepfung?
- if (i == 0 &&
- SQL_ISRULE(pSearchCondition->getChild(0),search_condition) &&
- pSearchCondition->getChild(0)->count() == 3 &&
- SQL_ISTOKEN(pSearchCondition->getChild(0)->getChild(1),OR))
- {
- // Dann rekursiv absteigen ...
- traverseORCriteria(pSearchCondition->getChild(0));
-
- } else {
- // AND-Kriterien ...
- traverseANDCriteria(pSearchCondition->getChild(i));
- // if (! aIteratorStatus.IsSuccessful()) break;
- }
-
- // if (! aIteratorStatus.IsSuccessful()) break;
- }
- } else {
- // Nur *ein* Kriterium oder eine AND-Verknuepfung von Kriterien.
- // Direkt die AND-Kriterien behandeln.
- traverseANDCriteria(pSearchCondition);
- // if (! aIteratorStatus.IsSuccessful()) return;
- }
-
- // Fehler einfach weiterreichen.
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseANDCriteria(OSQLParseNode * pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseANDCriteria" );
-
-
- if (
- SQL_ISRULE(pSearchCondition,boolean_primary) &&
- pSearchCondition->count() == 3 &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")
- )
- {
- // Runde Klammern
- traverseANDCriteria(pSearchCondition->getChild(1));
- }
- // Das erste Element ist eine OR-Verknuepfung
- else if ( SQL_ISRULE(pSearchCondition,search_condition) && pSearchCondition->count() == 3 )
- {
- // Dann rekursiv absteigen (dieselbe Row benutzen) ...
- traverseORCriteria(pSearchCondition->getChild(0));
-// if (! aIteratorStatus.IsSuccessful())
-// return;
-
- // Und mit dem rechten Child weitermachen:
- traverseANDCriteria(pSearchCondition->getChild(2));
- }
- // Das erste Element ist (wieder) eine AND-Verknuepfung
- else if ( SQL_ISRULE(pSearchCondition,boolean_term) && pSearchCondition->count() == 3 )
- {
- // Dann rekursiv absteigen (dieselbe Row benutzen) ...
- traverseANDCriteria(pSearchCondition->getChild(0));
-// if (! aIteratorStatus.IsSuccessful())
-// return;
-
- // Und mit dem rechten Child weitermachen:
- traverseANDCriteria(pSearchCondition->getChild(2));
- }
- // Sonst einzelne Suchkriterien wie =, !=, ..., LIKE, IS NULL usw. behandeln:
- else if (SQL_ISRULE(pSearchCondition,comparison_predicate) )
- {
- ::rtl::OUString aValue;
- pSearchCondition->getChild(2)->parseNodeToStr( aValue, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- traverseOnePredicate(pSearchCondition->getChild(0),aValue,pSearchCondition->getChild(2));
- impl_fillJoinConditions(pSearchCondition);
-// if (! aIteratorStatus.IsSuccessful())
-// return;
- }
- else if (SQL_ISRULE(pSearchCondition,like_predicate) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/)
- {
- OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!");
- const OSQLParseNode* pPart2 = pSearchCondition->getChild(1);
-
- sal_Int32 nCurentPos = pPart2->count()-2;
-
- OSQLParseNode * pNum_value_exp = pPart2->getChild(nCurentPos);
- OSQLParseNode * pOptEscape = pPart2->getChild(nCurentPos+1);
-
- OSL_ENSURE(pNum_value_exp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pOptEscape != NULL,"OSQLParseTreeIterator: error in parse tree!");
-
- if (pOptEscape->count() != 0)
- {
- // aIteratorStatus.setStatementTooComplex();
- return;
- }
-
- ::rtl::OUString aValue;
- OSQLParseNode * pParam = NULL;
- if (SQL_ISRULE(pNum_value_exp,parameter))
- pParam = pNum_value_exp;
- else if(pNum_value_exp->isToken())
- // Normaler Wert
- aValue = pNum_value_exp->getTokenValue();
- else
- {
- pNum_value_exp->parseNodeToStr( aValue, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- pParam = pNum_value_exp;
- }
-
- traverseOnePredicate(pSearchCondition->getChild(0),aValue,pParam);
-// if (! aIteratorStatus.IsSuccessful())
-// return;
- }
- else if (SQL_ISRULE(pSearchCondition,in_predicate))
- {
- OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!");
- const OSQLParseNode* pPart2 = pSearchCondition->getChild(1);
-
- traverseORCriteria(pSearchCondition->getChild(0));
- // if (! aIteratorStatus.IsSuccessful()) return;
-
- OSQLParseNode* pChild = pPart2->getChild(2);
- if ( SQL_ISRULE(pChild->getChild(0),subquery) )
- {
- traverseTableNames( *m_pImpl->m_pSubTables );
- traverseSelectionCriteria(pChild->getChild(0)->getChild(1));
- }
- else
- { // '(' value_exp_commalist ')'
- pChild = pChild->getChild(1);
- sal_Int32 nCount = pChild->count();
- for (sal_Int32 i=0; i < nCount; ++i)
- {
- traverseANDCriteria(pChild->getChild(i));
- }
- }
- }
- else if (SQL_ISRULE(pSearchCondition,test_for_null) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/)
- {
- OSL_ENSURE(pSearchCondition->count() == 2,"OSQLParseTreeIterator: error in parse tree!");
- const OSQLParseNode* pPart2 = pSearchCondition->getChild(1);
- (void)pPart2;
- OSL_ENSURE(SQL_ISTOKEN(pPart2->getChild(0),IS),"OSQLParseTreeIterator: error in parse tree!");
-
- ::rtl::OUString aString;
- traverseOnePredicate(pSearchCondition->getChild(0),aString,NULL);
- // if (! aIteratorStatus.IsSuccessful()) return;
- }
- else if (SQL_ISRULE(pSearchCondition,num_value_exp) || SQL_ISRULE(pSearchCondition,term))
- {
- ::rtl::OUString aString;
- traverseOnePredicate(pSearchCondition->getChild(0),aString,pSearchCondition->getChild(0));
- traverseOnePredicate(pSearchCondition->getChild(2),aString,pSearchCondition->getChild(2));
- }
- // Fehler einfach weiterreichen.
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseParameter(const OSQLParseNode* _pParseNode
- ,const OSQLParseNode* _pParentNode
- ,const ::rtl::OUString& _aColumnName
- ,const ::rtl::OUString& _aTableRange
- ,const ::rtl::OUString& _rColumnAlias)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseParameter" );
- if ( !SQL_ISRULE( _pParseNode, parameter ) )
- return;
-
- if ( ( m_pImpl->m_nIncludeMask & Parameters ) != Parameters )
- // parameters not to be included in the traversal
- return;
-
- OSL_ENSURE(_pParseNode->count() > 0,"OSQLParseTreeIterator: error in parse tree!");
- OSQLParseNode * pMark = _pParseNode->getChild(0);
- ::rtl::OUString sParameterName;
-
- if (SQL_ISPUNCTUATION(pMark,"?"))
- {
- sParameterName = _rColumnAlias.getLength()
- ? _rColumnAlias
- : _aColumnName.getLength()
- ? _aColumnName
- : ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("?"));
- }
- else if (SQL_ISPUNCTUATION(pMark,":"))
- {
- sParameterName = _pParseNode->getChild(1)->getTokenValue();
- }
- else if (SQL_ISPUNCTUATION(pMark,"["))
- {
- sParameterName = _pParseNode->getChild(1)->getTokenValue();
- }
- else
- {
- OSL_FAIL("OSQLParseTreeIterator: error in parse tree!");
- }
-
- // found a parameter
- if ( _pParentNode && (SQL_ISRULE(_pParentNode,general_set_fct) || SQL_ISRULE(_pParentNode,set_fct_spec)) )
- {// found a function as column_ref
- ::rtl::OUString sFunctionName;
- _pParentNode->getChild(0)->parseNodeToStr( sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- const sal_uInt32 nCount = _pParentNode->count();
- sal_uInt32 i = 0;
- for(; i < nCount;++i)
- {
- if ( _pParentNode->getChild(i) == _pParseNode )
- break;
- }
- sal_Int32 nType = ::connectivity::OSQLParser::getFunctionParameterType( _pParentNode->getChild(0)->getTokenID(), i-1);
-
- OParseColumn* pColumn = new OParseColumn( sParameterName,
- ::rtl::OUString(),
- ::rtl::OUString(),
- ::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,
- 0,
- 0,
- nType,
- sal_False,
- sal_False,
- isCaseSensitive());
- pColumn->setFunction(sal_True);
- pColumn->setAggregateFunction(sal_True);
- pColumn->setRealName(sFunctionName);
- m_aParameters->get().push_back(pColumn);
- }
- else
- {
- sal_Bool bNotFound = sal_True;
- OSQLColumns::Vector::const_iterator aIter = ::connectivity::find(
- m_aSelectColumns->get().begin(),
- m_aSelectColumns->get().end(),
- _aColumnName,::comphelper::UStringMixEqual( isCaseSensitive() )
- );
- if(aIter != m_aSelectColumns->get().end())
- {
- OParseColumn* pNewColumn = new OParseColumn(*aIter,isCaseSensitive());
- pNewColumn->setName(sParameterName);
- pNewColumn->setRealName(_aColumnName);
- m_aParameters->get().push_back(pNewColumn);
- bNotFound = sal_False;
- }
- else if(_aColumnName.getLength())// search in the tables for the right one
- {
-
- Reference<XPropertySet> xColumn = findColumn( _aColumnName, _aTableRange, true );
-
- if ( xColumn.is() )
- {
- OParseColumn* pNewColumn = new OParseColumn(xColumn,isCaseSensitive());
- pNewColumn->setName(sParameterName);
- pNewColumn->setRealName(_aColumnName);
- m_aParameters->get().push_back(pNewColumn);
- bNotFound = sal_False;
- }
- }
- if ( bNotFound )
- {
- sal_Int32 nType = DataType::VARCHAR;
- OSQLParseNode* pParent = _pParentNode ? _pParentNode->getParent() : NULL;
- if ( pParent && (SQL_ISRULE(pParent,general_set_fct) || SQL_ISRULE(pParent,set_fct_spec)) )
- {
- const sal_uInt32 nCount = _pParentNode->count();
- sal_uInt32 i = 0;
- for(; i < nCount;++i)
- {
- if ( _pParentNode->getChild(i) == _pParseNode )
- break;
- }
- nType = ::connectivity::OSQLParser::getFunctionParameterType( pParent->getChild(0)->getTokenID(), i+1);
- }
-
- ::rtl::OUString aNewColName( getUniqueColumnName( sParameterName ) );
-
- OParseColumn* pColumn = new OParseColumn(aNewColName,
- ::rtl::OUString(),
- ::rtl::OUString(),
- ::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,
- 0,
- 0,
- nType,
- sal_False,
- sal_False,
- isCaseSensitive() );
- pColumn->setName(aNewColName);
- pColumn->setRealName(sParameterName);
- m_aParameters->get().push_back(pColumn);
- }
- }
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseOnePredicate(
- OSQLParseNode * pColumnRef,
- ::rtl::OUString& rValue,
- OSQLParseNode * pParseNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseOnePredicate" );
- if ( !pParseNode )
- return;
-
- // Column-Name (und TableRange):
- ::rtl::OUString aColumnName, aTableRange, sColumnAlias;
- getColumnRange( pColumnRef, aColumnName, aTableRange, sColumnAlias);
-
- ::rtl::OUString aName;
-
- /*if (SQL_ISRULE(pParseNode,parameter))
- traverseParameter( pParseNode, pColumnRef, aColumnName, aTableRange, sColumnAlias );
- else */if (SQL_ISRULE(pParseNode,column_ref))// Column-Name (und TableRange):
- getColumnRange(pParseNode,aName,rValue);
- else
- {
- traverseORCriteria(pParseNode);
- // if (! aIteratorStatus.IsSuccessful()) return;
- }
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseSome( sal_uInt32 _nIncludeMask )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseSome" );
- impl_traverse( _nIncludeMask );
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::traverseAll()
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::traverseAll" );
- impl_traverse( All );
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::impl_traverse( sal_uInt32 _nIncludeMask )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_traverse" );
- impl_resetErrors();
- m_pImpl->m_nIncludeMask = _nIncludeMask;
-
- if ( !traverseTableNames( *m_pImpl->m_pTables ) )
- return;
-
- switch ( m_eStatementType )
- {
- case SQL_STATEMENT_SELECT:
- {
- const OSQLParseNode* pSelectNode = m_pParseTree;
- traverseParameters( pSelectNode );
- if ( !traverseSelectColumnNames( pSelectNode )
- || !traverseOrderByColumnNames( pSelectNode )
- || !traverseGroupByColumnNames( pSelectNode )
- || !traverseSelectionCriteria( pSelectNode )
- )
- return;
- }
- break;
- case SQL_STATEMENT_CREATE_TABLE:
- {
- //0 | 1 | 2 |3| 4 |5
- //create table sc.foo ( a char(20), b char )
- const OSQLParseNode* pCreateNode = m_pParseTree->getChild(4);
- traverseCreateColumns(pCreateNode);
- }
- break;
- case SQL_STATEMENT_INSERT:
- break;
- default:
- break;
- }
-}
-
-// Dummy-Implementationen:
-
-//-----------------------------------------------------------------------------
-OSQLTable OSQLParseTreeIterator::impl_createTableObject( const ::rtl::OUString& rTableName,
- const ::rtl::OUString& rCatalogName, const ::rtl::OUString& rSchemaName )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_createTableObject" );
- OSL_PRECOND( m_eStatementType == SQL_STATEMENT_CREATE_TABLE,
- "OSQLParseTreeIterator::impl_createTableObject: only to be called for CREATE TABLE statements!" );
- // (in all other cases, m_pTables is to contain the table objects as obtained from the tables
- // container of the connection (m_xTablesContainer)
-
- OSQLTable aReturnTable = new OTable(
- NULL,
- sal_False,
- rTableName,
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Table")),
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("New Created Table")),
- rSchemaName,
- rCatalogName
- );
- return aReturnTable;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::appendColumns(::rtl::Reference<OSQLColumns>& _rColumns,const ::rtl::OUString& _rTableAlias,const OSQLTable& _rTable)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::appendColumns" );
-
- if (!_rTable.is())
- return;
-
- Reference<XNameAccess> xColumns = _rTable->getColumns();
- if ( !xColumns.is() )
- return;
-
- Sequence< ::rtl::OUString > aColNames = xColumns->getElementNames();
- const ::rtl::OUString* pBegin = aColNames.getConstArray();
- const ::rtl::OUString* pEnd = pBegin + aColNames.getLength();
-
- for(;pBegin != pEnd;++pBegin)
- {
-
- ::rtl::OUString aName(getUniqueColumnName(*pBegin));
- Reference< XPropertySet > xColumn;
- if(xColumns->hasByName(*pBegin) && (xColumns->getByName(*pBegin) >>= xColumn) && xColumn.is())
- {
- OParseColumn* pColumn = new OParseColumn(aName
- , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))
- , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE)))
- , getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION)))
- , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE)))
- , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)))
- , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)))
- , getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))
- , getBOOL(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT)))
- , getBOOL(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))
- , isCaseSensitive() );
-
- pColumn->setTableName(_rTableAlias);
- pColumn->setRealName(*pBegin);
- Reference< XPropertySet> xCol = pColumn;
- _rColumns->get().push_back(xCol);
- }
- else
- impl_appendError( IParseContext::ERROR_INVALID_COLUMN, pBegin, &_rTableAlias );
- }
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::setSelectColumnName(::rtl::Reference<OSQLColumns>& _rColumns,const ::rtl::OUString & rColumnName,const ::rtl::OUString & rColumnAlias, const ::rtl::OUString & rTableRange,sal_Bool bFkt,sal_Int32 _nType,sal_Bool bAggFkt)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setSelectColumnName" );
- if(rColumnName.toChar() == '*' && !rTableRange.getLength())
- { // SELECT * ...
- OSL_ENSURE(_rColumns == m_aSelectColumns,"Invalid columns used here!");
- for(ConstOSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end();++aIter)
- appendColumns(_rColumns,aIter->first,aIter->second);
- }
- else if( rColumnName.toChar() == '*' && rTableRange.getLength() )
- { // SELECT <table>.*
- OSL_ENSURE(_rColumns == m_aSelectColumns,"Invalid columns used here!");
- ConstOSQLTablesIterator aFind = m_pImpl->m_pTables->find(rTableRange);
-
- if(aFind != m_pImpl->m_pTables->end())
- appendColumns(_rColumns,rTableRange,aFind->second);
- }
- else if ( !rTableRange.getLength() )
- { // SELECT <something> ...
- // without table specified
- if ( !bFkt )
- {
- Reference< XPropertySet> xNewColumn;
-
- for ( OSQLTablesIterator aIter = m_pImpl->m_pTables->begin(); aIter != m_pImpl->m_pTables->end(); ++aIter )
- {
- if ( !aIter->second.is() )
- continue;
-
- Reference<XNameAccess> xColumns = aIter->second->getColumns();
- Reference< XPropertySet > xColumn;
- if ( !xColumns->hasByName( rColumnName )
- || !( xColumns->getByName( rColumnName ) >>= xColumn )
- )
- continue;
-
- ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
-
- OParseColumn* pColumn = new OParseColumn(xColumn,isCaseSensitive());
- xNewColumn = pColumn;
- pColumn->setTableName(aIter->first);
- pColumn->setName(aNewColName);
- pColumn->setRealName(rColumnName);
-
- break;
- }
-
- if ( !xNewColumn.is() )
- {
- // no function (due to the above !bFkt), no existing column
- // => assume an expression
- ::rtl::OUString aNewColName( getUniqueColumnName( rColumnAlias ) );
- // did not find a column with this name in any of the tables
- OParseColumn* pColumn = new OParseColumn(
- aNewColName,
- ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")),
- // TODO: does this match with _nType?
- // Or should be fill this from the getTypeInfo of the connection?
- ::rtl::OUString(),
- ::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,
- 0,
- 0,
- _nType,
- sal_False,
- sal_False,
- isCaseSensitive()
- );
-
- xNewColumn = pColumn;
- pColumn->setRealName( rColumnName );
- }
-
- _rColumns->get().push_back( xNewColumn );
- }
- else
- {
- ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
-
- OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,0,0,_nType,sal_False,sal_False,isCaseSensitive());
- pColumn->setFunction(sal_True);
- pColumn->setAggregateFunction(bAggFkt);
- pColumn->setRealName(rColumnName);
-
- Reference< XPropertySet> xCol = pColumn;
- _rColumns->get().push_back(xCol);
- }
- }
- else // ColumnName und Tablename vorhanden
- {
- ConstOSQLTablesIterator aFind = m_pImpl->m_pTables->find(rTableRange);
-
- sal_Bool bError = sal_False;
- if (aFind != m_pImpl->m_pTables->end() && aFind->second.is())
- {
- if (bFkt)
- {
- ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
-
- OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,0,0,_nType,sal_False,sal_False,isCaseSensitive());
- pColumn->setFunction(sal_True);
- pColumn->setAggregateFunction(bAggFkt);
- pColumn->setRealName(rColumnName);
- pColumn->setTableName(aFind->first);
-
- Reference< XPropertySet> xCol = pColumn;
- _rColumns->get().push_back(xCol);
- }
- else
- {
- Reference< XPropertySet > xColumn;
- if (aFind->second->getColumns()->hasByName(rColumnName) && (aFind->second->getColumns()->getByName(rColumnName) >>= xColumn))
- {
- ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
-
- OParseColumn* pColumn = new OParseColumn(xColumn,isCaseSensitive());
- pColumn->setName(aNewColName);
- pColumn->setRealName(rColumnName);
- pColumn->setTableName(aFind->first);
-
- Reference< XPropertySet> xCol = pColumn;
- _rColumns->get().push_back(xCol);
- }
- else
- bError = sal_True;
- }
- }
- else
- bError = sal_True;
-
- // Tabelle existiert nicht oder Feld nicht vorhanden
- if (bError)
- {
- ::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
-
- OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),::rtl::OUString(),
- ColumnValue::NULLABLE_UNKNOWN,0,0,DataType::VARCHAR,sal_False,sal_False,isCaseSensitive());
- pColumn->setFunction(sal_True);
- pColumn->setAggregateFunction(bAggFkt);
-
- Reference< XPropertySet> xCol = pColumn;
- _rColumns->get().push_back(xCol);
- }
- }
-}
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParseTreeIterator::getUniqueColumnName(const ::rtl::OUString & rColumnName) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getUniqueColumnName" );
- ::rtl::OUString aAlias(rColumnName);
-
- OSQLColumns::Vector::const_iterator aIter = find(
- m_aSelectColumns->get().begin(),
- m_aSelectColumns->get().end(),
- aAlias,
- ::comphelper::UStringMixEqual( isCaseSensitive() )
- );
- sal_Int32 i=1;
- while(aIter != m_aSelectColumns->get().end())
- {
- (aAlias = rColumnName) += ::rtl::OUString::valueOf(i++);
- aIter = find(
- m_aSelectColumns->get().begin(),
- m_aSelectColumns->get().end(),
- aAlias,
- ::comphelper::UStringMixEqual( isCaseSensitive() )
- );
- }
- return aAlias;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange,sal_Bool bAscending)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setOrderByColumnName" );
- Reference<XPropertySet> xColumn = findColumn( rColumnName, rTableRange, false );
- if ( xColumn.is() )
- m_aOrderColumns->get().push_back(new OOrderColumn( xColumn, rTableRange, isCaseSensitive(), bAscending ) );
- else
- {
- sal_Int32 nId = rColumnName.toInt32();
- if ( nId > 0 && nId < static_cast<sal_Int32>(m_aSelectColumns->get().size()) )
- m_aOrderColumns->get().push_back( new OOrderColumn( ( m_aSelectColumns->get() )[nId-1], isCaseSensitive(), bAscending ) );
- }
-
-#ifdef SQL_TEST_PARSETREEITERATOR
- cout << "OSQLParseTreeIterator::setOrderByColumnName: "
- << (const char *) rColumnName << ", "
- << (const char *) rTableRange << ", "
- << (bAscending ? "true" : "false")
- << "\n";
-#endif
-}
-//-----------------------------------------------------------------------------
-void OSQLParseTreeIterator::setGroupByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::setGroupByColumnName" );
- Reference<XPropertySet> xColumn = findColumn( rColumnName, rTableRange, false );
- if ( xColumn.is() )
- m_aGroupColumns->get().push_back(new OParseColumn(xColumn,isCaseSensitive()));
- else
- {
- sal_Int32 nId = rColumnName.toInt32();
- if ( nId > 0 && nId < static_cast<sal_Int32>(m_aSelectColumns->get().size()) )
- m_aGroupColumns->get().push_back(new OParseColumn((m_aSelectColumns->get())[nId-1],isCaseSensitive()));
- }
-
-#ifdef SQL_TEST_PARSETREEITERATOR
- cout << "OSQLParseTreeIterator::setOrderByColumnName: "
- << (const char *) rColumnName << ", "
- << (const char *) rTableRange << ", "
- << (bAscending ? "true" : "false")
- << "\n";
-#endif
-}
-
-//-----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getWhereTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getWhereTree" );
-
-
- if (!m_pParseTree)
- return NULL;
-
- // Parse Tree analysieren (je nach Statement-Typ)
- // und Zeiger auf WHERE-Klausel setzen:
- OSQLParseNode * pWhereClause = NULL;
- if(getStatementType() == SQL_STATEMENT_SELECT)
- {
- OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!");
- OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- pWhereClause = pTableExp->getChild(1);
- }
- else if (SQL_ISRULE(m_pParseTree,update_statement_searched) ||
- SQL_ISRULE(m_pParseTree,delete_statement_searched))
- {
- pWhereClause = m_pParseTree->getChild(m_pParseTree->count()-1);
- }
- if(pWhereClause->count() != 2)
- pWhereClause = NULL;
- return pWhereClause;
-}
-
-//-----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getOrderTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getOrderTree" );
-
-
- if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
- return NULL;
-
- // Parse Tree analysieren (je nach Statement-Typ)
- // und Zeiger auf ORDER-Klausel setzen:
- OSQLParseNode * pOrderClause = NULL;
- OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!");
- OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- pOrderClause = pTableExp->getChild(ORDER_BY_CHILD_POS);
- // Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
- if(pOrderClause->count() != 3)
- pOrderClause = NULL;
- return pOrderClause;
-}
-//-----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getGroupByTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getGroupByTree" );
- if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
- return NULL;
-
- // Parse Tree analysieren (je nach Statement-Typ)
- // und Zeiger auf ORDER-Klausel setzen:
- OSQLParseNode * pGroupClause = NULL;
- OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!");
- OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- pGroupClause = pTableExp->getChild(2);
- // Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
- if(pGroupClause->count() != 3)
- pGroupClause = NULL;
- return pGroupClause;
-}
-//-----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getHavingTree() const
-{
- if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
- return NULL;
-
- // Parse Tree analysieren (je nach Statement-Typ)
- // und Zeiger auf ORDER-Klausel setzen:
- OSQLParseNode * pHavingClause = NULL;
- OSL_ENSURE(m_pParseTree->count() >= 4,"ParseTreeIterator: error in parse tree!");
- OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
- OSL_ENSURE(pTableExp != NULL,"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: error in parse tree!");
- OSL_ENSURE(pTableExp->count() == TABLE_EXPRESSION_CHILD_COUNT,"OSQLParseTreeIterator: error in parse tree!");
-
- pHavingClause = pTableExp->getChild(3);
- // Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
- if(pHavingClause->count() < 1)
- pHavingClause = NULL;
- return pHavingClause;
-}
-// -----------------------------------------------------------------------------
-sal_Bool OSQLParseTreeIterator::isTableNode(const OSQLParseNode* _pTableNode) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::isTableNode" );
- return _pTableNode && (SQL_ISRULE(_pTableNode,catalog_name) ||
- SQL_ISRULE(_pTableNode,schema_name) ||
- SQL_ISRULE(_pTableNode,table_name));
-}
-// -----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getSimpleWhereTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleWhereTree" );
- const OSQLParseNode* pNode = getWhereTree();
- return pNode ? pNode->getChild(1) : NULL;
-}
-// -----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getSimpleOrderTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleOrderTree" );
- const OSQLParseNode* pNode = getOrderTree();
- return pNode ? pNode->getChild(2) : NULL;
-}
-// -----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getSimpleGroupByTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleGroupByTree" );
- const OSQLParseNode* pNode = getGroupByTree();
- return pNode ? pNode->getChild(2) : NULL;
-}
-// -----------------------------------------------------------------------------
-const OSQLParseNode* OSQLParseTreeIterator::getSimpleHavingTree() const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::getSimpleHavingTree" );
- const OSQLParseNode* pNode = getHavingTree();
- return pNode ? pNode->getChild(1) : NULL;
-}
-
-// -----------------------------------------------------------------------------
-Reference< XPropertySet > OSQLParseTreeIterator::findColumn( const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange, bool _bLookInSubTables )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::findColumn" );
- Reference< XPropertySet > xColumn = findColumn( *m_pImpl->m_pTables, rColumnName, rTableRange );
- if ( !xColumn.is() && _bLookInSubTables )
- xColumn = findColumn( *m_pImpl->m_pSubTables, rColumnName, rTableRange );
- return xColumn;
-}
-
-// -----------------------------------------------------------------------------
-Reference< XPropertySet > OSQLParseTreeIterator::findColumn(const OSQLTables& _rTables,const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::findColumn" );
- Reference< XPropertySet > xColumn;
- if ( rTableRange.getLength() )
- {
- ConstOSQLTablesIterator aFind = _rTables.find(rTableRange);
-
- if ( aFind != _rTables.end()
- && aFind->second.is()
- && aFind->second->getColumns().is()
- && aFind->second->getColumns()->hasByName(rColumnName) )
- aFind->second->getColumns()->getByName(rColumnName) >>= xColumn;
- }
- if ( !xColumn.is() )
- {
- OSQLTables::const_iterator aEnd = _rTables.end();
- for(OSQLTables::const_iterator aIter = _rTables.begin(); aIter != aEnd; ++aIter)
- {
- if ( aIter->second.is() )
- {
- Reference<XNameAccess> xColumns = aIter->second->getColumns();
- if( xColumns.is() && xColumns->hasByName(rColumnName) && (xColumns->getByName(rColumnName) >>= xColumn) )
- {
- OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!");
- break; // diese Column darf nur einmal vorkommen
- }
- }
- }
- }
- return xColumn;
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::impl_appendError( IParseContext::ErrorCode _eError, const ::rtl::OUString* _pReplaceToken1, const ::rtl::OUString* _pReplaceToken2 )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_appendError" );
- ::rtl::OUString sErrorMessage = m_rParser.getContext().getErrorMessage( _eError );
- if ( _pReplaceToken1 )
- {
- bool bTwoTokens = ( _pReplaceToken2 != NULL );
- const sal_Char* pPlaceHolder1 = bTwoTokens ? "#1" : "#";
- const ::rtl::OUString sPlaceHolder1 = ::rtl::OUString::createFromAscii( pPlaceHolder1 );
-
- sErrorMessage = sErrorMessage.replaceAt( sErrorMessage.indexOf( sPlaceHolder1 ), sPlaceHolder1.getLength(), *_pReplaceToken1 );
- if ( _pReplaceToken2 )
- sErrorMessage = sErrorMessage.replaceAt( sErrorMessage.indexOf( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#2")) ), 2, *_pReplaceToken2 );
- }
-
- impl_appendError( SQLException(
- sErrorMessage, NULL, getStandardSQLState( SQL_GENERAL_ERROR ), 1000, Any() ) );
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseTreeIterator::impl_appendError( const SQLException& _rError )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseTreeIterator::impl_appendError" );
- if ( m_aErrors.Message.getLength() )
- {
- SQLException* pErrorChain = &m_aErrors;
- while ( pErrorChain->NextException.hasValue() )
- pErrorChain = static_cast< SQLException* >( pErrorChain->NextException.pData );
- pErrorChain->NextException <<= _rError;
- }
- else
- m_aErrors = _rError;
-}
-// -----------------------------------------------------------------------------
-sal_Int32 OSQLParseTreeIterator::getFunctionReturnType(const OSQLParseNode* _pNode )
-{
- sal_Int32 nType = DataType::OTHER;
- ::rtl::OUString sFunctionName;
- if ( SQL_ISRULE(_pNode,length_exp) )
- {
- _pNode->getChild(0)->getChild(0)->parseNodeToStr(sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
- nType = ::connectivity::OSQLParser::getFunctionReturnType( sFunctionName, &m_rParser.getContext() );
- }
- else if ( SQL_ISRULE(_pNode,num_value_exp) || SQL_ISRULE(_pNode,term) || SQL_ISRULE(_pNode,factor) )
- {
- nType = DataType::DOUBLE;
- }
- else
- {
- _pNode->getChild(0)->parseNodeToStr(sFunctionName, m_pImpl->m_xConnection, NULL, sal_False, sal_False );
-
- // MIN and MAX have another return type, we have to check the expression itself.
- // @see http://qa.openoffice.org/issues/show_bug.cgi?id=99566
- if ( SQL_ISRULE(_pNode,general_set_fct) && (SQL_ISTOKEN(_pNode->getChild(0),MIN) || SQL_ISTOKEN(_pNode->getChild(0),MAX) ))
- {
- const OSQLParseNode* pValueExp = _pNode->getChild(3);
- if (SQL_ISRULE(pValueExp,column_ref))
- {
- ::rtl::OUString sColumnName;
- ::rtl::OUString aTableRange;
- getColumnRange(pValueExp,sColumnName,aTableRange);
- OSL_ENSURE(sColumnName.getLength(),"Columnname darf nicht leer sein");
- Reference<XPropertySet> xColumn = findColumn( sColumnName, aTableRange, true );
-
- if ( xColumn.is() )
- {
- xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TYPE)) >>= nType;
- }
- }
- else
- {
- if ( SQL_ISRULE(pValueExp,num_value_exp) || SQL_ISRULE(pValueExp,term) || SQL_ISRULE(pValueExp,factor) )
- {
- nType = DataType::DOUBLE;
- }
- else if ( SQL_ISRULE(pValueExp,datetime_primary) )
- {
- switch(pValueExp->getChild(0)->getTokenID() )
- {
- case SQL_TOKEN_CURRENT_DATE:
- nType = DataType::DATE;
- break;
- case SQL_TOKEN_CURRENT_TIME:
- nType = DataType::TIME;
- break;
- case SQL_TOKEN_CURRENT_TIMESTAMP:
- nType = DataType::TIMESTAMP;
- break;
- }
- }
- else if ( SQL_ISRULE(pValueExp,value_exp_primary) )
- {
- nType = getFunctionReturnType(pValueExp->getChild(1));
- }
- else if ( SQL_ISRULE(pValueExp,concatenation)
- || SQL_ISRULE(pValueExp,char_factor)
- || SQL_ISRULE(pValueExp,bit_value_fct)
- || SQL_ISRULE(pValueExp,char_value_fct)
- || SQL_ISRULE(pValueExp,char_substring_fct)
- || SQL_ISRULE(pValueExp,fold)
- || SQL_ISTOKEN(pValueExp,STRING) )
- {
- nType = DataType::VARCHAR;
- }
- }
- if ( nType == DataType::OTHER )
- nType = DataType::DOUBLE;
- }
- else
- nType = ::connectivity::OSQLParser::getFunctionReturnType( sFunctionName, &m_rParser.getContext() );
- }
-
- return nType;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/parse/sqlnode.cxx b/connectivity/source/parse/sqlnode.cxx
deleted file mode 100644
index 0f9170b0ed..0000000000
--- a/connectivity/source/parse/sqlnode.cxx
+++ /dev/null
@@ -1,2838 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-
-
-#include <sal/macros.h>
-#include <connectivity/sqlnode.hxx>
-#include <connectivity/sqlerror.hxx>
-#include <internalnode.hxx>
-#define YYBISON 1
-#ifndef BISON_INCLUDED
-#define BISON_INCLUDED
-#include <sqlbison.hxx>
-#endif
-#include <connectivity/sqlparse.hxx>
-#include <com/sun/star/lang/Locale.hpp>
-#include <com/sun/star/util/XNumberFormatter.hpp>
-#include <com/sun/star/util/XNumberFormatTypes.hpp>
-#include <com/sun/star/i18n/NumberFormatIndex.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
-#include <com/sun/star/sdbc/DataType.hpp>
-#include <com/sun/star/sdb/XQueriesSupplier.hpp>
-#include <com/sun/star/sdb/ErrorCondition.hpp>
-#include <com/sun/star/util/XNumberFormatter.hpp>
-#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
-#include <com/sun/star/util/XNumberFormats.hpp>
-#include <com/sun/star/util/NumberFormat.hpp>
-#include <com/sun/star/util/XNumberFormatTypes.hpp>
-#include <com/sun/star/lang/Locale.hpp>
-#include <com/sun/star/i18n/KParseType.hpp>
-#include <com/sun/star/i18n/KParseTokens.hpp>
-#include "connectivity/dbconversion.hxx"
-#include <com/sun/star/util/DateTime.hpp>
-#include <com/sun/star/util/Time.hpp>
-#include <com/sun/star/util/Date.hpp>
-#include "TConnection.hxx"
-#include "sqlscan.hxx"
-#include <comphelper/numbers.hxx>
-#include <comphelper/processfactory.hxx>
-#include <comphelper/stl_types.hxx>
-#include "connectivity/dbtools.hxx"
-#include "connectivity/dbmetadata.hxx"
-#include "connectivity/sqlerror.hxx"
-#include <tools/diagnose_ex.h>
-#include <string.h>
-#include <boost/bind.hpp>
-#include <algorithm>
-#include <functional>
-#include <rtl/logfile.hxx>
-#include <rtl/ustrbuf.hxx>
-
-using namespace ::com::sun::star::sdbc;
-using namespace ::com::sun::star::util;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::sdb;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::i18n;
-using namespace ::com::sun::star;
-using namespace ::osl;
-using namespace ::dbtools;
-using namespace ::comphelper;
-
-
-extern int SQLyyparse (void);
-extern ::rtl::OUString ConvertLikeToken(const ::connectivity::OSQLParseNode* pTokenNode, const ::connectivity::OSQLParseNode* pEscapeNode, sal_Bool bInternational);
-extern void setParser( ::connectivity::OSQLParser* );
-
-namespace
-{
- // -----------------------------------------------------------------------------
- sal_Bool lcl_saveConvertToNumber(const Reference< XNumberFormatter > & _xFormatter,sal_Int32 _nKey,const ::rtl::OUString& _sValue,double& _nrValue)
- {
- sal_Bool bRet = sal_False;
- try
- {
- _nrValue = _xFormatter->convertStringToNumber(_nKey, _sValue);
- bRet = sal_True;
- }
- catch(Exception&)
- {
- }
- return bRet;
- }
- // -----------------------------------------------------------------------------
- void replaceAndReset(connectivity::OSQLParseNode*& _pResetNode,connectivity::OSQLParseNode* _pNewNode)
- {
- _pResetNode->getParent()->replace(_pResetNode, _pNewNode);
- delete _pResetNode;
- _pResetNode = _pNewNode;
- }
- // -----------------------------------------------------------------------------
- /** quotes a string and search for quotes inside the string and replace them with the new quote
- @param rValue
- The value to be quoted.
- @param rQuot
- The quote
- @param rQuotToReplace
- The quote to replace with
- @return
- The quoted string.
- */
- ::rtl::OUString SetQuotation(const ::rtl::OUString& rValue, const ::rtl::OUString& rQuot, const ::rtl::OUString& rQuotToReplace)
- {
- ::rtl::OUString rNewValue = rQuot;
- rNewValue += rValue;
- sal_Int32 nIndex = (sal_Int32)-1; // Quotes durch zweifache Quotes ersetzen, sonst kriegt der Parser Probleme
-
- if (rQuot.getLength())
- {
- do
- {
- nIndex += 2;
- nIndex = rNewValue.indexOf(rQuot,nIndex);
- if(nIndex != -1)
- rNewValue = rNewValue.replaceAt(nIndex,rQuot.getLength(),rQuotToReplace);
- } while (nIndex != -1);
- }
-
- rNewValue += rQuot;
- return rNewValue;
- }
-}
-
-namespace connectivity
-{
-
-//=============================================================================
-struct OSQLParser_Data
-{
- ::com::sun::star::lang::Locale aLocale;
- ::connectivity::SQLError aErrors;
-
- OSQLParser_Data( const Reference< XMultiServiceFactory >& _xServiceFactory )
- :aErrors( _xServiceFactory )
- {
- }
-};
-
-//=============================================================================
-//= SQLParseNodeParameter
-//=============================================================================
-//-----------------------------------------------------------------------------
-SQLParseNodeParameter::SQLParseNodeParameter( const Reference< XConnection >& _rxConnection,
- const Reference< XNumberFormatter >& _xFormatter, const Reference< XPropertySet >& _xField,
- const Locale& _rLocale, const IParseContext* _pContext,
- bool _bIntl, bool _bQuote, sal_Char _cDecSep, bool _bPredicate, bool _bParseToSDBC )
- :rLocale(_rLocale)
- ,aMetaData( _rxConnection )
- ,pParser( NULL )
- ,pSubQueryHistory( new QueryNameSet )
- ,xFormatter(_xFormatter)
- ,xField(_xField)
- ,m_rContext( _pContext ? (const IParseContext&)(*_pContext) : (const IParseContext&)OSQLParser::s_aDefaultContext )
- ,cDecSep(_cDecSep)
- ,bQuote(_bQuote)
- ,bInternational(_bIntl)
- ,bPredicate(_bPredicate)
- ,bParseToSDBCLevel( _bParseToSDBC )
-{
-}
-
-//-----------------------------------------------------------------------------
-SQLParseNodeParameter::~SQLParseNodeParameter()
-{
-}
-
-//=============================================================================
-//= OSQLParseNode
-//=============================================================================
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParseNode::convertDateString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertDateString" );
- Date aDate = DBTypeConversion::toDate(rString);
- Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier());
- Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY);
-
- double fDate = DBTypeConversion::toDouble(aDate,DBTypeConversion::getNULLDate(xSupplier));
- sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 36; // XXX hack
- return rParam.xFormatter->convertNumberToString(nKey, fDate);
-}
-
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParseNode::convertDateTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertDateTimeString" );
- DateTime aDate = DBTypeConversion::toDateTime(rString);
- Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier());
- Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY);
-
- double fDateTime = DBTypeConversion::toDouble(aDate,DBTypeConversion::getNULLDate(xSupplier));
- sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 51; // XXX hack
- return rParam.xFormatter->convertNumberToString(nKey, fDateTime);
-}
-
-//-----------------------------------------------------------------------------
-::rtl::OUString OSQLParseNode::convertTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::convertTimeString" );
- Time aTime = DBTypeConversion::toTime(rString);
- Reference< XNumberFormatsSupplier > xSupplier(rParam.xFormatter->getNumberFormatsSupplier());
-
- Reference< XNumberFormatTypes > xTypes(xSupplier->getNumberFormats(), UNO_QUERY);
-
- double fTime = DBTypeConversion::toDouble(aTime);
- sal_Int32 nKey = xTypes->getStandardIndex(rParam.rLocale) + 41; // XXX hack
- return rParam.xFormatter->convertNumberToString(nKey, fTime);
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString,
- const Reference< XConnection >& _rxConnection,
- const IParseContext* pContext,
- sal_Bool _bIntl,
- sal_Bool _bQuote) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToStr" );
-
- parseNodeToStr(
- rString, _rxConnection, NULL, NULL,
- pContext ? pContext->getPreferredLocale() : OParseContext::getDefaultLocale(),
- pContext, _bIntl, _bQuote, '.', false, false );
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::parseNodeToPredicateStr(::rtl::OUString& rString,
- const Reference< XConnection >& _rxConnection,
- const Reference< XNumberFormatter > & xFormatter,
- const ::com::sun::star::lang::Locale& rIntl,
- sal_Char _cDec,
- const IParseContext* pContext ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToPredicateStr" );
-
- OSL_ENSURE(xFormatter.is(), "OSQLParseNode::parseNodeToPredicateStr:: no formatter!");
-
- if (xFormatter.is())
- parseNodeToStr(rString, _rxConnection, xFormatter, NULL, rIntl, pContext, sal_True, sal_True, _cDec, true, false);
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::parseNodeToPredicateStr(::rtl::OUString& rString,
- const Reference< XConnection > & _rxConnection,
- const Reference< XNumberFormatter > & xFormatter,
- const Reference< XPropertySet > & _xField,
- const ::com::sun::star::lang::Locale& rIntl,
- sal_Char _cDec,
- const IParseContext* pContext ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToPredicateStr" );
-
- OSL_ENSURE(xFormatter.is(), "OSQLParseNode::parseNodeToPredicateStr:: no formatter!");
-
- if (xFormatter.is())
- parseNodeToStr( rString, _rxConnection, xFormatter, _xField, rIntl, pContext, true, true, _cDec, true, false );
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString,
- const Reference< XConnection > & _rxConnection,
- const Reference< XNumberFormatter > & xFormatter,
- const Reference< XPropertySet > & _xField,
- const ::com::sun::star::lang::Locale& rIntl,
- const IParseContext* pContext,
- bool _bIntl,
- bool _bQuote,
- sal_Char _cDecSep,
- bool _bPredicate,
- bool _bSubstitute) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToStr" );
-
- OSL_ENSURE( _rxConnection.is(), "OSQLParseNode::parseNodeToStr: invalid connection!" );
-
- if ( _rxConnection.is() )
- {
- ::rtl::OUStringBuffer sBuffer = rString;
- try
- {
- OSQLParseNode::impl_parseNodeToString_throw( sBuffer,
- SQLParseNodeParameter(
- _rxConnection, xFormatter, _xField, rIntl, pContext,
- _bIntl, _bQuote, _cDecSep, _bPredicate, _bSubstitute
- ) );
- }
- catch( const SQLException& )
- {
- OSL_FAIL( "OSQLParseNode::parseNodeToStr: this should not throw!" );
- // our callers don't expect this method to throw anything. The only known situation
- // where impl_parseNodeToString_throw can throw is when there is a cyclic reference
- // in the sub queries, but this cannot be the case here, as we do not parse to
- // SDBC level.
- }
- rString = sBuffer.makeStringAndClear();
- }
-}
-//-----------------------------------------------------------------------------
-bool OSQLParseNode::parseNodeToExecutableStatement( ::rtl::OUString& _out_rString, const Reference< XConnection >& _rxConnection,
- OSQLParser& _rParser, ::com::sun::star::sdbc::SQLException* _pErrorHolder ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseNodeToExecutableStatement" );
- OSL_PRECOND( _rxConnection.is(), "OSQLParseNode::parseNodeToExecutableStatement: invalid connection!" );
- SQLParseNodeParameter aParseParam( _rxConnection,
- NULL, NULL, OParseContext::getDefaultLocale(), NULL, false, true, '.', false, true );
-
- if ( aParseParam.aMetaData.supportsSubqueriesInFrom() )
- {
- Reference< XQueriesSupplier > xSuppQueries( _rxConnection, UNO_QUERY );
- OSL_ENSURE( xSuppQueries.is(), "OSQLParseNode::parseNodeToExecutableStatement: cannot substitute everything without a QueriesSupplier!" );
- if ( xSuppQueries.is() )
- aParseParam.xQueries = xSuppQueries->getQueries();
- }
-
- aParseParam.pParser = &_rParser;
-
- _out_rString = ::rtl::OUString();
- ::rtl::OUStringBuffer sBuffer;
- bool bSuccess = false;
- try
- {
- impl_parseNodeToString_throw( sBuffer, aParseParam );
- bSuccess = true;
- }
- catch( const SQLException& e )
- {
- if ( _pErrorHolder )
- *_pErrorHolder = e;
- }
- _out_rString = sBuffer.makeStringAndClear();
- return bSuccess;
-}
-
-//-----------------------------------------------------------------------------
-namespace
-{
- bool lcl_isAliasNamePresent( const OSQLParseNode& _rTableNameNode )
- {
- return OSQLParseNode::getTableRange(_rTableNameNode.getParent()).getLength() != 0;
- }
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableRange" );
- if ( isToken() )
- {
- parseLeaf(rString,rParam);
- return;
- }
-
- // einmal auswerten wieviel Subtrees dieser Knoten besitzt
- sal_uInt32 nCount = count();
-
- bool bHandled = false;
- switch ( getKnownRuleID() )
- {
- // special handling for parameters
- case parameter:
- {
- if(rString.getLength())
- rString.appendAscii(" ");
- if (nCount == 1) // ?
- m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam );
- else if (nCount == 2) // :Name
- {
- m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam );
- rString.append(m_aChildren[1]->m_aNodeValue);
- } // [Name]
- else
- {
- m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam );
- rString.append(m_aChildren[1]->m_aNodeValue);
- rString.append(m_aChildren[2]->m_aNodeValue);
- }
- bHandled = true;
- }
- break;
-
- // table refs
- case table_ref:
- if ( ( nCount == 2 ) || ( nCount == 3 ) || ( nCount == 5 ) )
- {
- impl_parseTableRangeNodeToString_throw( rString, rParam );
- bHandled = true;
- }
- break;
-
- // table name - might be a query name
- case table_name:
- bHandled = impl_parseTableNameNodeToString_throw( rString, rParam );
- break;
-
- case as:
- if ( rParam.aMetaData.generateASBeforeCorrelationName() )
- rString.append(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" AS")));
- bHandled = true;
- break;
-
- case like_predicate:
- // je nachdem ob international angegeben wird oder nicht wird like anders behandelt
- // interanational: *, ? sind Platzhalter
- // sonst SQL92 konform: %, _
- impl_parseLikeNodeToString_throw( rString, rParam );
- bHandled = true;
- break;
-
- case general_set_fct:
- case set_fct_spec:
- case position_exp:
- case extract_exp:
- case length_exp:
- case char_value_fct:
- {
- if (!addDateValue(rString, rParam))
- {
- // Funktionsname nicht quoten
- SQLParseNodeParameter aNewParam(rParam);
- aNewParam.bQuote = ( SQL_ISRULE(this,length_exp) || SQL_ISRULE(this,char_value_fct) );
-
- m_aChildren[0]->impl_parseNodeToString_throw( rString, aNewParam );
- aNewParam.bQuote = rParam.bQuote;
- //aNewParam.bPredicate = sal_False; // disable [ ] around names // look at i73215
- ::rtl::OUStringBuffer aStringPara;
- for (sal_uInt32 i=1; i<nCount; i++)
- {
- const OSQLParseNode * pSubTree = m_aChildren[i];
- if (pSubTree)
- {
- pSubTree->impl_parseNodeToString_throw( aStringPara, aNewParam );
-
- // bei den CommaListen zwischen alle Subtrees Commas setzen
- if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i < (nCount - 1)))
- aStringPara.appendAscii(",");
- }
- else
- i++;
- }
- rString.append(aStringPara.makeStringAndClear());
- }
- bHandled = true;
- }
- break;
- default:
- break;
- } // switch ( getKnownRuleID() )
-
- if ( !bHandled )
- {
- for (OSQLParseNodes::const_iterator i = m_aChildren.begin();
- i != m_aChildren.end();)
- {
- const OSQLParseNode* pSubTree = *i;
- if ( !pSubTree )
- {
- ++i;
- continue;
- }
-
- SQLParseNodeParameter aNewParam(rParam);
-
- // don't replace the field for subqueries
- if (rParam.xField.is() && SQL_ISRULE(pSubTree,subquery))
- aNewParam.xField = NULL;
-
- // if there is a field given we don't display the fieldname, if there is any
- if (rParam.xField.is() && SQL_ISRULE(pSubTree,column_ref))
- {
- sal_Bool bFilter = sal_False;
- // retrieve the fields name
- ::rtl::OUString aFieldName;
- try
- {
- sal_Int32 nNamePropertyId = PROPERTY_ID_NAME;
- if ( rParam.xField->getPropertySetInfo()->hasPropertyByName( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_REALNAME ) ) )
- nNamePropertyId = PROPERTY_ID_REALNAME;
- rParam.xField->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( nNamePropertyId ) ) >>= aFieldName;
- }
- catch ( Exception& )
- {
- }
-
- if(pSubTree->count())
- {
- const OSQLParseNode* pCol = pSubTree->m_aChildren[pSubTree->count()-1];
- if ( ( SQL_ISRULE(pCol,column_val)
- && pCol->getChild(0)->getTokenValue().equalsIgnoreAsciiCase(aFieldName)
- )
- || pCol->getTokenValue().equalsIgnoreAsciiCase(aFieldName)
- )
- bFilter = sal_True;
- }
-
- // ok we found the field, if the following node is the
- // comparision operator '=' we filter it as well
- if (bFilter)
- {
- if (SQL_ISRULE(this, comparison_predicate))
- {
- ++i;
- if(i != m_aChildren.end())
- {
- pSubTree = *i;
- if (pSubTree && pSubTree->getNodeType() == SQL_NODE_EQUAL)
- ++i;
- }
- }
- else
- ++i;
- }
- else
- {
- pSubTree->impl_parseNodeToString_throw( rString, aNewParam );
- ++i;
-
- // bei den CommaListen zwischen alle Subtrees Commas setzen
- if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end()))
- rString.appendAscii(",");
- }
- }
- else
- {
- pSubTree->impl_parseNodeToString_throw( rString, aNewParam );
- ++i;
-
- // bei den CommaListen zwischen alle Subtrees Commas setzen
- if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end()))
- {
- if (SQL_ISRULE(this,value_exp_commalist) && rParam.bPredicate)
- rString.appendAscii(";");
- else
- rString.appendAscii(",");
- }
- }
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableNameNodeToString_throw" );
- // is the table_name part of a table_ref?
- OSL_ENSURE( getParent(), "OSQLParseNode::impl_parseTableNameNodeToString_throw: table_name without parent?" );
- if ( !getParent() || ( getParent()->getKnownRuleID() != table_ref ) )
- return false;
-
- // if it's a query, maybe we need to substitute the SQL statement ...
- if ( !rParam.bParseToSDBCLevel )
- return false;
-
- if ( !rParam.xQueries.is() )
- // connection does not support queries in queries, or was no query supplier
- return false;
-
- try
- {
- ::rtl::OUString sTableOrQueryName( getChild(0)->getTokenValue() );
- bool bIsQuery = rParam.xQueries->hasByName( sTableOrQueryName );
- if ( !bIsQuery )
- return false;
-
- // avoid recursion (e.g. "foo" defined as "SELECT * FROM bar" and "bar" defined as "SELECT * FROM foo".
- if ( rParam.pSubQueryHistory->find( sTableOrQueryName ) != rParam.pSubQueryHistory->end() )
- {
- ::rtl::OUString sMessage( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cyclic sub queries" ) ) );
- OSL_ENSURE( rParam.pParser, "OSQLParseNode::impl_parseTableNameNodeToString_throw: no parser?" );
- if ( rParam.pParser )
- {
- const SQLError& rErrors( rParam.pParser->getErrorHelper() );
- rErrors.raiseException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES );
- }
- else
- {
- SQLError aErrors( ::comphelper::getProcessServiceFactory() );
- aErrors.raiseException( sdb::ErrorCondition::PARSER_CYCLIC_SUB_QUERIES );
- }
- }
- rParam.pSubQueryHistory->insert( sTableOrQueryName );
-
- Reference< XPropertySet > xQuery( rParam.xQueries->getByName( sTableOrQueryName ), UNO_QUERY_THROW );
-
- // substitute the query name with the constituting command
- ::rtl::OUString sCommand;
- OSL_VERIFY( xQuery->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_COMMAND ) ) >>= sCommand );
-
- sal_Bool bEscapeProcessing = sal_False;
- OSL_VERIFY( xQuery->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ESCAPEPROCESSING ) ) >>= bEscapeProcessing );
-
- // the query we found here might itself be based on another query, so parse it recursively
- OSL_ENSURE( rParam.pParser, "OSQLParseNode::impl_parseTableNameNodeToString_throw: cannot analyze sub queries without a parser!" );
- if ( bEscapeProcessing && rParam.pParser )
- {
- ::rtl::OUString sError;
- ::std::auto_ptr< OSQLParseNode > pSubQueryNode( rParam.pParser->parseTree( sError, sCommand, sal_False ) );
- if ( pSubQueryNode.get() )
- {
- // parse the sub-select to SDBC level, too
- ::rtl::OUStringBuffer sSubSelect;
- pSubQueryNode->impl_parseNodeToString_throw( sSubSelect, rParam );
- if ( sSubSelect.getLength() )
- sCommand = sSubSelect.makeStringAndClear();
- }
- }
-
- rString.appendAscii( " ( " );
- rString.append(sCommand);
- rString.appendAscii( " )" );
-
- // append the query name as table alias, since it might be referenced in other
- // parts of the statement - but only if there's no other alias name present
- if ( !lcl_isAliasNamePresent( *this ) )
- {
- rString.appendAscii( " AS " );
- if ( rParam.bQuote )
- rString.append(SetQuotation( sTableOrQueryName,
- rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() ));
- }
-
- // don't forget to remove the query name from the history, else multiple inclusions
- // won't work
- // #i69227# / 2006-10-10 / frank.schoenheit@sun.com
- rParam.pSubQueryHistory->erase( sTableOrQueryName );
-
- return true;
- }
- catch( const SQLException& )
- {
- throw;
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return false;
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::impl_parseTableRangeNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableRangeNodeToString_throw" );
- OSL_PRECOND( ( count() == 2 ) || ( count() == 3 ) || ( count() == 5 ) ,"Illegal count");
-
- // rString += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" "));
- ::std::for_each(m_aChildren.begin(),m_aChildren.end(),
- boost::bind( &OSQLParseNode::impl_parseNodeToString_throw, _1, boost::ref( rString ), boost::cref( rParam ) ));
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::impl_parseLikeNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseLikeNodeToString_throw" );
- OSL_ENSURE(count() == 2,"count != 2: Prepare for GPF");
-
- const OSQLParseNode* pEscNode = NULL;
- const OSQLParseNode* pParaNode = NULL;
-
- SQLParseNodeParameter aNewParam(rParam);
- //aNewParam.bQuote = sal_True; // why setting this to true? @see http://www.openoffice.org/issues/show_bug.cgi?id=75557
-
- // if there is a field given we don't display the fieldname, if there are any
- sal_Bool bAddName = sal_True;
- if (rParam.xField.is())
- {
- // retrieve the fields name
- ::rtl::OUString aFieldName;
- try
- {
- // retrieve the fields name
- rtl::OUString aString;
- rParam.xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aString;
- aFieldName = aString.getStr();
- }
- catch ( Exception& )
- {
- OSL_FAIL( "OSQLParseNode::impl_parseLikeNodeToString_throw Exception occurred!" );
- }
- if ( !m_aChildren[0]->isLeaf() )
- {
- const OSQLParseNode* pCol = m_aChildren[0]->getChild(m_aChildren[0]->count()-1);
- if ((SQL_ISRULE(pCol,column_val) && pCol->getChild(0)->getTokenValue().equalsIgnoreAsciiCase(aFieldName)) ||
- pCol->getTokenValue().equalsIgnoreAsciiCase(aFieldName) )
- bAddName = sal_False;
- }
- }
-
- if (bAddName)
- m_aChildren[0]->impl_parseNodeToString_throw( rString, aNewParam );
-
- const OSQLParseNode* pPart2 = m_aChildren[1];
- pPart2->getChild(0)->impl_parseNodeToString_throw( rString, aNewParam );
- pPart2->getChild(1)->impl_parseNodeToString_throw( rString, aNewParam );
- pParaNode = pPart2->getChild(2);
- pEscNode = pPart2->getChild(3);
-
- if (pParaNode->isToken())
- {
- ::rtl::OUString aStr = ConvertLikeToken(pParaNode, pEscNode, rParam.bInternational);
- rString.appendAscii(" ");
- rString.append(SetQuotation(aStr,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\'")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\'\'"))));
- }
- else
- pParaNode->impl_parseNodeToString_throw( rString, aNewParam );
-
- pEscNode->impl_parseNodeToString_throw( rString, aNewParam );
-}
-
-
-// -----------------------------------------------------------------------------
-sal_Bool OSQLParseNode::getTableComponents(const OSQLParseNode* _pTableNode,
- ::com::sun::star::uno::Any &_rCatalog,
- ::rtl::OUString &_rSchema,
- ::rtl::OUString &_rTable,
- const Reference< XDatabaseMetaData >& _xMetaData)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableComponents" );
- OSL_ENSURE(_pTableNode,"Wrong use of getTableComponents! _pTableNode is not allowed to be null!");
- if(_pTableNode)
- {
- const sal_Bool bSupportsCatalog = _xMetaData.is() && _xMetaData->supportsCatalogsInDataManipulation();
- const sal_Bool bSupportsSchema = _xMetaData.is() && _xMetaData->supportsSchemasInDataManipulation();
- const OSQLParseNode* pTableNode = _pTableNode;
- // clear the parameter given
- _rCatalog = Any();
- _rSchema = _rTable = ::rtl::OUString();
- // see rule catalog_name: in sqlbison.y
- if (SQL_ISRULE(pTableNode,catalog_name))
- {
- OSL_ENSURE(pTableNode->getChild(0) && pTableNode->getChild(0)->isToken(),"Invalid parsenode!");
- _rCatalog <<= pTableNode->getChild(0)->getTokenValue();
- pTableNode = pTableNode->getChild(2);
- }
- // check if we have schema_name rule
- if(SQL_ISRULE(pTableNode,schema_name))
- {
- if ( bSupportsCatalog && !bSupportsSchema )
- _rCatalog <<= pTableNode->getChild(0)->getTokenValue();
- else
- _rSchema = pTableNode->getChild(0)->getTokenValue();
- pTableNode = pTableNode->getChild(2);
- }
- // check if we have table_name rule
- if(SQL_ISRULE(pTableNode,table_name))
- {
- _rTable = pTableNode->getChild(0)->getTokenValue();
- }
- else
- {
- OSL_FAIL("Error in parse tree!");
- }
- }
- return _rTable.getLength() != 0;
-}
-// -----------------------------------------------------------------------------
-void OSQLParser::killThousandSeparator(OSQLParseNode* pLiteral)
-{
- if ( pLiteral )
- {
- if ( s_xLocaleData->getLocaleItem( m_pData->aLocale ).decimalSeparator.toChar() == ',' )
- {
- pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode());
- // and replace decimal
- pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.');
- }
- else
- pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode());
- }
-}
-// -----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::convertNode(sal_Int32 nType,OSQLParseNode*& pLiteral)
-{
- if ( !pLiteral )
- return NULL;
-
- OSQLParseNode* pReturn = pLiteral;
-
- if ( ( pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp) ) || SQL_ISTOKEN(pLiteral,FALSE) || SQL_ISTOKEN(pLiteral,TRUE) )
- {
- switch(nType)
- {
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- if ( !SQL_ISRULE(pReturn,char_value_exp) && !buildStringNodes(pReturn) )
- pReturn = NULL;
- default:
- break;
- }
- }
- else
- {
- switch(pLiteral->getNodeType())
- {
- case SQL_NODE_STRING:
- switch(nType)
- {
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- break;
- case DataType::DATE:
- case DataType::TIME:
- case DataType::TIMESTAMP:
- if (m_xFormatter.is())
- pReturn = buildDate( nType, pReturn);
- break;
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE);
- break;
- }
- break;
- case SQL_NODE_ACCESS_DATE:
- switch(nType)
- {
- case DataType::DATE:
- case DataType::TIME:
- case DataType::TIMESTAMP:
- if ( m_xFormatter.is() )
- pReturn = buildDate( nType, pReturn);
- else
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE);
- break;
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE);
- break;
- }
- break;
- case SQL_NODE_INTNUM:
- switch(nType)
- {
- case DataType::BIT:
- case DataType::BOOLEAN:
- case DataType::DECIMAL:
- case DataType::NUMERIC:
- case DataType::TINYINT:
- case DataType::SMALLINT:
- case DataType::INTEGER:
- case DataType::BIGINT:
- case DataType::FLOAT:
- case DataType::REAL:
- case DataType::DOUBLE:
- // kill thousand seperators if any
- killThousandSeparator(pReturn);
- break;
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- pReturn = buildNode_STR_NUM(pReturn);
- break;
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_INT_COMPARE);
- break;
- }
- break;
- case SQL_NODE_APPROXNUM:
- switch(nType)
- {
- case DataType::DECIMAL:
- case DataType::NUMERIC:
- case DataType::FLOAT:
- case DataType::REAL:
- case DataType::DOUBLE:
- // kill thousand seperators if any
- killThousandSeparator(pReturn);
- break;
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- pReturn = buildNode_STR_NUM(pReturn);
- break;
- case DataType::INTEGER:
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_REAL_COMPARE);
- break;
- }
- break;
- default:
- ;
- }
- }
- return pReturn;
-}
-// -----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildPredicateRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare,OSQLParseNode* pLiteral2)
-{
- OSL_ENSURE(inPredicateCheck(),"Only in predicate check allowed!");
- sal_Int16 nErg = 0;
- if ( m_xField.is() )
- {
- sal_Int32 nType = 0;
- try
- {
- m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType;
- }
- catch( Exception& )
- {
- return nErg;
- }
-
- OSQLParseNode* pNode1 = convertNode(nType,pLiteral);
- if ( pNode1 )
- {
- OSQLParseNode* pNode2 = convertNode(nType,pLiteral2);
- if ( !m_sErrorMessage.getLength() )
- nErg = buildNode(pAppend,pCompare,pNode1,pNode2);
- }
- }
- if (!pCompare->getParent()) // I have no parent so I was not used and I must die :-)
- delete pCompare;
- return nErg;
-}
-// -----------------------------------------------------------------------------
-sal_Int16 OSQLParser::buildLikeRule(OSQLParseNode*& pAppend, OSQLParseNode*& pLiteral, const OSQLParseNode* pEscape)
-{
- sal_Int16 nErg = 0;
- sal_Int32 nType = 0;
-
- if (!m_xField.is())
- return nErg;
- try
- {
- Any aValue;
- {
- aValue = m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE));
- aValue >>= nType;
- }
- }
- catch( Exception& )
- {
- return nErg;
- }
-
- switch (nType)
- {
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- if(pLiteral->isRule())
- {
- pAppend->append(pLiteral);
- nErg = 1;
- }
- else
- {
- switch(pLiteral->getNodeType())
- {
- case SQL_NODE_STRING:
- pLiteral->m_aNodeValue = ConvertLikeToken(pLiteral, pEscape, sal_False);
- pAppend->append(pLiteral);
- nErg = 1;
- break;
- case SQL_NODE_APPROXNUM:
- if (m_xFormatter.is() && m_nFormatKey)
- {
- sal_Int16 nScale = 0;
- try
- {
- Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Decimals")) );
- aValue >>= nScale;
- }
- catch( Exception& )
- {
- }
-
- pAppend->append(new OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING));
- }
- else
- pAppend->append(new OSQLInternalNode(pLiteral->getTokenValue(),SQL_NODE_STRING));
-
- delete pLiteral;
- nErg = 1;
- break;
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_VALUE_NO_LIKE);
- m_sErrorMessage = m_sErrorMessage.replaceAt(m_sErrorMessage.indexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#1"))),2,pLiteral->getTokenValue());
- break;
- }
- }
- break;
- default:
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_FIELD_NO_LIKE);
- break;
- }
- return nErg;
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::buildNode_Date(const double& fValue, sal_Int32 nType)
-{
- ::rtl::OUString aEmptyString;
- OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec));
- pNewNode->append(new OSQLInternalNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("{")), SQL_NODE_PUNCTUATION));
- OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec));
- pNewNode->append(pDateNode);
- pNewNode->append(new OSQLInternalNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("}")), SQL_NODE_PUNCTUATION));
-
- switch (nType)
- {
- case DataType::DATE:
- {
- Date aDate = DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
- ::rtl::OUString aString = DBTypeConversion::toDateString(aDate);
- pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D));
- pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING));
- break;
- }
- case DataType::TIME:
- {
- Time aTime = DBTypeConversion::toTime(fValue);
- ::rtl::OUString aString = DBTypeConversion::toTimeString(aTime);
- pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_T));
- pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING));
- break;
- }
- case DataType::TIMESTAMP:
- {
- DateTime aDateTime = DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier()));
- if (aDateTime.Seconds || aDateTime.Minutes || aDateTime.Hours)
- {
- ::rtl::OUString aString = DBTypeConversion::toDateTimeString(aDateTime);
- pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS));
- pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING));
- }
- else
- {
- Date aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year);
- pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D));
- pDateNode->append(new OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING));
- }
- break;
- }
- }
-
- return pNewNode;
-}
-// -----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::buildNode_STR_NUM(OSQLParseNode*& _pLiteral)
-{
- OSQLParseNode* pReturn = NULL;
- if ( _pLiteral )
- {
- if (m_nFormatKey)
- {
- sal_Int16 nScale = 0;
- ::rtl::OUString aDec;
- try
- {
- Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Decimals")) );
- aValue >>= nScale;
- }
- catch( Exception& )
- {
- }
-
- pReturn = new OSQLInternalNode(stringToDouble(_pLiteral->getTokenValue(),nScale),SQL_NODE_STRING);
- }
- else
- pReturn = new OSQLInternalNode(_pLiteral->getTokenValue(),SQL_NODE_STRING);
-
- delete _pLiteral;
- _pLiteral = NULL;
- }
- return pReturn;
-}
-// -----------------------------------------------------------------------------
-::rtl::OUString OSQLParser::stringToDouble(const ::rtl::OUString& _rValue,sal_Int16 _nScale)
-{
- ::rtl::OUString aValue;
- if(!m_xCharClass.is())
- m_xCharClass = Reference<XCharacterClassification>(m_xServiceFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.i18n.CharacterClassification"))),UNO_QUERY);
- if(m_xCharClass.is() && s_xLocaleData.is())
- {
- try
- {
- ParseResult aResult = m_xCharClass->parsePredefinedToken(KParseType::ANY_NUMBER,_rValue,0,m_pData->aLocale,0,::rtl::OUString(),KParseType::ANY_NUMBER,::rtl::OUString());
- if((aResult.TokenType & KParseType::IDENTNAME) && aResult.EndPos == _rValue.getLength())
- {
- aValue = ::rtl::OUString::valueOf(aResult.Value);
- sal_Int32 nPos = aValue.lastIndexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")));
- if((nPos+_nScale) < aValue.getLength())
- aValue = aValue.replaceAt(nPos+_nScale,aValue.getLength()-nPos-_nScale,::rtl::OUString());
- aValue = aValue.replaceAt(aValue.lastIndexOf(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("."))),1,s_xLocaleData->getLocaleItem(m_pData->aLocale).decimalSeparator);
- return aValue;
- }
- }
- catch(Exception&)
- {
- }
- }
- return aValue;
-}
-// -----------------------------------------------------------------------------
-
-::osl::Mutex& OSQLParser::getMutex()
-{
- static ::osl::Mutex aMutex;
- return aMutex;
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::predicateTree(::rtl::OUString& rErrorMessage, const ::rtl::OUString& rStatement,
- const Reference< ::com::sun::star::util::XNumberFormatter > & xFormatter,
- const Reference< XPropertySet > & xField)
-{
-
-
- // mutex for parsing
- static ::osl::Mutex aMutex;
-
- // Guard the parsing
- ::osl::MutexGuard aGuard(getMutex());
- // must be reset
- setParser(this);
-
-
- // reset the parser
- m_xField = xField;
- m_xFormatter = xFormatter;
-
- if (m_xField.is())
- {
- sal_Int32 nType=0;
- try
- {
- // get the field name
- rtl::OUString aString;
-
- // retrieve the fields name
- // #75243# use the RealName of the column if there is any otherwise the name which could be the alias
- // of the field
- Reference< XPropertySetInfo> xInfo = m_xField->getPropertySetInfo();
- if ( xInfo->hasPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME)))
- m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME)) >>= aString;
- else
- m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aString;
-
- m_sFieldName = aString;
-
- // get the field format key
- if ( xInfo->hasPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FORMATKEY)))
- m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FORMATKEY)) >>= m_nFormatKey;
- else
- m_nFormatKey = 0;
-
- // get the field type
- m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType;
- }
- catch ( Exception& )
- {
- OSL_ASSERT(0);
- }
-
- if (m_nFormatKey && m_xFormatter.is())
- {
- Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LOCALE) );
- OSL_ENSURE(aValue.getValueType() == ::getCppuType((const ::com::sun::star::lang::Locale*)0), "OSQLParser::PredicateTree : invalid language property !");
-
- if (aValue.getValueType() == ::getCppuType((const ::com::sun::star::lang::Locale*)0))
- aValue >>= m_pData->aLocale;
- }
- else
- m_pData->aLocale = m_pContext->getPreferredLocale();
-
- if ( m_xFormatter.is() )
- {
- try
- {
- Reference< ::com::sun::star::util::XNumberFormatsSupplier > xFormatSup = m_xFormatter->getNumberFormatsSupplier();
- if ( xFormatSup.is() )
- {
- Reference< ::com::sun::star::util::XNumberFormats > xFormats = xFormatSup->getNumberFormats();
- if ( xFormats.is() )
- {
- ::com::sun::star::lang::Locale aLocale;
- aLocale.Language = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("en"));
- aLocale.Country = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("US"));
- ::rtl::OUString sFormat(RTL_CONSTASCII_USTRINGPARAM("YYYY-MM-DD"));
- m_nDateFormatKey = xFormats->queryKey(sFormat,aLocale,sal_False);
- if ( m_nDateFormatKey == sal_Int32(-1) )
- m_nDateFormatKey = xFormats->addNew(sFormat, aLocale);
- }
- }
- }
- catch ( Exception& )
- {
- OSL_FAIL("DateFormatKey");
- }
- }
-
- switch (nType)
- {
- case DataType::DATE:
- case DataType::TIME:
- case DataType::TIMESTAMP:
- s_pScanner->SetRule(s_pScanner->GetDATERule());
- break;
- case DataType::CHAR:
- case DataType::VARCHAR:
- case DataType::LONGVARCHAR:
- case DataType::CLOB:
- s_pScanner->SetRule(s_pScanner->GetSTRINGRule());
- break;
- default:
- if ( s_xLocaleData->getLocaleItem( m_pData->aLocale ).decimalSeparator.toChar() == ',' )
- s_pScanner->SetRule(s_pScanner->GetGERRule());
- else
- s_pScanner->SetRule(s_pScanner->GetENGRule());
- }
-
- }
- else
- s_pScanner->SetRule(s_pScanner->GetSQLRule());
-
- s_pScanner->prepareScan(rStatement, m_pContext, sal_True);
-
- SQLyylval.pParseNode = NULL;
- // SQLyypvt = NULL;
- m_pParseTree = NULL;
- m_sErrorMessage= ::rtl::OUString();
-
- // ... und den Parser anwerfen ...
- if (SQLyyparse() != 0)
- {
- m_sFieldName= ::rtl::OUString();
- m_xField.clear();
- m_xFormatter.clear();
- m_nFormatKey = 0;
- m_nDateFormatKey = 0;
-
- if (!m_sErrorMessage.getLength())
- m_sErrorMessage = s_pScanner->getErrorMessage();
- if (!m_sErrorMessage.getLength())
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_GENERAL);
-
- rErrorMessage = m_sErrorMessage;
-
- // clear the garbage collector
- (*s_pGarbageCollector)->clearAndDelete();
- return NULL;
- }
- else
- {
- (*s_pGarbageCollector)->clear();
-
- m_sFieldName= ::rtl::OUString();
- m_xField.clear();
- m_xFormatter.clear();
- m_nFormatKey = 0;
- m_nDateFormatKey = 0;
-
- // Das Ergebnis liefern (den Root Parse Node):
-
- // Stattdessen setzt die Parse-Routine jetzt den Member pParseTree
- // - einfach diesen zurueckliefern:
- OSL_ENSURE(m_pParseTree != NULL,"OSQLParser: Parser hat keinen ParseTree geliefert");
- return m_pParseTree;
- }
-}
-
-//=============================================================================
-//-----------------------------------------------------------------------------
-OSQLParser::OSQLParser(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _xServiceFactory,const IParseContext* _pContext)
- :m_pContext(_pContext)
- ,m_pParseTree(NULL)
- ,m_pData( new OSQLParser_Data( _xServiceFactory ) )
- ,m_nFormatKey(0)
- ,m_nDateFormatKey(0)
- ,m_xServiceFactory(_xServiceFactory)
-{
-
-
- setParser(this);
-
-#ifdef SQLYYDEBUG
-#ifdef SQLYYDEBUG_ON
- SQLyydebug = 1;
-#endif
-#endif
-
- ::osl::MutexGuard aGuard(getMutex());
- // do we have to initialize the data
- if (s_nRefCount == 0)
- {
- s_pScanner = new OSQLScanner();
- s_pScanner->setScanner();
- s_pGarbageCollector = new OSQLParseNodesGarbageCollector();
-
- if(!s_xLocaleData.is())
- s_xLocaleData = Reference<XLocaleData>(m_xServiceFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.i18n.LocaleData"))),UNO_QUERY);
-
- // auf 0 zuruecksetzen
- memset(OSQLParser::s_nRuleIDs,0,sizeof(OSQLParser::s_nRuleIDs[0]) * (OSQLParseNode::rule_count+1));
-
- struct
- {
- OSQLParseNode::Rule eRule; // the parse node's ID for the rule
- ::rtl::OString sRuleName; // the name of the rule ("select_statement")
- } aRuleDescriptions[] =
- {
- { OSQLParseNode::select_statement, "select_statement" },
- { OSQLParseNode::table_exp, "table_exp" },
- { OSQLParseNode::table_ref_commalist, "table_ref_commalist" },
- { OSQLParseNode::table_ref, "table_ref" },
- { OSQLParseNode::catalog_name, "catalog_name" },
- { OSQLParseNode::schema_name, "schema_name" },
- { OSQLParseNode::table_name, "table_name" },
- { OSQLParseNode::opt_column_commalist, "opt_column_commalist" },
- { OSQLParseNode::column_commalist, "column_commalist" },
- { OSQLParseNode::column_ref_commalist, "column_ref_commalist" },
- { OSQLParseNode::column_ref, "column_ref" },
- { OSQLParseNode::opt_order_by_clause, "opt_order_by_clause" },
- { OSQLParseNode::ordering_spec_commalist, "ordering_spec_commalist" },
- { OSQLParseNode::ordering_spec, "ordering_spec" },
- { OSQLParseNode::opt_asc_desc, "opt_asc_desc" },
- { OSQLParseNode::where_clause, "where_clause" },
- { OSQLParseNode::opt_where_clause, "opt_where_clause" },
- { OSQLParseNode::search_condition, "search_condition" },
- { OSQLParseNode::comparison_predicate, "comparison_predicate" },
- { OSQLParseNode::between_predicate, "between_predicate" },
- { OSQLParseNode::like_predicate, "like_predicate" },
- { OSQLParseNode::opt_escape, "opt_escape" },
- { OSQLParseNode::test_for_null, "test_for_null" },
- { OSQLParseNode::scalar_exp_commalist, "scalar_exp_commalist" },
- { OSQLParseNode::scalar_exp, "scalar_exp" },
- { OSQLParseNode::parameter_ref, "parameter_ref" },
- { OSQLParseNode::parameter, "parameter" },
- { OSQLParseNode::general_set_fct, "general_set_fct" },
- { OSQLParseNode::range_variable, "range_variable" },
- { OSQLParseNode::column, "column" },
- { OSQLParseNode::delete_statement_positioned, "delete_statement_positioned" },
- { OSQLParseNode::delete_statement_searched, "delete_statement_searched" },
- { OSQLParseNode::update_statement_positioned, "update_statement_positioned" },
- { OSQLParseNode::update_statement_searched, "update_statement_searched" },
- { OSQLParseNode::assignment_commalist, "assignment_commalist" },
- { OSQLParseNode::assignment, "assignment" },
- { OSQLParseNode::values_or_query_spec, "values_or_query_spec" },
- { OSQLParseNode::insert_statement, "insert_statement" },
- { OSQLParseNode::insert_atom_commalist, "insert_atom_commalist" },
- { OSQLParseNode::insert_atom, "insert_atom" },
- { OSQLParseNode::predicate_check, "predicate_check" },
- { OSQLParseNode::from_clause, "from_clause" },
- { OSQLParseNode::qualified_join, "qualified_join" },
- { OSQLParseNode::cross_union, "cross_union" },
- { OSQLParseNode::select_sublist, "select_sublist" },
- { OSQLParseNode::derived_column, "derived_column" },
- { OSQLParseNode::column_val, "column_val" },
- { OSQLParseNode::set_fct_spec, "set_fct_spec" },
- { OSQLParseNode::boolean_term, "boolean_term" },
- { OSQLParseNode::boolean_primary, "boolean_primary" },
- { OSQLParseNode::num_value_exp, "num_value_exp" },
- { OSQLParseNode::join_type, "join_type" },
- { OSQLParseNode::position_exp, "position_exp" },
- { OSQLParseNode::extract_exp, "extract_exp" },
- { OSQLParseNode::length_exp, "length_exp" },
- { OSQLParseNode::char_value_fct, "char_value_fct" },
- { OSQLParseNode::odbc_call_spec, "odbc_call_spec" },
- { OSQLParseNode::in_predicate, "in_predicate" },
- { OSQLParseNode::existence_test, "existence_test" },
- { OSQLParseNode::unique_test, "unique_test" },
- { OSQLParseNode::all_or_any_predicate, "all_or_any_predicate" },
- { OSQLParseNode::named_columns_join, "named_columns_join" },
- { OSQLParseNode::join_condition, "join_condition" },
- { OSQLParseNode::joined_table, "joined_table" },
- { OSQLParseNode::boolean_factor, "boolean_factor" },
- { OSQLParseNode::sql_not, "sql_not" },
- { OSQLParseNode::boolean_test, "boolean_test" },
- { OSQLParseNode::manipulative_statement, "manipulative_statement" },
- { OSQLParseNode::subquery, "subquery" },
- { OSQLParseNode::value_exp_commalist, "value_exp_commalist" },
- { OSQLParseNode::odbc_fct_spec, "odbc_fct_spec" },
- { OSQLParseNode::union_statement, "union_statement" },
- { OSQLParseNode::outer_join_type, "outer_join_type" },
- { OSQLParseNode::char_value_exp, "char_value_exp" },
- { OSQLParseNode::term, "term" },
- { OSQLParseNode::value_exp_primary, "value_exp_primary" },
- { OSQLParseNode::value_exp, "value_exp" },
- { OSQLParseNode::selection, "selection" },
- { OSQLParseNode::fold, "fold" },
- { OSQLParseNode::char_substring_fct, "char_substring_fct" },
- { OSQLParseNode::factor, "factor" },
- { OSQLParseNode::base_table_def, "base_table_def" },
- { OSQLParseNode::base_table_element_commalist, "base_table_element_commalist" },
- { OSQLParseNode::data_type, "data_type" },
- { OSQLParseNode::column_def, "column_def" },
- { OSQLParseNode::table_node, "table_node" },
- { OSQLParseNode::as, "as" },
- { OSQLParseNode::op_column_commalist, "op_column_commalist" },
- { OSQLParseNode::table_primary_as_range_column, "table_primary_as_range_column" },
- { OSQLParseNode::datetime_primary, "datetime_primary" },
- { OSQLParseNode::concatenation, "concatenation" },
- { OSQLParseNode::char_factor, "char_factor" },
- { OSQLParseNode::bit_value_fct, "bit_value_fct" },
- { OSQLParseNode::comparison_predicate_part_2, "comparison_predicate_part_2" },
- { OSQLParseNode::parenthesized_boolean_value_expression, "parenthesized_boolean_value_expression" },
- { OSQLParseNode::character_string_type, "character_string_type" },
- { OSQLParseNode::other_like_predicate_part_2, "other_like_predicate_part_2" },
- { OSQLParseNode::between_predicate_part_2, "between_predicate_part_2" },
- { OSQLParseNode::cast_spec, "cast_spec" }
- };
- size_t nRuleMapCount = SAL_N_ELEMENTS( aRuleDescriptions );
- OSL_ENSURE( nRuleMapCount == size_t( OSQLParseNode::rule_count ), "OSQLParser::OSQLParser: added a new rule? Adjust this map!" );
-
- for ( size_t mapEntry = 0; mapEntry < nRuleMapCount; ++mapEntry )
- {
- // look up the rule description in the our identifier map
- sal_uInt32 nParserRuleID = StrToRuleID( aRuleDescriptions[ mapEntry ].sRuleName );
- // map the parser's rule ID to the OSQLParseNode::Rule
- s_aReverseRuleIDLookup[ nParserRuleID ] = aRuleDescriptions[ mapEntry ].eRule;
- // and map the OSQLParseNode::Rule to the parser's rule ID
- s_nRuleIDs[ aRuleDescriptions[ mapEntry ].eRule ] = nParserRuleID;
- }
- }
- ++s_nRefCount;
-
- if (m_pContext == NULL)
- // take the default context
- m_pContext = &s_aDefaultContext;
-
- m_pData->aLocale = m_pContext->getPreferredLocale();
-}
-
-//-----------------------------------------------------------------------------
-OSQLParser::~OSQLParser()
-{
- {
- ::osl::MutexGuard aGuard(getMutex());
- OSL_ENSURE(s_nRefCount > 0, "OSQLParser::~OSQLParser() : suspicious call : have a refcount of 0 !");
- if (!--s_nRefCount)
- {
- s_pScanner->setScanner(sal_True);
- delete s_pScanner;
- s_pScanner = NULL;
-
- delete s_pGarbageCollector;
- s_pGarbageCollector = NULL;
- // is only set the first time so we should delete it only when there no more instances
- s_xLocaleData = NULL;
-
- RuleIDMap aEmpty;
- s_aReverseRuleIDLookup.swap( aEmpty );
- }
- m_pParseTree = NULL;
- }
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNode::substituteParameterNames(OSQLParseNode* _pNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::substituteParameterNames" );
- sal_Int32 nCount = _pNode->count();
- for(sal_Int32 i=0;i < nCount;++i)
- {
- OSQLParseNode* pChildNode = _pNode->getChild(i);
- if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() > 1)
- {
- OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("?")) ,SQL_NODE_PUNCTUATION,0);
- delete pChildNode->replace(pChildNode->getChild(0),pNewNode);
- sal_Int32 nChildCount = pChildNode->count();
- for(sal_Int32 j=1;j < nChildCount;++j)
- delete pChildNode->removeAt(1);
- }
- else
- substituteParameterNames(pChildNode);
-
- }
-}
-// -----------------------------------------------------------------------------
-bool OSQLParser::extractDate(OSQLParseNode* pLiteral,double& _rfValue)
-{
- Reference< XNumberFormatsSupplier > xFormatSup = m_xFormatter->getNumberFormatsSupplier();
- Reference< XNumberFormatTypes > xFormatTypes;
- if ( xFormatSup.is() )
- xFormatTypes = xFormatTypes.query( xFormatSup->getNumberFormats() );
-
- // if there is no format key, yet, make sure we have a feasible one for our locale
- try
- {
- if ( !m_nFormatKey && xFormatTypes.is() )
- m_nFormatKey = ::dbtools::getDefaultNumberFormat( m_xField, xFormatTypes, m_pData->aLocale );
- }
- catch( Exception& ) { }
- ::rtl::OUString sValue = pLiteral->getTokenValue();
- sal_Int32 nTryFormat = m_nFormatKey;
- bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue );
-
- // If our format key didn't do, try the default date format for our locale.
- if ( !bSuccess && xFormatTypes.is() )
- {
- try
- {
- nTryFormat = xFormatTypes->getStandardFormat( NumberFormat::DATE, m_pData->aLocale );
- }
- catch( Exception& ) { }
- bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue );
- }
-
- // if this also didn't do, try ISO format
- if ( !bSuccess && xFormatTypes.is() )
- {
- try
- {
- nTryFormat = xFormatTypes->getFormatIndex( NumberFormatIndex::DATE_DIN_YYYYMMDD, m_pData->aLocale );
- }
- catch( Exception& ) { }
- bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue );
- }
-
- // if this also didn't do, try fallback date format (en-US)
- if ( !bSuccess )
- {
- nTryFormat = m_nDateFormatKey;
- bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue );
- }
- return bSuccess;
-}
-// -----------------------------------------------------------------------------
-OSQLParseNode* OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& pLiteral)
-{
- // try converting the string into a date, according to our format key
- double fValue = 0.0;
- OSQLParseNode* pFCTNode = NULL;
-
- if ( extractDate(pLiteral,fValue) )
- pFCTNode = buildNode_Date( fValue, _nType);
-
- delete pLiteral;
- pLiteral = NULL;
-
- if ( !pFCTNode )
- m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE);
-
- return pFCTNode;
-}
-// -----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-OSQLParseNode::OSQLParseNode(const sal_Char * pNewValue,
- SQLNodeType eNewNodeType,
- sal_uInt32 nNewNodeID)
- :m_pParent(NULL)
- ,m_aNodeValue(pNewValue,strlen(pNewValue),RTL_TEXTENCODING_UTF8)
- ,m_eNodeType(eNewNodeType)
- ,m_nNodeID(nNewNodeID)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" );
-
- OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert");
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode::OSQLParseNode(const ::rtl::OString &_rNewValue,
- SQLNodeType eNewNodeType,
- sal_uInt32 nNewNodeID)
- :m_pParent(NULL)
- ,m_aNodeValue(rtl::OStringToOUString(_rNewValue,RTL_TEXTENCODING_UTF8))
- ,m_eNodeType(eNewNodeType)
- ,m_nNodeID(nNewNodeID)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" );
-
- OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert");
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode::OSQLParseNode(const sal_Unicode * pNewValue,
- SQLNodeType eNewNodeType,
- sal_uInt32 nNewNodeID)
- :m_pParent(NULL)
- ,m_aNodeValue(pNewValue)
- ,m_eNodeType(eNewNodeType)
- ,m_nNodeID(nNewNodeID)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" );
-
- OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert");
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode::OSQLParseNode(const ::rtl::OUString &_rNewValue,
- SQLNodeType eNewNodeType,
- sal_uInt32 nNewNodeID)
- :m_pParent(NULL)
- ,m_aNodeValue(_rNewValue)
- ,m_eNodeType(eNewNodeType)
- ,m_nNodeID(nNewNodeID)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" );
-
- OSL_ENSURE(m_eNodeType >= SQL_NODE_RULE && m_eNodeType <= SQL_NODE_CONCAT,"OSQLParseNode: mit unzulaessigem NodeType konstruiert");
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode::OSQLParseNode(const OSQLParseNode& rParseNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::OSQLParseNode" );
-
- // klemm den getParent auf NULL
- m_pParent = NULL;
-
- // kopiere die member
- m_aNodeValue = rParseNode.m_aNodeValue;
- m_eNodeType = rParseNode.m_eNodeType;
- m_nNodeID = rParseNode.m_nNodeID;
-
-
- // denk dran, dass von Container abgeleitet wurde, laut SV-Help erzeugt
- // copy-Constructor des Containers einen neuen Container mit den gleichen
- // Zeigern als Inhalt -> d.h. nach dem Kopieren des Container wird fuer
- // alle Zeiger ungleich NULL eine Kopie hergestellt und anstelle des alten
- // Zeigers wieder eingehangen.
-
- // wenn kein Blatt, dann SubTrees bearbeiten
- for (OSQLParseNodes::const_iterator i = rParseNode.m_aChildren.begin();
- i != rParseNode.m_aChildren.end(); ++i)
- append(new OSQLParseNode(**i));
-}
-// -----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-OSQLParseNode& OSQLParseNode::operator=(const OSQLParseNode& rParseNode)
-{
- if (this != &rParseNode)
- {
- // kopiere die member - pParent bleibt der alte
- m_aNodeValue = rParseNode.m_aNodeValue;
- m_eNodeType = rParseNode.m_eNodeType;
- m_nNodeID = rParseNode.m_nNodeID;
-
- for (OSQLParseNodes::const_iterator i = m_aChildren.begin();
- i != m_aChildren.end(); ++i)
- delete *i;
-
- m_aChildren.clear();
-
- for (OSQLParseNodes::const_iterator j = rParseNode.m_aChildren.begin();
- j != rParseNode.m_aChildren.end(); ++j)
- append(new OSQLParseNode(**j));
- }
- return *this;
-}
-
-//-----------------------------------------------------------------------------
-sal_Bool OSQLParseNode::operator==(OSQLParseNode& rParseNode) const
-{
- // die member muessen gleich sein
- sal_Bool bResult = (m_nNodeID == rParseNode.m_nNodeID) &&
- (m_eNodeType == rParseNode.m_eNodeType) &&
- (m_aNodeValue == rParseNode.m_aNodeValue) &&
- count() == rParseNode.count();
-
- // Parameters are not equal!
- bResult = bResult && !SQL_ISRULE(this, parameter);
-
- // compare childs
- for (sal_uInt32 i=0; bResult && i < count(); i++)
- bResult = *getChild(i) == *rParseNode.getChild(i);
-
- return bResult;
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseNode::~OSQLParseNode()
-{
- for (OSQLParseNodes::const_iterator i = m_aChildren.begin();
- i != m_aChildren.end(); ++i)
- delete *i;
- m_aChildren.clear();
-}
-
-//-----------------------------------------------------------------------------
-void OSQLParseNode::append(OSQLParseNode* pNewNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::append" );
-
- OSL_ENSURE(pNewNode != NULL, "OSQLParseNode: ungueltiger NewSubTree");
- OSL_ENSURE(pNewNode->getParent() == NULL, "OSQLParseNode: Knoten ist kein Waise");
- OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewNode) == m_aChildren.end(),
- "OSQLParseNode::append() Node already element of parent");
-
- // stelle Verbindung zum getParent her:
- pNewNode->setParent( this );
- // und haenge den SubTree hinten an
- m_aChildren.push_back(pNewNode);
-}
-// -----------------------------------------------------------------------------
-sal_Bool OSQLParseNode::addDateValue(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::addDateValue" );
- // special display for date/time values
- if (SQL_ISRULE(this,set_fct_spec) && SQL_ISPUNCTUATION(m_aChildren[0],"{"))
- {
- const OSQLParseNode* pODBCNode = m_aChildren[1];
- const OSQLParseNode* pODBCNodeChild = pODBCNode->m_aChildren[0];
-
- if (pODBCNodeChild->getNodeType() == SQL_NODE_KEYWORD && (
- SQL_ISTOKEN(pODBCNodeChild, D) ||
- SQL_ISTOKEN(pODBCNodeChild, T) ||
- SQL_ISTOKEN(pODBCNodeChild, TS) ))
- {
- ::rtl::OUString suQuote(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'")));
- if (rParam.bPredicate)
- {
- if (rParam.aMetaData.shouldEscapeDateTime())
- {
- suQuote = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("#"));
- }
- }
- else
- {
- if (rParam.aMetaData.shouldEscapeDateTime())
- {
- // suQuote = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("'"));
- return sal_False;
- }
- }
-
- if (rString.getLength())
- rString.appendAscii(" ");
- rString.append(suQuote);
- const ::rtl::OUString sTokenValue = pODBCNode->m_aChildren[1]->getTokenValue();
- if (SQL_ISTOKEN(pODBCNodeChild, D))
- {
- rString.append(rParam.bPredicate ? convertDateString(rParam, sTokenValue) : sTokenValue);
- }
- else if (SQL_ISTOKEN(pODBCNodeChild, T))
- {
- rString.append(rParam.bPredicate ? convertTimeString(rParam, sTokenValue) : sTokenValue);
- }
- else
- {
- rString.append(rParam.bPredicate ? convertDateTimeString(rParam, sTokenValue) : sTokenValue);
- }
- rString.append(suQuote);
- return sal_True;
- }
- }
- return sal_False;
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNode::replaceNodeValue(const ::rtl::OUString& rTableAlias,const ::rtl::OUString& rColumnName)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replaceNodeValue" );
- for (sal_uInt32 i=0;i<count();++i)
- {
- if (SQL_ISRULE(this,column_ref) && count() == 1 && getChild(0)->getTokenValue() == rColumnName)
- {
- OSQLParseNode * pCol = removeAt((sal_uInt32)0);
- append(new OSQLParseNode(rTableAlias,SQL_NODE_NAME));
- append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")),SQL_NODE_PUNCTUATION));
- append(pCol);
- }
- else
- getChild(i)->replaceNodeValue(rTableAlias,rColumnName);
- }
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParseNode::getByRule(OSQLParseNode::Rule eRule) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getByRule" );
- OSQLParseNode* pRetNode = 0;
- if (isRule() && OSQLParser::RuleID(eRule) == getRuleID())
- pRetNode = (OSQLParseNode*)this;
- else
- {
- for (OSQLParseNodes::const_iterator i = m_aChildren.begin();
- !pRetNode && i != m_aChildren.end(); ++i)
- pRetNode = (*i)->getByRule(eRule);
- }
- return pRetNode;
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* MakeANDNode(OSQLParseNode *pLeftLeaf,OSQLParseNode *pRightLeaf)
-{
- OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_term));
- pNewNode->append(pLeftLeaf);
- pNewNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AND")),SQL_NODE_KEYWORD,SQL_TOKEN_AND));
- pNewNode->append(pRightLeaf);
- return pNewNode;
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* MakeORNode(OSQLParseNode *pLeftLeaf,OSQLParseNode *pRightLeaf)
-{
- OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::search_condition));
- pNewNode->append(pLeftLeaf);
- pNewNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OR")),SQL_NODE_KEYWORD,SQL_TOKEN_OR));
- pNewNode->append(pRightLeaf);
- return pNewNode;
-}
-//-----------------------------------------------------------------------------
-void OSQLParseNode::disjunctiveNormalForm(OSQLParseNode*& pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::disjunctiveNormalForm" );
- if(!pSearchCondition) // no where condition at entry point
- return;
-
- OSQLParseNode::absorptions(pSearchCondition);
- // '(' search_condition ')'
- if (SQL_ISRULE(pSearchCondition,boolean_primary))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(1);
- disjunctiveNormalForm(pLeft);
- }
- // search_condition SQL_TOKEN_OR boolean_term
- else if (SQL_ISRULE(pSearchCondition,search_condition))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- disjunctiveNormalForm(pLeft);
-
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- disjunctiveNormalForm(pRight);
- }
- // boolean_term SQL_TOKEN_AND boolean_factor
- else if (SQL_ISRULE(pSearchCondition,boolean_term))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- disjunctiveNormalForm(pLeft);
-
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- disjunctiveNormalForm(pRight);
-
- OSQLParseNode* pNewNode = NULL;
- // '(' search_condition ')' on left side
- if(pLeft->count() == 3 && SQL_ISRULE(pLeft,boolean_primary) && SQL_ISRULE(pLeft->getChild(1),search_condition))
- {
- // and-or tree on left side
- OSQLParseNode* pOr = pLeft->getChild(1);
- OSQLParseNode* pNewLeft = NULL;
- OSQLParseNode* pNewRight = NULL;
-
- // cut right from parent
- pSearchCondition->removeAt(2);
-
- pNewRight = MakeANDNode(pOr->removeAt(2) ,pRight);
- pNewLeft = MakeANDNode(pOr->removeAt((sal_uInt32)0) ,new OSQLParseNode(*pRight));
- pNewNode = MakeORNode(pNewLeft,pNewRight);
- // and append new Node
- replaceAndReset(pSearchCondition,pNewNode);
-
- disjunctiveNormalForm(pSearchCondition);
- }
- else if(pRight->count() == 3 && SQL_ISRULE(pRight,boolean_primary) && SQL_ISRULE(pRight->getChild(1),search_condition))
- { // '(' search_condition ')' on right side
- // and-or tree on right side
- // a and (b or c)
- OSQLParseNode* pOr = pRight->getChild(1);
- OSQLParseNode* pNewLeft = NULL;
- OSQLParseNode* pNewRight = NULL;
-
- // cut left from parent
- pSearchCondition->removeAt((sal_uInt32)0);
-
- pNewRight = MakeANDNode(pLeft,pOr->removeAt(2));
- pNewLeft = MakeANDNode(new OSQLParseNode(*pLeft),pOr->removeAt((sal_uInt32)0));
- pNewNode = MakeORNode(pNewLeft,pNewRight);
-
- // and append new Node
- replaceAndReset(pSearchCondition,pNewNode);
- disjunctiveNormalForm(pSearchCondition);
- }
- else if(SQL_ISRULE(pLeft,boolean_primary) && (!SQL_ISRULE(pLeft->getChild(1),search_condition) || !SQL_ISRULE(pLeft->getChild(1),boolean_term)))
- pSearchCondition->replace(pLeft, pLeft->removeAt(1));
- else if(SQL_ISRULE(pRight,boolean_primary) && (!SQL_ISRULE(pRight->getChild(1),search_condition) || !SQL_ISRULE(pRight->getChild(1),boolean_term)))
- pSearchCondition->replace(pRight, pRight->removeAt(1));
- }
-}
-//-----------------------------------------------------------------------------
-void OSQLParseNode::negateSearchCondition(OSQLParseNode*& pSearchCondition,sal_Bool bNegate)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::negateSearchCondition" );
- if(!pSearchCondition) // no where condition at entry point
- return;
- // '(' search_condition ')'
- if (pSearchCondition->count() == 3 && SQL_ISRULE(pSearchCondition,boolean_primary))
- {
- OSQLParseNode* pRight = pSearchCondition->getChild(1);
- negateSearchCondition(pRight,bNegate);
- }
- // search_condition SQL_TOKEN_OR boolean_term
- else if (SQL_ISRULE(pSearchCondition,search_condition))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- if(bNegate)
- {
- OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_term));
- pNewNode->append(pSearchCondition->removeAt((sal_uInt32)0));
- pNewNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AND")),SQL_NODE_KEYWORD,SQL_TOKEN_AND));
- pNewNode->append(pSearchCondition->removeAt((sal_uInt32)1));
- replaceAndReset(pSearchCondition,pNewNode);
-
- pLeft = pNewNode->getChild(0);
- pRight = pNewNode->getChild(2);
- }
-
- negateSearchCondition(pLeft,bNegate);
- negateSearchCondition(pRight,bNegate);
- }
- // boolean_term SQL_TOKEN_AND boolean_factor
- else if (SQL_ISRULE(pSearchCondition,boolean_term))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- if(bNegate)
- {
- OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::search_condition));
- pNewNode->append(pSearchCondition->removeAt((sal_uInt32)0));
- pNewNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OR")),SQL_NODE_KEYWORD,SQL_TOKEN_OR));
- pNewNode->append(pSearchCondition->removeAt((sal_uInt32)1));
- replaceAndReset(pSearchCondition,pNewNode);
-
- pLeft = pNewNode->getChild(0);
- pRight = pNewNode->getChild(2);
- }
-
- negateSearchCondition(pLeft,bNegate);
- negateSearchCondition(pRight,bNegate);
- }
- // SQL_TOKEN_NOT ( boolean_test )
- else if (SQL_ISRULE(pSearchCondition,boolean_factor))
- {
- OSQLParseNode *pNot = pSearchCondition->removeAt((sal_uInt32)0);
- delete pNot;
- OSQLParseNode *pBooleanTest = pSearchCondition->removeAt((sal_uInt32)0);
- // TODO is this needed // pBooleanTest->setParent(NULL);
- replaceAndReset(pSearchCondition,pBooleanTest);
-
- if (!bNegate)
- negateSearchCondition(pSearchCondition,sal_True); // negate all deeper values
- }
- // row_value_constructor comparison row_value_constructor
- // row_value_constructor comparison any_all_some subquery
- else if(bNegate && (SQL_ISRULE(pSearchCondition,comparison_predicate) || SQL_ISRULE(pSearchCondition,all_or_any_predicate)))
- {
- OSQLParseNode* pComparison = pSearchCondition->getChild(1);
- OSQLParseNode* pNewComparison = NULL;
- switch(pComparison->getNodeType())
- {
- case SQL_NODE_EQUAL:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<>")),SQL_NODE_NOTEQUAL,SQL_NOTEQUAL);
- break;
- case SQL_NODE_LESS:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">=")),SQL_NODE_GREATEQ,SQL_GREATEQ);
- break;
- case SQL_NODE_GREAT:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<=")),SQL_NODE_LESSEQ,SQL_LESSEQ);
- break;
- case SQL_NODE_LESSEQ:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">")),SQL_NODE_GREAT,SQL_GREAT);
- break;
- case SQL_NODE_GREATEQ:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<")),SQL_NODE_LESS,SQL_LESS);
- break;
- case SQL_NODE_NOTEQUAL:
- pNewComparison = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")),SQL_NODE_EQUAL,SQL_EQUAL);
- break;
- default:
- OSL_FAIL( "OSQLParseNode::negateSearchCondition: unexpected node type!" );
- break;
- }
- pSearchCondition->replace(pComparison, pNewComparison);
- delete pComparison;
- }
-
- else if(bNegate && (SQL_ISRULE(pSearchCondition,test_for_null) || SQL_ISRULE(pSearchCondition,in_predicate) ||
- SQL_ISRULE(pSearchCondition,between_predicate) || SQL_ISRULE(pSearchCondition,boolean_test) ))
- {
- OSQLParseNode* pPart2 = pSearchCondition;
- if ( !SQL_ISRULE(pSearchCondition,boolean_test) )
- pPart2 = pSearchCondition->getChild(1);
- sal_uInt32 nNotPos = 0;
- if ( SQL_ISRULE( pSearchCondition, test_for_null ) )
- nNotPos = 1;
- else if ( SQL_ISRULE( pSearchCondition, boolean_test ) )
- nNotPos = 2;
-
- OSQLParseNode* pNot = pPart2->getChild(nNotPos);
- OSQLParseNode* pNotNot = NULL;
- if(pNot->isRule())
- pNotNot = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NOT")),SQL_NODE_KEYWORD,SQL_TOKEN_NOT);
- else
- pNotNot = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not));
- pPart2->replace(pNot, pNotNot);
- delete pNot;
- }
- else if(bNegate && (SQL_ISRULE(pSearchCondition,like_predicate)))
- {
- OSQLParseNode* pNot = pSearchCondition->getChild( 1 )->getChild( 0 );
- OSQLParseNode* pNotNot = NULL;
- if(pNot->isRule())
- pNotNot = new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NOT")),SQL_NODE_KEYWORD,SQL_TOKEN_NOT);
- else
- pNotNot = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::sql_not));
- pSearchCondition->getChild( 1 )->replace(pNot, pNotNot);
- delete pNot;
- }
-}
-//-----------------------------------------------------------------------------
-void OSQLParseNode::eraseBraces(OSQLParseNode*& pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::eraseBraces" );
- if (pSearchCondition && (SQL_ISRULE(pSearchCondition,boolean_primary) || (pSearchCondition->count() == 3 && SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")"))))
- {
- OSQLParseNode* pRight = pSearchCondition->getChild(1);
- absorptions(pRight);
- // if child is not a or or and tree then delete () around child
- if(!(SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || SQL_ISRULE(pSearchCondition->getChild(1),search_condition)) ||
- SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || // and can always stand without ()
- (SQL_ISRULE(pSearchCondition->getChild(1),search_condition) && SQL_ISRULE(pSearchCondition->getParent(),search_condition)))
- {
- OSQLParseNode* pNode = pSearchCondition->removeAt(1);
- replaceAndReset(pSearchCondition,pNode);
- }
- }
-}
-//-----------------------------------------------------------------------------
-void OSQLParseNode::absorptions(OSQLParseNode*& pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::absorptions" );
- if(!pSearchCondition) // no where condition at entry point
- return;
-
- eraseBraces(pSearchCondition);
-
- if(SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- absorptions(pLeft);
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- absorptions(pRight);
- }
-
- sal_uInt32 nPos = 0;
- // a and a || a or a
- OSQLParseNode* pNewNode = NULL;
- if(( SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition))
- && *pSearchCondition->getChild(0) == *pSearchCondition->getChild(2))
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)0);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- // (a or b) and a || ( b or c ) and a
- // a and ( a or b) || a and ( b or c )
- else if ( SQL_ISRULE(pSearchCondition,boolean_term)
- && (
- ( SQL_ISRULE(pSearchCondition->getChild(nPos = 0),boolean_primary)
- || SQL_ISRULE(pSearchCondition->getChild(nPos),search_condition)
- )
- || ( SQL_ISRULE(pSearchCondition->getChild(nPos = 2),boolean_primary)
- || SQL_ISRULE(pSearchCondition->getChild(nPos),search_condition)
- )
- )
- )
- {
- OSQLParseNode* p2ndSearch = pSearchCondition->getChild(nPos);
- if ( SQL_ISRULE(p2ndSearch,boolean_primary) )
- p2ndSearch = p2ndSearch->getChild(1);
-
- if ( *p2ndSearch->getChild(0) == *pSearchCondition->getChild(2-nPos) ) // a and ( a or b) -> a or b
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)0);
- replaceAndReset(pSearchCondition,pNewNode);
-
- }
- else if ( *p2ndSearch->getChild(2) == *pSearchCondition->getChild(2-nPos) ) // a and ( b or a) -> a or b
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)2);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- else if ( p2ndSearch->getByRule(OSQLParseNode::search_condition) )
- {
- // a and ( b or c ) -> ( a and b ) or ( a and c )
- // ( b or c ) and a -> ( a and b ) or ( a and c )
- OSQLParseNode* pC = p2ndSearch->removeAt((sal_uInt32)2);
- OSQLParseNode* pB = p2ndSearch->removeAt((sal_uInt32)0);
- OSQLParseNode* pA = pSearchCondition->removeAt((sal_uInt32)2-nPos);
-
- OSQLParseNode* p1stAnd = MakeANDNode(pA,pB);
- OSQLParseNode* p2ndAnd = MakeANDNode(new OSQLParseNode(*pA),pC);
- pNewNode = MakeORNode(p1stAnd,p2ndAnd);
- OSQLParseNode* pNode = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary));
- pNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(")),SQL_NODE_PUNCTUATION));
- pNode->append(pNewNode);
- pNode->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")),SQL_NODE_PUNCTUATION));
- OSQLParseNode::eraseBraces(p1stAnd);
- OSQLParseNode::eraseBraces(p2ndAnd);
- replaceAndReset(pSearchCondition,pNode);
- }
- }
- // a or a and b || a or b and a
- else if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(2),boolean_term))
- {
- if(*pSearchCondition->getChild(2)->getChild(0) == *pSearchCondition->getChild(0))
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)0);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- else if(*pSearchCondition->getChild(2)->getChild(2) == *pSearchCondition->getChild(0))
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)0);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- }
- // a and b or a || b and a or a
- else if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(0),boolean_term))
- {
- if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2))
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)2);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2))
- {
- pNewNode = pSearchCondition->removeAt((sal_uInt32)2);
- replaceAndReset(pSearchCondition,pNewNode);
- }
- }
- eraseBraces(pSearchCondition);
-}
-//-----------------------------------------------------------------------------
-void OSQLParseNode::compress(OSQLParseNode *&pSearchCondition)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::compress" );
- if(!pSearchCondition) // no where condition at entry point
- return;
-
- OSQLParseNode::eraseBraces(pSearchCondition);
-
- if(SQL_ISRULE(pSearchCondition,boolean_term) || SQL_ISRULE(pSearchCondition,search_condition))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0);
- compress(pLeft);
-
- OSQLParseNode* pRight = pSearchCondition->getChild(2);
- compress(pRight);
- }
- else if( SQL_ISRULE(pSearchCondition,boolean_primary) || (pSearchCondition->count() == 3 && SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
- SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")))
- {
- OSQLParseNode* pRight = pSearchCondition->getChild(1);
- compress(pRight);
- // if child is not a or or and tree then delete () around child
- if(!(SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) || SQL_ISRULE(pSearchCondition->getChild(1),search_condition)) ||
- (SQL_ISRULE(pSearchCondition->getChild(1),boolean_term) && SQL_ISRULE(pSearchCondition->getParent(),boolean_term)) ||
- (SQL_ISRULE(pSearchCondition->getChild(1),search_condition) && SQL_ISRULE(pSearchCondition->getParent(),search_condition)))
- {
- OSQLParseNode* pNode = pSearchCondition->removeAt(1);
- replaceAndReset(pSearchCondition,pNode);
- }
- }
-
- // or with two and trees where one element of the and trees are equal
- if(SQL_ISRULE(pSearchCondition,search_condition) && SQL_ISRULE(pSearchCondition->getChild(0),boolean_term) && SQL_ISRULE(pSearchCondition->getChild(2),boolean_term))
- {
- if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2)->getChild(0))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt(2);
- OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt(2);
- OSQLParseNode* pNode = MakeORNode(pLeft,pRight);
-
- OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary));
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(")),SQL_NODE_PUNCTUATION));
- pNewRule->append(pNode);
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")),SQL_NODE_PUNCTUATION));
-
- OSQLParseNode::eraseBraces(pLeft);
- OSQLParseNode::eraseBraces(pRight);
-
- pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt((sal_uInt32)0),pNewRule);
- replaceAndReset(pSearchCondition,pNode);
- }
- else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2)->getChild(0))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt((sal_uInt32)0);
- OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt(2);
- OSQLParseNode* pNode = MakeORNode(pLeft,pRight);
-
- OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary));
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(")),SQL_NODE_PUNCTUATION));
- pNewRule->append(pNode);
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")),SQL_NODE_PUNCTUATION));
-
- OSQLParseNode::eraseBraces(pLeft);
- OSQLParseNode::eraseBraces(pRight);
-
- pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt(1),pNewRule);
- replaceAndReset(pSearchCondition,pNode);
- }
- else if(*pSearchCondition->getChild(0)->getChild(0) == *pSearchCondition->getChild(2)->getChild(2))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt(2);
- OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt((sal_uInt32)0);
- OSQLParseNode* pNode = MakeORNode(pLeft,pRight);
-
- OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary));
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(")),SQL_NODE_PUNCTUATION));
- pNewRule->append(pNode);
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")),SQL_NODE_PUNCTUATION));
-
- OSQLParseNode::eraseBraces(pLeft);
- OSQLParseNode::eraseBraces(pRight);
-
- pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt((sal_uInt32)0),pNewRule);
- replaceAndReset(pSearchCondition,pNode);
- }
- else if(*pSearchCondition->getChild(0)->getChild(2) == *pSearchCondition->getChild(2)->getChild(2))
- {
- OSQLParseNode* pLeft = pSearchCondition->getChild(0)->removeAt((sal_uInt32)0);
- OSQLParseNode* pRight = pSearchCondition->getChild(2)->removeAt((sal_uInt32)0);
- OSQLParseNode* pNode = MakeORNode(pLeft,pRight);
-
- OSQLParseNode* pNewRule = new OSQLParseNode(::rtl::OUString(),SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::boolean_primary));
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("(")),SQL_NODE_PUNCTUATION));
- pNewRule->append(pNode);
- pNewRule->append(new OSQLParseNode(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")),SQL_NODE_PUNCTUATION));
-
- OSQLParseNode::eraseBraces(pLeft);
- OSQLParseNode::eraseBraces(pRight);
-
- pNode = MakeANDNode(pSearchCondition->getChild(0)->removeAt(1),pNewRule);
- replaceAndReset(pSearchCondition,pNode);
- }
- }
-}
-#if OSL_DEBUG_LEVEL > 0
-// -----------------------------------------------------------------------------
-void OSQLParseNode::showParseTree( ::rtl::OUString& rString ) const
-{
- ::rtl::OUStringBuffer aBuf;
- showParseTree( aBuf, 0 );
- rString = aBuf.makeStringAndClear();
-}
-
-// -----------------------------------------------------------------------------
-void OSQLParseNode::showParseTree( ::rtl::OUStringBuffer& _inout_rBuffer, sal_uInt32 nLevel ) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::showParseTree" );
-
- for ( sal_uInt32 j=0; j<nLevel; ++j)
- _inout_rBuffer.appendAscii( " " );
-
- if ( !isToken() )
- {
- // Regelnamen als rule: ...
- _inout_rBuffer.appendAscii( "RULE_ID: " );
- _inout_rBuffer.append( (sal_Int32)getRuleID() );
- _inout_rBuffer.append( sal_Unicode( '(' ) );
- _inout_rBuffer.append( OSQLParser::RuleIDToStr( getRuleID() ) );
- _inout_rBuffer.append( sal_Unicode( ')' ) );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
-
- // hol dir den ersten Subtree
- for ( OSQLParseNodes::const_iterator i = m_aChildren.begin();
- i != m_aChildren.end();
- ++i
- )
- (*i)->showParseTree( _inout_rBuffer, nLevel+1 );
- }
- else
- {
- // ein Token gefunden
- switch (m_eNodeType)
- {
-
- case SQL_NODE_KEYWORD:
- _inout_rBuffer.appendAscii( "SQL_KEYWORD: " );
- _inout_rBuffer.append( ::rtl::OStringToOUString( OSQLParser::TokenIDToStr( getTokenID() ), RTL_TEXTENCODING_UTF8 ) );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_COMPARISON:
- _inout_rBuffer.appendAscii( "SQL_COMPARISON: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_NAME:
- _inout_rBuffer.appendAscii( "SQL_NAME: " );
- _inout_rBuffer.append( sal_Unicode( '"' ) );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '"' ) );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_STRING:
- _inout_rBuffer.appendAscii( "SQL_STRING: " );
- _inout_rBuffer.append( sal_Unicode( '\'' ) );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\'' ) );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_INTNUM:
- _inout_rBuffer.appendAscii( "SQL_INTNUM: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_APPROXNUM:
- _inout_rBuffer.appendAscii( "SQL_APPROXNUM: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_PUNCTUATION:
- _inout_rBuffer.appendAscii( "SQL_PUNCTUATION: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_AMMSC:
- _inout_rBuffer.appendAscii( "SQL_AMMSC: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_EQUAL:
- case SQL_NODE_LESS:
- case SQL_NODE_GREAT:
- case SQL_NODE_LESSEQ:
- case SQL_NODE_GREATEQ:
- case SQL_NODE_NOTEQUAL:
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_ACCESS_DATE:
- _inout_rBuffer.appendAscii( "SQL_ACCESS_DATE: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_DATE:
- _inout_rBuffer.appendAscii( "SQL_DATE: " );
- _inout_rBuffer.append( m_aNodeValue );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- case SQL_NODE_CONCAT:
- _inout_rBuffer.appendAscii( "||" );
- _inout_rBuffer.append( sal_Unicode( '\n' ) );
- break;
-
- default:
- OSL_TRACE( "-- %i", int( m_eNodeType ) );
- OSL_FAIL( "OSQLParser::ShowParseTree: unzulaessiger NodeType" );
- }
- }
-}
-#endif // OSL_DEBUG_LEVEL > 0
-// -----------------------------------------------------------------------------
-// Insert-Methoden
-//-----------------------------------------------------------------------------
-void OSQLParseNode::insert(sal_uInt32 nPos, OSQLParseNode* pNewSubTree)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::insert" );
- OSL_ENSURE(pNewSubTree != NULL, "OSQLParseNode: ungueltiger NewSubTree");
- OSL_ENSURE(pNewSubTree->getParent() == NULL, "OSQLParseNode: Knoten ist kein Waise");
-
- // stelle Verbindung zum getParent her:
- pNewSubTree->setParent( this );
- m_aChildren.insert(m_aChildren.begin() + nPos, pNewSubTree);
-}
-
-// removeAt-Methoden
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParseNode::removeAt(sal_uInt32 nPos)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::removeAt" );
- OSL_ENSURE(nPos < m_aChildren.size(),"Illegal position for removeAt");
- OSQLParseNodes::iterator aPos(m_aChildren.begin() + nPos);
- OSQLParseNode* pNode = *aPos;
-
- // setze den getParent des removeten auf NULL
- pNode->setParent( NULL );
-
- m_aChildren.erase(aPos);
- return pNode;
-}
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParseNode::remove(OSQLParseNode* pSubTree)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::remove" );
- OSL_ENSURE(pSubTree != NULL, "OSQLParseNode: ungueltiger SubTree");
- OSQLParseNodes::iterator aPos = ::std::find(m_aChildren.begin(), m_aChildren.end(), pSubTree);
- if (aPos != m_aChildren.end())
- {
- // setze den getParent des removeten auf NULL
- pSubTree->setParent( NULL );
- m_aChildren.erase(aPos);
- return pSubTree;
- }
- else
- return NULL;
-}
-
-// Replace-Methoden
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParseNode::replaceAt(sal_uInt32 nPos, OSQLParseNode* pNewSubNode)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replaceAt" );
- OSL_ENSURE(pNewSubNode != NULL, "OSQLParseNode: invalid nodes");
- OSL_ENSURE(pNewSubNode->getParent() == NULL, "OSQLParseNode: node already has getParent");
- OSL_ENSURE(nPos < m_aChildren.size(), "OSQLParseNode: invalid position");
- OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewSubNode) == m_aChildren.end(),
- "OSQLParseNode::Replace() Node already element of parent");
-
- OSQLParseNode* pOldSubNode = m_aChildren[nPos];
-
- // stelle Verbindung zum getParent her:
- pNewSubNode->setParent( this );
- pOldSubNode->setParent( NULL );
-
- m_aChildren[nPos] = pNewSubNode;
- return pOldSubNode;
-}
-
-//-----------------------------------------------------------------------------
-OSQLParseNode* OSQLParseNode::replace (OSQLParseNode* pOldSubNode, OSQLParseNode* pNewSubNode )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::replace " );
- OSL_ENSURE(pOldSubNode != NULL && pNewSubNode != NULL, "OSQLParseNode: invalid nodes");
- OSL_ENSURE(pNewSubNode->getParent() == NULL, "OSQLParseNode: node already has getParent");
- OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pOldSubNode) != m_aChildren.end(),
- "OSQLParseNode::Replace() Node not element of parent");
- OSL_ENSURE(::std::find(m_aChildren.begin(), m_aChildren.end(), pNewSubNode) == m_aChildren.end(),
- "OSQLParseNode::Replace() Node already element of parent");
-
- pOldSubNode->setParent( NULL );
- pNewSubNode->setParent( this );
- ::std::replace(m_aChildren.begin(), m_aChildren.end(), pOldSubNode, pNewSubNode);
- return pOldSubNode;
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNode::parseLeaf(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseLeaf" );
- // ein Blatt ist gefunden
- // Inhalt dem Ausgabestring anfuegen
- switch (m_eNodeType)
- {
- case SQL_NODE_KEYWORD:
- {
- if (rString.getLength())
- rString.appendAscii(" ");
-
- const ::rtl::OString sT = OSQLParser::TokenIDToStr(m_nNodeID, rParam.bInternational ? &rParam.m_rContext : NULL);
- rString.append(::rtl::OStringToOUString(sT,RTL_TEXTENCODING_UTF8));
- } break;
- case SQL_NODE_STRING:
- if (rString.getLength())
- rString.appendAscii(" ");
- rString.append(SetQuotation(m_aNodeValue,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\'")),::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\'\'"))));
- break;
- case SQL_NODE_NAME:
- if (rString.getLength())
- {
- switch(rString.charAt(rString.getLength()-1) )
- {
- case ' ' :
- case '.' : break;
- default :
- if ( !rParam.aMetaData.getCatalogSeparator().getLength()
- || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar()
- )
- rString.appendAscii(" "); break;
- }
- }
- if (rParam.bQuote)
- {
- if (rParam.bPredicate)
- {
- rString.appendAscii("[");
- rString.append(m_aNodeValue);
- rString.appendAscii("]");
- }
- else
- rString.append(SetQuotation(m_aNodeValue,
- rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() ));
- }
- else
- rString.append(m_aNodeValue);
- break;
- case SQL_NODE_ACCESS_DATE:
- if (rString.getLength())
- rString.appendAscii(" ");
- rString.appendAscii("#");
- rString.append(m_aNodeValue);
- rString.appendAscii("#");
- break;
-
- case SQL_NODE_INTNUM:
- case SQL_NODE_APPROXNUM:
- {
- ::rtl::OUString aTmp = m_aNodeValue;
- if (rParam.bInternational && rParam.bPredicate && rParam.cDecSep != '.')
- aTmp = aTmp.replace('.', rParam.cDecSep);
-
- if (rString.getLength())
- rString.appendAscii(" ");
- rString.append(aTmp);
-
- } break;
- case SQL_NODE_PUNCTUATION:
- if ( getParent() && SQL_ISRULE(getParent(),cast_spec) && m_aNodeValue.toChar() == '(' ) // no spaces in front of '('
- {
- rString.append(m_aNodeValue);
- break;
- }
- // fall through
- default:
- if (rString.getLength() && m_aNodeValue.toChar() != '.' && m_aNodeValue.toChar() != ':' )
- {
- switch( rString.charAt(rString.getLength()-1) )
- {
- case ' ' :
- case '.' : break;
- default :
- if ( !rParam.aMetaData.getCatalogSeparator().getLength()
- || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar()
- )
- rString.appendAscii(" "); break;
- }
- }
- rString.append(m_aNodeValue);
- }
-}
-
-// -----------------------------------------------------------------------------
-sal_Int32 OSQLParser::getFunctionReturnType(const ::rtl::OUString& _sFunctionName, const IParseContext* pContext)
-{
- sal_Int32 nType = DataType::VARCHAR;
- ::rtl::OString sFunctionName(::rtl::OUStringToOString(_sFunctionName,RTL_TEXTENCODING_UTF8));
-
- if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ASCII,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_BIT_LENGTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CHAR,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CHAR_LENGTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CONCAT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DIFFERENCE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_INSERT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LCASE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LEFT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LENGTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOCATE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOCATE_2,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LTRIM,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_OCTET_LENGTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_POSITION,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_REPEAT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_REPLACE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RIGHT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RTRIM,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SOUNDEX,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SPACE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SUBSTRING,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_UCASE,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_DATE,pContext))) nType = DataType::DATE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_TIME,pContext))) nType = DataType::TIME;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURRENT_TIMESTAMP,pContext))) nType = DataType::TIMESTAMP;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURDATE,pContext))) nType = DataType::DATE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DATEDIFF,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DATEVALUE,pContext))) nType = DataType::DATE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CURTIME,pContext))) nType = DataType::TIME;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYNAME,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFMONTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFWEEK,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DAYOFYEAR,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_EXTRACT,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_HOUR,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MINUTE,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MONTH,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MONTHNAME,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_NOW,pContext))) nType = DataType::TIMESTAMP;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_QUARTER,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SECOND,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMESTAMPADD,pContext))) nType = DataType::TIMESTAMP;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMESTAMPDIFF,pContext))) nType = DataType::TIMESTAMP;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TIMEVALUE,pContext))) nType = DataType::TIMESTAMP;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_WEEK,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_YEAR,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ABS,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ACOS,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ASIN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ATAN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ATAN2,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_CEILING,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COS,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COT,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_DEGREES,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_EXP,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_FLOOR,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOGF,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOG,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOG10,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MOD,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_PI,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_POWER,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RADIANS,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_RAND,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ROUND,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_ROUNDMAGIC,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SIGN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SIN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SQRT,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TAN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_TRUNCATE,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_COUNT,pContext))) nType = DataType::INTEGER;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MAX,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_MIN,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_AVG,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_SUM,pContext))) nType = DataType::DOUBLE;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_LOWER,pContext))) nType = DataType::VARCHAR;
- else if(sFunctionName.equalsIgnoreAsciiCase(TokenIDToStr(SQL_TOKEN_UPPER,pContext))) nType = DataType::VARCHAR;
-
- return nType;
-}
-// -----------------------------------------------------------------------------
-sal_Int32 OSQLParser::getFunctionParameterType(sal_uInt32 _nTokenId, sal_uInt32 _nPos)
-{
- sal_Int32 nType = DataType::VARCHAR;
-
- if(_nTokenId == SQL_TOKEN_CHAR) nType = DataType::INTEGER;
- else if(_nTokenId == SQL_TOKEN_INSERT)
- {
- if ( _nPos == 2 || _nPos == 3 )
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_LEFT)
- {
- if ( _nPos == 2 )
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_LOCATE)
- {
- if ( _nPos == 3 )
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_LOCATE_2)
- {
- if ( _nPos == 3 )
- nType = DataType::INTEGER;
- }
- else if( _nTokenId == SQL_TOKEN_REPEAT || _nTokenId == SQL_TOKEN_RIGHT )
- {
- if ( _nPos == 2 )
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_SPACE )
- {
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_SUBSTRING)
- {
- if ( _nPos != 1 )
- nType = DataType::INTEGER;
- }
- else if(_nTokenId == SQL_TOKEN_DATEDIFF)
- {
- if ( _nPos != 1 )
- nType = DataType::TIMESTAMP;
- }
- else if(_nTokenId == SQL_TOKEN_DATEVALUE)
- nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_DAYNAME)
- nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_DAYOFMONTH)
- nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_DAYOFWEEK)
- nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_DAYOFYEAR)
- nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_EXTRACT) nType = DataType::VARCHAR;
- else if(_nTokenId == SQL_TOKEN_HOUR) nType = DataType::TIME;
- else if(_nTokenId == SQL_TOKEN_MINUTE) nType = DataType::TIME;
- else if(_nTokenId == SQL_TOKEN_MONTH) nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_MONTHNAME) nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_NOW) nType = DataType::TIMESTAMP;
- else if(_nTokenId == SQL_TOKEN_QUARTER) nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_SECOND) nType = DataType::TIME;
- else if(_nTokenId == SQL_TOKEN_TIMESTAMPADD) nType = DataType::TIMESTAMP;
- else if(_nTokenId == SQL_TOKEN_TIMESTAMPDIFF) nType = DataType::TIMESTAMP;
- else if(_nTokenId == SQL_TOKEN_TIMEVALUE) nType = DataType::TIMESTAMP;
- else if(_nTokenId == SQL_TOKEN_WEEK) nType = DataType::DATE;
- else if(_nTokenId == SQL_TOKEN_YEAR) nType = DataType::DATE;
-
- else if(_nTokenId == SQL_TOKEN_ABS) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ACOS) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ASIN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ATAN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ATAN2) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_CEILING) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_COS) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_COT) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_DEGREES) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_EXP) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_FLOOR) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_LOGF) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_LOG) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_LOG10) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_LN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_MOD) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_PI) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_POWER) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_RADIANS) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_RAND) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ROUND) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_ROUNDMAGIC) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_SIGN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_SIN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_SQRT) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_TAN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_TRUNCATE) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_COUNT) nType = DataType::INTEGER;
- else if(_nTokenId == SQL_TOKEN_MAX) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_MIN) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_AVG) nType = DataType::DOUBLE;
- else if(_nTokenId == SQL_TOKEN_SUM) nType = DataType::DOUBLE;
-
- else if(_nTokenId == SQL_TOKEN_LOWER) nType = DataType::VARCHAR;
- else if(_nTokenId == SQL_TOKEN_UPPER) nType = DataType::VARCHAR;
-
- return nType;
-}
-
-// -----------------------------------------------------------------------------
-const SQLError& OSQLParser::getErrorHelper() const
-{
- return m_pData->aErrors;
-}
-
-// -----------------------------------------------------------------------------
-OSQLParseNode::Rule OSQLParseNode::getKnownRuleID() const
-{
- if ( !isRule() )
- return UNKNOWN_RULE;
- return OSQLParser::RuleIDToRule( getRuleID() );
-}
-// -----------------------------------------------------------------------------
-::rtl::OUString OSQLParseNode::getTableRange(const OSQLParseNode* _pTableRef)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableRange" );
- OSL_ENSURE(_pTableRef && _pTableRef->count() > 1 && _pTableRef->getKnownRuleID() == OSQLParseNode::table_ref,"Invalid node give, only table ref is allowed!");
- const sal_uInt32 nCount = _pTableRef->count();
- ::rtl::OUString sTableRange;
- if ( nCount == 2 || (nCount == 3 && !_pTableRef->getChild(0)->isToken()) || nCount == 5 )
- {
- const OSQLParseNode* pNode = _pTableRef->getChild(nCount - (nCount == 2 ? 1 : 2));
- OSL_ENSURE(pNode && (pNode->getKnownRuleID() == OSQLParseNode::table_primary_as_range_column
- || pNode->getKnownRuleID() == OSQLParseNode::range_variable)
- ,"SQL grammar changed!");
- if ( !pNode->isLeaf() )
- sTableRange = pNode->getChild(1)->getTokenValue();
- } // if ( nCount == 2 || nCount == 3 || nCount == 5)
-
- return sTableRange;
-}
-// -----------------------------------------------------------------------------
-OSQLParseNodesContainer::OSQLParseNodesContainer()
-{
-}
-// -----------------------------------------------------------------------------
-OSQLParseNodesContainer::~OSQLParseNodesContainer()
-{
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNodesContainer::push_back(OSQLParseNode* _pNode)
-{
- ::osl::MutexGuard aGuard(m_aMutex);
- m_aNodes.push_back(_pNode);
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNodesContainer::erase(OSQLParseNode* _pNode)
-{
- ::osl::MutexGuard aGuard(m_aMutex);
- if ( !m_aNodes.empty() )
- {
- ::std::vector< OSQLParseNode* >::iterator aFind = ::std::find(m_aNodes.begin(), m_aNodes.end(),_pNode);
- if ( aFind != m_aNodes.end() )
- m_aNodes.erase(aFind);
- }
-}
-// -----------------------------------------------------------------------------
-bool OSQLParseNodesContainer::empty() const
-{
- return m_aNodes.empty();
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNodesContainer::clear()
-{
- ::osl::MutexGuard aGuard(m_aMutex);
- m_aNodes.clear();
-}
-// -----------------------------------------------------------------------------
-void OSQLParseNodesContainer::clearAndDelete()
-{
- ::osl::MutexGuard aGuard(m_aMutex);
- // clear the garbage collector
- while ( !m_aNodes.empty() )
- {
- OSQLParseNode* pNode = m_aNodes[0];
- while ( pNode->getParent() )
- {
- pNode = pNode->getParent();
- }
- delete pNode;
- }
-}
-} // namespace connectivity
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/parse/wrap_sqlbison.cxx b/connectivity/source/parse/wrap_sqlbison.cxx
deleted file mode 100644
index 932f74fa86..0000000000
--- a/connectivity/source/parse/wrap_sqlbison.cxx
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-
-#include "sqlbison.cxx"
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/connectivity/source/parse/wrap_sqlflex.cxx b/connectivity/source/parse/wrap_sqlflex.cxx
deleted file mode 100644
index 31007e1fce..0000000000
--- a/connectivity/source/parse/wrap_sqlflex.cxx
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-
-#if defined _MSC_VER
- #pragma warning(disable:4505)
-#endif
-
-#include "sqlflex.cxx"
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */