+1 what Askar said

Also you could give users access to views. A particular user might have a view 
with “WHERE tenant = 100” so if they ask for any any other tenant is they would 
get no results. 

It’s also possible to use Calcite to check grants (table and column access) and 
fail a query if they access objects they are not allowed to see or use. We 
should add features to support this use case better. 

Julian

> On Apr 2, 2023, at 11:09, Askar Bozcan <askar.mu...@gmail.com> wrote:
> 
> (EDIT)
> ... *For this case *there's also a Druid adapter which uses the native JSON
> intf.
> 
>> On Sun, 2 Apr 2023 at 21:08, Askar Bozcan <askar.mu...@gmail.com> wrote:
>> 
>> What's your use case? Do you want to:
>> a) Use Calcite as a "frontend" DB of sorts, to accept all queries and send
>> the processed SQL query (from Calcite) only the accepted queries? For this
>> case
>> b) Just use Calcite as a query processor, and send the processed query
>> yourself?
>> 
>> - Askar
>> 
>>> On Sun, 2 Apr 2023 at 20:38, Sebastien Rosset <sros...@gmail.com> wrote:
>>> 
>>> Thank you for the quick response. I am new to Calcite, it's good to hear
>>> there might be a possibility. I will investigate. Regarding the tenant_id,
>>> if the input SQL statement is:
>>> SELECT a, b, c
>>> FROM datasource
>>> WHERE input_expression
>>> 
>>> Then the tool should add a "security filter" as shown below:
>>> 
>>> SELECT a, b, c
>>> FROM datasource
>>> WHERE tenant_id = 'abcd123' AND input_expression
>>> 
>>> 
>>> On Sun, Apr 2, 2023 at 9:56 AM Askar Bozcan <askar.mu...@gmail.com>
>>> wrote:
>>> 
>>>> Hello Sebastien,
>>>> I'd say it's quite feasible for this purpose by having Calcite push-down
>>>> pre-processed queries to Druid and being a kind of a "front" to
>>> underlying
>>>> Druid DB.
>>>> 
>>>> Regarding rejecting queries other than SELECT:
>>>> 1) Parse the query and get the SqlNode representing the root of the
>>> syntax
>>>> tree.
>>>> 2) Extend SqlShuttle
>>>> <
>>>> 
>>> https://calcite.apache.org/javadocAggregate/org/apache/calcite/sql/util/SqlShuttle.html
>>>>> 
>>>> to check & manipulate the syntax tree, returning null for rejected
>>> nodes &
>>>> recursively iterating for SELECT sub-queries.
>>>> Note that you can use SqlSelect's getFrom, getGroup, etc to get all of
>>> the
>>>> possible nodes which can contain subqueries. Also note that SqlSelect
>>>> itself is a subtype of SqlCall.
>>>> 
>>>> Regarding "tenant_id" in WHERE case, I'm not too sure as I'm neither
>>>> familiar with Druid nor with Druid adapter in Calcite. Regardless, it
>>>> should be doable on the adapter level AFAIK.
>>>> 
>>>> Hope that was helpful!
>>>> 
>>>> Regards,
>>>> Askar Bozcan
>>>> 
>>>> On Sun, 2 Apr 2023 at 18:07, Sebastien Rosset <sros...@gmail.com>
>>> wrote:
>>>> 
>>>>> Would it make sense to use Apache Calcite as a security mediator? Has
>>>>> calcite already been used for that purpose? The mediator would parse
>>>>> untrusted SQL queries, reject queries other than SELECT (including any
>>>>> sub-queries), and inject multi-tenancy WHERE filters in every SELECT
>>>> query,
>>>>> including sub-queries?
>>>>> 
>>>>> More specifically, consider a Druid database which is configured to
>>>>> implement multi-tenancy with shared datasources:
>>>>> 
>>>>> 
>>>> 
>>> https://druid.apache.org/docs/latest/querying/multitenancy.html#partitioning-shared-datasources
>>>>> .
>>>>> Every Druid datasource would have a "tenant_id" attribute that can be
>>>> used
>>>>> in a Druid-SQL WHERE clause.
>>>>> 
>>>>> Thank you. Sebastien
>>>>> 
>>>> 
>>> 
>> 

Reply via email to