From 9c4a89c43d077756a54a52f15c4a6a3a9f4e04a7 Mon Sep 17 00:00:00 2001 From: "Bradford D. Boyle" Date: Mon, 4 May 2026 21:12:27 -0700 Subject: [PATCH] Support building with libpqxx 8 Starting with version 8.0.0, libpqxx requires C++20. The commit updates both the autotools and cmake builds to detect if sqlsmith is compiling against libpqxx and set the C++ standard appropriately. --- CMakeLists.txt | 12 +++++++++--- config_h.cmake.in | 1 + configure.ac | 13 ++++++++++--- grammar.cc | 4 ++-- log.cc | 6 +++--- postgres.cc | 29 ++++++++++++++++++++++++++--- 6 files changed, 51 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c21ed0..a1a32ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.14) project(SQLsmith LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) include(FeatureTests) @@ -26,9 +26,15 @@ if (NOT USE_UPSTREAM_LIBPQXX) # This check is done by the CMakeLists.txt of the libpqxx project otherwise find_package(PQXX REQUIRED) - if (PQXX_VERSION GREATER 7.0) + if (PQXX_VERSION VERSION_GREATER 7.0 AND PQXX_VERSION VERSION_LESS 8.0) set(HAVE_LIBPQXX7 TRUE) - endif (PQXX_VERSION GREATER 7.0) + set_target_properties(sqlsmith PROPERTIES CXX_STANDARD 17) + endif () + + if (PQXX_VERSION VERSION_GREATER 8.0) + set(HAVE_LIBPQXX8 TRUE) + set_target_properties(sqlsmith PROPERTIES CXX_STANDARD 20) + endif() target_link_libraries(sqlsmith PQXX::PQXX) else (NOT USE_UPSTREAM_LIBPQXX) diff --git a/config_h.cmake.in b/config_h.cmake.in index 3fa2f5d..039703e 100644 --- a/config_h.cmake.in +++ b/config_h.cmake.in @@ -7,6 +7,7 @@ #cmakedefine HAVE_BOOST_REGEX 1 #cmakedefine HAVE_LIBPQXX7 1 +#cmakedefine HAVE_LIBPQXX8 1 #cmakedefine HAVE_LIBSQLITE3 1 #cmakedefine HAVE_MONETDB 1 diff --git a/configure.ac b/configure.ac index 747e49b..4548022 100644 --- a/configure.ac +++ b/configure.ac @@ -6,11 +6,14 @@ AC_PROG_CXX AX_LIB_POSTGRESQL() -PKG_CHECK_MODULES(LIBPQXX, libpqxx < 7.0, +PKG_CHECK_MODULES([LIBPQXX], [libpqxx < 7.0], [AX_CXX_COMPILE_STDCXX_11(noext,mandatory)], - [PKG_CHECK_MODULES([LIBPQXX], [libpqxx >= 7.0], + [PKG_CHECK_MODULES([LIBPQXX], [libpqxx < 8.0], [libpqxx7=yes], - [] + [PKG_CHECK_MODULES([LIBPQXX], [libpqxx >= 8.0], + [libpqxx8=yes] + [] + )] )] ) @@ -18,6 +21,10 @@ AS_IF([test "x$libpqxx7" = "xyes"], AC_MSG_NOTICE([libpqxx version >= 7 detected AS_IF([test "x$libpqxx7" = "xyes"], [AC_DEFINE([HAVE_LIBPQXX7], [1], [define if libpqxx >= 7 is used])], []) AS_IF([test "x$libpqxx7" = "xyes"], [AX_CXX_COMPILE_STDCXX_17(noext,mandatory)], []) +AS_IF([test "x$libpqxx8" = "xyes"], AC_MSG_NOTICE([libpqxx version >= 8 detected]), []) +AS_IF([test "x$libpqxx8" = "xyes"], [AC_DEFINE([HAVE_LIBPQXX8], [1], [define if libpqxx >= 8 is used])], []) +AS_IF([test "x$libpqxx8" = "xyes"], [AX_CXX_COMPILE_STDCXX(20,noext,mandatory)], []) + PKG_CHECK_MODULES(MONETDB_MAPI, monetdb-mapi >= 11.23.0, [AC_DEFINE([HAVE_MONETDB], [1], [define if the MonetDB client library is available])], [] diff --git a/grammar.cc b/grammar.cc index 62aa8e9..a8a0a83 100644 --- a/grammar.cc +++ b/grammar.cc @@ -82,7 +82,7 @@ table_subquery::table_subquery(prod *p, bool lateral) : table_ref(p), is_lateral(lateral) { query = make_shared(this, scope, lateral); string alias = scope->stmt_uid("subq"); - relation *aliased_rel = &query->select_list->derived_table; + auto *aliased_rel = &query->select_list->derived_table; refs.push_back(make_shared(alias, aliased_rel)); } @@ -503,7 +503,7 @@ common_table_expression::common_table_expression(prod *parent, struct scope *s) shared_ptr query = make_shared(this, s); with_queries.push_back(query); string alias = scope->stmt_uid("jennifer"); - relation *relation = &query->select_list->derived_table; + auto *relation = &query->select_list->derived_table; auto aliased_rel = make_shared(alias, relation); refs.push_back(aliased_rel); scope->tables.push_back(&*aliased_rel); diff --git a/log.cc b/log.cc index f836209..09d1d2d 100644 --- a/log.cc +++ b/log.cc @@ -146,7 +146,7 @@ pqxx_logger::pqxx_logger(std::string target, std::string conninfo, struct schema ostringstream seed; seed << smith::rng; -#ifdef HAVE_LIBPQXX7 +#if defined(HAVE_LIBPQXX7) || defined(HAVE_LIBPQXX8) result r = w.exec_prepared("instance", GITREV, target, hostname, s.version, seed.str()); #else result r = w.prepared("instance")(GITREV)(target)(hostname)(s.version)(seed.str()).exec(); @@ -173,7 +173,7 @@ void pqxx_logger::error(prod &query, const dut::failure &e) work w(*c); ostringstream s; s << query; -#ifdef HAVE_LIBPQXX7 +#if defined(HAVE_LIBPQXX7) || defined(HAVE_LIBPQXX8) w.exec_prepared("error", e.what(), s.str(), e.sqlstate); #else w.prepared("error")(e.what())(s.str())(e.sqlstate).exec(); @@ -188,7 +188,7 @@ void pqxx_logger::generated(prod &query) work w(*c); ostringstream s; impedance::report(s); -#ifdef HAVE_LIBPQXX7 +#if defined(HAVE_LIBPQXX7) || defined(HAVE_LIBPQXX8) w.exec_prepared("stat", queries, sum_height/queries, sum_nodes/queries, sum_retries/queries, s.str()); #else w.prepared("stat")(queries)(sum_height/queries)(sum_nodes/queries)(sum_retries/queries)(s.str()).exec(); diff --git a/postgres.cc b/postgres.cc index e80160b..9ed14f3 100644 --- a/postgres.cc +++ b/postgres.cc @@ -73,7 +73,7 @@ dut_pqxx::dut_pqxx(std::string conninfo) void dut_pqxx::test(const std::string &stmt) { try { -#ifndef HAVE_LIBPQXX7 +#if !defined(HAVE_LIBPQXX7) && !defined(HAVE_LIBPQXX8) if(!c.is_open()) c.activate(); #endif @@ -120,6 +120,16 @@ schema_pqxx::schema_pqxx(std::string &conninfo, bool no_catalog) : c(conninfo) "from pg_type "); for (auto row = r.begin(); row != r.end(); ++row) { +#ifdef HAVE_LIBPQXX8 + pqxx::row_ref row_ref = row[0]; + string name(row_ref[0].as()); + OID oid(row_ref[1].as()); + string typdelim(row_ref[2].as()); + OID typrelid(row_ref[3].as()); + OID typelem(row_ref[4].as()); + OID typarray(row_ref[5].as()); + string typtype(row_ref[6].as()); +#else string name(row[0].as()); OID oid(row[1].as()); string typdelim(row[2].as()); @@ -127,6 +137,7 @@ schema_pqxx::schema_pqxx(std::string &conninfo, bool no_catalog) : c(conninfo) OID typelem(row[4].as()); OID typarray(row[5].as()); string typtype(row[6].as()); +#endif // if (schema == "pg_catalog") // continue; // if (schema == "information_schema") @@ -154,14 +165,26 @@ schema_pqxx::schema_pqxx(std::string &conninfo, bool no_catalog) : c(conninfo) "from information_schema.tables"); for (auto row = r.begin(); row != r.end(); ++row) { +#ifdef HAVE_LIBPQXX8 + pqxx::row_ref row_ref = row[0]; + string schema(row_ref[1].as()); + string insertable(row_ref[2].as()); + string table_type(row_ref[3].as()); +#else string schema(row[1].as()); string insertable(row[2].as()); string table_type(row[3].as()); +#endif if (no_catalog && ((schema == "pg_catalog") || (schema == "information_schema"))) continue; - tables.push_back(table(row[0].as(), + tables.push_back( +#ifdef HAVE_LIBPQXX8 + table(row[0][0].as(), +#else + table(row[0].as(), +#endif schema, ((insertable == "YES") ? true : false), ((table_type == "BASE TABLE") ? true : false))); @@ -288,7 +311,7 @@ schema_pqxx::schema_pqxx(std::string &conninfo, bool no_catalog) : c(conninfo) } } cerr << "done." << endl; -#ifdef HAVE_LIBPQXX7 +#if defined(HAVE_LIBPQXX7) || defined(HAVE_LIBPQXX8) c.close(); #else c.disconnect();