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

Ruben Q L updated CALCITE-7772:
-------------------------------
    Description: {{ModelHandler.addFunctions(...)}} currently loads the UDF 
class (already controlled by a ClassNameFilter allowlist/denylist) named in the 
model with the single-argument {{Class.forName(className)}}, which uses 
{{initialize=true}}. Only after the class object is returned do the shape-check 
helpers ({{TableFunctionImpl.create}}, {{TableMacroImpl.create}}, 
{{ScalarFunctionImpl.create}} / {{functions}}, 
{{AggregateFunctionImpl.create}}) decide whether the class is usable as a 
function, and if none of them accepts it, {{addFunctions}} throws {{"Not a 
valid function class: ..."}} at the end of the method. That ordering means the 
class's static initializer runs even when the class turns out to be the wrong 
shape, which can be avoided. This will keep allowlist guarantee at "these 
classes may be used as functions", not "these classes' static initializers may 
be run at will".  (was: {{ModelHandler.addFunctions(...)}} currently loads the 
UDF class (already controlled by a ClassNameFilter allowlist/denylist) named in 
the model with the single-argument `Class.forName(className)}}, which uses 
{{initialize=true}}. Only after the class object is returned do the shape-check 
helpers ({{TableFunctionImpl.create}}, {{TableMacroImpl.create}}, 
{{ScalarFunctionImpl.create}} / {{functions}}, 
{{AggregateFunctionImpl.create}}) decide whether the class is usable as a 
function, and if none of them accepts it, {{addFunctions}} throws {{"Not a 
valid function class: ..."}} at the end of the method. That ordering means the 
class's static initializer runs even when the class turns out to be the wrong 
shape, which can be avoided. This will keep allowlist guarantee at "these 
classes may be used as functions", not "these classes' static initializers may 
be run at will".)

> ModelHandler.addFunctions should defer UDF class initialization until after 
> shape validation
> --------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-7772
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7772
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>            Reporter: Ruben Q L
>            Assignee: Ruben Q L
>            Priority: Minor
>              Labels: pull-request-available
>             Fix For: 1.43.0
>
>
> {{ModelHandler.addFunctions(...)}} currently loads the UDF class (already 
> controlled by a ClassNameFilter allowlist/denylist) named in the model with 
> the single-argument {{Class.forName(className)}}, which uses 
> {{initialize=true}}. Only after the class object is returned do the 
> shape-check helpers ({{TableFunctionImpl.create}}, {{TableMacroImpl.create}}, 
> {{ScalarFunctionImpl.create}} / {{functions}}, 
> {{AggregateFunctionImpl.create}}) decide whether the class is usable as a 
> function, and if none of them accepts it, {{addFunctions}} throws {{"Not a 
> valid function class: ..."}} at the end of the method. That ordering means 
> the class's static initializer runs even when the class turns out to be the 
> wrong shape, which can be avoided. This will keep allowlist guarantee at 
> "these classes may be used as functions", not "these classes' static 
> initializers may be run at will".



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

Reply via email to