diff options
Diffstat (limited to 'connectivity')
4 files changed, 18 insertions, 7 deletions
diff --git a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx index 4f89e807185a..bedd686b0082 100644 --- a/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx +++ b/connectivity/source/drivers/postgresql/pq_databasemetadata.cxx @@ -1514,7 +1514,7 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getColumns( // allow NULL values. An empty string means // nobody knows. // => pg_attribute.attnotnull - + OUString strDefaultValue = getDefaultValue(m_pSettings); Reference< XPreparedStatement > statement = m_origin->prepareStatement( "SELECT pg_namespace.nspname, " // 1 "pg_class.relname, " // 2 @@ -1524,8 +1524,8 @@ css::uno::Reference< XResultSet > DatabaseMetaData::getColumns( "pg_attribute.attnotnull, " // 6 "pg_type.typdefault, " // 7 "pg_type.typtype, " // 8 - "pg_attrdef.adsrc, " // 9 - "pg_description.description, " // 10 + + strDefaultValue + // 9 + ",pg_description.description, " // 10 "pg_type.typbasetype, " // 11 "pg_attribute.attnum " // 12 "FROM pg_class, " diff --git a/connectivity/source/drivers/postgresql/pq_statement.cxx b/connectivity/source/drivers/postgresql/pq_statement.cxx index f9c9f25abe1d..fd822034c480 100644 --- a/connectivity/source/drivers/postgresql/pq_statement.cxx +++ b/connectivity/source/drivers/postgresql/pq_statement.cxx @@ -629,10 +629,12 @@ static void getAutoValues( String2StringMap & result, const Reference< XConnection > & connection, const OUString &schemaName, - const OUString & tableName ) + const OUString & tableName, + ConnectionSettings *pConnectionSettings ) { + OUString strDefaultValue = getDefaultValue(pConnectionSettings); Reference< XPreparedStatement > stmt = connection->prepareStatement( - "SELECT pg_attribute.attname, pg_attrdef.adsrc " + "SELECT pg_attribute.attname, " + strDefaultValue + "FROM pg_class, pg_namespace, pg_attribute " "LEFT JOIN pg_attrdef ON pg_attribute.attrelid = pg_attrdef.adrelid AND " "pg_attribute.attnum = pg_attrdef.adnum " @@ -642,7 +644,7 @@ static void getAutoValues( // LEM TODO: this is weird; why "LIKE" and not "="? // Most probably gives problems if tableName contains '%' "pg_class.relname LIKE ? AND " - "pg_attrdef.adsrc != ''" + + strDefaultValue + " != ''" ); DisposeGuard guard( stmt ); Reference< XParameters > paras( stmt, UNO_QUERY ); @@ -736,7 +738,7 @@ Reference< XResultSet > getGeneratedValuesFromLastInsert( { if( autoValues.empty() ) { - getAutoValues( autoValues, connection, schemaName, tableName ); + getAutoValues( autoValues, connection, schemaName, tableName, pConnectionSettings ); } // this could mean, that the column is a default or auto value, check this ... bool bColumnMatchAutoValue = false; diff --git a/connectivity/source/drivers/postgresql/pq_tools.cxx b/connectivity/source/drivers/postgresql/pq_tools.cxx index fd691f2ec079..537d915a7781 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.cxx +++ b/connectivity/source/drivers/postgresql/pq_tools.cxx @@ -836,6 +836,13 @@ OString extractSingleTableFromSelect( const std::vector< OString > &vec ) } +OUString getDefaultValue(ConnectionSettings const *settings) +{ + return (PQserverVersion( settings->pConnection ) < 80000)? + OUString("pg_attrdef.adsrc"): + OUString("pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid, true)"); +} + css::uno::Sequence< sal_Int32 > string2intarray( const OUString & str ) { css::uno::Sequence< sal_Int32 > ret; diff --git a/connectivity/source/drivers/postgresql/pq_tools.hxx b/connectivity/source/drivers/postgresql/pq_tools.hxx index 9d4e2349fcfb..99bdbeb14873 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.hxx +++ b/connectivity/source/drivers/postgresql/pq_tools.hxx @@ -100,6 +100,8 @@ void disposeObject( const css::uno::Reference< css::uno::XInterface > & r ); OUString extractTableFromInsert( const OUString & sql ); OString extractSingleTableFromSelect( const std::vector< OString > &vec ); +OUString getDefaultValue(ConnectionSettings const *settings); + void tokenizeSQL( const OString & sql, std::vector< OString > &vec ); void splitSQL( const OString & sql, std::vector< OString > &vec ); std::vector< sal_Int32 > parseIntArray( const OUString & str ); |