office-gobmx/connectivity
Stephan Bergmann 3f5811a464 Silence strange -Warray-bounds with recent GCC 14
...seen at least with some (--enable-dbgutil --enable-optimized etc.)
configuration and a recent GCC 14 trunk,

> In file included from ~/gcc/inst/include/c++/14.0.1/vector:62,
>                  from connectivity/source/drivers/postgresql/pq_connection.cxx:38:
> In static member function ‘static constexpr _Up* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(_Tp*, _Tp*, _Up*) [with _Tp = long unsigned int; _Up = long unsigned int; bool _IsMove = false]’,
>     inlined from ‘constexpr _OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:521:30,
>     inlined from ‘constexpr _OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:548:42,
>     inlined from ‘constexpr _OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:555:31,
>     inlined from ‘constexpr _OI std::copy(_II, _II, _OI) [with _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:651:7,
>     inlined from ‘constexpr std::__cxx1998::vector<bool, _Alloc>::iterator std::__cxx1998::vector<bool, _Alloc>::_M_copy_aligned(const_iterator, const_iterator, iterator) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:1342:28,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::_M_reallocate(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/vector.tcc:1054:40,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::reserve(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:1130:17,
>     inlined from ‘constexpr void std::__debug::vector<_Tp, _Allocator>::reserve(size_type) [with _Tp = bool; _Allocator = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/debug/vector:495:16,
>     inlined from ‘pq_sdbc_driver::{anonymous}::cstr_vector::cstr_vector()’ at connectivity/source/drivers/postgresql/pq_connection.cxx:338:58:
> ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:452:30: error: ‘void* __builtin_memmove(void*, const void*, long unsigned int)’ forming offset 8 is out of the bounds [0, 8] [-Werror=array-bounds=]
>   452 |             __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
>       |             ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

and

> In file included from ~/gcc/inst/include/c++/14.0.1/vector:62,
>                  from connectivity/source/drivers/postgresql/pq_connection.cxx:38:
> In static member function ‘static constexpr _Up* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(_Tp*, _Tp*, _Up*) [with _Tp = long unsigned int; _Up = long unsigned int; bool _IsMove = false]’,
>     inlined from ‘constexpr _OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:521:30,
>     inlined from ‘constexpr _OI std::__copy_move_a1(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:548:42,
>     inlined from ‘constexpr _OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:555:31,
>     inlined from ‘constexpr _OI std::copy(_II, _II, _OI) [with _II = long unsigned int*; _OI = long unsigned int*]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:651:7,
>     inlined from ‘constexpr std::__cxx1998::vector<bool, _Alloc>::iterator std::__cxx1998::vector<bool, _Alloc>::_M_copy_aligned(const_iterator, const_iterator, iterator) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:1342:28,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::_M_reallocate(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/vector.tcc:1054:40,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::reserve(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:1130:17,
>     inlined from ‘constexpr void std::__debug::vector<_Tp, _Allocator>::reserve(size_type) [with _Tp = bool; _Allocator = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/debug/vector:495:16,
>     inlined from ‘pq_sdbc_driver::{anonymous}::cstr_vector::cstr_vector()’ at connectivity/source/drivers/postgresql/pq_connection.cxx:338:58:
> ~/gcc/inst/include/c++/14.0.1/bits/stl_algobase.h:452:30: error: ‘void* __builtin_memmove(void*, const void*, long unsigned int)’ writing between 9 and 9223372036854775807 bytes into a region of size 8 overflows the destination [-Werror=stringop-overflow=]
>   452 |             __builtin_memmove(__result, __first, sizeof(_Tp) * _Num);
>       |             ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> In file included from ~/gcc/inst/include/c++/14.0.1/x86_64-pc-linux-gnu/bits/c++allocator.h:33,
>                  from ~/gcc/inst/include/c++/14.0.1/bits/allocator.h:46,
>                  from ~/gcc/inst/include/c++/14.0.1/vector:63:
> In member function ‘_Tp* std::__new_allocator<_Tp>::allocate(size_type, const void*) [with _Tp = long unsigned int]’,
>     inlined from ‘constexpr _Tp* std::allocator< <template-parameter-1-1> >::allocate(std::size_t) [with _Tp = long unsigned int]’ at ~/gcc/inst/include/c++/14.0.1/bits/allocator.h:196:40,
>     inlined from ‘static constexpr _Tp* std::allocator_traits<std::allocator<_Up> >::allocate(allocator_type&, size_type) [with _Tp = long unsigned int]’ at ~/gcc/inst/include/c++/14.0.1/bits/alloc_traits.h:478:28,
>     inlined from ‘constexpr std::__cxx1998::_Bvector_base<_Alloc>::_Bit_pointer std::__cxx1998::_Bvector_base<_Alloc>::_M_allocate(std::size_t) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:679:48,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::_M_reallocate(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/vector.tcc:1052:43,
>     inlined from ‘constexpr void std::__cxx1998::vector<bool, _Alloc>::reserve(size_type) [with _Alloc = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/bits/stl_bvector.h:1130:17,
>     inlined from ‘constexpr void std::__debug::vector<_Tp, _Allocator>::reserve(size_type) [with _Tp = bool; _Allocator = std::allocator<bool>]’ at ~/gcc/inst/include/c++/14.0.1/debug/vector:495:16,
>     inlined from ‘pq_sdbc_driver::{anonymous}::cstr_vector::cstr_vector()’ at connectivity/source/drivers/postgresql/pq_connection.cxx:338:58:
> ~/gcc/inst/include/c++/14.0.1/bits/new_allocator.h:151:55: note: destination object of size 8 allocated by ‘operator new’
>   151 |         return static_cast<_Tp*>(_GLIBCXX_OPERATOR_NEW(__n * sizeof(_Tp)));
>       |                                                       ^

Change-Id: I6ef1be6428363ff37d591207df379cc18ebea933
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165959
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
2024-04-11 08:18:31 +02:00
..
com/sun/star/sdbcx/comp/hsqldb
inc reduce symbol visibility in --enable-mergelibs=more mode 2024-03-13 08:14:38 +01:00
org/hsqldb/lib
qa
registry
source Silence strange -Warray-bounds with recent GCC 14 2024-04-11 08:18:31 +02:00
workben
AllLangMoTarget_cnr.mk
Configuration_ado.mk
Configuration_calc.mk
Configuration_dbase.mk
Configuration_evoab.mk
Configuration_firebird.mk
Configuration_flat.mk
Configuration_hsqldb.mk
Configuration_jdbc.mk
Configuration_macab.mk
Configuration_mysql.mk
Configuration_mysql_jdbc.mk
Configuration_odbc.mk
Configuration_postgresql.mk
Configuration_writer.mk
CppunitTest_connectivity_ado.mk
CppunitTest_connectivity_commontools.mk
CppunitTest_connectivity_mysql_test.mk
CppunitTest_connectivity_sharedresources.mk
IwyuFilter_connectivity.yaml
Jar_ConnectivityTools.mk
Jar_sdbc_hsqldb.mk
JunitTest_complex.mk
Library_ado.mk
Library_calc.mk
Library_dbase.mk
Library_dbpool2.mk
Library_dbtools.mk
Library_evoab.mk
Library_file.mk
Library_firebird_sdbc.mk
Library_flat.mk
Library_hsqldb.mk
Library_jdbc.mk
Library_macab1.mk
Library_macabdrv1.mk
Library_mozbootstrap.mk
Library_mysql_jdbc.mk
Library_mysqlc.mk
Library_odbc.mk
Library_postgresql-sdbc-impl.mk
Library_postgresql-sdbc.mk
Library_sdbc2.mk
Library_writer.mk
Makefile
Module_connectivity.mk
Package_postgresql-sdbc.mk
Rdb_postgresql-sdbc.mk
README.md

Database Connectivity

Contains database pieces, drivers, etc.

dbaccess builds UI on top of this.

Testing

PostgreSQL

For testing, use:

podman pull postgres:latest
podman run --name=postgres -e POSTGRES_PASSWORD=foobarbaz -p 127.0.0.1:5432:5432 postgres:latest

In Base, Connect to an existing database, select PostgreSQL:

URL: host=127.0.0.1 port=5432 dbname=postgres
User: postgres
Password: foobarbaz

podman stop postgres
podman rm postgres

In order to test SCRAM authentication, create the container like this:

podman run --name=postgres -e POSTGRES_PASSWORD=foobarbaz -e POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 -e POSTGRES_HOST_AUTH_METHOD=scram-sha-256 -p 127.0.0.1:5432:5432 postgres:latest

MySQL

For mysql_test:

  • The CppunitTest_mysql_test unit test can be used to test the mysqlc library with any versions of mysql or mariadb server of your choice.

  • This test does not run automatically. It can be triggered with setting the environment variable "CONNECTIVITY_TEST_MYSQL_DRIVER".

  • The environment variable should contain a URL of the following format: [user]/[passwd]@sdbc:mysql:mysqlc:[host]:[port]/db_name

  • tl;dr:

    podman pull mariadb/server
    podman run --name=mariadb -e MYSQL_ROOT_PASSWORD=foobarbaz -p 127.0.0.1:3306:3306 mariadb/server
    podman exec -it mariadb /bin/bash -c "echo -e CREATE DATABASE test | /usr/bin/mysql -u root"
    (cd connectivity && make -srj8 CppunitTest_connectivity_mysql_test CONNECTIVITY_TEST_MYSQL_DRIVER="root/foobarbaz@sdbc:mysql:mysqlc:127.0.0.1:3306/test")
    podman stop mariadb
    podman rm mariadb

Firebird

Firebird has two primary file types:

  • Databases - FDB files. These are version-specific, platform-specific, optimized for performance, and thus incompatible between versions. These are what those comments are about. Initially, when FB integration was considered, these files were evaluated for ODBs, but were rejected because of the said incompatibility - even when the version is the same, it will differ on big endian architecture and little endian one. The problem discussed in those comments is when people open stand-alone FDBs that are shipped e.g. with FB installation itself, not when people open ODBs.

  • Database backups - FBKs. These are what we use inside ODBs. These are designed to be compatible, independent of architecture; and later versions of FB are always able to open FBKs created in older FB versions.

Our embedded FB is used like this:

  • FBK is extracted from ODB;
  • Embedded FB extracts the compatible FBK into an incompatible FDB (specific to this version of embedded FB DLL);
  • FB works with this temporary FDB;
  • When saving ODB, embedded FB backups the FDB into FBK again, and that is stored inside the ODB.

It, indeed, creates additional performance penalty, but makes the ODB readable by all the future LO versions, no matter what future FB version they embed.