mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Remove iostream_debug_helpers
This commit is contained in:
parent
863d799765
commit
84914f2c3d
@ -208,8 +208,6 @@ option(OMIT_HEAVY_DEBUG_SYMBOLS
|
|||||||
"Do not generate debugger info for heavy modules (ClickHouse functions and dictionaries, some contrib)"
|
"Do not generate debugger info for heavy modules (ClickHouse functions and dictionaries, some contrib)"
|
||||||
${OMIT_HEAVY_DEBUG_SYMBOLS_DEFAULT})
|
${OMIT_HEAVY_DEBUG_SYMBOLS_DEFAULT})
|
||||||
|
|
||||||
option(USE_DEBUG_HELPERS "Enable debug helpers" ${USE_DEBUG_HELPERS})
|
|
||||||
|
|
||||||
option(BUILD_STANDALONE_KEEPER "Build keeper as small standalone binary" OFF)
|
option(BUILD_STANDALONE_KEEPER "Build keeper as small standalone binary" OFF)
|
||||||
if (NOT BUILD_STANDALONE_KEEPER)
|
if (NOT BUILD_STANDALONE_KEEPER)
|
||||||
option(CREATE_KEEPER_SYMLINK "Create symlink for clickhouse-keeper to main server binary" ON)
|
option(CREATE_KEEPER_SYMLINK "Create symlink for clickhouse-keeper to main server binary" ON)
|
||||||
|
@ -34,15 +34,6 @@ set (SRCS
|
|||||||
throwError.cpp
|
throwError.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (USE_DEBUG_HELPERS)
|
|
||||||
get_target_property(MAGIC_ENUM_INCLUDE_DIR ch_contrib::magic_enum INTERFACE_INCLUDE_DIRECTORIES)
|
|
||||||
# CMake generator expression will do insane quoting when it encounters special character like quotes, spaces, etc.
|
|
||||||
# Prefixing "SHELL:" will force it to use the original text.
|
|
||||||
set (INCLUDE_DEBUG_HELPERS "SHELL:-I\"${MAGIC_ENUM_INCLUDE_DIR}\" -include \"${ClickHouse_SOURCE_DIR}/base/base/iostream_debug_helpers.h\"")
|
|
||||||
# Use generator expression as we don't want to pollute CMAKE_CXX_FLAGS, which will interfere with CMake check system.
|
|
||||||
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${INCLUDE_DEBUG_HELPERS}>)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
add_library (common ${SRCS})
|
add_library (common ${SRCS})
|
||||||
|
|
||||||
if (WITH_COVERAGE)
|
if (WITH_COVERAGE)
|
||||||
|
@ -1,187 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "demangle.h"
|
|
||||||
#include "getThreadId.h"
|
|
||||||
#include <type_traits>
|
|
||||||
#include <tuple>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <iostream>
|
|
||||||
#include <magic_enum.hpp>
|
|
||||||
|
|
||||||
/** Usage:
|
|
||||||
*
|
|
||||||
* DUMP(variable...)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Out, typename T>
|
|
||||||
Out & dumpValue(Out &, T &&);
|
|
||||||
|
|
||||||
|
|
||||||
/// Catch-all case.
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == -1)
|
|
||||||
Out & dumpImpl(Out & out, T &&) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return out << "{...}";
|
|
||||||
}
|
|
||||||
|
|
||||||
/// An object, that could be output with operator <<.
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 0)
|
|
||||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::declval<Out &>() << std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return out << x;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A pointer-like object.
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 1
|
|
||||||
/// Protect from the case when operator * do effectively nothing (function pointer).
|
|
||||||
&& !std::is_same_v<std::decay_t<T>, std::decay_t<decltype(*std::declval<T>())>>)
|
|
||||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(*std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
if (!x)
|
|
||||||
return out << "nullptr";
|
|
||||||
return dumpValue(out, *x);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Container.
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 2)
|
|
||||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::begin(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
bool first = true;
|
|
||||||
out << "{";
|
|
||||||
for (const auto & elem : x)
|
|
||||||
{
|
|
||||||
if (first)
|
|
||||||
first = false;
|
|
||||||
else
|
|
||||||
out << ", ";
|
|
||||||
dumpValue(out, elem);
|
|
||||||
}
|
|
||||||
return out << "}";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 3 && std::is_enum_v<std::decay_t<T>>)
|
|
||||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return out << magic_enum::enum_name(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// string and const char * - output not as container or pointer.
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 3 && (std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, const char *>))
|
|
||||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return out << std::quoted(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// UInt8 - output as number, not char.
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 3 && std::is_same_v<std::decay_t<T>, unsigned char>)
|
|
||||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return out << int(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Tuple, pair
|
|
||||||
template <size_t N, typename Out, typename T>
|
|
||||||
Out & dumpTupleImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
if constexpr (N == 0)
|
|
||||||
out << "{";
|
|
||||||
else
|
|
||||||
out << ", ";
|
|
||||||
|
|
||||||
dumpValue(out, std::get<N>(x));
|
|
||||||
|
|
||||||
if constexpr (N + 1 == std::tuple_size_v<std::decay_t<T>>)
|
|
||||||
out << "}";
|
|
||||||
else
|
|
||||||
dumpTupleImpl<N + 1>(out, x);
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
requires(priority == 4)
|
|
||||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::get<0>(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return dumpTupleImpl<0>(out, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
Out & dumpDispatchPriorities(Out & out, T && x, std::decay_t<decltype(dumpImpl<priority>(std::declval<Out &>(), std::declval<T>()))> *) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return dumpImpl<priority>(out, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOLINTNEXTLINE(google-explicit-constructor)
|
|
||||||
struct LowPriority { LowPriority(void *) {} };
|
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
|
||||||
Out & dumpDispatchPriorities(Out & out, T && x, LowPriority) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return dumpDispatchPriorities<priority - 1>(out, x, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Out, typename T>
|
|
||||||
Out & dumpValue(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
return dumpDispatchPriorities<5>(out, x, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Out, typename T>
|
|
||||||
Out & dump(Out & out, const char * name, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
|
||||||
{
|
|
||||||
// Dumping string literal, printing name and demangled type is irrelevant.
|
|
||||||
if constexpr (std::is_same_v<const char *, std::decay_t<std::remove_reference_t<T>>>)
|
|
||||||
{
|
|
||||||
const auto name_len = strlen(name);
|
|
||||||
const auto value_len = strlen(x);
|
|
||||||
// `name` is the same as quoted `x`
|
|
||||||
if (name_len > 2 && value_len > 0 && name[0] == '"' && name[name_len - 1] == '"'
|
|
||||||
&& strncmp(name + 1, x, std::min(value_len, name_len) - 1) == 0)
|
|
||||||
return out << x;
|
|
||||||
}
|
|
||||||
|
|
||||||
out << demangle(typeid(x).name()) << " " << name << " = ";
|
|
||||||
return dumpValue(out, x) << "; ";
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
|
|
||||||
|
|
||||||
#define DUMPVAR(VAR) ::dump(std::cerr, #VAR, (VAR));
|
|
||||||
#define DUMPHEAD std::cerr << __FILE__ << ':' << __LINE__ << " [ " << getThreadId() << " ] ";
|
|
||||||
#define DUMPTAIL std::cerr << '\n';
|
|
||||||
|
|
||||||
#define DUMP1(V1) do { DUMPHEAD DUMPVAR(V1) DUMPTAIL } while(0)
|
|
||||||
#define DUMP2(V1, V2) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPTAIL } while(0)
|
|
||||||
#define DUMP3(V1, V2, V3) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPTAIL } while(0)
|
|
||||||
#define DUMP4(V1, V2, V3, V4) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPTAIL } while(0)
|
|
||||||
#define DUMP5(V1, V2, V3, V4, V5) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPVAR(V5) DUMPTAIL } while(0)
|
|
||||||
#define DUMP6(V1, V2, V3, V4, V5, V6) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPVAR(V5) DUMPVAR(V6) DUMPTAIL } while(0)
|
|
||||||
#define DUMP7(V1, V2, V3, V4, V5, V6, V7) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPVAR(V5) DUMPVAR(V6) DUMPVAR(V7) DUMPTAIL } while(0)
|
|
||||||
#define DUMP8(V1, V2, V3, V4, V5, V6, V7, V8) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPVAR(V5) DUMPVAR(V6) DUMPVAR(V7) DUMPVAR(V8) DUMPTAIL } while(0)
|
|
||||||
#define DUMP9(V1, V2, V3, V4, V5, V6, V7, V8, V9) do { DUMPHEAD DUMPVAR(V1) DUMPVAR(V2) DUMPVAR(V3) DUMPVAR(V4) DUMPVAR(V5) DUMPVAR(V6) DUMPVAR(V7) DUMPVAR(V8) DUMPVAR(V9) DUMPTAIL } while(0)
|
|
||||||
|
|
||||||
/// https://groups.google.com/forum/#!searchin/kona-dev/variadic$20macro%7Csort:date/kona-dev/XMA-lDOqtlI/GCzdfZsD41sJ
|
|
||||||
|
|
||||||
#define VA_NUM_ARGS_IMPL(x1, x2, x3, x4, x5, x6, x7, x8, x9, N, ...) N
|
|
||||||
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1)
|
|
||||||
|
|
||||||
#define MAKE_VAR_MACRO_IMPL_CONCAT(PREFIX, NUM_ARGS) PREFIX ## NUM_ARGS
|
|
||||||
#define MAKE_VAR_MACRO_IMPL(PREFIX, NUM_ARGS) MAKE_VAR_MACRO_IMPL_CONCAT(PREFIX, NUM_ARGS)
|
|
||||||
#define MAKE_VAR_MACRO(PREFIX, ...) MAKE_VAR_MACRO_IMPL(PREFIX, VA_NUM_ARGS(__VA_ARGS__))
|
|
||||||
|
|
||||||
#define DUMP(...) MAKE_VAR_MACRO(DUMP, __VA_ARGS__)(__VA_ARGS__)
|
|
@ -1,2 +0,0 @@
|
|||||||
clickhouse_add_executable (dump_variable dump_variable.cpp)
|
|
||||||
target_link_libraries (dump_variable PRIVATE clickhouse_common_io)
|
|
@ -1,70 +0,0 @@
|
|||||||
#include <base/iostream_debug_helpers.h>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <tuple>
|
|
||||||
#include <array>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
|
|
||||||
struct S1;
|
|
||||||
struct S2 {};
|
|
||||||
|
|
||||||
struct S3
|
|
||||||
{
|
|
||||||
std::set<const char *> m1;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const S3 & what)
|
|
||||||
{
|
|
||||||
stream << "S3 {m1=";
|
|
||||||
dumpValue(stream, what.m1) << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int, char **)
|
|
||||||
{
|
|
||||||
int x = 1;
|
|
||||||
|
|
||||||
DUMP(x);
|
|
||||||
DUMP(x, 1, &x);
|
|
||||||
|
|
||||||
DUMP(std::make_unique<int>(1));
|
|
||||||
DUMP(std::make_shared<int>(1));
|
|
||||||
|
|
||||||
std::vector<int> vec{1, 2, 3};
|
|
||||||
DUMP(vec);
|
|
||||||
|
|
||||||
auto pair = std::make_pair(1, 2);
|
|
||||||
DUMP(pair);
|
|
||||||
|
|
||||||
auto tuple = std::make_tuple(1, 2, 3);
|
|
||||||
DUMP(tuple);
|
|
||||||
|
|
||||||
std::map<int, std::string> map{{1, "hello"}, {2, "world"}};
|
|
||||||
DUMP(map);
|
|
||||||
|
|
||||||
std::initializer_list<const char *> list{"hello", "world"};
|
|
||||||
DUMP(list);
|
|
||||||
|
|
||||||
std::array<const char *, 2> arr{{"hello", "world"}};
|
|
||||||
DUMP(arr);
|
|
||||||
|
|
||||||
//DUMP([]{});
|
|
||||||
|
|
||||||
S1 * s = nullptr;
|
|
||||||
DUMP(s);
|
|
||||||
|
|
||||||
DUMP(S2());
|
|
||||||
|
|
||||||
std::set<const char *> variants = {"hello", "world"};
|
|
||||||
DUMP(variants);
|
|
||||||
|
|
||||||
S3 s3 {{"hello", "world"}};
|
|
||||||
DUMP(s3);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -22,15 +22,6 @@ include (configure_config.cmake)
|
|||||||
configure_file (Common/config.h.in ${CONFIG_INCLUDE_PATH}/config.h)
|
configure_file (Common/config.h.in ${CONFIG_INCLUDE_PATH}/config.h)
|
||||||
configure_file (Common/config_version.cpp.in ${CONFIG_INCLUDE_PATH}/config_version.cpp)
|
configure_file (Common/config_version.cpp.in ${CONFIG_INCLUDE_PATH}/config_version.cpp)
|
||||||
|
|
||||||
if (USE_DEBUG_HELPERS)
|
|
||||||
get_target_property(MAGIC_ENUM_INCLUDE_DIR ch_contrib::magic_enum INTERFACE_INCLUDE_DIRECTORIES)
|
|
||||||
# CMake generator expression will do insane quoting when it encounters special character like quotes, spaces, etc.
|
|
||||||
# Prefixing "SHELL:" will force it to use the original text.
|
|
||||||
set (INCLUDE_DEBUG_HELPERS "SHELL:-I\"${ClickHouse_SOURCE_DIR}/base\" -I\"${MAGIC_ENUM_INCLUDE_DIR}\" -include \"${ClickHouse_SOURCE_DIR}/src/Core/iostream_debug_helpers.h\"")
|
|
||||||
# Use generator expression as we don't want to pollute CMAKE_CXX_FLAGS, which will interfere with CMake check system.
|
|
||||||
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${INCLUDE_DEBUG_HELPERS}>)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# ClickHouse developers may use platform-dependent code under some macro (e.g. `#ifdef ENABLE_MULTITARGET`).
|
# ClickHouse developers may use platform-dependent code under some macro (e.g. `#ifdef ENABLE_MULTITARGET`).
|
||||||
# If turned ON, this option defines such macro.
|
# If turned ON, this option defines such macro.
|
||||||
# See `src/Common/TargetSpecific.h`
|
# See `src/Common/TargetSpecific.h`
|
||||||
|
@ -1,149 +0,0 @@
|
|||||||
#include "iostream_debug_helpers.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <Client/Connection.h>
|
|
||||||
#include <Core/Block.h>
|
|
||||||
#include <Core/ColumnWithTypeAndName.h>
|
|
||||||
#include <Core/Field.h>
|
|
||||||
#include <Core/NamesAndTypes.h>
|
|
||||||
#include <DataTypes/IDataType.h>
|
|
||||||
#include <Functions/IFunction.h>
|
|
||||||
#include <IO/WriteBufferFromOStream.h>
|
|
||||||
#include <Interpreters/ExpressionAnalyzer.h>
|
|
||||||
#include <Interpreters/ExpressionActions.h>
|
|
||||||
#include <Parsers/IAST.h>
|
|
||||||
#include <Storages/IStorage.h>
|
|
||||||
#include <Common/COW.h>
|
|
||||||
#include <Common/FieldVisitorDump.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
|
|
||||||
template <>
|
|
||||||
std::ostream & operator<< <Field>(std::ostream & stream, const Field & what)
|
|
||||||
{
|
|
||||||
stream << applyVisitor(FieldVisitorDump(), what);
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const NameAndTypePair & what)
|
|
||||||
{
|
|
||||||
stream << "NameAndTypePair(name = " << what.name << ", type = " << what.type << ")";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IDataType & what)
|
|
||||||
{
|
|
||||||
stream << "IDataType(name = " << what.getName() << ", default = " << what.getDefault() << ")";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IStorage & what)
|
|
||||||
{
|
|
||||||
auto table_id = what.getStorageID();
|
|
||||||
stream << "IStorage(name = " << what.getName() << ", tableName = " << table_id.table_name << ") {"
|
|
||||||
<< what.getInMemoryMetadataPtr()->getColumns().getAllPhysical().toString() << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const TableLockHolder &)
|
|
||||||
{
|
|
||||||
stream << "TableStructureReadLock()";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IFunctionOverloadResolver & what)
|
|
||||||
{
|
|
||||||
stream << "IFunction(name = " << what.getName() << ", variadic = " << what.isVariadic() << ", args = " << what.getNumberOfArguments()
|
|
||||||
<< ")";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Block & what)
|
|
||||||
{
|
|
||||||
stream << "Block("
|
|
||||||
<< "num_columns = " << what.columns() << "){" << what.dumpStructure() << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const ColumnWithTypeAndName & what)
|
|
||||||
{
|
|
||||||
stream << "ColumnWithTypeAndName(name = " << what.name << ", type = " << *what.type << ", column = ";
|
|
||||||
return dumpValue(stream, what.column) << ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IColumn & what)
|
|
||||||
{
|
|
||||||
stream << "IColumn(" << what.dumpStructure() << ")";
|
|
||||||
stream << "{";
|
|
||||||
for (size_t i = 0; i < what.size(); ++i)
|
|
||||||
{
|
|
||||||
if (i)
|
|
||||||
stream << ", ";
|
|
||||||
stream << applyVisitor(FieldVisitorDump(), what[i]);
|
|
||||||
}
|
|
||||||
stream << "}";
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Packet & what)
|
|
||||||
{
|
|
||||||
stream << "Packet("
|
|
||||||
<< "type = " << what.type;
|
|
||||||
// types description: Core/Protocol.h
|
|
||||||
if (what.exception)
|
|
||||||
stream << "exception = " << what.exception.get();
|
|
||||||
// TODO: profile_info
|
|
||||||
stream << ") {" << what.block << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const ExpressionActions & what)
|
|
||||||
{
|
|
||||||
stream << "ExpressionActions(" << what.dumpActions() << ")";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const TreeRewriterResult & what)
|
|
||||||
{
|
|
||||||
stream << "SyntaxAnalyzerResult{";
|
|
||||||
stream << "storage=" << what.storage << "; ";
|
|
||||||
if (!what.source_columns.empty())
|
|
||||||
{
|
|
||||||
stream << "source_columns=";
|
|
||||||
dumpValue(stream, what.source_columns);
|
|
||||||
stream << "; ";
|
|
||||||
}
|
|
||||||
if (!what.aliases.empty())
|
|
||||||
{
|
|
||||||
stream << "aliases=";
|
|
||||||
dumpValue(stream, what.aliases);
|
|
||||||
stream << "; ";
|
|
||||||
}
|
|
||||||
if (!what.array_join_result_to_source.empty())
|
|
||||||
{
|
|
||||||
stream << "array_join_result_to_source=";
|
|
||||||
dumpValue(stream, what.array_join_result_to_source);
|
|
||||||
stream << "; ";
|
|
||||||
}
|
|
||||||
if (!what.array_join_alias_to_name.empty())
|
|
||||||
{
|
|
||||||
stream << "array_join_alias_to_name=";
|
|
||||||
dumpValue(stream, what.array_join_alias_to_name);
|
|
||||||
stream << "; ";
|
|
||||||
}
|
|
||||||
if (!what.array_join_name_to_alias.empty())
|
|
||||||
{
|
|
||||||
stream << "array_join_name_to_alias=";
|
|
||||||
dumpValue(stream, what.array_join_name_to_alias);
|
|
||||||
stream << "; ";
|
|
||||||
}
|
|
||||||
stream << "rewrite_subqueries=" << what.rewrite_subqueries << "; ";
|
|
||||||
stream << "}";
|
|
||||||
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
|
|
||||||
// Use template to disable implicit casting for certain overloaded types such as Field, which leads
|
|
||||||
// to overload resolution ambiguity.
|
|
||||||
class Field;
|
|
||||||
template <typename T>
|
|
||||||
requires std::is_same_v<T, Field>
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const T & what);
|
|
||||||
|
|
||||||
struct NameAndTypePair;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const NameAndTypePair & what);
|
|
||||||
|
|
||||||
class IDataType;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IDataType & what);
|
|
||||||
|
|
||||||
class IStorage;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IStorage & what);
|
|
||||||
|
|
||||||
class IFunctionOverloadResolver;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IFunctionOverloadResolver & what);
|
|
||||||
|
|
||||||
class IFunctionBase;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IFunctionBase & what);
|
|
||||||
|
|
||||||
class Block;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Block & what);
|
|
||||||
|
|
||||||
struct ColumnWithTypeAndName;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const ColumnWithTypeAndName & what);
|
|
||||||
|
|
||||||
class IColumn;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IColumn & what);
|
|
||||||
|
|
||||||
struct Packet;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Packet & what);
|
|
||||||
|
|
||||||
class ExpressionActions;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const ExpressionActions & what);
|
|
||||||
|
|
||||||
struct TreeRewriterResult;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const TreeRewriterResult & what);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// some operator<< should be declared before operator<<(... std::shared_ptr<>)
|
|
||||||
#include <base/iostream_debug_helpers.h>
|
|
@ -1,4 +1,3 @@
|
|||||||
#include <Columns/IColumn.h>
|
|
||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <DataTypes/DataTypeFactory.h>
|
#include <DataTypes/DataTypeFactory.h>
|
||||||
#include <DataTypes/IDataType.h>
|
#include <DataTypes/IDataType.h>
|
||||||
@ -10,8 +9,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <Core/iostream_debug_helpers.h>
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline std::ostream& operator<<(std::ostream & ostr, const std::vector<T> & v)
|
inline std::ostream& operator<<(std::ostream & ostr, const std::vector<T> & v)
|
||||||
@ -63,7 +60,7 @@ TEST_P(ParseDataTypeTest, parseStringValue)
|
|||||||
data_type->getDefaultSerialization()->deserializeWholeText(*col, buffer, FormatSettings{});
|
data_type->getDefaultSerialization()->deserializeWholeText(*col, buffer, FormatSettings{});
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_EQ(p.expected_values.size(), col->size()) << "Actual items: " << *col;
|
ASSERT_EQ(p.expected_values.size(), col->size());
|
||||||
for (size_t i = 0; i < col->size(); ++i)
|
for (size_t i = 0; i < col->size(); ++i)
|
||||||
{
|
{
|
||||||
ASSERT_EQ(p.expected_values[i], (*col)[i]);
|
ASSERT_EQ(p.expected_values[i], (*col)[i]);
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <Core/iostream_debug_helpers.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -41,23 +40,6 @@ std::string PrintMap(const auto & keys, const auto & values)
|
|||||||
return std::move(buff.str());
|
return std::move(buff.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct Dump
|
|
||||||
{
|
|
||||||
const T & value;
|
|
||||||
|
|
||||||
friend std::ostream & operator<<(std::ostream & ostr, const Dump & d)
|
|
||||||
{
|
|
||||||
return dumpValue(ostr, d.value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
auto print_with_dump(const T & value)
|
|
||||||
{
|
|
||||||
return Dump<T>{value};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct KeyValuePairExtractorTestParam
|
struct KeyValuePairExtractorTestParam
|
||||||
@ -82,9 +64,7 @@ TEST_P(extractKVPairKeyValuePairExtractorTest, Match)
|
|||||||
auto values = ColumnString::create();
|
auto values = ColumnString::create();
|
||||||
|
|
||||||
auto pairs_found = kv_parser->extract(input, keys, values);
|
auto pairs_found = kv_parser->extract(input, keys, values);
|
||||||
ASSERT_EQ(expected.size(), pairs_found)
|
ASSERT_EQ(expected.size(), pairs_found);
|
||||||
<< "\texpected: " << print_with_dump(expected) << "\n"
|
|
||||||
<< "\tactual : " << print_with_dump(*ToColumnMap(keys, values));
|
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto & expected_kv : expected)
|
for (const auto & expected_kv : expected)
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <Core/iostream_debug_helpers.h>
|
|
||||||
#include <Interpreters/convertFieldToType.h>
|
#include <Interpreters/convertFieldToType.h>
|
||||||
#include <DataTypes/DataTypeFactory.h>
|
#include <DataTypes/DataTypeFactory.h>
|
||||||
|
|
||||||
@ -24,9 +23,7 @@ std::ostream & operator << (std::ostream & ostr, const ConvertFieldToTypeTestPar
|
|||||||
{
|
{
|
||||||
return ostr << "{"
|
return ostr << "{"
|
||||||
<< "\n\tfrom_type : " << params.from_type
|
<< "\n\tfrom_type : " << params.from_type
|
||||||
<< "\n\tfrom_value : " << params.from_value
|
|
||||||
<< "\n\tto_type : " << params.to_type
|
<< "\n\tto_type : " << params.to_type
|
||||||
<< "\n\texpected : " << (params.expected_value ? *params.expected_value : Field())
|
|
||||||
<< "\n}";
|
<< "\n}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,14 +12,6 @@ if (TARGET ch_rust::prql)
|
|||||||
target_link_libraries(clickhouse_parsers PRIVATE ch_rust::prql)
|
target_link_libraries(clickhouse_parsers PRIVATE ch_rust::prql)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (USE_DEBUG_HELPERS)
|
|
||||||
# CMake generator expression will do insane quoting when it encounters special character like quotes, spaces, etc.
|
|
||||||
# Prefixing "SHELL:" will force it to use the original text.
|
|
||||||
set (INCLUDE_DEBUG_HELPERS "SHELL:-I\"${ClickHouse_SOURCE_DIR}/base\" -include \"${ClickHouse_SOURCE_DIR}/src/Parsers/iostream_debug_helpers.h\"")
|
|
||||||
# Use generator expression as we don't want to pollute CMAKE_CXX_FLAGS, which will interfere with CMake check system.
|
|
||||||
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${INCLUDE_DEBUG_HELPERS}>)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if(ENABLE_EXAMPLES)
|
if(ENABLE_EXAMPLES)
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
endif()
|
endif()
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
#include "iostream_debug_helpers.h"
|
|
||||||
#include <Parsers/IAST.h>
|
|
||||||
#include <Parsers/IParser.h>
|
|
||||||
#include <Parsers/Lexer.h>
|
|
||||||
#include <Parsers/TokenIterator.h>
|
|
||||||
#include <IO/WriteBufferFromOStream.h>
|
|
||||||
#include <IO/Operators.h>
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Token & what)
|
|
||||||
{
|
|
||||||
stream << "Token (type="<< static_cast<int>(what.type) <<"){"<< std::string{what.begin, what.end} << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Expected & what)
|
|
||||||
{
|
|
||||||
stream << "Expected {variants=";
|
|
||||||
dumpValue(stream, what.variants)
|
|
||||||
<< "; max_parsed_pos=" << what.max_parsed_pos << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IAST & what)
|
|
||||||
{
|
|
||||||
WriteBufferFromOStream buf(stream, 4096);
|
|
||||||
buf << "IAST{";
|
|
||||||
what.dumpTree(buf);
|
|
||||||
buf << "}";
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
struct Token;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Token & what);
|
|
||||||
|
|
||||||
struct Expected;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const Expected & what);
|
|
||||||
|
|
||||||
class IAST;
|
|
||||||
std::ostream & operator<<(std::ostream & stream, const IAST & what);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <Core/iostream_debug_helpers.h>
|
|
@ -290,8 +290,6 @@ std_cerr_cout_excludes=(
|
|||||||
/examples/
|
/examples/
|
||||||
/tests/
|
/tests/
|
||||||
_fuzzer
|
_fuzzer
|
||||||
# DUMP()
|
|
||||||
base/base/iostream_debug_helpers.h
|
|
||||||
# OK
|
# OK
|
||||||
src/Common/ProgressIndication.cpp
|
src/Common/ProgressIndication.cpp
|
||||||
# only under #ifdef DBMS_HASH_MAP_DEBUG_RESIZES, that is used only in tests
|
# only under #ifdef DBMS_HASH_MAP_DEBUG_RESIZES, that is used only in tests
|
||||||
|
Loading…
Reference in New Issue
Block a user