[FEAT MERGE] OB Support XMLType

Co-authored-by: simonjoylet <simonjoylet@gmail.com>
This commit is contained in:
obdev
2023-04-28 03:45:10 +00:00
committed by ob-robot
parent 58bb3d34b7
commit 17abf2818a
405 changed files with 18839 additions and 1573 deletions

View File

@ -79,6 +79,8 @@ public:
return static_cast<int64_t>(hash_val);
}
inline int hash(uint64_t &hash_val) const { hash_val = hash(); return OB_SUCCESS; }
uint64_t get_group_id() const { return group_id_; }
bool is_barrier() const { return false; }
bool need_process_alone() const { return true; }

View File

@ -70,6 +70,7 @@ ob_unittest(test_json_bin)
ob_unittest(test_json_path)
ob_unittest(test_json_tree)
add_subdirectory(allocator)
add_subdirectory(auto_increment)
add_subdirectory(cache)

View File

@ -49,6 +49,7 @@
<NULL, LOB> : defined
<NULL, JSON> : defined
<NULL, GEOMETRY> : defined
<NULL, UDT> : not defined
/**************** TINYINT ****************/
@ -101,6 +102,7 @@
<TINYINT, LOB> : not defined
<TINYINT, JSON> : not defined
<TINYINT, GEOMETRY> : not defined
<TINYINT, UDT> : not defined
/**************** SMALLINT ****************/
@ -153,6 +155,7 @@
<SMALLINT, LOB> : not defined
<SMALLINT, JSON> : not defined
<SMALLINT, GEOMETRY> : not defined
<SMALLINT, UDT> : not defined
/**************** MEDIUMINT ****************/
@ -205,6 +208,7 @@
<MEDIUMINT, LOB> : not defined
<MEDIUMINT, JSON> : not defined
<MEDIUMINT, GEOMETRY> : not defined
<MEDIUMINT, UDT> : not defined
/**************** INT ****************/
@ -257,6 +261,7 @@
<INT, LOB> : not defined
<INT, JSON> : not defined
<INT, GEOMETRY> : not defined
<INT, UDT> : not defined
/**************** BIGINT ****************/
@ -309,6 +314,7 @@
<BIGINT, LOB> : not defined
<BIGINT, JSON> : not defined
<BIGINT, GEOMETRY> : not defined
<BIGINT, UDT> : not defined
/**************** TINYINT UNSIGNED ****************/
@ -361,6 +367,7 @@
<TINYINT UNSIGNED, LOB> : not defined
<TINYINT UNSIGNED, JSON> : not defined
<TINYINT UNSIGNED, GEOMETRY> : not defined
<TINYINT UNSIGNED, UDT> : not defined
/**************** SMALLINT UNSIGNED ****************/
@ -413,6 +420,7 @@
<SMALLINT UNSIGNED, LOB> : not defined
<SMALLINT UNSIGNED, JSON> : not defined
<SMALLINT UNSIGNED, GEOMETRY> : not defined
<SMALLINT UNSIGNED, UDT> : not defined
/**************** MEDIUMINT UNSIGNED ****************/
@ -465,6 +473,7 @@
<MEDIUMINT UNSIGNED, LOB> : not defined
<MEDIUMINT UNSIGNED, JSON> : not defined
<MEDIUMINT UNSIGNED, GEOMETRY> : not defined
<MEDIUMINT UNSIGNED, UDT> : not defined
/**************** INT UNSIGNED ****************/
@ -517,6 +526,7 @@
<INT UNSIGNED, LOB> : not defined
<INT UNSIGNED, JSON> : not defined
<INT UNSIGNED, GEOMETRY> : not defined
<INT UNSIGNED, UDT> : not defined
/**************** BIGINT UNSIGNED ****************/
@ -569,6 +579,7 @@
<BIGINT UNSIGNED, LOB> : not defined
<BIGINT UNSIGNED, JSON> : not defined
<BIGINT UNSIGNED, GEOMETRY> : not defined
<BIGINT UNSIGNED, UDT> : not defined
/**************** FLOAT ****************/
@ -621,6 +632,7 @@
<FLOAT, LOB> : not defined
<FLOAT, JSON> : not defined
<FLOAT, GEOMETRY> : not defined
<FLOAT, UDT> : not defined
/**************** DOUBLE ****************/
@ -673,6 +685,7 @@
<DOUBLE, LOB> : not defined
<DOUBLE, JSON> : not defined
<DOUBLE, GEOMETRY> : not defined
<DOUBLE, UDT> : not defined
/**************** FLOAT UNSIGNED ****************/
@ -725,6 +738,7 @@
<FLOAT UNSIGNED, LOB> : not defined
<FLOAT UNSIGNED, JSON> : not defined
<FLOAT UNSIGNED, GEOMETRY> : not defined
<FLOAT UNSIGNED, UDT> : not defined
/**************** DOUBLE UNSIGNED ****************/
@ -777,6 +791,7 @@
<DOUBLE UNSIGNED, LOB> : not defined
<DOUBLE UNSIGNED, JSON> : not defined
<DOUBLE UNSIGNED, GEOMETRY> : not defined
<DOUBLE UNSIGNED, UDT> : not defined
/**************** DECIMAL ****************/
@ -829,6 +844,7 @@
<DECIMAL, LOB> : not defined
<DECIMAL, JSON> : not defined
<DECIMAL, GEOMETRY> : not defined
<DECIMAL, UDT> : not defined
/**************** DECIMAL UNSIGNED ****************/
@ -881,6 +897,7 @@
<DECIMAL UNSIGNED, LOB> : not defined
<DECIMAL UNSIGNED, JSON> : not defined
<DECIMAL UNSIGNED, GEOMETRY> : not defined
<DECIMAL UNSIGNED, UDT> : not defined
/**************** DATETIME ****************/
@ -933,6 +950,7 @@
<DATETIME, LOB> : not defined
<DATETIME, JSON> : not defined
<DATETIME, GEOMETRY> : not defined
<DATETIME, UDT> : not defined
/**************** TIMESTAMP ****************/
@ -985,6 +1003,7 @@
<TIMESTAMP, LOB> : not defined
<TIMESTAMP, JSON> : not defined
<TIMESTAMP, GEOMETRY> : not defined
<TIMESTAMP, UDT> : not defined
/**************** DATE ****************/
@ -1037,6 +1056,7 @@
<DATE, LOB> : not defined
<DATE, JSON> : not defined
<DATE, GEOMETRY> : not defined
<DATE, UDT> : not defined
/**************** TIME ****************/
@ -1089,6 +1109,7 @@
<TIME, LOB> : not defined
<TIME, JSON> : not defined
<TIME, GEOMETRY> : not defined
<TIME, UDT> : not defined
/**************** YEAR ****************/
@ -1141,6 +1162,7 @@
<YEAR, LOB> : not defined
<YEAR, JSON> : not defined
<YEAR, GEOMETRY> : not defined
<YEAR, UDT> : not defined
/**************** VARCHAR ****************/
@ -1193,6 +1215,7 @@
<VARCHAR, LOB> : not defined
<VARCHAR, JSON> : not defined
<VARCHAR, GEOMETRY> : not defined
<VARCHAR, UDT> : not defined
/**************** CHAR ****************/
@ -1245,6 +1268,7 @@
<CHAR, LOB> : not defined
<CHAR, JSON> : not defined
<CHAR, GEOMETRY> : not defined
<CHAR, UDT> : not defined
/**************** HEX_STRING ****************/
@ -1297,6 +1321,7 @@
<HEX_STRING, LOB> : not defined
<HEX_STRING, JSON> : not defined
<HEX_STRING, GEOMETRY> : not defined
<HEX_STRING, UDT> : not defined
/**************** EXT ****************/
@ -1349,6 +1374,7 @@
<EXT, LOB> : defined
<EXT, JSON> : defined
<EXT, GEOMETRY> : defined
<EXT, UDT> : not defined
/**************** UNKNOWN ****************/
@ -1401,6 +1427,7 @@
<UNKNOWN, LOB> : not defined
<UNKNOWN, JSON> : not defined
<UNKNOWN, GEOMETRY> : not defined
<UNKNOWN, UDT> : not defined
/**************** TINYTEXT ****************/
@ -1453,6 +1480,7 @@
<TINYTEXT, LOB> : not defined
<TINYTEXT, JSON> : not defined
<TINYTEXT, GEOMETRY> : not defined
<TINYTEXT, UDT> : not defined
/**************** TEXT ****************/
@ -1505,6 +1533,7 @@
<TEXT, LOB> : not defined
<TEXT, JSON> : not defined
<TEXT, GEOMETRY> : not defined
<TEXT, UDT> : not defined
/**************** MEDIUMTEXT ****************/
@ -1557,6 +1586,7 @@
<MEDIUMTEXT, LOB> : not defined
<MEDIUMTEXT, JSON> : not defined
<MEDIUMTEXT, GEOMETRY> : not defined
<MEDIUMTEXT, UDT> : not defined
/**************** LONGTEXT ****************/
@ -1609,6 +1639,7 @@
<LONGTEXT, LOB> : not defined
<LONGTEXT, JSON> : not defined
<LONGTEXT, GEOMETRY> : not defined
<LONGTEXT, UDT> : not defined
/**************** BIT ****************/
@ -1661,6 +1692,7 @@
<BIT, LOB> : not defined
<BIT, JSON> : not defined
<BIT, GEOMETRY> : not defined
<BIT, UDT> : not defined
/**************** ENUM ****************/
@ -1713,6 +1745,7 @@
<ENUM, LOB> : not defined
<ENUM, JSON> : not defined
<ENUM, GEOMETRY> : not defined
<ENUM, UDT> : not defined
/**************** SET ****************/
@ -1765,6 +1798,7 @@
<SET, LOB> : not defined
<SET, JSON> : not defined
<SET, GEOMETRY> : not defined
<SET, UDT> : not defined
/**************** ENUM_INNER ****************/
@ -1817,6 +1851,7 @@
<ENUM_INNER, LOB> : not defined
<ENUM_INNER, JSON> : not defined
<ENUM_INNER, GEOMETRY> : not defined
<ENUM_INNER, UDT> : not defined
/**************** SET_INNER ****************/
@ -1869,6 +1904,7 @@
<SET_INNER, LOB> : not defined
<SET_INNER, JSON> : not defined
<SET_INNER, GEOMETRY> : not defined
<SET_INNER, UDT> : not defined
/**************** TIMESTAMP_WITH_TIME_ZONE ****************/
@ -1921,6 +1957,7 @@
<TIMESTAMP_WITH_TIME_ZONE, LOB> : not defined
<TIMESTAMP_WITH_TIME_ZONE, JSON> : not defined
<TIMESTAMP_WITH_TIME_ZONE, GEOMETRY> : not defined
<TIMESTAMP_WITH_TIME_ZONE, UDT> : not defined
/**************** TIMESTAMP_WITH_LOCAL_TIME_ZONE ****************/
@ -1973,6 +2010,7 @@
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, LOB> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, JSON> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, GEOMETRY> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, UDT> : not defined
/**************** TIMESTAMP ****************/
@ -2025,6 +2063,7 @@
<TIMESTAMP, LOB> : not defined
<TIMESTAMP, JSON> : not defined
<TIMESTAMP, GEOMETRY> : not defined
<TIMESTAMP, UDT> : not defined
/**************** RAW ****************/
@ -2077,6 +2116,7 @@
<RAW, LOB> : not defined
<RAW, JSON> : not defined
<RAW, GEOMETRY> : not defined
<RAW, UDT> : not defined
/**************** INTERVAL_YEAR_TO_MONTH ****************/
@ -2129,6 +2169,7 @@
<INTERVAL_YEAR_TO_MONTH, LOB> : not defined
<INTERVAL_YEAR_TO_MONTH, JSON> : not defined
<INTERVAL_YEAR_TO_MONTH, GEOMETRY> : not defined
<INTERVAL_YEAR_TO_MONTH, UDT> : not defined
/**************** INTERVAL_DAY_TO_SECOND ****************/
@ -2181,6 +2222,7 @@
<INTERVAL_DAY_TO_SECOND, LOB> : not defined
<INTERVAL_DAY_TO_SECOND, JSON> : not defined
<INTERVAL_DAY_TO_SECOND, GEOMETRY> : not defined
<INTERVAL_DAY_TO_SECOND, UDT> : not defined
/**************** NUMBER_FLOAT ****************/
@ -2233,6 +2275,7 @@
<NUMBER_FLOAT, LOB> : not defined
<NUMBER_FLOAT, JSON> : not defined
<NUMBER_FLOAT, GEOMETRY> : not defined
<NUMBER_FLOAT, UDT> : not defined
/**************** NVARCHAR2 ****************/
@ -2285,6 +2328,7 @@
<NVARCHAR2, LOB> : not defined
<NVARCHAR2, JSON> : not defined
<NVARCHAR2, GEOMETRY> : not defined
<NVARCHAR2, UDT> : not defined
/**************** NCHAR ****************/
@ -2337,6 +2381,7 @@
<NCHAR, LOB> : not defined
<NCHAR, JSON> : not defined
<NCHAR, GEOMETRY> : not defined
<NCHAR, UDT> : not defined
/**************** ROWID ****************/
@ -2389,6 +2434,7 @@
<ROWID, LOB> : not defined
<ROWID, JSON> : not defined
<ROWID, GEOMETRY> : not defined
<ROWID, UDT> : not defined
/**************** LOB ****************/
@ -2441,6 +2487,7 @@
<LOB, LOB> : not defined
<LOB, JSON> : not defined
<LOB, GEOMETRY> : not defined
<LOB, UDT> : not defined
/**************** JSON ****************/
@ -2493,6 +2540,7 @@
<JSON, LOB> : not defined
<JSON, JSON> : defined
<JSON, GEOMETRY> : not defined
<JSON, UDT> : not defined
/**************** GEOMETRY ****************/
@ -2545,4 +2593,58 @@
<GEOMETRY, LOB> : not defined
<GEOMETRY, JSON> : not defined
<GEOMETRY, GEOMETRY> : defined
<GEOMETRY, UDT> : not defined
/**************** UDT ****************/
<UDT, NULL> : not defined
<UDT, TINYINT> : not defined
<UDT, SMALLINT> : not defined
<UDT, MEDIUMINT> : not defined
<UDT, INT> : not defined
<UDT, BIGINT> : not defined
<UDT, TINYINT UNSIGNED> : not defined
<UDT, SMALLINT UNSIGNED> : not defined
<UDT, MEDIUMINT UNSIGNED> : not defined
<UDT, INT UNSIGNED> : not defined
<UDT, BIGINT UNSIGNED> : not defined
<UDT, FLOAT> : not defined
<UDT, DOUBLE> : not defined
<UDT, FLOAT UNSIGNED> : not defined
<UDT, DOUBLE UNSIGNED> : not defined
<UDT, DECIMAL> : not defined
<UDT, DECIMAL UNSIGNED> : not defined
<UDT, DATETIME> : not defined
<UDT, TIMESTAMP> : not defined
<UDT, DATE> : not defined
<UDT, TIME> : not defined
<UDT, YEAR> : not defined
<UDT, VARCHAR> : not defined
<UDT, CHAR> : not defined
<UDT, HEX_STRING> : not defined
<UDT, EXT> : not defined
<UDT, UNKNOWN> : not defined
<UDT, TINYTEXT> : not defined
<UDT, TEXT> : not defined
<UDT, MEDIUMTEXT> : not defined
<UDT, LONGTEXT> : not defined
<UDT, BIT> : not defined
<UDT, ENUM> : not defined
<UDT, SET> : not defined
<UDT, ENUM_INNER> : not defined
<UDT, SET_INNER> : not defined
<UDT, TIMESTAMP_WITH_TIME_ZONE> : not defined
<UDT, TIMESTAMP_WITH_LOCAL_TIME_ZONE> : not defined
<UDT, TIMESTAMP> : not defined
<UDT, RAW> : not defined
<UDT, INTERVAL_YEAR_TO_MONTH> : not defined
<UDT, INTERVAL_DAY_TO_SECOND> : not defined
<UDT, NUMBER_FLOAT> : not defined
<UDT, NVARCHAR2> : not defined
<UDT, NCHAR> : not defined
<UDT, ROWID> : not defined
<UDT, LOB> : not defined
<UDT, JSON> : not defined
<UDT, GEOMETRY> : not defined
<UDT, UDT> : not defined

