[ 
https://issues.apache.org/jira/browse/HIVE-30166?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Denys Kuzmenko updated HIVE-30166:
----------------------------------
    Description: 
Since HIVE-29770, {{select v}} returns a variant as JSON, but the column type 
reported for it is still Hive's internal struct:                                
                                  
  {code:sql}                                                                    
                                                                                
                                  
  create table t (v variant) stored by iceberg tblproperties 
('format-version'='3');                                                         
                                                     
  insert into t values (parse_json('{"name":"John","age":30}'));                
                                                                                
                                  
  select v from t;          -- {"age":30,"name":"John"}                         
                                                                                
                                  
  select typeof(v) from t;  -- struct<metadata:binary,value:binary>             
                                                                                
                                  
  {code}                                                                        
                                                                                
                                  
  For {{select v}}, JDBC {{ResultSetMetaData}} returns {{getColumnTypeName}} = 
struct and {{getColumnType}} = {{Types.STRUCT}}. This does not depend on  
{{hive.serdes.using.metastore.for.schema}}: the result is the same with 
{{HiveIcebergSerDe}} in the list.                                               
                                        

*Cause:* {{VariantObjectInspector extends StandardStructObjectInspector}}, so 
it inherits {{Category.STRUCT}} and the struct type name. The planner types 
table columns from the SerDe ObjectInspector, so {{variant}} -> 
{{VariantTypeInfo}} -> {{VariantObjectInspector}} -> {{StructTypeInfo}}. 
{{VariantTypeInfo}} and {{Category.VARIANT}} exist (HIVE-29184), but the 
inspector  
  never reports them.                                                           
                                                                                
                                  
                                                                                
                                                                                
                                  
  *Compatibility:* once the result schema says VARIANT, HS2 sends 
{{TTypeId.VARIANT_TYPE}} (24, added by HIVE-29770) in GetResultSetMetadata. 
Every released driver fails to decode an unknown type id ({{TProtocolException: 
Required field 'type' is unset!}}). So HS2 must report VARIANT only to sessions 
that negotiated {{HIVE_CLI_SERVICE_PROTOCOL_V12}} and keep reporting struct to  
older ones. Today the highest server-side gate is V9 (serialize-in-tasks).      
                                                                                
                                
                                                                                
                                                                                
                                  
Changing the inspector's category or type name affects every consumer that 
handles it as a struct. That includes the HIVE-29770 JSON decode in 
{{SerDeUtils}}, which recognises a variant by the struct type name.             
                                                                                
                                                                                
  
 

> Iceberg: report VARIANT instead of struct<metadata:binary,value:binary> as 
> the result type of variant columns 
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: HIVE-30166
>                 URL: https://issues.apache.org/jira/browse/HIVE-30166
>             Project: Hive
>          Issue Type: Bug
>            Reporter: Denys Kuzmenko
>            Priority: Major
>
> Since HIVE-29770, {{select v}} returns a variant as JSON, but the column type 
> reported for it is still Hive's internal struct:                              
>                                     
>   {code:sql}                                                                  
>                                                                               
>                                       
>   create table t (v variant) stored by iceberg tblproperties 
> ('format-version'='3');                                                       
>                                                        
>   insert into t values (parse_json('{"name":"John","age":30}'));              
>                                                                               
>                                       
>   select v from t;          -- {"age":30,"name":"John"}                       
>                                                                               
>                                       
>   select typeof(v) from t;  -- struct<metadata:binary,value:binary>           
>                                                                               
>                                       
>   {code}                                                                      
>                                                                               
>                                       
>   For {{select v}}, JDBC {{ResultSetMetaData}} returns {{getColumnTypeName}} 
> = struct and {{getColumnType}} = {{Types.STRUCT}}. This does not depend on  
> {{hive.serdes.using.metastore.for.schema}}: the result is the same with 
> {{HiveIcebergSerDe}} in the list.                                             
>                                           
> *Cause:* {{VariantObjectInspector extends StandardStructObjectInspector}}, so 
> it inherits {{Category.STRUCT}} and the struct type name. The planner types 
> table columns from the SerDe ObjectInspector, so {{variant}} -> 
> {{VariantTypeInfo}} -> {{VariantObjectInspector}} -> {{StructTypeInfo}}. 
> {{VariantTypeInfo}} and {{Category.VARIANT}} exist (HIVE-29184), but the 
> inspector  
>   never reports them.                                                         
>                                                                               
>                                       
>                                                                               
>                                                                               
>                                       
>   *Compatibility:* once the result schema says VARIANT, HS2 sends 
> {{TTypeId.VARIANT_TYPE}} (24, added by HIVE-29770) in GetResultSetMetadata. 
> Every released driver fails to decode an unknown type id 
> ({{TProtocolException: Required field 'type' is unset!}}). So HS2 must report 
> VARIANT only to sessions that negotiated {{HIVE_CLI_SERVICE_PROTOCOL_V12}} 
> and keep reporting struct to  older ones. Today the highest server-side gate 
> is V9 (serialize-in-tasks).                                                   
>                                                                    
>                                                                               
>                                                                               
>                                       
> Changing the inspector's category or type name affects every consumer that 
> handles it as a struct. That includes the HIVE-29770 JSON decode in 
> {{SerDeUtils}}, which recognises a variant by the struct type name.           
>                                                                               
>                                                                               
>         
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to