mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Incorporate review feedback
This commit is contained in:
parent
a813431fcb
commit
2cc2a9089c
@ -1386,7 +1386,7 @@ Result:
|
|||||||
## punycodeEncode
|
## punycodeEncode
|
||||||
|
|
||||||
Returns the [Punycode](https://en.wikipedia.org/wiki/Punycode) representation of a string.
|
Returns the [Punycode](https://en.wikipedia.org/wiki/Punycode) representation of a string.
|
||||||
The string must be UTF8-encoded, otherwise an exception is thrown.
|
The string must be UTF8-encoded, otherwise the behavior is undefined.
|
||||||
|
|
||||||
**Syntax**
|
**Syntax**
|
||||||
|
|
||||||
@ -1416,10 +1416,6 @@ Result:
|
|||||||
└───────────────────────────┘
|
└───────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
## punycodeEncodeOrNull
|
|
||||||
|
|
||||||
Like `punycodeEncode` but returns `NULL` in case of an error instead of throwing an exception.
|
|
||||||
|
|
||||||
## punycodeDecode
|
## punycodeDecode
|
||||||
|
|
||||||
Returns the UTF8-encoded plaintext of a [Punycode](https://en.wikipedia.org/wiki/Punycode)-encoded string.
|
Returns the UTF8-encoded plaintext of a [Punycode](https://en.wikipedia.org/wiki/Punycode)-encoded string.
|
||||||
@ -1448,19 +1444,19 @@ select punycodeDecode('Mnchen-3ya');
|
|||||||
Result:
|
Result:
|
||||||
|
|
||||||
```result
|
```result
|
||||||
┌─punycodeEncode('Mnchen-3ya')─┐
|
┌─punycodeDecode('Mnchen-3ya')─┐
|
||||||
│ München │
|
│ München │
|
||||||
└──────────────────────────────┘
|
└──────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
## punycodeDecodeOrNull
|
## tryPunycodeDecode
|
||||||
|
|
||||||
Like `punycodeDecode` but returns `NULL` in case of an error instead of throwing an exception.
|
Like `punycodeDecode` but returns an empty string if no valid Punycode-encoded string is given.
|
||||||
|
|
||||||
## idnaEncode
|
## idnaEncode
|
||||||
|
|
||||||
Returns the the ASCII representation (ToASCII algorithm) of a domain name according to the [Internationalized Domain Names in Applications](https://en.wikipedia.org/wiki/Internationalized_domain_name#Internationalizing_Domain_Names_in_Applications) (IDNA) mechanism.
|
Returns the the ASCII representation (ToASCII algorithm) of a domain name according to the [Internationalized Domain Names in Applications](https://en.wikipedia.org/wiki/Internationalized_domain_name#Internationalizing_Domain_Names_in_Applications) (IDNA) mechanism.
|
||||||
The string must be UTF-encoded and translatable to an ASCII string, otherwise an exception is thrown.
|
The input string must be UTF-encoded and translatable to an ASCII string, otherwise an exception is thrown.
|
||||||
Note: No percent decoding or trimming of tabs, spaces or control characters is performed.
|
Note: No percent decoding or trimming of tabs, spaces or control characters is performed.
|
||||||
|
|
||||||
**Syntax**
|
**Syntax**
|
||||||
@ -1491,9 +1487,9 @@ Result:
|
|||||||
└─────────────────────────────────────┘
|
└─────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
## idnaEncodeOrNull
|
## tryIdnaEncode
|
||||||
|
|
||||||
Like `idnaEncode` but returns `NULL` in case of an error instead of throwing an exception.
|
Like `idnaEncode` but returns an empty string in case of an error instead of throwing an exception.
|
||||||
|
|
||||||
## idnaDecode
|
## idnaDecode
|
||||||
|
|
||||||
|
202
src/Functions/idna.cpp
Normal file
202
src/Functions/idna.cpp
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#if USE_IDNA
|
||||||
|
|
||||||
|
#include <Columns/ColumnString.h>
|
||||||
|
#include <Functions/FunctionFactory.h>
|
||||||
|
#include <Functions/FunctionStringToString.h>
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
# pragma clang diagnostic push
|
||||||
|
# pragma clang diagnostic ignored "-Wnewline-eof"
|
||||||
|
#endif
|
||||||
|
# include <ada/idna/to_ascii.h>
|
||||||
|
# include <ada/idna/to_unicode.h>
|
||||||
|
# include <ada/idna/unicode_transcoding.h>
|
||||||
|
#ifdef __clang__
|
||||||
|
# pragma clang diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace ErrorCodes
|
||||||
|
{
|
||||||
|
extern const int BAD_ARGUMENTS;
|
||||||
|
extern const int NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Implementation of
|
||||||
|
/// - idnaEncode(), tryIdnaEncode() and idnaDecode(), see https://en.wikipedia.org/wiki/Internationalized_domain_name#ToASCII_and_ToUnicode
|
||||||
|
/// and [3] https://www.unicode.org/reports/tr46/#ToUnicode
|
||||||
|
|
||||||
|
|
||||||
|
enum class ErrorHandling
|
||||||
|
{
|
||||||
|
Throw, /// Throw exception
|
||||||
|
Empty /// Return empty string
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/// Translates a UTF-8 string (typically an Internationalized Domain Name for Applications, IDNA) to an ASCII-encoded equivalent. The
|
||||||
|
/// encoding is performed per domain component and based on Punycode with ASCII Compatible Encoding (ACE) prefix "xn--".
|
||||||
|
/// Example: "straße.münchen.de" --> "xn--strae-oqa.xn--mnchen-3ya.de"
|
||||||
|
/// Note: doesn't do percent decoding. Doesn't trim tabs, spaces or control characters. Expects non-empty inputs.
|
||||||
|
template <ErrorHandling error_handling>
|
||||||
|
struct IdnaEncode
|
||||||
|
{
|
||||||
|
static void vector(
|
||||||
|
const ColumnString::Chars & data,
|
||||||
|
const ColumnString::Offsets & offsets,
|
||||||
|
ColumnString::Chars & res_data,
|
||||||
|
ColumnString::Offsets & res_offsets)
|
||||||
|
{
|
||||||
|
const size_t rows = offsets.size();
|
||||||
|
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
||||||
|
res_offsets.reserve(rows);
|
||||||
|
|
||||||
|
size_t prev_offset = 0;
|
||||||
|
std::string ascii;
|
||||||
|
for (size_t row = 0; row < rows; ++row)
|
||||||
|
{
|
||||||
|
const char * value = reinterpret_cast<const char *>(&data[prev_offset]);
|
||||||
|
const size_t value_length = offsets[row] - prev_offset - 1;
|
||||||
|
|
||||||
|
std::string_view value_view(value, value_length);
|
||||||
|
if (!value_view.empty()) /// to_ascii() expects non-empty input
|
||||||
|
{
|
||||||
|
ascii = ada::idna::to_ascii(value_view);
|
||||||
|
const bool ok = !ascii.empty();
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
if constexpr (error_handling == ErrorHandling::Throw)
|
||||||
|
{
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS, "'{}' cannot be converted to Punycode", std::string_view(value, value_length));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
static_assert(error_handling == ErrorHandling::Empty);
|
||||||
|
ascii.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res_data.insert(ascii.c_str(), ascii.c_str() + ascii.size() + 1);
|
||||||
|
res_offsets.push_back(res_data.size());
|
||||||
|
|
||||||
|
prev_offset = offsets[row];
|
||||||
|
|
||||||
|
ascii.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
|
{
|
||||||
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Arguments of type FixedString are not allowed");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct IdnaDecode
|
||||||
|
{
|
||||||
|
/// As per the specification, invalid inputs are returned as is, i.e. there is no special error handling.
|
||||||
|
static void vector(
|
||||||
|
const ColumnString::Chars & data,
|
||||||
|
const ColumnString::Offsets & offsets,
|
||||||
|
ColumnString::Chars & res_data,
|
||||||
|
ColumnString::Offsets & res_offsets)
|
||||||
|
{
|
||||||
|
const size_t rows = offsets.size();
|
||||||
|
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
||||||
|
res_offsets.reserve(rows);
|
||||||
|
|
||||||
|
size_t prev_offset = 0;
|
||||||
|
std::string unicode;
|
||||||
|
for (size_t row = 0; row < rows; ++row)
|
||||||
|
{
|
||||||
|
const char * value = reinterpret_cast<const char *>(&data[prev_offset]);
|
||||||
|
const size_t value_length = offsets[row] - prev_offset - 1;
|
||||||
|
std::string_view value_view(value, value_length);
|
||||||
|
|
||||||
|
unicode = ada::idna::to_unicode(value_view);
|
||||||
|
|
||||||
|
res_data.insert(unicode.c_str(), unicode.c_str() + unicode.size() + 1);
|
||||||
|
res_offsets.push_back(res_data.size());
|
||||||
|
|
||||||
|
prev_offset = offsets[row];
|
||||||
|
|
||||||
|
unicode.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
|
{
|
||||||
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Arguments of type FixedString are not allowed");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct NameIdnaEncode { static constexpr auto name = "idnaEncode"; };
|
||||||
|
struct NameTryIdnaEncode { static constexpr auto name = "tryIdnaEncode"; };
|
||||||
|
struct NameIdnaDecode { static constexpr auto name = "idnaDecode"; };
|
||||||
|
|
||||||
|
using FunctionIdnaEncode = FunctionStringToString<IdnaEncode<ErrorHandling::Throw>, NameIdnaEncode>;
|
||||||
|
using FunctionTryIdnaEncode = FunctionStringToString<IdnaEncode<ErrorHandling::Empty>, NameTryIdnaEncode>;
|
||||||
|
using FunctionIdnaDecode = FunctionStringToString<IdnaDecode, NameIdnaDecode>;
|
||||||
|
|
||||||
|
REGISTER_FUNCTION(Idna)
|
||||||
|
{
|
||||||
|
factory.registerFunction<FunctionIdnaEncode>(FunctionDocumentation{
|
||||||
|
.description=R"(
|
||||||
|
Computes an ASCII representation of an Internationalized Domain Name. Throws an exception in case of error.)",
|
||||||
|
.syntax="idnaEncode(str)",
|
||||||
|
.arguments={{"str", "Input string"}},
|
||||||
|
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
|
.examples={
|
||||||
|
{"simple",
|
||||||
|
"SELECT idnaEncode('straße.münchen.de') AS ascii;",
|
||||||
|
R"(
|
||||||
|
┌─ascii───────────────────────────┐
|
||||||
|
│ xn--strae-oqa.xn--mnchen-3ya.de │
|
||||||
|
└─────────────────────────────────┘
|
||||||
|
)"
|
||||||
|
}}
|
||||||
|
});
|
||||||
|
|
||||||
|
factory.registerFunction<FunctionTryIdnaEncode>(FunctionDocumentation{
|
||||||
|
.description=R"(
|
||||||
|
Computes a ASCII representation of an Internationalized Domain Name. Returns an empty string in case of error)",
|
||||||
|
.syntax="punycodeEncode(str)",
|
||||||
|
.arguments={{"str", "Input string"}},
|
||||||
|
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
|
.examples={
|
||||||
|
{"simple",
|
||||||
|
"SELECT idnaEncodeOrNull('München') AS ascii;",
|
||||||
|
R"(
|
||||||
|
┌─ascii───────────────────────────┐
|
||||||
|
│ xn--strae-oqa.xn--mnchen-3ya.de │
|
||||||
|
└─────────────────────────────────┘
|
||||||
|
)"
|
||||||
|
}}
|
||||||
|
});
|
||||||
|
|
||||||
|
factory.registerFunction<FunctionIdnaDecode>(FunctionDocumentation{
|
||||||
|
.description=R"(
|
||||||
|
Computes a Unicode representation of an Internationalized Domain Name.)",
|
||||||
|
.syntax="idnaDecode(str)",
|
||||||
|
.arguments={{"str", "Input string"}},
|
||||||
|
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
|
.examples={
|
||||||
|
{"simple",
|
||||||
|
"SELECT idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de') AS unicode;",
|
||||||
|
R"(
|
||||||
|
┌─unicode───────────┐
|
||||||
|
│ straße.münchen.de │
|
||||||
|
└───────────────────┘
|
||||||
|
)"
|
||||||
|
}}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -2,21 +2,15 @@
|
|||||||
|
|
||||||
#if USE_IDNA
|
#if USE_IDNA
|
||||||
|
|
||||||
#include <Columns/ColumnNullable.h>
|
|
||||||
#include <Columns/ColumnString.h>
|
#include <Columns/ColumnString.h>
|
||||||
#include <DataTypes/DataTypeNullable.h>
|
|
||||||
#include <DataTypes/DataTypeString.h>
|
|
||||||
#include <Functions/FunctionFactory.h>
|
#include <Functions/FunctionFactory.h>
|
||||||
#include <Functions/FunctionHelpers.h>
|
#include <Functions/FunctionStringToString.h>
|
||||||
#include <Functions/IFunction.h>
|
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
# pragma clang diagnostic push
|
# pragma clang diagnostic push
|
||||||
# pragma clang diagnostic ignored "-Wnewline-eof"
|
# pragma clang diagnostic ignored "-Wnewline-eof"
|
||||||
#endif
|
#endif
|
||||||
# include <ada/idna/punycode.h>
|
# include <ada/idna/punycode.h>
|
||||||
# include <ada/idna/to_ascii.h>
|
|
||||||
# include <ada/idna/to_unicode.h>
|
|
||||||
# include <ada/idna/unicode_transcoding.h>
|
# include <ada/idna/unicode_transcoding.h>
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
# pragma clang diagnostic pop
|
# pragma clang diagnostic pop
|
||||||
@ -28,93 +22,31 @@ namespace DB
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int BAD_ARGUMENTS;
|
extern const int BAD_ARGUMENTS;
|
||||||
extern const int ILLEGAL_COLUMN;
|
extern const int NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
/// Implementation of
|
||||||
{
|
/// - punycodeEncode(), punycodeDecode() and tryPunycodeDecode(), see https://en.wikipedia.org/wiki/Punycode
|
||||||
|
|
||||||
enum class ErrorHandling
|
enum class ErrorHandling
|
||||||
{
|
{
|
||||||
Throw,
|
Throw, /// Throw exception
|
||||||
Null
|
Empty /// Return empty string
|
||||||
};
|
|
||||||
|
|
||||||
/// Implementation of
|
|
||||||
/// - punycode(En|De)code[OrNull](), see [1]
|
|
||||||
/// - idna(En|De)code[OrNull](), see [2, 3]
|
|
||||||
///
|
|
||||||
/// [1] https://en.wikipedia.org/wiki/Punycode
|
|
||||||
/// [2] https://en.wikipedia.org/wiki/Internationalized_domain_name#ToASCII_and_ToUnicode
|
|
||||||
/// [3] https://www.unicode.org/reports/tr46/#ToUnicode
|
|
||||||
|
|
||||||
|
|
||||||
/// Kind of similar to FunctionStringToString but accepts String arguments only, and supports `OrNull` overloads
|
|
||||||
template <typename Impl>
|
|
||||||
class FunctionIdnaPunycodeBase : public IFunction
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static constexpr auto name = Impl::name;
|
|
||||||
|
|
||||||
static FunctionPtr create(ContextPtr /*context*/) { return std::make_shared<FunctionIdnaPunycodeBase<Impl>>(); }
|
|
||||||
String getName() const override { return name; }
|
|
||||||
size_t getNumberOfArguments() const override { return 1; }
|
|
||||||
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
|
|
||||||
bool useDefaultImplementationForConstants() const override { return true; }
|
|
||||||
|
|
||||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
|
||||||
{
|
|
||||||
FunctionArgumentDescriptors args{
|
|
||||||
{"str", &isString<IDataType>, nullptr, "String"},
|
|
||||||
};
|
|
||||||
validateFunctionArgumentTypes(*this, arguments, args);
|
|
||||||
|
|
||||||
auto return_type = std::make_shared<DataTypeString>();
|
|
||||||
|
|
||||||
if constexpr (Impl::error_handling == ErrorHandling::Null)
|
|
||||||
return makeNullable(return_type);
|
|
||||||
else
|
|
||||||
return return_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t /*input_rows_count*/) const override
|
|
||||||
{
|
|
||||||
auto col_res = ColumnString::create();
|
|
||||||
ColumnUInt8::MutablePtr col_res_null;
|
|
||||||
if (const ColumnString * col = checkAndGetColumn<ColumnString>(arguments[0].column.get()))
|
|
||||||
Impl::vector(col->getChars(), col->getOffsets(), col_res->getChars(), col_res->getOffsets(), col_res_null);
|
|
||||||
else
|
|
||||||
throw Exception(
|
|
||||||
ErrorCodes::ILLEGAL_COLUMN,
|
|
||||||
"Illegal column {} of argument of function {}",
|
|
||||||
arguments[0].column->getName(), getName());
|
|
||||||
|
|
||||||
if constexpr (Impl::error_handling == ErrorHandling::Null)
|
|
||||||
return ColumnNullable::create(std::move(col_res), std::move(col_res_null));
|
|
||||||
else
|
|
||||||
return col_res;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <ErrorHandling error_handling_>
|
struct PunycodeEncode
|
||||||
struct PunycodeEncodeImpl
|
|
||||||
{
|
{
|
||||||
static constexpr auto error_handling = error_handling_;
|
/// Encoding-as-punycode can only fail if the input isn't valid UTF8. In that case, returnn undefined output, i.e. garbage-in, garbage-out.
|
||||||
static constexpr auto name = (error_handling == ErrorHandling::Null) ? "punycodeEncodeOrNull" : "punycodeEncode";
|
|
||||||
|
|
||||||
static void vector(
|
static void vector(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
const ColumnString::Offsets & offsets,
|
const ColumnString::Offsets & offsets,
|
||||||
ColumnString::Chars & res_data,
|
ColumnString::Chars & res_data,
|
||||||
ColumnString::Offsets & res_offsets,
|
ColumnString::Offsets & res_offsets)
|
||||||
ColumnUInt8::MutablePtr & col_res_null)
|
|
||||||
{
|
{
|
||||||
const size_t rows = offsets.size();
|
const size_t rows = offsets.size();
|
||||||
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
||||||
res_offsets.reserve(rows);
|
res_offsets.reserve(rows);
|
||||||
if constexpr (error_handling == ErrorHandling::Null)
|
|
||||||
col_res_null = ColumnUInt8::create(rows, 0);
|
|
||||||
|
|
||||||
size_t prev_offset = 0;
|
size_t prev_offset = 0;
|
||||||
std::u32string value_utf32;
|
std::u32string value_utf32;
|
||||||
@ -126,21 +58,13 @@ struct PunycodeEncodeImpl
|
|||||||
|
|
||||||
const size_t value_utf32_length = ada::idna::utf32_length_from_utf8(value, value_length);
|
const size_t value_utf32_length = ada::idna::utf32_length_from_utf8(value, value_length);
|
||||||
value_utf32.resize(value_utf32_length);
|
value_utf32.resize(value_utf32_length);
|
||||||
ada::idna::utf8_to_utf32(value, value_length, value_utf32.data());
|
const size_t codepoints = ada::idna::utf8_to_utf32(value, value_length, value_utf32.data());
|
||||||
|
if (codepoints == 0)
|
||||||
|
value_utf32.clear(); /// input was empty or it is not valid UTF-8
|
||||||
|
|
||||||
const bool ok = ada::idna::utf32_to_punycode(value_utf32, value_puny);
|
const bool ok = ada::idna::utf32_to_punycode(value_utf32, value_puny);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
{
|
value_puny.clear();
|
||||||
if constexpr (error_handling == ErrorHandling::Throw)
|
|
||||||
{
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "'{}' cannot be converted to Punycode", std::string_view(value, value_length));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
value_puny.clear();
|
|
||||||
col_res_null->getData()[row] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res_data.insert(value_puny.c_str(), value_puny.c_str() + value_puny.size() + 1);
|
res_data.insert(value_puny.c_str(), value_puny.c_str() + value_puny.size() + 1);
|
||||||
res_offsets.push_back(res_data.size());
|
res_offsets.push_back(res_data.size());
|
||||||
@ -151,27 +75,26 @@ struct PunycodeEncodeImpl
|
|||||||
value_puny.clear(); /// utf32_to_punycode() appends to its output string
|
value_puny.clear(); /// utf32_to_punycode() appends to its output string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
|
{
|
||||||
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Arguments of type FixedString are not allowed");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <ErrorHandling error_handling_>
|
template <ErrorHandling error_handling>
|
||||||
struct PunycodeDecodeImpl
|
struct PunycodeDecode
|
||||||
{
|
{
|
||||||
static constexpr auto error_handling = error_handling_;
|
|
||||||
static constexpr auto name = (error_handling == ErrorHandling::Null) ? "punycodeDecodeOrNull" : "punycodeDecode";
|
|
||||||
|
|
||||||
static void vector(
|
static void vector(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
const ColumnString::Offsets & offsets,
|
const ColumnString::Offsets & offsets,
|
||||||
ColumnString::Chars & res_data,
|
ColumnString::Chars & res_data,
|
||||||
ColumnString::Offsets & res_offsets,
|
ColumnString::Offsets & res_offsets)
|
||||||
ColumnUInt8::MutablePtr & col_res_null)
|
|
||||||
{
|
{
|
||||||
const size_t rows = offsets.size();
|
const size_t rows = offsets.size();
|
||||||
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
||||||
res_offsets.reserve(rows);
|
res_offsets.reserve(rows);
|
||||||
if constexpr (error_handling == ErrorHandling::Null)
|
|
||||||
col_res_null = ColumnUInt8::create(rows, 0);
|
|
||||||
|
|
||||||
size_t prev_offset = 0;
|
size_t prev_offset = 0;
|
||||||
std::u32string value_utf32;
|
std::u32string value_utf32;
|
||||||
@ -191,8 +114,8 @@ struct PunycodeDecodeImpl
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
static_assert(error_handling == ErrorHandling::Empty);
|
||||||
value_utf32.clear();
|
value_utf32.clear();
|
||||||
col_res_null->getData()[row] = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,115 +132,26 @@ struct PunycodeDecodeImpl
|
|||||||
value_utf8.clear();
|
value_utf8.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
/// Translates a UTF-8 string (typically an Internationalized Domain Name for Applications, IDNA) to an ASCII-encoded equivalent. The
|
|
||||||
/// encoding is performed per domain component and based on Punycode with ASCII Compatible Encoding (ACE) prefix "xn--".
|
|
||||||
/// Example: "straße.münchen.de" --> "xn--strae-oqa.xn--mnchen-3ya.de"
|
|
||||||
/// Note: doesn't do percent decoding. Doesn't trim tabs, spaces or control characters. Expects non-empty inputs.
|
|
||||||
template <ErrorHandling error_handling_>
|
|
||||||
struct IdnaEncodeImpl
|
|
||||||
{
|
|
||||||
static constexpr auto error_handling = error_handling_;
|
|
||||||
static constexpr auto name = (error_handling == ErrorHandling::Null) ? "idnaEncodeOrNull" : "idnaEncode";
|
|
||||||
|
|
||||||
static void vector(
|
|
||||||
const ColumnString::Chars & data,
|
|
||||||
const ColumnString::Offsets & offsets,
|
|
||||||
ColumnString::Chars & res_data,
|
|
||||||
ColumnString::Offsets & res_offsets,
|
|
||||||
ColumnUInt8::MutablePtr & col_res_null)
|
|
||||||
{
|
{
|
||||||
const size_t rows = offsets.size();
|
throw Exception(ErrorCodes::NOT_IMPLEMENTED, "Arguments of type FixedString are not allowed");
|
||||||
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
|
||||||
res_offsets.reserve(rows);
|
|
||||||
if constexpr (error_handling == ErrorHandling::Null)
|
|
||||||
col_res_null = ColumnUInt8::create(rows, 0);
|
|
||||||
|
|
||||||
size_t prev_offset = 0;
|
|
||||||
std::string ascii;
|
|
||||||
for (size_t row = 0; row < rows; ++row)
|
|
||||||
{
|
|
||||||
const char * value = reinterpret_cast<const char *>(&data[prev_offset]);
|
|
||||||
const size_t value_length = offsets[row] - prev_offset - 1;
|
|
||||||
std::string_view value_view(value, value_length);
|
|
||||||
|
|
||||||
if (!value_view.empty()) /// to_ascii() expects non-empty input
|
|
||||||
{
|
|
||||||
ascii = ada::idna::to_ascii(value_view);
|
|
||||||
const bool ok = !ascii.empty();
|
|
||||||
if (!ok)
|
|
||||||
{
|
|
||||||
if constexpr (error_handling == ErrorHandling::Throw)
|
|
||||||
{
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "'{}' cannot be converted to Punycode", std::string_view(value, value_length));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ascii.clear();
|
|
||||||
col_res_null->getData()[row] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res_data.insert(ascii.c_str(), ascii.c_str() + ascii.size() + 1);
|
|
||||||
res_offsets.push_back(res_data.size());
|
|
||||||
|
|
||||||
prev_offset = offsets[row];
|
|
||||||
|
|
||||||
ascii.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct NamePunycodeEncode { static constexpr auto name = "punycodeEncode"; };
|
||||||
|
struct NamePunycodeDecode { static constexpr auto name = "punycodeDecode"; };
|
||||||
|
struct NameTryPunycodeDecode { static constexpr auto name = "tryPunycodeDecode"; };
|
||||||
|
|
||||||
/// As per the specification, invalid inputs are returned as is, i.e. there is no special error handling.
|
using FunctionPunycodeEncode = FunctionStringToString<PunycodeEncode, NamePunycodeEncode>;
|
||||||
/// Therefore, this struct implements no error handling.
|
using FunctionPunycodeDecode = FunctionStringToString<PunycodeDecode<ErrorHandling::Throw>, NamePunycodeDecode>;
|
||||||
struct IdnaDecodeImpl
|
using FunctionTryPunycodeDecode = FunctionStringToString<PunycodeDecode<ErrorHandling::Empty>, NameTryPunycodeDecode>;
|
||||||
{
|
|
||||||
static constexpr auto error_handling = ErrorHandling::Throw; /// dummy
|
|
||||||
static constexpr auto name = "idnaDecode";
|
|
||||||
|
|
||||||
static void vector(
|
|
||||||
const ColumnString::Chars & data,
|
|
||||||
const ColumnString::Offsets & offsets,
|
|
||||||
ColumnString::Chars & res_data,
|
|
||||||
ColumnString::Offsets & res_offsets,
|
|
||||||
ColumnUInt8::MutablePtr & /*col_res_null*/)
|
|
||||||
{
|
|
||||||
const size_t rows = offsets.size();
|
|
||||||
res_data.reserve(data.size()); /// just a guess, assuming the input is all-ASCII
|
|
||||||
res_offsets.reserve(rows);
|
|
||||||
|
|
||||||
size_t prev_offset = 0;
|
|
||||||
std::string unicode;
|
|
||||||
for (size_t row = 0; row < rows; ++row)
|
|
||||||
{
|
|
||||||
const char * value = reinterpret_cast<const char *>(&data[prev_offset]);
|
|
||||||
const size_t value_length = offsets[row] - prev_offset - 1;
|
|
||||||
std::string_view value_view(value, value_length);
|
|
||||||
|
|
||||||
unicode = ada::idna::to_unicode(value_view);
|
|
||||||
|
|
||||||
res_data.insert(unicode.c_str(), unicode.c_str() + unicode.size() + 1);
|
|
||||||
res_offsets.push_back(res_data.size());
|
|
||||||
|
|
||||||
prev_offset = offsets[row];
|
|
||||||
|
|
||||||
unicode.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
REGISTER_FUNCTION(Punycode)
|
REGISTER_FUNCTION(Punycode)
|
||||||
{
|
{
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<PunycodeEncodeImpl<ErrorHandling::Throw>>>(FunctionDocumentation{
|
factory.registerFunction<FunctionPunycodeEncode>(FunctionDocumentation{
|
||||||
.description=R"(
|
.description=R"(
|
||||||
Computes a Punycode representation of a string. Throws an exception in case of error.)",
|
Computes a Punycode representation of a string.)",
|
||||||
.syntax="punycodeEncode(str)",
|
.syntax="punycodeEncode(str)",
|
||||||
.arguments={{"str", "Input string"}},
|
.arguments={{"str", "Input string"}},
|
||||||
.returned_value="The punycode representation [String](/docs/en/sql-reference/data-types/string.md).",
|
.returned_value="The punycode representation [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
@ -332,26 +166,9 @@ Computes a Punycode representation of a string. Throws an exception in case of e
|
|||||||
}}
|
}}
|
||||||
});
|
});
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<PunycodeEncodeImpl<ErrorHandling::Null>>>(FunctionDocumentation{
|
factory.registerFunction<FunctionPunycodeDecode>(FunctionDocumentation{
|
||||||
.description=R"(
|
.description=R"(
|
||||||
Computes a Punycode representation of a string. Returns NULL in case of error)",
|
Computes a Punycode representation of a string. Throws an exception if the input is not valid Punycode.)",
|
||||||
.syntax="punycodeEncode(str)",
|
|
||||||
.arguments={{"str", "Input string"}},
|
|
||||||
.returned_value="The punycode representation [String](/docs/en/sql-reference/data-types/string.md).",
|
|
||||||
.examples={
|
|
||||||
{"simple",
|
|
||||||
"SELECT punycodeEncodeOrNull('München') AS puny;",
|
|
||||||
R"(
|
|
||||||
┌─puny───────┐
|
|
||||||
│ Mnchen-3ya │
|
|
||||||
└────────────┘
|
|
||||||
)"
|
|
||||||
}}
|
|
||||||
});
|
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<PunycodeDecodeImpl<ErrorHandling::Throw>>>(FunctionDocumentation{
|
|
||||||
.description=R"(
|
|
||||||
Computes a Punycode representation of a string. Throws an exception in case of error.)",
|
|
||||||
.syntax="punycodeDecode(str)",
|
.syntax="punycodeDecode(str)",
|
||||||
.arguments={{"str", "A Punycode-encoded string"}},
|
.arguments={{"str", "A Punycode-encoded string"}},
|
||||||
.returned_value="The plaintext representation [String](/docs/en/sql-reference/data-types/string.md).",
|
.returned_value="The plaintext representation [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
@ -366,15 +183,15 @@ Computes a Punycode representation of a string. Throws an exception in case of e
|
|||||||
}}
|
}}
|
||||||
});
|
});
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<PunycodeDecodeImpl<ErrorHandling::Null>>>(FunctionDocumentation{
|
factory.registerFunction<FunctionTryPunycodeDecode>(FunctionDocumentation{
|
||||||
.description=R"(
|
.description=R"(
|
||||||
Computes a Punycode representation of a string. Returns NULL in case of error)",
|
Computes a Punycode representation of a string. Returns an empty string if the input is not valid Punycode.)",
|
||||||
.syntax="punycodeDecode(str)",
|
.syntax="punycodeDecode(str)",
|
||||||
.arguments={{"str", "A Punycode-encoded string"}},
|
.arguments={{"str", "A Punycode-encoded string"}},
|
||||||
.returned_value="The plaintext representation [String](/docs/en/sql-reference/data-types/string.md).",
|
.returned_value="The plaintext representation [String](/docs/en/sql-reference/data-types/string.md).",
|
||||||
.examples={
|
.examples={
|
||||||
{"simple",
|
{"simple",
|
||||||
"SELECT punycodeDecodeOrNull('Mnchen-3ya') AS plain;",
|
"SELECT tryPunycodeDecode('Mnchen-3ya') AS plain;",
|
||||||
R"(
|
R"(
|
||||||
┌─plain───┐
|
┌─plain───┐
|
||||||
│ München │
|
│ München │
|
||||||
@ -382,57 +199,6 @@ Computes a Punycode representation of a string. Returns NULL in case of error)",
|
|||||||
)"
|
)"
|
||||||
}}
|
}}
|
||||||
});
|
});
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<IdnaEncodeImpl<ErrorHandling::Throw>>>(FunctionDocumentation{
|
|
||||||
.description=R"(
|
|
||||||
Computes an ASCII representation of an Internationalized Domain Name. Throws an exception in case of error.)",
|
|
||||||
.syntax="idnaEncode(str)",
|
|
||||||
.arguments={{"str", "Input string"}},
|
|
||||||
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
|
||||||
.examples={
|
|
||||||
{"simple",
|
|
||||||
"SELECT idnaEncode('straße.münchen.de') AS ascii;",
|
|
||||||
R"(
|
|
||||||
┌─ascii───────────────────────────┐
|
|
||||||
│ xn--strae-oqa.xn--mnchen-3ya.de │
|
|
||||||
└─────────────────────────────────┘
|
|
||||||
)"
|
|
||||||
}}
|
|
||||||
});
|
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<IdnaEncodeImpl<ErrorHandling::Null>>>(FunctionDocumentation{
|
|
||||||
.description=R"(
|
|
||||||
Computes a ASCII representation of an Internationalized Domain Name. Returns NULL in case of error)",
|
|
||||||
.syntax="punycodeEncode(str)",
|
|
||||||
.arguments={{"str", "Input string"}},
|
|
||||||
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
|
||||||
.examples={
|
|
||||||
{"simple",
|
|
||||||
"SELECT idnaEncodeOrNull('München') AS ascii;",
|
|
||||||
R"(
|
|
||||||
┌─ascii───────────────────────────┐
|
|
||||||
│ xn--strae-oqa.xn--mnchen-3ya.de │
|
|
||||||
└─────────────────────────────────┘
|
|
||||||
)"
|
|
||||||
}}
|
|
||||||
});
|
|
||||||
|
|
||||||
factory.registerFunction<FunctionIdnaPunycodeBase<IdnaDecodeImpl>>(FunctionDocumentation{
|
|
||||||
.description=R"(
|
|
||||||
Computes a Unicode representation of an Internationalized Domain Name.)",
|
|
||||||
.syntax="idnaDecode(str)",
|
|
||||||
.arguments={{"str", "Input string"}},
|
|
||||||
.returned_value="An Unicode-encoded domain name [String](/docs/en/sql-reference/data-types/string.md).",
|
|
||||||
.examples={
|
|
||||||
{"simple",
|
|
||||||
"SELECT idnaDecode('xn--strae-oqa.xn--mnchen-3ya.de') AS unicode;",
|
|
||||||
R"(
|
|
||||||
┌─unicode───────────┐
|
|
||||||
│ straße.münchen.de │
|
|
||||||
└───────────────────┘
|
|
||||||
)"
|
|
||||||
}}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,24 @@
|
|||||||
-- Negative tests
|
-- Negative tests
|
||||||
-- Regular cases
|
-- Regular cases
|
||||||
straße.de xn--strae-oqa.de straße.de xn--strae-oqa.de straße.de
|
straße.de xn--strae-oqa.de xn--strae-oqa.de straße.de straße.de
|
||||||
2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888
|
2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888 2001:4860:4860::8888
|
||||||
AMAZON amazon amazon amazon amazon
|
AMAZON amazon amazon amazon amazon
|
||||||
aa-- aa-- aa-- aa-- aa--
|
aa-- aa-- aa-- aa-- aa--
|
||||||
a†-- xn--a---kp0a a†-- xn--a---kp0a a†--
|
a†-- xn--a---kp0a xn--a---kp0a a†-- a†--
|
||||||
ab--c ab--c ab--c ab--c ab--c
|
ab--c ab--c ab--c ab--c ab--c
|
||||||
-† xn----xhn -† xn----xhn -†
|
-† xn----xhn xn----xhn -† -†
|
||||||
-x.xn--zca -x.xn--zca -x.ß -x.xn--zca -x.ß
|
-x.xn--zca -x.xn--zca -x.xn--zca -x.ß -x.ß
|
||||||
x-.xn--zca x-.xn--zca x-.ß x-.xn--zca x-.ß
|
x-.xn--zca x-.xn--zca x-.xn--zca x-.ß x-.ß
|
||||||
x-.ß x-.xn--zca x-.ß x-.xn--zca x-.ß
|
x-.ß x-.xn--zca x-.xn--zca x-.ß x-.ß
|
||||||
x..ß x..xn--zca x..ß x..xn--zca x..ß
|
x..ß x..xn--zca x..xn--zca x..ß x..ß
|
||||||
128.0,0.1 128.0,0.1 128.0,0.1 128.0,0.1 128.0,0.1
|
128.0,0.1 128.0,0.1 128.0,0.1 128.0,0.1 128.0,0.1
|
||||||
xn--zca.xn--zca xn--zca.xn--zca ß.ß xn--zca.xn--zca ß.ß
|
xn--zca.xn--zca xn--zca.xn--zca xn--zca.xn--zca ß.ß ß.ß
|
||||||
xn--zca.ß xn--zca.xn--zca ß.ß xn--zca.xn--zca ß.ß
|
xn--zca.ß xn--zca.xn--zca xn--zca.xn--zca ß.ß ß.ß
|
||||||
x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x
|
x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x x01234567890123456789012345678901234567890123456789012345678901x
|
||||||
x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß
|
x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.ß
|
||||||
x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß
|
x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.xn--zca x01234567890123456789012345678901234567890123456789012345678901x.ß x01234567890123456789012345678901234567890123456789012345678901x.ß
|
||||||
01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x
|
01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x 01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x
|
||||||
≠ xn--1ch ≠ xn--1ch ≠
|
≠ xn--1ch xn--1ch ≠ ≠
|
||||||
aa-- aa-- aa-- aa--
|
aa-- aa-- aa-- aa--
|
||||||
ab--c ab--c ab--c ab--c
|
ab--c ab--c ab--c ab--c
|
||||||
-x -x -x -x
|
-x -x -x -x
|
||||||
@ -54,22 +54,35 @@ xn--55qw42g.xn--55qw42g 公益.公益 xn--55qw42g.xn--55qw42g xn--55qw42g.xn--55
|
|||||||
≠ ≠ xn--1ch xn--1ch
|
≠ ≠ xn--1ch xn--1ch
|
||||||
ファッション.biz ファッション.biz xn--bck1b9a5dre4c.biz xn--bck1b9a5dre4c.biz
|
ファッション.biz ファッション.biz xn--bck1b9a5dre4c.biz xn--bck1b9a5dre4c.biz
|
||||||
-- Special cases
|
-- Special cases
|
||||||
|
---- Empty input
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---- NULL input
|
||||||
\N
|
\N
|
||||||
\N
|
\N
|
||||||
\N
|
\N
|
||||||
\N
|
---- Garbage inputs for idnaEncode
|
||||||
\N
|
|
||||||
\N
|
|
||||||
\N
|
|
||||||
|
|
||||||
|
---- Long input
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
idna: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
||||||
|
ascii: wenn sie ...xn-- vom hauptbahnhof in mnchen -n7c...xn-- mit zehn minuten, ohne, dass sie am flughafen noch einchecken mssen, dann starten sie im grunde genommen am flughafen -8gm... am ...xn-- am hauptbahnhof in mnchen starten sie ihren flug-0cf. zehn minuten.xn-- schauen sie sich mal die groen flughfen an, wenn sie in heathrow in london oder sonst wo, meine se -83h23c...xn-- charles de gaulle h in frankreich oder in -jvd...xn--h-zfa... in ... in...xn--h-zfa...in rom. wenn sie sich mal die entfernungen ansehen, wenn sie frankfurt sich ansehen, dann werden sie feststellen, dass zehn minuten... sie jederzeit locker in frankfurt brauchen, um ihr gate zu finden. wenn sie vom flug ... vom ... vom hauptbahnhof starten - sie steigen in den hauptbahnhof ein, sie fahren mit dem transrapid in zehn minuten an den flughafen in ...xn-- an den flughafen franz josef strau-z2c.xn-- dann starten sie praktisch hier am hauptbahnhof in mnchen-t9f.xn-- das bedeutet natrlich, dass der hauptbahnhof im grunde genommen nher an bayern -lxg23q...xn-- an die bayerischen stdte heranwchst, weil das ja klar ist, weil auf dem hauptbahnhof viele linien aus bayern zusammenlaufen-1hkk.
|
||||||
|
ascii_try: wenn sie ...xn-- vom hauptbahnhof in mnchen -n7c...xn-- mit zehn minuten, ohne, dass sie am flughafen noch einchecken mssen, dann starten sie im grunde genommen am flughafen -8gm... am ...xn-- am hauptbahnhof in mnchen starten sie ihren flug-0cf. zehn minuten.xn-- schauen sie sich mal die groen flughfen an, wenn sie in heathrow in london oder sonst wo, meine se -83h23c...xn-- charles de gaulle h in frankreich oder in -jvd...xn--h-zfa... in ... in...xn--h-zfa...in rom. wenn sie sich mal die entfernungen ansehen, wenn sie frankfurt sich ansehen, dann werden sie feststellen, dass zehn minuten... sie jederzeit locker in frankfurt brauchen, um ihr gate zu finden. wenn sie vom flug ... vom ... vom hauptbahnhof starten - sie steigen in den hauptbahnhof ein, sie fahren mit dem transrapid in zehn minuten an den flughafen in ...xn-- an den flughafen franz josef strau-z2c.xn-- dann starten sie praktisch hier am hauptbahnhof in mnchen-t9f.xn-- das bedeutet natrlich, dass der hauptbahnhof im grunde genommen nher an bayern -lxg23q...xn-- an die bayerischen stdte heranwchst, weil das ja klar ist, weil auf dem hauptbahnhof viele linien aus bayern zusammenlaufen-1hkk.
|
||||||
|
original: wenn sie ... vom hauptbahnhof in münchen ... mit zehn minuten, ohne, dass sie am flughafen noch einchecken müssen, dann starten sie im grunde genommen am flughafen ... am ... am hauptbahnhof in münchen starten sie ihren flug. zehn minuten. schauen sie sich mal die großen flughäfen an, wenn sie in heathrow in london oder sonst wo, meine se ... charles de gaulle äh in frankreich oder in ...äh... in ... in...äh...in rom. wenn sie sich mal die entfernungen ansehen, wenn sie frankfurt sich ansehen, dann werden sie feststellen, dass zehn minuten... sie jederzeit locker in frankfurt brauchen, um ihr gate zu finden. wenn sie vom flug ... vom ... vom hauptbahnhof starten - sie steigen in den hauptbahnhof ein, sie fahren mit dem transrapid in zehn minuten an den flughafen in ... an den flughafen franz josef strauß. dann starten sie praktisch hier am hauptbahnhof in münchen. das bedeutet natürlich, dass der hauptbahnhof im grunde genommen näher an bayern ... an die bayerischen städte heranwächst, weil das ja klar ist, weil auf dem hauptbahnhof viele linien aus bayern zusammenlaufen.
|
||||||
|
original_try: wenn sie ... vom hauptbahnhof in münchen ... mit zehn minuten, ohne, dass sie am flughafen noch einchecken müssen, dann starten sie im grunde genommen am flughafen ... am ... am hauptbahnhof in münchen starten sie ihren flug. zehn minuten. schauen sie sich mal die großen flughäfen an, wenn sie in heathrow in london oder sonst wo, meine se ... charles de gaulle äh in frankreich oder in ...äh... in ... in...äh...in rom. wenn sie sich mal die entfernungen ansehen, wenn sie frankfurt sich ansehen, dann werden sie feststellen, dass zehn minuten... sie jederzeit locker in frankfurt brauchen, um ihr gate zu finden. wenn sie vom flug ... vom ... vom hauptbahnhof starten - sie steigen in den hauptbahnhof ein, sie fahren mit dem transrapid in zehn minuten an den flughafen in ... an den flughafen franz josef strauß. dann starten sie praktisch hier am hauptbahnhof in münchen. das bedeutet natürlich, dass der hauptbahnhof im grunde genommen näher an bayern ... an die bayerischen städte heranwächst, weil das ja klar ist, weil auf dem hauptbahnhof viele linien aus bayern zusammenlaufen.
|
||||||
|
---- Non-const input
|
||||||
|
|
||||||
münchen xn--mnchen-3ya münchen xn--mnchen-3ya münchen
|
münchen xn--mnchen-3ya xn--mnchen-3ya münchen münchen
|
||||||
straße.münchen.de xn--strae-oqa.xn--mnchen-3ya.de straße.münchen.de xn--strae-oqa.xn--mnchen-3ya.de straße.münchen.de
|
straße.münchen.de xn--strae-oqa.xn--mnchen-3ya.de xn--strae-oqa.xn--mnchen-3ya.de straße.münchen.de straße.münchen.de
|
||||||
london.co.uk london.co.uk
|
---- Non-const input with invalid values sprinkled in
|
||||||
microsoft.com microsoft.com
|
london.co.uk london.co.uk london.co.uk
|
||||||
straße.münchen.de xn--strae-oqa.xn--mnchen-3ya.de
|
microsoft.com microsoft.com microsoft.com
|
||||||
xn-- \N
|
xn--
|
||||||
xn-- \N
|
xn--
|
||||||
xn--tešla \N
|
xn--tešla
|
||||||
|
ytraße.münchen.de xn--ytrae-oqa.xn--mnchen-3ya.de ytraße.münchen.de
|
||||||
|
@ -6,118 +6,119 @@
|
|||||||
SELECT '-- Negative tests';
|
SELECT '-- Negative tests';
|
||||||
|
|
||||||
SELECT idnaEncode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT idnaEncode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT idnaEncodeOrNull(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT tryIdnaEncode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT idnaDecode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT idnaDecode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
SELECT idnaEncode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT idnaEncode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
SELECT idnaEncodeOrNull(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT tryIdnaEncode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
SELECT idnaDecode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT idnaDecode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
|
|
||||||
SELECT idnaEncode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT idnaEncode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT idnaEncodeOrNull('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT tryIdnaEncode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT idnaDecode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT idnaDecode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
SELECT idnaEncode(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT idnaEncode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
SELECT idnaEncodeOrNull(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT tryIdnaEncode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
SELECT idnaDecode(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT idnaDecode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
|
|
||||||
SELECT '-- Regular cases';
|
SELECT '-- Regular cases';
|
||||||
|
|
||||||
-- The test cases originate from the ada idna unit tests:
|
-- The test cases originate from the ada idna unit tests:
|
||||||
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_ascii_alternating.txt
|
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_ascii_alternating.txt
|
||||||
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_unicode_alternating.txt
|
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_unicode_alternating.txt
|
||||||
|
--
|
||||||
|
SELECT 'straße.de' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '2001:4860:4860::8888' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'AMAZON' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'aa--' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'a†--' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'ab--c' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '-†' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '-x.xn--zca' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x-.xn--zca' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x-.ß' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x..ß' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '128.0,0.1' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'xn--zca.xn--zca' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'xn--zca.ß' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x.xn--zca' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x.ß' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
SELECT '≠' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(idna) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try;
|
||||||
|
|
||||||
SELECT 'straße.de' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'aa--' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '2001:4860:4860::8888' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'ab--c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'AMAZON' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT '-x' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'aa--' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT '' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'a†--' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--1ch' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'ab--c' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--dqd20apc' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '-†' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--gdh' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '-x.xn--zca' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--80aaa0ahbbeh4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x-.xn--zca' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--3bs854c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x-.ß' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--mgb9awbf' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x..ß' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--mgbaam7a8h' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '128.0,0.1' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--mgbbh1a71e' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--zca.xn--zca' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--s7y.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--zca.ß' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--55qx5d.xn--tckwe' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--4dbrk0ce' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x.xn--zca' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--zckzah' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'x01234567890123456789012345678901234567890123456789012345678901x.ß' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--p1ai.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.01234567890123456789012345678901234567890123456789.0123456789012345678901234567890123456789012345678.x' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--mxahbxey0c.gr' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '≠' AS idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull;
|
SELECT 'xn--h2brj9c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
|
SELECT 'xn--d1acpjx3f.xn--p1ai' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'aa--' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--q9jyb4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'ab--c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--sterreich-z7a.at' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '-x' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--h2breg3eve.xn--h2brj9c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT '' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'ejemplo.xn--q9jyb4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--1ch' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--9t4b11yi5a.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--dqd20apc' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--gk3at1e.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--gdh' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--42c2d9a' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--80aaa0ahbbeh4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT '1xn--' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--3bs854c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--bih.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--mgb9awbf' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--4gbrim.xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--mgbaam7a8h' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--mgbb9fbpob' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--mgbbh1a71e' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'xn--55qw42g.xn--55qw42g' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--s7y.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT '≠' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--55qx5d.xn--tckwe' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
SELECT 'ファッション.biz' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, tryIdnaEncode(unicode) AS original_try;
|
||||||
SELECT 'xn--4dbrk0ce' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
--
|
||||||
SELECT 'xn--zckzah' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--p1ai.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--mxahbxey0c.gr' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--h2brj9c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--d1acpjx3f.xn--p1ai' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--q9jyb4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--sterreich-z7a.at' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--h2breg3eve.xn--h2brj9c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'ejemplo.xn--q9jyb4c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--9t4b11yi5a.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--gk3at1e.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--42c2d9a' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT '1xn--' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--bih.com' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--4gbrim.xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--mgbb9fbpob' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'xn--55qw42g.xn--55qw42g' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT '≠' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
SELECT 'ファッション.biz' AS ascii, idnaDecode(ascii) AS unicode, idnaEncode(unicode) AS original, idnaEncodeOrNull(unicode) AS originalOrNull;
|
|
||||||
|
|
||||||
SELECT '-- Special cases';
|
SELECT '-- Special cases';
|
||||||
|
|
||||||
|
SELECT '---- Empty input';
|
||||||
SELECT idnaEncode('');
|
SELECT idnaEncode('');
|
||||||
SELECT idnaEncodeOrNull('');
|
SELECT tryIdnaEncode('');
|
||||||
SELECT idnaDecode('');
|
SELECT idnaDecode('');
|
||||||
|
|
||||||
|
SELECT '---- NULL input';
|
||||||
SELECT idnaEncode(NULL);
|
SELECT idnaEncode(NULL);
|
||||||
SELECT idnaEncodeOrNull(NULL);
|
SELECT tryIdnaEncode(NULL);
|
||||||
SELECT idnaDecode(NULL);
|
SELECT idnaDecode(NULL);
|
||||||
|
|
||||||
-- garbage IDNA/unicode values, see
|
SELECT '---- Garbage inputs for idnaEncode';
|
||||||
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_ascii_invalid.txt
|
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/to_ascii_invalid.txt
|
||||||
-- only idnaEncode() is tested, idnaDecode() has by definition no invalid input values
|
|
||||||
SELECT idnaEncode('xn--'); -- { serverError BAD_ARGUMENTS }
|
SELECT idnaEncode('xn--'); -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT idnaEncodeOrNull('xn--');
|
SELECT tryIdnaEncode('xn--');
|
||||||
SELECT idnaEncode('ﻱa'); -- { serverError BAD_ARGUMENTS }
|
SELECT idnaEncode('ﻱa'); -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT idnaEncodeOrNull('ﻱa');
|
SELECT tryIdnaEncode('ﻱa');
|
||||||
SELECT idnaEncode('xn--a-yoc'); -- { serverError BAD_ARGUMENTS }
|
SELECT idnaEncode('xn--a-yoc'); -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT idnaEncodeOrNull('xn--a-yoc');
|
SELECT tryIdnaEncode('xn--a-yoc');
|
||||||
SELECT idnaEncode('xn--tešla'); -- { serverError BAD_ARGUMENTS }
|
SELECT idnaEncode('xn--tešla'); -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT idnaEncodeOrNull('xn--tešla');
|
SELECT tryIdnaEncode('xn--tešla');
|
||||||
|
|
||||||
-- long input
|
SELECT '---- Long input';
|
||||||
-- SELECT 'Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.' AS idna, idnaEncode(idna) AS ascii, idnaEncodeOrNull(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull FORMAT Vertical;
|
SELECT 'Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.' AS idna, idnaEncode(idna) AS ascii, tryIdnaEncode(ascii) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try FORMAT Vertical;
|
||||||
|
|
||||||
-- non-const values
|
SELECT '---- Non-const input';
|
||||||
DROP TABLE IF EXISTS tab;
|
DROP TABLE IF EXISTS tab;
|
||||||
CREATE TABLE tab (idna String) ENGINE=MergeTree ORDER BY idna;
|
CREATE TABLE tab (idna String) ENGINE=MergeTree ORDER BY idna;
|
||||||
INSERT INTO tab VALUES ('straße.münchen.de') ('') ('münchen');
|
INSERT INTO tab VALUES ('straße.münchen.de') ('') ('münchen');
|
||||||
SELECT idna, idnaEncode(idna) AS ascii, idnaDecode(ascii) AS original, idnaEncodeOrNull(idna) AS asciiOrNull, idnaDecode(asciiOrNull) AS originalOrNull FROM tab;
|
SELECT idna, idnaEncode(idna) AS ascii, tryIdnaEncode(ascii) AS ascii_try, idnaDecode(ascii) AS original, idnaDecode(ascii_try) AS original_try FROM tab;
|
||||||
DROP TABLE tab;
|
DROP TABLE tab;
|
||||||
|
|
||||||
-- non-const values with a few invalid values for testing the OrNull variants
|
SELECT '---- Non-const input with invalid values sprinkled in';
|
||||||
DROP TABLE IF EXISTS tab;
|
DROP TABLE IF EXISTS tab;
|
||||||
CREATE TABLE tab (ascii String) ENGINE=MergeTree ORDER BY ascii;
|
CREATE TABLE tab (idna String) ENGINE=MergeTree ORDER BY idna;
|
||||||
INSERT INTO tab VALUES ('xn--') ('london.co.uk') ('straße.münchen.de') ('xn--tešla') ('microsoft.com') ('xn--');
|
INSERT INTO tab VALUES ('xn--') ('london.co.uk') ('ytraße.münchen.de') ('xn--tešla') ('microsoft.com') ('xn--');
|
||||||
SELECT ascii, idnaEncode(ascii) AS original FROM tab; -- { serverError BAD_ARGUMENTS }
|
SELECT idna, idnaEncode(idna) AS ascii FROM tab; -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT ascii, idnaEncodeOrNull(ascii) AS original FROM tab;
|
SELECT idna, tryIdnaEncode(idna) AS ascii, idnaDecode(ascii) AS original FROM tab;
|
||||||
DROP TABLE tab;
|
DROP TABLE tab;
|
||||||
|
@ -1,52 +1,55 @@
|
|||||||
-- Negative tests
|
-- Negative tests
|
||||||
-- Regular cases
|
-- Regular cases
|
||||||
a a- a a- a
|
a a- a a
|
||||||
A A- A A- A
|
A A- A A
|
||||||
-- --- -- --- --
|
-- --- -- --
|
||||||
London London- London London- London
|
London London- London London
|
||||||
Lloyd-Atkinson Lloyd-Atkinson- Lloyd-Atkinson Lloyd-Atkinson- Lloyd-Atkinson
|
Lloyd-Atkinson Lloyd-Atkinson- Lloyd-Atkinson Lloyd-Atkinson
|
||||||
This has spaces This has spaces- This has spaces This has spaces- This has spaces
|
This has spaces This has spaces- This has spaces This has spaces
|
||||||
-> $1.00 <- -> $1.00 <-- -> $1.00 <- -> $1.00 <-- -> $1.00 <-
|
-> $1.00 <- -> $1.00 <-- -> $1.00 <- -> $1.00 <-
|
||||||
а 80a а 80a а
|
а 80a а а
|
||||||
ü tda ü tda ü
|
ü tda ü ü
|
||||||
α mxa α mxa α
|
α mxa α α
|
||||||
例 fsq 例 fsq 例
|
例 fsq 例 例
|
||||||
😉 n28h 😉 n28h 😉
|
😉 n28h 😉 😉
|
||||||
αβγ mxacd αβγ mxacd αβγ
|
αβγ mxacd αβγ αβγ
|
||||||
München Mnchen-3ya München Mnchen-3ya München
|
München Mnchen-3ya München München
|
||||||
Mnchen-3ya Mnchen-3ya- Mnchen-3ya Mnchen-3ya- Mnchen-3ya
|
Mnchen-3ya Mnchen-3ya- Mnchen-3ya Mnchen-3ya
|
||||||
München-Ost Mnchen-Ost-9db München-Ost Mnchen-Ost-9db München-Ost
|
München-Ost Mnchen-Ost-9db München-Ost München-Ost
|
||||||
Bahnhof München-Ost Bahnhof Mnchen-Ost-u6b Bahnhof München-Ost Bahnhof Mnchen-Ost-u6b Bahnhof München-Ost
|
Bahnhof München-Ost Bahnhof Mnchen-Ost-u6b Bahnhof München-Ost Bahnhof München-Ost
|
||||||
abæcdöef abcdef-qua4k abæcdöef abcdef-qua4k abæcdöef
|
abæcdöef abcdef-qua4k abæcdöef abæcdöef
|
||||||
правда 80aafi6cg правда 80aafi6cg правда
|
правда 80aafi6cg правда правда
|
||||||
ยจฆฟคฏข 22cdfh1b8fsa ยจฆฟคฏข 22cdfh1b8fsa ยจฆฟคฏข
|
ยจฆฟคฏข 22cdfh1b8fsa ยจฆฟคฏข ยจฆฟคฏข
|
||||||
ドメイン名例 eckwd4c7cu47r2wf ドメイン名例 eckwd4c7cu47r2wf ドメイン名例
|
ドメイン名例 eckwd4c7cu47r2wf ドメイン名例 ドメイン名例
|
||||||
MajiでKoiする5秒前 MajiKoi5-783gue6qz075azm5e MajiでKoiする5秒前 MajiKoi5-783gue6qz075azm5e MajiでKoiする5秒前
|
MajiでKoiする5秒前 MajiKoi5-783gue6qz075azm5e MajiでKoiする5秒前 MajiでKoiする5秒前
|
||||||
「bücher」 bcher-kva8445foa 「bücher」 bcher-kva8445foa 「bücher」
|
「bücher」 bcher-kva8445foa 「bücher」 「bücher」
|
||||||
团淄 3bs854c 团淄 3bs854c 团淄
|
团淄 3bs854c 团淄 团淄
|
||||||
-- Special cases
|
-- Special cases
|
||||||
|
---- Empty input
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---- NULL input
|
||||||
|
\N
|
||||||
|
\N
|
||||||
|
\N
|
||||||
|
---- Garbage Punycode-encoded input
|
||||||
|
|
||||||
\N
|
---- Long input
|
||||||
\N
|
|
||||||
\N
|
|
||||||
\N
|
|
||||||
\N
|
|
||||||
Row 1:
|
Row 1:
|
||||||
──────
|
──────
|
||||||
str: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
str: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
||||||
puny: Wenn Sie ... vom Hauptbahnhof in Mnchen ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken mssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in Mnchen starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die groen Flughfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle h in Frankreich oder in ...h... in ... in...h...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strau. Dann starten Sie praktisch hier am Hauptbahnhof in Mnchen. Das bedeutet natrlich, dass der Hauptbahnhof im Grunde genommen nher an Bayern ... an die bayerischen Stdte heranwchst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.-pu7fjtp0npc1ar54cibk471wdc9d18axa
|
puny: Wenn Sie ... vom Hauptbahnhof in Mnchen ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken mssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in Mnchen starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die groen Flughfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle h in Frankreich oder in ...h... in ... in...h...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strau. Dann starten Sie praktisch hier am Hauptbahnhof in Mnchen. Das bedeutet natrlich, dass der Hauptbahnhof im Grunde genommen nher an Bayern ... an die bayerischen Stdte heranwchst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.-pu7fjtp0npc1ar54cibk471wdc9d18axa
|
||||||
original: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
original: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
||||||
punyOrNull: Wenn Sie ... vom Hauptbahnhof in Mnchen ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken mssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in Mnchen starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die groen Flughfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle h in Frankreich oder in ...h... in ... in...h...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strau. Dann starten Sie praktisch hier am Hauptbahnhof in Mnchen. Das bedeutet natrlich, dass der Hauptbahnhof im Grunde genommen nher an Bayern ... an die bayerischen Stdte heranwchst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.-pu7fjtp0npc1ar54cibk471wdc9d18axa
|
original_try: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
||||||
originalOrNull: Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.
|
---- Non-const values
|
||||||
München Mnchen-3ya München Mnchen-3ya München
|
München Mnchen-3ya München München
|
||||||
abc abc- abc abc- abc
|
abc abc- abc abc
|
||||||
aäoöuü aou-qla5gqb aäoöuü aou-qla5gqb aäoöuü
|
aäoöuü aou-qla5gqb aäoöuü aäoöuü
|
||||||
Also no punycode \N
|
---- Non-const values with invalid values sprinkled in
|
||||||
|
Also no punycode
|
||||||
London- London
|
London- London
|
||||||
Mnchen-3ya München
|
Mnchen-3ya München
|
||||||
No punycode \N
|
No punycode
|
||||||
Rtting-3ya Rütting
|
Rtting-3ya Rütting
|
||||||
XYZ no punycode \N
|
XYZ no punycode
|
||||||
|
@ -6,85 +6,81 @@
|
|||||||
SELECT '-- Negative tests';
|
SELECT '-- Negative tests';
|
||||||
|
|
||||||
SELECT punycodeEncode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT punycodeEncode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT punycodeEncodeOrNull(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
|
||||||
SELECT punycodeDecode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT punycodeDecode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT punycodeDecodeOrNull(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT tryPunycodeDecode(); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
SELECT punycodeEncode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT punycodeEncode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
SELECT punycodeEncodeOrNull(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
|
||||||
SELECT punycodeDecode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT punycodeDecode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
SELECT punycodeDecodeOrNull(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT tryPunycodeDecode(1); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
|
|
||||||
SELECT punycodeEncode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT punycodeEncode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT punycodeEncodeOrNull('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
|
||||||
SELECT punycodeDecode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT punycodeDecode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
SELECT punycodeDecodeOrNull('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
SELECT tryPunycodeDecode('two', 'strings'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
|
||||||
|
|
||||||
SELECT punycodeEncode(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT punycodeEncode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
SELECT punycodeEncodeOrNull(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT punycodeDecode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
SELECT punycodeDecode(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
SELECT tryPunycodeDecode(toFixedString('two', 3)); -- { serverError NOT_IMPLEMENTED }
|
||||||
SELECT punycodeDecodeOrNull(toFixedString('two', 3)); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
|
|
||||||
|
|
||||||
SELECT '-- Regular cases';
|
SELECT '-- Regular cases';
|
||||||
|
|
||||||
-- The test cases originate from the ada idna unit tests:
|
-- The test cases originate from the ada idna unit tests:
|
||||||
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/utf8_punycode_alternating.txt
|
-- - https://github.com/ada-url/idna/blob/8cd03ef867dbd06be87bd61df9cf69aa1182ea21/tests/fixtures/utf8_punycode_alternating.txt
|
||||||
|
|
||||||
SELECT 'a' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'a' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'A' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'A' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '--' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '--' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'London' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'London' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'Lloyd-Atkinson' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'Lloyd-Atkinson' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'This has spaces' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'This has spaces' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '-> $1.00 <-' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '-> $1.00 <-' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'а' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'а' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'ü' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'ü' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'α' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'α' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '例' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '例' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '😉' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '😉' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'αβγ' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'αβγ' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'München' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'München' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'Mnchen-3ya' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'Mnchen-3ya' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'München-Ost' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'München-Ost' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'Bahnhof München-Ost' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'Bahnhof München-Ost' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'abæcdöef' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'abæcdöef' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'правда' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'правда' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'ยจฆฟคฏข' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'ยจฆฟคฏข' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'ドメイン名例' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'ドメイン名例' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT 'MajiでKoiする5秒前' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT 'MajiでKoiする5秒前' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '「bücher」' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '「bücher」' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
SELECT '团淄' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull;
|
SELECT '团淄' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try;
|
||||||
|
--
|
||||||
SELECT '-- Special cases';
|
SELECT '-- Special cases';
|
||||||
|
|
||||||
|
SELECT '---- Empty input';
|
||||||
SELECT punycodeEncode('');
|
SELECT punycodeEncode('');
|
||||||
SELECT punycodeEncodeOrNull('');
|
|
||||||
SELECT punycodeDecode('');
|
SELECT punycodeDecode('');
|
||||||
SELECT punycodeDecodeOrNull('');
|
SELECT tryPunycodeDecode('');
|
||||||
|
|
||||||
|
SELECT '---- NULL input';
|
||||||
SELECT punycodeEncode(NULL);
|
SELECT punycodeEncode(NULL);
|
||||||
SELECT punycodeEncodeOrNull(NULL);
|
|
||||||
SELECT punycodeDecode(NULL);
|
SELECT punycodeDecode(NULL);
|
||||||
SELECT punycodeDecodeOrNull(NULL);
|
SELECT tryPunycodeDecode(NULL);
|
||||||
|
|
||||||
-- garbage Punycode-encoded values
|
SELECT '---- Garbage Punycode-encoded input';
|
||||||
SELECT punycodeDecode('no punycode'); -- { serverError BAD_ARGUMENTS }
|
SELECT punycodeDecode('no punycode'); -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT punycodeDecodeOrNull('no punycode');
|
SELECT tryPunycodeDecode('no punycode');
|
||||||
|
|
||||||
-- long input
|
SELECT '---- Long input';
|
||||||
SELECT 'Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) as punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull FORMAT Vertical;
|
SELECT 'Wenn Sie ... vom Hauptbahnhof in München ... mit zehn Minuten, ohne, dass Sie am Flughafen noch einchecken müssen, dann starten Sie im Grunde genommen am Flughafen ... am ... am Hauptbahnhof in München starten Sie Ihren Flug. Zehn Minuten. Schauen Sie sich mal die großen Flughäfen an, wenn Sie in Heathrow in London oder sonst wo, meine se ... Charles de Gaulle äh in Frankreich oder in ...äh... in ... in...äh...in Rom. Wenn Sie sich mal die Entfernungen ansehen, wenn Sie Frankfurt sich ansehen, dann werden Sie feststellen, dass zehn Minuten... Sie jederzeit locker in Frankfurt brauchen, um ihr Gate zu finden. Wenn Sie vom Flug ... vom ... vom Hauptbahnhof starten - Sie steigen in den Hauptbahnhof ein, Sie fahren mit dem Transrapid in zehn Minuten an den Flughafen in ... an den Flughafen Franz Josef Strauß. Dann starten Sie praktisch hier am Hauptbahnhof in München. Das bedeutet natürlich, dass der Hauptbahnhof im Grunde genommen näher an Bayern ... an die bayerischen Städte heranwächst, weil das ja klar ist, weil auf dem Hauptbahnhof viele Linien aus Bayern zusammenlaufen.' AS str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try FORMAT Vertical;
|
||||||
|
|
||||||
-- non-const values
|
SELECT '---- Non-const values';
|
||||||
DROP TABLE IF EXISTS tab;
|
DROP TABLE IF EXISTS tab;
|
||||||
CREATE TABLE tab (str String) ENGINE=MergeTree ORDER BY str;
|
CREATE TABLE tab (str String) ENGINE=MergeTree ORDER BY str;
|
||||||
INSERT INTO tab VALUES ('abc') ('aäoöuü') ('München');
|
INSERT INTO tab VALUES ('abc') ('aäoöuü') ('München');
|
||||||
SELECT str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, punycodeEncodeOrNull(str) AS punyOrNull, punycodeDecodeOrNull(punyOrNull) AS originalOrNull FROM tab;
|
SELECT str, punycodeEncode(str) AS puny, punycodeDecode(puny) AS original, tryPunycodeDecode(puny) AS original_try FROM tab;
|
||||||
DROP TABLE tab;
|
DROP TABLE tab;
|
||||||
|
|
||||||
-- non-const values with a few invalid values for testing the OrNull variants
|
SELECT '---- Non-const values with invalid values sprinkled in';
|
||||||
DROP TABLE IF EXISTS tab;
|
DROP TABLE IF EXISTS tab;
|
||||||
CREATE TABLE tab (puny String) ENGINE=MergeTree ORDER BY puny;
|
CREATE TABLE tab (puny String) ENGINE=MergeTree ORDER BY puny;
|
||||||
INSERT INTO tab VALUES ('Also no punycode') ('London-') ('Mnchen-3ya') ('No punycode') ('Rtting-3ya') ('XYZ no punycode');
|
INSERT INTO tab VALUES ('Also no punycode') ('London-') ('Mnchen-3ya') ('No punycode') ('Rtting-3ya') ('XYZ no punycode');
|
||||||
SELECT puny, punycodeDecode(puny) AS original FROM tab; -- { serverError BAD_ARGUMENTS }
|
SELECT puny, punycodeDecode(puny) AS original FROM tab; -- { serverError BAD_ARGUMENTS }
|
||||||
SELECT puny, punycodeDecodeOrNull(puny) AS original FROM tab;
|
SELECT puny, tryPunycodeDecode(puny) AS original FROM tab;
|
||||||
DROP TABLE tab;
|
DROP TABLE tab;
|
||||||
|
Loading…
Reference in New Issue
Block a user