View File

@ -49,6 +49,7 @@
<NULL, LOB> : defined
<NULL, JSON> : defined
<NULL, GEOMETRY> : defined
<NULL, UDT> : not defined
/**************** TINYINT ****************/
@ -101,6 +102,7 @@
<TINYINT, LOB> : not defined
<TINYINT, JSON> : not defined
<TINYINT, GEOMETRY> : not defined
<TINYINT, UDT> : not defined
/**************** SMALLINT ****************/
@ -153,6 +155,7 @@
<SMALLINT, LOB> : not defined
<SMALLINT, JSON> : not defined
<SMALLINT, GEOMETRY> : not defined
<SMALLINT, UDT> : not defined
/**************** MEDIUMINT ****************/
@ -205,6 +208,7 @@
<MEDIUMINT, LOB> : not defined
<MEDIUMINT, JSON> : not defined
<MEDIUMINT, GEOMETRY> : not defined
<MEDIUMINT, UDT> : not defined
/**************** INT ****************/
@ -257,6 +261,7 @@
<INT, LOB> : not defined
<INT, JSON> : not defined
<INT, GEOMETRY> : not defined
<INT, UDT> : not defined
/**************** BIGINT ****************/
@ -309,6 +314,7 @@
<BIGINT, LOB> : not defined
<BIGINT, JSON> : not defined
<BIGINT, GEOMETRY> : not defined
<BIGINT, UDT> : not defined
/**************** TINYINT UNSIGNED ****************/
@ -361,6 +367,7 @@
<TINYINT UNSIGNED, LOB> : not defined
<TINYINT UNSIGNED, JSON> : not defined
<TINYINT UNSIGNED, GEOMETRY> : not defined
<TINYINT UNSIGNED, UDT> : not defined
/**************** SMALLINT UNSIGNED ****************/
@ -413,6 +420,7 @@
<SMALLINT UNSIGNED, LOB> : not defined
<SMALLINT UNSIGNED, JSON> : not defined
<SMALLINT UNSIGNED, GEOMETRY> : not defined
<SMALLINT UNSIGNED, UDT> : not defined
/**************** MEDIUMINT UNSIGNED ****************/
@ -465,6 +473,7 @@
<MEDIUMINT UNSIGNED, LOB> : not defined
<MEDIUMINT UNSIGNED, JSON> : not defined
<MEDIUMINT UNSIGNED, GEOMETRY> : not defined
<MEDIUMINT UNSIGNED, UDT> : not defined
/**************** INT UNSIGNED ****************/
@ -517,6 +526,7 @@
<INT UNSIGNED, LOB> : not defined
<INT UNSIGNED, JSON> : not defined
<INT UNSIGNED, GEOMETRY> : not defined
<INT UNSIGNED, UDT> : not defined
/**************** BIGINT UNSIGNED ****************/
@ -569,6 +579,7 @@
<BIGINT UNSIGNED, LOB> : not defined
<BIGINT UNSIGNED, JSON> : not defined
<BIGINT UNSIGNED, GEOMETRY> : not defined
<BIGINT UNSIGNED, UDT> : not defined
/**************** FLOAT ****************/
@ -621,6 +632,7 @@
<FLOAT, LOB> : not defined
<FLOAT, JSON> : not defined
<FLOAT, GEOMETRY> : not defined
<FLOAT, UDT> : not defined
/**************** DOUBLE ****************/
@ -673,6 +685,7 @@
<DOUBLE, LOB> : not defined
<DOUBLE, JSON> : not defined
<DOUBLE, GEOMETRY> : not defined
<DOUBLE, UDT> : not defined
/**************** FLOAT UNSIGNED ****************/
@ -725,6 +738,7 @@
<FLOAT UNSIGNED, LOB> : not defined
<FLOAT UNSIGNED, JSON> : not defined
<FLOAT UNSIGNED, GEOMETRY> : not defined
<FLOAT UNSIGNED, UDT> : not defined
/**************** DOUBLE UNSIGNED ****************/
@ -777,6 +791,7 @@
<DOUBLE UNSIGNED, LOB> : not defined
<DOUBLE UNSIGNED, JSON> : not defined
<DOUBLE UNSIGNED, GEOMETRY> : not defined
<DOUBLE UNSIGNED, UDT> : not defined
/**************** DECIMAL ****************/
@ -829,6 +844,7 @@
<DECIMAL, LOB> : not defined
<DECIMAL, JSON> : not defined
<DECIMAL, GEOMETRY> : not defined
<DECIMAL, UDT> : not defined
/**************** DECIMAL UNSIGNED ****************/
@ -881,6 +897,7 @@
<DECIMAL UNSIGNED, LOB> : not defined
<DECIMAL UNSIGNED, JSON> : not defined
<DECIMAL UNSIGNED, GEOMETRY> : not defined
<DECIMAL UNSIGNED, UDT> : not defined
/**************** DATETIME ****************/
@ -933,6 +950,7 @@
<DATETIME, LOB> : not defined
<DATETIME, JSON> : not defined
<DATETIME, GEOMETRY> : not defined
<DATETIME, UDT> : not defined
/**************** TIMESTAMP ****************/
@ -985,6 +1003,7 @@
<TIMESTAMP, LOB> : not defined
<TIMESTAMP, JSON> : not defined
<TIMESTAMP, GEOMETRY> : not defined
<TIMESTAMP, UDT> : not defined
/**************** DATE ****************/
@ -1037,6 +1056,7 @@
<DATE, LOB> : not defined
<DATE, JSON> : not defined
<DATE, GEOMETRY> : not defined
<DATE, UDT> : not defined
/**************** TIME ****************/
@ -1089,6 +1109,7 @@
<TIME, LOB> : not defined
<TIME, JSON> : not defined
<TIME, GEOMETRY> : not defined
<TIME, UDT> : not defined
/**************** YEAR ****************/
@ -1141,6 +1162,7 @@
<YEAR, LOB> : not defined
<YEAR, JSON> : not defined
<YEAR, GEOMETRY> : not defined
<YEAR, UDT> : not defined
/**************** VARCHAR ****************/
@ -1193,6 +1215,7 @@
<VARCHAR, LOB> : not defined
<VARCHAR, JSON> : not defined
<VARCHAR, GEOMETRY> : not defined
<VARCHAR, UDT> : not defined
/**************** CHAR ****************/
@ -1245,6 +1268,7 @@
<CHAR, LOB> : not defined
<CHAR, JSON> : not defined
<CHAR, GEOMETRY> : not defined
<CHAR, UDT> : not defined
/**************** HEX_STRING ****************/
@ -1297,6 +1321,7 @@
<HEX_STRING, LOB> : not defined
<HEX_STRING, JSON> : not defined
<HEX_STRING, GEOMETRY> : not defined
<HEX_STRING, UDT> : not defined
/**************** EXT ****************/
@ -1349,6 +1374,7 @@
<EXT, LOB> : defined
<EXT, JSON> : defined
<EXT, GEOMETRY> : defined
<EXT, UDT> : not defined
/**************** UNKNOWN ****************/
@ -1401,6 +1427,7 @@
<UNKNOWN, LOB> : not defined
<UNKNOWN, JSON> : not defined
<UNKNOWN, GEOMETRY> : not defined
<UNKNOWN, UDT> : not defined
/**************** TINYTEXT ****************/
@ -1453,6 +1480,7 @@
<TINYTEXT, LOB> : not defined
<TINYTEXT, JSON> : not defined
<TINYTEXT, GEOMETRY> : not defined
<TINYTEXT, UDT> : not defined
/**************** TEXT ****************/
@ -1505,6 +1533,7 @@
<TEXT, LOB> : not defined
<TEXT, JSON> : not defined
<TEXT, GEOMETRY> : not defined
<TEXT, UDT> : not defined
/**************** MEDIUMTEXT ****************/
@ -1557,6 +1586,7 @@
<MEDIUMTEXT, LOB> : not defined
<MEDIUMTEXT, JSON> : not defined
<MEDIUMTEXT, GEOMETRY> : not defined
<MEDIUMTEXT, UDT> : not defined
/**************** LONGTEXT ****************/
@ -1609,6 +1639,7 @@
<LONGTEXT, LOB> : not defined
<LONGTEXT, JSON> : not defined
<LONGTEXT, GEOMETRY> : not defined
<LONGTEXT, UDT> : not defined
/**************** BIT ****************/
@ -1661,6 +1692,7 @@
<BIT, LOB> : not defined
<BIT, JSON> : not defined
<BIT, GEOMETRY> : not defined
<BIT, UDT> : not defined
/**************** ENUM ****************/
@ -1713,6 +1745,7 @@
<ENUM, LOB> : not defined
<ENUM, JSON> : not defined
<ENUM, GEOMETRY> : not defined
<ENUM, UDT> : not defined
/**************** SET ****************/
@ -1765,6 +1798,7 @@
<SET, LOB> : not defined
<SET, JSON> : not defined
<SET, GEOMETRY> : not defined
<SET, UDT> : not defined
/**************** ENUM_INNER ****************/
@ -1817,6 +1851,7 @@
<ENUM_INNER, LOB> : not defined
<ENUM_INNER, JSON> : not defined
<ENUM_INNER, GEOMETRY> : not defined
<ENUM_INNER, UDT> : not defined
/**************** SET_INNER ****************/
@ -1869,6 +1904,7 @@
<SET_INNER, LOB> : not defined
<SET_INNER, JSON> : not defined
<SET_INNER, GEOMETRY> : not defined
<SET_INNER, UDT> : not defined
/**************** TIMESTAMP_WITH_TIME_ZONE ****************/
@ -1921,6 +1957,7 @@
<TIMESTAMP_WITH_TIME_ZONE, LOB> : not defined
<TIMESTAMP_WITH_TIME_ZONE, JSON> : not defined
<TIMESTAMP_WITH_TIME_ZONE, GEOMETRY> : not defined
<TIMESTAMP_WITH_TIME_ZONE, UDT> : not defined
/**************** TIMESTAMP_WITH_LOCAL_TIME_ZONE ****************/
@ -1973,6 +2010,7 @@
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, LOB> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, JSON> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, GEOMETRY> : not defined
<TIMESTAMP_WITH_LOCAL_TIME_ZONE, UDT> : not defined
/**************** TIMESTAMP ****************/
@ -2025,6 +2063,7 @@
<TIMESTAMP, LOB> : not defined
<TIMESTAMP, JSON> : not defined
<TIMESTAMP, GEOMETRY> : not defined
<TIMESTAMP, UDT> : not defined
/**************** RAW ****************/
@ -2077,6 +2116,7 @@
<RAW, LOB> : not defined
<RAW, JSON> : not defined
<RAW, GEOMETRY> : not defined
<RAW, UDT> : not defined
/**************** INTERVAL_YEAR_TO_MONTH ****************/
@ -2129,6 +2169,7 @@
<INTERVAL_YEAR_TO_MONTH, LOB> : not defined
<INTERVAL_YEAR_TO_MONTH, JSON> : not defined
<INTERVAL_YEAR_TO_MONTH, GEOMETRY> : not defined
<INTERVAL_YEAR_TO_MONTH, UDT> : not defined
/**************** INTERVAL_DAY_TO_SECOND ****************/
@ -2181,6 +2222,7 @@
<INTERVAL_DAY_TO_SECOND, LOB> : not defined
<INTERVAL_DAY_TO_SECOND, JSON> : not defined
<INTERVAL_DAY_TO_SECOND, GEOMETRY> : not defined
<INTERVAL_DAY_TO_SECOND, UDT> : not defined
/**************** NUMBER_FLOAT ****************/
@ -2233,6 +2275,7 @@
<NUMBER_FLOAT, LOB> : not defined
<NUMBER_FLOAT, JSON> : not defined
<NUMBER_FLOAT, GEOMETRY> : not defined
<NUMBER_FLOAT, UDT> : not defined
/**************** NVARCHAR2 ****************/
@ -2285,6 +2328,7 @@
<NVARCHAR2, LOB> : not defined
<NVARCHAR2, JSON> : not defined
<NVARCHAR2, GEOMETRY> : not defined
<NVARCHAR2, UDT> : not defined
/**************** NCHAR ****************/
@ -2337,6 +2381,7 @@
<NCHAR, LOB> : not defined
<NCHAR, JSON> : not defined
<NCHAR, GEOMETRY> : not defined
<NCHAR, UDT> : not defined
/**************** ROWID ****************/
@ -2389,6 +2434,7 @@
<ROWID, LOB> : not defined
<ROWID, JSON> : not defined
<ROWID, GEOMETRY> : not defined
<ROWID, UDT> : not defined
/**************** LOB ****************/
@ -2441,6 +2487,7 @@
<LOB, LOB> : not defined
<LOB, JSON> : not defined
<LOB, GEOMETRY> : not defined
<LOB, UDT> : not defined
/**************** JSON ****************/
@ -2493,6 +2540,7 @@
<JSON, LOB> : not defined
<JSON, JSON> : defined
<JSON, GEOMETRY> : not defined
<JSON, UDT> : not defined
/**************** GEOMETRY ****************/
@ -2545,4 +2593,58 @@
<GEOMETRY, LOB> : not defined
<GEOMETRY, JSON> : not defined
<GEOMETRY, GEOMETRY> : defined
<GEOMETRY, UDT> : not defined
/**************** UDT ****************/
<UDT, NULL> : not defined
<UDT, TINYINT> : not defined
<UDT, SMALLINT> : not defined
<UDT, MEDIUMINT> : not defined
<UDT, INT> : not defined
<UDT, BIGINT> : not defined
<UDT, TINYINT UNSIGNED> : not defined
<UDT, SMALLINT UNSIGNED> : not defined
<UDT, MEDIUMINT UNSIGNED> : not defined
<UDT, INT UNSIGNED> : not defined
<UDT, BIGINT UNSIGNED> : not defined
<UDT, FLOAT> : not defined
<UDT, DOUBLE> : not defined
<UDT, FLOAT UNSIGNED> : not defined
<UDT, DOUBLE UNSIGNED> : not defined
<UDT, DECIMAL> : not defined
<UDT, DECIMAL UNSIGNED> : not defined
<UDT, DATETIME> : not defined
<UDT, TIMESTAMP> : not defined
<UDT, DATE> : not defined
<UDT, TIME> : not defined
<UDT, YEAR> : not defined
<UDT, VARCHAR> : not defined
<UDT, CHAR> : not defined
<UDT, HEX_STRING> : not defined
<UDT, EXT> : not defined
<UDT, UNKNOWN> : not defined
<UDT, TINYTEXT> : not defined
<UDT, TEXT> : not defined
<UDT, MEDIUMTEXT> : not defined
<UDT, LONGTEXT> : not defined
<UDT, BIT> : not defined
<UDT, ENUM> : not defined
<UDT, SET> : not defined
<UDT, ENUM_INNER> : not defined
<UDT, SET_INNER> : not defined
<UDT, TIMESTAMP_WITH_TIME_ZONE> : not defined
<UDT, TIMESTAMP_WITH_LOCAL_TIME_ZONE> : not defined
<UDT, TIMESTAMP> : not defined
<UDT, RAW> : not defined
<UDT, INTERVAL_YEAR_TO_MONTH> : not defined
<UDT, INTERVAL_DAY_TO_SECOND> : not defined
<UDT, NUMBER_FLOAT> : not defined
<UDT, NVARCHAR2> : not defined
<UDT, NCHAR> : not defined
<UDT, ROWID> : not defined
<UDT, LOB> : not defined
<UDT, JSON> : not defined
<UDT, GEOMETRY> : not defined
<UDT, UDT> : not defined

