提交 ca1d3891 编写于 作者: A Alexey Milovidov

Don't log to stderr within RE2 library [#CLICKHOUSE-2]

上级 cee0d48c
...@@ -401,6 +401,7 @@ namespace ErrorCodes ...@@ -401,6 +401,7 @@ namespace ErrorCodes
extern const int CANNOT_LINK = 424; extern const int CANNOT_LINK = 424;
extern const int SYSTEM_ERROR = 425; extern const int SYSTEM_ERROR = 425;
extern const int NULL_POINTER_DEREFERENCE = 426; extern const int NULL_POINTER_DEREFERENCE = 426;
extern const int CANNOT_COMPILE_REGEXP = 427;
extern const int KEEPER_EXCEPTION = 999; extern const int KEEPER_EXCEPTION = 999;
extern const int POCO_EXCEPTION = 1000; extern const int POCO_EXCEPTION = 1000;
......
#include <iostream> #include <Common/Exception.h>
#include <Poco/Exception.h>
#include <Common/OptimizedRegularExpression.h> #include <Common/OptimizedRegularExpression.h>
...@@ -9,6 +6,15 @@ ...@@ -9,6 +6,15 @@
#define MAX_SUBPATTERNS 5 #define MAX_SUBPATTERNS 5
namespace DB
{
namespace ErrorCodes
{
extern const int CANNOT_COMPILE_REGEXP;
}
}
template <bool thread_safe> template <bool thread_safe>
void OptimizedRegularExpressionImpl<thread_safe>::analyze( void OptimizedRegularExpressionImpl<thread_safe>::analyze(
const std::string & regexp, const std::string & regexp,
...@@ -254,11 +260,11 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons ...@@ -254,11 +260,11 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons
/// Just three following options are supported /// Just three following options are supported
if (options & (~(RE_CASELESS | RE_NO_CAPTURE | RE_DOT_NL))) if (options & (~(RE_CASELESS | RE_NO_CAPTURE | RE_DOT_NL)))
throw Poco::Exception("OptimizedRegularExpression: Unsupported option."); throw DB::Exception("OptimizedRegularExpression: Unsupported option.", DB::ErrorCodes::CANNOT_COMPILE_REGEXP);
is_case_insensitive = options & RE_CASELESS; is_case_insensitive = options & RE_CASELESS;
bool is_no_capture = options & RE_NO_CAPTURE; bool is_no_capture = options & RE_NO_CAPTURE;
bool is_dot_nl = options & RE_DOT_NL; bool is_dot_nl = options & RE_DOT_NL;
number_of_subpatterns = 0; number_of_subpatterns = 0;
if (!is_trivial) if (!is_trivial)
...@@ -266,6 +272,9 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons ...@@ -266,6 +272,9 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons
/// Compile the re2 regular expression. /// Compile the re2 regular expression.
typename RegexType::Options regexp_options; typename RegexType::Options regexp_options;
/// Never write error messages to stderr. It's ignorant to do it from library code.
regexp_options.set_log_errors(false);
if (is_case_insensitive) if (is_case_insensitive)
regexp_options.set_case_sensitive(false); regexp_options.set_case_sensitive(false);
...@@ -274,13 +283,13 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons ...@@ -274,13 +283,13 @@ OptimizedRegularExpressionImpl<thread_safe>::OptimizedRegularExpressionImpl(cons
re2 = std::make_unique<RegexType>(regexp_, regexp_options); re2 = std::make_unique<RegexType>(regexp_, regexp_options);
if (!re2->ok()) if (!re2->ok())
throw Poco::Exception("OptimizedRegularExpression: cannot compile re2: " + regexp_ + ", error: " + re2->error()); throw DB::Exception("OptimizedRegularExpression: cannot compile re2: " + regexp_ + ", error: " + re2->error() + ". Look at https://github.com/google/re2/wiki/Syntax for reference.", DB::ErrorCodes::CANNOT_COMPILE_REGEXP);
if (!is_no_capture) if (!is_no_capture)
{ {
number_of_subpatterns = re2->NumberOfCapturingGroups(); number_of_subpatterns = re2->NumberOfCapturingGroups();
if (number_of_subpatterns > MAX_SUBPATTERNS) if (number_of_subpatterns > MAX_SUBPATTERNS)
throw Poco::Exception("OptimizedRegularExpression: too many subpatterns in regexp: " + regexp_); throw DB::Exception("OptimizedRegularExpression: too many subpatterns in regexp: " + regexp_, DB::ErrorCodes::CANNOT_COMPILE_REGEXP);
} }
} }
} }
...@@ -432,6 +441,5 @@ unsigned OptimizedRegularExpressionImpl<thread_safe>::match(const char * subject ...@@ -432,6 +441,5 @@ unsigned OptimizedRegularExpressionImpl<thread_safe>::match(const char * subject
} }
} }
#undef MIN_LENGTH_FOR_STRSTR template class OptimizedRegularExpressionImpl<true>;
#undef MAX_SUBPATTERNS template class OptimizedRegularExpressionImpl<false>;
...@@ -45,9 +45,9 @@ class OptimizedRegularExpressionImpl ...@@ -45,9 +45,9 @@ class OptimizedRegularExpressionImpl
public: public:
enum Options enum Options
{ {
RE_CASELESS = 0x00000001, RE_CASELESS = 0x00000001,
RE_NO_CAPTURE = 0x00000010, RE_NO_CAPTURE = 0x00000010,
RE_DOT_NL = 0x00000100 RE_DOT_NL = 0x00000100
}; };
using Match = OptimizedRegularExpressionDetails::Match; using Match = OptimizedRegularExpressionDetails::Match;
...@@ -106,5 +106,3 @@ private: ...@@ -106,5 +106,3 @@ private:
}; };
using OptimizedRegularExpression = OptimizedRegularExpressionImpl<true>; using OptimizedRegularExpression = OptimizedRegularExpressionImpl<true>;
#include "OptimizedRegularExpression.inl.h"
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册