[FEAT MERGE] OB Support XMLType
Co-authored-by: simonjoylet <simonjoylet@gmail.com>
This commit is contained in:
@ -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; }
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
470
unittest/share/test_xml_bin.cpp
Normal file
470
unittest/share/test_xml_bin.cpp
Normal 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();
|
||||
}
|
||||
2745
unittest/share/test_xml_parser.cpp
Normal file
2745
unittest/share/test_xml_parser.cpp
Normal file
File diff suppressed because it is too large
Load Diff
740
unittest/share/test_xml_tree.cpp
Normal file
740
unittest/share/test_xml_tree.cpp
Normal 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();
|
||||
}
|
||||
1106
unittest/share/test_xml_tree_base.cpp
Normal file
1106
unittest/share/test_xml_tree_base.cpp
Normal file
File diff suppressed because it is too large
Load Diff
339
unittest/share/test_xml_utils.h
Normal file
339
unittest/share/test_xml_utils.h
Normal 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_
|
||||
1977
unittest/share/test_xpath.cpp
Normal file
1977
unittest/share/test_xpath.cpp
Normal file
File diff suppressed because it is too large
Load Diff
675
unittest/share/test_xpath_filter.cpp
Normal file
675
unittest/share/test_xpath_filter.cpp
Normal 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();
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user