View File

@ -0,0 +1,470 @@
/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
* This file contains interface support for the json tree abstraction.
*/
#include <gtest/gtest.h>
#define private public
#define protected public
#include "lib/xml/ob_multi_mode_bin.h"
#include "lib/xml/ob_xml_bin.h"
#include "lib/timezone/ob_timezone_info.h"
#include "lib/xml/ob_xml_parser.h"
#include "lib/xml/ob_xml_util.h"
#undef private
#include <sys/time.h>
using namespace std;
namespace oceanbase {
namespace common{
class TestXmlBin : public ::testing::Test {
public:
TestXmlBin()
{}
~TestXmlBin()
{}
virtual void SetUp()
{}
virtual void TearDown()
{}
static void SetUpTestCase()
{}
static void TearDownTestCase()
{}
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(TestXmlBin);
};
static void get_xml_document_1(ObMulModeMemCtx* ctx, ObXmlDocument*& handle)
{
int ret = 0;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>\n"
);
ObXmlDocument* doc = nullptr;
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
handle = doc;
}
TEST_F(TestXmlBin, serialize_bin_header)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
get_xml_document_1(ctx, doc);
ASSERT_EQ(OB_SUCCESS, ret);
{
ObStringBuffer buffer(&allocator);
ObMulBinHeaderSerializer serializer1(&buffer,
doc->type(),
doc->get_serialize_size(),
doc->size());
// serialize meta info check
ASSERT_EQ(serializer1.get_obj_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer1.get_entry_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer1.get_count_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer1.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer1.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer1.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(serializer1.header_size(), 5);
ASSERT_EQ(serializer1.count_, doc->size());
ASSERT_EQ(doc->type(), M_DOCUMENT);
ASSERT_EQ(serializer1.start(), buffer.length());
ASSERT_EQ(serializer1.obj_var_offset_, 3);
ASSERT_EQ(serializer1.count_var_offset_, 2);
ASSERT_EQ(OB_SUCCESS, serializer1.serialize());
// deserialize
ObMulBinHeaderSerializer serializer2(buffer.ptr(), buffer.length());
ASSERT_EQ(serializer2.deserialize(), 0);
ASSERT_EQ(serializer2.get_obj_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer2.get_entry_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer2.get_count_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer2.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer2.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer2.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(doc->type(), M_DOCUMENT);
ASSERT_EQ(serializer2.obj_var_offset_, 3);
ASSERT_EQ(serializer2.count_var_offset_, 2);
ASSERT_EQ(serializer2.count_, doc->size());
ASSERT_EQ(serializer2.total_, doc->get_serialize_size());
ASSERT_EQ(serializer2.total_, serializer1.total_);
}
{
ObStringBuffer buffer(&allocator);
int64_t count = 128;
int64_t total = 127;
ObMulBinHeaderSerializer serializer1(&buffer, M_DOCUMENT, total, count);
// serialize meta info check
ASSERT_EQ(serializer1.get_obj_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer1.get_entry_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer1.get_count_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer1.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(serializer1.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(serializer1.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer1.count_, count);
ASSERT_EQ(serializer1.type(), M_DOCUMENT);
ASSERT_EQ(serializer1.start(), buffer.length());
ASSERT_EQ(serializer1.obj_var_offset_, 4);
ASSERT_EQ(serializer1.count_var_offset_, 2);
ASSERT_EQ(5, serializer1.header_size());
ASSERT_EQ(OB_SUCCESS, serializer1.serialize());
// deserialize
ObMulBinHeaderSerializer serializer2(buffer.ptr(), buffer.length());
ASSERT_EQ(serializer2.deserialize(), 0);
ASSERT_EQ(serializer2.get_obj_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer2.get_entry_var_size(), sizeof(uint8_t));
ASSERT_EQ(serializer2.get_count_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer2.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(serializer2.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT8);
ASSERT_EQ(serializer2.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer2.type(), M_DOCUMENT);
ASSERT_EQ(serializer2.obj_var_offset_, 4);
ASSERT_EQ(serializer2.count_var_offset_, 2);
ASSERT_EQ(serializer2.count_, count);
ASSERT_EQ(serializer2.total_, total);
}
{
ObStringBuffer buffer(&allocator);
int64_t count = 1100;
int64_t total = 66536;
ObMulBinHeaderSerializer serializer1(&buffer, M_DOCUMENT, total, count);
// serialize meta info check
ASSERT_EQ(serializer1.get_obj_var_size(), sizeof(uint32_t));
ASSERT_EQ(serializer1.get_entry_var_size(), sizeof(uint32_t));
ASSERT_EQ(serializer1.get_count_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer1.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT32);
ASSERT_EQ(serializer1.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT32);
ASSERT_EQ(serializer1.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer1.count_, count);
ASSERT_EQ(serializer1.type(), M_DOCUMENT);
ASSERT_EQ(serializer1.start(), buffer.length());
ASSERT_EQ(serializer1.obj_var_offset_, 4);
ASSERT_EQ(serializer1.count_var_offset_, 2);
ASSERT_EQ(OB_SUCCESS, serializer1.serialize());
ASSERT_EQ(8, serializer1.header_size());
// deserialize
ObMulBinHeaderSerializer serializer2(buffer.ptr(), buffer.length());
ASSERT_EQ(serializer2.deserialize(), 0);
ASSERT_EQ(serializer2.get_obj_var_size(), sizeof(uint32_t));
ASSERT_EQ(serializer2.get_entry_var_size(), sizeof(uint32_t));
ASSERT_EQ(serializer2.get_count_var_size(), sizeof(uint16_t));
ASSERT_EQ(serializer2.get_obj_var_size_type(), ObMulModeBinLenSize::MBL_UINT32);
ASSERT_EQ(serializer2.get_entry_var_size_type(), ObMulModeBinLenSize::MBL_UINT32);
ASSERT_EQ(serializer2.get_count_var_size_type(), ObMulModeBinLenSize::MBL_UINT16);
ASSERT_EQ(serializer2.type(), M_DOCUMENT);
ASSERT_EQ(serializer2.obj_var_offset_, 4);
ASSERT_EQ(serializer2.count_var_offset_, 2);
ASSERT_EQ(serializer2.count_, count);
ASSERT_EQ(serializer2.total_, total);
}
}
TEST_F(TestXmlBin, serialize_element_header)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
get_xml_document_1(ctx, doc);
ASSERT_EQ(doc->size(), 1);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlElement* elem = static_cast<ObXmlElement*>(doc->at(0));
ObString prefix("prefix-string");
{
elem->set_prefix(prefix);
ObStringBuffer buffer(&allocator);
ObXmlElementSerializer serializer1(elem, &buffer);
ASSERT_EQ(serializer1.child_count_, 2);
ASSERT_EQ(serializer1.attr_count_, 1);
ASSERT_EQ(serializer1.header_.header_size(), 5);
ASSERT_EQ(serializer1.ele_header_.header_size(), 16);
ASSERT_EQ(serializer1.key_entry_start_, 21);
ASSERT_EQ(serializer1.key_entry_size_, 2);
ASSERT_EQ(serializer1.value_entry_start_, 39);
ASSERT_EQ(serializer1.value_entry_size_, 2);
ASSERT_EQ(serializer1.serialize(0), 0);
ObXmlElementSerializer serializer2(buffer.ptr(), buffer.length(), ctx);
ObIMulModeBase* handle;
ASSERT_EQ(serializer2.deserialize(handle), 0);
ASSERT_EQ(serializer2.child_count_, 2);
ASSERT_EQ(serializer2.attr_count_, 1);
ASSERT_EQ(serializer2.header_.header_size(), 5);
ASSERT_EQ(serializer2.ele_header_.header_size(), 16);
ObXmlElement *res = static_cast<ObXmlElement*>(handle);
ASSERT_EQ(res->get_prefix().length(), prefix.length());
ASSERT_EQ(0, res->get_prefix().compare(prefix));
ASSERT_EQ(res->attributes_size(), 1);
ASSERT_EQ(res->size(), 2);
}
}
TEST_F(TestXmlBin, serialize_document_header)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
get_xml_document_1(ctx, doc);
ASSERT_EQ(doc->size(), 1);
{
ObStringBuffer buffer(&allocator);
doc->set_standalone(1);
ObXmlDocBinHeader doc_header1(doc->get_standalone(),
doc->get_version(),
doc->get_encoding(),
doc->is_empty());
ASSERT_EQ(doc_header1.serialize(buffer), 0);
ASSERT_EQ(doc_header1.header_size(), buffer.length());
ASSERT_EQ(doc_header1.is_standalone_, 1);
ASSERT_EQ(doc_header1.is_version_, 1);
ASSERT_EQ(doc_header1.is_encoding_, 1);
ObXmlDocBinHeader doc_header2;
ASSERT_EQ(doc_header2.deserialize(buffer.ptr(), buffer.length()), 0);
ASSERT_EQ(doc_header2.is_standalone_, 1);
ASSERT_EQ(doc_header2.is_version_, 1);
ASSERT_EQ(doc_header2.is_encoding_, 1);
}
}
TEST_F(TestXmlBin, serialize_text)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
get_xml_document_1(ctx, doc);
ASSERT_EQ(doc->size(), 1);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlElement* elem = static_cast<ObXmlElement*>(doc->at(0));
elem = static_cast<ObXmlElement*>(elem->at(0));
ASSERT_EQ(elem->get_key().compare("orderperson"), 0);
{
ObStringBuffer buffer(&allocator);
ObXmlText* text = static_cast<ObXmlText*>(elem->at(0));
ObString value;
ASSERT_EQ(text->get_value(value), 0);
ASSERT_EQ(value.compare("John Smith"), 0);
ObXmlTextSerializer serializer1(text, buffer);
ASSERT_EQ(serializer1.header_size(), 1);
ASSERT_EQ(serializer1.serialize(), 0);
ObXmlTextSerializer serializer2(buffer.ptr(), buffer.length(), ctx);
ObIMulModeBase* handle;
ASSERT_EQ(serializer2.deserialize(handle), 0);
ObXmlText* tmp_text = static_cast<ObXmlText*>(handle);
ObString tmp_value;
ASSERT_EQ(tmp_text->get_value(tmp_value), 0);
ASSERT_EQ(tmp_value.compare("John Smith"), 0);
}
}
TEST_F(TestXmlBin, serialize_attribute)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
get_xml_document_1(ctx, doc);
ASSERT_EQ(doc->size(), 1);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlElement* elem = static_cast<ObXmlElement*>(doc->at(0));
ObXmlAttribute* attr = nullptr;
ret = elem->get_attribute(attr, 0);
ASSERT_EQ(ret, 0);
ObString prefix("prefix-string");
{
attr->set_prefix(prefix);
ObStringBuffer buffer(&allocator);
ObXmlAttributeSerializer serializer1(attr, buffer);
ASSERT_EQ(serializer1.header_.header_size(), 16);
ASSERT_EQ(serializer1.serialize(), 0);
ASSERT_EQ(serializer1.header_.is_prefix_, 1);
ASSERT_EQ(serializer1.header_.prefix_len_, 13);
ASSERT_EQ(serializer1.header_.prefix_len_size_, 1);
ASSERT_EQ(buffer.length(), 16 + 1 + 6);
ObXmlAttributeSerializer serializer2(buffer.ptr(), buffer.length(), ctx);
ObIMulModeBase* handle;
ASSERT_EQ(serializer2.deserialize(handle), 0);
ObXmlAttribute* res = static_cast<ObXmlAttribute*>(handle);
ASSERT_EQ(res->get_prefix().compare(prefix), 0);
ASSERT_EQ(res->get_value().compare("889923"), 0);
}
}
TEST_F(TestXmlBin, serialize_base)
{
int ret = 0;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>\n"
);
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buffer(&allocator);
ObXmlElementSerializer serializer(doc, &buffer);
ret = serializer.serialize(0);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* handle = nullptr;
ObXmlElementSerializer deserializer(buffer.ptr(), buffer.length(), ctx);
ret = deserializer.deserialize(handle);
ASSERT_EQ(OB_SUCCESS, ret);
{
ObXmlDocument* tmp_doc = static_cast<ObXmlDocument*>(handle);
ObXmlElement* tmp_elem = static_cast<ObXmlElement*>(tmp_doc->at(0));
ASSERT_EQ(tmp_doc->get_version().compare("1.0"), 0);
ASSERT_EQ(tmp_doc->get_encoding().compare("UTF-8"), 0);
ASSERT_EQ(tmp_elem->get_key().compare("shiporder"), 0);
ObXmlAttribute* tmp_attr = nullptr;
ret = tmp_elem->get_attribute(tmp_attr, 0);
ASSERT_EQ(ret, 0);
ASSERT_EQ(tmp_attr->get_key().compare("orderid"), 0);
ASSERT_EQ(tmp_attr->get_value().compare("889923"), 0);
ObXmlAttribute* tmp_elem1 = static_cast<ObXmlAttribute*>(tmp_elem->at(0));
ASSERT_EQ(tmp_elem1->get_key().compare("orderperson"), 0);
ObXmlAttribute* tmp_elem2 = static_cast<ObXmlAttribute*>(tmp_elem->at(1));
ASSERT_EQ(tmp_elem2->get_key().compare("shipto"), 0);
}
}
} // common
} // oceanbase
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
/*
system("rm -f test_xml_bin.log");
OB_LOGGER.set_file_name("test_xml_bin.log");
OB_LOGGER.set_log_level("INFO");
*/
return RUN_ALL_TESTS();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,740 @@
/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
* This file contains interface support for the json tree abstraction.
*/
#include <gtest/gtest.h>
#define private public
#include "test_xml_utils.h"
#include "lib/xml/ob_xml_tree.h"
#include "lib/timezone/ob_timezone_info.h"
#include "lib/xml/ob_xml_parser.h"
#include "lib/xml/ob_xml_util.h"
#undef private
#include <sys/time.h>
using namespace std;
namespace oceanbase {
namespace common{
using namespace ObXmlTestUtils;
class TestXmlNodeBase : public ::testing::Test {
public:
TestXmlNodeBase()
{}
~TestXmlNodeBase()
{}
virtual void SetUp()
{}
virtual void TearDown()
{}
static void SetUpTestCase()
{}
static void TearDownTestCase()
{}
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(TestXmlNodeBase);
};
TEST_F(TestXmlNodeBase, test_xml_node_init)
{
ObArenaAllocator allocator(ObModIds::TEST);
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
// element
ObXmlElement element1(ObMulModeNodeType::M_ELEMENT, ctx);
// document
ObXmlDocument document(ObMulModeNodeType::M_DOCUMENT, ctx);
// content
ObXmlDocument content(ObMulModeNodeType::M_CONTENT, ctx);
// attribute
ObXmlAttribute attr(ObMulModeNodeType::M_ATTRIBUTE, ctx);
// namespace
ObXmlAttribute ns(ObMulModeNodeType::M_NAMESPACE, ctx);
// PI
ObXmlAttribute pi(ObMulModeNodeType::M_INSTRUCT, ctx);
// CData
ObXmlText cdata(ObMulModeNodeType::M_CDATA, ctx);
// comment
ObXmlText comment(ObMulModeNodeType::M_COMMENT, ctx);
// text
ObXmlText text(ObMulModeNodeType::M_TEXT, ctx);
element1.init();
ASSERT_EQ(ObMulModeNodeType::M_ELEMENT, element1.type());
ObString emelent1= "emelent1";
element1.set_key(emelent1);
ASSERT_EQ(element1.get_key(), "emelent1");
ASSERT_EQ(element1.get_key(), "emelent1");
ObString cdata1= "cdata1";
cdata.set_text(cdata1);
ASSERT_EQ(cdata.get_text(), "cdata1");
ObString key1= "key1";
ObString value1= "value1";
pi.set_key(key1);
pi.set_value(value1);
ObString n1= "n1";
ObString ns1= "namespace1";
ns.set_key(n1);
ns.set_value(ns1);
ObString atr1= "sttr1_name";
ObString atr_value1= "sttr1_value";
attr.set_key(atr1);
attr.set_value(atr_value1);
attr.set_ns(&ns);
ObString val_ns;
int ret = attr.get_ns()->get_value(val_ns);
ASSERT_EQ(val_ns, "namespace1");
}
TEST_F(TestXmlNodeBase, test_xml_node_element_add_child)
{
ObArenaAllocator allocator(ObModIds::TEST);
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
// element1
ObXmlElement element1(ObMulModeNodeType::M_ELEMENT, ctx);
// element2
ObXmlElement element2(ObMulModeNodeType::M_ELEMENT, ctx);
// document
ObXmlDocument document(ObMulModeNodeType::M_DOCUMENT, ctx);
// content
ObXmlDocument content(ObMulModeNodeType::M_CONTENT, ctx);
// attribute
ObXmlAttribute attr1(ObMulModeNodeType::M_ATTRIBUTE, ctx);
ObXmlAttribute attr2(ObMulModeNodeType::M_ATTRIBUTE, ctx);
// namespace
ObXmlAttribute ns(ObMulModeNodeType::M_NAMESPACE, ctx);
// PI
ObXmlAttribute pi(ObMulModeNodeType::M_INSTRUCT, ctx);
// CData
ObXmlText cdata(ObMulModeNodeType::M_CDATA, ctx);
// comment
ObXmlText comment(ObMulModeNodeType::M_COMMENT, ctx);
// text
ObXmlText text(ObMulModeNodeType::M_TEXT, ctx);
element1.init();
element2.init();
ASSERT_EQ(ObMulModeNodeType::M_ELEMENT, element1.type());
ObString emelent1= "emelent1";
ObString emelent2= "emelent2";
element1.set_key(emelent1);
element2.set_key(emelent2);
ASSERT_EQ(element1.get_key(), "emelent1");
ObString cdata1= "cdata1";
cdata.set_text(cdata1);
ASSERT_EQ(cdata.get_text(), "cdata1");
ObString key1= "key1";
ObString value1= "value1";
pi.set_key(key1);
pi.set_value(value1);
ObString n1= "n1";
ObString ns1= "namespace1";
ns.set_key(n1);
ns.set_value(ns1);
ObString atr1= "sttr1_name";
ObString atr_value1= "sttr1_value";
attr1.set_key(atr1);
attr1.set_prefix(n1);
attr1.set_value(atr_value1);
attr1.set_ns(&ns);
ObString atr2= "sttr2_name";
ObString atr_value2= "sttr2_value";
attr2.set_key(atr2);
attr2.set_value(atr_value2);
attr2.set_ns(&ns);
ObString val_ns;
int ret = attr1.get_ns()->get_value(val_ns);
ASSERT_EQ(val_ns, "namespace1");
element1.add_element(&element2);
element1.add_element(&element2);
element1.add_attribute(&attr1);
element2.add_attribute(&attr1);
element1.set_ns(&ns);
element1.set_prefix(ns.get_key());
ASSERT_EQ(element1.size(), 2);
ASSERT_EQ(element1.attributes_size(), 1);
element1.update_attribute(&attr2, 0);
// ASSERT_EQ(element1.get_attribute().at(0).get_value(), "sttr2_value");
ObString key_res1;
int ret2 = element1.get_ns()->get_key(key_res1);
ASSERT_EQ(key_res1, element1.get_prefix());
ObString version1= "version1";
ObString encod= "utf";
document.set_version(version1);
document.set_encoding(encod);
document.set_standalone(1);
document.set_has_xml_decl(0);
ASSERT_EQ(document.get_version(), "version1");
comment.set_text(cdata1);
int res = cdata.compare(cdata1, res);
ASSERT_EQ(res, 0);
}
TEST_F(TestXmlNodeBase, test_xml_node_element_ns_valid)
{
// insert element/attribute with invalid ns
ObArenaAllocator allocator(ObModIds::TEST);
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
// element1
ObXmlElement element1(ObMulModeNodeType::M_ELEMENT, ctx);
// element2
ObXmlElement element2(ObMulModeNodeType::M_ELEMENT, ctx);
// attribute
ObXmlAttribute attr1(ObMulModeNodeType::M_ATTRIBUTE, ctx);
ObXmlAttribute attr2(ObMulModeNodeType::M_ATTRIBUTE, ctx);
// namespace
ObXmlAttribute ns(ObMulModeNodeType::M_NAMESPACE, ctx);
ObXmlAttribute ns2(ObMulModeNodeType::M_NAMESPACE,ctx);
ObString emelent1= "emelent1";
ObString emelent2= "emelent2";
bool need_ns_check = true;
element1.init();
element2.init();
element1.set_key(emelent1);
element2.set_key(emelent2);
ObString n1= "n1";
ObString ns1= "namespace1";
ns.set_key(n1);
ns.set_value(ns1);
ObString n2= "n2";
ObString nstr2= "namespace2";
ns2.set_key(n2);
ns2.set_value(nstr2);
ObString prefix = "n2";
ObString atr1= "sttr1_name";
ObString atr_value1= "sttr1_value";
attr1.set_key(atr1);
attr1.set_prefix(prefix);
attr1.set_value(atr_value1);
attr1.set_ns(&ns);
ObString atr2= "sttr2_name";
ObString atr_value2= "sttr2_value";
attr2.set_key(atr2);
attr2.set_value(atr_value2);
attr2.set_ns(&ns);
element1.add_attribute(&ns);
element2.set_prefix(prefix);
ObXmlTreeTextWriter writer(&allocator);
writer.visit(&element1);
ObString s = writer.get_xml_text();
int ret = element1.add_element(&element2, need_ns_check);
ASSERT_EQ(OB_ERR_UNEXPECTED, ret);
writer.reuse();
writer.visit(&element1);
ObString s1 = writer.get_xml_text();
ret = element1.add_attribute(&attr1, need_ns_check);
writer.reuse();
writer.visit(&element1);
ObString s2 = writer.get_xml_text();
ASSERT_EQ(OB_ERR_UNEXPECTED, ret);
ret = element1.add_attribute(&ns2, need_ns_check);
writer.reuse();
writer.visit(&element1);
ObString s3 = writer.get_xml_text();
ASSERT_EQ(OB_SUCCESS, ret);
ret = element1.add_element(&element2, need_ns_check);
writer.reuse();
writer.visit(&element1);
ObString s4 = writer.get_xml_text();
ASSERT_EQ(OB_SUCCESS, ret);
ret = element1.remove_namespace(1, need_ns_check);
writer.reuse();
writer.visit(&element1);
ObString s5 = writer.get_xml_text();
ASSERT_EQ(OB_ERR_UNEXPECTED, ret);
ret = element1.update_attribute(&ns2, 0);
writer.reuse();
writer.visit(&element1);
ObString s6 = writer.get_xml_text();
ASSERT_EQ(OB_SUCCESS, ret);
ret = element1.remove_namespace(0);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(1, element1.size());
}
TEST_F(TestXmlNodeBase, test_path_interface)
{
int ret = 0;
ObArenaAllocator allocator(ObModIds::TEST);
ObString element3_str = "element3";
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
// element1
ObXmlElement element1(ObMulModeNodeType::M_ELEMENT, ctx);
// element3
ObXmlElement element3(ObMulModeNodeType::M_ELEMENT, ctx, element3_str);
// document
ObXmlDocument document(ObMulModeNodeType::M_DOCUMENT, ctx);
// content
ObXmlDocument content(ObMulModeNodeType::M_CONTENT, ctx);
// attribute
ObXmlAttribute attr1(ObMulModeNodeType::M_ATTRIBUTE, ctx);
ObXmlAttribute attr2(ObMulModeNodeType::M_ATTRIBUTE, ctx);
// namespace
ObXmlAttribute ns(ObMulModeNodeType::M_NAMESPACE, ctx);
// PI
ObXmlAttribute pi(ObMulModeNodeType::M_INSTRUCT, ctx);
// CData
ObXmlText cdata(ObMulModeNodeType::M_CDATA, ctx);
// comment
ObXmlText comment(ObMulModeNodeType::M_COMMENT, ctx);
// text
ObXmlText text(ObMulModeNodeType::M_TEXT, ctx);
element1.init();
ASSERT_EQ(true, ObXmlUtil::is_node(element1.type()));
ASSERT_EQ(false, ObXmlUtil::is_text(element1.type()));
ASSERT_EQ(true, ObXmlUtil::is_element(element1.type()));
ASSERT_EQ(element3_str, element3.get_key());
ObString emelent1= "emelent1";
element1.set_key(emelent1);
ASSERT_EQ(true, element1.is_element(emelent1));
ObString cdata1= "cdata1";
cdata.set_text(cdata1);
ASSERT_EQ(true, ObXmlUtil::is_text(cdata.type()));
ObString key1= "key1";
ObString value1= "value1";
pi.set_key(key1);
pi.set_value(value1);
ASSERT_EQ(true, ObXmlUtil::is_pi(pi.type()));
ASSERT_EQ(true, pi.is_pi(key1));
ObString n1= "n1";
ObString ns1= "namespace1";
ns.set_key(n1);
ns.set_value(ns1);
ASSERT_EQ(false, ObXmlUtil::is_node(ns.type()));
ASSERT_EQ(true, ObXmlUtil::is_comment(comment.type()));
ObString atr1= "sttr1_name";
ObString atr_value1= "sttr1_value";
attr1.set_key(atr1);
attr1.set_prefix(n1);
attr1.set_value(atr_value1);
attr1.set_ns(&ns);
ObString val_ns;
ret = attr1.get_ns()->get_value(val_ns);
ASSERT_EQ(val_ns, "namespace1");
element1.add_attribute(&attr1);
element1.add_attribute(&ns);
element1.set_ns(&ns);
element1.set_prefix(ns.get_key());
ObArray<ObIMulModeBase*> attr_list;
element1.get_attribute_list(attr_list);
ASSERT_EQ(1, attr_list.size());
ASSERT_EQ(&attr1, attr_list.at(0));
attr_list.remove(0);
element1.get_namespace_list(attr_list);
ASSERT_EQ(1, attr_list.size());
ASSERT_EQ(&ns, attr_list.at(0));
ASSERT_EQ(true, element1.has_attribute(ns1, atr1));
ASSERT_EQ(false, element1.has_attribute(ns1, n1));
ASSERT_EQ(&attr1, element1.get_attribute_by_name(ns1, atr1));
ASSERT_EQ(true, element1.is_invalid_namespace(&ns));
ObString n3= "n3";
ObString ns3= "namespace3";
ret = element1.add_attr_by_str(n3, ns3);
attr_list.remove(0);
element1.get_namespace_list(attr_list);
ASSERT_EQ(2, attr_list.size());
}
TEST_F(TestXmlNodeBase, test_simple_print_document)
{
int ret = 0;
ObCollationType type = CS_TYPE_UTF8MB4_GENERAL_CI;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>\n"
);
common::ObString serialize_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">"
"<orderperson>John Smith</orderperson>"
"<shipto>"
"<name>Ola Nordmann</name>"
"<address>Langgt 23</address>"
"<city>4000 Stavanger</city>"
"<country>Norway</country>"
"</shipto>"
"</shiporder>"
);
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
doc->print_document(buf_str, type, false);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_simple_print_document_with_pretty)
{
int ret = 0;
ObCollationType type = CS_TYPE_UTF8MB4_GENERAL_CI;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!--Students grades are uploaded by months-->\n"
"<?pi name target ?>"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" <![CDATA[xyz123abc]]> \n"
" </shipto>\n"
"</shiporder>\n"
);
common::ObString serialize_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!--Students grades are uploaded by months-->\n"
"<?pi name target ?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country><![CDATA[xyz123abc]]></shipto>\n"
"</shiporder>\n"
);
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
doc->print_document(buf_str, type, true, 2);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_print_content_with_pretty)
{
int ret = 0;
common::ObString xml_text(
"123456"
"<contact>"
"<address category=\"residence\">"
" <name>Tanmay Patil</name>"
"</address>"
"</contact>"
);
common::ObString serialize_text(
"123456\n"
"<contact>\n"
" <address category=\"residence\">\n"
" <name>Tanmay Patil</name>\n"
" </address>\n"
"</contact>\n"
);
common::ObString serialize_text_with_encoding(
"<?xml encoding=\"utf-8\"?>\n"
"123456\n"
"<contact>\n"
" <address category=\"residence\">\n"
" <name>Tanmay Patil</name>\n"
" </address>\n"
"</contact>\n"
);
common::ObString serialize_text_with_version(
"<?xml version=\"4.0.0\"?>\n"
"123456\n"
"<contact>\n"
" <address category=\"residence\">\n"
" <name>Tanmay Patil</name>\n"
" </address>\n"
"</contact>\n"
);
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* content = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_content_text(ctx, xml_text, content);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
ParamPrint param_list;
param_list.version = "4.0.0";
param_list.encode = "utf-8";
param_list.indent = 4;
content->print_content(buf_str, false, false, true, param_list);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
buf_str.reuse();
content->print_content(buf_str, true, false, true, param_list);
ASSERT_EQ(std::string(serialize_text_with_encoding.ptr(), serialize_text_with_encoding.length()), std::string(buf_str.ptr(), buf_str.length()));
buf_str.reuse();
content->print_content(buf_str, false, true, true, param_list);
ASSERT_EQ(std::string(serialize_text_with_version.ptr(), serialize_text_with_version.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_print_content)
{
int ret = 0;
common::ObString xml_text(
"123456"
"<contact>"
"<address category=\"residence\">"
" <name>Tanmay Patil</name>"
" </address>"
"</contact>"
);
common::ObString ser_text(
"123456"
"<contact>"
"<address category=\"residence\">"
"<name>Tanmay Patil</name>"
"</address>"
"</contact>"
);
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* content = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_content_text(ctx, xml_text, content);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
ParamPrint param_list;
param_list.version = "";
param_list.encode = "";
param_list.indent = 2;
content->print_content(buf_str, false, false, false, param_list);
ASSERT_EQ(std::string(ser_text.ptr(), ser_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_print_xml_node)
{
ObArenaAllocator allocator(ObModIds::TEST);
int ret = 0;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>\n"
);
common::ObString serialize_text(
"<shiporder orderid=\"889923\">"
"<orderperson>John Smith</orderperson>"
"<shipto>"
"<name>Ola Nordmann</name>"
"<address>Langgt 23</address>"
"<city>4000 Stavanger</city>"
"<country>Norway</country>"
"</shipto>"
"</shiporder>"
);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
doc->at(0)->print(buf_str, false, false);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_print_xml_node_with_pretty)
{
ObArenaAllocator allocator(ObModIds::TEST);
int ret = 0;
common::ObString xml_text(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>\n"
);
common::ObString serialize_text(
"<shiporder orderid=\"889923\">\n"
" <orderperson>John Smith</orderperson>\n"
" <shipto>\n"
" <name>Ola Nordmann</name>\n"
" <address>Langgt 23</address>\n"
" <city>4000 Stavanger</city>\n"
" <country>Norway</country>\n"
" </shipto>\n"
"</shiporder>"
);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
doc->at(0)->print(buf_str, false, true, 0, 3);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_simple_print_document_mysqltest)
{
int ret = 0;
ObCollationType type = CS_TYPE_UTF8MB4_GENERAL_CI;
common::ObString xml_text("<?xml version=\"1.0\"?><a/>");
common::ObString serialize_text("<?xml version=\"1.0\"?>\n<a></a>");
ObArenaAllocator allocator(ObModIds::TEST);
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
ObStringBuffer buf_str(&allocator);
doc->print_document(buf_str, type, false);
ASSERT_EQ(std::string(serialize_text.ptr(), serialize_text.length()), std::string(buf_str.ptr(), buf_str.length()));
}
TEST_F(TestXmlNodeBase, test_xml_node_element_add_well_from)
{
ObCollationType type = CS_TYPE_UTF8MB4_GENERAL_CI;
ObArenaAllocator allocator(ObModIds::TEST);
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
// element1
ObXmlElement element1(ObMulModeNodeType::M_ELEMENT, ctx);
// element2
ObXmlElement element2(ObMulModeNodeType::M_ELEMENT, ctx);
// content
ObXmlDocument content(ObMulModeNodeType::M_CONTENT, ctx);
// attribute
ObXmlAttribute attr1(ObMulModeNodeType::M_ATTRIBUTE, ctx);
// PI
ObXmlAttribute pi(ObMulModeNodeType::M_INSTRUCT, ctx);
// CData
ObXmlText cdata(ObMulModeNodeType::M_CDATA, ctx);
// comment
ObXmlText comment(ObMulModeNodeType::M_COMMENT, ctx);
// text
ObXmlText text(ObMulModeNodeType::M_TEXT, ctx);
element1.init();
element2.init();
ASSERT_EQ(ObMulModeNodeType::M_ELEMENT, element1.type());
ObString emelent1= "emelent1";
ObString emelent2= "emelent2";
ASSERT_EQ(content.attributes_size(), 0);
element1.set_key(emelent1);
element2.set_key(emelent2);
ASSERT_EQ(element1.get_key(), "emelent1");
ObString cdata1= "cdata1";
cdata.set_text(cdata1);
ASSERT_EQ(cdata.get_text(), "cdata1");
ObString key1= "key1";
ObString value1= "value1";
pi.set_key(key1);
pi.set_value(value1);
ObString atr1= "sttr1_name";
ObString atr_value1= "sttr1_value";
attr1.set_key(atr1);
attr1.set_value(atr_value1);
element1.add_element(&element2);
element1.add_element(&element2);
element1.add_attribute(&attr1);
element2.add_attribute(&attr1);
ASSERT_EQ(element1.size(), 2);
ASSERT_EQ(element1.attributes_size(), 1);
comment.set_text(cdata1);
int res = cdata.compare(cdata1, res);
ASSERT_EQ(res, 0);
content.add_element(&element1);
content.add_element(&element2);
ObString str1 = "<dasdsa";
content.append_unparse_text(str1);
ASSERT_EQ(3, content.size());
ObString str2 = " a=\"dasa\" />";
content.append_unparse_text(str2);
ASSERT_EQ(3, content.size());
content.add_element(&comment);
content.append_unparse_text(str2);
ASSERT_EQ(5, content.size());
ObStringBuffer str_res(&allocator);
content.print_document(str_res, type, false);
cout<< "str_res :" <<endl;
ObString str_res_ = str_res.string();
cout<< str_res_ <<endl;
}
} // common
} // oceanbase
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
/*
system("rm -f test_json_tree.log");
OB_LOGGER.set_file_name("test_json_tree.log");
OB_LOGGER.set_log_level("INFO");
*/
return RUN_ALL_TESTS();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,339 @@
/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#define USING_LOG_PREFIX SHARE
#ifndef OCEANBASE_UNIT_TEST_XML_UTILS_H_
#define OCEANBASE_UNIT_TEST_XML_UTILS_H_
#include "lib/xml/ob_xml_parser.h"
#include "lib/xml/ob_xml_util.h"
#include "lib/oblog/ob_log.h"
namespace oceanbase {
namespace common {
namespace ObXmlTestUtils {
class ObXmlNodeVisitor {
public:
virtual int visit(ObXmlNode* node);
virtual int visit_xml_document(ObXmlDocument* node) = 0;
virtual int visit_xml_content(ObXmlDocument* node) = 0;
virtual int visit_xml_element(ObXmlElement* node) = 0;
virtual int visit_xml_attribute(ObXmlAttribute* node) = 0;
virtual int visit_xml_text(ObXmlText* node) = 0;
virtual int visit_xml_comment(ObXmlText* node) = 0;
virtual int visit_xml_cdata(ObXmlText* node) = 0;
virtual int visit_xml_processing_instruction(ObXmlAttribute* node) = 0;
};
int ObXmlNodeVisitor::visit(ObXmlNode* node) {
INIT_SUCC(ret);
if (OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("node is null", K(ret));
} else {
switch (node->type())
{
case ObMulModeNodeType::M_DOCUMENT:
if (OB_FAIL(visit_xml_document(ObXmlUtil::xml_node_cast<ObXmlDocument>(node, node->type())))) {
LOG_WARN("visit document failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_CONTENT:
if (OB_FAIL(visit_xml_content(ObXmlUtil::xml_node_cast<ObXmlDocument>(node, node->type())))) {
LOG_WARN("visit document failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_ELEMENT:
if (OB_FAIL(visit_xml_element(ObXmlUtil::xml_node_cast<ObXmlElement>(node, node->type())))) {
LOG_WARN("visit element failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_ATTRIBUTE:
case ObMulModeNodeType::M_NAMESPACE:
if (OB_FAIL(visit_xml_attribute(ObXmlUtil::xml_node_cast<ObXmlAttribute>(node, node->type())))) {
LOG_WARN("visit attribute failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_TEXT:
if (OB_FAIL(visit_xml_text(ObXmlUtil::xml_node_cast<ObXmlText>(node, node->type())))) {
LOG_WARN("visit text failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_CDATA:
if (OB_FAIL(visit_xml_cdata(ObXmlUtil::xml_node_cast<ObXmlText>(node, node->type())))) {
LOG_WARN("visit cdata failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_COMMENT:
if (OB_FAIL(visit_xml_comment(ObXmlUtil::xml_node_cast<ObXmlText>(node, node->type())))) {
LOG_WARN("visit comment failed", K(ret), K(node->type()));
}
break;
case ObMulModeNodeType::M_INSTRUCT:
if (OB_FAIL(visit_xml_processing_instruction(ObXmlUtil::xml_node_cast<ObXmlAttribute>(node, node->type())))) {
LOG_WARN("visit processing instruction failed", K(ret), K(node->type()));
}
break;
default:
ret = OB_ERR_UNEXPECTED;
LOG_WARN("node type incorrect", K(ret), K(node->type()));
break;
}
}
return ret;
}
class ObXmlTreeTextWriter : public ObXmlNodeVisitor{
public:
ObXmlTreeTextWriter(ObIAllocator* allocator) : buffer_(allocator) {}
virtual ~ObXmlTreeTextWriter() {}
virtual int visit_xml_document(ObXmlDocument* node);
virtual int visit_xml_content(ObXmlDocument* node);
virtual int visit_xml_element(ObXmlElement* node);
virtual int visit_xml_attribute(ObXmlAttribute* node);
virtual int visit_xml_text(ObXmlText* node);
virtual int visit_xml_comment(ObXmlText* node);
virtual int visit_xml_cdata(ObXmlText* node);
virtual int visit_xml_processing_instruction(ObXmlAttribute* node);
int append_qname(const ObString& prefix, const ObString& localname) {
INIT_SUCC(ret);
if (!prefix.empty()) {
buffer_.append(prefix);
buffer_.append(":");
}
if (!localname.empty()) {
buffer_.append(localname);
}
return ret;
}
void reuse() {
buffer_.reuse();
}
ObString get_xml_text() {
return ObString(buffer_.length(), buffer_.ptr());
}
private:
ObStringBuffer buffer_;
};
int ObXmlTreeTextWriter::visit_xml_document(ObXmlDocument* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
if (node->has_xml_decl()) {
buffer_.append("<?xml");
if (!node->get_version().empty()) {
buffer_.append(" version=\"");
buffer_.append(node->get_version());
buffer_.append("\"");
}
if (! node->get_encoding().empty() || node->get_encoding_flag()) {
buffer_.append(" encoding=\"");
buffer_.append(node->get_encoding());
buffer_.append("\"");
}
switch(node->get_standalone()) {
case OB_XML_STANDALONE_NO:
buffer_.append(" standalone=\"no\"");
break;
case OB_XML_STANDALONE_YES:
buffer_.append(" standalone=\"yes\"");
break;
}
buffer_.append("?>\n");
}
for (int i = 0; OB_SUCC(ret) && i < node->size(); ++i) {
ObXmlNode* child = node->at(i);
if (OB_ISNULL(child)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get child failed", K(ret), K(i));
} else if (OB_FAIL(visit(child))) {
LOG_WARN("visit child failed", K(ret), K(i));
} else {
buffer_.append("\n");
}
}
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_content(ObXmlDocument* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
for (int i = 0; OB_SUCC(ret) && i < node->size(); ++i) {
ObXmlNode* child = node->at(i);
if (OB_ISNULL(child)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get child failed", K(ret), K(i));
} else if (OB_FAIL(visit(child))) {
LOG_WARN("visit child failed", K(ret), K(i));
}
}
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_element(ObXmlElement* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
buffer_.append("<");
append_qname(node->get_prefix(), node->get_key());
for (int i = 0; OB_SUCC(ret) && i < node->attributes_size(); ++i) {
ObXmlAttribute* attr = NULL;
if (OB_FAIL(node->get_attribute(attr, i))) {
LOG_WARN("get attr failed", K(ret), K(i));
} else if (OB_ISNULL(attr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("fail to get attr", K(ret));
} else {
buffer_.append(" ");
if (OB_FAIL(visit(attr))) {
LOG_WARN("visit attr failed", K(ret), K(i));
}
}
}
if (OB_SUCC(ret)) {
if (node->is_empty()) {
buffer_.append("/>");
} else {
buffer_.append(">");
for (int i = 0; OB_SUCC(ret) && i < node->size(); ++i) {
ObXmlNode* child = node->at(i);
if (OB_ISNULL(child)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get child failed", K(ret), K(i));
} else if (OB_FAIL(visit(child))) {
LOG_WARN("visit child failed", K(ret), K(i));
}
}
}
}
if (OB_SUCC(ret) && !node->is_empty()) {
buffer_.append("</");
append_qname(node->get_prefix(), node->get_key());
buffer_.append(">");
}
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_attribute(ObXmlAttribute* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
ObString attr_value;
append_qname(node->get_prefix(), node->get_key());
buffer_.append("=\"");
node->get_value(attr_value);
buffer_.append(attr_value);
buffer_.append("\"");
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_text(ObXmlText* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
ObString value;
node->get_value(value);
buffer_.append(value);
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_cdata(ObXmlText* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
ObString value;
buffer_.append("<![CDATA[");
node->get_value(value);
buffer_.append(value);
buffer_.append("]]>");
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_comment(ObXmlText* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
ObString value;
buffer_.append("<!--");
node->get_value(value);
buffer_.append(value);
buffer_.append("-->");
}
return ret;
}
int ObXmlTreeTextWriter::visit_xml_processing_instruction(ObXmlAttribute* node) {
INIT_SUCC(ret);
if(OB_ISNULL(node)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("null node", K(ret));
} else {
ObString value;
buffer_.append("<?");
buffer_.append(node->get_key());
node->get_value(value);
if (!value.empty()) {
buffer_.append(" ");
buffer_.append(value);
}
buffer_.append("?>");
}
return ret;
}
class ObXmlWriterUtils {
public:
static ObString to_xml_text(ObIAllocator* allocator, ObXmlNode& node) {
ObXmlTreeTextWriter writer(allocator);
writer.visit(&node);
return writer.get_xml_text();
}
};
};
}//end namespace share
}//end namespace oceanbase
#endif // OCEANBASE_UNIT_TEST_XML_UTILS_H_

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,675 @@
#include <gtest/gtest.h>
#include "lib/string/ob_sql_string.h"
#define private public
#include "test_xml_utils.h"
#include "lib/xml/ob_xpath.h"
#include "lib/allocator/ob_mod_define.h"
#include "lib/allocator/page_arena.h"
#include "lib/xml/ob_xml_parser.h"
#include "libxml2/libxml/xmlmemory.h"
#include "lib/xml/ob_xml_util.h"
#undef private
using namespace oceanbase::common;
using namespace ObXmlTestUtils;
class TestXPathFilter : public ::testing::Test {
public:
TestXPathFilter()
{}
~TestXPathFilter()
{}
virtual void SetUp()
{}
virtual void TearDown()
{}
static void SetUpTestCase()
{}
static void TearDownTestCase()
{}
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(TestXPathFilter);
};
# define PREDICATE_TEST_COUNT 100
# define PREDICATE_FALSE_TEST_COUNT 100
ObString func_false_enter[PREDICATE_TEST_COUNT] = {
"/bookstore/book/title[text() = \"aaa\"]",
"/bookstore/book/title[text() = \"bbb\"]",
};
ObString func_false_enter_parse_result[PREDICATE_TEST_COUNT] = {
"/bookstore/book/title[text() = \"aaa\"]",
"/bookstore/book/title[text() = \"bbb\"]",
};
TEST_F(TestXPathFilter, test_false_function)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObString xml_text("<bookstore><book category=\"a\"><title lang=\"x\">abc</title> <author>def</author><year month=\"1\">1</year><price>false</price></book><book category=\"b\"><title lang=\"y\">def</title><author>xyz</author><year month=\"2\">2005</year><price>30.00</price></book><book category=\"c\"><title lang=\"en\">xyz</title><author>abc</author><year>2005</year><price>29.99</price></book><book category=\"WEB\"><title lang=\"en\">Learning XML</title><year>2003</year><sell></sell></book></bookstore>");
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
for (int i = 0; i < PREDICATE_TEST_COUNT; i++) {
if (func_false_enter[i].empty()) break;
ObString enter_xpath = func_false_enter[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(func_false_enter_parse_result[i], parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
ASSERT_EQ(OB_ITER_END, ret);
}
}
ObString func_enter[PREDICATE_TEST_COUNT] = {
"/bookstore/book/title[text() = \"abc\"]",
"/bookstore/book/title[text() = \"def\"]",
};
ObString func_enter_parse_result[PREDICATE_TEST_COUNT] = {
"/bookstore/book/title[text() = \"abc\"]",
"/bookstore/book/title[text() = \"def\"]",
};
ObString func_predicate_result[PREDICATE_TEST_COUNT] = {
"<title lang=\"x\">abc</title>",
"<title lang=\"y\">def</title>",
};
TEST_F(TestXPathFilter, test_function)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObString xml_text("<bookstore><book category=\"a\"><title lang=\"x\">abc</title> <author>def</author><year month=\"1\">1</year><price>false</price></book><book category=\"b\"><title lang=\"y\">def</title><author>xyz</author><year month=\"2\">2005</year><price>30.00</price></book><book category=\"c\"><title lang=\"en\">xyz</title><author>abc</author><year>2005</year><price>29.99</price></book><book category=\"WEB\"><title lang=\"en\">Learning XML</title><year>2003</year><sell></sell></book></bookstore>");
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
for (int i = 0; i < PREDICATE_TEST_COUNT; i++) {
if (func_enter[i].empty()) break;
ObString enter_xpath = func_enter[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(func_enter_parse_result[i], parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlTreeTextWriter writer(&allocator);
ObXmlNode* xnode = static_cast<ObXmlNode*>(res);
writer.visit(xnode);
ObString s = writer.get_xml_text();
std::cout << "Test NO." << i << " : " << s.ptr() << std::endl;
ASSERT_EQ(s, func_predicate_result[i]);
}
}
ObString complex_result[2] = {"<a>a<b><c>c<e>e</e><g>g</g></c><f>f</f></b></a>", "<a>xyz</a>"};
TEST_F(TestXPathFilter, test_complex_in_predicate)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ObString xml_text("<tmp><a>a<b><c>c<e>e</e><g>g</g></c><f>f</f></b></a><a>xyz</a></tmp>");
ObXmlDocument* doc = nullptr;
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
//ObString enter_xpath = "/tmp/a[/tmp/a = \"acegf\"]";
ObString enter_xpath = "/tmp/a[/tmp/a = \"xyz\"]";
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(enter_xpath, parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
int i = 0;
while (OB_SUCC(ret)) {
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
if (i < 2) {
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlTreeTextWriter writer(&allocator);
ObXmlNode* xnode = static_cast<ObXmlNode*>(res);
writer.visit(xnode);
ObString s = writer.get_xml_text();
ASSERT_EQ(s, complex_result[i]);
std::cout<< i << ": " << s.ptr() << std::endl;
} else {
ASSERT_EQ(OB_ITER_END, ret);
}
++i;
}
}
/*
<bookstore>
<book category="a">
<title lang="x">abc</title>
<author>def</author>
<year month="1">1</year>
<price>false</price>
</book>
<book category="b">
<title lang="y">def</title>
<author>xyz</author>
<year month="2">2005</year>
<price>30.00</price>
</book>
<book category="c">
<title lang="en">xyz</title>
<author>abc</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<year>2003</year>
<sell></sell>
</book>
</bookstore>
*/
ObString enter_predicate[PREDICATE_TEST_COUNT] = {
// node-set
"/bookstore/book/sell[0 | /bookstore/book]",
"/bookstore/book/sell[/bookstore/book | 0]",
"/bookstore/book/sell[/a | /bookstore]",
"/bookstore/book/sell[/bookstore/book/sell = \"\"]",
"/bookstore/book/sell[(3 > 5) = /bookstore/book/abc]",
"/bookstore/book/sell[/bookstore/book/abc = (3 > 5)]",
"/bookstore/book/sell[/bookstore/book/year < 2]",
"/bookstore/book/sell[/bookstore/book/year = 2003]",
"/bookstore/book/sell[/bookstore/book/author > \"x\"]",
"/bookstore/book/sell[/bookstore/book/author < \"x\"]",
"/bookstore/book/sell[/bookstore/book/author = (3 > 1)]",
"/bookstore/book/sell[/bookstore/book/title = /bookstore/book/author]",
// union
"/bookstore/book/sell[1 | 0]",
"/bookstore/book/sell[\"abc\" | 0]",
"/bookstore/book/sell[1 > 0 | 0]",
// logic compare
"/bookstore/book/sell[(0 < 2) and \"abc\"]",
"/bookstore/book/sell[(0 < 2) and \"x\"]",
"/bookstore/book/sell[\"\" or 1 > -1]",
"/bookstore/book/sell[1 or 1 > 0]",
"/bookstore/book/sell[0 or 1 > 0]",
"/bookstore/book/sell[2 and 1 > 0]",
"/bookstore/book/sell[(0 < 2) and -1]",
"/bookstore/book/sell[(0 < 2) and 3]",
"/bookstore/book/sell[(1 > 2) or (0.12 < 9)]",
"/bookstore/book/sell[(1 < 2) and (3 < 9)]",
// bool e double
"/bookstore/book/sell[(1 < 2) = -123]",
"/bookstore/book/sell[(1 < 2) = 123]",
// bool e string
"/bookstore/book/sell[(1 < 2) = \"true\"]",
"/bookstore/book/sell[(1 < 2) = \"1\"]",
"/bookstore/book/sell[(1 > 2) != \"true\"]",
// double e bool
"/bookstore/book/sell[0.0 != (1 < 2)]",
"/bookstore/book/sell[-1 = (1 < 2)]",
"/bookstore/book/sell[31 = (1 < 2)]",
// double e string
"/bookstore/book/sell[31 = \"31.0\"]",
// string e bool
"/bookstore/book/sell[\"\" != (3 > 1)]",
"/bookstore/book/sell[\"\" = (0 > 1)]",
"/bookstore/book/sell[\"abc\" = (3 > 2)]",
// string e string
"/bookstore/book/sell[\"\" = \"\"]",
"/bookstore/book/sell[\"abc\" = \"abc\"]",
"/bookstore/book/sell[\"abc\" != \"bc\"]",
// string e double
"/bookstore/book/sell[\"2\" = 2]",
// compare
// bool c double
"/bookstore/book/sell[(1 < 2) >= 1.0]",
"/bookstore/book/sell[(1 > 2) >= -1]",
"/bookstore/book/sell[(1 < 2) < 3.3]",
// string c bool
"/bookstore/book/sell[\"3\" >= (2 > 1)]",
// string c double
"/bookstore/book/sell[\"22.1\" >= 1]",
"/bookstore/book/sell[\"2\" >= 1]",
// string c string
"/bookstore/book/sell[\"abc\" <= \"efg\"]",
"/bookstore/book/sell[\"abc\" < \"xyz\"]",
// bool c bool
"/bookstore/book/sell[(1 > 2) < (1 < 2)]",
"/bookstore/book/sell[(1 > 2) >= (3 < 2)]",
// double c double
"/bookstore/book/sell[1 < 2]",
"/bookstore/book/sell[1 <= 2]",
"/bookstore/book/sell[189 <= 2222]",
};
ObString expect_predicate_parse_result[PREDICATE_TEST_COUNT] = {
"/bookstore/book/sell[0 | /bookstore/book]",
"/bookstore/book/sell[/bookstore/book | 0]",
"/bookstore/book/sell[/a | /bookstore]",
"/bookstore/book/sell[/bookstore/book/sell = \"\"]",
"/bookstore/book/sell[3 > 5 = /bookstore/book/abc]",
"/bookstore/book/sell[/bookstore/book/abc = 3 > 5]",
"/bookstore/book/sell[/bookstore/book/year < 2]",
"/bookstore/book/sell[/bookstore/book/year = 2003]",
"/bookstore/book/sell[/bookstore/book/author > \"x\"]",
"/bookstore/book/sell[/bookstore/book/author < \"x\"]",
"/bookstore/book/sell[/bookstore/book/author = 3 > 1]",
"/bookstore/book/sell[/bookstore/book/title = /bookstore/book/author]",
"/bookstore/book/sell[1 | 0]",
"/bookstore/book/sell[\"abc\" | 0]",
"/bookstore/book/sell[1 > 0 | 0]",
"/bookstore/book/sell[0 < 2 and \"abc\"]",
"/bookstore/book/sell[0 < 2 and \"x\"]",
"/bookstore/book/sell[\"\" or 1 > -1]",
"/bookstore/book/sell[1 or 1 > 0]",
"/bookstore/book/sell[0 or 1 > 0]",
"/bookstore/book/sell[2 and 1 > 0]",
"/bookstore/book/sell[0 < 2 and -1]",
"/bookstore/book/sell[0 < 2 and 3]",
"/bookstore/book/sell[1 > 2 or 0.12 < 9]",
"/bookstore/book/sell[1 < 2 and 3 < 9]",
"/bookstore/book/sell[1 < 2 = -123]",
"/bookstore/book/sell[1 < 2 = 123]",
"/bookstore/book/sell[1 < 2 = \"true\"]",
"/bookstore/book/sell[1 < 2 = \"1\"]",
"/bookstore/book/sell[1 > 2 != \"true\"]",
"/bookstore/book/sell[0 != 1 < 2]",
"/bookstore/book/sell[-1 = 1 < 2]",
"/bookstore/book/sell[31 = 1 < 2]",
"/bookstore/book/sell[31 = \"31.0\"]",
"/bookstore/book/sell[\"\" != 3 > 1]",
"/bookstore/book/sell[\"\" = 0 > 1]",
"/bookstore/book/sell[\"abc\" = 3 > 2]",
"/bookstore/book/sell[\"\" = \"\"]",
"/bookstore/book/sell[\"abc\" = \"abc\"]",
"/bookstore/book/sell[\"abc\" != \"bc\"]",
"/bookstore/book/sell[\"2\" = 2]",
"/bookstore/book/sell[1 < 2 >= 1]",
"/bookstore/book/sell[1 > 2 >= -1]",
"/bookstore/book/sell[1 < 2 < 3.3]",
"/bookstore/book/sell[\"3\" >= 2 > 1]",
"/bookstore/book/sell[\"22.1\" >= 1]",
"/bookstore/book/sell[\"2\" >= 1]",
"/bookstore/book/sell[\"abc\" <= \"efg\"]",
"/bookstore/book/sell[\"abc\" < \"xyz\"]",
"/bookstore/book/sell[1 > 2 < 1 < 2]",
"/bookstore/book/sell[1 > 2 >= 3 < 2]",
"/bookstore/book/sell[1 < 2]",
"/bookstore/book/sell[1 <= 2]",
"/bookstore/book/sell[189 <= 2222]",
};
TEST_F(TestXPathFilter, test_in_predicate)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObString xml_text("<bookstore><book category=\"a\"><title lang=\"x\">abc</title> <author>def</author><year month=\"1\">1</year><price>false</price></book><book category=\"b\"><title lang=\"y\">def</title><author>xyz</author><year month=\"2\">2005</year><price>30.00</price></book><book category=\"c\"><title lang=\"en\">xyz</title><author>abc</author><year>2005</year><price>29.99</price></book><book category=\"WEB\"><title lang=\"en\">Learning XML</title><year>2003</year><sell></sell></book></bookstore>");
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
for (int i = 0; i < PREDICATE_TEST_COUNT; i++) {
if (enter_predicate[i].empty()) break;
ObString enter_xpath = enter_predicate[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(expect_predicate_parse_result[i], parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlTreeTextWriter writer(&allocator);
ObXmlNode* xnode = static_cast<ObXmlNode*>(res);
writer.visit(xnode);
ObString s = writer.get_xml_text();
ObString predicate_ans("<sell></sell>");
std::cout << "Test NO." << i << " : " << s.ptr() << std::endl;
ASSERT_EQ(s, predicate_ans);
}
}
ObString enter_false_predicate[PREDICATE_FALSE_TEST_COUNT] = {
// node-set
"/bookstore/book/sell[/a | 0]",
"/bookstore/book/sell[/a | 1]",
"/bookstore/book/sell[/bookstore/book/abc != (3 > 3)]",
"/bookstore/book/sell[/bookstore/book/title < 2]",
"/bookstore/book/sell[/bookstore/book/year = \"abc\"]",
"/bookstore/book/sell[/bookstore/book/year > 10086]",
"/bookstore/book/sell[/bookstore/book/year = (3 > 3)]",
"/bookstore/book/sell[/bookstore/book = \"xyz\"]",
"/bookstore/book/sell[/bookstore/book/abc = \"\"]",
"/bookstore/book/sell[/bookstore/book/abc > \"\"]",
"/bookstore/book/sell[/abc = /xyz]",
// union
"/bookstore/book/sell[0 | 1]",
"/bookstore/book/sell[\"\" | 0]",
"/bookstore/book/sell[\"\" | 1]",
"/bookstore/book/sell[\"\" | 3 > 2]",
// logic compare
"/bookstore/book/sell[(20 < 2) and (3 < 9)]",
"/bookstore/book/sell[(20 < 2) or (19 < 9)]",
"/bookstore/book/sell[1 and 1 > 2]",
"/bookstore/book/sell[0 < 2 and 0]",
"/bookstore/book/sell[4 < 2 or 0]",
"/bookstore/book/sell[0 or -2 > -1]",
"/bookstore/book/sell[\"\" and 1 > -1]",
"/bookstore/book/sell[\"\" or 1 > 2]",
// compare
"/bookstore/book/sell[(1 < 2) = 0]",
"/bookstore/book/sell[(1 < 2) != 123]",
"/bookstore/book/sell[0 = (1 < 2)]",
"/bookstore/book/sell[100 = \"101\"]",
"/bookstore/book/sell[31 != \"31.0\"]",
"/bookstore/book/sell[\"\" = (3 > 1)]",
"/bookstore/book/sell[\"\" >= \"\"]",
"/bookstore/book/sell[\"\" != \"\"]",
"/bookstore/book/sell[\"abc\" < \"\"]",
"/bookstore/book/sell[\"\" <= \"efg\"]",
"/bookstore/book/sell[\"abc\" <= 1]",
"/bookstore/book/sell[\"abc\" = \"efg\"]",
"/bookstore/book/sell[\"abc\" = \"a bc\"]",
"/bookstore/book/sell[\"2\" <= 1]",
"/bookstore/book/sell[(1 < 2) >= 1.1]",
"/bookstore/book/sell[(1 > 2) <= -1]",
"/bookstore/book/sell[\"abc\" <= (2 > 1)]",
"/bookstore/book/sell[\"abc\" >= (2 > 1)]",
"/bookstore/book/sell[1 and \"\"]",
"/bookstore/book/sell[(1 > 2) > (1 < 2)]",
"/bookstore/book/sell[(1 > 2) != (3 < 2)]",
"/bookstore/book/sell[1.1 > 2]",
"/bookstore/book/sell[189.23 > 222.2]",
"/bookstore/book/sell[1 != 1.0]",
};
ObString expect_false_predicate_parse_result[PREDICATE_FALSE_TEST_COUNT] = {
"/bookstore/book/sell[/a | 0]",
"/bookstore/book/sell[/a | 1]",
"/bookstore/book/sell[/bookstore/book/abc != 3 > 3]",
"/bookstore/book/sell[/bookstore/book/title < 2]",
"/bookstore/book/sell[/bookstore/book/year = \"abc\"]",
"/bookstore/book/sell[/bookstore/book/year > 10086]",
"/bookstore/book/sell[/bookstore/book/year = 3 > 3]",
"/bookstore/book/sell[/bookstore/book = \"xyz\"]",
"/bookstore/book/sell[/bookstore/book/abc = \"\"]",
"/bookstore/book/sell[/bookstore/book/abc > \"\"]",
"/bookstore/book/sell[/abc = /xyz]",
"/bookstore/book/sell[0 | 1]",
"/bookstore/book/sell[\"\" | 0]",
"/bookstore/book/sell[\"\" | 1]",
"/bookstore/book/sell[\"\" | 3 > 2]",
"/bookstore/book/sell[20 < 2 and 3 < 9]",
"/bookstore/book/sell[20 < 2 or 19 < 9]",
"/bookstore/book/sell[1 and 1 > 2]",
"/bookstore/book/sell[0 < 2 and 0]",
"/bookstore/book/sell[4 < 2 or 0]",
"/bookstore/book/sell[0 or -2 > -1]",
"/bookstore/book/sell[\"\" and 1 > -1]",
"/bookstore/book/sell[\"\" or 1 > 2]",
"/bookstore/book/sell[1 < 2 = 0]",
"/bookstore/book/sell[1 < 2 != 123]",
"/bookstore/book/sell[0 = 1 < 2]",
"/bookstore/book/sell[100 = \"101\"]",
"/bookstore/book/sell[31 != \"31.0\"]",
"/bookstore/book/sell[\"\" = 3 > 1]",
"/bookstore/book/sell[\"\" >= \"\"]",
"/bookstore/book/sell[\"\" != \"\"]",
"/bookstore/book/sell[\"abc\" < \"\"]",
"/bookstore/book/sell[\"\" <= \"efg\"]",
"/bookstore/book/sell[\"abc\" <= 1]",
"/bookstore/book/sell[\"abc\" = \"efg\"]",
"/bookstore/book/sell[\"abc\" = \"a bc\"]",
"/bookstore/book/sell[\"2\" <= 1]",
"/bookstore/book/sell[1 < 2 >= 1.1]",
"/bookstore/book/sell[1 > 2 <= -1]",
"/bookstore/book/sell[\"abc\" <= 2 > 1]",
"/bookstore/book/sell[\"abc\" >= 2 > 1]",
"/bookstore/book/sell[1 and \"\"]",
"/bookstore/book/sell[1 > 2 > 1 < 2]",
"/bookstore/book/sell[1 > 2 != 3 < 2]",
"/bookstore/book/sell[1.1 > 2]",
"/bookstore/book/sell[189.23 > 222.2]",
"/bookstore/book/sell[1 != 1]",
};
TEST_F(TestXPathFilter, test_false_in_predicate)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObString xml_text("<bookstore><book category=\"a\"><title lang=\"x\">abc</title> <author>def</author><year month=\"1\">1</year><price>false</price></book><book category=\"b\"><title lang=\"y\">def</title><author>xyz</author><year month=\"2\">2005</year><price>30.00</price></book><book category=\"c\"><title lang=\"en\">xyz</title><author>abc</author><year>2005</year><price>29.99</price></book><book category=\"WEB\"><title lang=\"en\">Learning XML</title><year>2003</year><sell></sell></book></bookstore>");
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
for (int i = 0; i < PREDICATE_FALSE_TEST_COUNT; i++) {
if (enter_false_predicate[i].empty()) break;
INIT_SUCC(ret);
ObString enter_xpath = enter_false_predicate[i];
std::cout << "TEST: " << i << std::endl;
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
std::cout << expect_false_predicate_parse_result[i].ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(expect_false_predicate_parse_result[i], parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
ASSERT_EQ(OB_ITER_END, ret);
}
}
# define COMPARE_TEST_COUNT 7
ObString enter_compare[COMPARE_TEST_COUNT] = {
"1 = 2", "0=0", "1 < 2", "1 <= 2", "2 != 3",
// "1 + 2", "25 + 100 = 125", "2 + 10 < 1",
"\"abc\" = \"abc\"", "\"abc\" != \"y\"",
//"1.1 + 2.2 = 3.3"
};
ObString expect_parse_result[COMPARE_TEST_COUNT] = {
"1 = 2", "0 = 0", "1 < 2", "1 <= 2", "2 != 3",
//"1 + 2", "25 + 100 = 125", "2 + 10 < 1",
"\"abc\" = \"abc\"", "\"abc\" != \"y\"",
//"1.1 + 2.2 = 3.3"
};
ObString compare_ans[COMPARE_TEST_COUNT] = {
"false", "true", "true", "true", "true",
"true", "true",
//"true"
};
TEST_F(TestXPathFilter, test_equal_compare)
{
INIT_SUCC(ret);
ObArenaAllocator allocator(ObModIds::TEST);
ObString xml_text("<root>root</root>");
ObXmlDocument* doc = nullptr;
ObMulModeMemCtx* ctx = nullptr;
ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS);
ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc);
ASSERT_EQ(OB_SUCCESS, ret);
for (int i = 1; i < COMPARE_TEST_COUNT; i++) {
ObString enter_xpath = enter_compare[i];
std::cout << enter_xpath.ptr() << std::endl;
ObString default_ns;
ObPathVarObject pass;
ObDatum data;
data.set_string("ns2");
ret = pass.add("h", &data);
ASSERT_EQ(OB_SUCCESS, ret);
ObPathExprIter pathiter;
pathiter.init(ctx, enter_xpath, default_ns, doc, &pass);
ret = pathiter.open();
ASSERT_EQ(OB_SUCCESS, ret);
ObJsonBuffer buf(&allocator);
ret = pathiter.path_node_->node_to_string(buf);
std::cout << buf.ptr() << std::endl;
ASSERT_EQ(OB_SUCCESS, ret);
ObString parse_result(buf.ptr());
ASSERT_EQ(expect_parse_result[i], parse_result);
ASSERT_EQ(OB_SUCCESS, ret);
ObIMulModeBase* res;
ret = pathiter.get_next_node(res);
ASSERT_EQ(OB_SUCCESS, ret);
ObXmlTreeTextWriter writer(&allocator);
ObXmlNode* xnode = static_cast<ObXmlNode*>(res);
writer.visit(xnode);
ObString s = writer.get_xml_text();
std::cout << "Test NO." << i << " : " << s.ptr() << std::endl;
std::cout << "compare_ans[" << i << "] : " << compare_ans[i].ptr() << std::endl;
ASSERT_EQ(s, compare_ans[i]);
}
}
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
// system("rm -f test_xpath_filter.log");
// OB_LOGGER.set_file_name("test_xpath_filter.log");
// OB_LOGGER.set_log_level("INFO");
return RUN_ALL_TESTS();
}

View File

@ -280,7 +280,8 @@ not not a > b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -327,7 +328,8 @@ not not a > b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -403,7 +405,8 @@ not a > b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -450,7 +453,8 @@ not a > b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -526,7 +530,8 @@ not a = b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -573,7 +578,8 @@ not a = b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -649,7 +655,8 @@ not a < b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -696,7 +703,8 @@ not a < b
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -773,7 +781,8 @@ not a is true
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_BOOL",
@ -910,7 +919,8 @@ not a between 1 and 100
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -1017,7 +1027,8 @@ not a between 1 and 100
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -2084,7 +2095,8 @@ not(not(a))
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -2224,7 +2236,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -2329,7 +2342,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2405,7 +2419,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -2510,7 +2525,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2586,7 +2602,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -2691,7 +2708,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2767,7 +2785,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2843,7 +2862,8 @@ A or (A And B) or (A And C)
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}

View File

@ -1223,7 +1223,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
"default": {
"item_type":"T_VARCHAR",
@ -1834,7 +1835,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
],
"distinct":false,
@ -1925,7 +1927,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_QUERY",
@ -2166,7 +2169,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -2213,7 +2217,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2501,7 +2506,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
[21] 10+10
{
@ -2784,7 +2790,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -2831,7 +2838,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -2906,7 +2914,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -2953,7 +2962,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -3033,7 +3043,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -3141,7 +3152,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -3247,7 +3259,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -3294,7 +3307,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -3374,7 +3388,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_OP_ROW",
@ -3628,7 +3643,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -3735,7 +3751,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -3934,7 +3951,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}
@ -4013,7 +4031,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_OP_ADD",
@ -4209,7 +4228,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_OP_ADD",
@ -4375,7 +4395,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_INT",
@ -4602,7 +4623,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
},
@ -4777,7 +4799,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_VARCHAR",
@ -5206,7 +5229,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -5253,7 +5277,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_VARCHAR",
@ -5391,7 +5416,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
},
{
"item_type":"T_REF_COLUMN",
@ -5438,7 +5464,8 @@
"is_unique_key_column":false,
"is_mul_key_column":false,
"is_strict_json_column":0,
"srs_id":-1
"srs_id":-1,
"udt_set_id":0
}
]
}

View File

@ -55,9 +55,9 @@ public:
// Every ObObjType from ObTinyIntType to ObHexStringType inclusive.
// Skip ObNullType and ObExtendType because for external usage, a column type
// can't be NULL or NOP.
ObObjType not_test_type[8] = {
ObObjType not_test_type[9] = {
ObNullType, ObExtendType, ObUnknownType, ObEnumInnerType, ObSetInnerType,
ObNumberFloatType, ObURowIDType, ObLobType};
ObNumberFloatType, ObURowIDType, ObLobType, ObUserDefinedSQLType};
static const int64_t column_num = ObMaxType - sizeof(not_test_type) / sizeof(ObObjType);
public:
TestNewRowReader()

View File

@ -34,6 +34,7 @@ struct ObAddrPair {
ObAddr src_;
ObAddr dst_;
int64_t hash() const { return src_.hash() ^ dst_.hash(); }
int hash(uint64_t &hash_val) const { hash_val = hash(); return OB_SUCCESS; }
};
public:
MsgBus() {