| 1 | #include "duckdb/common/types/string_type.hpp" | 
|---|
| 2 | #include "duckdb/common/types/value.hpp" | 
|---|
| 3 | #include "utf8proc_wrapper.hpp" | 
|---|
| 4 |  | 
|---|
| 5 | namespace duckdb { | 
|---|
| 6 |  | 
|---|
| 7 | void string_t::Verify() { | 
|---|
| 8 | auto dataptr = GetData(); | 
|---|
| 9 | (void)dataptr; | 
|---|
| 10 | assert(dataptr); | 
|---|
| 11 |  | 
|---|
| 12 | #ifdef DEBUG | 
|---|
| 13 | auto utf_type = Utf8Proc::Analyze(dataptr, length); | 
|---|
| 14 | assert(utf_type != UnicodeType::INVALID); | 
|---|
| 15 | if (utf_type == UnicodeType::UNICODE) { | 
|---|
| 16 | // check that the data is a valid NFC UTF8 string | 
|---|
| 17 | auto normalized = Utf8Proc::Normalize(dataptr); | 
|---|
| 18 | assert(strcmp(dataptr, normalized) == 0); | 
|---|
| 19 | free(normalized); | 
|---|
| 20 | } | 
|---|
| 21 | #endif | 
|---|
| 22 |  | 
|---|
| 23 | // verify that the string is null-terminated and that the length is correct | 
|---|
| 24 | assert(strlen(dataptr) == length); | 
|---|
| 25 | // verify that the prefix contains the first four characters of the string | 
|---|
| 26 | for (idx_t i = 0; i < std::min((uint32_t)PREFIX_LENGTH, length); i++) { | 
|---|
| 27 | assert(prefix[i] == dataptr[i]); | 
|---|
| 28 | } | 
|---|
| 29 | // verify that for strings with length < PREFIX_LENGTH, the rest of the prefix is zero | 
|---|
| 30 | for (idx_t i = length; i < PREFIX_LENGTH; i++) { | 
|---|
| 31 | assert(prefix[i] == '\0'); | 
|---|
| 32 | } | 
|---|
| 33 | } | 
|---|
| 34 |  | 
|---|
| 35 | } // namespace duckdb | 
|---|
| 36 |  | 
|---|