Index: ql/src/test/queries/clientpositive/udf_xpath_short.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_short.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_short.q (revision 0)
@@ -0,0 +1,11 @@
+DESCRIBE FUNCTION xpath_short ;
+DESCRIBE FUNCTION EXTENDED xpath_short ;
+
+SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ;
+SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1 ;
+SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1 ;
+SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1 ;
+SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
\ No newline at end of file
Index: ql/src/test/queries/clientpositive/udf_xpath_long.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_long.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_long.q (revision 0)
@@ -0,0 +1,11 @@
+DESCRIBE FUNCTION xpath_long ;
+DESCRIBE FUNCTION EXTENDED xpath_long ;
+
+SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ;
+SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1 ;
+SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1 ;
+SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1 ;
+SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
Index: ql/src/test/queries/clientpositive/udf_xpath.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath.q (revision 0)
@@ -0,0 +1,8 @@
+DESCRIBE FUNCTION xpath ;
+DESCRIBE FUNCTION EXTENDED xpath ;
+
+SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1 ;
+SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1 ;
+SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1 ;
+SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1 ;
+SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1 ;
\ No newline at end of file
Index: ql/src/test/queries/clientpositive/udf_xpath_string.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_string.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_string.q (revision 0)
@@ -0,0 +1,11 @@
+DESCRIBE FUNCTION xpath_string ;
+DESCRIBE FUNCTION EXTENDED xpath_string ;
+
+SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1 ;
+SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1 ;
+SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1 ;
+SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1 ;
+SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1 ;
+SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1 ;
+SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1 ;
Index: ql/src/test/queries/clientpositive/udf_xpath_double.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_double.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_double.q (revision 0)
@@ -0,0 +1,14 @@
+DESCRIBE FUNCTION xpath_number ;
+DESCRIBE FUNCTION EXTENDED xpath_number ;
+
+DESCRIBE FUNCTION xpath_double ;
+DESCRIBE FUNCTION EXTENDED xpath_double ;
+
+SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ;
+SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1 ;
+SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1 ;
+SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1 ;
+SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
\ No newline at end of file
Index: ql/src/test/queries/clientpositive/udf_xpath_int.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_int.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_int.q (revision 0)
@@ -0,0 +1,11 @@
+DESCRIBE FUNCTION xpath_int ;
+DESCRIBE FUNCTION EXTENDED xpath_int ;
+
+SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ;
+SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1 ;
+SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1 ;
+SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1 ;
+SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
\ No newline at end of file
Index: ql/src/test/queries/clientpositive/udf_xpath_boolean.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_boolean.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_boolean.q (revision 0)
@@ -0,0 +1,9 @@
+DESCRIBE FUNCTION xpath_boolean ;
+DESCRIBE FUNCTION EXTENDED xpath_boolean ;
+
+SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1 ;
+SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1 ;
+SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1 ;
+SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1 ;
+SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1 ;
Index: ql/src/test/queries/clientpositive/udf_xpath_float.q
===================================================================
--- ql/src/test/queries/clientpositive/udf_xpath_float.q (revision 0)
+++ ql/src/test/queries/clientpositive/udf_xpath_float.q (revision 0)
@@ -0,0 +1,11 @@
+DESCRIBE FUNCTION xpath_float ;
+DESCRIBE FUNCTION EXTENDED xpath_float ;
+
+SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1 ;
+SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1 ;
+SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1 ;
+SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1 ;
+SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1 ;
+SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1 ;
+SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1 ;
\ No newline at end of file
Index: ql/src/test/results/clientpositive/show_functions.q.out
===================================================================
--- ql/src/test/results/clientpositive/show_functions.q.out (revision 896321)
+++ ql/src/test/results/clientpositive/show_functions.q.out (working copy)
@@ -121,6 +121,15 @@
variance
weekofyear
when
+xpath
+xpath_boolean
+xpath_double
+xpath_float
+xpath_int
+xpath_long
+xpath_number
+xpath_short
+xpath_string
year
|
~
@@ -160,6 +169,7 @@
to_date
ucase
variance
+xpath_double
PREHOOK: query: SHOW FUNCTIONS 'log.*'
PREHOOK: type: SHOWFUNCTIONS
POSTHOOK: query: SHOW FUNCTIONS 'log.*'
Index: ql/src/test/results/clientpositive/udf_xpath_boolean.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_boolean.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_boolean.q.out (revision 0)
@@ -0,0 +1,69 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_boolean
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_boolean
+POSTHOOK: type: DESCFUNCTION
+xpath_boolean(xml, xpath) - Evaluates a boolean xpath expression, or true if element found
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_boolean
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_boolean
+POSTHOOK: type: DESCFUNCTION
+xpath_boolean(xml, xpath) - Evaluates a boolean xpath expression, or true if element found
+Example:
+ > SELECT xpath_boolean('1','a/b') FROM src LIMIT 1;
+ true
+ > SELECT xpath_boolean('1','a/b = 2') FROM src LIMIT 1;
+ false
+PREHOOK: query: SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1945419737/10000
+POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1945419737/10000
+true
+PREHOOK: query: SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1442252861/10000
+POSTHOOK: query: SELECT xpath_boolean ('b', 'a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1442252861/10000
+false
+PREHOOK: query: SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2101627340/10000
+POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b = "b"') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2101627340/10000
+true
+PREHOOK: query: SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/304332506/10000
+POSTHOOK: query: SELECT xpath_boolean ('b', 'a/b = "c"') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/304332506/10000
+false
+PREHOOK: query: SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1021196134/10000
+POSTHOOK: query: SELECT xpath_boolean ('10', 'a/b < 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1021196134/10000
+false
+PREHOOK: query: SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2134445341/10000
+POSTHOOK: query: SELECT xpath_boolean ('10', 'a/b = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2134445341/10000
+true
Index: ql/src/test/results/clientpositive/udf_xpath_int.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_int.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_int.q.out (revision 0)
@@ -0,0 +1,85 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_int
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_int
+POSTHOOK: type: DESCFUNCTION
+xpath_int(xml, xpath) - Returns an integer value within xml that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_int
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_int
+POSTHOOK: type: DESCFUNCTION
+xpath_int(xml, xpath) - Returns an integer value within xml that matches the xpath expression
+Example:
+ > SELECT xpath_int('12','sum(a/b)') FROM src LIMIT 1;
+ 3
+PREHOOK: query: SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2012913246/10000
+POSTHOOK: query: SELECT xpath_int ('this is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2012913246/10000
+0
+PREHOOK: query: SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/861975272/10000
+POSTHOOK: query: SELECT xpath_int ('this 2 is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/861975272/10000
+0
+PREHOOK: query: SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/541934033/10000
+POSTHOOK: query: SELECT xpath_int ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/541934033/10000
+2147483647
+PREHOOK: query: SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/666093838/10000
+POSTHOOK: query: SELECT xpath_int ('try a boolean', 'a = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/666093838/10000
+0
+PREHOOK: query: SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1075222896/10000
+POSTHOOK: query: SELECT xpath_int ('1248', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1075222896/10000
+1
+PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1252115455/10000
+POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/*)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1252115455/10000
+15
+PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/36642850/10000
+POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/b)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/36642850/10000
+7
+PREHOOK: query: SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1694899837/10000
+POSTHOOK: query: SELECT xpath_int ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1694899837/10000
+5
Index: ql/src/test/results/clientpositive/udf_xpath.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath.q.out (revision 0)
@@ -0,0 +1,62 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath
+POSTHOOK: type: DESCFUNCTION
+xpath(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath
+POSTHOOK: type: DESCFUNCTION
+xpath(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression
+Example:
+ > SELECT xpath('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1
+ []
+ > SELECT xpath('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1
+ ["b1","b2","b3"]
+ > SELECT xpath('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1
+ ["c1","c2"]
+PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1416181007/10000
+POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1416181007/10000
+[]
+PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1851591863/10000
+POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*/text()') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1851591863/10000
+["b1","b2","b3","c1","c2"]
+PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/113811557/10000
+POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/113811557/10000
+["b1","b2","b3"]
+PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1674548693/10000
+POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1674548693/10000
+["c1","c2"]
+PREHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/378718949/10000
+POSTHOOK: query: SELECT xpath ('b1b2b3c1c2', 'a/*[@class="bb"]/text()') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/378718949/10000
+["b1","c1"]
Index: ql/src/test/results/clientpositive/udf_xpath_float.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_float.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_float.q.out (revision 0)
@@ -0,0 +1,85 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_float
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_float
+POSTHOOK: type: DESCFUNCTION
+xpath_float(xml, xpath) - Returns a float value that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_float
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_float
+POSTHOOK: type: DESCFUNCTION
+xpath_float(xml, xpath) - Returns a float value that matches the xpath expression
+Example:
+ > SELECT xpath_float('12','sum(a/b)') FROM src LIMIT 1;
+ 3.0
+PREHOOK: query: SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/319850862/10000
+POSTHOOK: query: SELECT xpath_float ('this is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/319850862/10000
+NaN
+PREHOOK: query: SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1472406597/10000
+POSTHOOK: query: SELECT xpath_float ('this 2 is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1472406597/10000
+NaN
+PREHOOK: query: SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1929834936/10000
+POSTHOOK: query: SELECT xpath_float ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1929834936/10000
+8.0E19
+PREHOOK: query: SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2143124123/10000
+POSTHOOK: query: SELECT xpath_float ('try a boolean', 'a = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2143124123/10000
+0.0
+PREHOOK: query: SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1347257342/10000
+POSTHOOK: query: SELECT xpath_float ('1248', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1347257342/10000
+1.0
+PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1226872791/10000
+POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/*)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1226872791/10000
+15.0
+PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1024930211/10000
+POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/b)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1024930211/10000
+7.0
+PREHOOK: query: SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1463047098/10000
+POSTHOOK: query: SELECT xpath_float ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1463047098/10000
+5.0
Index: ql/src/test/results/clientpositive/udf_xpath_long.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_long.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_long.q.out (revision 0)
@@ -0,0 +1,85 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_long
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_long
+POSTHOOK: type: DESCFUNCTION
+xpath_long(xml, xpath) - Returns a long value within xml that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_long
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_long
+POSTHOOK: type: DESCFUNCTION
+xpath_long(xml, xpath) - Returns a long value within xml that matches the xpath expression
+Example:
+ > SELECT xpath_long('12','sum(a/b)') FROM src LIMIT 1;
+ 3
+PREHOOK: query: SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184030015/10000
+POSTHOOK: query: SELECT xpath_long ('this is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184030015/10000
+0
+PREHOOK: query: SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/431085143/10000
+POSTHOOK: query: SELECT xpath_long ('this 2 is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/431085143/10000
+0
+PREHOOK: query: SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/771414951/10000
+POSTHOOK: query: SELECT xpath_long ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/771414951/10000
+9223372036854775807
+PREHOOK: query: SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2025818159/10000
+POSTHOOK: query: SELECT xpath_long ('try a boolean', 'a = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/2025818159/10000
+0
+PREHOOK: query: SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1726288893/10000
+POSTHOOK: query: SELECT xpath_long ('1248', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1726288893/10000
+1
+PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/660894673/10000
+POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/*)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/660894673/10000
+15
+PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1698584685/10000
+POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/b)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1698584685/10000
+7
+PREHOOK: query: SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/517926504/10000
+POSTHOOK: query: SELECT xpath_long ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/517926504/10000
+5
Index: ql/src/test/results/clientpositive/udf_xpath_double.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_double.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_double.q.out (revision 0)
@@ -0,0 +1,98 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_number
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_number
+POSTHOOK: type: DESCFUNCTION
+xpath_number(xml, xpath) - Returns a double value that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_number
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_number
+POSTHOOK: type: DESCFUNCTION
+xpath_number(xml, xpath) - Returns a double value that matches the xpath expression
+Example:
+ > SELECT xpath_number('12','sum(a/b)') FROM src LIMIT 1;
+ 3.0
+PREHOOK: query: DESCRIBE FUNCTION xpath_double
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_double
+POSTHOOK: type: DESCFUNCTION
+xpath_double(xml, xpath) - Returns a double value that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_double
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_double
+POSTHOOK: type: DESCFUNCTION
+xpath_double(xml, xpath) - Returns a double value that matches the xpath expression
+Example:
+ > SELECT xpath_double('12','sum(a/b)') FROM src LIMIT 1;
+ 3.0
+PREHOOK: query: SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/829340064/10000
+POSTHOOK: query: SELECT xpath_double ('this is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/829340064/10000
+NaN
+PREHOOK: query: SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1649714698/10000
+POSTHOOK: query: SELECT xpath_double ('this 2 is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1649714698/10000
+NaN
+PREHOOK: query: SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1707207620/10000
+POSTHOOK: query: SELECT xpath_double ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1707207620/10000
+8.0E19
+PREHOOK: query: SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1655907900/10000
+POSTHOOK: query: SELECT xpath_double ('try a boolean', 'a = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1655907900/10000
+0.0
+PREHOOK: query: SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1817321728/10000
+POSTHOOK: query: SELECT xpath_double ('1248', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1817321728/10000
+1.0
+PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1885044524/10000
+POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/*)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1885044524/10000
+15.0
+PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/214201114/10000
+POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/b)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/214201114/10000
+7.0
+PREHOOK: query: SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/868608861/10000
+POSTHOOK: query: SELECT xpath_double ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/868608861/10000
+5.0
Index: ql/src/test/results/clientpositive/udf_xpath_short.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_short.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_short.q.out (revision 0)
@@ -0,0 +1,85 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_short
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_short
+POSTHOOK: type: DESCFUNCTION
+xpath_short(xml, xpath) - Returns a short value that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_short
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_short
+POSTHOOK: type: DESCFUNCTION
+xpath_short(xml, xpath) - Returns a short value that matches the xpath expression
+Example:
+ > SELECT xpath_short('12','sum(a/b)') FROM src LIMIT 1;
+ 3
+PREHOOK: query: SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/43003016/10000
+POSTHOOK: query: SELECT xpath_short ('this is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/43003016/10000
+0
+PREHOOK: query: SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/420344977/10000
+POSTHOOK: query: SELECT xpath_short ('this 2 is not a number', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/420344977/10000
+0
+PREHOOK: query: SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/542896770/10000
+POSTHOOK: query: SELECT xpath_short ('200000000040000000000', 'a/b * a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/542896770/10000
+-1
+PREHOOK: query: SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1699233281/10000
+POSTHOOK: query: SELECT xpath_short ('try a boolean', 'a = 10') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1699233281/10000
+0
+PREHOOK: query: SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1504264750/10000
+POSTHOOK: query: SELECT xpath_short ('1248', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1504264750/10000
+1
+PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1166661278/10000
+POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/*)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1166661278/10000
+15
+PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/633201724/10000
+POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/b)') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/633201724/10000
+7
+PREHOOK: query: SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1825578599/10000
+POSTHOOK: query: SELECT xpath_short ('1248', 'sum(a/b[@class="odd"])') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1825578599/10000
+5
Index: ql/src/test/results/clientpositive/udf_xpath_string.q.out
===================================================================
--- ql/src/test/results/clientpositive/udf_xpath_string.q.out (revision 0)
+++ ql/src/test/results/clientpositive/udf_xpath_string.q.out (revision 0)
@@ -0,0 +1,91 @@
+PREHOOK: query: DESCRIBE FUNCTION xpath_string
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION xpath_string
+POSTHOOK: type: DESCFUNCTION
+xpath_string(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_string
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED xpath_string
+POSTHOOK: type: DESCFUNCTION
+xpath_string(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression
+Example:
+ > SELECT xpath_string('bcc','a/c') FROM src LIMIT 1;
+ 'cc'
+ > SELECT xpath_string('b1b2','a/b') FROM src LIMIT 1;
+ 'b1'
+ > SELECT xpath_string('b1b2','a/b[2]') FROM src LIMIT 1;
+ 'b2'
+ > SELECT xpath_string('b1b2','a') FROM src LIMIT 1;
+ 'b1b2'
+PREHOOK: query: SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/940874235/10000
+POSTHOOK: query: SELECT xpath_string ('bbcc', 'a') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/940874235/10000
+bbcc
+PREHOOK: query: SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1447930808/10000
+POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1447930808/10000
+bb
+PREHOOK: query: SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1556430756/10000
+POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/c') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1556430756/10000
+cc
+PREHOOK: query: SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1353144403/10000
+POSTHOOK: query: SELECT xpath_string ('bbcc', 'a/d') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1353144403/10000
+
+PREHOOK: query: SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1184684106/10000
+POSTHOOK: query: SELECT xpath_string ('b1b2', '//b') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1184684106/10000
+b1
+PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184679872/10000
+POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[1]') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/184679872/10000
+b1
+PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1295801804/10000
+POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[2]') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/1295801804/10000
+b2
+PREHOOK: query: SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/885790551/10000
+POSTHOOK: query: SELECT xpath_string ('b1b2', 'a/b[@id="b_2"]') FROM src LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: file:/Users/patrick/Documents/workspace/hive-trunk/build/ql/tmp/885790551/10000
+b2
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java (revision 0)
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_long",
+ value = "_FUNC_(xml, xpath) - Returns a long value that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n"
+ + " 3")
+public class UDFXPathLong extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+
+ public long evaluate(String xml, String path) {
+ return xpath.evalNumber(xml, path).longValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathLong.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java (revision 0)
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_int",
+ value = "_FUNC_(xml, xpath) - Returns an integer value that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n"
+ + " 3")
+public class UDFXPathInteger extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+
+ public int evaluate(String xml, String path) {
+ return xpath.evalNumber(xml, path).intValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathInteger.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java (revision 0)
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+import org.apache.hadoop.io.Text;
+
+@description(name = "xpath_string",
+ value = "_FUNC_(xml, xpath) - Returns the text contents of the first xml node that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('bcc','a/c') FROM src LIMIT 1;\n"
+ + " 'cc'\n"
+ + " > SELECT _FUNC_('b1b2','a/b') FROM src LIMIT 1;\n"
+ + " 'b1'\n"
+ + " > SELECT _FUNC_('b1b2','a/b[2]') FROM src LIMIT 1;\n"
+ + " 'b2'\n"
+ + " > SELECT _FUNC_('b1b2','a') FROM src LIMIT 1;\n"
+ + " 'b1b2'"
+ )
+public class UDFXPathString extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+ private Text result = new Text();
+
+ public Text evaluate(String xml, String path) {
+ String s = xpath.evalString(xml, path);
+ if (s == null) {
+ return null;
+ }
+
+ result.set(s);
+ return result;
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathString.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java (revision 0)
@@ -0,0 +1,112 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.description;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.Text;
+import org.w3c.dom.NodeList;
+
+@description(
+ name = "xpath",
+ value = "_FUNC_(xml, xpath) - Returns a string array of values within xml nodes that match the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('b1b2b3c1c2', 'a/text()') FROM src LIMIT 1\n"
+ + " []\n"
+ + " > SELECT _FUNC_('b1b2b3c1c2', 'a/b/text()') FROM src LIMIT 1\n"
+ + " [\"b1\",\"b2\",\"b3\"]\n"
+ + " > SELECT _FUNC_('b1b2b3c1c2', 'a/c/text()') FROM src LIMIT 1\n"
+ + " [\"c1\",\"c2\"]"
+ )
+public class GenericUDFXPath extends GenericUDF {
+
+ private static final List emptyResult = Collections.emptyList();
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+ private List result = new ArrayList(10);
+
+ private Converter converterArg0;
+ private Converter converterArg1;
+
+ @Override
+ public ObjectInspector initialize(ObjectInspector[] arguments)
+ throws UDFArgumentException {
+ if (arguments.length != 2) {
+ throw new UDFArgumentException("Invalid number of arguments.");
+ }
+
+ converterArg0 = ObjectInspectorConverters.getConverter(arguments[0],
+ PrimitiveObjectInspectorFactory.writableStringObjectInspector);
+ converterArg1 = ObjectInspectorConverters.getConverter(arguments[1],
+ PrimitiveObjectInspectorFactory.writableStringObjectInspector);
+
+ return ObjectInspectorFactory
+ .getStandardListObjectInspector(PrimitiveObjectInspectorFactory.writableStringObjectInspector);
+ }
+
+ private List eval(String xml, String path) {
+ NodeList nodeList = xpath.evalNodeList(xml, path);
+ if (nodeList == null) {
+ return emptyResult;
+ }
+
+ result.clear();
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ String value = nodeList.item(i).getNodeValue();
+ if (value != null) {
+ result.add(new Text(value));
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public Object evaluate(DeferredObject[] arguments) throws HiveException {
+ assert (arguments.length == 2);
+ String xml = converterArg0.convert(arguments[0].get()).toString();
+ String path = converterArg1.convert(arguments[1].get()).toString();
+ return eval(xml, path);
+ }
+
+ @Override
+ public String getDisplayString(String[] children) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("array (");
+ if (children.length > 0) {
+ builder.append("'");
+ builder.append(StringUtils.join(children, "','"));
+ builder.append("'");
+ }
+ builder.append(")");
+ return builder.toString();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/GenericUDFXPath.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java (revision 0)
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_short",
+ value = "_FUNC_(xml, xpath) - Returns a short value that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n"
+ + " 3")
+public class UDFXPathShort extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+
+ public short evaluate(String xml, String path) {
+ return xpath.evalNumber(xml, path).shortValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathShort.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java (revision 0)
@@ -0,0 +1,184 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+/**
+ * Utility class for all XPath UDFs. Each UDF instance should keep an instance
+ * of this class.
+ */
+public class UDFXPathUtil {
+ private XPath xpath = XPathFactory.newInstance().newXPath();
+ private ReusableStringReader reader = new ReusableStringReader();
+ private InputSource inputSource = new InputSource(reader);
+ private XPathExpression expression = null;
+ private String oldPath = null;
+
+ public Object eval(String xml, String path, QName qname) {
+ if (xml == null || path == null || qname == null) {
+ return null;
+ }
+
+ if (xml.length() == 0 || path.length() == 0) {
+ return null;
+ }
+
+ if (!path.equals(oldPath)) {
+ try {
+ expression = xpath.compile(path);
+ } catch (XPathExpressionException e) {
+ expression = null;
+ }
+ oldPath = path;
+ }
+
+ if (expression == null) {
+ return null;
+ }
+
+ reader.set(xml);
+
+ try {
+ return expression.evaluate(inputSource, qname);
+ } catch (XPathExpressionException e) {
+ throw new RuntimeException ("Invalid expression '" + oldPath + "'");
+ }
+ }
+
+ public Boolean evalBoolean(String xml, String path) {
+ return (Boolean) eval(xml, path, XPathConstants.BOOLEAN);
+ }
+
+ public String evalString(String xml, String path) {
+ return (String) eval(xml, path, XPathConstants.STRING);
+ }
+
+ public Double evalNumber(String xml, String path) {
+ return (Double) eval(xml, path, XPathConstants.NUMBER);
+ }
+
+ public Node evalNode(String xml, String path) {
+ return (Node) eval(xml, path, XPathConstants.NODE);
+ }
+
+ public NodeList evalNodeList(String xml, String path) {
+ return (NodeList) eval(xml, path, XPathConstants.NODESET);
+ }
+
+ /**
+ * Reusable, non-threadsafe version of {@link StringReader}.
+ */
+ public static class ReusableStringReader extends Reader {
+
+ private String str = null;
+ private int length = -1;
+ private int next = 0;
+ private int mark = 0;
+
+ public ReusableStringReader() {
+ }
+
+ public void set(String s) {
+ this.str = s;
+ this.length = s.length();
+ this.mark = 0;
+ this.next = 0;
+ }
+
+ /** Check to make sure that the stream has not been closed */
+ private void ensureOpen() throws IOException {
+ if (str == null)
+ throw new IOException("Stream closed");
+ }
+
+ public int read() throws IOException {
+ ensureOpen();
+ if (next >= length)
+ return -1;
+ return str.charAt(next++);
+ }
+
+ public int read(char cbuf[], int off, int len) throws IOException {
+ ensureOpen();
+ if ((off < 0) || (off > cbuf.length) || (len < 0)
+ || ((off + len) > cbuf.length) || ((off + len) < 0)) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+ if (next >= length)
+ return -1;
+ int n = Math.min(length - next, len);
+ str.getChars(next, next + n, cbuf, off);
+ next += n;
+ return n;
+ }
+
+ public long skip(long ns) throws IOException {
+ ensureOpen();
+ if (next >= length)
+ return 0;
+ // Bound skip by beginning and end of the source
+ long n = Math.min(length - next, ns);
+ n = Math.max(-next, n);
+ next += n;
+ return n;
+ }
+
+ public boolean ready() throws IOException {
+ ensureOpen();
+ return true;
+ }
+
+ public boolean markSupported() {
+ return true;
+ }
+
+ public void mark(int readAheadLimit) throws IOException {
+ if (readAheadLimit < 0) {
+ throw new IllegalArgumentException("Read-ahead limit < 0");
+ }
+ ensureOpen();
+ mark = next;
+ }
+
+ public void reset() throws IOException {
+ ensureOpen();
+ next = mark;
+ }
+
+ public void close() {
+ str = null;
+ }
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathUtil.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java (revision 0)
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_float",
+ value = "_FUNC_(xml, xpath) - Returns a float value that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n"
+ + " 3.0")
+public class UDFXPathFloat extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+
+ public float evaluate(String xml, String path) {
+ return xpath.evalNumber(xml, path).floatValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathFloat.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java (revision 0)
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_boolean",
+ value = "_FUNC_(xml, xpath) - Evaluates a boolean xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('1','a/b') FROM src LIMIT 1;\n"
+ + " true\n"
+ + " > SELECT _FUNC_('1','a/b = 2') FROM src LIMIT 1;\n"
+ + " false")
+public class UDFXPathBoolean extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil () ;
+
+ public boolean evaluate(String xml, String path) {
+ return xpath.evalBoolean(xml, path).booleanValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathBoolean.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java (revision 0)
+++ ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java (revision 0)
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.udf.xml;
+
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.description;
+
+@description(
+ name = "xpath_number,xpath_double",
+ value = "_FUNC_(xml, xpath) - Returns a double value that matches the xpath expression",
+ extended = "Example:\n"
+ + " > SELECT _FUNC_('12','sum(a/b)') FROM src LIMIT 1;\n"
+ + " 3.0")
+public class UDFXPathDouble extends UDF {
+
+ private UDFXPathUtil xpath = new UDFXPathUtil();
+
+ public double evaluate(String xml, String path) {
+ return xpath.evalNumber(xml, path).doubleValue();
+ }
+}
Property changes on: ql/src/java/org/apache/hadoop/hive/ql/udf/xml/UDFXPathDouble.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Index: ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (revision 896321)
+++ ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java (working copy)
@@ -39,6 +39,7 @@
import org.apache.hadoop.hive.ql.plan.exprNodeGenericFuncDesc;
import org.apache.hadoop.hive.ql.plan.groupByDesc;
import org.apache.hadoop.hive.ql.udf.*;
+import org.apache.hadoop.hive.ql.udf.xml.*;
import org.apache.hadoop.hive.ql.udf.generic.*;
import org.apache.hadoop.hive.serde.Constants;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
@@ -136,6 +137,16 @@
registerUDF("get_json_object", UDFJson.class, false);
+ registerUDF("xpath_string", UDFXPathString.class, false);
+ registerUDF("xpath_boolean", UDFXPathBoolean.class, false);
+ registerUDF("xpath_number", UDFXPathDouble.class, false);
+ registerUDF("xpath_double", UDFXPathDouble.class, false);
+ registerUDF("xpath_float", UDFXPathFloat.class, false);
+ registerUDF("xpath_long", UDFXPathLong.class, false);
+ registerUDF("xpath_int", UDFXPathInteger.class, false);
+ registerUDF("xpath_short", UDFXPathShort.class, false);
+ registerGenericUDF("xpath", GenericUDFXPath.class);
+
registerUDF("+", UDFOPPlus.class, true);
registerUDF("-", UDFOPMinus.class, true);
registerUDF("*", UDFOPMultiply.class, true);