[
https://issues.apache.org/jira/browse/HIVE-26768?focusedWorklogId=829250&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-829250
]
ASF GitHub Bot logged work on HIVE-26768:
-----------------------------------------
Author: ASF GitHub Bot
Created on: 28/Nov/22 09:53
Start Date: 28/Nov/22 09:53
Worklog Time Spent: 10m
Work Description: mdayakar commented on code in PR #3808:
URL: https://github.com/apache/hive/pull/3808#discussion_r1033332946
##########
hplsql/src/main/java/org/apache/hive/hplsql/udf/Udf.java:
##########
@@ -128,27 +127,96 @@ public Object evaluate(DeferredObject[] arguments) throws
HiveException {
void setParameters(DeferredObject[] arguments) throws HiveException {
for (int i = 1; i < arguments.length; i++) {
String name = ":" + i;
- if (argumentsOI[i] instanceof StringObjectInspector) {
- String value =
((StringObjectInspector)argumentsOI[i]).getPrimitiveJavaObject(arguments[i].get());
- if (value != null) {
- exec.setVariable(name, value);
- }
+ Object inputObject = arguments[i].get();
+ ObjectInspector objectInspector = argumentsOI[i];
+ if (objectInspector.getCategory() == ObjectInspector.Category.PRIMITIVE)
{
+ setParameterForPrimitiveTypeArgument(name, inputObject,
objectInspector);
+ } else {
+ exec.setVariableToNull(name);
}
- else if (argumentsOI[i] instanceof IntObjectInspector) {
- Integer value =
(Integer)((IntObjectInspector)argumentsOI[i]).getPrimitiveJavaObject(arguments[i].get());
- if (value != null) {
- exec.setVariable(name, new Var(new Long(value)));
- }
+ }
+ }
+
+ private void setParameterForPrimitiveTypeArgument(String name, Object
inputObject, ObjectInspector objectInspector) {
+ PrimitiveObjectInspector.PrimitiveCategory primitiveCategory =
+ ((PrimitiveObjectInspector) objectInspector).getPrimitiveCategory();
+ switch (primitiveCategory) {
+ case BOOLEAN:
+ Boolean booleanValue = (Boolean) ((BooleanObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (booleanValue != null) {
+ exec.setVariable(name, new Var(booleanValue));
}
- else if (argumentsOI[i] instanceof LongObjectInspector) {
- Long value =
(Long)((LongObjectInspector)argumentsOI[i]).getPrimitiveJavaObject(arguments[i].get());
- if (value != null) {
- exec.setVariable(name, new Var(value));
- }
+ break;
+ case SHORT:
+ Short shortValue = (Short) ((ShortObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (shortValue != null) {
+ exec.setVariable(name, new Var(shortValue.longValue()));
}
- else {
- exec.setVariableToNull(name);
+ break;
+ case INT:
+ Integer intValue = (Integer) ((IntObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (intValue != null) {
+ exec.setVariable(name, new Var(intValue.longValue()));
+ }
+ break;
+ case LONG:
+ Long longValue = (Long) ((LongObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (longValue != null) {
+ exec.setVariable(name, new Var(longValue));
+ }
+ break;
+ case FLOAT:
+ Float floatValue = (Float) ((FloatObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (floatValue != null) {
+ exec.setVariable(name, new Var(floatValue.doubleValue()));
+ }
+ break;
+ case DOUBLE:
+ Double doubleValue = (Double) ((DoubleObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (doubleValue != null) {
+ exec.setVariable(name, new Var(doubleValue));
+ }
+ break;
+ case STRING:
+ String strValue = ((StringObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (strValue != null) {
+ exec.setVariable(name, strValue);
+ }
+ break;
+ case DATE:
+ Date dateValue = ((DateObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (dateValue != null) {
+ exec.setVariable(name, new
Var(java.sql.Date.valueOf(dateValue.toString())));
+ }
+ break;
+ case TIMESTAMP:
+ Timestamp timestampValue = ((TimestampObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (timestampValue != null) {
+ java.sql.Timestamp timestamp =
java.sql.Timestamp.valueOf(timestampValue.toString());
+ timestamp.setNanos(timestampValue.getNanos());
+ exec.setVariable(name, new Var(timestamp, 0));
+ }
+ break;
+ case DECIMAL:
+ HiveDecimal decimalValue = ((HiveDecimalObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (decimalValue != null) {
+ exec.setVariable(name, new Var(decimalValue.bigDecimalValue()));
+ }
+ break;
+ case VARCHAR:
+ HiveVarchar varcharValue = ((HiveVarcharObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (varcharValue != null) {
+ exec.setVariable(name, varcharValue.getValue());
+ }
+ break;
+ case CHAR:
+ HiveChar charValue = ((HiveCharObjectInspector)
objectInspector).getPrimitiveJavaObject(inputObject);
+ if (charValue != null) {
+ exec.setVariable(name, charValue.getStrippedValue());
Review Comment:
Internally Exec code, Var object is getting created for string type input.
Refer
https://github.com/apache/hive/blob/master/hplsql/src/main/java/org/apache/hive/hplsql/Exec.java#L210
Issue Time Tracking
-------------------
Worklog Id: (was: 829250)
Time Spent: 1h 20m (was: 1h 10m)
> HPLSQL UDF is not working if it is applied on a column of type
> varchar/char/decimal in a table.
> -----------------------------------------------------------------------------------------------
>
> Key: HIVE-26768
> URL: https://issues.apache.org/jira/browse/HIVE-26768
> Project: Hive
> Issue Type: Bug
> Components: Hive
> Reporter: Dayakar M
> Assignee: Dayakar M
> Priority: Major
> Labels: pull-request-available
> Time Spent: 1h 20m
> Remaining Estimate: 0h
>
> HPLSQL UDF is not working if it is applied on a column of type
> varchar/char/decimal in a table.
> For example:
> {code:java}
> CREATE TABLE result (s varchar(20));
> INSERT INTO result VALUES('alice');
> INSERT INTO result VALUES('bob');
> CREATE FUNCTION hello(p string)
> RETURNS STRING
> BEGIN
> RETURN 'Hello, ' || p;
> END;
> SELECT hello(s) FROM result; {code}
>
> --> It should return below
> {code:java}
> +----------------+
> | _c0 |
> +----------------+
> | Hello, alice |
> | Hello, bob |
> +----------------+
> {code}
>
> But actual result is
> {code:java}
> +----------------+
> | _c0 |
> +----------------+
> | Hello, |
> | Hello, |
> +----------------+
> {code}
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)